commit c2acfb5f2d4f66a384c9e2d9ac0ea63705db932f Author: wehub-resource-sync Date: Mon Jul 13 13:10:28 2026 +0800 chore: import upstream snapshot with attribution diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..23b4855 --- /dev/null +++ b/.gitignore @@ -0,0 +1,117 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +data + +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +notebooks +nohup.out + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test_akshare / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# dotenv +.env + +# virtualenv +.venv +venv/ +ENV/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ + +.idea +*.iml +.DS_Store +*.zip +*.log +*.pyc +doc +/bin +pkg +*.tmp \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8dada3e --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 0000000..90043a6 --- /dev/null +++ b/README.md @@ -0,0 +1,384 @@ + + +### pythonstock V3.0 项目简介,2025.02.28更新 + +**特别说明:股市有风险投资需谨慎,本项目只能用于Python代码学习,股票分析,投资失败亏钱不负责,不算BUG。** + +**github/gitee是项目地址** + +github地址: +https://github.com/pythonstock/stock + +gitee地址: +https://gitee.com/pythonstock/stock + +**视频地址:** +https://space.bilibili.com/52280367/lists/1923758?type=season + +**相关博客资料:** +https://blog.csdn.net/freewebsys/category_9285317.html + +数据分析清洗使用pandas,numpy。 +http://pandas.pydata.org/ + +数据存储到磁盘上,使用Mysql数据库。存储股票数据。 +https://pypi.python.org/pypi/mysqlclient + +web框架使用tornado +http://www.tornadoweb.org/en/stable/ + +tornado web系统 +http://docs.pythontab.com/tornado/introduction-to-tornado/ + +``` + +PythonStock V3.0 是基于Python的pandas,akshare,bokeh,tornado,stockstats,ta-lib等框架开发的全栈股票系统。 +项目创建于2017年7月17日,每月不定期更新。 +1)可以直接使用docker直接本地部署运行,整个项目在docker hub上压缩后200MB,本地占用500MB磁盘空间。 +2)使用Docker解决了Python库安装问题,使用Mariadb(MySQL)存储数据。借助akshare抓取数据。 +3)使用cron做定时任务,每天进行数据抓取计算,每天18点开始进行数据计算,计算当日数据,使用300天数据进行计算,大约需要15分钟计算完毕。 +4)股票数据接口防止被封,按天进行数据缓存,储存最近3天数据,每天定时清除,同时使用read_pickle to_pickle 的gzip压缩模式存储。 +5)使用tornado开发web系统,支持每日股票数据-东财,龙虎榜-个股上榜-新浪,数据中心-大宗交易行情等。 +6)数据展示系统,是通用数据展示系统,配置字典模板之后,页面自动加载数据,并完成数据展示,后续自己开发的指标数据可以加入进去。 +7)增加曲线数据分析,在查看股票中,可以直接跳转到东方财富页面查看相关信息,点击指标之后使用Bokeh将多达 17 个指标的数据绘图,进行图表展示。 +8)2.0 最大的更新在于替换tushare库(因部分库不能使用),使用akshare进行数据抓取。 +9)3.0 主要做的是项目整合,前端使用vue开发了,后端使用API,使用docker-compose开发部署。 + +基础库版本 + +1,pandas使用【 2.2.3 】版本, +2,numpy使用【 2.2.1 】版本, +3,sqlalchemy使用【 2.0.36 】版本, +4,akshare使用【 1.15.59 】版本, +5,bokeh使用【 3.6.2 】版本, +6,stockstats使用【 0.3.2 】版本, + +``` + + +版本3.0 说明 + + + ![image](https://gitee.com/pythonstock/stock/raw/master/frontend/public/stock-001.png) + ![image](https://gitee.com/pythonstock/stock/raw/master/frontend/public/stock-002.png) + ![image](https://gitee.com/pythonstock/stock/raw/master/frontend/public/stock-003.png) + + +然后根据3个指标进行股票数据计算: + +``` + +KDJ: +1,超买区:K值在80以上,D值在70以上,J值大于90时为超买。一般情况下,股价有可能下跌。投资者应谨慎行事,局外人不应再追涨,局内人应适时卖出。 +2,超卖区:K值在20以下,D值在30以下为超卖区。一般情况下,股价有可能上涨,反弹的可能性增大。局内人不应轻易抛出股票,局外人可寻机入场。 + +RSI: +1.当六日指标上升到达80时,表示股市已有超买现象,如果一旦继续上升,超过90以上时,则表示已到严重超买的警戒区,股价已形成头部,极可能在短期内反转回转。 +2.当六日强弱指标下降至20时,表示股市有超卖现象,如果一旦继续下降至10以下时则表示已到严重超卖区域,股价极可能有止跌回升的机会。 + +购买条件结果表:guess_indicators_lite_buy_daily +购买条件结果表:guess_indicators_lite_sell_daily + +``` + +每日股票指标数据计算17个指标如下(数据表 guess_indicators_daily): + + +| 计算指标 | 说明 | +|---------- |------------------------------------------| +| 1,交易量delta指标分析 | The Volume Delta (Vol ∆) | +| 2,计算n天差 | 可以计算,向前n天,和向后n天的差。 | +| 3,n天涨跌百分百计算 | 可以看到,-n天数据和今天数据的百分比。 | +| 4, CR指标 | http://wiki.mbalib.com/wiki/CR%E6%8C%87%E6%A0%87 价格动量指标 CR跌穿a、b、c、d四条线,再由低点向上爬升160时,为短线获利的一个良机,应适当卖出股票。 CR跌至40以下时,是建仓良机。而CR高于300~400时,应注意适当减仓。 | +| 5,最大值,最小值 | 计算区间最大值 volume max of three days ago, yesterday and two days later stock["volume_-3,2,-1_max"] volume min between 3 days ago and tomorrow stock["volume_-3~1_min"] 实际使用的时候使用 -2~2 可计算出5天的最大,最小值。 | +| 6, KDJ指标 | http://wiki.mbalib.com/wiki/%E9%9A%8F%E6%9C%BA%E6%8C%87%E6%A0%87 随机指标(KDJ)一般是根据统计学的原理,通过一个特定的周期(常为9日、9周等)内出现过的最高价、 最低价及最后一个计算周期的收盘价及这三者之间的比例关系,来计算最后一个计算周期的未成熟随机值RSV, 然后根据平滑移动平均线的方法来计算K值、D值与J值,并绘成曲线图来研判股票走势。 (3)在使用中,常有J线的指标,即3乘以K值减2乘以D值(3K-2D=J),其目的是求出K值与D值的最大乖离程度, 以领先KD值找出底部和头部。J大于100时为超买,小于10时为超卖。 | +| 7,SMA指标 | http://wiki.mbalib.com/wiki/Sma 简单移动平均线(Simple Moving Average,SMA) 可以动态输入参数,获得几天的移动平均。 | +| 8, MACD指标 | http://wiki.mbalib.com/wiki/MACD 平滑异同移动平均线(Moving Average Convergence Divergence,简称MACD指标),也称移动平均聚散指标 MACD 则可发挥其应有的功能,但当市场呈牛皮盘整格局,股价不上不下时,MACD买卖讯号较不明显。 当用MACD作分析时,亦可运用其他的技术分析指标如短期 K,D图形作为辅助工具,而且也可对买卖讯号作双重的确认。 | +| 9, BOLL指标 | http://wiki.mbalib.com/wiki/BOLL 布林线指标(Bollinger Bands) | +| 10, RSI指标 | http://wiki.mbalib.com/wiki/RSI 相对强弱指标(Relative Strength Index,简称RSI),也称相对强弱指数、相对力度指数 2)强弱指标保持高于50表示为强势市场,反之低于50表示为弱势市场。 (3)强弱指标多在70与30之间波动。当六日指标上升到达80时,表示股市已有超买现象,如果一旦继续上升,超过90以上时,则表示已到严重超买的警戒区,股价已形成头部,极可能在短期内反转回转。 | +| 11, W%R指标 | http://wiki.mbalib.com/wiki/%E5%A8%81%E5%BB%89%E6%8C%87%E6%A0%87 威廉指数(Williams%Rate)该指数是利用摆动点来度量市场的超买超卖现象。 | +| 14, TR、ATR指标 | http://wiki.mbalib.com/wiki/%E5%9D%87%E5%B9%85%E6%8C%87%E6%A0%87 均幅指标(Average True Ranger,ATR)均幅指标(ATR)是取一定时间周期内的股价波动幅度的移动平均值,主要用于研判买卖时机。 | +| 14, DMA指标 | http://wiki.mbalib.com/wiki/DMA DMA指标(Different of Moving Average)又叫平行线差指标,是目前股市分析技术指标中的一种中短期指标,它常用于大盘指数和个股的研判。 DMA, difference of 10 and 50 moving average stock[‘dma’] | +| 15, DMI,+DI,-DI,DX,ADX,ADXR指标 | http://wiki.mbalib.com/wiki/DMI 动向指数Directional Movement Index,DMI) http://wiki.mbalib.com/wiki/ADX 平均趋向指标(Average Directional Indicator,简称ADX) http://wiki.mbalib.com/wiki/%E5%B9%B3%E5%9D%87%E6%96%B9%E5%90%91%E6%8C%87%E6%95%B0%E8%AF%84%E4%BC%B0 平均方向指数评估(ADXR)实际是今日ADX与前面某一日的ADX的平均值。ADXR在高位与ADX同步下滑,可以增加对ADX已经调头的尽早确认。 ADXR是ADX的附属产品,只能发出一种辅助和肯定的讯号,并非入市的指标,而只需同时配合动向指标(DMI)的趋势才可作出买卖策略。 在应用时,应以ADX为主,ADXR为辅。 | +| 16, TRIX,MATRIX指标 | http://wiki.mbalib.com/wiki/TRIX TRIX指标又叫三重指数平滑移动平均指标(Triple Exponentially Smoothed Average) | +| 17, VR,MAVR指标 | http://wiki.mbalib.com/wiki/%E6%88%90%E4%BA%A4%E9%87%8F%E6%AF%94%E7%8E%87 成交量比率(Volumn Ratio,VR)(简称VR),是一项通过分析股价上升日成交额(或成交量,下同)与股价下降日成交额比值, 从而掌握市场买卖气势的中期技术指标。 | + + + + +### 项目部署放到docker-compose + + +```bash + +# 下载 docker +curl -fsSL https://get.docker.com -o get-docker.sh +sh get-docker.sh + +# +curl -L "https://www.ghproxy.cn/https://github.com/docker/compose/releases/download/v2.23.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose + +``` + + +```bash + +# 生产环境,编译前端部署: +docker-compose up -d + +# 开发环境,node dev 方式部署: +docker-compose -f dev-docker-compose.yml up -d +``` + +进入镜像: + +```bash +docker exec -it stock bash +sh /data/stock/jobs/cron.daily/run_daily +``` + +说明,启动容器后,会调用。run_init.sh 进行数据初始化,同时第一次执行后台执行当日数据。 +以后每日18点(只有18点左右才有今日的数据)进行股票数据抓取并计算。 + + +### 本地访问端口 + +> http://localhost:8080 股票系统前端地址 +> http://localhost:9090 股票系统后端地址 + + + +### 架构设计 +全系使用python实现。因为都是python的类库,互相之间调用方便。 +从数据抓取,数据处理,到数据展示数据运算都是python实现。 + +最终的数据都到前端展示出来。主要分为4个文件夹。 + +> jobs 抓取数据并存储实现类。 +> +> libs 通用工具类。 +> +> web 前端展示框架。 +> +> supervisor 进程管理工具。 + + +### 应用部署 + +需要mysql数据库启动。项目放到/data/stock 目录。 +``` +CREATE DATABASE IF NOT EXISTS `stock_data` CHARACTER SET utf8 COLLATE utf8_general_ci; +``` + +使用 : + +http://docs.sqlalchemy.org/en/latest/core/reflection.html + +## 更新日志 + +### 18 修改bug,前端使用编译nginx方式部署,修改数据库字段,解决定时任务BUG 2025-02-28 + +存储数据格式为 double 方便进行排序,decimal 类型转换出问题。 +拆分生产部署,切换成nginx,前端进行编译构建。提高前端加载速度。 +nginx的html影射到./data/html目录,前端编译完成需要拷贝文件到html,等待完成即可。 +解决定时任务问题,需要设置权限,才可以。 + + +### 17 v3.0发布,前端分离,项目和部署整合到一起 2025-01-10 + +修改接口展示空。修改数据库脚本。 +解决预测数据买和卖的脚本。 +进行缩减、计算相关添加操作。 +修改启动脚本、接口路径及配置。 +设置分页数据。增加联合主键判断。 +解决分页问题并执行查询语句。 +增加日期查询方法。 +进行数据搜索相关添加操作。 +添加配置。修改路由地址。 +解决端口映射问题及修改端口测试。 +拆分前后端,用 dockerfile 构建镜像并解决前端编译问题。 +修改开发者模式,解决本地开发启动问题。 +增加地址。增加前端开发者模式启动。 +增加每天数据跑批。进行猜工作相关添加操作。 +增加日志跑数据。升级增加展示。 +架构升级并使用 vue 的 ui 开发。 +增加 install docker 说明。 +添加 vue api。 + +### 16 更新发布 2.1 版本进行镜像升级 2023-06-03 + +使用新方式打包镜像,镜像大小从本地的 852MB 缩小到 597MB。 +为了支持更多 AKShare 特性,请尽快升级 Python 到 3.8 以上版本 + +1,numpy从【 1.21.5 】升级到了【 1.21.6 】版本 +2,akshare从【 1.3.50 】升级到了【 1.10.5 】版本 +3,bokeh从【 2.4.2 】升级到了【 2.4.3 】版本 + +根据 https://www.akshare.xyz/changelog.html +修改方法: + +1.7.99 替换 stock_sina_lhb_ggtj 成:stock_lhb_ggtj_sina + + +### 15 发布一个 2.0 的版本 - 2021-10-11 + +构建基础版本 pythonstock/pythonstock:base-2021-09 在这个镜像的基础上使用 akshare 1.1.9 +折腾几个月,终于把2.0 弄好了,为啥弄2.0 因为之前发现 tushare的数据不能抓取了。需要注册成 pro 版本,但是pro 还有积分限制。 +诸多不便吧,于是换成了 akshare 库了,大改了,需要找到相关的新库。然后在些代码。 +删除掉了 ta-lib 安装了之后从来没有用到,jupyter 也是没有用。占空间影响下载心情。将镜像进一步减小。 + + +### 14 bokeh 升级到 2.4.0 版本 + +目录 +/usr/local/lib/python3.7/site-packages +使用脚本进行升级。 + +### 13 升级ak到v1.0.80 做好每日东方财经数据 + +https://www.akshare.xyz/zh_CN/latest/data/stock/stock.html#id1 +限量: 单次返回所有 A 股上市公司的实时行情数据 + +600开头的股票是上证A股,属于大盘股,其中6006开头的股票是最早上市的股票, +6016开头的股票为大盘蓝筹股;900开头的股票是上证B股; +000开头的股票是深证A股,001、002开头的股票也都属于深证A股, +其中002开头的股票是深证A股中小企业股票;200开头的股票是深证B股; +300开头的股票是创业板股票;400开头的股票是三板市场股票。 + +过滤包括:600,6006,601,000,001,002,且不包括ST的股票数据。 + +增加数据库utf8 参数 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci + + +### 12 升级基础镜像到3.7 python,保障 akshare 0.6.10 以上版本支持 + +发现 akshare 要求升级python 3.7 以上版本才可以,需要升级基础镜像。 +然后 akshare 就可以升级到 0.9.65 的最新版本了。 +新版本就可以按照日期进行查询,解决 TypeError: stock_zh_a_daily() got an unexpected keyword argument 'start_date' 这个问题了。 + + +### 11 使用 akshare 做相关股票数据抓取 + + +中国的股市开盘时间为:每周一至周五的上午9:30——11:30, +下午13:00——15:00。中国股市收盘时间为:每周一至周五的下午3点。 + +实时行情数据 +接口: stock_zh_a_spot +目标地址: http://vip.stock.finance.sina.com.cn/mkt/#hs_a +描述: A 股数据是从新浪财经获取的数据, 重复运行本函数会被新浪暂时封 IP, 建议增加时间间隔 +限量: 单次返回所有 A 股上市公司的实时行情数据 + +历史行情数据 +日频率 +接口: stock_zh_a_daily +目标地址: https://finance.sina.com.cn/realstock/company/sh600006/nc.shtml(示例) +描述: A 股数据是从新浪财经获取的数据, 历史数据按日频率更新; 注意其中的 sh689009 为 CDR, 请 通过 stock_zh_a_cdr_daily 接口获取 +限量: 单次返回指定 A 股上市公司指定日期间的历史行情日频率数据 + +### 10 增加东方财经弹窗窗口、增加指标计算弹窗窗口 + +发现了一个东方财富的页面,是给pc端用的。 +可以做个弹出框放到系统中。不进行调整了,长宽高可以做的小点。使用iframe引入界面。否则有跨域和样式问题。 + +修改指标页面,改成窗口弹窗,做页面适配,方便查看。 + +### 9,增加日历 + +``` +古老的jquery 代码: + $( ".date-picker" ).datepicker({ + language: 'zh-CN', //设置语言 + format:"yyyymmdd", + showOtherMonths: true, + selectOtherMonths: false, + autoclose: true, + todayHighlight: true + }); +针对日期类型的搜索条件增加日历 + +``` + +https://www.bootcss.com/p/bootstrap-datetimepicker/ +不是使用jQuery的时间。 + +### 8,发现MariaDb 版本不兼容问题,最后切换成mysql,使用 mysql:5.7 镜像 + +相关数据执行只支持到10.5.4,版本可以使用,但是10.5.8 就有问题了。 +限制死了版本。看来软件也不能瞎升级,都用最新的有问题。可以解决数据问题。 +使用 mysql:5.7 镜像,更通用些,不折腾mariaDb了。 + + +### 7,解决 Bokeh JS兼容问题。 + +> 升级 bokeh 到 2.1.1 版本 +> +> https://pypi.org/project/bokeh/#files +> +> 升级JS,因为 lib 包升级导致问题。 + + + +### 6,升级 bokeh 到 2.1.1 版本 + +``` + +https://pypi.org/project/bokeh/#files + +``` + +### 5,解决日志打印问题 + +``` + +配置 main.py +tornado.options.parse_command_line() + +然后启动配置参数: +/usr/local/bin/python3 /data/stock/web/main.py -log_file_prefix=/data/logs/web.log + +``` + +### 4,解决跑数据问题 + +``` +# 通过数据库链接 engine。 +def conn(): + try: + db = MySQLdb.connect(MYSQL_HOST, MYSQL_USER, MYSQL_PWD, MYSQL_DB, charset="utf8") + # db.autocommit = True + except Exception as e: + print("conn error :", e) + db.autocommit(on=True) + return db.cursor() +``` + +之前升级过代码,造成 db.cursor() 问题。 + +### 3,增加多字段排序 + +> 1,点击是单个字段进行排序。 +> +> 2,按照【shift】,点击多个,即可完成多字段排序。 +> +> 3,服务端分页排序。 +> +> 4,按照多个字段进行筛选查询。 + +### 2,使用pandas处理重复数据 + +https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.drop_duplicates.html + +```python + data = get_data(year, quarter) + # 处理重复数据,保存最新一条数据。 + data.drop_duplicates(subset="code", keep="last") +``` + +### 1,web使用datatable显示报表 + +通用数据配置,在 libs/stock_web_dic.py 配置数据之后,可以实现动态加载菜单,根据数据库表的行列显示数据。 + +不用一个表一个表进行开发,通用数据展示。 + + diff --git a/README.wehub.md b/README.wehub.md new file mode 100644 index 0000000..ed6b61f --- /dev/null +++ b/README.wehub.md @@ -0,0 +1,7 @@ +# WeHub 来源说明 + +- 原始项目:`pythonstock/stock` +- 原始仓库:https://github.com/pythonstock/stock +- 导入方式:上游默认分支的最新快照 +- 原作者、版权和许可证信息以原始仓库及本仓库 LICENSE 为准 +- 本文件仅用于记录来源,不代表 WeHub 是原项目作者 diff --git a/backend/docs/1-todo-2020-12-06.md b/backend/docs/1-todo-2020-12-06.md new file mode 100644 index 0000000..75db342 --- /dev/null +++ b/backend/docs/1-todo-2020-12-06.md @@ -0,0 +1,166 @@ +## 切换到了mysql 数据库 5.7 的版本 + +```log +$ docker logs mysqldb +2020-12-06 23:01:40+08:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.32-1debian10 started. +2020-12-06 23:01:41+08:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' +2020-12-06 23:01:41+08:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.32-1debian10 started. +2020-12-06 23:01:41+08:00 [Note] [Entrypoint]: Initializing database files +2020-12-06T15:01:41.637316Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). +2020-12-06T15:01:43.872609Z 0 [Warning] InnoDB: New log files created, LSN=45790 +2020-12-06T15:01:44.535591Z 0 [Warning] InnoDB: Creating foreign key constraint system tables. +2020-12-06T15:01:44.961598Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: f4ccb5f1-37d3-11eb-8fd1-0242ac180002. +2020-12-06T15:01:45.054324Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened. +2020-12-06T15:01:45.604908Z 0 [Warning] CA certificate ca.pem is self signed. +2020-12-06T15:01:45.765331Z 1 [Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option. +2020-12-06 23:02:35+08:00 [Note] [Entrypoint]: Database files initialized +2020-12-06 23:02:35+08:00 [Note] [Entrypoint]: Starting temporary server +2020-12-06 23:02:35+08:00 [Note] [Entrypoint]: Waiting for server startup +2020-12-06T15:02:35.990607Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). +2020-12-06T15:02:35.992115Z 0 [Note] mysqld (mysqld 5.7.32) starting as process 81 ... +2020-12-06T15:02:35.995048Z 0 [Note] InnoDB: PUNCH HOLE support available +2020-12-06T15:02:35.995066Z 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins +2020-12-06T15:02:35.995070Z 0 [Note] InnoDB: Uses event mutexes +2020-12-06T15:02:35.995075Z 0 [Note] InnoDB: GCC builtin __atomic_thread_fence() is used for memory barrier +2020-12-06T15:02:35.995078Z 0 [Note] InnoDB: Compressed tables use zlib 1.2.11 +2020-12-06T15:02:35.995082Z 0 [Note] InnoDB: Using Linux native AIO +2020-12-06T15:02:35.995320Z 0 [Note] InnoDB: Number of pools: 1 +2020-12-06T15:02:35.995429Z 0 [Note] InnoDB: Using CPU crc32 instructions +2020-12-06T15:02:35.996774Z 0 [Note] InnoDB: Initializing buffer pool, total size = 128M, instances = 1, chunk size = 128M +2020-12-06T15:02:36.007354Z 0 [Note] InnoDB: Completed initialization of buffer pool +2020-12-06T15:02:36.009348Z 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority(). +2020-12-06T15:02:36.021712Z 0 [Note] InnoDB: Highest supported file format is Barracuda. +2020-12-06T15:02:36.153467Z 0 [Note] InnoDB: Creating shared tablespace for temporary tables +2020-12-06T15:02:36.153634Z 0 [Note] InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ... +2020-12-06T15:02:37.782713Z 0 [Note] InnoDB: File './ibtmp1' size is now 12 MB. +2020-12-06T15:02:37.784862Z 0 [Note] InnoDB: 96 redo rollback segment(s) found. 96 redo rollback segment(s) are active. +2020-12-06T15:02:37.784894Z 0 [Note] InnoDB: 32 non-redo rollback segment(s) are active. +2020-12-06T15:02:37.785844Z 0 [Note] InnoDB: 5.7.32 started; log sequence number 2748463 +2020-12-06T15:02:37.786241Z 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool +2020-12-06T15:02:37.786817Z 0 [Note] Plugin 'FEDERATED' is disabled. +2020-12-06T15:02:37.790246Z 0 [Note] InnoDB: Buffer pool(s) load completed at 201206 23:02:37 +2020-12-06T15:02:37.803947Z 0 [Note] Found ca.pem, server-cert.pem and server-key.pem in data directory. Trying to enable SSL support using them. +2020-12-06T15:02:37.803988Z 0 [Note] Skipping generation of SSL certificates as certificate files are present in data directory. +2020-12-06T15:02:37.806098Z 0 [Warning] CA certificate ca.pem is self signed. +2020-12-06T15:02:37.806183Z 0 [Note] Skipping generation of RSA key pair as key files are present in data directory. +2020-12-06T15:02:37.950541Z 0 [Warning] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory. +2020-12-06T15:02:37.973492Z 0 [Note] Event Scheduler: Loaded 0 events +2020-12-06T15:02:37.974048Z 0 [Note] mysqld: ready for connections. +Version: '5.7.32' socket: '/var/run/mysqld/mysqld.sock' port: 0 MySQL Community Server (GPL) +2020-12-06 23:02:38+08:00 [Note] [Entrypoint]: Temporary server started. +Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it. +Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it. +Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it. +Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it. +2020-12-06 23:02:54+08:00 [Note] [Entrypoint]: Creating database stock_data + +2020-12-06 23:02:54+08:00 [Note] [Entrypoint]: Stopping temporary server +2020-12-06T15:02:54.825959Z 0 [Note] Giving 0 client threads a chance to die gracefully +2020-12-06T15:02:54.825987Z 0 [Note] Shutting down slave threads +2020-12-06T15:02:54.825992Z 0 [Note] Forcefully disconnecting 0 remaining clients +2020-12-06T15:02:54.825998Z 0 [Note] Event Scheduler: Purging the queue. 0 events +2020-12-06T15:02:54.826139Z 0 [Note] Binlog end +2020-12-06T15:02:54.826658Z 0 [Note] Shutting down plugin 'ngram' +2020-12-06T15:02:54.826669Z 0 [Note] Shutting down plugin 'partition' +2020-12-06T15:02:54.826673Z 0 [Note] Shutting down plugin 'BLACKHOLE' +2020-12-06T15:02:54.826677Z 0 [Note] Shutting down plugin 'ARCHIVE' +2020-12-06T15:02:54.826682Z 0 [Note] Shutting down plugin 'PERFORMANCE_SCHEMA' +2020-12-06T15:02:54.826714Z 0 [Note] Shutting down plugin 'MRG_MYISAM' +2020-12-06T15:02:54.826723Z 0 [Note] Shutting down plugin 'MyISAM' +2020-12-06T15:02:54.826732Z 0 [Note] Shutting down plugin 'INNODB_SYS_VIRTUAL' +2020-12-06T15:02:54.826737Z 0 [Note] Shutting down plugin 'INNODB_SYS_DATAFILES' +2020-12-06T15:02:54.826741Z 0 [Note] Shutting down plugin 'INNODB_SYS_TABLESPACES' +2020-12-06T15:02:54.826746Z 0 [Note] Shutting down plugin 'INNODB_SYS_FOREIGN_COLS' +2020-12-06T15:02:54.826749Z 0 [Note] Shutting down plugin 'INNODB_SYS_FOREIGN' +2020-12-06T15:02:54.826786Z 0 [Note] Shutting down plugin 'INNODB_SYS_FIELDS' +2020-12-06T15:02:54.826791Z 0 [Note] Shutting down plugin 'INNODB_SYS_COLUMNS' +2020-12-06T15:02:54.826795Z 0 [Note] Shutting down plugin 'INNODB_SYS_INDEXES' +2020-12-06T15:02:54.826800Z 0 [Note] Shutting down plugin 'INNODB_SYS_TABLESTATS' +2020-12-06T15:02:54.826804Z 0 [Note] Shutting down plugin 'INNODB_SYS_TABLES' +2020-12-06T15:02:54.826808Z 0 [Note] Shutting down plugin 'INNODB_FT_INDEX_TABLE' +2020-12-06T15:02:54.826811Z 0 [Note] Shutting down plugin 'INNODB_FT_INDEX_CACHE' +2020-12-06T15:02:54.826813Z 0 [Note] Shutting down plugin 'INNODB_FT_CONFIG' +2020-12-06T15:02:54.826816Z 0 [Note] Shutting down plugin 'INNODB_FT_BEING_DELETED' +2020-12-06T15:02:54.826819Z 0 [Note] Shutting down plugin 'INNODB_FT_DELETED' +2020-12-06T15:02:54.826822Z 0 [Note] Shutting down plugin 'INNODB_FT_DEFAULT_STOPWORD' +2020-12-06T15:02:54.826825Z 0 [Note] Shutting down plugin 'INNODB_METRICS' +2020-12-06T15:02:54.826828Z 0 [Note] Shutting down plugin 'INNODB_TEMP_TABLE_INFO' +2020-12-06T15:02:54.826831Z 0 [Note] Shutting down plugin 'INNODB_BUFFER_POOL_STATS' +2020-12-06T15:02:54.826834Z 0 [Note] Shutting down plugin 'INNODB_BUFFER_PAGE_LRU' +2020-12-06T15:02:54.826836Z 0 [Note] Shutting down plugin 'INNODB_BUFFER_PAGE' +2020-12-06T15:02:54.826839Z 0 [Note] Shutting down plugin 'INNODB_CMP_PER_INDEX_RESET' +2020-12-06T15:02:54.826842Z 0 [Note] Shutting down plugin 'INNODB_CMP_PER_INDEX' +2020-12-06T15:02:54.826845Z 0 [Note] Shutting down plugin 'INNODB_CMPMEM_RESET' +2020-12-06T15:02:54.826848Z 0 [Note] Shutting down plugin 'INNODB_CMPMEM' +2020-12-06T15:02:54.826851Z 0 [Note] Shutting down plugin 'INNODB_CMP_RESET' +2020-12-06T15:02:54.826854Z 0 [Note] Shutting down plugin 'INNODB_CMP' +2020-12-06T15:02:54.826857Z 0 [Note] Shutting down plugin 'INNODB_LOCK_WAITS' +2020-12-06T15:02:54.826859Z 0 [Note] Shutting down plugin 'INNODB_LOCKS' +2020-12-06T15:02:54.826862Z 0 [Note] Shutting down plugin 'INNODB_TRX' +2020-12-06T15:02:54.826910Z 0 [Note] Shutting down plugin 'InnoDB' +2020-12-06T15:02:54.826953Z 0 [Note] InnoDB: FTS optimize thread exiting. +2020-12-06T15:02:54.827046Z 0 [Note] InnoDB: Starting shutdown... +2020-12-06T15:02:54.927339Z 0 [Note] InnoDB: Dumping buffer pool(s) to /var/lib/mysql/ib_buffer_pool +2020-12-06T15:02:54.993267Z 0 [Note] InnoDB: Buffer pool(s) dump completed at 201206 23:02:54 +2020-12-06T15:02:57.668186Z 0 [Note] InnoDB: Shutdown completed; log sequence number 12619636 +2020-12-06T15:02:57.673193Z 0 [Note] InnoDB: Removed temporary tablespace data file: "ibtmp1" +2020-12-06T15:02:57.673260Z 0 [Note] Shutting down plugin 'MEMORY' +2020-12-06T15:02:57.673278Z 0 [Note] Shutting down plugin 'CSV' +2020-12-06T15:02:57.673291Z 0 [Note] Shutting down plugin 'sha256_password' +2020-12-06T15:02:57.673302Z 0 [Note] Shutting down plugin 'mysql_native_password' +2020-12-06T15:02:57.673866Z 0 [Note] Shutting down plugin 'binlog' +2020-12-06T15:02:57.677294Z 0 [Note] mysqld: Shutdown complete + +2020-12-06 23:02:57+08:00 [Note] [Entrypoint]: Temporary server stopped + +2020-12-06 23:02:57+08:00 [Note] [Entrypoint]: MySQL init process done. Ready for start up. + +2020-12-06T15:02:58.038797Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). +2020-12-06T15:02:58.040198Z 0 [Note] mysqld (mysqld 5.7.32) starting as process 1 ... +2020-12-06T15:02:58.043137Z 0 [Note] InnoDB: PUNCH HOLE support available +2020-12-06T15:02:58.043152Z 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins +2020-12-06T15:02:58.043155Z 0 [Note] InnoDB: Uses event mutexes +2020-12-06T15:02:58.043158Z 0 [Note] InnoDB: GCC builtin __atomic_thread_fence() is used for memory barrier +2020-12-06T15:02:58.043161Z 0 [Note] InnoDB: Compressed tables use zlib 1.2.11 +2020-12-06T15:02:58.043163Z 0 [Note] InnoDB: Using Linux native AIO +2020-12-06T15:02:58.043392Z 0 [Note] InnoDB: Number of pools: 1 +2020-12-06T15:02:58.043486Z 0 [Note] InnoDB: Using CPU crc32 instructions +2020-12-06T15:02:58.044796Z 0 [Note] InnoDB: Initializing buffer pool, total size = 128M, instances = 1, chunk size = 128M +2020-12-06T15:02:58.055082Z 0 [Note] InnoDB: Completed initialization of buffer pool +2020-12-06T15:02:58.057154Z 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority(). +2020-12-06T15:02:58.068627Z 0 [Note] InnoDB: Highest supported file format is Barracuda. +2020-12-06T15:02:58.191412Z 0 [Note] InnoDB: Creating shared tablespace for temporary tables +2020-12-06T15:02:58.191760Z 0 [Note] InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ... +2020-12-06T15:02:58.636078Z 0 [Note] InnoDB: File './ibtmp1' size is now 12 MB. +2020-12-06T15:02:58.638452Z 0 [Note] InnoDB: 96 redo rollback segment(s) found. 96 redo rollback segment(s) are active. +2020-12-06T15:02:58.638497Z 0 [Note] InnoDB: 32 non-redo rollback segment(s) are active. +2020-12-06T15:02:58.639548Z 0 [Note] InnoDB: Waiting for purge to start +2020-12-06T15:02:58.689910Z 0 [Note] InnoDB: 5.7.32 started; log sequence number 12619636 +2020-12-06T15:02:58.690442Z 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool +2020-12-06T15:02:58.691219Z 0 [Note] Plugin 'FEDERATED' is disabled. +2020-12-06T15:02:58.702492Z 0 [Note] InnoDB: Buffer pool(s) load completed at 201206 23:02:58 +2020-12-06T15:02:58.715442Z 0 [Note] Found ca.pem, server-cert.pem and server-key.pem in data directory. Trying to enable SSL support using them. +2020-12-06T15:02:58.715904Z 0 [Note] Skipping generation of SSL certificates as certificate files are present in data directory. +2020-12-06T15:02:58.717982Z 0 [Warning] CA certificate ca.pem is self signed. +2020-12-06T15:02:58.718051Z 0 [Note] Skipping generation of RSA key pair as key files are present in data directory. +2020-12-06T15:02:58.719045Z 0 [Note] Server hostname (bind-address): '*'; port: 3306 +2020-12-06T15:02:58.720034Z 0 [Note] IPv6 is available. +2020-12-06T15:02:58.720077Z 0 [Note] - '::' resolves to '::'; +2020-12-06T15:02:58.720116Z 0 [Note] Server socket created on IP: '::'. +2020-12-06T15:02:59.182050Z 0 [Warning] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory. +2020-12-06T15:02:59.217680Z 0 [Note] Event Scheduler: Loaded 0 events +2020-12-06T15:02:59.218060Z 0 [Note] mysqld: ready for connections. +Version: '5.7.32' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server (GPL) + +``` + +要是第一次启动,没有数据,启动会比较慢,需要1分多钟,为了保险,定2分钟后执行初始化任务。 + + +## 2,初始化数据接口被停用 + +``` +本接口即将停止更新,请尽快使用Pro版接口:https://tushare.pro/document/2 +error : HTTP Error 404: Not Found + +``` \ No newline at end of file diff --git a/backend/docs/git-push-tag.md b/backend/docs/git-push-tag.md new file mode 100644 index 0000000..c291c01 --- /dev/null +++ b/backend/docs/git-push-tag.md @@ -0,0 +1,7 @@ + +## 创建 tag 并发布到 github 上 + + +git tag -a v2.0 -m "v2.0" + +git push origin --tags diff --git a/backend/jobs/18h_daily_job.py b/backend/jobs/18h_daily_job.py new file mode 100644 index 0000000..c58c8d2 --- /dev/null +++ b/backend/jobs/18h_daily_job.py @@ -0,0 +1,182 @@ +#!/usr/local/bin/python3 +# -*- coding: utf-8 -*- + + +import libs.common as common +import sys +import time +import pandas as pd +import numpy as np +from sqlalchemy.types import NVARCHAR +from sqlalchemy import inspect +import datetime +import akshare as ak +import traceback +import MySQLdb + +# 600开头的股票是上证A股,属于大盘股 +# 600开头的股票是上证A股,属于大盘股,其中6006开头的股票是最早上市的股票, +# 6016开头的股票为大盘蓝筹股;900开头的股票是上证B股; +# 000开头的股票是深证A股,001、002开头的股票也都属于深证A股, +# 其中002开头的股票是深证A股中小企业股票; +# 200开头的股票是深证B股; +# 300开头的股票是创业板股票;400开头的股票是三板市场股票。 +def stock_a(code): + # print(code) + # print(type(code)) + # 上证A股 # 深证A股 + if code.startswith('600') or code.startswith('6006') or code.startswith('601') or code.startswith('000') or code.startswith('001') or code.startswith('002'): + return True + else: + return False +# 过滤掉 st 股票。 +def stock_a_filter_st(name): + # print(code) + # print(type(code)) + # 上证A股 # 深证A股 + if name.find("ST") == -1: + return True + else: + return False + +# 过滤价格,如果没有基本上是退市了。 +def stock_a_filter_price(latest_price): + # float 在 pandas 里面判断 空。 + if np.isnan(latest_price): + return False + else: + return True + +####### 3.pdf 方法。宏观经济数据 +# 接口全部有错误。只专注股票数据。 +def stat_all(tmp_datetime): + + datetime_str = (tmp_datetime).strftime("%Y-%m-%d") + datetime_int = (tmp_datetime).strftime("%Y%m%d") + print("datetime_str:", datetime_str) + print("datetime_int:", datetime_int) + + # 股票列表 + try: + data = ak.stock_zh_a_spot_em() + # print(data.index) + # 解决ESP 小数问题。 + # data["esp"] = data["esp"].round(2) # 数据保留2位小数 + data.columns = ['index', 'code', 'name', 'last_price', 'change_percent', 'change_amount', + 'volume', 'turnover', 'amplitude', 'high', 'low', 'open', 'closed', 'volume_ratio', + 'turnover_rate', 'pe_ratio','pb_ratio', 'market_cap','circulating_market_cap','rise_speed', + 'change_5min', 'change_ercent_60day','ytd_change_percent'] + + data = data.loc[data["code"].apply(stock_a)].loc[data["name"].apply(stock_a_filter_st)].loc[ + data["last_price"].apply(stock_a_filter_price)] + print(data) + data['date'] = datetime_int # 修改时间成为int类型。 + + # 删除老数据。 + del_sql = " DELETE FROM `stock_zh_a_spot_em` where `date` = '%s' " % datetime_int + common.insert(del_sql) + + data.set_index('code', inplace=True) + data.drop('index', axis=1, inplace=True) + print(data) + # 删除index,然后和原始数据合并。 + common.insert_db(data, "stock_zh_a_spot_em", True, "`date`,`code`") + except Exception as e: + print("error :", e) + traceback.print_exc() + + + + # 龙虎榜-个股上榜统计 + # 接口: stock_lhb_ggtj_sina + # + # 目标地址: http://vip.stock.finance.sina.com.cn/q/go.php/vLHBData/kind/ggtj/index.phtml + # + # 描述: 获取新浪财经-龙虎榜-个股上榜统计 + # + + try: + stock_lhb_ggtj_sina = ak.stock_lhb_ggtj_sina(symbol="5") + print(stock_lhb_ggtj_sina) + + stock_lhb_ggtj_sina.columns = ['code', 'name', 'ranking_times', 'sum_buy', 'sum_sell', 'net_amount', 'buy_seat', + 'sell_seat'] + + stock_lhb_ggtj_sina = stock_lhb_ggtj_sina.loc[stock_lhb_ggtj_sina["code"].apply(stock_a)].loc[ + stock_lhb_ggtj_sina["name"].apply(stock_a_filter_st)] + + stock_lhb_ggtj_sina.set_index('code', inplace=True) + # data_sina_lhb.drop('index', axis=1, inplace=True) + # 删除老数据。 + stock_lhb_ggtj_sina['date'] = datetime_int # 修改时间成为int类型。 + + # 删除老数据。 + del_sql = " DELETE FROM `stock_lhb_ggtj_sina` where `date` = '%s' " % datetime_int + common.insert(del_sql) + + common.insert_db(stock_lhb_ggtj_sina, "stock_lhb_ggtj_sina", True, "`date`,`code`") + + except Exception as e: + print("error :", e) + traceback.print_exc() + + + + # 每日统计 + # 接口: stock_dzjy_mrtj + # + # 目标地址: http://data.eastmoney.com/dzjy/dzjy_mrtj.aspx + # + # 描述: 获取东方财富网-数据中心-大宗交易-每日统计 + # https://akshare.akfamily.xyz/data/stock/stock.html#id318 + # import akshare as ak + # stock_dzjy_mrtj_df = ak.stock_dzjy_mrtj(start_date='20220105', end_date='20220105') + # print(stock_dzjy_mrtj_df) + + try: + + print("################ tmp_datetime : " + datetime_int) + # 格式要 int类型日期 + stock_dzjy_mrtj = ak.stock_dzjy_mrtj(start_date=datetime_int, end_date=datetime_int) + print(stock_dzjy_mrtj) + + stock_dzjy_mrtj.columns = ['index', 'trade_date', 'code', 'name', 'quote_change', 'close_price', 'average_price', + 'overflow_rate', 'trade_number', 'sum_volume', 'sum_turnover', + 'turnover_market_rate'] + + stock_dzjy_mrtj.set_index('code', inplace=True) + # data_sina_lhb.drop('index', axis=1, inplace=True) + # 删除老数据。 + stock_dzjy_mrtj['date'] = datetime_int # 修改时间成为int类型。 + stock_dzjy_mrtj.drop('trade_date', axis=1, inplace=True) + stock_dzjy_mrtj.drop('index', axis=1, inplace=True) + + # 数据保留2位小数 + try: + stock_dzjy_mrtj = stock_dzjy_mrtj.loc[stock_dzjy_mrtj["code"].apply(stock_a)].loc[ + stock_dzjy_mrtj["name"].apply(stock_a_filter_st)] + + stock_dzjy_mrtj["average_price"] = stock_dzjy_mrtj["average_price"].round(2) + stock_dzjy_mrtj["overflow_rate"] = stock_dzjy_mrtj["overflow_rate"].round(4) + stock_dzjy_mrtj["turnover_market_rate"] = stock_dzjy_mrtj["turnover_market_rate"].round(6) + except Exception as e: + print("round error :", e) + traceback.print_exc() + + # 删除老数据。 + del_sql = " DELETE FROM `stock_dzjy_mrtj` where `date` = '%s' " % datetime_int + common.insert(del_sql) + + print(stock_dzjy_mrtj) + + common.insert_db(stock_dzjy_mrtj, "stock_dzjy_mrtj", True, "`date`,`code`") + + except Exception as e: + print("error :", e) + traceback.print_exc() + +# main函数入口 +if __name__ == '__main__': + # 执行数据初始化。 + # 使用方法传递。 + tmp_datetime = common.run_with_args(stat_all) diff --git a/backend/jobs/README.txt b/backend/jobs/README.txt new file mode 100644 index 0000000..d46b426 --- /dev/null +++ b/backend/jobs/README.txt @@ -0,0 +1,4 @@ +1,计算每日买全部推荐买。 +2,计算每日全部推荐卖数据。 +3,设置个人账号,设置购买和卖的数据。进行关联查询。 +4,最重要的沪深300,中正500数据。进行大盘股分析。 \ No newline at end of file diff --git a/backend/jobs/aps_job.py b/backend/jobs/aps_job.py new file mode 100644 index 0000000..83c57aa --- /dev/null +++ b/backend/jobs/aps_job.py @@ -0,0 +1,24 @@ +#!/usr/local/bin/python3 +# -*- coding: utf-8 -*- +from pytz import utc +from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore +from apscheduler.schedulers.blocking import BlockingScheduler + +from apscheduler.executors.pool import ProcessPoolExecutor +import libs.common as common + +# doc : http://apscheduler.readthedocs.io/en/latest/modules/jobstores/sqlalchemy.html +jobstores = { + 'default': SQLAlchemyJobStore(url=common.MYSQL_CONN_URL, tablename='apscheduler_jobs') +} +executors = { + 'default': {'type': 'threadpool', 'max_workers': 20}, + 'processpool': ProcessPoolExecutor(max_workers=5) +} +job_defaults = { + 'coalesce': False, + 'max_instances': 3 +} +scheduler = BlockingScheduler(jobstores=jobstores, executors=executors, job_defaults=job_defaults, timezone=utc) +scheduler.start() +print("start ...") diff --git a/backend/jobs/basic_job.py b/backend/jobs/basic_job.py new file mode 100644 index 0000000..bc531aa --- /dev/null +++ b/backend/jobs/basic_job.py @@ -0,0 +1,33 @@ +#!/usr/local/bin/python3 +# -*- coding: utf-8 -*- + +import libs.common as common +import MySQLdb + +# 创建新数据库。 +def create_new_database(): + with MySQLdb.connect(common.MYSQL_HOST, common.MYSQL_USER, common.MYSQL_PWD, "mysql", charset="utf8") as db: + try: + create_sql = " CREATE DATABASE IF NOT EXISTS %s CHARACTER SET utf8 COLLATE utf8_general_ci " % common.MYSQL_DB + print(create_sql) + db.autocommit(on=True) + db.cursor().execute(create_sql) + except Exception as e: + print("error CREATE DATABASE :", e) + + +# main函数入口 +if __name__ == '__main__': + + # 检查,如果执行 select 1 失败,说明数据库不存在,然后创建一个新的数据库。 + try: + with MySQLdb.connect(common.MYSQL_HOST, common.MYSQL_USER, common.MYSQL_PWD, common.MYSQL_DB, + charset="utf8") as db: + db.autocommit(on=True) + db.cursor().execute(" select 1 ") + print("########### db exists ###########") + except Exception as e: + print("check MYSQL_DB error and create new one :", e) + # 检查数据库失败, + create_new_database() + # 执行数据初始化。 diff --git a/backend/jobs/cron.daily/run_daily b/backend/jobs/cron.daily/run_daily new file mode 100755 index 0000000..ac06a12 --- /dev/null +++ b/backend/jobs/cron.daily/run_daily @@ -0,0 +1,28 @@ +#!/bin/sh + +mkdir -p /data/logs +DATETIME=`date +%Y-%m-%d:%H:%M:%S` + +DATE=`date +%Y-%m-%d` + +export PYTHONIOENCODING=utf-8 +export LANG=zh_CN.UTF-8 +export PYTHONPATH=/data/stock +export LC_CTYPE=zh_CN.UTF-8 + + +echo "###################"$DATETIME"###################" >> /data/logs/daily.${DATE}.log +#增加获得今日全部数据和大盘数据 +/usr/local/bin/python3 /data/stock/jobs/18h_daily_job.py >> /data/logs/daily.${DATE}.log + + +echo "###################"$DATETIME"###################" >> /data/logs/daily.${DATE}.log +#使用股票指标预测。 +/usr/local/bin/python3 /data/stock/jobs/guess_indicators_daily_job.py >> /data/logs/daily.${DATE}.log +/usr/local/bin/python3 /data/stock/jobs/guess_indicators_daily_buy_job.py >> /data/logs/daily.${DATE}.log + +#清除前3天数据。 +DATE_20=`date -d '-20 days' +%Y-%m-%d` +MONTH_20=`date -d '-20 days' +%Y-%m` +echo "rm -f /data/cache/hist_data_cache/${MONTH_20}/${DATETIME_20}" +rm -f /data/cache/hist_data_cache/${MONTH_20}/${DATETIME_20} \ No newline at end of file diff --git a/backend/jobs/cron.hourly/run_hourly b/backend/jobs/cron.hourly/run_hourly new file mode 100755 index 0000000..84a1519 --- /dev/null +++ b/backend/jobs/cron.hourly/run_hourly @@ -0,0 +1,6 @@ +#!/bin/sh + +mkdir -p /data/logs +DATE=`date +%Y-%m-%d:%H:%M:%S` +echo $DATE >> /data/logs/hourly.log + diff --git a/backend/jobs/cron.minutely/run_1minute b/backend/jobs/cron.minutely/run_1minute new file mode 100755 index 0000000..3485fdd --- /dev/null +++ b/backend/jobs/cron.minutely/run_1minute @@ -0,0 +1,5 @@ +#!/bin/bash + +mkdir -p /data/logs +DATE=`date +%Y-%m-%d:%H:%M:%S` +echo $DATE >> /data/logs/1min.log diff --git a/backend/jobs/cron.monthly/run_monthly b/backend/jobs/cron.monthly/run_monthly new file mode 100755 index 0000000..1ae3199 --- /dev/null +++ b/backend/jobs/cron.monthly/run_monthly @@ -0,0 +1,6 @@ +#!/bin/sh + +mkdir -p /data/logs +DATE=`date +%Y-%m-%d:%H:%M:%S` +echo $DATE >> /data/logs/monthly.log + diff --git a/backend/jobs/crontab b/backend/jobs/crontab new file mode 100644 index 0000000..c6b7efb --- /dev/null +++ b/backend/jobs/crontab @@ -0,0 +1,6 @@ +SHELL=/bin/sh +PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin +*/1 * * * * /bin/run-parts /etc/cron.minutely +10 * * * * /bin/run-parts /etc/cron.hourly +30 16 * * * /bin/run-parts /etc/cron.daily +30 17 1,10,20 * * /bin/run-parts /etc/cron.monthly diff --git a/backend/jobs/daily_job.py b/backend/jobs/daily_job.py new file mode 100644 index 0000000..820edd2 --- /dev/null +++ b/backend/jobs/daily_job.py @@ -0,0 +1,49 @@ +#!/usr/local/bin/python3 +# -*- coding: utf-8 -*- + + +import libs.common as common +import sys +import os +import time +import pandas as pd +import tushare as ts +from sqlalchemy.types import NVARCHAR +from sqlalchemy import inspect +import datetime +import shutil + + +####### 使用 5.pdf,先做 基本面数据 的数据,然后在做交易数据。 +# +def stat_all(tmp_datetime): + datetime_str = (tmp_datetime).strftime("%Y-%m-%d") + datetime_int = (tmp_datetime).strftime("%Y%m%d") + + cache_dir = common.bash_stock_tmp % (datetime_str[0:7], datetime_str) + if os.path.exists(cache_dir): + shutil.rmtree(cache_dir) + print("remove cache dir force :", cache_dir) + + print("datetime_str:", datetime_str) + print("datetime_int:", datetime_int) + data = ts.top_list(datetime_str) + # 处理重复数据,保存最新一条数据。最后一步处理,否则concat有问题。 + # + if not data is None and len(data) > 0: + # 插入数据库。 + # del data["reason"] + data["date"] = datetime_int # 修改时间成为int类型。 + data = data.drop_duplicates(subset="code", keep="last") + data.head(n=1) + common.insert_db(data, "ts_top_list", False, "`date`,`code`") + else: + print("no data .") + + print(datetime_str) + + +# main函数入口 +if __name__ == '__main__': + # 使用方法传递。 + tmp_datetime = common.run_with_args(stat_all) diff --git a/backend/jobs/guess_indicators_daily_buy_job.py b/backend/jobs/guess_indicators_daily_buy_job.py new file mode 100644 index 0000000..b5738a0 --- /dev/null +++ b/backend/jobs/guess_indicators_daily_buy_job.py @@ -0,0 +1,77 @@ +#!/usr/local/bin/python3 +# -*- coding: utf-8 -*- + + +import libs.common as common +import pandas as pd +import numpy as np +import math +import datetime +import stockstats +from sqlalchemy import text + + +### 对每日指标数据,进行筛选。将符合条件的。二次筛选出来。 +### 只是做简单筛选 +def stat_all_lite_buy(tmp_datetime): + datetime_str = (tmp_datetime).strftime("%Y-%m-%d") + datetime_int = (tmp_datetime).strftime("%Y%m%d") + print("datetime_str:", datetime_str) + print("datetime_int:", datetime_int) + + # 查询参数 + params = {"datetime": datetime_int} + + sql_kdjk = text(" SELECT avg(`kdjk`) as avg_kdjk FROM guess_indicators_daily ") + data_kdjk = pd.read_sql(sql=sql_kdjk, con=common.engine(), params=params) + kdjk = data_kdjk["avg_kdjk"][0] + + sql_kdjd = text(" SELECT avg(`kdjd`) as avg_kdjd FROM guess_indicators_daily ") + data_kdjd = pd.read_sql(sql=sql_kdjd, con=common.engine(), params=params) + kdjd = data_kdjd["avg_kdjd"][0] + + sql_kdjj = text(" SELECT avg(`kdjj`) as avg_kdjj FROM guess_indicators_daily ") + data_kdjj = pd.read_sql(sql=sql_kdjj, con=common.engine(), params=params) + kdjj = data_kdjj["avg_kdjj"][0] + + # K值在80以上,D值在70以上,J值大于90时为超买。 + # J大于100时为超买,小于10时为超卖。 + # 当六日指标上升到达80时,表示股市已有超买现象 + # 当CCI>﹢100 时,表明股价已经进入非常态区间——超买区间,股价的异动现象应多加关注。 + params_1 = {"datetime": datetime_int, "kdjk": kdjk, "kdjd": kdjd, "kdjj": kdjj} + sql_1 = text(""" + SELECT `date`,`code`,`name`,`last_price`,`change_percent`,`change_amount`,`volume`,`turnover`, + `amplitude`,`high`,`low`,`open`,`closed`,`volume_ratio`,`turnover_rate`, + `pe_ratio`,`pb_ratio`,`market_cap`,`circulating_market_cap`,`rise_speed`, + `change_5min`,`change_ercent_60day`,`ytd_change_percent`, + `boll`, `boll_lb`, `boll_ub`, `kdjd`, `kdjj`, `kdjk`, `macd`, `macdh`, + `macds`, `pdi`,`trix`, `trix_9_sma`, `vr`, `vr_6_sma`, `wr_10`, `wr_6` + FROM stock_data.guess_indicators_daily WHERE `date` = :datetime + and kdjk >= :kdjk and kdjd >= :kdjd and kdjj >= :kdjj + """) # and kdjj > 100 and rsi_6 > 80 and cci > 100 # 调整参数,提前获得股票增长。 + + try: + # 删除老数据。 + del_sql = " DELETE FROM `stock_data`.`guess_indicators_lite_buy_daily` WHERE `date`= '%s' " % datetime_int + common.insert(del_sql) + except Exception as e: + print("error :", e) + + print(f"sql_1 : {sql_1}") + data = pd.read_sql(sql=sql_1, con=common.engine(), params=params_1) + data = data.drop_duplicates(subset="code", keep="last") + print("######## stat_all_lite_buy len data ########:", len(data)) + + try: + common.insert_db(data, "guess_indicators_lite_buy_daily", False, "`date`,`code`") + except Exception as e: + print("error :", e) + + + +# main函数入口 +if __name__ == '__main__': + # 使用方法传递。 + # 二次筛选数据。直接计算买卖股票数据。 + tmp_datetime = common.run_with_args(stat_all_lite_buy) + diff --git a/backend/jobs/guess_indicators_daily_job.py b/backend/jobs/guess_indicators_daily_job.py new file mode 100644 index 0000000..3075741 --- /dev/null +++ b/backend/jobs/guess_indicators_daily_job.py @@ -0,0 +1,278 @@ +#!/usr/local/bin/python3 +# -*- coding: utf-8 -*- + + +import libs.common as common +import pandas as pd +import numpy as np +import math +import datetime +import stockstats + +# 批处理数据。 +def stat_all_batch(tmp_datetime): + datetime_str = (tmp_datetime).strftime("%Y-%m-%d") + datetime_int = (tmp_datetime).strftime("%Y%m%d") + print("datetime_str:", datetime_str) + print("datetime_int:", datetime_int) + + try: + # 删除老数据。 + del_sql = " DELETE FROM `guess_indicators_daily` WHERE `date`= %s " % datetime_int + common.insert(del_sql) + except Exception as e: + print("error :", e) + + sql_count = """ + SELECT count(1) FROM stock_zh_a_spot_em WHERE `date` = %s and `open` > 0 + """ + # 修改逻辑,增加中小板块计算。 中小板:002,创业板:300 。已经是经过筛选的数据了。 + count = common.select_count(sql_count, params=[datetime_int]) + print("count :", count) + batch_size = 100 + end = int(math.ceil(float(count) / batch_size) * batch_size) + print(end) + for i in range(0, end, batch_size): + print("loop :", i) + # 查询今日满足股票数据。剔除数据:创业板股票数据,中小板股票数据,所有st股票 + # #`code` not like '002%' and `code` not like '300%' and `name` not like '%st%' + sql_1 = """ + SELECT `date`,`code`,`name`,`last_price`,`change_percent`,`change_amount`,`volume`,`turnover`, + `amplitude`,`high`,`low`,`open`,`closed`,`volume_ratio`,`turnover_rate`, + `pe_ratio`,`pb_ratio`,`market_cap`,`circulating_market_cap`,`rise_speed`, + `change_5min`,`change_ercent_60day`,`ytd_change_percent` + FROM stock_zh_a_spot_em WHERE `date` = %s and `open` > 0 limit %s , %s + """ + sql_2 = sql_1 % (datetime_int, i, batch_size) + print(sql_2) + # data = pd.read_sql(sql=sql_1, con=common.engine(), params=[datetime_int, '002%', '300%', '%st%', i, batch_size]) + data = pd.read_sql(sql=sql_2, con=common.engine()) + data = data.drop_duplicates(subset="code", keep="last") + print("########data[last_price]########:", len(data)) + stat_index_all(data, i) + + +# 分批执行。 +def stat_index_all(data, idx): + # print(data["last_price"]) + # 1), n天涨跌百分百计算 + # open price change (in percent) between today and the day before yesterday ‘r’ stands for rate. + # stock[‘close_-2_r’] + # 可以看到,-n天数据和今天数据的百分比。 + + + # 2), CR指标 + # http://wiki.mbalib.com/wiki/CR%E6%8C%87%E6%A0%87 价格动量指标 + # CR跌穿a、b、c、d四条线,再由低点向上爬升160时,为短线获利的一个良机,应适当卖出股票。 + # CR跌至40以下时,是建仓良机。而CR高于300~400时,应注意适当减仓。 + + # 3), KDJ指标 + # http://wiki.mbalib.com/wiki/%E9%9A%8F%E6%9C%BA%E6%8C%87%E6%A0%87 + # 随机指标(KDJ)一般是根据统计学的原理,通过一个特定的周期(常为9日、9周等)内出现过的最高价、 + # 最低价及最后一个计算周期的收盘价及这三者之间的比例关系,来计算最后一个计算周期的未成熟随机值RSV, + # 然后根据平滑移动平均线的方法来计算K值、D值与J值,并绘成曲线图来研判股票走势。 + # (3)在使用中,常有J线的指标,即3乘以K值减2乘以D值(3K-2D=J),其目的是求出K值与D值的最大乖离程度, + # 以领先KD值找出底部和头部。J大于100时为超买,小于10时为超卖。 + + # 4), MACD指标 + # http://wiki.mbalib.com/wiki/MACD + # 平滑异同移动平均线(Moving Average Convergence Divergence,简称MACD指标),也称移动平均聚散指标 + # MACD 则可发挥其应有的功能,但当市场呈牛皮盘整格局,股价不上不下时,MACD买卖讯号较不明显。 + # 当用MACD作分析时,亦可运用其他的技术分析指标如短期 K,D图形作为辅助工具,而且也可对买卖讯号作双重的确认。 + + + # 5), BOLL指标 + # http://wiki.mbalib.com/wiki/BOLL + # 布林线指标(Bollinger Bands) + + # 6), RSI指标 + # http://wiki.mbalib.com/wiki/RSI + # 相对强弱指标(Relative Strength Index,简称RSI),也称相对强弱指数、相对力度指数 + # (2)强弱指标保持高于50表示为强势市场,反之低于50表示为弱势市场。 + # (3)强弱指标多在70与30之间波动。当六日指标上升到达80时,表示股市已有超买现象, + # 如果一旦继续上升,超过90以上时,则表示已到严重超买的警戒区,股价已形成头部,极可能在短期内反转回转。 + + + # 7), W%R指标 + # http://wiki.mbalib.com/wiki/%E5%A8%81%E5%BB%89%E6%8C%87%E6%A0%87 + # 威廉指数(Williams%Rate)该指数是利用摆动点来度量市场的超买超卖现象。 + + # 8), CCI指标 + # http://wiki.mbalib.com/wiki/%E9%A1%BA%E5%8A%BF%E6%8C%87%E6%A0%87 + # 顺势指标又叫CCI指标,其英文全称为“Commodity Channel Index”, + # 是由美国股市分析家唐纳德·蓝伯特(Donald Lambert)所创造的,是一种重点研判股价偏离度的股市分析工具。 + # 1、当CCI指标从下向上突破﹢100线而进入非常态区间时,表明股价脱离常态而进入异常波动阶段, + # 中短线应及时买入,如果有比较大的成交量配合,买入信号则更为可靠。 + #   2、当CCI指标从上向下突破﹣100线而进入另一个非常态区间时,表明股价的盘整阶段已经结束, + # 将进入一个比较长的寻底过程,投资者应以持币观望为主。 + # CCI, default to 14 days + + # 9), TR、ATR指标 + # http://wiki.mbalib.com/wiki/%E5%9D%87%E5%B9%85%E6%8C%87%E6%A0%87 + # 均幅指标(Average True Ranger,ATR) + # 均幅指标(ATR)是取一定时间周期内的股价波动幅度的移动平均值,主要用于研判买卖时机。 + + # 10), DMA指标 + # http://wiki.mbalib.com/wiki/DMA + #  DMA指标(Different of Moving Average)又叫平行线差指标,是目前股市分析技术指标中的一种中短期指标,它常用于大盘指数和个股的研判。 + # DMA, difference of 10 and 50 moving average + # stock[‘dma’] + + # 11), DMI,+DI,-DI,DX,ADX,ADXR指标 + # http://wiki.mbalib.com/wiki/DMI + # 动向指数Directional Movement Index,DMI) + # http://wiki.mbalib.com/wiki/ADX + # 平均趋向指标(Average Directional Indicator,简称ADX) + # http://wiki.mbalib.com/wiki/%E5%B9%B3%E5%9D%87%E6%96%B9%E5%90%91%E6%8C%87%E6%95%B0%E8%AF%84%E4%BC%B0 + # 平均方向指数评估(ADXR)实际是今日ADX与前面某一日的ADX的平均值。ADXR在高位与ADX同步下滑,可以增加对ADX已经调头的尽早确认。 + # ADXR是ADX的附属产品,只能发出一种辅助和肯定的讯号,并非入市的指标,而只需同时配合动向指标(DMI)的趋势才可作出买卖策略。 + # 在应用时,应以ADX为主,ADXR为辅。 + + # 12), TRIX,MATRIX指标 + # http://wiki.mbalib.com/wiki/TRIX + # TRIX指标又叫三重指数平滑移动平均指标(Triple Exponentially Smoothed Average) + + # 13), VR,MAVR指标 + # http://wiki.mbalib.com/wiki/%E6%88%90%E4%BA%A4%E9%87%8F%E6%AF%94%E7%8E%87 + # 成交量比率(Volumn Ratio,VR)(简称VR),是一项通过分析股价上升日成交额(或成交量,下同)与股价下降日成交额比值, + # 从而掌握市场买卖气势的中期技术指标。 + + #stock_column = ['adx', 'adxr', 'boll', 'boll_lb', 'boll_ub', 'cci', 'cci_20', 'close_-1_r', + # 'close_-2_r', 'code', 'cr', 'cr-ma1', 'cr-ma2', 'cr-ma3', 'date', 'dma', 'dx', + # 'kdjd', 'kdjj', 'kdjk', 'macd', 'macdh', 'macds', 'pdi', + # 'rsi_12', 'rsi_6', 'trix', 'trix_9_sma', 'vr', 'vr_6_sma', 'wr_10', 'wr_6'] + + stock_column = ['date','code', 'boll', 'boll_lb', 'boll_ub', + 'kdjd', 'kdjj', 'kdjk', 'macd', 'macdh', 'macds', 'pdi', + 'trix', 'trix_9_sma', 'vr', 'vr_6_sma', 'wr_10', 'wr_6'] + # code cr cr-ma1 cr-ma2 cr-ma3 date + + data_new = concat_guess_data(stock_column, data) + + data_new = data_new.round(2) # 数据保留2位小数 + + # print(data_new.head()) + print("########insert db guess_indicators_daily idx :########:", idx) + try: + common.insert_db(data_new, "guess_indicators_daily", False, "`date`,`code`") + except Exception as e: + print("error :", e) + + +# 链接guess 数据。 +def concat_guess_data(stock_column, data): + # 使用 trade 填充数据 + print("stock_column:", stock_column) + tmp_dic = {} + # 循环增加临时数据。如果要是date,和code, + for col in stock_column: + if col == 'date': + tmp_dic[col] = data["date"] + elif col == 'code': + tmp_dic[col] = data["code"] + else: + tmp_dic[col] = data["last_price"] + # print("##########tmp_dic: ", tmp_dic) + print("########################## BEGIN ##########################") + stock_guess = pd.DataFrame(tmp_dic, index=data.index.values) + print(stock_guess.columns.values) + # print(stock_guess.head()) + stock_guess = stock_guess.apply(apply_guess, stock_column=stock_column, axis=1) # , axis=1) + print(stock_guess.head()) + # stock_guess.astype('float32', copy=False) + stock_guess.drop('date', axis=1, inplace=True) # 删除日期字段,然后和原始数据合并。 + # print(stock_guess["5d"]) + data_new = pd.merge(data, stock_guess, on=['code'], how='left') + print("#############") + return data_new + + +# 带参数透传。 +def apply_guess(tmp, stock_column): + # print("apply_guess columns args:", stock_column) + # print("apply_guess data :", type(tmp)) + date = tmp["date"] + code = tmp["code"] + date_end = datetime.datetime.strptime(date, "%Y%m%d") + date_start = (date_end + datetime.timedelta(days=-100)).strftime("%Y-%m-%d") + date_end = date_end.strftime("%Y-%m-%d") + # print(code, date_start, date_end) + # open, high, close, low, volume, price_change, p_change, ma5, ma10, ma20, v_ma5, v_ma10, v_ma20, turnover + # 使用缓存方法。加快计算速度。 + stock = common.get_hist_data_cache(code, date_start, date_end) + # 设置返回数组。 + stock_data_list = [] + stock_name_list = [] + print(f"stock_column : {stock_column}") + # 增加空判断,如果是空返回 0 数据。 + if stock is None: + for col in stock_column: + if col == 'date': + stock_data_list.append(date) + stock_name_list.append('date') + elif col == 'code': + stock_data_list.append(code) + stock_name_list.append('code') + else: + stock_data_list.append(0) + stock_name_list.append(col) + return pd.Series(stock_data_list, index=stock_name_list) + + # print(stock.head()) + # open high close low volume + # stock = pd.DataFrame({"close": stock["close"]}, index=stock.index.values) + # stock = stock.sort_index(0) # 将数据按照日期排序下。 + + stock["date"] = stock.index.values # 增加日期列。 + print(f"stock: {stock}") + # stock = stock.sort_index(0) # 将数据按照日期排序下。 + # print(stock) [186 rows x 14 columns] + # 初始化统计类 + # stockStat = stockstats.StockDataFrame.retype(pd.read_csv('002032.csv')) + stockStat = stockstats.StockDataFrame.retype(stock) + print(f"stockStat : {stockStat}") + + print("########################## print result ##########################") + for col in stock_column: + if col == 'date': + stock_data_list.append(date) + stock_name_list.append('date') + elif col == 'code': + stock_data_list.append(code) + stock_name_list.append('code') + else: + # 将数据的最后一个返回。 + print(col) + print(stockStat[col]) + print(stockStat[col].values[1]) + #print(stockStat[col].head(1)) + + tmp_val = stockStat[col].values[1] + if np.isinf(tmp_val): # 解决值中存在INF问题。 + tmp_val = 0 + if np.isnan(tmp_val): # 解决值中存在NaN问题。 + tmp_val = 0 + # print("col name : ", col, tmp_val) + stock_data_list.append(tmp_val) + stock_name_list.append(col) + # print(stock_data_list) + return pd.Series(stock_data_list, index=stock_name_list) + + +# print(stock["mov_vol"].tail()) +# print(stock["return"].tail()) +# print("stock[10d].tail(1)", stock["10d"].tail(1).values[0]) +# 10d 20d 5-10d 5-20d 5d 60d code date mov_vol return +# tmp = list([stock["10d"].tail(1).values[0], stock["20d"].tail(1).values[0], stock["5-10d"].tail(1).values[0], +# stock["5-20d"].tail(1).values[0], stock["5d"].tail(1).values[0], stock["60d"].tail(1).values[0], +# code, date, stock["mov_vol"].tail(1).values[0], stock["return"].tail(1).values[0]]) +# # print(tmp) +# return tmp + + +# main函数入口 +if __name__ == '__main__': + # 使用方法传递。 + tmp_datetime = common.run_with_args(stat_all_batch) + # 二次筛选数据。直接计算买卖股票数据。 + diff --git a/backend/jobs/guess_indicators_daily_sell_job.py b/backend/jobs/guess_indicators_daily_sell_job.py new file mode 100644 index 0000000..6b92886 --- /dev/null +++ b/backend/jobs/guess_indicators_daily_sell_job.py @@ -0,0 +1,61 @@ +#!/usr/local/bin/python3 +# -*- coding: utf-8 -*- + + +import libs.common as common +import pandas as pd +import numpy as np +import math +import datetime +import stockstats +from sqlalchemy import text + +# 设置卖出数据。 +def stat_all_lite_sell(tmp_datetime): + datetime_str = (tmp_datetime).strftime("%Y-%m-%d") + datetime_int = (tmp_datetime).strftime("%Y%m%d") + print("datetime_str:", datetime_str) + print("datetime_int:", datetime_int) + + # 超卖区:K值在20以下,D值在30以下为超卖区。一般情况下,股价有可能上涨,反弹的可能性增大。局内人不应轻易抛出股票,局外人可寻机入场。 + # J大于100时为超买,小于10时为超卖。 + # 当六日强弱指标下降至20时,表示股市有超卖现象 + # 当CCI<﹣100时,表明股价已经进入另一个非常态区间——超卖区间,投资者可以逢低吸纳股票。 + sql_1 = text(""" + SELECT `date`,`code`,`name`,`last_price`,`change_percent`,`change_amount`,`volume`,`turnover`, + `amplitude`,`high`,`low`,`open`,`closed`,`volume_ratio`,`turnover_rate`, + `pe_ratio`,`pb_ratio`,`market_cap`,`circulating_market_cap`,`rise_speed`, + `change_5min`,`change_ercent_60day`,`ytd_change_percent`, + `boll`, `boll_lb`, `boll_ub`, `kdjd`, `kdjj`, `kdjk`, `macd`, `macdh`, + `macds`, `pdi`,`trix`, `trix_9_sma`, `vr`, `vr_6_sma`, `wr_10`, `wr_6` + FROM stock_data.guess_indicators_daily WHERE `date` = :datetime + and kdjk <= 20 and kdjd <= 30 and kdjj <= 10 + """) + + try: + # 删除老数据。 + del_sql = " DELETE FROM `stock_data`.`guess_indicators_lite_sell_daily` WHERE `date`= '%s' " % datetime_int + common.insert(del_sql) + except Exception as e: + print("error :", e) + + # 查询参数 + params = {"datetime": datetime_int} + print(sql_1) + data = pd.read_sql(sql=sql_1, con=common.engine(), params=params) + data = data.drop_duplicates(subset="code", keep="last") + print("######## stat_all_lite_sell len data ########:", len(data)) + + try: + common.insert_db(data, "guess_indicators_lite_sell_daily", False, "`date`,`code`") + except Exception as e: + print("error :", e) + + + +# main函数入口 +if __name__ == '__main__': + # 使用方法传递。 + # 二次筛选数据。直接计算买卖股票数据。 + tmp_datetime = common.run_with_args(stat_all_lite_sell) + diff --git a/backend/jobs/guess_rsrs_daily_job.py b/backend/jobs/guess_rsrs_daily_job.py new file mode 100644 index 0000000..ecb72fb --- /dev/null +++ b/backend/jobs/guess_rsrs_daily_job.py @@ -0,0 +1,480 @@ +#!/usr/local/bin/python3 +# -*- coding: utf-8 -*- + + +import libs.common as common +import pandas as pd +import numpy as np +import math +import datetime +import stockstats + + +### 对每日指标数据,进行筛选。将符合条件的。二次筛选出来。 +### 只是做简单筛选 +def stat_all_lite_buy(tmp_datetime): + datetime_str = (tmp_datetime).strftime("%Y-%m-%d") + datetime_int = (tmp_datetime).strftime("%Y%m%d") + print("datetime_str:", datetime_str) + print("datetime_int:", datetime_int) + + # K值在80以上,D值在70以上,J值大于90时为超买。 + # J大于100时为超买,小于10时为超卖。 + # 当六日指标上升到达80时,表示股市已有超买现象 + # 当CCI>﹢100 时,表明股价已经进入非常态区间——超买区间,股价的异动现象应多加关注。 + sql_1 = """ + SELECT `date`, `code`, `name`, `changepercent`, `trade`, `open`, `high`, `low`, + `settlement`, `volume`, `turnoverratio`, `amount`, `per`, `pb`, `mktcap`, + `nmc` ,`kdjj`,`rsi_6`,`cci` + FROM stock_data.guess_indicators_daily WHERE `date` = %s + and kdjk >= 80 and kdjd >= 70 and kdjj >= 100 and rsi_6 >= 80 and cci >= 100 + """ # and kdjj > 100 and rsi_6 > 80 and cci > 100 # 调整参数,提前获得股票增长。 + + try: + # 删除老数据。 + del_sql = " DELETE FROM `stock_data`.`guess_indicators_lite_buy_daily` WHERE `date`= '%s' " % datetime_int + common.insert(del_sql) + except Exception as e: + print("error :", e) + + data = pd.read_sql(sql=sql_1, con=common.engine(), params=[datetime_int]) + data = data.drop_duplicates(subset="code", keep="last") + print("######## len data ########:", len(data)) + + try: + common.insert_db(data, "guess_indicators_lite_buy_daily", False, "`date`,`code`") + except Exception as e: + print("error :", e) + +# 设置卖出数据。 +def stat_all_lite_sell(tmp_datetime): + datetime_str = (tmp_datetime).strftime("%Y-%m-%d") + datetime_int = (tmp_datetime).strftime("%Y%m%d") + print("datetime_str:", datetime_str) + print("datetime_int:", datetime_int) + + # 超卖区:K值在20以下,D值在30以下为超卖区。一般情况下,股价有可能上涨,反弹的可能性增大。局内人不应轻易抛出股票,局外人可寻机入场。 + # J大于100时为超买,小于10时为超卖。 + # 当六日强弱指标下降至20时,表示股市有超卖现象 + # 当CCI<﹣100时,表明股价已经进入另一个非常态区间——超卖区间,投资者可以逢低吸纳股票。 + sql_1 = """ + SELECT `date`, `code`, `name`, `changepercent`, `trade`, `open`, `high`, `low`, + `settlement`, `volume`, `turnoverratio`, `amount`, `per`, `pb`, `mktcap`, + `nmc` ,`kdjj`,`rsi_6`,`cci` + FROM stock_data.guess_indicators_daily WHERE `date` = %s + and kdjk <= 20 and kdjd <= 30 and kdjj <= 10 and rsi_6 <= 20 and cci <= -100 + """ + + try: + # 删除老数据。 + del_sql = " DELETE FROM `stock_data`.`guess_indicators_lite_sell_daily` WHERE `date`= '%s' " % datetime_int + common.insert(del_sql) + except Exception as e: + print("error :", e) + + data = pd.read_sql(sql=sql_1, con=common.engine(), params=[datetime_int]) + data = data.drop_duplicates(subset="code", keep="last") + print("######## len data ########:", len(data)) + + try: + common.insert_db(data, "guess_indicators_lite_sell_daily", False, "`date`,`code`") + except Exception as e: + print("error :", e) + +# 批处理数据。 +def stat_all_batch(tmp_datetime): + datetime_str = (tmp_datetime).strftime("%Y-%m-%d") + datetime_int = (tmp_datetime).strftime("%Y%m%d") + print("datetime_str:", datetime_str) + print("datetime_int:", datetime_int) + + try: + # 删除老数据。 + del_sql = " DELETE FROM `stock_data`.`guess_indicators_daily` WHERE `date`= %s " % datetime_int + common.insert(del_sql) + except Exception as e: + print("error :", e) + + sql_count = """ + SELECT count(1) FROM stock_data.ts_today_all WHERE `date` = %s and `trade` > 0 and `open` > 0 and trade <= 20 + and `code` not like %s and `name` not like %s + """ + # 修改逻辑,增加中小板块计算。 中小板:002,创业板:300 。and `code` not like %s and `code` not like %s and `name` not like %s + # count = common.select_count(sql_count, params=[datetime_int, '002%', '300%', '%st%']) + count = common.select_count(sql_count, params=[datetime_int, '300%', '%st%']) + print("count :", count) + batch_size = 100 + end = int(math.ceil(float(count) / batch_size) * batch_size) + print(end) + for i in range(0, end, batch_size): + print("loop :", i) + # 查询今日满足股票数据。剔除数据:创业板股票数据,中小板股票数据,所有st股票 + # #`code` not like '002%' and `code` not like '300%' and `name` not like '%st%' + sql_1 = """ + SELECT `date`, `code`, `name`, `changepercent`, `trade`, `open`, `high`, `low`, + `settlement`, `volume`, `turnoverratio`, `amount`, `per`, `pb`, `mktcap`, `nmc` + FROM stock_data.ts_today_all WHERE `date` = %s and `trade` > 0 and `open` > 0 and trade <= 20 + and `code` not like %s and `name` not like %s limit %s , %s + """ + print(sql_1) + # data = pd.read_sql(sql=sql_1, con=common.engine(), params=[datetime_int, '002%', '300%', '%st%', i, batch_size]) + data = pd.read_sql(sql=sql_1, con=common.engine(), params=[datetime_int, '300%', '%st%', i, batch_size]) + data = data.drop_duplicates(subset="code", keep="last") + print("########data[trade]########:", len(data)) + stat_index_all(data, i) + + +# 分批执行。 +def stat_index_all(data, idx): + # print(data["trade"]) + # 1), n天涨跌百分百计算 + # open price change (in percent) between today and the day before yesterday ‘r’ stands for rate. + # stock[‘close_-2_r’] + # 可以看到,-n天数据和今天数据的百分比。 + + + # 2), CR指标 + # http://wiki.mbalib.com/wiki/CR%E6%8C%87%E6%A0%87 价格动量指标 + # CR跌穿a、b、c、d四条线,再由低点向上爬升160时,为短线获利的一个良机,应适当卖出股票。 + # CR跌至40以下时,是建仓良机。而CR高于300~400时,应注意适当减仓。 + + # 3), KDJ指标 + # http://wiki.mbalib.com/wiki/%E9%9A%8F%E6%9C%BA%E6%8C%87%E6%A0%87 + # 随机指标(KDJ)一般是根据统计学的原理,通过一个特定的周期(常为9日、9周等)内出现过的最高价、 + # 最低价及最后一个计算周期的收盘价及这三者之间的比例关系,来计算最后一个计算周期的未成熟随机值RSV, + # 然后根据平滑移动平均线的方法来计算K值、D值与J值,并绘成曲线图来研判股票走势。 + # (3)在使用中,常有J线的指标,即3乘以K值减2乘以D值(3K-2D=J),其目的是求出K值与D值的最大乖离程度, + # 以领先KD值找出底部和头部。J大于100时为超买,小于10时为超卖。 + + # 4), MACD指标 + # http://wiki.mbalib.com/wiki/MACD + # 平滑异同移动平均线(Moving Average Convergence Divergence,简称MACD指标),也称移动平均聚散指标 + # MACD 则可发挥其应有的功能,但当市场呈牛皮盘整格局,股价不上不下时,MACD买卖讯号较不明显。 + # 当用MACD作分析时,亦可运用其他的技术分析指标如短期 K,D图形作为辅助工具,而且也可对买卖讯号作双重的确认。 + + + # 5), BOLL指标 + # http://wiki.mbalib.com/wiki/BOLL + # 布林线指标(Bollinger Bands) + + # 6), RSI指标 + # http://wiki.mbalib.com/wiki/RSI + # 相对强弱指标(Relative Strength Index,简称RSI),也称相对强弱指数、相对力度指数 + # (2)强弱指标保持高于50表示为强势市场,反之低于50表示为弱势市场。 + # (3)强弱指标多在70与30之间波动。当六日指标上升到达80时,表示股市已有超买现象, + # 如果一旦继续上升,超过90以上时,则表示已到严重超买的警戒区,股价已形成头部,极可能在短期内反转回转。 + + + # 7), W%R指标 + # http://wiki.mbalib.com/wiki/%E5%A8%81%E5%BB%89%E6%8C%87%E6%A0%87 + # 威廉指数(Williams%Rate)该指数是利用摆动点来度量市场的超买超卖现象。 + + # 8), CCI指标 + # http://wiki.mbalib.com/wiki/%E9%A1%BA%E5%8A%BF%E6%8C%87%E6%A0%87 + # 顺势指标又叫CCI指标,其英文全称为“Commodity Channel Index”, + # 是由美国股市分析家唐纳德·蓝伯特(Donald Lambert)所创造的,是一种重点研判股价偏离度的股市分析工具。 + # 1、当CCI指标从下向上突破﹢100线而进入非常态区间时,表明股价脱离常态而进入异常波动阶段, + # 中短线应及时买入,如果有比较大的成交量配合,买入信号则更为可靠。 + #   2、当CCI指标从上向下突破﹣100线而进入另一个非常态区间时,表明股价的盘整阶段已经结束, + # 将进入一个比较长的寻底过程,投资者应以持币观望为主。 + # CCI, default to 14 days + + # 9), TR、ATR指标 + # http://wiki.mbalib.com/wiki/%E5%9D%87%E5%B9%85%E6%8C%87%E6%A0%87 + # 均幅指标(Average True Ranger,ATR) + # 均幅指标(ATR)是取一定时间周期内的股价波动幅度的移动平均值,主要用于研判买卖时机。 + + # 10), DMA指标 + # http://wiki.mbalib.com/wiki/DMA + #  DMA指标(Different of Moving Average)又叫平行线差指标,是目前股市分析技术指标中的一种中短期指标,它常用于大盘指数和个股的研判。 + # DMA, difference of 10 and 50 moving average + # stock[‘dma’] + + # 11), DMI,+DI,-DI,DX,ADX,ADXR指标 + # http://wiki.mbalib.com/wiki/DMI + # 动向指数Directional Movement Index,DMI) + # http://wiki.mbalib.com/wiki/ADX + # 平均趋向指标(Average Directional Indicator,简称ADX) + # http://wiki.mbalib.com/wiki/%E5%B9%B3%E5%9D%87%E6%96%B9%E5%90%91%E6%8C%87%E6%95%B0%E8%AF%84%E4%BC%B0 + # 平均方向指数评估(ADXR)实际是今日ADX与前面某一日的ADX的平均值。ADXR在高位与ADX同步下滑,可以增加对ADX已经调头的尽早确认。 + # ADXR是ADX的附属产品,只能发出一种辅助和肯定的讯号,并非入市的指标,而只需同时配合动向指标(DMI)的趋势才可作出买卖策略。 + # 在应用时,应以ADX为主,ADXR为辅。 + + # 12), TRIX,MATRIX指标 + # http://wiki.mbalib.com/wiki/TRIX + # TRIX指标又叫三重指数平滑移动平均指标(Triple Exponentially Smoothed Average) + + # 13), VR,MAVR指标 + # http://wiki.mbalib.com/wiki/%E6%88%90%E4%BA%A4%E9%87%8F%E6%AF%94%E7%8E%87 + # 成交量比率(Volumn Ratio,VR)(简称VR),是一项通过分析股价上升日成交额(或成交量,下同)与股价下降日成交额比值, + # 从而掌握市场买卖气势的中期技术指标。 + + stock_column = ['adx', 'adxr', 'boll', 'boll_lb', 'boll_ub', 'cci', 'cci_20', 'close_-1_r', + 'close_-2_r', 'code', 'cr', 'cr-ma1', 'cr-ma2', 'cr-ma3', 'date', 'dma', 'dx', + 'kdjd', 'kdjj', 'kdjk', 'macd', 'macdh', 'macds', 'mdi', 'pdi', + 'rsi_12', 'rsi_6', 'trix', 'trix_9_sma', 'vr', 'vr_6_sma', 'wr_10', 'wr_6'] + # code cr cr-ma1 cr-ma2 cr-ma3 date + + data_new = concat_guess_data(stock_column, data) + + data_new = data_new.round(2) # 数据保留2位小数 + + # print(data_new.head()) + print("########insert db guess_indicators_daily idx :########:", idx) + try: + common.insert_db(data_new, "guess_indicators_daily", False, "`date`,`code`") + except Exception as e: + print("error :", e) + + +# 链接guess 数据。 +def concat_guess_data(stock_column, data): + # 使用 trade 填充数据 + print("stock_column:", stock_column) + tmp_dic = {} + # 循环增加临时数据。如果要是date,和code, + for col in stock_column: + if col == 'date': + tmp_dic[col] = data["date"] + elif col == 'code': + tmp_dic[col] = data["code"] + else: + tmp_dic[col] = data["trade"] + # print("##########tmp_dic: ", tmp_dic) + print("########################## BEGIN ##########################") + stock_guess = pd.DataFrame(tmp_dic, index=data.index.values) + print(stock_guess.columns.values) + # print(stock_guess.head()) + stock_guess = stock_guess.apply(apply_guess, stock_column=stock_column, axis=1) # , axis=1) + print(stock_guess.head()) + # stock_guess.astype('float32', copy=False) + stock_guess.drop('date', axis=1, inplace=True) # 删除日期字段,然后和原始数据合并。 + # print(stock_guess["5d"]) + data_new = pd.merge(data, stock_guess, on=['code'], how='left') + print("#############") + return data_new + + +# 带参数透传。 +def apply_guess(tmp, stock_column): + # print("apply_guess columns args:", stock_column) + # print("apply_guess data :", type(tmp)) + date = tmp["date"] + code = tmp["code"] + date_end = datetime.datetime.strptime(date, "%Y%m%d") + date_start = (date_end + datetime.timedelta(days=-100)).strftime("%Y-%m-%d") + date_end = date_end.strftime("%Y-%m-%d") + # print(code, date_start, date_end) + # open, high, close, low, volume, price_change, p_change, ma5, ma10, ma20, v_ma5, v_ma10, v_ma20, turnover + # 使用缓存方法。加快计算速度。 + stock = common.get_hist_data_cache(code, date_start, date_end) + # 设置返回数组。 + stock_data_list = [] + stock_name_list = [] + # 增加空判断,如果是空返回 0 数据。 + if stock is None: + for col in stock_column: + if col == 'date': + stock_data_list.append(date) + stock_name_list.append('date') + elif col == 'code': + stock_data_list.append(code) + stock_name_list.append('code') + else: + stock_data_list.append(0) + stock_name_list.append(col) + return pd.Series(stock_data_list, index=stock_name_list) + + # print(stock.head()) + # open high close low volume + # stock = pd.DataFrame({"close": stock["close"]}, index=stock.index.values) + stock = stock.sort_index(0) # 将数据按照日期排序下。 + + stock["date"] = stock.index.values # 增加日期列。 + stock = stock.sort_index(0) # 将数据按照日期排序下。 + # print(stock) [186 rows x 14 columns] + # 初始化统计类 + # stockStat = stockstats.StockDataFrame.retype(pd.read_csv('002032.csv')) + stockStat = stockstats.StockDataFrame.retype(stock) + + print("########################## print result ##########################") + for col in stock_column: + if col == 'date': + stock_data_list.append(date) + stock_name_list.append('date') + elif col == 'code': + stock_data_list.append(code) + stock_name_list.append('code') + else: + # 将数据的最后一个返回。 + tmp_val = stockStat[col].tail(1).values[0] + if np.isinf(tmp_val): # 解决值中存在INF问题。 + tmp_val = 0 + if np.isnan(tmp_val): # 解决值中存在NaN问题。 + tmp_val = 0 + # print("col name : ", col, tmp_val) + stock_data_list.append(tmp_val) + stock_name_list.append(col) + # print(stock_data_list) + return pd.Series(stock_data_list, index=stock_name_list) + + +# print(stock["mov_vol"].tail()) +# print(stock["return"].tail()) +# print("stock[10d].tail(1)", stock["10d"].tail(1).values[0]) +# 10d 20d 5-10d 5-20d 5d 60d code date mov_vol return +# tmp = list([stock["10d"].tail(1).values[0], stock["20d"].tail(1).values[0], stock["5-10d"].tail(1).values[0], +# stock["5-20d"].tail(1).values[0], stock["5d"].tail(1).values[0], stock["60d"].tail(1).values[0], +# code, date, stock["mov_vol"].tail(1).values[0], stock["return"].tail(1).values[0]]) +# # print(tmp) +# return tmp + + +# main函数入口 +if __name__ == '__main__': + # 使用方法传递。 + tmp_datetime = common.run_with_args(stat_all_batch) + # 二次筛选数据。直接计算买卖股票数据。 + tmp_datetime = common.run_with_args(stat_all_lite_buy) + tmp_datetime = common.run_with_args(stat_all_lite_sell) + + +####################### 老方法,弃用了。####################### +def stat_index_all_no_use(tmp_datetime): + datetime_str = (tmp_datetime).strftime("%Y-%m-%d") + datetime_int = (tmp_datetime).strftime("%Y%m%d") + print("datetime_str:", datetime_str) + print("datetime_int:", datetime_int) + + # 查询今日满足股票数据。剔除数据:创业板股票数据,中小板股票数据,所有st股票 + # #`code` not like '002%' and `code` not like '300%' and `name` not like '%st%' + sql_1 = """ + SELECT `date`, `code`, `name`, `changepercent`, `trade`, `open`, `high`, `low`, + `settlement`, `volume`, `turnoverratio`, `amount`, `per`, `pb`, `mktcap`, `nmc` + FROM stock_data.ts_today_all WHERE `date` = %s and `trade` > 0 and `open` > 0 and trade <= 20 + and `code` not like %s and `code` not like %s and `name` not like %s + """ + print(sql_1) + data = pd.read_sql(sql=sql_1, con=common.engine(), params=[datetime_int, '002%', '300%', '%st%']) + data = data.drop_duplicates(subset="code", keep="last") + print("########data[trade]########:", len(data)) + # print(data["trade"]) + + # 1), n天涨跌百分百计算 + # open price change (in percent) between today and the day before yesterday ‘r’ stands for rate. + # stock[‘close_-2_r’] + # 可以看到,-n天数据和今天数据的百分比。 + stock_column = ['close_-1_r', 'close_-2_r', 'code', 'date'] # close_-1_r close_-2_r code date + data_new = concat_guess_data(stock_column, data) + + # 2), CR指标 + # http://wiki.mbalib.com/wiki/CR%E6%8C%87%E6%A0%87 价格动量指标 + # CR跌穿a、b、c、d四条线,再由低点向上爬升160时,为短线获利的一个良机,应适当卖出股票。 + # CR跌至40以下时,是建仓良机。而CR高于300~400时,应注意适当减仓。 + stock_column = ['code', 'cr', 'cr-ma1', 'cr-ma2', 'cr-ma3', 'date'] # code cr cr-ma1 cr-ma2 cr-ma3 date + data_new = concat_guess_data(stock_column, data_new) + + # 3), KDJ指标 + # http://wiki.mbalib.com/wiki/%E9%9A%8F%E6%9C%BA%E6%8C%87%E6%A0%87 + # 随机指标(KDJ)一般是根据统计学的原理,通过一个特定的周期(常为9日、9周等)内出现过的最高价、 + # 最低价及最后一个计算周期的收盘价及这三者之间的比例关系,来计算最后一个计算周期的未成熟随机值RSV, + # 然后根据平滑移动平均线的方法来计算K值、D值与J值,并绘成曲线图来研判股票走势。 + # (3)在使用中,常有J线的指标,即3乘以K值减2乘以D值(3K-2D=J),其目的是求出K值与D值的最大乖离程度, + # 以领先KD值找出底部和头部。J大于100时为超买,小于10时为超卖。 + stock_column = ['code', 'date', 'kdjd', 'kdjj', 'kdjk'] # code date kdjd kdjj kdjk + data_new = concat_guess_data(stock_column, data_new) + + # 4), MACD指标 + # http://wiki.mbalib.com/wiki/MACD + # 平滑异同移动平均线(Moving Average Convergence Divergence,简称MACD指标),也称移动平均聚散指标 + # MACD 则可发挥其应有的功能,但当市场呈牛皮盘整格局,股价不上不下时,MACD买卖讯号较不明显。 + # 当用MACD作分析时,亦可运用其他的技术分析指标如短期 K,D图形作为辅助工具,而且也可对买卖讯号作双重的确认。 + stock_column = ['code', 'date', 'macd', 'macdh', 'macds'] # code date macd macdh macds + data_new = concat_guess_data(stock_column, data_new) + + # 5), BOLL指标 + # http://wiki.mbalib.com/wiki/BOLL + # 布林线指标(Bollinger Bands) + stock_column = ['boll', 'boll_lb', 'boll_ub', 'code', 'date'] # boll boll_lb boll_ub code date + data_new = concat_guess_data(stock_column, data_new) + + # 6), RSI指标 + # http://wiki.mbalib.com/wiki/RSI + # 相对强弱指标(Relative Strength Index,简称RSI),也称相对强弱指数、相对力度指数 + # (2)强弱指标保持高于50表示为强势市场,反之低于50表示为弱势市场。 + # (3)强弱指标多在70与30之间波动。当六日指标上升到达80时,表示股市已有超买现象, + # 如果一旦继续上升,超过90以上时,则表示已到严重超买的警戒区,股价已形成头部,极可能在短期内反转回转。 + stock_column = ['code', 'date', 'rsi_12', 'rsi_6'] # code date rsi_12 rsi_6 + data_new = concat_guess_data(stock_column, data_new) + + # 7), W%R指标 + # http://wiki.mbalib.com/wiki/%E5%A8%81%E5%BB%89%E6%8C%87%E6%A0%87 + # 威廉指数(Williams%Rate)该指数是利用摆动点来度量市场的超买超卖现象。 + stock_column = ['code', 'date', 'wr_10', 'wr_6'] # code date wr_10 wr_6 + data_new = concat_guess_data(stock_column, data_new) + + # 8), CCI指标 + # http://wiki.mbalib.com/wiki/%E9%A1%BA%E5%8A%BF%E6%8C%87%E6%A0%87 + # 顺势指标又叫CCI指标,其英文全称为“Commodity Channel Index”, + # 是由美国股市分析家唐纳德·蓝伯特(Donald Lambert)所创造的,是一种重点研判股价偏离度的股市分析工具。 + # 1、当CCI指标从下向上突破﹢100线而进入非常态区间时,表明股价脱离常态而进入异常波动阶段, + # 中短线应及时买入,如果有比较大的成交量配合,买入信号则更为可靠。 + #   2、当CCI指标从上向下突破﹣100线而进入另一个非常态区间时,表明股价的盘整阶段已经结束, + # 将进入一个比较长的寻底过程,投资者应以持币观望为主。 + # CCI, default to 14 days + stock_column = ['cci', 'cci_20', 'code', 'date'] # cci cci_20 code date + data_new = concat_guess_data(stock_column, data_new) + + # 9), TR、ATR指标 + # http://wiki.mbalib.com/wiki/%E5%9D%87%E5%B9%85%E6%8C%87%E6%A0%87 + # 均幅指标(Average True Ranger,ATR) + # 均幅指标(ATR)是取一定时间周期内的股价波动幅度的移动平均值,主要用于研判买卖时机。 + stock_column = ['cci', 'cci_20', 'code', 'date'] # cci cci_20 code date + data_new = concat_guess_data(stock_column, data_new) + + # 10), DMA指标 + # http://wiki.mbalib.com/wiki/DMA + #  DMA指标(Different of Moving Average)又叫平行线差指标,是目前股市分析技术指标中的一种中短期指标,它常用于大盘指数和个股的研判。 + # DMA, difference of 10 and 50 moving average + # stock[‘dma’] + stock_column = ['code', 'date', 'dma'] # code date dma + data_new = concat_guess_data(stock_column, data_new) + + # 11), DMI,+DI,-DI,DX,ADX,ADXR指标 + # http://wiki.mbalib.com/wiki/DMI + # 动向指数Directional Movement Index,DMI) + # http://wiki.mbalib.com/wiki/ADX + # 平均趋向指标(Average Directional Indicator,简称ADX) + # http://wiki.mbalib.com/wiki/%E5%B9%B3%E5%9D%87%E6%96%B9%E5%90%91%E6%8C%87%E6%95%B0%E8%AF%84%E4%BC%B0 + # 平均方向指数评估(ADXR)实际是今日ADX与前面某一日的ADX的平均值。ADXR在高位与ADX同步下滑,可以增加对ADX已经调头的尽早确认。 + # ADXR是ADX的附属产品,只能发出一种辅助和肯定的讯号,并非入市的指标,而只需同时配合动向指标(DMI)的趋势才可作出买卖策略。 + # 在应用时,应以ADX为主,ADXR为辅。 + stock_column = ['adx', 'adxr', 'code', 'date', 'dx', 'mdi', + 'pdi'] # adx adxr code date dx mdi pdi + data_new = concat_guess_data(stock_column, data_new) + + # 12), TRIX,MATRIX指标 + # http://wiki.mbalib.com/wiki/TRIX + # TRIX指标又叫三重指数平滑移动平均指标(Triple Exponentially Smoothed Average) + stock_column = ['code', 'date', 'trix', 'trix_9_sma'] # code date trix trix_9_sma + data_new = concat_guess_data(stock_column, data_new) + + # 13), VR,MAVR指标 + # http://wiki.mbalib.com/wiki/%E6%88%90%E4%BA%A4%E9%87%8F%E6%AF%94%E7%8E%87 + # 成交量比率(Volumn Ratio,VR)(简称VR),是一项通过分析股价上升日成交额(或成交量,下同)与股价下降日成交额比值, + # 从而掌握市场买卖气势的中期技术指标。 + stock_column = ['code', 'date', 'vr', 'vr_6_sma'] # code date vr vr_6_sma + data_new = concat_guess_data(stock_column, data_new) + + data_new = data_new.round(2) # 数据保留2位小数 + + # 删除老数据。 + del_sql = " DELETE FROM `stock_data`.`guess_indicators_daily` WHERE `date`= %s " % datetime_int + common.insert(del_sql) + + # print(data_new.head()) + # data_new["down_rate"] = (data_new["trade"] - data_new["wave_mean"]) / data_new["wave_base"] + common.insert_db(data_new, "guess_indicators_daily", False, "`date`,`code`") + + # 进行左连接. + # tmp = pd.merge(tmp, tmp2, on=['company_id'], how='left') diff --git a/backend/jobs/quarter_job.py b/backend/jobs/quarter_job.py new file mode 100644 index 0000000..2d5fbc8 --- /dev/null +++ b/backend/jobs/quarter_job.py @@ -0,0 +1,89 @@ +#!/usr/local/bin/python3 +# -*- coding: utf-8 -*- + + +import libs.common as common +import sys +import time +import pandas as pd +import tushare as ts +from sqlalchemy.types import NVARCHAR +from sqlalchemy import inspect +import datetime + + +# 增加一个新quarter列,用来存储季度信息。 +def concat_quarter(year, quarter, data_array): + print(len(data_array)) + quarter_str = str(year) + str("%02d" % quarter) # 格式化季度数据。2位。 + # 增加到列。 + quarter_col = pd.DataFrame([quarter_str for _ in range(len(data_array))], columns=["quarter"]) + return pd.concat([quarter_col, data_array], axis=1) + + +#############################基本面数据 http://tushare.org/fundamental.html +def stat_all(tmp_datetime): + # 返回 31 天前的数据,做上个季度数据统计。 + tmp_datetime_1month = tmp_datetime + datetime.timedelta(days=-31) + year = int((tmp_datetime_1month).strftime("%Y")) + quarter = int(pd.Timestamp(tmp_datetime_1month).quarter) # 获得上个季度的数据。 + print("############ year %d, quarter %d", year, quarter) + # 业绩报告(主表) + data = ts.get_report_data(year, quarter) + # 增加季度字段。 + data = concat_quarter(year, quarter, data) + # 处理重复数据,保存最新一条数据。最后一步处理,否则concat有问题。 + data = data.drop_duplicates(subset="code", keep="last") + # 插入数据库。 + common.insert_db(data, "ts_report_data", False, "`quarter`,`code`") + + # 盈利能力 + data = ts.get_profit_data(year, quarter) + # 增加季度字段。 + data = concat_quarter(year, quarter, data) + # 处理重复数据,保存最新一条数据。 + data = data.drop_duplicates(subset="code", keep="last") + # 插入数据库。 + common.insert_db(data, "ts_profit_data", False, "`quarter`,`code`") + + # 营运能力 + data = ts.get_operation_data(year, quarter) + # 增加季度字段。 + data = concat_quarter(year, quarter, data) + # 处理重复数据,保存最新一条数据。最后一步处理,否则concat有问题。 + data = data.drop_duplicates(subset="code", keep="last") + # 插入数据库。 + common.insert_db(data, "ts_operation_data", False, "`quarter`,`code`") + + # 成长能力 + data = ts.get_growth_data(year, quarter) + # 增加季度字段。 + data = concat_quarter(year, quarter, data) + # 处理重复数据,保存最新一条数据。最后一步处理,否则concat有问题。 + data = data.drop_duplicates(subset="code", keep="last") + # 插入数据库。 + common.insert_db(data, "ts_growth_data", False, "`quarter`,`code`") + + # 偿债能力 + data = ts.get_debtpaying_data(year, quarter) + # 增加季度字段。 + data = concat_quarter(year, quarter, data) + # 处理重复数据,保存最新一条数据。最后一步处理,否则concat有问题。 + data = data.drop_duplicates(subset="code", keep="last") + # 插入数据库。 + common.insert_db(data, "ts_debtpaying_data", False, "`quarter`,`code`") + + # 现金流量 + data = ts.get_cashflow_data(year, quarter) + # 增加季度字段。 + data = concat_quarter(year, quarter, data) + # 处理重复数据,保存最新一条数据。最后一步处理,否则concat有问题。 + data = data.drop_duplicates(subset="code", keep="last") + # 插入数据库。 + common.insert_db(data, "ts_cashflow_data", False, "`quarter`,`code`") + + +# main函数入口 +if __name__ == '__main__': + # 使用方法传递。 + tmp_datetime = common.run_with_args(stat_all) diff --git a/backend/jobs/restart_mnist_serving.sh b/backend/jobs/restart_mnist_serving.sh new file mode 100755 index 0000000..87ba9a8 --- /dev/null +++ b/backend/jobs/restart_mnist_serving.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +ps -ef | grep 'tensorflow_model_server' | grep -v grep | awk '{print$2}' | xargs kill -9 +echo "" > /data/logs/mnist_serving.log +nohup tensorflow_model_server --model_name=mnist --model_base_path=/data/mnist_model >> /data/logs/mnist_serving.log & \ No newline at end of file diff --git a/backend/jobs/restart_web.sh b/backend/jobs/restart_web.sh new file mode 100755 index 0000000..bba7115 --- /dev/null +++ b/backend/jobs/restart_web.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +ps -ef | grep python3 | grep '/data/stock/web/main.py' | awk '{print$2}' | xargs kill -9 +echo "restart web ... " > /data/logs/tornado.log diff --git a/backend/jobs/run_cron.sh b/backend/jobs/run_cron.sh new file mode 100755 index 0000000..534f4ec --- /dev/null +++ b/backend/jobs/run_cron.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +export PYTHONIOENCODING=utf-8 +export LANG=zh_CN.UTF-8 +export PYTHONPATH=/data/stock +export LC_CTYPE=zh_CN.UTF-8 + +mkdir -p /data/logs/tensorflow + + + +DATE=`date +%Y-%m-%d:%H:%M:%S` + +echo $DATE >> /data/logs/run_cron.log + +# 解决定时任务不启动问题,因为权限导致 +chmod 755 /etc/cron.minutely/* && chmod 755 /etc/cron.hourly/* +chmod 755 /etc/cron.daily/* && chmod 755 /etc/cron.monthly/* + +# 配置文件每次都设置权限 +chmod 600 /var/spool/cron/crontabs/root +chown root:root /var/spool/cron/crontabs/root + +#启动cron服务。在前台 +/usr/sbin/cron -f \ No newline at end of file diff --git a/backend/jobs/run_init.sh b/backend/jobs/run_init.sh new file mode 100755 index 0000000..8dd5560 --- /dev/null +++ b/backend/jobs/run_init.sh @@ -0,0 +1,29 @@ +#!/bin/sh + +export PYTHONIOENCODING=utf-8 +export LANG=zh_CN.UTF-8 +export PYTHONPATH=/data/stock +export LC_CTYPE=zh_CN.UTF-8 + +mkdir -p /data/logs/tensorflow + + + +DATE=`date +%Y-%m-%d:%H:%M:%S` + +echo $DATE >> /data/logs/run_init.log + +echo "wait 120 second , mysqldb is starting ." >> /data/logs/run_init.log +sleep 120 + +/usr/local/bin/python3 /data/stock/jobs/basic_job.py >> /data/logs/run_init.log + +# https://stackoverflow.com/questions/27771781/how-can-i-access-docker-set-environment-variables-from-a-cron-job +# 解决环境变量输出问题。 +printenv | grep -v "no_proxy" >> /etc/environment + +# 第一次后台执行日数据。 +nohup bash /data/stock/jobs/cron.daily/run_daily & + +#防止 supervisor 重复执行 +sleep 999999d \ No newline at end of file diff --git a/backend/jobs/run_jupyter.sh b/backend/jobs/run_jupyter.sh new file mode 100755 index 0000000..b06bf6e --- /dev/null +++ b/backend/jobs/run_jupyter.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +mkdir -p /data/notebooks + +/usr/local/bin/jupyter notebook --NotebookApp.notebook_dir='/data/notebooks' --ip=0.0.0.0 \ + --allow-root >> /data/logs/jupyter-notebook.log diff --git a/backend/jobs/run_web.sh b/backend/jobs/run_web.sh new file mode 100755 index 0000000..7fcef82 --- /dev/null +++ b/backend/jobs/run_web.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +export PYTHONIOENCODING=utf-8 +export LANG=zh_CN.UTF-8 +export PYTHONPATH=/data/stock +export LC_CTYPE=zh_CN.UTF-8 + +echo "" > /data/logs/web.log +/usr/local/bin/python3 /data/stock/web/main.py -log_file_prefix=/data/logs/web.log \ No newline at end of file diff --git a/backend/jobs/start_mariadb.sh b/backend/jobs/start_mariadb.sh new file mode 100755 index 0000000..6c7d2a9 --- /dev/null +++ b/backend/jobs/start_mariadb.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +DATE=`date +%Y-%m-%d:%H:%M:%S` +echo $DATE + +if [ ! -d "/data/mariadb" ]; then + mkdir -p /data/mariadb + /usr/bin/mysql_install_db +fi + + +/usr/bin/mysqld_safe >> /data/logs/start_mariadb.log \ No newline at end of file diff --git a/backend/jobs/test_akshare/test_stock_zh_a_daily.py b/backend/jobs/test_akshare/test_stock_zh_a_daily.py new file mode 100644 index 0000000..112660a --- /dev/null +++ b/backend/jobs/test_akshare/test_stock_zh_a_daily.py @@ -0,0 +1,27 @@ +#!/usr/local/bin/python3 +# -*- coding: utf-8 -*- + +import akshare as ak +import libs.common as common + +print(ak.__version__) + +# 历史行情数据 +# 日频率 +# 接口: stock_zh_a_daily +# 目标地址: https://finance.sina.com.cn/realstock/company/sh600006/nc.shtml(示例) +# 描述: A 股数据是从新浪财经获取的数据, 历史数据按日频率更新; 注意其中的 sh689009 为 CDR, 请 通过 stock_zh_a_cdr_daily 接口获取 +# 限量: 单次返回指定 A 股上市公司指定日期间的历史行情日频率数据 +# adjust=""; 默认为空: 返回不复权的数据; qfq: 返回前复权后的数据; hfq: 返回后复权后的数据; + +stock_zh_a_daily_qfq_df = ak.stock_zh_a_daily(symbol="sz000002", adjust="") +print(stock_zh_a_daily_qfq_df) + +stock_zh_a_daily_qfq_df = ak.stock_zh_a_daily(symbol="sz000002", start_date="20200101", end_date="20210101", adjust="") +print(stock_zh_a_daily_qfq_df) + +# 插入到 MySQL 数据库中 +common.insert_db(stock_zh_a_daily_qfq_df, "stock_zh_a_daily", True, "`symbol`") + + + diff --git a/backend/jobs/test_akshare/test_stock_zh_a_spot.py b/backend/jobs/test_akshare/test_stock_zh_a_spot.py new file mode 100644 index 0000000..0256967 --- /dev/null +++ b/backend/jobs/test_akshare/test_stock_zh_a_spot.py @@ -0,0 +1,19 @@ +#!/usr/local/bin/python3 +# -*- coding: utf-8 -*- + +import akshare as ak +import libs.common as common + +print(ak.__version__) + +# 实时行情数据 +# 接口: stock_zh_a_spot +# 目标地址: http://vip.stock.finance.sina.com.cn/mkt/#hs_a +# 描述: A 股数据是从新浪财经获取的数据, 重复运行本函数会被新浪暂时封 IP, 建议增加时间间隔 +# 限量: 单次返回所有 A 股上市公司的实时行情数据 + +stock_zh_a_spot_df = ak.stock_zh_a_spot() +print(stock_zh_a_spot_df) + +# 插入到 MySQL 数据库中 +common.insert_db(stock_zh_a_spot_df, "stock_zh_a_spot", True, "`symbol`") diff --git a/backend/jobs/test_akshare/test_stock_zh_index_spot.py b/backend/jobs/test_akshare/test_stock_zh_index_spot.py new file mode 100644 index 0000000..5ae1ba6 --- /dev/null +++ b/backend/jobs/test_akshare/test_stock_zh_index_spot.py @@ -0,0 +1,20 @@ +#!/usr/local/bin/python3 +# -*- coding: utf-8 -*- + +import akshare as ak +import libs.common as common + +print(ak.__version__) + +#stock_sse_summary_df = ak.stock_sse_summary() +#print(stock_sse_summary_df) + +# 接口: stock_zh_index_spot +# 目标地址: http://vip.stock.finance.sina.com.cn/mkt/#hs_s +# 描述: 中国股票指数数据, 注意该股票指数指新浪提供的国内股票指数 +# 限量: 单次返回所有指数的实时行情数据 +stock_zh_index_spot_df = ak.stock_zh_index_spot() +print(stock_zh_index_spot_df) + +# 插入到 MySQL 数据库中 +common.insert_db(stock_zh_index_spot_df, "stock_zh_index_spot_df", True, "`symbol`") diff --git a/backend/libs/common.py b/backend/libs/common.py new file mode 100644 index 0000000..3f27689 --- /dev/null +++ b/backend/libs/common.py @@ -0,0 +1,242 @@ +#!/usr/local/bin/python +# -*- coding: utf-8 -*- + +# apk add py-mysqldb or + +import platform +import datetime +import time +import sys +import os +import MySQLdb +from sqlalchemy import create_engine +from sqlalchemy.types import NVARCHAR +from sqlalchemy import inspect +import pandas as pd +import traceback +import akshare as ak + +# 使用环境变量获得数据库。兼容开发模式可docker模式。 +MYSQL_HOST = os.environ.get('MYSQL_HOST') if (os.environ.get('MYSQL_HOST') != None) else "mysqldb" +MYSQL_USER = os.environ.get('MYSQL_USER') if (os.environ.get('MYSQL_USER') != None) else "root" +MYSQL_PWD = os.environ.get('MYSQL_PWD') if (os.environ.get('MYSQL_PWD') != None) else "mysqldb" +MYSQL_DB = os.environ.get('MYSQL_DB') if (os.environ.get('MYSQL_DB') != None) else "stock_data" +MYSQL_PORT = os.environ.get('MYSQL_PORT') if (os.environ.get('MYSQL_PORT') != None) else "3306" + +print("MYSQL_HOST :", MYSQL_HOST, ",MYSQL_USER :", MYSQL_USER, ",MYSQL_DB :", MYSQL_DB) +MYSQL_CONN_URL = "mysql+mysqldb://" + MYSQL_USER + ":" + MYSQL_PWD + "@" + MYSQL_HOST + ":" + MYSQL_PORT + "/" + MYSQL_DB + "?charset=utf8mb4" +print("MYSQL_CONN_URL :", MYSQL_CONN_URL) + +__version__ = "2.0.0" +# 每次发布时候更新。 + +# https://docs.sqlalchemy.org/en/20/errors.html#error-e3q8 +# +def engine(): + engine = create_engine(MYSQL_CONN_URL, pool_size=10, max_overflow=20) + #encoding='utf8', convert_unicode=True) + return engine + +def engine_to_db(to_db): + MYSQL_CONN_URL_NEW = "mysql+mysqldb://" + MYSQL_USER + ":" + MYSQL_PWD + "@" + MYSQL_HOST + ":" + MYSQL_PORT + "/" + to_db + "?charset=utf8mb4" + engine = create_engine(MYSQL_CONN_URL_NEW, pool_size=10, max_overflow=20) + #encoding='utf8', convert_unicode=True) + return engine + +# 通过数据库链接 engine。 +def conn(): + try: + db = MySQLdb.connect(MYSQL_HOST, MYSQL_USER, MYSQL_PWD, MYSQL_DB, charset="utf8") + # db.autocommit = True + except Exception as e: + print("conn error :", e) + db.autocommit(on=True) + return db.cursor() + + +# 定义通用方法函数,插入数据库表,并创建数据库主键,保证重跑数据的时候索引唯一。 +def insert_db(data, table_name, write_index, primary_keys): + # 插入默认的数据库。 + insert_other_db(MYSQL_DB, data, table_name, write_index, primary_keys) + + +# 增加一个插入到其他数据库的方法。 +def insert_other_db(to_db, data, table_name, write_index, primary_keys): + # 定义engine + engine_mysql = engine_to_db(to_db) + # 使用 http://docs.sqlalchemy.org/en/latest/core/reflection.html + # 使用检查检查数据库表是否有主键。 + insp = inspect(engine_mysql) + col_name_list = data.columns.tolist() + # 如果有索引,把索引增加到varchar上面。 + if write_index: + # 插入到第一个位置: + col_name_list.insert(0, data.index.name) + print(col_name_list) + data.to_sql(name=table_name, con=engine_mysql, schema=to_db, if_exists='append', + dtype={col_name: NVARCHAR(length=255) for col_name in col_name_list}, index=write_index) + + # print(insp.get_pk_constraint(table_name)) + # print() + # print(type(insp)) + # 判断是否存在主键 + if insp.get_pk_constraint(table_name)['constrained_columns'] == []: + with engine_mysql.connect() as con: + # 执行数据库插入数据。 + try: + con.execute('ALTER TABLE `%s` ADD PRIMARY KEY (%s);' % (table_name, primary_keys)) + except Exception as e: + print("################## ADD PRIMARY KEY ERROR :", e) + + + + +# 插入数据。 +def insert(sql, params=()): + with conn() as db: + print("insert sql:" + sql) + try: + db.execute(sql, params) + except Exception as e: + print("error :", e) + + +# 查询数据 +def select(sql, params=()): + with conn() as db: + print("select sql:" + sql) + try: + db.execute(sql, params) + except Exception as e: + print("error :", e) + result = db.fetchall() + return result + + +# 计算数量 +def select_count(sql, params=()): + with conn() as db: + print("select sql:" + sql) + try: + db.execute(sql, params) + except Exception as e: + print("error :", e) + result = db.fetchall() + # 只有一个数组中的第一个数据 + if len(result) == 1: + return int(result[0][0]) + else: + return 0 + + +# 通用函数。获得日期参数。 +def run_with_args(run_fun): + tmp_datetime_show = datetime.datetime.now() # 修改成默认是当日执行 + datetime.timedelta() + tmp_hour_int = int(tmp_datetime_show.strftime("%H")) + if tmp_hour_int < 12 : + # 判断如果是每天 中午 12 点之前运行,跑昨天的数据。 + tmp_datetime_show = (tmp_datetime_show + datetime.timedelta(days=-1)) + tmp_datetime_str = tmp_datetime_show.strftime("%Y-%m-%d %H:%M:%S.%f") + print("\n######################### hour_int %d " % tmp_hour_int) + str_db = "MYSQL_HOST :" + MYSQL_HOST + ", MYSQL_USER :" + MYSQL_USER + ", MYSQL_DB :" + MYSQL_DB + print("\n######################### " + str_db + " ######################### ") + print("\n######################### begin run %s %s #########################" % (run_fun, tmp_datetime_str)) + start = time.time() + # 要支持数据重跑机制,将日期传入。循环次数 + if len(sys.argv) == 3: + # python xxx.py 2017-07-01 10 + tmp_year, tmp_month, tmp_day = sys.argv[1].split("-") + loop = int(sys.argv[2]) + tmp_datetime = datetime.datetime(int(tmp_year), int(tmp_month), int(tmp_day)) + for i in range(0, loop): + # 循环插入多次数据,重复跑历史数据使用。 + # time.sleep(5) + tmp_datetime_new = tmp_datetime + datetime.timedelta(days=i) + try: + run_fun(tmp_datetime_new) + except Exception as e: + print("error :", e) + traceback.print_exc() + elif len(sys.argv) == 2: + # python xxx.py 2017-07-01 + tmp_year, tmp_month, tmp_day = sys.argv[1].split("-") + tmp_datetime = datetime.datetime(int(tmp_year), int(tmp_month), int(tmp_day)) + try: + run_fun(tmp_datetime) + except Exception as e: + print("error :", e) + traceback.print_exc() + else: + # tmp_datetime = datetime.datetime.now() + datetime.timedelta(days=-1) + try: + run_fun(tmp_datetime_show) # 使用当前时间 + except Exception as e: + print("error :", e) + traceback.print_exc() + print("######################### finish %s , use time: %s #########################" % ( + tmp_datetime_str, time.time() - start)) + + +# 设置基础目录,每次加载使用。 +bash_stock_tmp = "/data/cache/hist_data_cache/%s/%s/" +if not os.path.exists(bash_stock_tmp): + os.makedirs(bash_stock_tmp) # 创建多个文件夹结构。 + print("######################### init tmp dir #########################") + + +# 增加读取股票缓存方法。加快处理速度。 +def get_hist_data_cache(code, date_start, date_end): + cache_dir = bash_stock_tmp % (date_end[0:7], date_end) + # 如果没有文件夹创建一个。月文件夹和日文件夹。方便删除。 + # print("cache_dir:", cache_dir) + if not os.path.exists(cache_dir): + os.makedirs(cache_dir) + cache_file = cache_dir + "%s^%s.gzip.pickle" % (date_end, code) + # 如果缓存存在就直接返回缓存数据。压缩方式。 + if os.path.isfile(cache_file): + print("######### read from cache #########", cache_file) + return pd.read_pickle(cache_file, compression="gzip") + else: + # https://akshare.akfamily.xyz/data/index/index.html#id4 + # 获取历史行情,em + #stock = ak.stock_zh_a_hist(symbol= code, start_date=date_start, + # end_date=date_end, adjust="") + code = gp_type_szsh(code)+ code + print("######### get data, write cache #########", code, date_start, date_end) + + stock = ak.stock_zh_index_daily_em(symbol= code, + start_date=date_start.replace("-", ""), end_date=date_end.replace("-", "")) + print(stock) + if stock is None or stock.empty: + return None + + stock.columns = ['date', 'open', 'close', 'high', 'low', 'volume', 'amount'] + # 数据返回的是带 0 列是索引,第一列是 date 日期 + # date open close high low volume amount + # 0 2024-09-20 9.81 9.90 9.90 9.78 797297 7.851212e+08 + + stock.set_index('date', inplace=True) + #stock = stock.sort_index(0) # 将数据按照日期排序下。 + print(stock) + stock.to_pickle(cache_file, compression="gzip") + return stock + + +# 沪市股票包含上证主板和科创板和B股:沪市主板股票代码是60开头、科创板股票代码是688开头、B股代码900开头。 +# 深市股票包含主板、中小板、创业板和B股:深市主板股票代码是000开头、中小板股票代码002开头、创业板300开头、B股代码200开头 +# print(gp_type_szsh('002340')) +# +def gp_type_szsh(gp): + if gp.find('60',0,3)==0: + gp_type='sh' + elif gp.find('688',0,4)==0: + gp_type='sh' + elif gp.find('900',0,4)==0: + gp_type='sh' + elif gp.find('00',0,3)==0: + gp_type='sz' + elif gp.find('300',0,4)==0: + gp_type='sz' + elif gp.find('200',0,4)==0: + gp_type='sz' + return gp_type diff --git a/backend/libs/stock_web_dic.py b/backend/libs/stock_web_dic.py new file mode 100644 index 0000000..3179c62 --- /dev/null +++ b/backend/libs/stock_web_dic.py @@ -0,0 +1,196 @@ +#!/usr/local/bin/python +# -*- coding: utf-8 -*- + +class StockWebData: + def __init__(self, mode, type, name, table_name, columns, column_names, primary_key, order_by): + self.mode = mode # 模式,query,editor 查询和编辑模式 + self.type = type + self.name = name + self.table_name = table_name + self.columns = columns + self.column_names = column_names + self.primary_key = primary_key + self.order_by = order_by + if mode == "query": + self.url = "/stock/data?table_name=" + self.table_name + elif mode == "editor": + self.url = "/data/editor?table_name=" + self.table_name + + +STOCK_WEB_DATA_LIST = [] + + +# https://www.akshare.xyz/zh_CN/latest/data/stock/stock.html#id1 +# 限量: 单次返回所有 A 股上市公司的实时行情数据 +STOCK_WEB_DATA_LIST.append( + StockWebData( + mode="query", + type="1,股票基本数据", + name="每日股票数据-东财", + table_name="stock_zh_a_spot_em", + columns= ['date', 'code', 'name', 'last_price', 'change_percent', 'change_amount', + 'volume', 'turnover', 'amplitude', 'high', 'low', 'open', 'closed', 'volume_ratio', + 'turnover_rate', 'pe_ratio','pb_ratio', 'market_cap','circulating_market_cap','rise_speed', + 'change_5min', 'change_ercent_60day','ytd_change_percent'] , + column_names=['日期','代码','名称','最新价','涨跌幅','涨跌额','成交量','成交额', + '振幅','最高','最低','今开','昨收','量比','换手率','动态市盈率', + '市净率', '总市值', '流通市值', '涨速', '5分钟涨跌', '60日涨跌幅', '年初至今涨跌幅'], + primary_key=[], + order_by=" code asc " + ) +) + +STOCK_WEB_DATA_LIST.append( + StockWebData( + mode="query", + type="1,股票基本数据", + name="龙虎榜-个股上榜-新浪", + table_name="stock_lhb_ggtj_sina", + columns= ['date','code','name','ranking_times','sum_buy','sum_sell','net_amount','buy_seat','sell_seat'], + column_names=['日期','代码', '名称', '上榜次数', '累积购买额', '累积卖出额', '净额', '买入席位数', '卖出席位数'], + primary_key=[], + order_by=" code asc " + ) +) + +STOCK_WEB_DATA_LIST.append( + StockWebData( + mode="query", + type="1,股票基本数据", + name="数据中心-大宗交易", + table_name="stock_dzjy_mrtj", + columns= ['date', 'code', 'name', 'quote_change', 'close_price', 'average_price', + 'overflow_rate', 'trade_number', 'sum_volume', 'sum_turnover', + 'turnover_market_rate'], + column_names=['日期', '代码', '名称', '涨跌幅', '收盘价', '成交均价', + '折溢率', '成交笔数', '成交总量', '成交总额', + '成交总额/流通市值'], + primary_key=[], + order_by=" code asc " + ) +) + + + +# 每日股票指标lite猜想买入。 +STOCK_WEB_DATA_LIST.append( + StockWebData( + mode="query", + type="2,每日数据猜想", + name="股票指标lite猜想买入", + table_name="guess_indicators_lite_buy_daily", + # columns=['date', 'code', 'name', 'latest_price', 'quote_change', 'ups_downs', 'volume', 'turnover', + # 'amplitude', 'high', 'low', 'open', 'closed', 'volume_ratio', 'turnover_rate', 'pe_dynamic', 'pb', + # 'kdjj', 'rsi_6', 'cci'], + # column_names=['日期', '代码', '名称', '最新价', '涨跌幅', '涨跌额', '成交量', '成交额', + # '振幅', '最高', '最低', '今开', '昨收', '量比', '换手率', '动态市盈率', '市净率', + # 'kdjj', 'rsi_6', 'cci'], + columns= ['date', 'code', 'name', 'last_price', 'change_percent', 'change_amount', + 'volume', 'turnover', 'amplitude', 'high', 'low', 'open', 'closed', 'volume_ratio', + 'turnover_rate', 'pe_ratio','pb_ratio', 'market_cap','circulating_market_cap','rise_speed', + 'change_5min', 'change_ercent_60day','ytd_change_percent', + 'boll', 'boll_lb', 'boll_ub', 'kdjd', 'kdjj', 'kdjk', 'macd', 'macdh', + 'macds', 'pdi','trix', 'trix_9_sma', 'vr', 'vr_6_sma', 'wr_10', 'wr_6'] , + # 中文说明前面和 1 数据一致。 + column_names=['日期','代码','名称','最新价','涨跌幅','涨跌额','成交量','成交额', + '振幅','最高','最低','今开','昨收','量比','换手率','动态市盈率', + '市净率', '总市值', '流通市值', '涨速', '5分钟涨跌', '60日涨跌幅', + '年初至今涨跌幅', + 'boll', 'boll_lb', 'boll_ub', + 'kdjd', 'kdjj', 'kdjk', 'macd', 'macdh', 'macds', 'pdi', + 'trix', 'trix_9_sma', 'vr', 'vr_6_sma', 'wr_10', 'wr_6'], + primary_key=[], + order_by=" buy_date desc " + ) +) + +# 每日股票指标lite猜想卖出。 +STOCK_WEB_DATA_LIST.append( + StockWebData( + mode="query", + type="2,每日数据猜想", + name="股票指标lite猜想卖出", + table_name="guess_indicators_lite_sell_daily", + # columns=['date', 'code', 'name', 'latest_price', 'quote_change', 'ups_downs', 'volume', 'turnover', + # 'amplitude', 'high', 'low', 'open', 'closed', 'volume_ratio', 'turnover_rate', 'pe_dynamic', 'pb', + # 'kdjj', 'rsi_6', 'cci'], + # column_names=['日期', '代码', '名称', '最新价', '涨跌幅', '涨跌额', '成交量', '成交额', + # '振幅', '最高', '最低', '今开', '昨收', '量比', '换手率', '动态市盈率', '市净率', + # 'kdjj', 'rsi_6', 'cci'], + columns= ['date', 'code', 'name', 'last_price', 'change_percent', 'change_amount', + 'volume', 'turnover', 'amplitude', 'high', 'low', 'open', 'closed', 'volume_ratio', + 'turnover_rate', 'pe_ratio','pb_ratio', 'market_cap','circulating_market_cap','rise_speed', + 'change_5min', 'change_ercent_60day','ytd_change_percent', + 'boll', 'boll_lb', 'boll_ub', 'kdjd', 'kdjj', 'kdjk', 'macd', 'macdh', + 'macds', 'pdi','trix', 'trix_9_sma', 'vr', 'vr_6_sma', 'wr_10', 'wr_6'] , + # 中文说明前面和 1 数据一致。 + column_names=['日期','代码','名称','最新价','涨跌幅','涨跌额','成交量','成交额', + '振幅','最高','最低','今开','昨收','量比','换手率','动态市盈率', + '市净率', '总市值', '流通市值', '涨速', '5分钟涨跌', '60日涨跌幅', + '年初至今涨跌幅', + 'boll', 'boll_lb', 'boll_ub', + 'kdjd', 'kdjj', 'kdjk', 'macd', 'macdh', 'macds', 'pdi', + 'trix', 'trix_9_sma', 'vr', 'vr_6_sma', 'wr_10', 'wr_6'], + primary_key=[], + order_by=" buy_date desc " + ) +) + +# 每日股票指标lite猜想。 +STOCK_WEB_DATA_LIST.append( + StockWebData( + mode="query", + type="2,每日数据猜想", + name="股票指标猜想原始数据", + table_name="guess_indicators_daily", + + columns= ['date', 'code', 'name', 'last_price', 'change_percent', 'change_amount', + 'volume', 'turnover', 'amplitude', 'high', 'low', 'open', 'closed', 'volume_ratio', + 'turnover_rate', 'pe_ratio','pb_ratio', 'market_cap','circulating_market_cap','rise_speed', + 'change_5min', 'change_ercent_60day','ytd_change_percent', + 'boll', 'boll_lb', 'boll_ub', 'kdjd', 'kdjj', 'kdjk', 'macd', 'macdh', + 'macds', 'pdi','trix', 'trix_9_sma', 'vr', 'vr_6_sma', 'wr_10', 'wr_6'] , + # 中文说明前面和 1 数据一致。 + column_names=['日期','代码','名称','最新价','涨跌幅','涨跌额','成交量','成交额', + '振幅','最高','最低','今开','昨收','量比','换手率','动态市盈率', + '市净率', '总市值', '流通市值', '涨速', '5分钟涨跌', '60日涨跌幅', + '年初至今涨跌幅', + 'boll', 'boll_lb', 'boll_ub', + 'kdjd', 'kdjj', 'kdjk', 'macd', 'macdh', 'macds', 'pdi', + 'trix', 'trix_9_sma', 'vr', 'vr_6_sma', 'wr_10', 'wr_6'], + + # columns=['date','code','name','latest_price','quote_change','ups_downs', + # 'adx', 'adxr', 'boll', 'boll_lb', 'boll_ub', 'cci', 'cci_20', 'close_-1_r', + # 'close_-2_r', 'code', 'cr', 'cr-ma1', 'cr-ma2', 'cr-ma3', 'date', 'dma', 'dx', + # 'kdjd', 'kdjj', 'kdjk', 'macd', 'macdh', 'macds', 'mdi', 'pdi', + # 'rsi_12', 'rsi_6', 'trix', 'trix_9_sma', 'vr', 'vr_6_sma', 'wr_10', 'wr_6'], + # column_names=['日期','代码','名称','最新价','涨跌幅','涨跌额', + # 'adx', 'adxr', 'boll', 'boll_lb', 'boll_ub', 'cci', 'cci_20', 'close_-1_r', + # 'close_-2_r', 'code', 'cr', 'cr-ma1', 'cr-ma2', 'cr-ma3', 'date', 'dma', 'dx', + # 'kdjd', 'kdjj', 'kdjk', 'macd', 'macdh', 'macds', 'mdi', 'pdi', + # 'rsi_12', 'rsi_6', 'trix', 'trix_9_sma', 'vr', 'vr_6_sma', 'wr_10', 'wr_6'], + + primary_key=[], + order_by=' date desc ' + ) +) + +# "code", "name: pchange", "amount", "buy", "bratio", "sell", "sratio", "reason", "date" +# 代码 名称 当日涨跌幅 龙虎榜成交额(万) 买入额(万) 买入占总成交比例 卖出额(万) 卖出占总成交比例 上榜原因 日期 + + +STOCK_WEB_DATA_MAP = {} +WEB_EASTMONEY_URL = "http://quote.eastmoney.com/%s.html" +# 再拼接成Map使用。 +for tmp in STOCK_WEB_DATA_LIST: + # try: + # # 增加columns 字段中的【查看股票】 + # tmp_idx = tmp.columns.index("code") + # tmp.column_names.insert(tmp_idx + 1, "查看股票") + # except Exception as e: + # print("error :", e) + + STOCK_WEB_DATA_MAP[tmp.table_name] = tmp + + if len(tmp.columns) != len(tmp.column_names): + print(u"error:", tmp.table_name, ",columns:", len(tmp.columns), ",column_names:", len(tmp.column_names)) diff --git a/backend/libs/stock_web_dic.py.bk b/backend/libs/stock_web_dic.py.bk new file mode 100644 index 0000000..2290a24 --- /dev/null +++ b/backend/libs/stock_web_dic.py.bk @@ -0,0 +1,358 @@ +#!/usr/local/bin/python +# -*- coding: utf-8 -*- + +class StockWebData: + def __init__(self, mode, type, name, table_name, columns, column_names, primary_key, order_by): + self.mode = mode # 模式,query,editor 查询和编辑模式 + self.type = type + self.name = name + self.table_name = table_name + self.columns = columns + self.column_names = column_names + self.primary_key = primary_key + self.order_by = order_by + if mode == "query": + self.url = "/stock/data?table_name=" + self.table_name + elif mode == "editor": + self.url = "/data/editor?table_name=" + self.table_name + + +STOCK_WEB_DATA_LIST = [] + +STOCK_WEB_DATA_LIST.append( + StockWebData( + mode="query", + type="宏观经济数据", + name="存款利率", + table_name="ts_deposit_rate", + columns=["date", "deposit_type", "rate"], + column_names=["日期", "存款类型", "存款利率"], + primary_key=[], + order_by=" date desc " + ) +) + +STOCK_WEB_DATA_LIST.append( + StockWebData( + mode="query", + type="宏观经济数据", + name="贷款利率", + table_name="ts_loan_rate", + columns=["date", "loan_type", "rate"], + column_names=["日期", "贷款类型", "存款利率"], + primary_key=[], + order_by=" date desc " + ) +) + +STOCK_WEB_DATA_LIST.append( + StockWebData( + mode="query", + type="宏观经济数据", + name="存款准备金率", + table_name="ts_rrr", + columns=["date", "before", "now", "changed"], + column_names=["变动日期", "调整前存款准备金率(%)", "调整后存款准备金率(%)", "调整幅度(%)"], + primary_key=[], + order_by=" date desc " + ) +) + +STOCK_WEB_DATA_LIST.append( + StockWebData( + mode="query", + type="宏观经济数据", + name="货币供应量", + table_name="ts_money_supply", + columns=["month", "m2", "m2_yoy", "m1", "m1_yoy", "m0", "m0_yoy", "cd", "cd_yoy", "qm", "qm_yoy", "ftd", + "ftd_yoy", "sd", "sd_yoy", "rests", "rests_yoy"], + column_names=["统计时间", "货币和准货币(广义货币M2)(亿元)", "货币和准货币(广义货币M2)同比增长(%)", + "货币(狭义货币M1)(亿元)", "货币(狭义货币M1)同比增长(%)", + "流通中现金(M0)(亿元)", "流通中现金(M0)同比增长(%)", + "活期存款(亿元)", "活期存款同比增长(%)", + "准货币(亿元)", "准货币同比增长(%)", + "定期存款(亿元)", "定期存款同比增长(%)", + "储蓄存款(亿元)", "储蓄存款同比增长(%)", + "其他存款(亿元)", "其他存款同比增长(%)" + ], + primary_key=[], + order_by=" month desc " + ) +) + +# http://tushare.org/fundamental.html +# 参考官网网站的文档,是最全的。 +STOCK_WEB_DATA_LIST.append( + StockWebData( + mode="query", + type="基本面数据", + name="股票列表", + table_name="ts_stock_basics", + columns=["code", "name", "industry", "area", "pe", "outstanding", "totals", "totalAssets", "liquidAssets", + "fixedAssets", "reserved", "reservedPerShare", "esp", "bvps", "pb", "timeToMarket", + "undp", "perundp", "rev", "profit", "gpr", "npr", "holders"], + column_names=["代码", "名称", "所属行业", "地区", "市盈率", "流通股本(亿)", "总股本(亿)", "总资产(万)", "流动资产", + "固定资产", "公积金", "每股公积金", "每股收益", "每股净资", "市净率", "上市日期", "未分利润", + "每股未分配", "收入同比(%)", "利润同比(%)", "毛利率(%)", "净利润率(%)", "股东人数" + ], + primary_key=[], + order_by=" code asc " + ) +) + +# 业绩报告(主表) +STOCK_WEB_DATA_LIST.append( + StockWebData( + mode="query", + type="基本面数据", + name="业绩报告(主表)", + table_name="ts_report_data", + columns=["quarter", "code", "name", "eps", "eps_yoy", "bvps", "roe", "epcf", "net_profits", + "profits_yoy", "distrib", "report_date"], + column_names=["季度", "代码", "名称", "每股收益", "每股收益同比(%)", "每股净资产", "净资产收益率(%)", "每股现金流量(元)", ",净利润(万元)", + "净利润同比(%)", "分配方案", "发布日期" + ], + primary_key=[], + order_by=" quarter desc " + ) +) + +# 盈利能力 +STOCK_WEB_DATA_LIST.append( + StockWebData( + mode="query", + type="基本面数据", + name="盈利能力", + table_name="ts_profit_data", + columns=["quarter", "code", "name", "roe", "net_profit_ratio", "gross_profit_rate", + "net_profits", "eps", "business_income", "bips"], + column_names=["季度", "代码", "名称", "净资产收益率(%)", "净利率(%)", "毛利率(%)", "净利润(万元)", + "每股收益", "营业收入(百万元)", "每股主营业务收入(元)"], + primary_key=[], + order_by=" quarter desc " + ) +) + +STOCK_WEB_DATA_LIST.append( + StockWebData( + mode="query", + type="基本面数据", + name="营运能力", + table_name="ts_operation_data", + columns=["quarter", "code", "name", "arturnover", "arturndays", + "inventory_turnover", "inventory_days", "currentasset_turnover", "currentasset_days"], + column_names=["季度", "代码", "名称", "应收账款周转率(次)", "应收账款周转天数(天)", "存货周转率(次)", "存货周转天数(天)", + "流动资产周转率(次)", "流动资产周转天数(天)" + ], + primary_key=[], + order_by=" quarter desc " + ) +) + +STOCK_WEB_DATA_LIST.append( + StockWebData( + mode="query", + type="基本面数据", + name="成长能力", + table_name="ts_growth_data", + columns=["quarter", "code", "name", "mbrg", "nprg", "nav", "targ", "epsg", "seg"], + column_names=["季度", "代码", "名称", "主营业务收入增长率(%)", "净利润增长率(%)", "净资产增长率", "总资产增长率", + "每股收益增长率", "股东权益增长率"], + primary_key=[], + order_by=" quarter desc " + ) +) + +# "code", "name: pchange", "amount", "buy", "bratio", "sell", "sratio", "reason", "date" +# 代码 名称 当日涨跌幅 龙虎榜成交额(万) 买入额(万) 买入占总成交比例 卖出额(万) 卖出占总成交比例 上榜原因 日期 + + +STOCK_WEB_DATA_LIST.append( + StockWebData( + mode="query", + type="每日数据", + name="龙虎榜", + table_name="ts_top_list", + columns=["date", "code", "name", "pchange", "amount", "buy", "bratio", "sell", "sratio", "reason"], + column_names=["日期", "代码", "名称", "当日涨跌幅", "龙虎榜成交额(万)", "买入额(万)", "买入占总成交比例", "卖出额(万)", + "卖出占总成交比例", "上榜原因"], + primary_key=[], + order_by=" date desc " + ) +) +# 实时行情 +STOCK_WEB_DATA_LIST.append( + StockWebData( + mode="query", + type="每日数据", + name="每日股票数据", + table_name="ts_today_all", + columns=["date", "code", "name", "changepercent", "trade", "open", "high", "low", "settlement", "volume", + "turnoverratio", "amount", "per", "pb", "mktcap", "nmc"], + column_names=["日期", "代码", "名称", "涨跌幅", "现价", "开盘价", "最高价", "最低价", "昨日收盘价", "成交量", + "换手率", "成交金额", "市盈率", "市净率", "总市值", "流通市值"], + primary_key=[], + order_by=" date desc " + ) +) +# 大盘指数行情列表 +STOCK_WEB_DATA_LIST.append( + StockWebData( + mode="query", + type="每日数据", + name="每日大盘指数行情", + table_name="ts_index_all", + columns=["date", "code", "name", "change", "open", "preclose", "close", "high", "low", "volume", "amount"], + column_names=["日期", "代码", "名称", "涨跌幅", "开盘点位", "昨日收盘点位", "收盘点位", "最高点位", "最低点位", "成交量(手)", "成交金额(亿元)"], + primary_key=[], + order_by=" date desc " + ) +) + +# 每日波峰波谷猜想 +STOCK_WEB_DATA_LIST.append( + StockWebData( + mode="query", + type="每日数据猜想", + name="每日波峰波谷猜想", + table_name="guess_period_daily", + columns=["date", "code", "name", "wave_base", "wave_crest", "wave_mean", "up_rate", + "changepercent", "trade", "open", "high", "low", "settlement", "volume", + "turnoverratio", "amount", "per", "pb", "mktcap", "nmc"], + column_names=["日期", "代码", "名称", "5波峰平均", "5波谷平均", "价格平均", "上涨率猜想%", + "涨跌幅", "现价", "开盘价", "最高价", "最低价", "昨日收盘价", "成交量", + "换手率", "成交金额", "市盈率", "市净率", "总市值", "流通市值"], + primary_key=[], + order_by=" date desc " + ) +) + +# 每日收益率猜想。 +STOCK_WEB_DATA_LIST.append( + StockWebData( + mode="query", + type="每日数据猜想", + name="每日收益率猜想", + table_name="guess_return_daily", + columns=["date", "code", "name", + "5d", "10d", "20d", "60d", "5-10d", "5-20d", "mov_vol", "return", + "changepercent", "trade", "open", "high", "low", "settlement", "volume", + "turnoverratio", "amount", "per", "pb", "mktcap", "nmc"], + column_names=["日期", "代码", "名称", + "5周线", "10半月线", "20月线", "60季度线", "5-10日差%", "5-20日差%", "收益", "收益率移动标准差", + "涨跌幅", "现价", "开盘价", "最高价", "最低价", "昨日收盘价", "成交量", + "换手率", "成交金额", "市盈率", "市净率", "总市值", "流通市值"], + primary_key=[], + order_by=" date desc " + ) +) + +# 每日股票指标lite猜想。 +STOCK_WEB_DATA_LIST.append( + StockWebData( + mode="query", + type="每日数据猜想", + name="每日股票指标lite猜想", + table_name="guess_indicators_lite_daily", + columns=["date", "code", "name", "changepercent", "trade", "open", "high", "low", "settlement", "volume", + "turnoverratio", "amount", "per", "pb", "mktcap", "nmc", + "kdjj", "rsi_6", "cci"], + column_names=["日期", "代码", "名称", + "涨跌幅", "现价", "开盘价", "最高价", "最低价", "昨日收盘价", "成交量", + "换手率", "成交金额", "市盈率", "市净率", "总市值", "流通市值", + "kdjj", "rsi_6", "cci"], + primary_key=[], + order_by=" date desc " + ) +) + +# 每日股票指标lite猜想买入。 +STOCK_WEB_DATA_LIST.append( + StockWebData( + mode="query", + type="每日数据猜想", + name="每日股票指标lite猜想买入", + table_name="guess_indicators_lite_buy_daily", + columns=["buy_date", "code", "name", "changepercent", "trade", "turnoverratio", "pb", + "kdjj", "rsi_6", "cci", "wave_base", "wave_crest", "wave_mean", "up_rate", "buy", "sell", + "today_trade", "income"], + column_names=["购买日期", "代码", "名称", "涨跌幅", "现价", "换手率%", "市净率%", + "买入kdjj", "买入rsi_6", "买入cci", "波谷", "波峰", "波平均", "上涨率%", "买入", "卖出", "今日价格", "收益"], + primary_key=[], + order_by=" buy_date desc " + ) +) + +# 每日股票指标lite猜想卖出。 +STOCK_WEB_DATA_LIST.append( + StockWebData( + mode="query", + type="每日数据猜想", + name="每日股票指标lite猜想卖出", + table_name="guess_indicators_lite_sell_daily", + columns=["date", "buy_date", "code", "name", "changepercent", "trade", "turnoverratio", "pb", + "kdjj", "rsi_6", "cci", "wave_base", "wave_crest", "wave_mean", "up_rate", "buy", "sell", + "today_trade", "income", "sell_cci", "sell_kdjj", "sell_rsi_6"], + column_names=["日期", "购买日期", "代码", "名称", "涨跌幅", "现价", "换手率%", "市净率%", + "买入kdjj", "买入rsi_6", "买入cci", "波谷", "波峰", "波平均", "上涨率%", "买入", "卖出", "今日价格", "收益", + "卖出kdjj", "卖出rsi_6", "卖出cci", ], + primary_key=[], + order_by=" buy_date desc " + ) +) + +# 每日股票指标猜想。 +STOCK_WEB_DATA_LIST.append( + StockWebData( + mode="query", + type="每日数据猜想", + name="每日股票指标All猜想", + table_name="guess_indicators_daily", + columns=["date", "code", "name", "changepercent", "trade", "open", "high", "low", "settlement", "volume", + "turnoverratio", "amount", "per", "pb", "mktcap", "nmc", + 'adx', 'adxr', 'boll', 'boll_lb', 'boll_ub', 'cci', 'cci_20', 'close_-1_r', + 'close_-2_r', 'code', 'cr', 'cr-ma1', 'cr-ma2', 'cr-ma3', 'date', 'dma', 'dx', + 'kdjd', 'kdjj', 'kdjk', 'macd', 'macdh', 'macds', 'mdi', 'pdi', + 'rsi_12', 'rsi_6', 'trix', 'trix_9_sma', 'vr', 'vr_6_sma', 'wr_10', 'wr_6'], + column_names=["日期", "代码", "名称", + "涨跌幅", "现价", "开盘价", "最高价", "最低价", "昨日收盘价", "成交量", + "换手率", "成交金额", "市盈率", "市净率", "总市值", "流通市值", + 'adx', 'adxr', 'boll', 'boll_lb', 'boll_ub', 'cci', 'cci_20', 'close_-1_r', + 'close_-2_r', 'code', 'cr', 'cr-ma1', 'cr-ma2', 'cr-ma3', 'date', 'dma', 'dx', + 'kdjd', 'kdjj', 'kdjk', 'macd', 'macdh', 'macds', 'mdi', 'pdi', + 'rsi_12', 'rsi_6', 'trix', 'trix_9_sma', 'vr', 'vr_6_sma', 'wr_10', 'wr_6'], + primary_key=[], + order_by=" date desc " + ) +) + +STOCK_WEB_DATA_LIST.append( + StockWebData( + mode="query", + type="每日数据Keras猜想", + name="每日股票数据Keras猜想", + table_name="guess_sklearn_ma_daily", + columns=["date", "code", "name", "changepercent", "trade", "open", "high", "low", "settlement", "volume", + "turnoverratio", "next_close", "sklearn_score", "up_rate"], + column_names=["日期", "代码", "名称", "涨跌幅", "现价", "开盘价", "最高价", "最低价", "昨日收盘价", "成交量", + "换手率", "预测收盘价", "sk概率", "预测上涨率"], + primary_key=[], + order_by=" date desc " + ) +) + +STOCK_WEB_DATA_MAP = {} +WEB_EASTMONEY_URL = "http://quote.eastmoney.com/%s.html" +# 再拼接成Map使用。 +for tmp in STOCK_WEB_DATA_LIST: + try: + # 增加columns 字段中的【东方财富】 + tmp_idx = tmp.columns.index("code") + tmp.column_names.insert(tmp_idx + 1, "东方财富") + except Exception as e: + print("error :", e) + + STOCK_WEB_DATA_MAP[tmp.table_name] = tmp + + if len(tmp.columns) != len(tmp.column_names): + print(u"error:", tmp.table_name, ",columns:", len(tmp.columns), ",column_names:", len(tmp.column_names)) diff --git a/backend/old_jobs/README.md b/backend/old_jobs/README.md new file mode 100644 index 0000000..80bd0c3 --- /dev/null +++ b/backend/old_jobs/README.md @@ -0,0 +1,4 @@ +## 说明 + + +之前测试使用的脚本。执行了一段时间,只是用来进行练习使用的。 diff --git a/backend/old_jobs/guess_indicators_lite_buy_daily_job.py b/backend/old_jobs/guess_indicators_lite_buy_daily_job.py new file mode 100644 index 0000000..17a5121 --- /dev/null +++ b/backend/old_jobs/guess_indicators_lite_buy_daily_job.py @@ -0,0 +1,126 @@ +#!/usr/local/bin/python3 +# -*- coding: utf-8 -*- + + +import libs.common as common +import pandas as pd +import numpy as np +import math +import datetime +import heapq + + +### 对每日指标数据,进行筛选。将符合条件的。二次筛选出来。 +def stat_all_lite(tmp_datetime): + # 要操作的数据库表名称。 + table_name = "guess_indicators_lite_buy_daily" + datetime_str = (tmp_datetime).strftime("%Y-%m-%d") + datetime_int = (tmp_datetime).strftime("%Y%m%d") + print("datetime_str:", datetime_str) + print("datetime_int:", datetime_int) + + # try: + # # 删除老数据。guess_indicators_lite_buy_daily 是一张单表,没有日期字段。 + # del_sql = " DELETE FROM `stock_data`.`%s` WHERE `date`= '%s' " % (table_name, datetime_int) + # print("del_sql:", del_sql) + # common.insert(del_sql) + # print("del_sql") + # except Exception as e: + # print("error :", e) + + sql_1 = """ + SELECT `date`, `code`, `name`, `changepercent`, `trade`,`turnoverratio`, `pb` ,`kdjj`,`rsi_6`,`cci` + FROM stock_data.guess_indicators_lite_daily WHERE `date` = %s + and `changepercent` > 2 and `pb` > 0 + """ + # and `changepercent` > 2 and `pb` > 0 and `turnoverratio` > 5 去除掉换手率参数。 + data = pd.read_sql(sql=sql_1, con=common.engine(), params=[datetime_int]) + data = data.drop_duplicates(subset="code", keep="last") + print("######## len data ########:", len(data)) + # del data["name"] + # print(data) + data["trade_float32"] = data["trade"].astype('float32', copy=True) + # 输入 date 用作历史数据查询。 + stock_merge = pd.DataFrame({ + "date": data["date"], "code": data["code"], "wave_mean": data["trade"], + "wave_crest": data["trade"], "wave_base": data["trade"]}, index=data.index.values) + print(stock_merge.head(1)) + + stock_merge = stock_merge.apply(apply_merge, axis=1) # , axis=1) + del stock_merge["date"] # 合并前删除 date 字段。 + # 合并数据 + data_new = pd.merge(data, stock_merge, on=['code'], how='left') + + # 使用 trade_float32 参加计算。 + data_new = data_new[data_new["trade_float32"] > data_new["wave_base"]] # 交易价格大于波谷价格。 + data_new = data_new[data_new["trade_float32"] < data_new["wave_crest"]] # 小于波峰价格 + + # wave_base wave_crest wave_mean + data_new["wave_base"] = data_new["wave_base"].round(2) # 数据保留2位小数 + data_new["wave_crest"] = data_new["wave_crest"].round(2) # 数据保留2位小数 + data_new["wave_mean"] = data_new["wave_mean"].round(2) # 数据保留2位小数 + + data_new["up_rate"] = (data_new["wave_mean"].sub(data_new["trade_float32"])).div(data_new["wave_crest"]).mul(100) + data_new["up_rate"] = data_new["up_rate"].round(2) # 数据保留2位小数 + + data_new["buy"] = 1 + data_new["sell"] = 0 + data_new["today_trade"] = data_new["trade"] + data_new["income"] = 0 + # 重命名 date + data_new.columns.values[0] = "buy_date" + del data_new["trade_float32"] + + try: + common.insert_db(data_new, table_name, False, "`code`") + print("insert_db") + except Exception as e: + print("error :", e) + # 重命名 + del data_new["name"] + print(data_new) + + +def apply_merge(tmp): + date = tmp["date"] + code = tmp["code"] + date_end = datetime.datetime.strptime(date, "%Y%m%d") + date_start = (date_end + datetime.timedelta(days=-300)).strftime("%Y-%m-%d") + date_end = date_end.strftime("%Y-%m-%d") + print(code, date_start, date_end) + + # open, high, close, low, volume, price_change, p_change, ma5, ma10, ma20, v_ma5, v_ma10, v_ma20, turnover + # 使用缓存方法。加快计算速度。 + stock = common.get_hist_data_cache(code, date_start, date_end) + # 增加空判断,如果是空返回 0 数据。 + if stock is None: + return list([code, date, 0, 0, 0]) + + stock = pd.DataFrame({"close": stock["close"]}, index=stock.index.values) + stock = stock.sort_index(0) # 将数据按照日期排序下。 + + # print(stock.head(10)) + arr = pd.Series(stock["close"].values) + # print(df_arr) + wave_mean = arr.mean() + max_point = 3 # 获得最高的几个采样点。 + # 计算股票的波峰值。 + wave_crest = heapq.nlargest(max_point, enumerate(arr), key=lambda x: x[1]) + wave_crest_mean = pd.DataFrame(wave_crest).mean() + + # 输出元祖第一个元素是index,第二元素是比较的数值 计算数据的波谷值 + wave_base = heapq.nsmallest(max_point, enumerate(arr), key=lambda x: x[1]) + wave_base_mean = pd.DataFrame(wave_base).mean() + # 输出数据 + print("##############", len(stock)) + if len(stock) > 180: + # code date wave_base wave_crest wave_mean 顺序必须一致。返回的是行数据,然后填充。 + return list([code, date, wave_base_mean[1], wave_crest_mean[1], wave_mean]) + else: + return list([code, date, 0, 0, 0]) + + +# main函数入口 +if __name__ == '__main__': + # 二次筛选数据。 + tmp_datetime = common.run_with_args(stat_all_lite) diff --git a/backend/old_jobs/guess_indicators_lite_sell_daily_job.py b/backend/old_jobs/guess_indicators_lite_sell_daily_job.py new file mode 100644 index 0000000..a35572d --- /dev/null +++ b/backend/old_jobs/guess_indicators_lite_sell_daily_job.py @@ -0,0 +1,137 @@ +#!/usr/local/bin/python3 +# -*- coding: utf-8 -*- + + +import libs.common as common +import pandas as pd +import numpy as np +import math +import datetime +import heapq +import stockstats + + +# code date today_trade +def apply_merge(tmp): + date = tmp["date"] + code = tmp["code"] + date_end = datetime.datetime.strptime(date, "%Y%m%d") + date_start = (date_end + datetime.timedelta(days=-300)).strftime("%Y-%m-%d") + date_end = date_end.strftime("%Y-%m-%d") + print(code, date_start, date_end) + + # open, high, close, low, volume, price_change, p_change, ma5, ma10, ma20, v_ma5, v_ma10, v_ma20, turnover + # 使用缓存方法。加快计算速度。 + stock = common.get_hist_data_cache(code, date_start, date_end) + # 增加空判断,如果是空返回 0 数据。 + if stock is None: + return list([code, date, 0.0]) + print("########") + # print(stock.tail(1)) + close = stock.tail(1)["close"].values[0] + print("close: ", close) + print("########") + return list([code, date, close]) + + +# buy code date sell sell_cci sell_kdjj sell_rsi_6 +def apply_merge_sell(tmp): + date = tmp["date"] + code = tmp["code"] + date_end = datetime.datetime.strptime(date, "%Y%m%d") + date_start = (date_end + datetime.timedelta(days=-300)).strftime("%Y-%m-%d") + date_end = date_end.strftime("%Y-%m-%d") + print(code, date_start, date_end) + + # open, high, close, low, volume, price_change, p_change, ma5, ma10, ma20, v_ma5, v_ma10, v_ma20, turnover + # 使用缓存方法。加快计算速度。 + stock = common.get_hist_data_cache(code, date_start, date_end) + # 增加空判断,如果是空返回 0 数据。 + if stock is None: + return list([1, code, date, 0, 0, 0, 0]) + print("########") + # J大于100时为超买,小于10时为超卖。 + # 强弱指标保持高于50表示为强势市场,反之低于50表示为弱势市场。 + # 1、当CCI指标从下向上突破﹢100线而进入非常态区间时,表明股价脱离常态而进入异常波动阶段, + # 2、当CCI指标从上向下突破﹣100线而进入另一个非常态区间时,表明股价的盘整阶段已经结束, + stockStat = stockstats.StockDataFrame.retype(stock) + kdjj = int(stockStat["kdjj"].tail(1).values[0]) + rsi_6 = int(stockStat["rsi_6"].tail(1).values[0]) + cci = int(stockStat["cci"].tail(1).values[0]) + print("kdjj:", kdjj, "rsi_6:", rsi_6, "cci:", cci) + # and kdjj > 80 and rsi_6 > 55 and cci > 100 判断卖出时刻。也就是买入时刻的反面。发现有波动就卖了。 + # if kdjj <= 10 and rsi_6 <= 50 and cci <= 100: old + if kdjj <= 80 or rsi_6 <= 55 or cci <= 100: + return list([0, code, date, 1, cci, kdjj, rsi_6]) + else: + return list([1, code, date, 0, cci, kdjj, rsi_6]) + + +# 增加 收益计算。 +def stat_index_calculate(tmp_datetime): + # 要操作的数据库表名称。 + table_name = "guess_indicators_lite_sell_daily" + datetime_str = (tmp_datetime).strftime("%Y-%m-%d") + datetime_int = (tmp_datetime).strftime("%Y%m%d") + print("datetime_str:", datetime_str) + print("datetime_int:", datetime_int) + + sql_1 = """ + SELECT `buy_date`, `code`, `name`, `changepercent`, `trade`, `turnoverratio`, `pb`, `kdjj`, `rsi_6`, + `cci`, `wave_base`, `wave_crest`, `wave_mean`, `up_rate` + FROM guess_indicators_lite_buy_daily where `buy_date` <= """ + datetime_int + print(sql_1) + data = pd.read_sql(sql=sql_1, con=common.engine(), params=[]) + data = data.drop_duplicates(subset="code", keep="last") + print(data["trade"]) + data["trade_float32"] = data["trade"].astype('float32', copy=False) + print(len(data)) + data["date"] = datetime_int + + stock_merge = pd.DataFrame({ + "date": data["date"], "code": data["code"], "today_trade": data["trade"]}, index=data.index.values) + print(stock_merge.head(1)) + + stock_merge = stock_merge.apply(apply_merge, axis=1) # , axis=1) + + del stock_merge["date"] # 合并前删除 date 字段。 + # 合并数据 + data_new = pd.merge(data, stock_merge, on=['code'], how='left') + data_new["income"] = (data_new["today_trade"] - data_new["trade_float32"]) * 100 + data_new["income"] = data_new["income"].round(4) # 保留4位小数。 + + # 增加售出列。看看是否需要卖出。 + stock_sell_merge = pd.DataFrame({ + "date": data["date"], "code": data["code"], "sell": 0, "buy": 0, "sell_kdjj": 0, "sell_rsi_6": 0, + "sell_cci": 0}, + index=data.index.values) + print(stock_sell_merge.head(1)) + + merge_sell_data = stock_sell_merge.apply(apply_merge_sell, axis=1) # , axis=1) + # 重命名 + del merge_sell_data["date"] # 合并前删除 date 字段。 + # 合并数据 + data_new = pd.merge(data_new, merge_sell_data, on=['code'], how='left') + + # 删除老数据。 + try: + del_sql = " DELETE FROM `stock_data`.`" + table_name + "` WHERE `date`= '%s' " % datetime_int + common.insert(del_sql) + print("insert_db") + except Exception as e: + print("error :", e) + del data_new["trade_float32"] + try: + common.insert_db(data_new, table_name, False, "`date`,`code`") + print("insert_db") + except Exception as e: + print("error :", e) + # 重命名 + del data_new["name"] + print(data_new) + + +# main函数入口 +if __name__ == '__main__': + # 计算买卖。 + tmp_datetime = common.run_with_args(stat_index_calculate) diff --git a/backend/old_jobs/guess_period_daily_job.py b/backend/old_jobs/guess_period_daily_job.py new file mode 100644 index 0000000..196f36a --- /dev/null +++ b/backend/old_jobs/guess_period_daily_job.py @@ -0,0 +1,119 @@ +#!/usr/local/bin/python3 +# -*- coding: utf-8 -*- + + +import libs.common as common +import sys +import time +import pandas as pd +import tushare as ts +from sqlalchemy.types import NVARCHAR +from sqlalchemy import inspect +import datetime +import heapq + +""" +SELECT `date`, `code`, `name`, `changepercent`, `trade`, `open`, `high`, `low`, + `settlement`, `volume`, `turnoverratio`, `amount`, `per`, `pb`, `mktcap`, `nmc` + FROM stock_data.ts_today_all where `date` = 20171106 and trade > 0 and trade <= 20 +and `code` not like '002%' and `code` not like '300%' and `name` not like '%st%' + +""" + + +def stat_index_all(tmp_datetime): + datetime_str = (tmp_datetime).strftime("%Y-%m-%d") + datetime_int = (tmp_datetime).strftime("%Y%m%d") + print("datetime_str:", datetime_str) + print("datetime_int:", datetime_int) + + # 查询今日满足股票数据。剔除数据:创业板股票数据,中小板股票数据,所有st股票 + # #`code` not like '002%' and `code` not like '300%' and `name` not like '%st%' + sql_1 = """ + SELECT `date`, `code`, `name`, `changepercent`, `trade`, `open`, `high`, `low`, + `settlement`, `volume`, `turnoverratio`, `amount`, `per`, `pb`, `mktcap`, `nmc` + FROM stock_data.ts_today_all WHERE `date` = %s and `trade` > 0 and `open` > 0 and trade <= 20 + and `code` not like %s and `code` not like %s and `name` not like %s + """ + print(sql_1) + data = pd.read_sql(sql=sql_1, con=common.engine(), params=[datetime_int, '002%', '300%', '%st%']) + print(type(data)) + data = data.drop_duplicates(subset="code", keep="last") + print(data["trade"]) + data["trade_float32"] = data["trade"].astype('float32', copy=False) + print(len(data)) + print("########data[trade]########:") + print(data["trade"]) + + # 使用 trade 填充数据 + stock_guess = pd.DataFrame({ + "date": data["date"], "code": data["code"], "wave_mean": data["trade"], + "wave_crest": data["trade"], "wave_base": data["trade"]}, index=data.index.values) + print(stock_guess.head()) + stock_guess = stock_guess.apply(apply_guess, axis=1) # , axis=1) + print(stock_guess.head()) + # stock_guess.astype('float32', copy=False) + stock_guess.drop('date', axis=1, inplace=True) # 删除日期字段,然后和原始数据合并。 + stock_guess = stock_guess.round(2) # 数据保留2位小数 + print(stock_guess["wave_base"]) + + data_new = pd.merge(data, stock_guess, on=['code'], how='left') + print("#############") + + # 使用pandas 函数 : https://pandas.pydata.org/pandas-docs/stable/api.html#id4 + data_new["up_rate"] = (data_new["trade_float32"].sub(data_new["wave_mean"])).div(data_new["wave_crest"]).mul(100) + data_new["up_rate"] = data_new["up_rate"].round(2) # 数据保留2位小数 + data_new.drop('trade_float32', axis=1, inplace=True) # 删除计算字段。 + + # 删除老数据。 + del_sql = " DELETE FROM `stock_data`.`guess_period_daily` WHERE `date`= '%s' " % datetime_int + common.insert(del_sql) + # print(data_new.head()) + # data_new["down_rate"] = (data_new["trade"] - data_new["wave_mean"]) / data_new["wave_base"] + common.insert_db(data_new, "guess_period_daily", False, "`date`,`code`") + + # 进行左连接. + # tmp = pd.merge(tmp, tmp2, on=['company_id'], how='left') + + +def apply_guess(tmp): + date = tmp["date"] + code = tmp["code"] + date_end = datetime.datetime.strptime(date, "%Y%m%d") + date_start = (date_end + datetime.timedelta(days=-300)).strftime("%Y-%m-%d") + date_end = date_end.strftime("%Y-%m-%d") + print(code, date_start, date_end) + + # open, high, close, low, volume, price_change, p_change, ma5, ma10, ma20, v_ma5, v_ma10, v_ma20, turnover + # 使用缓存方法。加快计算速度。 + stock = common.get_hist_data_cache(code, date_start, date_end) + # 增加空判断,如果是空返回 0 数据。 + if stock is None: + return pd.Series([date, code, 0.0, 0.0, 0.0], + index=['date', 'code', 'wave_mean', 'wave_crest', 'wave_base']) + + stock = pd.DataFrame({"close": stock["close"]}, index=stock.index.values) + stock = stock.sort_index(0) # 将数据按照日期排序下。 + + # print(stock.head(10)) + arr = pd.Series(stock["close"].values) + # print(df_arr) + wave_mean = arr.mean() + # 计算股票的波峰值。 + wave_crest = heapq.nlargest(5, enumerate(arr), key=lambda x: x[1]) + wave_crest_mean = pd.DataFrame(wave_crest).mean() + + # 输出元祖第一个元素是index,第二元素是比较的数值 计算数据的波谷值 + wave_base = heapq.nsmallest(5, enumerate(arr), key=lambda x: x[1]) + wave_base_mean = pd.DataFrame(wave_base).mean() + # 输出数据 + # print("##############") + # code date wave_base wave_crest wave_mean 顺序必须一致。返回的是行数据,然后填充。 + return pd.Series([date, code, wave_base_mean[1], wave_crest_mean[1], wave_mean], + index=['date','code','wave_mean','wave_crest','wave_base']) + + +# main函数入口 +if __name__ == '__main__': + # 使用方法传递。 + tmp_datetime = common.run_with_args(stat_index_all) diff --git a/backend/old_jobs/guess_return_daily_job.py b/backend/old_jobs/guess_return_daily_job.py new file mode 100644 index 0000000..6e1becb --- /dev/null +++ b/backend/old_jobs/guess_return_daily_job.py @@ -0,0 +1,130 @@ +#!/usr/local/bin/python3 +# -*- coding: utf-8 -*- + + +import libs.common as common +import sys +import time +import pandas as pd +import numpy as np +import math +import tushare as ts +from sqlalchemy.types import NVARCHAR +from sqlalchemy import inspect +import datetime +import heapq + +""" +SELECT `date`, `code`, `name`, `changepercent`, `trade`, `open`, `high`, `low`, + `settlement`, `volume`, `turnoverratio`, `amount`, `per`, `pb`, `mktcap`, `nmc` + FROM stock_data.ts_today_all where `date` = 20171106 and trade > 0 and trade <= 20 +and `code` not like '002%' and `code` not like '300%' and `name` not like '%st%' + +""" + + +def stat_index_all(tmp_datetime): + datetime_str = (tmp_datetime).strftime("%Y-%m-%d") + datetime_int = (tmp_datetime).strftime("%Y%m%d") + print("datetime_str:", datetime_str) + print("datetime_int:", datetime_int) + + # 查询今日满足股票数据。剔除数据:创业板股票数据,中小板股票数据,所有st股票 + # #`code` not like '002%' and `code` not like '300%' and `name` not like '%st%' + sql_1 = """ + SELECT `date`, `code`, `name`, `changepercent`, `trade`, `open`, `high`, `low`, + `settlement`, `volume`, `turnoverratio`, `amount`, `per`, `pb`, `mktcap`, `nmc` + FROM stock_data.ts_today_all WHERE `date` = %s and `trade` > 0 and `open` > 0 and trade <= 20 + and `code` not like %s and `code` not like %s and `name` not like %s + """ + print(sql_1) + data = pd.read_sql(sql=sql_1, con=common.engine(), params=[datetime_int, '002%', '300%', '%st%']) + data = data.drop_duplicates(subset="code", keep="last") + print("########data[trade]########:") + # print(data["trade"]) + + # 使用 trade 填充数据 + stock_guess = pd.DataFrame({ + "date": data["date"], "code": data["code"], "5d": data["trade"], + "10d": data["trade"], "20d": data["trade"], "60d": data["trade"], "5-10d": data["trade"], + "5-20d": data["trade"], "return": data["trade"], "mov_vol": data["trade"] + }, index=data.index.values) + + stock_guess = stock_guess.apply(apply_guess, axis=1) # , axis=1) + # print(stock_guess.head()) + # stock_guess.astype('float32', copy=False) + stock_guess.drop('date', axis=1, inplace=True) # 删除日期字段,然后和原始数据合并。 + + # print(stock_guess["5d"]) + + data_new = pd.merge(data, stock_guess, on=['code'], how='left') + print("#############") + + # 使用pandas 函数 : https://pandas.pydata.org/pandas-docs/stable/api.html#id4 + data_new["return"] = data_new["return"].mul(100) # 扩大100 倍方便观察 + data_new["mov_vol"] = data_new["mov_vol"].mul(100) + + data_new = data_new.round(2) # 数据保留2位小数 + + # 删除老数据。 + del_sql = " DELETE FROM `stock_data`.`guess_return_daily` WHERE `date`= '%s' " % datetime_int + common.insert(del_sql) + + # data_new["down_rate"] = (data_new["trade"] - data_new["wave_mean"]) / data_new["wave_base"] + common.insert_db(data_new, "guess_return_daily", False, "`date`,`code`") + + # 进行左连接. + # tmp = pd.merge(tmp, tmp2, on=['company_id'], how='left') + + +def apply_guess(tmp): + date = tmp["date"] + code = tmp["code"] + date_end = datetime.datetime.strptime(date, "%Y%m%d") + date_start = (date_end + datetime.timedelta(days=-300)).strftime("%Y-%m-%d") + date_end = date_end.strftime("%Y-%m-%d") + print(code, date_start, date_end) + # open, high, close, low, volume, price_change, p_change, ma5, ma10, ma20, v_ma5, v_ma10, v_ma20, turnover + # 使用缓存方法。加快计算速度。 + stock = common.get_hist_data_cache(code, date_start, date_end) + # 增加空判断,如果是空返回 0 数据。 + if stock is None: + return pd.Series([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, code, date, 0.0, 0.0], + index=['10d', '20d', '5-10d', '5-20d', '5d', '60d', 'code', 'date', 'mov_vol', 'return']) + + stock = pd.DataFrame({"close": stock["close"]}, index=stock.index.values) + stock = stock.sort_index(0) # 将数据按照日期排序下。 + # print(stock.head(10)) + # 5周期、10周期、20周期和60周期 + # 周线、半月线、月线和季度线 + stock["5d"] = stock["close"].rolling(window=5).mean() # 周线 + stock["10d"] = stock["close"].rolling(window=10).mean() # 半月线 + stock["20d"] = stock["close"].rolling(window=20).mean() # 月线 + stock["60d"] = stock["close"].rolling(window=60).mean() # 季度线 + # 计算日期差。 + stock["5-10d"] = (stock["5d"] - stock["10d"]) * 100 / stock["10d"] # 周-半月线差 + stock["5-20d"] = (stock["5d"] - stock["20d"]) * 100 / stock["20d"] # 周-月线差 + # 计算股票的收益价格 + stock["return"] = np.log(stock["close"] / stock["close"].shift(1)) + + # print(stock["return"]) + # 计算股票的【收益率的移动历史标准差】 + mov_day = int(len(stock) / 20) + # print("mov_day:", mov_day, len(stock)) + stock["mov_vol"] = stock["return"].rolling(window=mov_day).std() * math.sqrt(mov_day) + # print(stock["mov_vol"].tail()) + # print(stock["return"].tail()) + # print("stock[10d].tail(1)", stock["10d"].tail(1).values[0]) + # 10d 20d 5-10d 5-20d 5d 60d code date mov_vol return + tmp = pd.Series([stock["10d"].tail(1).values[0], stock["20d"].tail(1).values[0], stock["5-10d"].tail(1).values[0], + stock["5-20d"].tail(1).values[0], stock["5d"].tail(1).values[0], stock["60d"].tail(1).values[0], + code, date, stock["mov_vol"].tail(1).values[0], stock["return"].tail(1).values[0]], + index=['10d', '20d', '5-10d', '5-20d', '5d', '60d', 'code', 'date', 'mov_vol', 'return']) + # print(tmp) + return tmp + + +# main函数入口 +if __name__ == '__main__': + # 使用方法传递。 + tmp_datetime = common.run_with_args(stat_index_all) diff --git a/backend/old_jobs/guess_sklearn_ma_daily_job.py b/backend/old_jobs/guess_sklearn_ma_daily_job.py new file mode 100644 index 0000000..7c8c708 --- /dev/null +++ b/backend/old_jobs/guess_sklearn_ma_daily_job.py @@ -0,0 +1,146 @@ +#!/usr/local/bin/python3 +# -*- coding: utf-8 -*- + + +import libs.common as common +import pandas as pd +import numpy as np +import math +import datetime +import sklearn as skl +from sklearn import datasets, linear_model +# https://github.com/udacity/machine-learning/issues/202 +# sklearn.cross_validation 这个包不推荐使用了。 +from sklearn.model_selection import train_test_split, cross_val_score +from sklearn.neighbors import KNeighborsClassifier + +# 要操作的数据库表名称。 +table_name = "guess_sklearn_ma_daily" + + +# 批处理数据。 +def stat_all_batch(tmp_datetime): + datetime_str = (tmp_datetime).strftime("%Y-%m-%d") + datetime_int = (tmp_datetime).strftime("%Y%m%d") + print("datetime_str:", datetime_str) + print("datetime_int:", datetime_int) + + try: + # 删除老数据。 + del_sql = " DELETE FROM `stock_data`.`%s` WHERE `date`= %s " % (table_name, datetime_int) + print("del_sql:", del_sql) + common.insert(del_sql) + except Exception as e: + print("error :", e) + + sql_count = """ + SELECT count(1) FROM stock_data.ts_today_all WHERE `date` = %s and `trade` > 0 and `open` > 0 and trade <= 20 + and `code` not like %s and `name` not like %s + """ + # 修改逻辑,增加中小板块计算。 中小板:002,创业板:300 。and `code` not like %s and `code` not like %s and `name` not like %s + # count = common.select_count(sql_count, params=[datetime_int, '002%', '300%', '%st%']) + count = common.select_count(sql_count, params=[datetime_int, '300%', '%st%']) + print("count :", count) + batch_size = 100 + end = int(math.ceil(float(count) / batch_size) * batch_size) + print(end) + # for i in range(0, end, batch_size): + for i in range(0, end, batch_size): + print("loop :", i) + # 查询今日满足股票数据。剔除数据:创业板股票数据,中小板股票数据,所有st股票 + # #`code` not like '002%' and `code` not like '300%' and `name` not like '%st%' + sql_1 = """ + SELECT `date`, `code`, `name`, `changepercent`, `trade`, `open`, `high`, `low`, + `settlement`, `volume`, `turnoverratio`, `amount`, `per`, `pb`, `mktcap`, `nmc` + FROM stock_data.ts_today_all WHERE `date` = %s and `trade` > 0 and `open` > 0 and trade <= 20 + and `code` not like %s and `name` not like %s limit %s , %s + """ + print(sql_1) + # data = pd.read_sql(sql=sql_1, con=common.engine(), params=[datetime_int, '002%', '300%', '%st%', i, batch_size]) + data = pd.read_sql(sql=sql_1, con=common.engine(), params=[datetime_int, '300%', '%st%', i, batch_size]) + data = data.drop_duplicates(subset="code", keep="last") + print("########data[trade]########:", len(data)) + + # 使用 trade 填充数据 + stock_sklearn = pd.DataFrame({ + "date": data["date"], "code": data["code"], "next_close": data["trade"], + "sklearn_score": data["trade"]}, index=data.index.values) + print(stock_sklearn.head()) + stock_sklearn_apply = stock_sklearn.apply(apply_sklearn, axis=1) # , axis=1) + # 重命名 + del stock_sklearn_apply["date"] # 合并前删除 date 字段。 + # 合并数据 + data_new = pd.merge(data, stock_sklearn_apply, on=['code'], how='left') + # for index, row in data.iterrows(): + # next_stock, score = stat_index_all(row, i) + # print(next_stock, score) + data_new["next_close"] = data_new["next_close"].round(2) # 数据保留4位小数 + data_new["sklearn_score"] = data_new["sklearn_score"].round(2) # 数据保留2位小数 + + data_new["trade_float32"] = data["trade"].astype('float32', copy=False) + data_new["up_rate"] = (data_new["next_close"] - data_new["trade_float32"]) * 100 / data_new["trade_float32"] + data_new["up_rate"] = data_new["up_rate"].round(2) # 数据保留2位小数 + del data_new["trade_float32"] + + try: + common.insert_db(data_new, table_name, False, "`date`,`code`") + print("insert_db") + except Exception as e: + print("error :", e) + # 重命名 + del data_new["name"] + print(data_new) + + +# code date next_close sklearn_score +def apply_sklearn(data): + # 要操作的数据库表名称。 + print("########stat_index_all########:", len(data)) + date = data["date"] + code = data["code"] + print(date, code) + date_end = datetime.datetime.strptime(date, "%Y%m%d") + date_start = (date_end + datetime.timedelta(days=-300)).strftime("%Y-%m-%d") + date_end = date_end.strftime("%Y-%m-%d") + print(code, date_start, date_end) + + # open high close low volume price_change p_change ma5 ma10 ma20 v_ma5 v_ma10 v_ma20 turnover + stock_X = common.get_hist_data_cache(code, date_start, date_end) + # 增加空判断,如果是空返回 0 数据。 + if stock_X is None: + return list([code, date, 0.0, 0.0]) + + stock_X = stock_X.sort_index(0) # 将数据按照日期排序下。 + stock_y = pd.Series(stock_X["close"].values) # 标签 + + stock_X_next = stock_X.iloc[len(stock_X) - 1] + print("########################### stock_X_next date:", stock_X_next) + # 使用今天的交易价格,13 个指标预测明天的价格。偏移股票数据,今天的数据,目标是明天的价格。 + stock_X = stock_X.drop(stock_X.index[len(stock_X) - 1]) # 删除最后一条数据 + stock_y = stock_y.drop(stock_y.index[0]) # 删除第一条数据 + # print("########################### stock_X date:", stock_X) + + # 删除掉close 也就是收盘价格。 + del stock_X["close"] + del stock_X_next["close"] + + model = linear_model.LinearRegression() + # model = KNeighborsClassifier() + + model.fit(stock_X.values, stock_y) + # print("############## test_akshare & target #############") + # print("############## coef_ & intercept_ #############") + # print(model.coef_) # 系数 + # print(model.intercept_) # 截断 + next_close = model.predict([stock_X_next.values]) + if len(next_close) == 1: + next_close = next_close[0] + sklearn_score = model.score(stock_X.values, stock_y) + print("score:", sklearn_score) # 评分 + return list([code, date, next_close, sklearn_score * 100]) + + +# main函数入口 +if __name__ == '__main__': + # 使用方法传递。 + tmp_datetime = common.run_with_args(stat_all_batch) diff --git a/backend/supervisor/example_supervisord_conf b/backend/supervisor/example_supervisord_conf new file mode 100644 index 0000000..024b321 --- /dev/null +++ b/backend/supervisor/example_supervisord_conf @@ -0,0 +1,148 @@ +; Sample supervisor config file. +; +; For more information on the config file, please see: +; http://supervisord.org/configuration.html +; +; Notes: +; - Shell expansion ("~" or "$HOME") is not supported. Environment +; variables can be expanded using this syntax: "%(ENV_HOME)s". +; - Quotes around values are not supported, except in the case of +; the environment= options as shown below. +; - Comments must have a leading space: "a=b ;comment" not "a=b;comment". +; - Command will be truncated if it looks like a config file comment, e.g. +; "command=bash -c 'foo ; bar'" will truncate to "command=bash -c 'foo ". + +[unix_http_server] +file=/tmp/supervisor.sock ; the path to the socket file +;chmod=0700 ; socket file mode (default 0700) +;chown=nobody:nogroup ; socket file uid:gid owner +;username=user ; default is no username (open server) +;password=123 ; default is no password (open server) + +;[inet_http_server] ; inet (TCP) server disabled by default +;port=127.0.0.1:9001 ; ip_address:port specifier, *:port for all iface +;username=user ; default is no username (open server) +;password=123 ; default is no password (open server) + +[supervisord] +logfile=/tmp/supervisord.log ; main log file; default $CWD/supervisord.log +logfile_maxbytes=50MB ; max main logfile bytes b4 rotation; default 50MB +logfile_backups=10 ; # of main logfile backups; 0 means none, default 10 +loglevel=info ; log level; default info; others: debug,warn,trace +pidfile=/tmp/supervisord.pid ; supervisord pidfile; default supervisord.pid +nodaemon=false ; start in foreground if true; default false +minfds=1024 ; min. avail startup file descriptors; default 1024 +minprocs=200 ; min. avail process descriptors;default 200 +;umask=022 ; process file creation umask; default 022 +;user=chrism ; default is current user, required if root +;identifier=supervisor ; supervisord identifier, default is 'supervisor' +;directory=/tmp ; default is not to cd during start +;nocleanup=true ; don't clean up tempfiles at start; default false +;childlogdir=/tmp ; 'AUTO' child log dir, default $TEMP +;environment=KEY="value" ; key value pairs to add to environment +;strip_ansi=false ; strip ansi escape codes in logs; def. false + +; The rpcinterface:supervisor section must remain in the config file for +; RPC (supervisorctl/web interface) to work. Additional interfaces may be +; added by defining them in separate [rpcinterface:x] sections. + +[rpcinterface:supervisor] +supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface + +; The supervisorctl section configures how supervisorctl will connect to +; supervisord. configure it match the settings in either the unix_http_server +; or inet_http_server section. + +[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=chris ; should be same as in [*_http_server] if set +;password=123 ; should be same as in [*_http_server] if set +;prompt=mysupervisor ; cmd line prompt (default "supervisor") +;history_file=~/.sc_history ; use readline history if available + +; The sample program section below shows all possible program subsection values. +; Create one or more 'real' program: sections to be able to control them under +; supervisor. + +;[program:theprogramname] +;command=/bin/cat ; the program (relative uses PATH, can take args) +;process_name=%(program_name)s ; process_name expr (default %(program_name)s) +;numprocs=1 ; number of processes copies to start (def 1) +;directory=/tmp ; directory to cwd to before exec (def no cwd) +;umask=022 ; umask for process (default None) +;priority=999 ; the relative start priority (default 999) +;autostart=true ; start at supervisord start (default: true) +;startsecs=1 ; # of secs prog must stay up to be running (def. 1) +;startretries=3 ; max # of serial start failures when starting (default 3) +;autorestart=unexpected ; when to restart if exited after running (def: unexpected) +;exitcodes=0,2 ; 'expected' exit codes used with autorestart (default 0,2) +;stopsignal=QUIT ; signal used to kill process (default TERM) +;stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10) +;stopasgroup=false ; send stop signal to the UNIX process group (default false) +;killasgroup=false ; SIGKILL the UNIX process group (def false) +;user=chrism ; setuid to this UNIX account to run the program +;redirect_stderr=true ; redirect proc stderr to stdout (default false) +;stdout_logfile=/a/path ; stdout log path, NONE for none; default AUTO +;stdout_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB) +;stdout_logfile_backups=10 ; # of stdout logfile backups (0 means none, default 10) +;stdout_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0) +;stdout_events_enabled=false ; emit events on stdout writes (default false) +;stderr_logfile=/a/path ; stderr log path, NONE for none; default AUTO +;stderr_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB) +;stderr_logfile_backups=10 ; # of stderr logfile backups (0 means none, default 10) +;stderr_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0) +;stderr_events_enabled=false ; emit events on stderr writes (default false) +;environment=A="1",B="2" ; process environment additions (def no adds) +;serverurl=AUTO ; override serverurl computation (childutils) + +; The sample eventlistener section below shows all possible eventlistener +; subsection values. Create one or more 'real' eventlistener: sections to be +; able to handle event notifications sent by supervisord. + +;[eventlistener:theeventlistenername] +;command=/bin/eventlistener ; the program (relative uses PATH, can take args) +;process_name=%(program_name)s ; process_name expr (default %(program_name)s) +;numprocs=1 ; number of processes copies to start (def 1) +;events=EVENT ; event notif. types to subscribe to (req'd) +;buffer_size=10 ; event buffer queue size (default 10) +;directory=/tmp ; directory to cwd to before exec (def no cwd) +;umask=022 ; umask for process (default None) +;priority=-1 ; the relative start priority (default -1) +;autostart=true ; start at supervisord start (default: true) +;startsecs=1 ; # of secs prog must stay up to be running (def. 1) +;startretries=3 ; max # of serial start failures when starting (default 3) +;autorestart=unexpected ; autorestart if exited after running (def: unexpected) +;exitcodes=0,2 ; 'expected' exit codes used with autorestart (default 0,2) +;stopsignal=QUIT ; signal used to kill process (default TERM) +;stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10) +;stopasgroup=false ; send stop signal to the UNIX process group (default false) +;killasgroup=false ; SIGKILL the UNIX process group (def false) +;user=chrism ; setuid to this UNIX account to run the program +;redirect_stderr=false ; redirect_stderr=true is not allowed for eventlisteners +;stdout_logfile=/a/path ; stdout log path, NONE for none; default AUTO +;stdout_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB) +;stdout_logfile_backups=10 ; # of stdout logfile backups (0 means none, default 10) +;stdout_events_enabled=false ; emit events on stdout writes (default false) +;stderr_logfile=/a/path ; stderr log path, NONE for none; default AUTO +;stderr_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB) +;stderr_logfile_backups=10 ; # of stderr logfile backups (0 means none, default 10) +;stderr_events_enabled=false ; emit events on stderr writes (default false) +;environment=A="1",B="2" ; process environment additions +;serverurl=AUTO ; override serverurl computation (childutils) + +; The sample group section below shows all possible group values. Create one +; or more 'real' group: sections to create "heterogeneous" process groups. + +;[group:thegroupname] +;programs=progname1,progname2 ; each refers to 'x' in [program:x] definitions +;priority=999 ; the relative start priority (default 999) + +; The [include] section can just contain the "files" setting. This +; setting can list multiple files (separated by whitespace or +; newlines). It can also contain wildcards. The filenames are +; interpreted as relative to this file. Included files *cannot* +; include files themselves. + +;[include] +;files = relative/directory/*.ini \ No newline at end of file diff --git a/backend/supervisor/supervisord.conf b/backend/supervisor/supervisord.conf new file mode 100644 index 0000000..fb49c71 --- /dev/null +++ b/backend/supervisor/supervisord.conf @@ -0,0 +1,51 @@ +[unix_http_server] +file=/tmp/supervisor.sock ; the path to the socket file + +[inet_http_server] ; inet (TCP) server disabled by default +port=*:9001 ; ip_address:port specifier, *:port for all iface +;username=user ; default is no username (open server) +;password=123 ; default is no password (open server) + +[supervisord] +logfile=/tmp/supervisord.log ; main log file; default $CWD/supervisord.log +logfile_maxbytes=50MB ; max main logfile bytes b4 rotation; default 50MB +logfile_backups=10 ; # of main logfile backups; 0 means none, default 10 +loglevel=info ; log level; default info; others: debug,warn,trace +pidfile=/tmp/supervisord.pid ; supervisord pidfile; default supervisord.pid +nodaemon=false ; start in foreground if true; default false +minfds=1024 ; min. avail startup file descriptors; default 1024 +minprocs=200 ; min. avail process descriptors;default 200 + +[rpcinterface:supervisor] +supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface + +[supervisorctl] +serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket + +[program:init] +command=/data/stock/jobs/run_init.sh +autostart=true +autorestart=true +startsecs=20 +priority=1 +stopasgroup=true +killasgroup=true + +[program:cron] +command=/data/stock/jobs/run_cron.sh +autostart=true +autorestart=true +startsecs=20 +priority=1 +stopasgroup=true +killasgroup=true + + +[program:stock-web] +command=/data/stock/jobs/run_web.sh +autostart=true +autorestart=true +startsecs=20 +priority=1 +stopasgroup=true +killasgroup=true diff --git a/backend/web/README.md b/backend/web/README.md new file mode 100644 index 0000000..e69de29 diff --git a/backend/web/base.py b/backend/web/base.py new file mode 100755 index 0000000..8c8700a --- /dev/null +++ b/backend/web/base.py @@ -0,0 +1,46 @@ +#!/usr/local/bin/python3 +# -*- coding: utf-8 -*- + +import tornado.web +import libs.stock_web_dic as stock_web_dic +import libs.common as common +import logging + +#基础handler,主要负责检查mysql的数据库链接。 +class BaseHandler(tornado.web.RequestHandler): + def set_default_headers(self): + headers = self.request.headers + # logging.info('head的类型:',type(headers)) + origin = headers.get('origin',None) + logging.info("######################## BaseHandler ########################") + logging.info(origin) + + if origin != None and origin.find("localhost") > 0: + self.set_header("Access-Control-Allow-Credentials", "true") + self.set_header("Access-Control-Allow-Origin",origin) + self.set_header("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE, OPTIONS") + self.set_header("Access-Control-Allow-Headers", "x-token, authorization, Authorization, Content-Type, Access-Control-Allow-Origin, Access-Control-Allow-Headers, X-Requested-By, Access-Control-Allow-Methods") + self.set_header("Access-Control-Expose-Headers", "Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma") + # 同时定义一个option方法 + def options(self): + self.set_status(204) + self.finish() + + @property + def db(self): + try: + # check every time。 + self.application.db.query("SELECT 1 ") + except Exception as e: + print(e) + self.application.db.reconnect() + return self.application.db + +class LeftMenu: + def __init__(self, url): + self.leftMenuList = stock_web_dic.STOCK_WEB_DATA_LIST + self.current_url = url + +# 获得左菜单。 +def GetLeftMenu(url): + return LeftMenu(url) diff --git a/backend/web/chartHandler.py b/backend/web/chartHandler.py new file mode 100755 index 0000000..2e076cf --- /dev/null +++ b/backend/web/chartHandler.py @@ -0,0 +1,50 @@ +#!/usr/local/bin/python3 +# -*- coding: utf-8 -*- + + +from tornado import gen +import libs.stock_web_dic as stock_web_dic +import web.base as webBase +import libs.common as common +import logging +import tornado.web +import matplotlib +matplotlib.use('Agg') +import matplotlib.pyplot as plt +import numpy as np +import io + +def GenImage(freq): + t = np.linspace(0, 10, 500) + y = np.sin(t * freq * 2 * 3.141) + fig1 = plt.figure() + plt.plot(t, y) + plt.xlabel('Time [s]') + memdata = io.BytesIO() + plt.grid(True) + plt.savefig(memdata, format='png') + image = memdata.getvalue() + return image + + +class ImageHandler(tornado.web.RequestHandler): + @gen.coroutine + def get(self): + image = GenImage(0.5) + self.set_header('Content-type', 'image/png') + self.set_header('Content-length', len(image)) + self.write(image) + +# 获得页面数据。 +class GetChartHtmlHandler(webBase.BaseHandler): + @gen.coroutine + def get(self): + name = self.get_argument("table_name", default=None, strip=False) + #stockWeb = stock_web_dic.STOCK_WEB_DATA_MAP[name] + # self.uri_ = ("self.request.url:", self.request.uri) + # print self.uri_ + logging.info("chart...") + self.render("stock_chart.html", entries="", + pythonStockVersion=common.__version__, + leftMenu=webBase.GetLeftMenu(self.request.uri)) + diff --git a/backend/web/dataEditorHandler.py b/backend/web/dataEditorHandler.py new file mode 100755 index 0000000..652a566 --- /dev/null +++ b/backend/web/dataEditorHandler.py @@ -0,0 +1,110 @@ +#!/usr/local/bin/python3 +# -*- coding: utf-8 -*- + + +from tornado import gen +# import sys +# import os +# sys.path.append(os.path.abspath('/data/stock/libs')) +import libs.stock_web_dic as stock_web_dic +import web.base as webBase +import libs.common as common +import logging +import re + +# 获得页面数据。 +class GetEditorHtmlHandler(webBase.BaseHandler): + @gen.coroutine + def get(self): + name = self.get_argument("table_name", default=None, strip=False) + stockWeb = stock_web_dic.STOCK_WEB_DATA_MAP[name] + # self.uri_ = ("self.request.url:", self.request.uri) + # print self.uri_ + self.render("data_editor.html", stockWeb=stockWeb, + pythonStockVersion=common.__version__, + leftMenu=webBase.GetLeftMenu(self.request.uri)) + + +# 拼接sql,将value的key 和 value 放到一起。 +def genSql(primary_key, param_map, join_string): + tmp_sql = "" + idx = 0 + for tmp_key in primary_key: + tmp_val = param_map[tmp_key] + if idx == 0: + tmp_sql = " `%s` = '%s' " % (tmp_key, tmp_val) + else: + tmp_sql += join_string + (" `%s` = '%s' " % (tmp_key, tmp_val)) + idx += 1 + return tmp_sql + + +# 获得页面数据。 +class SaveEditorHandler(webBase.BaseHandler): + @gen.coroutine + def post(self): + action = self.get_argument("action", default=None, strip=False) + logging.info(action) + table_name = self.get_argument("table_name", default=None, strip=False) + stockWeb = stock_web_dic.STOCK_WEB_DATA_MAP[table_name] + # 临时map数组。 + param_map = {} + # 支持多排序。使用shift+鼠标左键。 + for item, val in self.request.arguments.items(): + # 正则查找 data[1112][code] 里面的code字段 + item_key = re.search(r"\]\[(.*?)\]", item) + if item_key: + tmp_1 = item_key.group() + if tmp_1: + tmp_1 = tmp_1.replace("][", "").replace("]", "") + param_map[tmp_1] = val[0].decode("utf-8") + #logging.info(param_map) + if action == "create": + logging.info("###########################create") + # 拼接where 和 update 语句。 + tmp_columns = "`, `".join(stockWeb.columns) + tmp_values = [] + for tmp_key in stockWeb.columns: + tmp_values.append(param_map[tmp_key]) + # 更新sql。 + tmp_values2 = "', '".join(tmp_values) + insert_sql = " INSERT INTO %s (`%s`) VALUES('%s'); " % (stockWeb.table_name, tmp_columns, tmp_values2) + logging.info(insert_sql) + try: + self.db.execute(insert_sql) + except Exception as e: + err = {"error": str(e)} + logging.info(err) + self.write(err) + return + + elif action == "edit": + logging.info("###########################edit") + # 拼接where 和 update 语句。 + tmp_update = genSql(stockWeb.columns, param_map, ",") + tmp_where = genSql(stockWeb.primary_key, param_map, "and") + # 更新sql。 + update_sql = " UPDATE %s SET %s WHERE %s " % (stockWeb.table_name, tmp_update, tmp_where) + logging.info(update_sql) + try: + self.db.execute(update_sql) + except Exception as e: + err = {"error": str(e)} + logging.info(err) + self.write(err) + return + elif action == "remove": + logging.info("###########################remove") + # 拼接where 语句。 + tmp_where = genSql(stockWeb.primary_key, param_map, "and") + # 更新sql。 + delete_sql = " DELETE FROM %s WHERE %s " % (stockWeb.table_name, tmp_where) + logging.info(delete_sql) + try: + self.db.execute(delete_sql) + except Exception as e: + err = {"error": str(e)} + logging.info(err) + self.write(err) + return + self.write("{\"data\":[{}]}") diff --git a/backend/web/dataIndicatorsHandler.py b/backend/web/dataIndicatorsHandler.py new file mode 100755 index 0000000..835fac8 --- /dev/null +++ b/backend/web/dataIndicatorsHandler.py @@ -0,0 +1,353 @@ +#!/usr/local/bin/python3 +# -*- coding: utf-8 -*- + +from tornado import gen +import web.base as webBase +import logging + +# 首映 bokeh 画图。 +from bokeh.plotting import figure +from bokeh.embed import components +import datetime +import libs.common as common +import stockstats +import numpy as np +import pandas as pd +from bokeh.layouts import gridplot +from bokeh.palettes import Category20 +from math import radians +from bokeh.models import DatetimeTickFormatter + + +# 获得页面数据。 +class GetDataIndicatorsHandler(webBase.BaseHandler): + @gen.coroutine + def get(self): + code = self.get_argument("code", default=None, strip=False) + logging.info(code) + # self.uri_ = ("self.request.url:", self.request.uri) + # print self.uri_ + comp_list = [] + + try: + date_now = datetime.datetime.now() + date_end = date_now.strftime("%Y-%m-%d") + date_start = (date_now + datetime.timedelta(days=-100)).strftime("%Y-%m-%d") + print(code, date_start, date_end) + + # open, high, close, low, volume, price_change, p_change, ma5, ma10, ma20, v_ma5, v_ma10, v_ma20, turnover + # 使用缓存方法。加快计算速度。 + stock = common.get_hist_data_cache(code, date_start, date_end) + logging.info(stock.head(1)) + + # print(stock) [186 rows x 14 columns] + # 初始化统计类 + # stockStat = stockstats.StockDataFrame.retype(pd.read_csv("002032.csv")) + stockStat = stockstats.StockDataFrame.retype(stock) + batch_add(comp_list, stockStat) + + + except Exception as e: + logging.info("error :", e) + logging.info("#################### GetStockHtmlHandlerEnd ####################") + + self.render("stock_indicators.html", comp_list=comp_list, + pythonStockVersion=common.__version__, + leftMenu=webBase.GetLeftMenu(self.request.uri)) + +# 全部指标数据汇总 +indicators_all_dic = [ + { + "title": "1,交易量delta指标分析", + "desc": "The Volume Delta (Vol ∆) ", + "dic": ["volume", "volume_delta"] + }, { + "title": "2,计算n天差", + "desc": "可以计算,向前n天,和向后n天的差。", + "dic": ["close", "close_1_d", "close_2_d", "close_-1_d", "close_-2_d"] + }, { + "title": "3,n天涨跌百分百计算", + "desc": "可以看到,-n天数据和今天数据的百分比。", + "dic": ["close", "close_-1_r", "close_-2_r"] + }, { + "title": "4,CR指标", + "desc": """ + http://wiki.mbalib.com/wiki/CR%E6%8C%87%E6%A0%87 价格动量指标 + 4. CR跌穿a、b、c、d四条线,再由低点向上爬升160时,为短线获利的一个良机,应适当卖出股票。 + 5. CR跌至40以下时,是建仓良机。而CR高于300~400时,应注意适当减仓。 + """, + "dic": ["close","cr","cr-ma1","cr-ma2","cr-ma3"] + }, { + "title": "5,最大值,最小值", + "desc": """ + 计算区间最大值 + volume max of three days ago, yesterday and two days later + stock["volume_-3,2,-1_max"] + volume min between 3 days ago and tomorrow + stock["volume_-3~1_min"] + 实际使用的时候使用 -2~2 可计算出5天的最大,最小值。 + """, + "dic": ["volume","volume_-2~2_max","volume_-2~2_min"] + }, { + "title": "6,KDJ指标", + "desc": """ + http://wiki.mbalib.com/wiki/%E9%9A%8F%E6%9C%BA%E6%8C%87%E6%A0%87 + 随机指标(KDJ)一般是根据统计学的原理,通过一个特定的周期(常为9日、9周等)内出现过的最高价、最低价及最后一个计算周期的收盘价及这三者之间的比例关系,来计算最后一个计算周期的未成熟随机值RSV,然后根据平滑移动平均线的方法来计算K值、D值与J值,并绘成曲线图来研判股票走势。 + (3)在使用中,常有J线的指标,即3乘以K值减2乘以D值(3K-2D=J),其目的是求出K值与D值的最大乖离程度,以领先KD值找出底部和头部。J大于100时为超买,小于10时为超卖。 + """, + "dic": ["close","kdjk","kdjd","kdjj"] + }, { + "title": "7,SMA指标", + "desc": """ + http://wiki.mbalib.com/wiki/Sma + 简单移动平均线(Simple Moving Average,SMA) + 可以动态输入参数,获得几天的移动平均。 + """, + "dic": ["close","close_5_sma","close_10_sma"] + }, { + "title": "8,MACD指标", + "desc": """ + http://wiki.mbalib.com/wiki/MACD + 平滑异同移动平均线(Moving Average Convergence Divergence,简称MACD指标),也称移动平均聚散指标 + MACD + stock["macd"] + MACD signal line + stock["macds"] + MACD histogram + stock["macdh"] + MACD技术分析,运用DIF线与MACD线之相交型态及直线棒高低点与背离现象,作为买卖讯号,尤其当市场股价走势呈一较为明确波段趋势时, + MACD 则可发挥其应有的功能,但当市场呈牛皮盘整格局,股价不上不下时,MACD买卖讯号较不明显。 + 当用MACD作分析时,亦可运用其他的技术分析指标如短期 K,D图形作为辅助工具,而且也可对买卖讯号作双重的确认。 + """, + "dic": ["close","macd","macds","macdh"] + }, { + "title": "9,BOLL指标", + "desc": """ + http://wiki.mbalib.com/wiki/BOLL + 布林线指标(Bollinger Bands) + bolling, including upper band and lower band + stock["boll"] + stock["boll_ub"] + stock["boll_lb"] + 1、当布林线开口向上后,只要股价K线始终运行在布林线的中轨上方的时候,说明股价一直处在一个中长期上升轨道之中,这是BOLL指标发出的持股待涨信号,如果TRIX指标也是发出持股信号时,这种信号更加准确。此时,投资者应坚决持股待涨。 + 2、当布林线开口向下后,只要股价K线始终运行在布林线的中轨下方的时候,说明股价一直处在一个中长期下降轨道之中,这是BOLL指标发出的持币观望信号,如果TRIX指标也是发出持币信号时,这种信号更加准确。此时,投资者应坚决持币观望。 + """, + "dic": ["close","boll","boll_ub","boll_lb"] + }, { + "title": "10,RSI指标", + "desc": """ + http://wiki.mbalib.com/wiki/RSI + 相对强弱指标(Relative Strength Index,简称RSI),也称相对强弱指数、相对力度指数 + 6 days RSI + stock["rsi_6"] + 12 days RSI + stock["rsi_12"] + (2)强弱指标保持高于50表示为强势市场,反之低于50表示为弱势市场。 + (3)强弱指标多在70与30之间波动。当六日指标上升到达80时,表示股市已有超买现象,如果一旦继续上升,超过90以上时,则表示已到严重超买的警戒区,股价已形成头部,极可能在短期内反转回转。 + (4)当六日强弱指标下降至20时,表示股市有超卖现象,如果一旦继续下降至10以下时则表示已到严重超卖区域,股价极可能有止跌回升的机会。 + """, + "dic": ["close","rsi_6","rsi_12"] + }, { + "title": "11,WR指标", + "desc": """ + http://wiki.mbalib.com/wiki/%E5%A8%81%E5%BB%89%E6%8C%87%E6%A0%87 + 威廉指数(Williams%Rate)该指数是利用摆动点来度量市场的超买超卖现象。 + 10 days WR + stock["wr_10"] + 6 days WR + stock["wr_6"] + """, + "dic": ["close","wr_10","wr_6"] + }, { + "title": "12,CCI指标", + "desc": """ + http://wiki.mbalib.com/wiki/%E9%A1%BA%E5%8A%BF%E6%8C%87%E6%A0%87 + 顺势指标又叫CCI指标,其英文全称为“Commodity Channel Index”, + 是由美国股市分析家唐纳德·蓝伯特(Donald Lambert)所创造的,是一种重点研判股价偏离度的股市分析工具。 + CCI, default to 14 days + stock["cci"] + 20 days CCI + stock["cci_20"] + 1、当CCI指标从下向上突破﹢100线而进入非常态区间时,表明股价脱离常态而进入异常波动阶段, + 中短线应及时买入,如果有比较大的成交量配合,买入信号则更为可靠。 + 2、当CCI指标从上向下突破﹣100线而进入另一个非常态区间时,表明股价的盘整阶段已经结束, + 将进入一个比较长的寻底过程,投资者应以持币观望为主。 + """, + "dic": ["close","cci","cci_20"] + }, { + "title": "13,TR、ATR指标", + "desc": """ + http://wiki.mbalib.com/wiki/%E5%9D%87%E5%B9%85%E6%8C%87%E6%A0%87 + 均幅指标(Average True Ranger,ATR) + 均幅指标(ATR)是取一定时间周期内的股价波动幅度的移动平均值,主要用于研判买卖时机。 + TR (true range) + stock["tr"] + ATR (Average True Range) + stock["atr"] + 均幅指标无论是从下向上穿越移动平均线,还是从上向下穿越移动平均线时,都是一种研判信号。 + """, + "dic": ["close","tr","atr"] + }, { + "title": "14,DMA指标", + "desc": """ + http://wiki.mbalib.com/wiki/DMA + DMA指标(Different of Moving Average)又叫平行线差指标,是目前股市分析技术指标中的一种中短期指标,它常用于大盘指数和个股的研判。 + DMA, difference of 10 and 50 moving average + stock["dma"] + """, + "dic": ["close","dma"] + }, { + "title": "15,DMI,+DI,-DI,DX,ADX,ADXR指标", + "desc": """ + http://wiki.mbalib.com/wiki/DMI + 动向指数Directional Movement Index,DMI) + http://wiki.mbalib.com/wiki/ADX + 平均趋向指标(Average Directional Indicator,简称ADX) + http://wiki.mbalib.com/wiki/%E5%B9%B3%E5%9D%87%E6%96%B9%E5%90%91%E6%8C%87%E6%95%B0%E8%AF%84%E4%BC%B0 + 平均方向指数评估(ADXR)实际是今日ADX与前面某一日的ADX的平均值。ADXR在高位与ADX同步下滑,可以增加对ADX已经调头的尽早确认。 + ADXR是ADX的附属产品,只能发出一种辅助和肯定的讯号,并非入市的指标,而只需同时配合动向指标(DMI)的趋势才可作出买卖策略。 + 在应用时,应以ADX为主,ADXR为辅。 + """, + "dic": ["close","pdi","mdi","dx","adx","adxr"] + }, { + "title": "16,TRIX,MATRIX指标", + "desc": """ + http://wiki.mbalib.com/wiki/TRIX + TRIX指标又叫三重指数平滑移动平均指标(Triple Exponentially Smoothed Average) + """, + "dic": ["close","trix","trix_9_sma"] + }, { + "title": "17,VR,MAVR指标", + "desc": """ + http://wiki.mbalib.com/wiki/%E6%88%90%E4%BA%A4%E9%87%8F%E6%AF%94%E7%8E%87 + 成交量比率(Volumn Ratio,VR)(简称VR),是一项通过分析股价上升日成交额(或成交量,下同)与股价下降日成交额比值, + 从而掌握市场买卖气势的中期技术指标。 + VR, default to 26 days + stock["vr"] + MAVR is the simple moving average of VR + stock["vr_6_sma"] + """, + "dic": ["close","vr","vr_6_sma"] + } +] +# 配置数据 +indicators_dic = [ + { + "title": "6,KDJ指标", + "desc": """ + http://wiki.mbalib.com/wiki/%E9%9A%8F%E6%9C%BA%E6%8C%87%E6%A0%87 + 随机指标(KDJ)一般是根据统计学的原理,通过一个特定的周期(常为9日、9周等)内出现过的最高价、最低价及最后一个计算周期的收盘价及这三者之间的比例关系,来计算最后一个计算周期的未成熟随机值RSV,然后根据平滑移动平均线的方法来计算K值、D值与J值,并绘成曲线图来研判股票走势。 + (3)在使用中,常有J线的指标,即3乘以K值减2乘以D值(3K-2D=J),其目的是求出K值与D值的最大乖离程度,以领先KD值找出底部和头部。J大于100时为超买,小于10时为超卖。 + """, + "dic": ["close","kdjk","kdjd","kdjj"] + }, { + "title": "7,SMA指标", + "desc": """ + http://wiki.mbalib.com/wiki/Sma + 简单移动平均线(Simple Moving Average,SMA) + 可以动态输入参数,获得几天的移动平均。 + """, + "dic": ["close","close_5_sma","close_10_sma"] + }, { + "title": "8,MACD指标", + "desc": """ + http://wiki.mbalib.com/wiki/MACD + 平滑异同移动平均线(Moving Average Convergence Divergence,简称MACD指标),也称移动平均聚散指标 + MACD + stock["macd"] + MACD signal line + stock["macds"] + MACD histogram + stock["macdh"] + MACD技术分析,运用DIF线与MACD线之相交型态及直线棒高低点与背离现象,作为买卖讯号,尤其当市场股价走势呈一较为明确波段趋势时, + MACD 则可发挥其应有的功能,但当市场呈牛皮盘整格局,股价不上不下时,MACD买卖讯号较不明显。 + 当用MACD作分析时,亦可运用其他的技术分析指标如短期 K,D图形作为辅助工具,而且也可对买卖讯号作双重的确认。 + """, + "dic": ["close","macd","macds","macdh"] + }, { + "title": "9,BOLL指标", + "desc": """ + http://wiki.mbalib.com/wiki/BOLL + 布林线指标(Bollinger Bands) + bolling, including upper band and lower band + stock["boll"] + stock["boll_ub"] + stock["boll_lb"] + 1、当布林线开口向上后,只要股价K线始终运行在布林线的中轨上方的时候,说明股价一直处在一个中长期上升轨道之中,这是BOLL指标发出的持股待涨信号,如果TRIX指标也是发出持股信号时,这种信号更加准确。此时,投资者应坚决持股待涨。 + 2、当布林线开口向下后,只要股价K线始终运行在布林线的中轨下方的时候,说明股价一直处在一个中长期下降轨道之中,这是BOLL指标发出的持币观望信号,如果TRIX指标也是发出持币信号时,这种信号更加准确。此时,投资者应坚决持币观望。 + """, + "dic": ["close","boll","boll_ub","boll_lb"] + }, { + "title": "10,RSI指标", + "desc": """ + http://wiki.mbalib.com/wiki/RSI + 相对强弱指标(Relative Strength Index,简称RSI),也称相对强弱指数、相对力度指数 + 6 days RSI + stock["rsi_6"] + 12 days RSI + stock["rsi_12"] + (2)强弱指标保持高于50表示为强势市场,反之低于50表示为弱势市场。 + (3)强弱指标多在70与30之间波动。当六日指标上升到达80时,表示股市已有超买现象,如果一旦继续上升,超过90以上时,则表示已到严重超买的警戒区,股价已形成头部,极可能在短期内反转回转。 + (4)当六日强弱指标下降至20时,表示股市有超卖现象,如果一旦继续下降至10以下时则表示已到严重超卖区域,股价极可能有止跌回升的机会。 + """, + "dic": ["close","rsi_6","rsi_12"] + },{ + "title": "12,CCI指标", + "desc": """ + http://wiki.mbalib.com/wiki/%E9%A1%BA%E5%8A%BF%E6%8C%87%E6%A0%87 + 顺势指标又叫CCI指标,其英文全称为“Commodity Channel Index”, + 是由美国股市分析家唐纳德·蓝伯特(Donald Lambert)所创造的,是一种重点研判股价偏离度的股市分析工具。 + CCI, default to 14 days + stock["cci"] + 20 days CCI + stock["cci_20"] + 1、当CCI指标从下向上突破﹢100线而进入非常态区间时,表明股价脱离常态而进入异常波动阶段, + 中短线应及时买入,如果有比较大的成交量配合,买入信号则更为可靠。 + 2、当CCI指标从上向下突破﹣100线而进入另一个非常态区间时,表明股价的盘整阶段已经结束, + 将进入一个比较长的寻底过程,投资者应以持币观望为主。 + """, + "dic": ["close","cci","cci_20"] + } +] + + +# 批量添加数据。 +def batch_add(comp_list, stockStat): + for conf in indicators_dic: + logging.info(conf) + + comp_list.append(add_plot(stockStat, conf)) + + +# 增加画图方法 +def add_plot(stockStat, conf): + p_list = [] + logging.info("############################", type(conf["dic"])) + # 循环 多个line 信息。 + for key, val in enumerate(conf["dic"]): + logging.info(key) + logging.info(val) + + p1 = figure(width=1000, height=150, x_axis_type="datetime") + # add renderers + stockStat["date"] = pd.to_datetime(stockStat.index.values) + # ["volume","volume_delta"] + # 设置20个颜色循环,显示0 2 4 6 号序列。 + p1.line(stockStat["date"], stockStat[val], color=Category20[20][key * 2]) + + # Set date format for x axis 格式化。 + p1.xaxis.formatter = DatetimeTickFormatter( + hours=["%Y-%m-%d"], days=["%Y-%m-%d"], + months=["%Y-%m-%d"], years=["%Y-%m-%d"]) + # p1.xaxis.major_label_orientation = radians(30) #可以旋转一个角度。 + + p_list.append([p1]) + + gp = gridplot(p_list) + script, div = components(gp) + return { + "script": script, + "div": div, + "title": conf["title"], + "desc": conf["desc"] + } diff --git a/backend/web/dataTableHandler.py b/backend/web/dataTableHandler.py new file mode 100755 index 0000000..8b60e13 --- /dev/null +++ b/backend/web/dataTableHandler.py @@ -0,0 +1,224 @@ +#!/usr/local/bin/python3 +# -*- coding: utf-8 -*- + +import json +from tornado import gen +import libs.common as common +import libs.stock_web_dic as stock_web_dic +import web.base as webBase +import logging +import datetime + +# info 蓝色 云财经 +# success 绿色 +# danger 红色 东方财富 +# warning 黄色 +WEB_EASTMONEY_URL = u""" + 东财 + + 指标 + + 东研 + + + """ +# 和在dic中的字符串一致。字符串前面都不特别声明是u"" +eastmoney_name = "查看股票" + + +# 获得页面数据,进入页面中。 +class GetStockHtmlHandler(webBase.BaseHandler): + @gen.coroutine + def get(self): + name = self.get_argument("table_name", default=None, strip=False) + tableInfo = stock_web_dic.STOCK_WEB_DATA_MAP[name] + # self.uri_ = ("self.request.url:", self.request.uri) + # print self.uri_ + date_now = datetime.datetime.now() + date_now_str = date_now.strftime("%Y%m%d") + # 每天的 16 点前显示昨天数据。 + if date_now.hour < 16: + date_now_str = (date_now + datetime.timedelta(days=-1)).strftime("%Y%m%d") + + # try: + # # 增加columns 字段中的【查看股票 东方财富】 + # logging.info(eastmoney_name in tableInfo.column_names) + # if eastmoney_name in tableInfo.column_names: + # tmp_idx = tableInfo.column_names.index(eastmoney_name) + # logging.info(tmp_idx) + # try: + # # 防止重复插入数据。可能会报错。 + # tableInfo.columns.remove("eastmoney_url") + # except Exception as e: + # print("error :", e) + # tableInfo.columns.insert(tmp_idx, "eastmoney_url") + # except Exception as e: + # print("error :", e) + logging.info("####################GetStockHtmlHandlerEnd") + self.render("tableInfo.html", tableInfo=tableInfo, date_now=date_now_str, + pythonStockVersion=common.__version__, + leftMenu=webBase.GetLeftMenu(self.request.uri)) + + +# 获得股票数据内容。 +class GetStockDataHandler(webBase.BaseHandler): + def get(self): + + self.set_header('Content-Type', 'application/json;charset=UTF-8') + + logging.info("######################## GetStockDataHandler ########################") + # 获得分页参数。 + page_param = self.get_argument("page", default=0, strip=False) + limit_param = self.get_argument("limit", default=10, strip=False) + + name_param = self.get_argument("name", default="stock_zh_ah_name", strip=False) + type_param = self.get_argument("type", default=None, strip=False) + date_param = self.get_argument("date", default=None, strip=False) + code_param = self.get_argument("code", default=None, strip=False) + + logging.info(f"page param: {page_param}, {limit_param}, {type_param}, {date_param}, {code_param}") + + + if name_param == ":tableName": + obj = { + "code": 20000, + "message": "success", + "draw": 0, + "data": [] + } + # logging.info("####################") + # logging.info(obj) + self.write(json.dumps(obj)) + return + + + tableInfo = stock_web_dic.STOCK_WEB_DATA_MAP[name_param] + + + order_by_column = [] + order_by_dir = [] + # 支持多排序。使用shift+鼠标左键。 + for item, val in self.request.arguments.items(): + # logging.info("item: %s, val: %s" % (item, val) ) + if str(item).startswith("order["): + print("order:", item, ",val:", val[0]) + if str(item).startswith("order[") and str(item).endswith("[column]"): + order_by_column.append(int(val[0])) + if str(item).startswith("order[") and str(item).endswith("[dir]"): + order_by_dir.append(val[0].decode("utf-8")) # bytes转换字符串 + + search_by_column = [] + search_by_data = [] + + # 返回search字段。 + for item, val in self.request.arguments.items(): + # logging.info("item: %s, val: %s" % (item, val)) + if str(item).startswith("columns[") and str(item).endswith("[search][value]"): + logging.info("item: %s, val: %s" % (item, val)) + str_idx = item.replace("columns[", "").replace("][search][value]", "") + int_idx = int(str_idx) + # 找到字符串 + str_val = val[0].decode("utf-8") + if str_val != "": # 字符串。 + search_by_column.append(tableInfo.columns[int_idx]) + search_by_data.append(val[0].decode("utf-8")) # bytes转换字符串 + + # 打印日志。 + search_sql = "" + search_idx = 0 + + logging.info("################# search_by_column #################") + + logging.info(search_by_column) + logging.info(search_by_data) + for item in search_by_column: + val = search_by_data[search_idx] + logging.info("idx: %s, column: %s, value: %s " % (search_idx, item, val)) + # 查询sql + if search_idx == 0: + search_sql = " WHERE `%s` = '%s' " % (item, val) + else: + search_sql = search_sql + " AND `%s` = '%s' " % (item, val) + search_idx = search_idx + 1 + + if date_param: + if "WHERE" not in search_sql: + search_sql += f" WHERE `date` = '{date_param}' " + else: + search_sql += f" AND `date` = '{date_param}' " + + if code_param: + if "WHERE" not in search_sql: + search_sql += f" WHERE `code` = '{code_param}' " + else: + search_sql += f" AND `code` = '{code_param}' " + + # print("tableInfo :", stock_web) + order_by_sql = "" + # 增加排序。 + if len(order_by_column) != 0 and len(order_by_dir) != 0: + order_by_sql = " ORDER BY " + idx = 0 + for key in order_by_column: + # 找到排序字段和dir。 + col_tmp = tableInfo.columns[key] + dir_tmp = order_by_dir[idx] + if idx != 0: + order_by_sql += " , %s %s" % (col_tmp, dir_tmp) + else: + order_by_sql += " %s %s" % (col_tmp, dir_tmp) + idx += 1 + # 查询数据库。 + limit_sql = "" + if int(limit_param) > 0: + start = ( int(page_param) - 1 ) * int(limit_param) + limit_sql = f" LIMIT {start} , {limit_param} " + sql = " SELECT * FROM `%s` %s %s %s " % ( + tableInfo.table_name, search_sql, order_by_sql, limit_sql) + count_sql = " SELECT count(1) as num FROM `%s` %s " % (tableInfo.table_name, search_sql) + + logging.info("select sql : " + sql) + logging.info("count sql : " + count_sql) + stock_web_list = self.db.query(sql) + + stock_web_size = self.db.query(count_sql) + logging.info("tableInfoList size : %s " % stock_web_size) + + # 动态表格展示: + table_columns = [] + try: + tmp_len = len(tableInfo.columns) + logging.info("ableInfo.columns tmp_len : %s " % tmp_len) + # 循环数据,转换成对象,放入到数组中,方便前端 vue table 循环使用。 + for tmp_idx in range(0, tmp_len): + logging.info(tmp_idx) + + column = tableInfo.columns[tmp_idx] + column_name = tableInfo.column_names[tmp_idx] + + tpm_column_obj = { + "column": column, + "columnName" : column_name + } + table_columns.append(tpm_column_obj) + + except Exception as e: + print("error :", e) + + obj = { + "code": 20000, + "message": "success", + "draw": 0, + "tableName" : tableInfo.name, + "tableColumns": table_columns, + "total": stock_web_size[0]["num"], + "recordsTotal": stock_web_size[0]["num"], + "recordsFiltered": stock_web_size[0]["num"], + "data": stock_web_list + } + # logging.info("####################") + # logging.info(obj) + self.write(json.dumps(obj)) diff --git a/backend/web/demo-chart.py b/backend/web/demo-chart.py new file mode 100644 index 0000000..12bef64 --- /dev/null +++ b/backend/web/demo-chart.py @@ -0,0 +1,244 @@ +""" +This example demonstrates how to embed matplotlib WebAgg interactive +plotting in your own web application and framework. It is not +necessary to do all this if you merely want to display a plot in a +browser or use matplotlib's built-in Tornado-based server "on the +side". + +The framework being used must support web sockets. +""" + +import io + +try: + import tornado +except ImportError: + raise RuntimeError("This example requires tornado.") +import tornado.web +import tornado.httpserver +import tornado.ioloop +import tornado.websocket + +from matplotlib.backends.backend_webagg_core import ( + FigureManagerWebAgg, new_figure_manager_given_figure) +from matplotlib.figure import Figure + +import numpy as np + +import json + + +def create_figure(): + """ + Creates a simple example figure. + """ + fig = Figure() + a = fig.add_subplot(111) + t = np.arange(0.0, 3.0, 0.01) + s = np.sin(2 * np.pi * t) + a.plot(t, s) + return fig + + +# The following is the content of the web page. You would normally +# generate this using some sort of template facility in your web +# framework, but here we just use Python string formatting. +html_content = """ + + + + + + + + + + + + + + matplotlib + + + +
+
+ + +""" + + +class MyApplication(tornado.web.Application): + class MainPage(tornado.web.RequestHandler): + """ + Serves the main HTML page. + """ + + def get(self): + manager = self.application.manager + ws_uri = "ws://{req.host}/".format(req=self.request) + content = html_content % { + "ws_uri": ws_uri, "fig_id": manager.num} + self.write(content) + + class MplJs(tornado.web.RequestHandler): + """ + Serves the generated matplotlib javascript file. The content + is dynamically generated based on which toolbar functions the + user has defined. Call `FigureManagerWebAgg` to get its + content. + """ + + def get(self): + self.set_header('Content-Type', 'application/javascript') + js_content = FigureManagerWebAgg.get_javascript() + + self.write(js_content) + + class Download(tornado.web.RequestHandler): + """ + Handles downloading of the figure in various file formats. + """ + + def get(self, fmt): + manager = self.application.manager + + mimetypes = { + 'ps': 'application/postscript', + 'eps': 'application/postscript', + 'pdf': 'application/pdf', + 'svg': 'image/svg+xml', + 'png': 'image/png', + 'jpeg': 'image/jpeg', + 'tif': 'image/tiff', + 'emf': 'application/emf' + } + + self.set_header('Content-Type', mimetypes.get(fmt, 'binary')) + + buff = io.BytesIO() + manager.canvas.print_figure(buff, format=fmt) + self.write(buff.getvalue()) + + class WebSocket(tornado.websocket.WebSocketHandler): + """ + A websocket for interactive communication between the plot in + the browser and the server. + + In addition to the methods required by tornado, it is required to + have two callback methods: + + - ``send_json(json_content)`` is called by matplotlib when + it needs to send json to the browser. `json_content` is + a JSON tree (Python dictionary), and it is the responsibility + of this implementation to encode it as a string to send over + the socket. + + - ``send_binary(blob)`` is called to send binary image data + to the browser. + """ + supports_binary = True + + def open(self): + # Register the websocket with the FigureManager. + manager = self.application.manager + manager.add_web_socket(self) + if hasattr(self, 'set_nodelay'): + self.set_nodelay(True) + + def on_close(self): + # When the socket is closed, deregister the websocket with + # the FigureManager. + manager = self.application.manager + manager.remove_web_socket(self) + + def on_message(self, message): + # The 'supports_binary' message is relevant to the + # websocket itself. The other messages get passed along + # to matplotlib as-is. + + # Every message has a "type" and a "figure_id". + message = json.loads(message) + if message['type'] == 'supports_binary': + self.supports_binary = message['value'] + else: + manager = self.application.manager + manager.handle_json(message) + + def send_json(self, content): + self.write_message(json.dumps(content)) + + def send_binary(self, blob): + if self.supports_binary: + self.write_message(blob, binary=True) + else: + data_uri = "data:image/png;base64,{0}".format( + blob.encode('base64').replace('\n', '')) + self.write_message(data_uri) + + def __init__(self, figure): + self.figure = figure + self.manager = new_figure_manager_given_figure( + id(figure), figure) + + super(MyApplication, self).__init__([ + # Static files for the CSS and JS + (r'/_static/(.*)', + tornado.web.StaticFileHandler, + {'path': FigureManagerWebAgg.get_static_file_path()}), + + # The page that contains all of the pieces + ('/', self.MainPage), + + ('/mpl.js', self.MplJs), + + # Sends images and events to the browser, and receives + # events from the browser + ('/ws', self.WebSocket), + + # Handles the downloading (i.e., saving) of static images + (r'/download.([a-z0-9.]+)', self.Download), + ], debug=True) + + +if __name__ == "__main__": + figure = create_figure() + application = MyApplication(figure) + http_server = tornado.httpserver.HTTPServer(application) + http_server.listen(9999) + + print("http://127.0.0.1:9090/") + print("Press Ctrl+C to quit") + + tornado.ioloop.IOLoop.instance().start() diff --git a/backend/web/main.py b/backend/web/main.py new file mode 100755 index 0000000..bef8cfb --- /dev/null +++ b/backend/web/main.py @@ -0,0 +1,175 @@ +#!/usr/local/bin/python3 +# -*- coding: utf-8 -*- + +import os.path +import torndb +import tornado.escape +from tornado import gen +import tornado.httpserver +import tornado.ioloop +import tornado.options +import libs.common as common +import libs.stock_web_dic as stock_web_dic +import web.dataTableHandler as dataTableHandler +import web.dataEditorHandler as dataEditorHandler +import web.dataIndicatorsHandler as dataIndicatorsHandler +import web.base as webBase +import pandas as pd +import numpy as np +import akshare as ak +import bokeh as bh +import sqlalchemy +import json + +class Application(tornado.web.Application): + def __init__(self): + handlers = [ + # 设置路由 + (r"/", HomeHandler), + (r"/stock/", HomeHandler), + (r"/api/v1/package_verison", PackageVersionHandler),# 包版本 + (r"/api/v1/menu_list", MenuListHandler), # 菜单接口 + (r"/test_akshare", TestHandler),# 测试页面,做写js 测试。 + (r"/test2", Test2Handler),# 测试页面,做写js 测试。 + # 使用datatable 展示报表数据模块。 + (r"/api/v1/api_data", dataTableHandler.GetStockDataHandler), + (r"/stock/data", dataTableHandler.GetStockHtmlHandler), + # 数据修改dataEditor。 + (r"/data/editor", dataEditorHandler.GetEditorHtmlHandler), + (r"/data/editor/save", dataEditorHandler.SaveEditorHandler), + # 获得股票指标数据。 + (r"/api/v1/data/indicators", dataIndicatorsHandler.GetDataIndicatorsHandler), + ] + settings = dict( # 配置 + template_path=os.path.join(os.path.dirname(__file__), "templates"), + static_path=os.path.join(os.path.dirname(__file__), "static"), + xsrf_cookies=False, # True, + # cookie加密 + cookie_secret="027bb1b670eddf0392cdda8709268a17b58b7", + debug=True, + default_encoding="utf-8", + ) + super(Application, self).__init__(handlers, **settings) + # Have one global connection to the blog DB across all handlers + self.db = torndb.Connection( + charset="utf8", max_idle_time=3600, connect_timeout=1000, + host=common.MYSQL_HOST, database=common.MYSQL_DB, + user=common.MYSQL_USER, password=common.MYSQL_PWD) + + +# 获得包版本 handler。 +class PackageVersionHandler(webBase.BaseHandler): + @gen.coroutine + def get(self): + pandasVersion = pd.__version__ + numpyVersion = np.__version__ + sqlalchemyVersion = sqlalchemy.__version__ + akshareVersion = ak.__version__ + bokehVersion = bh.__version__ + # 返回包的版本信息。 + obj = { + "code": 20000, + "message": "success", + "pandasVersion" : pandasVersion, + "numpyVersion" : numpyVersion, + "sqlalchemyVersion" : sqlalchemyVersion, + "akshareVersion" : akshareVersion, + "bokehVersion" : bokehVersion, + "stockstatsVersion": "0.3.2" + } + # logging.info("####################") + # logging.info(obj) + self.write(json.dumps(obj)) + + +# 获得菜单列表数据 handler。 +class MenuListHandler(webBase.BaseHandler): + @gen.coroutine + def get(self): + + leftMenuList = stock_web_dic.STOCK_WEB_DATA_LIST + out_data = [] + menu_name = '' + menu_children = [] + index = 0 + for table_info in leftMenuList: + print(table_info.name) + index = index + 1 + # 使用 children 作为二级菜单。 + tmp_menu = { + "name": table_info.name, + "path": "/stock/table/" + table_info.table_name + } + menu_children.append(tmp_menu) + + # 使用 type作为 一级目录 + if menu_name != table_info.type or index == len(leftMenuList): + # 进行数据循环 + if menu_name != '' : + if index != len(leftMenuList): + menu_children.pop() # 删除当前的节点信息。 + tmp_children = list(menu_children) + tmp_menu2 = { + "name": menu_name, + "path": "#", + "children": tmp_children + } + # 下一个数据清空和放置。 + menu_children = [] + menu_children.append(tmp_menu) + + out_data.append(tmp_menu2) + menu_name = table_info.type + + obj = { + "code": 20000, + "message": "success", + "data": out_data + } + print(out_data) + # self.write(json.dumps(o + self.write(json.dumps(obj)) + + +# 首页handler。 +class HomeHandler(webBase.BaseHandler): + @gen.coroutine + def get(self): + print("################## index.html ##################") + pandasVersion = pd.__version__ + numpyVersion = np.__version__ + akshareVersion = ak.__version__ + bokehVersion = bh.__version__ + #stockstatsVersion = ss.__version__ # 没有这个函数,但是好久不更新了 + # https://github.com/jealous/stockstats + self.render("index.html", pandasVersion=pandasVersion, numpyVersion=numpyVersion, + akshareVersion=akshareVersion, bokehVersion=bokehVersion, + stockstatsVersion="0.3.2", + pythonStockVersion = common.__version__, + leftMenu=webBase.GetLeftMenu(self.request.uri)) +class TestHandler(webBase.BaseHandler): + @gen.coroutine + def get(self): + self.render("test_akshare.html", entries="hello", + pythonStockVersion=common.__version__, + leftMenu=webBase.GetLeftMenu(self.request.uri)) +class Test2Handler(webBase.BaseHandler): + @gen.coroutine + def get(self): + self.render("test2.html", entries="hello", + pythonStockVersion=common.__version__, + leftMenu=webBase.GetLeftMenu(self.request.uri)) + +def main(): + tornado.options.parse_command_line() + http_server = tornado.httpserver.HTTPServer(Application()) + port = 9090 + http_server.listen(port) + # tornado.options.options.logging = "debug" + tornado.options.parse_command_line() + + tornado.ioloop.IOLoop.current().start() + + +if __name__ == "__main__": + main() diff --git a/backend/web/minstServingHandler.py b/backend/web/minstServingHandler.py new file mode 100755 index 0000000..faf484c --- /dev/null +++ b/backend/web/minstServingHandler.py @@ -0,0 +1,80 @@ +#!/usr/local/bin/python3 +# -*- coding: utf-8 -*- +import os.path +import json +import subprocess +import torndb +import tornado.escape +from tornado import gen +import tornado.httpserver +import tornado.ioloop +import tornado.options +import tornado.web +import web.base as webBase +import logging +import numpy as np +from PIL import Image +from PIL import ImageOps +import base64 +import io #python2 import StringIO + +work_dir = "/data/stock/tf/minst_serving/input_data" +out_dir = "/static/img/minst_serving/%s.bmp" + + +# 获得页面数据。 +class GetMinstServingHtmlHandler(webBase.BaseHandler): + @gen.coroutine + def get(self): + # print self.uri_ + arr = np.arange(30) + image_array = [] + for idx in arr: + out_file = out_dir % ("%05d" % idx) + print(out_file) + image_array.append(out_file) + self.render("minst_serving.html", image_array=image_array) + + +# 获得股票数据内容。 +class GetPredictionDataHandler(webBase.BaseHandler): + def get(self): + # 获得分页参数。 + img_url = self.get_argument("img_url", default=0, strip=False) + print(img_url) + img_obj = Image.open("/data/stock/web" + img_url) + print("img_obj", img_obj) + server = "0.0.0.0:8500" + prediction = do_inference(server, img_obj) + print('######### prediction : ', prediction) + self.write(json.dumps(prediction)) + + +# 获得股票数据内容。 +class GetPrediction2DataHandler(webBase.BaseHandler): + def post(self): + # 获得分页参数。 + imgStr = self.get_argument("txt", default="", strip=False) + # imgStr.replace(" ", "+") + imgStr = base64.b64decode(imgStr) + print("imgStr:", type(imgStr)) + image = Image.open(io.StringIO(imgStr)) + image.thumbnail((28, 28), Image.ANTIALIAS) + image = image.convert('L') + image = ImageOps.invert(image) + image.save(work_dir + "/web-tmp.bmp", format="BMP") #保存看看,是否 + #print(image) + # img_url = self.get_argument("img_url", default=0, strip=False) + # print(img_url) + server = "0.0.0.0:8500" + prediction = do_inference(server, image) + print('######### prediction : ', prediction) + self.write(json.dumps(prediction)) + + + +# 调用 grpc 代码,将图片转换成数组,让后放到 grpc 调用。 +def do_inference(hostport, img_obj): + + print("############", hostport) + diff --git a/backend/web/static/css/ace.min.css b/backend/web/static/css/ace.min.css new file mode 100755 index 0000000..a70d486 --- /dev/null +++ b/backend/web/static/css/ace.min.css @@ -0,0 +1 @@ +.main-content,body,html{min-height:100%}.alert,.well{border-radius:0}.nav-list>li .submenu>li>a:hover,.nav-list>li>a,a:active,a:focus{text-decoration:none}html{position:relative}body{background-color:#E4E6E9;padding-bottom:0;font-family:'Open Sans';font-size:13px;color:#393939;line-height:1.5}h1,h2,h3,h4,h5,h6{font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif}.main-container:before{display:block;content:"";position:absolute;z-index:-2;width:100%;max-width:inherit;bottom:0;top:0;background-color:#FFF}.main-container.container,.rtl .main-container.container{padding-left:0;padding-right:0}.main-container.container:before{-webkit-box-shadow:0 0 0 1px rgba(0,0,0,.1);box-shadow:0 0 0 1px rgba(0,0,0,.1);width:inherit}@media (max-width:767px){.main-container.container:before{-webkit-box-shadow:none;box-shadow:none;width:100%}}.main-content{margin-left:0;padding:0}.main-content:after,.main-content:before{content:" ";display:table}.nav-list li.active>a:after,.nav-list>li:before,.nav-list>li>.submenu:before,.nav-list>li>.submenu>li:before,.sidebar .sidebar-toggle:before,.sidebar.menu-min .nav-list>li>.submenu:after,.sidebar:before,li.divider:before{content:""}.main-content:after{clear:both}.sidebar+.main-content{margin-left:190px}.page-content{background-color:#FFF;position:relative;margin:0;padding:8px 20px 24px}.page-header{margin:0 0 12px;border-bottom:1px dotted #E2E2E2;padding-bottom:16px;padding-top:7px}.page-header h1{padding:0;margin:0 8px;font-size:24px;font-weight:lighter;color:#2679B5}h1,h2,h3,h4,h5,h6{font-weight:400}.page-header h1 small{margin:0 6px;font-size:14px;font-weight:400;color:#8089A0}h1.block,h2.block,h3.block,h4.block,h5.block,h6.block{margin-bottom:16px}.ajax-loading-overlay{position:absolute;z-index:1999;left:0;right:0;top:0;bottom:0;background-color:rgba(255,255,255,.5);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#80FFFFFF', endColorstr='#80FFFFFF', GradientType=0 )}.ajax-loading-overlay>.ajax-loading-icon{position:relative;left:8px;top:8px}.ajax-loading-overlay.content-loaded{background-color:rgba(255,255,255,.4);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#66FFFFFF', endColorstr='#66FFFFFF', GradientType=0 )}.ajax-loading-overlay.almost-loaded{background-color:rgba(255,255,255,.3);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#4CFFFFFF', endColorstr='#4CFFFFFF', GradientType=0 )}.ajax-loading-overlay.ajax-overlay-body{position:fixed;z-index:2999}.ajax-loading-overlay.ajax-overlay-body>.ajax-loading-icon{left:8px;top:8px}.ace-icon{text-align:center}h1{font-size:32px}h1.smaller{font-size:31px}h1.bigger{font-size:33px}h2{font-size:26px}h2.smaller{font-size:25px}h2.bigger{font-size:27px}h3{font-size:22px}h3.smaller{font-size:21px}h3.bigger{font-size:23px}h4{font-size:18px}h4.smaller{font-size:17px}h4.bigger{font-size:19px}h5{font-size:15px}h5.smaller{font-size:14px}h5.bigger{font-size:16px}h6{font-size:13px}h6.smaller{font-size:12px}h6.bigger{font-size:14px}ol,ul{padding:0;margin:0 0 10px 25px}ol.margin-5,ul.margin-5{margin-left:5px}ol.margin-10,ul.margin-10{margin-left:10px}ol.margin-15,ul.margin-15{margin-left:15px}ol.margin-20,ul.margin-20{margin-left:20px}li>ol,li>ul{margin-left:18px}.list-inline,.list-unstyled{margin-left:0}.list-inline>li>.ace-icon:first-child,.list-unstyled>li>.ace-icon:first-child{width:18px;text-align:center}.spaced>li{margin-top:9px;margin-bottom:9px}.spaced2>li{margin-top:15px;margin-bottom:15px}li.divider{margin-top:3px;margin-bottom:3px;height:0;font-size:0}.spaced>li.divider{margin-top:5px;margin-bottom:5px}.spaced2>li.divider{margin-top:8px;margin-bottom:8px}li.divider:before{display:inline-block}.blockquote-reverse,blockquote,blockquote.pull-right{border-color:#E5EAF1}pre.prettyprint{white-space:pre-wrap}.well h1,.well h2,.well h3,.well h4,.well h5,.well h6{margin-top:0}.well h1,.well h2,.well h3{line-height:36px}.alert{font-size:14px}.list-group-item,.no-radius,.pager>li>a,.pagination>li>a{border-radius:0!important}.alert .close{font-size:16px}.alert-block p+p{margin-top:10px}.pager>li>span,.pagination>li>span{border-width:1px;border-radius:0!important}.pager>li>a,.pagination>li>a{border-width:1px;border-color:#d4dfe3;color:#2283C5;background-color:#FAFAFA;margin:0 -1px 0 0;position:relative;z-index:auto}.pager>li>a:hover,.pagination>li>a:hover{color:#1c6ca2;background-color:#EAEFF2;border-color:#c1d1d7;z-index:1}.pager>li>a:focus,.pagination>li>a:focus{background-color:#eaeef2}.pager>li.disabled>a,.pager>li.disabled>a:hover,.pagination>li.disabled>a,.pagination>li.disabled>a:hover{background-color:#F9F9F9;border-color:#D9D9D9;z-index:auto}.pagination>li.active>a,.pagination>li.active>a:focus,.pagination>li.active>a:hover{background-color:#6FAED9;border-color:#6FAED9;color:#FFF;text-shadow:0 -1px 0 rgba(0,0,0,.25);z-index:2}.list-group{margin-left:auto}.lighter{font-weight:lighter}.bolder{font-weight:bolder}.inline{display:inline-block!important}.block{display:block!important}.align-center,.center{text-align:center!important}.align-left{text-align:left!important}.align-right{text-align:right!important}.align-justify{text-align:justify}.middle{vertical-align:middle}.align-middle{vertical-align:middle!important}.align-top{vertical-align:top!important}.align-bottom{vertical-align:bottom!important}.pos-rel,.position-relative{position:relative}.pos-abs,.position-absolute{position:absolute}.no-float{float:none!important}.line-height-normal{line-height:normal!important}.line-height-0{line-height:0!important}.line-height-1{line-height:1!important}.line-height-125{line-height:1.25!important}.line-height-150{line-height:1.5!important}.dark{color:#333!important}.white{color:#FFF!important}.red{color:#DD5A43!important}.red2{color:#E08374!important}.light-red{color:#F77!important}.blue{color:#478FCA!important}.light-blue{color:#93CBF9!important}.green{color:#69AA46!important}.light-green{color:#B0D877!important}.orange{color:#FF892A!important}.orange2{color:#FEB902!important}.light-orange{color:#FCAC6F!important}.purple{color:#A069C3!important}.pink{color:#C6699F!important}.pink2{color:#D6487E!important}.brown{color:brown!important}.grey{color:#777!important}.light-grey{color:#BBB!important}.bigger-110{font-size:110%!important}.bigger-120{font-size:120%!important}.bigger-130{font-size:130%!important}.bigger-140{font-size:140%!important}.bigger-150{font-size:150%!important}.bigger-160{font-size:160%!important}.bigger-170{font-size:170%!important}.bigger-180{font-size:180%!important}.bigger-190{font-size:190%!important}.bigger-200{font-size:200%!important}.bigger-210{font-size:210%!important}.bigger-220{font-size:220%!important}.bigger-230{font-size:230%!important}.bigger-240{font-size:240%!important}.bigger-250{font-size:250%!important}.bigger-260{font-size:260%!important}.bigger-270{font-size:270%!important}.bigger-280{font-size:280%!important}.bigger-290{font-size:290%!important}.bigger-300{font-size:300%!important}.bigger-115{font-size:115%!important}.bigger-125{font-size:125%!important}.bigger-175{font-size:175%!important}.bigger-225{font-size:225%!important}.bigger-275{font-size:275%!important}.smaller-90{font-size:90%!important}.smaller-80{font-size:80%!important}.smaller-70{font-size:70%!important}.smaller-60{font-size:60%!important}.smaller-50{font-size:50%!important}.smaller-40{font-size:40%!important}.smaller-30{font-size:30%!important}.smaller-20{font-size:20%!important}.smaller-75{font-size:75%!important}.width-20{width:20%!important}.width-30{width:30%!important}.width-35{width:35%!important}.width-40{width:40%!important}.width-45{width:45%!important}.width-50{width:50%!important}.width-55{width:55%!important}.width-60{width:60%!important}.width-65{width:65%!important}.width-70{width:70%!important}.width-80{width:80%!important}.width-85{width:85%!important}.width-90{width:90%!important}.width-95{width:95%!important}.width-100{width:100%!important}.width-75{width:75%!important}.width-25{width:25%!important}.width-auto{width:auto!important}.height-auto{height:auto!important}.no-padding{padding:0!important}.no-padding-bottom{padding-bottom:0!important}.no-padding-top{padding-top:0!important}.no-padding-left{padding-left:0!important}.no-padding-right{padding-right:0!important}.no-margin{margin:0!important}.no-margin-bottom{margin-bottom:0!important}.no-margin-top{margin-top:0!important}.no-margin-left{margin-left:0!important}.no-margin-right{margin-right:0!important}.no-border{border-width:0}.no-border-bottom{border-bottom-width:0}.no-border-top{border-top-width:0}.no-border-left{border-left-width:0}.no-border-right{border-right-width:0}.overflow-hidden{overflow:hidden!important}.overflow-scroll{overflow-x:hidden!important;overflow-y:scroll!important}.no-text-shadow{text-shadow:none!important}.hr{display:block;height:0;overflow:hidden;font-size:0;border-width:1px 0 0;border-top:1px solid #E3E3E3;margin:12px 0;border-top-color:rgba(0,0,0,.11)}.hr-double{height:3px;border-top:1px solid #E3E3E3;border-bottom:1px solid #E3E3E3;border-top-color:rgba(0,0,0,.11);border-bottom-color:rgba(0,0,0,.11)}.hr-dotted,.hr.dotted{border-style:dotted}.hr-32,.hr32{margin:32px 0}.hr-30,.hr30{margin:30px 0}.hr-28,.hr28{margin:28px 0}.hr-26,.hr26{margin:26px 0}.hr-24,.hr24{margin:24px 0}.hr-22,.hr22{margin:22px 0}.hr-20,.hr20{margin:20px 0}.hr-18,.hr18{margin:18px 0}.hr-16,.hr16{margin:16px 0}.hr-14,.hr14{margin:14px 0}.hr-12,.hr12{margin:12px 0}.hr-10,.hr10{margin:10px 0}.hr-8,.hr8{margin:8px 0}.hr-6,.hr6{margin:6px 0}.hr-4,.hr4{margin:4px 0}.hr-2,.hr2{margin:2px 0}.space{max-height:1px;min-height:1px;overflow:hidden;margin:12px 0}[class*=vspace-]{display:none}.space-32,[class*=vspace-32]{max-height:1px;min-height:1px;overflow:hidden;margin:32px 0 31px}.space-30,[class*=vspace-30]{max-height:1px;min-height:1px;overflow:hidden;margin:30px 0 29px}.space-28,[class*=vspace-28]{max-height:1px;min-height:1px;overflow:hidden;margin:28px 0 27px}.space-26,[class*=vspace-26]{max-height:1px;min-height:1px;overflow:hidden;margin:26px 0 25px}.space-24,[class*=vspace-24]{max-height:1px;min-height:1px;overflow:hidden;margin:24px 0 23px}.space-22,[class*=vspace-22]{max-height:1px;min-height:1px;overflow:hidden;margin:22px 0 21px}.space-20,[class*=vspace-20]{max-height:1px;min-height:1px;overflow:hidden;margin:20px 0 19px}.space-18,[class*=vspace-18]{max-height:1px;min-height:1px;overflow:hidden;margin:18px 0 17px}.space-16,[class*=vspace-16]{max-height:1px;min-height:1px;overflow:hidden;margin:16px 0 15px}.space-14,[class*=vspace-14]{max-height:1px;min-height:1px;overflow:hidden;margin:14px 0 13px}.space-12,[class*=vspace-12]{max-height:1px;min-height:1px;overflow:hidden;margin:12px 0 11px}.space-10,[class*=vspace-10]{max-height:1px;min-height:1px;overflow:hidden;margin:10px 0 9px}.space-8,[class*=vspace-8]{max-height:1px;min-height:1px;overflow:hidden;margin:8px 0 7px}.space-6,[class*=vspace-6]{max-height:1px;min-height:1px;overflow:hidden;margin:6px 0 5px}.space-4,[class*=vspace-4]{max-height:1px;min-height:1px;overflow:hidden;margin:4px 0 3px}.space-2,[class*=vspace-2]{max-height:1px;min-height:1px;overflow:hidden;margin:2px 0 1px}.space-0,[class*=vspace-0]{max-height:1px;min-height:1px;overflow:hidden;margin:0}@media only screen and (max-width:479px){[class*=vspace-][class*="-xs"]{display:block}}@media only screen and (max-width:767px){[class*=vspace-][class*="-sm"]{display:block}}@media only screen and (max-width:991px){[class*=vspace-][class*="-md"]{display:block}}@media only screen and (max-width:1199px){[class*=vspace-][class*="-lg"]{display:block}}.header{line-height:28px;margin-bottom:16px;margin-top:18px;padding-bottom:4px;border-bottom:1px solid #CCC}.header.less-margin{margin-top:10px;margin-bottom:10px}.header.blue{border-bottom-color:#d5e3ef}.header.green{border-bottom-color:#cce2c1}.header.purple{border-bottom-color:#e0d1ea}.header.orange{border-bottom-color:#fdd0ac}.header.orange2{border-bottom-color:#fbd36b}.header.red{border-bottom-color:#f3cdc6}.header.grey{border-bottom-color:#c3c3c3}.header.pink{border-bottom-color:#f2e0eb}.header.pink2{border-bottom-color:#e69eb9}.header.light-blue{border-bottom-color:#dceefc}.header.light-red{border-bottom-color:#fec5c5}.header.light-green{border-bottom-color:#d2e7b5}.header.brown{border-bottom-color:#df9393}.header>.ace-icon{margin-right:2px}.action-buttons a{margin:0 3px;display:inline-block;opacity:.85;-webkit-transition:all .1s;-o-transition:all .1s;transition:all .1s}.action-buttons a:hover{text-decoration:none;opacity:1;-moz-transform:scale(1.2);-webkit-transform:scale(1.2);-o-transform:scale(1.2);-ms-transform:scale(1.2);transform:scale(1.2)}.navbar{margin:0;padding-left:0;padding-right:0;border-width:0;border-radius:0;-webkit-box-shadow:none;box-shadow:none;min-height:45px;background:#438EB9}.navbar .navbar-link,.navbar .navbar-text{color:#FFF}.navbar .navbar-brand{color:#FFF;font-size:24px;text-shadow:none;padding-top:10px;padding-bottom:10px;height:auto}.navbar .navbar-brand:focus,.navbar .navbar-brand:hover{color:#FFF}@media only screen and (min-width:992px){.navbar-container{padding-left:10px;padding-right:10px}}.navbar-container.container{padding-left:0;padding-right:0}.ace-nav{height:100%;margin:0!important}.ace-nav>li{line-height:45px;height:45px;border-left:1px solid #E1E1E1;padding:0;position:relative;float:left}.ace-nav>li:first-child{border-left-width:0}.ace-nav>li>a{background-color:#2E6589;color:#FFF;display:block;line-height:inherit;text-align:center;height:100%;width:auto;min-width:50px;padding:0 8px;position:relative}.ace-nav>li>a>.ace-icon{display:inline-block;font-size:16px;color:#FFF;text-align:center;width:20px}.ace-nav>li>a>.badge{position:relative;top:-4px;left:2px;padding-right:5px;padding-left:5px}.ace-nav>li.open>a,.ace-nav>li>a:focus,.ace-nav>li>a:hover{background-color:#2c5976;color:#FFF}.ace-nav>li.blue>a{background-color:#2E6589}.ace-nav>li.blue>a:focus,.ace-nav>li.blue>a:hover,.ace-nav>li.open.blue>a{background-color:#2c5976}.ace-nav>li.grey>a{background-color:#555}.ace-nav>li.grey>a:focus,.ace-nav>li.grey>a:hover,.ace-nav>li.open.grey>a{background-color:#4b4b4b}.ace-nav>li.purple>a{background-color:#892E65}.ace-nav>li.open.purple>a,.ace-nav>li.purple>a:focus,.ace-nav>li.purple>a:hover{background-color:#762c59}.ace-nav>li.green>a{background-color:#2E8965}.ace-nav>li.green>a:focus,.ace-nav>li.green>a:hover,.ace-nav>li.open.green>a{background-color:#2c7659}.ace-nav>li.light-blue>a{background-color:#62A8D1}.ace-nav>li.light-blue>a:focus,.ace-nav>li.light-blue>a:hover,.ace-nav>li.open.light-blue>a{background-color:#579ec8}.ace-nav>li.light-blue2>a{background-color:#42A8E1}.ace-nav>li.light-blue2>a:focus,.ace-nav>li.light-blue2>a:hover,.ace-nav>li.open.light-blue2>a{background-color:#359fd9}.ace-nav>li.red>a{background-color:#B74635}.ace-nav>li.open.red>a,.ace-nav>li.red>a:focus,.ace-nav>li.red>a:hover{background-color:#a34335}.ace-nav>li.light-green>a{background-color:#9ABC32}.ace-nav>li.light-green>a:focus,.ace-nav>li.light-green>a:hover,.ace-nav>li.open.light-green>a{background-color:#8ba832}.ace-nav>li.light-purple>a{background-color:#CB6FD7}.ace-nav>li.light-purple>a:focus,.ace-nav>li.light-purple>a:hover,.ace-nav>li.open.light-purple>a{background-color:#c263ce}.ace-nav>li.light-orange>a{background-color:#F79263}.ace-nav>li.light-orange>a:focus,.ace-nav>li.light-orange>a:hover,.ace-nav>li.open.light-orange>a{background-color:#f28653}.ace-nav>li.light-pink>a{background-color:#F4DAE5}.ace-nav>li.light-pink>a:focus,.ace-nav>li.light-pink>a:hover,.ace-nav>li.open.light-pink>a{background-color:#eeccda}.ace-nav>li.dark>a{background-color:#404040}.ace-nav>li.dark>a:focus,.ace-nav>li.dark>a:hover,.ace-nav>li.open.dark>a{background-color:#363636}.ace-nav>li.white-opaque>a{background-color:rgba(255,255,255,.8)}.ace-nav>li.open.white-opaque>a,.ace-nav>li.white-opaque>a:focus,.ace-nav>li.white-opaque>a:hover{background-color:rgba(245,245,245,.8)}.ace-nav>li.dark-opaque>a,.ace-nav>li.dark-opaque>a:focus,.ace-nav>li.dark-opaque>a:hover,.ace-nav>li.open.dark-opaque>a{background-color:rgba(0,0,0,.2)}.ace-nav>li.transparent>a{background-color:transparent}.ace-nav>li.open.transparent>a,.ace-nav>li.transparent>a:focus,.ace-nav>li.transparent>a:hover{background-color:rgba(0,0,0,.1)}.ace-nav>li.light-10>a{background-color:rgba(255,255,255,.1)}.ace-nav>li.light-10>a:focus,.ace-nav>li.light-10>a:hover,.ace-nav>li.open.light-10>a{background-color:rgba(255,255,255,.2)}.ace-nav>li.dark-10>a{background-color:rgba(0,0,0,.1)}.ace-nav>li.dark-10>a:focus,.ace-nav>li.dark-10>a:hover,.ace-nav>li.open.dark-10>a{background-color:rgba(0,0,0,.2)}.ace-nav>li.margin-4{margin-left:4px}.ace-nav>li.margin-3{margin-left:3px}.ace-nav>li.margin-2{margin-left:2px}.ace-nav>li.margin-1{margin-left:1px}.ace-nav>li.no-border{border-width:0!important}.ace-nav>li .dropdown-menu{z-index:1031}.ace-nav .nav-user-photo{margin:-4px 8px 0 0;border-radius:100%;border:2px solid #FFF;max-width:40px}.ace-nav li.dropdown-footer a .ace-icon{display:inline-block;width:1.25em;text-align:center}@media only screen and (max-height:540px){.ace-nav>li.dropdown-modal>.dropdown-menu{position:fixed;margin-top:auto;z-index:1052}.ace-nav>li.dropdown-modal>.dropdown-menu:after,.ace-nav>li.dropdown-modal>.dropdown-menu:before{display:none}.ace-nav>li.dropdown-modal>.user-menu>li>a{padding-top:6px;padding-bottom:6px}.ace-nav>li.dropdown-modal.open:before{background-color:#000;opacity:.5;border-width:0;position:fixed;left:0;right:0;top:0;bottom:0;content:"";display:block;height:2000px;width:auto;z-index:1051}}@media only screen and (max-width:767px){.ace-nav>li:nth-last-child(4)>.dropdown-menu.dropdown-menu-right{right:-100px}.ace-nav>li:nth-last-child(4)>.dropdown-menu.dropdown-menu-right:after,.ace-nav>li:nth-last-child(4)>.dropdown-menu.dropdown-menu-right:before{right:120px}.ace-nav>li:nth-last-child(3)>.dropdown-menu.dropdown-menu-right{right:-80px}.ace-nav>li:nth-last-child(3)>.dropdown-menu.dropdown-menu-right:after,.ace-nav>li:nth-last-child(3)>.dropdown-menu.dropdown-menu-right:before{right:100px}.user-menu.dropdown-close.dropdown-menu-right{right:0!important}}@media only screen and (min-width:480px) and (max-width:767px){.navbar.navbar-collapse .ace-nav>li:nth-last-child(2):nth-child(1)>.dropdown-menu.dropdown-menu-right,.navbar.navbar-collapse .ace-nav>li:nth-last-child(2):nth-child(2)>.dropdown-menu.dropdown-menu-right{left:auto;right:-60px}.navbar.navbar-collapse .ace-nav>li:nth-last-child(2):nth-child(1)>.dropdown-menu.dropdown-menu-right:after,.navbar.navbar-collapse .ace-nav>li:nth-last-child(2):nth-child(1)>.dropdown-menu.dropdown-menu-right:before,.navbar.navbar-collapse .ace-nav>li:nth-last-child(2):nth-child(2)>.dropdown-menu.dropdown-menu-right:after,.navbar.navbar-collapse .ace-nav>li:nth-last-child(2):nth-child(2)>.dropdown-menu.dropdown-menu-right:before{right:80px;left:auto}}@media only screen and (max-width:480px){.ace-nav>li:nth-last-child(4)>.dropdown-menu.dropdown-menu-right{right:-120px}.ace-nav>li:nth-last-child(4)>.dropdown-menu.dropdown-menu-right:after,.ace-nav>li:nth-last-child(4)>.dropdown-menu.dropdown-menu-right:before{right:140px}.ace-nav>li:nth-last-child(3)>.dropdown-menu.dropdown-menu-right{right:-90px}.ace-nav>li:nth-last-child(3)>.dropdown-menu.dropdown-menu-right:after,.ace-nav>li:nth-last-child(3)>.dropdown-menu.dropdown-menu-right:before{right:110px}.ace-nav>li:nth-last-child(2)>.dropdown-menu.dropdown-menu-right{right:-50px}.ace-nav>li:nth-last-child(2)>.dropdown-menu.dropdown-menu-right:after,.ace-nav>li:nth-last-child(2)>.dropdown-menu.dropdown-menu-right:before{right:70px}}@media only screen and (max-width:479px){.ace-nav>li:nth-last-child(4)>.dropdown-menu.dropdown-menu-right{left:-10px;right:auto}.ace-nav>li:nth-last-child(4)>.dropdown-menu.dropdown-menu-right:after,.ace-nav>li:nth-last-child(4)>.dropdown-menu.dropdown-menu-right:before{right:auto;left:30px}.ace-nav>li:nth-last-child(3)>.dropdown-menu.dropdown-menu-right{left:-50px;right:auto}.ace-nav>li:nth-last-child(3)>.dropdown-menu.dropdown-menu-right:after,.ace-nav>li:nth-last-child(3)>.dropdown-menu.dropdown-menu-right:before{left:75px;right:auto}.ace-nav>li:nth-last-child(2)>.dropdown-menu.dropdown-menu-right{left:-70px;right:auto}.ace-nav>li:nth-last-child(2)>.dropdown-menu.dropdown-menu-right:after,.ace-nav>li:nth-last-child(2)>.dropdown-menu.dropdown-menu-right:before{left:90px;right:auto}.navbar:not(.navbar-collapse) .navbar-header{float:none!important;display:block}.navbar:not(.navbar-collapse) .ace-nav{display:block;float:none!important;text-align:center;background-color:rgba(0,0,0,.15);border:1px solid rgba(0,0,0,.1);border-width:1px 0 0;letter-spacing:-3px}.navbar:not(.navbar-collapse) .ace-nav>li{display:inline-block;float:none!important;text-align:left;letter-spacing:normal}.navbar:not(.navbar-collapse) .ace-nav>li:first-child{border-left:1px solid rgba(255,255,255,.4)}.navbar:not(.navbar-collapse) .ace-nav>li:last-child{border-right:1px solid rgba(255,255,255,.4)}}@media only screen and (max-width:319px){.ace-nav>li:nth-last-child(2)>.dropdown-menu.dropdown-menu-right{left:-110px;right:auto}.ace-nav>li:nth-last-child(2)>.dropdown-menu.dropdown-menu-right:after,.ace-nav>li:nth-last-child(2)>.dropdown-menu.dropdown-menu-right:before{left:130px;right:auto}.ace-nav>li:nth-child(2):nth-last-child(2)>.dropdown-menu.dropdown-menu-right{left:-85px;right:auto}.ace-nav>li:nth-child(2):nth-last-child(2)>.dropdown-menu.dropdown-menu-right:after,.ace-nav>li:nth-child(2):nth-last-child(2)>.dropdown-menu.dropdown-menu-right:before{left:105px;right:auto}.ace-nav>li:nth-child(1):nth-last-child(3)>.dropdown-menu.dropdown-menu-right{left:-35px;right:auto}.ace-nav>li:nth-child(1):nth-last-child(3)>.dropdown-menu.dropdown-menu-right:after,.ace-nav>li:nth-child(1):nth-last-child(3)>.dropdown-menu.dropdown-menu-right:before{left:55px;right:auto}.ace-nav>li:nth-child(1):nth-last-child(2)>.dropdown-menu.dropdown-menu-right{left:-60px;right:auto}.ace-nav>li:nth-child(1):nth-last-child(2)>.dropdown-menu.dropdown-menu-right:after,.ace-nav>li:nth-child(1):nth-last-child(2)>.dropdown-menu.dropdown-menu-right:before{left:75px;right:auto}.ace-nav>li>a{padding:0 5px!important}}.user-menu>li>a{padding:4px 12px}.user-menu>li>a>.ace-icon{margin-right:6px;font-size:120%}.user-info{max-width:100px;display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left;vertical-align:top;line-height:15px;position:relative;top:6px}.user-info small{display:block}@media (min-width:480px) and (max-width:540px),(max-width:360px){.navbar:not(.navbar-collapse) .navbar-buttons .user-menu{padding-top:42px!important}.navbar:not(.navbar-collapse) .navbar-buttons .nav-user-photo{margin-right:0}.navbar:not(.navbar-collapse) .navbar-buttons .user-info{position:absolute;margin-top:40px;margin-left:1px;right:2px;z-index:1032;color:#777;font-size:14px;width:156px;max-width:156px;padding-left:8px;padding-right:8px;height:32px;line-height:26px!important;display:none;border-bottom:1px solid #E5E5E5;text-align:center;vertical-align:none;cursor:text}.navbar:not(.navbar-collapse) .navbar-buttons .user-info>small{display:inline;opacity:1}li.open .user-info{display:inline-block!important}}@media (max-width:360px){.navbar.navbar-collapse .navbar-buttons .user-menu{padding-top:42px!important}.navbar.navbar-collapse .navbar-buttons .nav-user-photo{margin-right:0}.navbar.navbar-collapse .navbar-buttons .user-info{position:absolute;margin-top:40px;margin-left:1px;right:2px;z-index:1032;color:#777;font-size:14px;width:156px;max-width:156px;padding-left:8px;padding-right:8px;height:32px;line-height:26px!important;display:none;border-bottom:1px solid #E5E5E5;text-align:center;vertical-align:none;cursor:text}.navbar.navbar-collapse .navbar-buttons .user-info>small{display:inline;opacity:1}li.open .user-info{display:inline-block!important;right:2px}}@media (min-width:992px){.user-min .user-menu{padding-top:42px!important}.user-min .nav-user-photo{margin-right:0}.user-min .user-info{position:absolute;margin-top:40px;margin-left:1px;z-index:1032;color:#777;font-size:14px;width:156px;max-width:156px;padding-left:8px;padding-right:8px;height:32px;line-height:26px!important;display:none;border-bottom:1px solid #E5E5E5;text-align:center;vertical-align:none;cursor:text;right:-3px}.user-min .user-info>small{display:inline;opacity:1}.user-min.open .user-info{display:inline-block!important}}.btn,.dropdown-colorpicker a{cursor:pointer}@media (max-height:540px) and (min-width:480px) and (max-width:540px),(max-height:540px) and (max-width:360px){.navbar:not(.navbar-collapse) .ace-nav>li.dropdown-modal .user-info{position:fixed;right:auto;margin-top:auto;max-width:none}}@media (max-height:540px) and (max-width:360px){.navbar.navbar-collapse .ace-nav>li.dropdown-modal .user-info{position:fixed;right:auto;margin-top:auto;max-width:none}}@media (max-height:540px) and (min-width:992px){.ace-nav>li.dropdown-modal.user-min .user-info{position:fixed;right:auto;margin-top:auto;max-width:none}}@media only screen and (max-width:991px){.navbar.navbar-collapse{max-height:none}.navbar .navbar-collapse,.navbar .navbar-header{margin-left:0!important;margin-right:0!important}.navbar.navbar-collapse .navbar-header{float:none!important;min-height:45px}.navbar.navbar-collapse .navbar-buttons{min-height:0;padding-left:0;padding-right:0;border:1px solid rgba(255,255,255,.4);border-width:1px 0 0;width:100%}.navbar.navbar-collapse .navbar-buttons.in{overflow:visible!important}.navbar.navbar-collapse .navbar-buttons>.ace-nav{display:block;float:none!important;text-align:center;background-color:transparent!important;border-width:0;letter-spacing:-3px}.navbar.navbar-collapse .navbar-buttons>.ace-nav>li{display:inline-block;float:none!important;text-align:left;letter-spacing:normal}.navbar.navbar-collapse .navbar-buttons>.ace-nav>li:first-child{border-left:1px solid rgba(255,255,255,.4)}.navbar.navbar-collapse .navbar-buttons>.ace-nav>li:last-child{border-right:1px solid rgba(255,255,255,.4)}}.container-fluid>.navbar-buttons,.container>.navbar-buttons{padding-right:0!important}@media only screen and (max-height:400px){.navbar-fixed-top .navbar-collapse{max-height:280px}}@media only screen and (max-height:360px){.navbar-fixed-top .navbar-collapse{max-height:240px}}@media only screen and (max-height:320px){.navbar-fixed-top .navbar-collapse{max-height:200px}}@media only screen and (max-height:280px){.navbar-fixed-top .navbar-collapse{max-height:160px}}@media only screen and (max-height:240px){.navbar-fixed-top .navbar-collapse{max-height:120px}}.navbar .navbar-nav>li{border:1px solid rgba(0,0,0,.2);border-width:0 1px 0 0}.navbar .navbar-nav>li:first-child{border-width:0 1px}.navbar .navbar-nav>li>a{padding-top:12px;padding-bottom:11px;height:45px;background-color:transparent;font-size:13px;color:#FFF;text-shadow:0 1px 0 rgba(0,0,0,.25)}.navbar .navbar-nav>li.open>a,.navbar .navbar-nav>li>a:focus,.navbar .navbar-nav>li>a:hover{background-color:rgba(0,0,0,.1)!important;color:#FFF!important}.navbar .navbar-nav>li>.dropdown-menu>li>a{line-height:2}.navbar-nav .dropdown-menu>li>a>.ace-icon{display:inline-block;width:20px}.navbar-nav>li>.dropdown-menu{z-index:1033}@media only screen and (max-width:991px){.navbar .navbar-nav .dropdown-menu>li>a,.navbar .navbar-nav .dropdown-menu>li>a>.ace-icon{color:#FFF!important}.navbar.navbar-collapse .navbar-menu{float:none!important;clear:both}.navbar.navbar-collapse .navbar-menu .dropdown-menu:after,.navbar.navbar-collapse .navbar-menu .dropdown-menu:before{display:none!important}.navbar .navbar-nav{margin:0 -6px}.navbar .navbar-nav>li,.navbar .navbar-nav>li:first-child{border-width:1px 0 0}.navbar .navbar-nav .dropdown-menu{float:none;position:relative;background-color:transparent;box-shadow:none;border-width:0}.navbar .navbar-nav .dropdown-menu>li>a:hover{background-color:rgba(0,0,0,.07)!important}.navbar .navbar-nav .dropdown-hover>.dropdown-menu{left:32px!important;right:auto!important;top:auto!important;width:80%!important;width:calc(100% - 32px)}}.navbar-form.form-search{margin-top:9px;margin-bottom:0}.navbar-form.form-search .form-group{margin-bottom:0}.navbar-form.form-search input[type=text]{width:100px}.navbar-form input[type=text]{font-size:13px;line-height:1.4;padding-top:4px;padding-bottom:4px;border-width:0}@media only screen and (max-width:991px){.navbar-form .form-group{display:inline-block;width:50%;margin-bottom:0;vertical-align:middle}.navbar-form.form-search input[type=text]{width:100%}.navbar-nav+.navbar-form{margin-top:0}.navbar .navbar-collapse,.navbar .navbar-form{border-color:rgba(255,255,255,.4)}.navbar .navbar-nav>li:first-child{border-top-width:0}}@media only screen and (max-width:480px){.navbar-form .form-group{width:80%}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-left:12px;padding-right:12px}@media only screen and (min-width:768px) and (max-width:991px){.navbar.navbar-collapse{background-color:transparent}.navbar.navbar-collapse:before{background:#438EB9;content:"";display:block;position:absolute;min-height:inherit;left:0;right:0;top:0;z-index:-1;border-radius:inherit}.navbar.navbar-collapse .navbar-container{background-color:#438EB9}}.navbar .navbar-toggle{border:1px solid transparent;width:40px;height:35px;line-height:0;padding:0 0 1px;text-align:center}.navbar .navbar-toggle.pull-right{margin:5px 6px 4px 0}.navbar .navbar-toggle.pull-left{margin:5px 0 4px 6px}.navbar .navbar-toggle:active{top:1px}.navbar .navbar-toggle.navbar-toggle-img{width:auto;height:auto;overflow:hidden;padding:0;border-width:0}.navbar .navbar-toggle.navbar-toggle-img>img{border-radius:inherit;max-height:35px;border-width:0}.navbar .navbar-toggle .icon-bar{background-color:#FFF;border-radius:0;width:24px;margin-left:7px}.sidebar{width:190px;float:left;position:static;padding-left:0;padding-right:0}.sidebar:before{display:block;width:inherit;position:absolute;top:0;bottom:0;z-index:-1;background-color:inherit;border-style:inherit;border-color:inherit;border-width:inherit}.nav-list{margin:0;padding:0;list-style:none}.nav-list .nav-header,.nav-list>li,.nav-list>li>a{margin:0}.nav-list li>a:focus{outline:0}.nav-list>li{display:block;position:relative;float:none;padding:0;border-style:solid;border-width:1px 0 0}.nav-list>li:last-child{border-bottom-width:1px}.nav-list>li.active>a{font-weight:700}.nav-list>li>a{display:block;height:39px;line-height:17px;padding-left:7px;text-shadow:none!important;font-size:13px}.nav-list>li>a>.menu-icon{display:inline-block;min-width:30px;margin-right:2px;vertical-align:sub;text-align:center;font-size:18px;font-weight:400}.nav-list>li:before{display:none;position:absolute;top:-1px;left:0;z-index:1;height:41px;width:3px;max-width:3px;overflow:hidden;background-color:#629CC9}@media only screen and (min-width:992px){.main-container.container .sidebar:not(.h-sidebar) .nav-list>li:before{left:-2px}}.main-container.container .sidebar.sidebar-fixed:not(.h-sidebar) .nav-list>li:before{left:0}.nav-list>li:hover:before{display:block}.nav-list>li a>.arrow{display:block;width:14px!important;height:14px;line-height:14px;text-shadow:none;font-size:18px;position:absolute;right:10px;top:12px;padding:0;text-align:center}.nav-list>li.separator{height:3px;background-color:transparent;position:static;margin:1px 0;-webkit-box-shadow:none;box-shadow:none}.nav-list>li .submenu{display:none;list-style:none;margin:0;padding:0;line-height:1.5;position:relative}.nav-list>li .submenu>li{margin-left:0;position:relative}.nav-list>li .submenu>li>a{display:block;position:relative;padding:7px 0 9px 37px;margin:0;border-top-width:1px;border-top-style:dotted}.nav-list>li .submenu>li a>.menu-icon{display:none;font-size:12px;font-weight:400;width:18px;height:auto;line-height:12px;text-align:center;position:absolute;left:10px;top:11px;z-index:1;background-color:inherit}.nav-list>li .submenu>li.active>a>.menu-icon,.nav-list>li .submenu>li:hover>a>.menu-icon{display:inline-block}.nav-list>li>.submenu{border-top:1px solid}.nav-list>li>.submenu>li:before{display:block;width:7px;position:absolute;z-index:1;left:20px;top:17px;border:1px dotted;border-width:1px 0 0}.nav-list>li>.submenu:before{display:block;position:absolute;z-index:1;left:18px;top:0;bottom:0;border:1px dotted;border-width:0 0 0 1px}.nav-list li.active>a>.arrow,.nav-list li.open>a>.arrow,.nav-list li:hover>a>.arrow{color:inherit}.nav-list li.open>.submenu,.nav-list>li .submenu.collapsing,.nav-list>li>.submenu li.open>.submenu{display:block}.nav-list>li>a>.menu-icon,no_such_element:-o-prefocus{vertical-align:middle}.nav-list>li>.submenu li>.submenu{display:none}.nav-list>li>.submenu li.active>.submenu,.nav-list>li>.submenu li>.submenu.collapsing{display:block}.nav-list>li>.submenu a>.arrow{right:10px;top:10px;font-size:16px}.nav-list>li>.submenu>li:first-child>a{border-top-width:0}.nav-list>li>.submenu li>.submenu>li{line-height:18px}.nav-list>li>.submenu li>.submenu>li:before{display:none}.nav-list>li>.submenu li>.submenu>li>a{margin-left:20px;padding-left:22px}.nav-list>li>.submenu li>.submenu>li>.submenu>li>a{margin-left:20px;padding-left:38px}.nav-list>li>.submenu li>.submenu>li a>.menu-icon{display:inline-block;width:auto;position:static;background-color:transparent;margin-right:4px;color:inherit}.nav-list>li>.submenu li>.submenu>li a .arrow,.nav-list>li>.submenu li>.submenu>li a .menu-icon{color:inherit}.nav-list>li>.submenu li.open:not(.hover)>a>.menu-icon{display:inline-block}.nav-list a .badge,.nav-list a .label{position:absolute;top:9px;right:10px;opacity:.88;font-size:12px;padding-left:6px;padding-right:6px}.nav-list a .badge .ace-icon,.nav-list a .label .ace-icon{vertical-align:middle;margin:0}.nav-list a.dropdown-toggle .badge,.nav-list a.dropdown-toggle .label{right:26px}.nav-list li:hover>a .badge,.nav-list li:hover>a .label{opacity:1}.nav-list .submenu .submenu a .badge,.nav-list .submenu .submenu a .label{top:6px}.sidebar.sidebar-fixed{position:fixed;top:auto;float:none!important;z-index:1027}.sidebar.sidebar-fixed:before{height:5000px;top:auto;bottom:auto}.sidebar-scroll-native{overflow-y:scroll!important;overflow-x:hidden}body.mob-safari .sidebar.sidebar-fixed{top:45px}@media (max-width:479px){body.mob-safari .navbar-fixed-top:not(.navbar-collapse)+.main-container .sidebar-fixed{top:90px}}@media (max-width:991px){body.mob-safari .navbar-fixed-top+.main-container .sidebar.responsive{top:45px}}@media (max-width:479px){body.mob-safari .navbar-fixed-top+.main-container .sidebar.responsive{top:90px}}@media only screen and (max-width:991px){.responsive.sidebar-fixed{left:auto;margin-left:auto}.navbar-fixed-top+.main-container>.responsive{position:fixed;left:auto;margin-left:auto}.navbar-fixed-top+.main-container>.menu-toggler+.responsive{position:absolute;left:190px;margin-left:-190px}.navbar-fixed-top+.main-container>.menu-toggler+.responsive.sidebar-fixed,.sidebar.responsive.sidebar-fixed,.sidebar.sidebar-fixed.responsive-max{position:fixed;left:auto;margin-left:auto}.main-container .menu-toggler.fixed{position:fixed;left:auto;z-index:1026}}.sidebar .sidebar-toggle{border-style:solid;border-width:0 0 1px;text-align:center;padding:3px 0;position:relative}.sidebar .sidebar-toggle>.ace-icon{padding:0 5px;line-height:18px;cursor:pointer;font-size:14px;border-radius:100%;border:1px solid;position:relative}.sidebar .sidebar-toggle:before{display:block;height:0;border-top:1px solid;border-color:inherit;position:absolute;left:15px;right:15px;top:13px}.sidebar .sidebar-shortcuts{text-align:center;min-height:40px;margin-bottom:0;overflow:hidden;position:relative;border:0 solid}.sidebar .sidebar-shortcuts:empty{display:none}.sidebar .sidebar-shortcuts-large{line-height:37px}.sidebar .sidebar-shortcuts-large>.btn{text-align:center;width:41px;line-height:24px;padding:0;border-width:4px}.sidebar .sidebar-shortcuts-large>.btn>.ace-icon{margin:0}.sidebar .sidebar-shortcuts-mini{display:none;font-size:0;width:42px;padding-top:2px;padding-bottom:2px}.sidebar .sidebar-shortcuts-mini>.btn{border-width:0;font-size:0;line-height:0;padding:8px;margin:1px;border-radius:0;opacity:.85;filter:alpha(opacity=85)}@media screen and (-webkit-min-device-pixel-ratio:0){.sidebar .sidebar-shortcuts-mini>.btn,.sidebar ::safari-only{margin:0}}.nav-list li.active>a:after{display:block;position:absolute;right:0;top:4px;border:8px solid transparent;border-width:14px 10px}.nav-list li.open>a:after{display:none}.nav-list li.active.no-active-child>a:after{display:block}.nav-list>li li.active>a:after{top:2px;border-width:14px 8px}.nav-list li.active:not(.open) li.active>a:after{display:none!important}@media (min-width:992px){.sidebar.compact,.sidebar.compact.navbar-collapse{width:105px}.sidebar.compact .sidebar-shortcuts{max-height:40px}.sidebar.compact .nav-list>li:before{height:auto;bottom:-1px}.sidebar.compact .nav-list>li>a{height:auto;line-height:16px;padding:2px 0 8px;text-align:center}.sidebar.compact .nav-list>li>a>.menu-icon{display:block;margin:0;vertical-align:inherit;line-height:32px;height:32px;font-size:20px}.sidebar.compact .nav-list>li.active>.submenu,.sidebar.compact .nav-list>li.open>.submenu,.sidebar.compact .nav-list>li>a>.arrow{display:none}.sidebar.compact .nav-list a .badge,.sidebar.compact .nav-list a .label{right:12px}.sidebar.compact+.main-content{margin-left:105px}}@media (min-width:992px) and (max-width:991px){.sidebar.compact+.main-content{margin-left:0}.sidebar.navbar-collapse.compact .nav-list>li>a{text-align:left;height:39px;line-height:37px;padding:0 16px 0 7px}.sidebar.navbar-collapse.compact .nav-list>li>a>.menu-icon{display:inline-block;vertical-align:sub;height:auto;line-height:inherit;margin:0 2px 0 0;font-size:18px}.sidebar.navbar-collapse.compact .nav-list>li>a>.arrow,.sidebar.navbar-collapse.compact .nav-list>li>a>.menu-text{display:inline}.sidebar.navbar-collapse.compact+.main-content{margin-left:0}}@media only screen and (min-width:992px){.nav-list li.hover>.submenu{position:absolute;left:100%;margin-left:-2px;top:-10px;bottom:auto;z-index:1026;width:190px;border:1px solid;display:none!important;padding:0 2px}.nav-list li.hover.hover-show>.submenu,.nav-list li.hover:hover>.submenu{display:block!important}.nav-list li.hover>.submenu:before,.nav-list li.hover>.submenu>li:before{display:none}.nav-list li.hover.active>a:after{display:block}.nav-list li.hover.active.hover-show>a.dropdown-toggle:after,.nav-list li.hover.active:hover>a.dropdown-toggle:after{display:none}.nav-list li.hover .submenu>li.active>a:after{display:none!important}.nav-list li.hover>.submenu.bottom{top:auto;bottom:-10px}.nav-list li.hover>.submenu.bottom:after,.nav-list li.hover>.submenu.bottom:before{top:auto;bottom:18px}.nav-list li.hover>.submenu>li>a{margin-top:2px;margin-bottom:2px;padding-left:18px;border-top-width:0}.nav-list>li.hover>.submenu>li.active>a{font-weight:700}.nav-list>li>.submenu li.hover>.submenu>li>a{padding-left:12px!important;margin-left:auto!important}.nav-list>li>.submenu li.hover>.submenu>li>a>.menu-icon{margin-right:2px}.nav-list>li .submenu>li.hover>a{padding-left:22px}.nav-list>li .submenu>li.hover>a>.menu-icon{left:4px}}@media (min-width:992px) and (max-width:991px){.sidebar.navbar-collapse .nav-list li.hover>.submenu{position:relative;left:auto;top:auto;z-index:auto;margin:auto;padding:0;width:auto;-webkit-box-shadow:none;box-shadow:none;border-width:0}.sidebar.navbar-collapse .nav-list li.hover>.submenu:before,.sidebar.navbar-collapse .nav-list li.hover>.submenu>li:before{display:block}.sidebar.navbar-collapse .nav-list li.hover>.submenu li>a{padding-left:37px}.sidebar.navbar-collapse .nav-list>li.hover>.submenu{border-top-width:1px}.sidebar.navbar-collapse .nav-list li.hover>.submenu>li>a>.menu-icon{background-color:inherit;margin-right:auto;width:18px;position:absolute}.sidebar.navbar-collapse .nav-list>li .submenu>li.hover>a>.menu-icon{left:10px}.sidebar.navbar-collapse .nav-list li.hover>.submenu>li.active>a{font-weight:400}.sidebar.navbar-collapse .nav-list li.hover>.submenu>li.active>a>.menu-icon,.sidebar.navbar-collapse .nav-list li.hover>.submenu>li.hover-show>a>.menu-icon,.sidebar.navbar-collapse .nav-list li.hover>.submenu>li:hover>a>.menu-icon{display:inline-block}.sidebar.navbar-collapse .nav-list>li>.submenu li.hover>.submenu{padding-left:0;padding-right:0}.sidebar.navbar-collapse .nav-list>li>.submenu li.hover>.submenu>li>a{padding-left:22px!important;margin-left:20px!important}.sidebar.navbar-collapse .nav-list>li>.submenu li.hover>.submenu>li>a>.menu-icon{display:inline-block;width:auto;position:static;background-color:transparent;margin-right:4px}.sidebar.navbar-collapse .nav-list>li>.submenu li>.submenu>li.hover>.submenu>li>a{margin-left:20px!important;padding-left:38px!important}.sidebar.navbar-collapse .nav-list li.hover>.submenu>li>a{border-top-width:1px;margin-top:0;margin-bottom:0}.sidebar.navbar-collapse .nav-list>li.hover>.submenu>li:first-child>a{border-top-width:0}.sidebar.navbar-collapse .nav-list li.hover.hover-show>.submenu,.sidebar.navbar-collapse .nav-list li.hover:hover>.submenu,.sidebar.navbar-collapse .nav-list li.hover>.arrow,.sidebar.navbar-collapse .nav-list li.hover>.submenu{display:none!important}.sidebar.navbar-collapse .nav-list li.hover.active>.submenu{display:block!important}.sidebar.navbar-collapse .nav-list li.hover>.submenu.nav-hide{display:none!important}.sidebar.navbar-collapse .nav-list li.hover>.submenu.nav-show{display:block!important}.sidebar.navbar-collapse.compact .nav-list>li.hover.active>a:after{display:none}}.nav-list li>.arrow{display:none;position:absolute;top:8px;right:1px;z-index:1027}.nav-list li>.arrow:after,.nav-list li>.arrow:before{border:1px solid transparent;display:block;height:0;width:0;position:absolute;left:-19px;top:0;right:auto;bottom:auto;content:"";border-width:10px}.nav-list li>.arrow:before{z-index:1;left:-20px}.nav-list li>.arrow:after{z-index:2}.nav-list li.hover-show>a+.arrow,.nav-list li:hover>a+.arrow{display:none}@media only screen and (min-width:992px){.nav-list li.hover.hover-show>a.dropdown-toggle+.arrow,.nav-list li.hover:hover>a.dropdown-toggle+.arrow{display:block}}.sidebar.menu-min,.sidebar.menu-min.compact,.sidebar.menu-min.navbar-collapse{width:43px}.sidebar.menu-min+.main-content{margin-left:43px}.sidebar.menu-min .nav-list a .badge,.sidebar.menu-min .nav-list a .label{position:relative;top:-1px;right:auto;left:4px}.sidebar.menu-min .nav-list .submenu .submenu a .badge,.sidebar.menu-min .nav-list .submenu .submenu a .label{top:0}.sidebar.menu-min .nav-list>li>a{position:relative;height:39px;line-height:37px;padding:0}.sidebar.menu-min .nav-list>li>a>.menu-icon{font-size:18px;height:auto;line-height:inherit;display:inline-block;vertical-align:sub;margin-right:0;width:44px}.sidebar.menu-min .nav-list>li>a>.menu-text{display:none;text-align:left;position:absolute;top:-1px;left:42px;z-index:1025;width:176px;height:41px;line-height:38px;padding-left:12px;border:1px solid}.sidebar.menu-min .nav-list>li>a.dropdown-toggle>.menu-text{top:-1px;border-width:1px 1px 0}.sidebar.menu-min .nav-list>li>a .arrow{display:none}.sidebar.menu-min .nav-list>li.active.open>a:after,.sidebar.menu-min .nav-list>li.hover-show>a>.menu-text,.sidebar.menu-min .nav-list>li:hover>a>.menu-text{display:block}.sidebar.menu-min .nav-list>li.active>a:after{border-width:10px 6px;top:8px}.sidebar.menu-min .nav-list>li.active.open li.active>a:after{display:none}.sidebar.menu-min .nav-list>li>.submenu{position:absolute;z-index:1026;left:42px;top:-1px;margin-top:40px;padding-bottom:2px;width:176px;display:none!important;height:auto!important;visibility:visible!important}.sidebar.menu-min .nav-list>li>.submenu:before{display:none}.sidebar.menu-min .nav-list>li>.submenu:after{display:block;height:1px;width:1px;position:absolute;right:-1px;top:-1px;border-right:1px solid;border-right-color:inherit}.sidebar.menu-min .nav-list>li.open>.submenu,.sidebar.menu-min .nav-list>li>.submenu li:before{display:none}.sidebar.menu-min .nav-list>li>.submenu li>a{margin-left:0;padding-left:22px}.sidebar.menu-min .nav-list>li>.submenu li>a>.menu-icon{left:4px}.sidebar.menu-min .nav-list>li.hover>.submenu{padding-bottom:0}.sidebar.menu-min .nav-list>li.hover-show>.submenu,.sidebar.menu-min .nav-list>li:hover>.submenu{display:block!important}.sidebar.menu-min .nav-list>li.hover-show>.arrow,.sidebar.menu-min .nav-list>li:hover>.arrow,.sidebar.menu-min .sidebar-shortcuts-mini{display:block}.sidebar.menu-min .nav-list>li>.arrow{top:10px}.sidebar.menu-min .nav-list>li>.arrow:after,.sidebar.menu-min .nav-list>li>.arrow:before{border-width:8px;left:-16px}.sidebar.menu-min .nav-list>li>.arrow:before{left:-17px}.sidebar.menu-min .nav-list li>.arrow{right:-1px}.sidebar.menu-min .sidebar-shortcuts{position:relative;overflow:visible;z-index:1}.sidebar.menu-min .sidebar-shortcuts-large{display:none;position:absolute;top:0;left:42px;width:182px;padding:0 2px 3px;border:1px solid;border-top-width:0}.sidebar.menu-min .sidebar-shortcuts.hover-show .sidebar-shortcuts-large,.sidebar.menu-min .sidebar-shortcuts:hover .sidebar-shortcuts-large{display:block}.sidebar.menu-min .sidebar-toggle:before{left:5px;right:5px}.sidebar.menu-min .sidebar-toggle>.ace-icon{font-size:13px;padding:0 4px;line-height:15px;border-width:1px}.sidebar.menu-min .nav-list>li>.submenu li>.submenu>li>a{margin-left:2px;padding-left:30px}.sidebar.menu-min .nav-list>li>.submenu li>.submenu>li>.submenu>li>a{margin-left:2px;padding-left:45px}.sidebar.menu-min .nav-list li.active.open>.submenu>li.active>a:after,.sidebar.menu-min .nav-list>li.active.hover-show>a:after,.sidebar.menu-min .nav-list>li.active.open:hover>a:after,.sidebar.menu-min .nav-list>li.active:hover:after,.sidebar.menu-min .nav-list>li.active:hover>a:after,.sidebar.menu-min .nav-list>li>.submenu li.active>a:after{display:none}@media (min-width:992px){.sidebar.menu-min .nav-list li.hover>.submenu{margin-left:0}.sidebar.menu-min .nav-list>li>.submenu li.hover>.submenu>li>a,.sidebar.menu-min .nav-list>li>.submenu li>.submenu>li.hover>.submenu>li>a{margin-left:0!important}.sidebar.menu-min.compact .nav-list>li>a{height:39px;line-height:37px;padding:0 16px 0 7px;position:relative}.sidebar.menu-min.compact .nav-list>li>a>.menu-icon{font-size:18px;height:auto;line-height:inherit;display:inline-block;vertical-align:sub;width:auto}}@media only screen and (min-width:992px){.navbar.h-navbar{-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.25);box-shadow:0 2px 4px 0 rgba(0,0,0,.25)}.sidebar.h-sidebar{position:relative;float:none!important;width:auto;margin-top:17px;border-width:0!important;box-shadow:none}.sidebar.h-sidebar.compact,.sidebar.h-sidebar.menu-min{width:auto}.sidebar.h-sidebar.sidebar-fixed{position:fixed}.sidebar.h-sidebar.no-gap{margin-top:auto}.sidebar.h-sidebar.no-gap .nav-list{padding-top:3px}.sidebar.h-sidebar:before{display:block;position:absolute;z-index:-1;left:0!important;right:0!important;top:-17px;bottom:auto;height:17px;width:auto;border-width:0;border-bottom:1px solid;border-bottom-color:inherit}.main-content .sidebar.h-sidebar .nav-list>li:before,.sidebar.h-sidebar.lower-highlight .nav-list>li:before{top:0}.sidebar.h-sidebar .nav-list{border-width:0;border-bottom:2px solid #79B0CE}.sidebar.h-sidebar .nav-list>li{float:left;border-width:0 0 0 1px;margin-left:0}.sidebar.h-sidebar .nav-list>li:last-child{border-right-width:1px}.sidebar.h-sidebar .nav-list>li:before{left:-1px;right:-1px;bottom:auto;top:-2px;max-width:none;width:auto;height:2px;border-width:0}.sidebar.h-sidebar .nav-list>li.active:before{display:block}.sidebar.h-sidebar .nav-list>li.active:after{display:none}.sidebar.h-sidebar .nav-list>li:first-child{border-left-width:0;margin-left:0}.sidebar.h-sidebar .sidebar-shortcuts+.nav-list>li:first-child{border-left-width:1px;margin-left:-1px}.sidebar.h-sidebar .nav-list>li>a{line-height:22px;height:auto;padding:10px 14px}.sidebar.h-sidebar .nav-list>li>a>.menu-icon{display:block;margin:1px 0 4px;line-height:inherit;width:auto}.sidebar.h-sidebar .nav-list>li.hover.hover-show>a~.arrow,.sidebar.h-sidebar .nav-list>li.hover:hover>a~.arrow,.sidebar.h-sidebar .nav-list>li>a>.arrow{display:none}.sidebar.h-sidebar .nav-list>li.hover.pull_right{float:none!important}.sidebar.h-sidebar .nav-list>li.hover>.submenu{top:100%;left:1px;margin-top:auto;margin-left:-2px;width:190px;z-index:1026}.sidebar.h-sidebar .nav-list>li.hover.pull_right>.submenu{left:auto;right:1px}.sidebar.h-sidebar .nav-list>li.hover>.arrow{right:auto;top:auto;left:24px;bottom:7px}.sidebar.h-sidebar .nav-list>li.hover.pull_right>.arrow{left:auto;right:24px}.sidebar.h-sidebar .nav-list>li.hover>.arrow:after,.sidebar.h-sidebar .nav-list>li.hover>.arrow:before{border-color:transparent;border-left-color:transparent!important;border-right-color:transparent!important;right:auto!important;left:-10px!important;border-width:0 8px 8px!important}.sidebar.h-sidebar .nav-list>li.hover>.arrow:before{top:-1px!important}.sidebar.h-sidebar .nav-list>li.hover.hover-show>a.dropdown-toggle~.arrow,.sidebar.h-sidebar .nav-list>li.hover:hover>a.dropdown-toggle~.arrow{display:block}.sidebar.h-sidebar .nav-list>li.hover-flip>.submenu{left:auto;right:1px;margin-left:auto;margin-right:-2px}.sidebar.h-sidebar .nav-list>li.hover-flip>.arrow{left:auto;right:24px}.sidebar.h-sidebar .nav-list li li.hover-flip>.submenu{left:auto;right:100%;margin-left:auto;margin-right:-2px}.sidebar.h-sidebar .nav-list li li.hover-flip>.arrow{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-moz-transform:scale(-1,1);-webkit-transform:scale(-1,1);-o-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1);left:0;right:auto}.sidebar.h-sidebar .sidebar-shortcuts-large:after,.sidebar.h-sidebar .sidebar-shortcuts-large:before{display:block;content:"";position:absolute;left:50%;margin-left:-8px;border:1px solid transparent;border-width:0 8px 8px}.sidebar.h-sidebar .sidebar-shortcuts-large:after{border-right-color:transparent;top:-8px}.sidebar.h-sidebar .sidebar-shortcuts-large:before{border-bottom-color:#CCC;top:-9px}.sidebar.h-sidebar .sidebar-toggle{position:absolute;top:12px;right:6px;background-color:transparent;border-width:0}.sidebar.h-sidebar .sidebar-shortcuts{float:left;display:block;overflow:visible;position:relative;margin:0;padding:12px 8px 9px;max-height:none!important;background-color:transparent}.sidebar.h-sidebar .sidebar-shortcuts.hover-show .sidebar-shortcuts-large,.sidebar.h-sidebar .sidebar-shortcuts:hover .sidebar-shortcuts-large{display:block}.sidebar.h-sidebar .sidebar-shortcuts-large{display:none;width:52px;height:auto;position:absolute;z-index:1025;top:100%;margin-top:-5px;left:10px;padding:3px 2px;border:1px solid}.sidebar.h-sidebar .sidebar-shortcuts-mini{width:auto;max-width:52px;display:block;background-color:transparent;padding-top:3px;padding-bottom:5px}.sidebar.h-sidebar .sidebar-shortcuts-mini>.btn{padding:9px}.sidebar.h-sidebar .nav-list a .badge,.sidebar.h-sidebar .nav-list a .label{position:absolute;top:11px;right:auto!important;left:50%;margin-left:10px}.sidebar.h-sidebar+.main-content{margin-left:0}.sidebar.h-sidebar+.main-content .breadcrumbs{margin:6px 9px;border:1px solid #E5E5E5}.h-sidebar.sidebar-fixed{top:auto;width:100%;left:0;right:0}.h-sidebar.sidebar-fixed:before{z-index:auto}.h-sidebar.sidebar-fixed,.h-sidebar.sidebar-fixed .nav-list{border-right-width:0;border-left-width:0}.h-sidebar.sidebar-fixed .sidebar-shortcuts{border-width:0}.h-sidebar.sidebar-fixed+.main-content{padding-top:88px}.h-sidebar.sidebar-fixed.no-gap+.main-content{padding-top:74px}.h-sidebar.sidebar-fixed.menu-min+.main-content{padding-top:63px}.h-sidebar.sidebar-fixed.menu-min.no-gap+.main-content{padding-top:49px}}@media only screen and (min-width:992px) and (max-width:991px){.sidebar.h-sidebar+.main-content .breadcrumbs{margin:0;border-width:0 0 1px}}.main-container.container .h-sidebar.sidebar-fixed{left:0;right:0;width:auto}@media (min-width:768px){.main-container.container .h-sidebar.sidebar-fixed{left:auto!important;right:auto!important;width:744px}}@media (min-width:992px){.main-container.container .h-sidebar.sidebar-fixed{width:964px}}@media (min-width:1200px){.main-container.container .h-sidebar.sidebar-fixed{width:1164px}}@media (min-width:992px){.sidebar.h-sidebar.menu-min .nav.nav-list>li>a,.sidebar.h-sidebar.menu-min.compact .nav.nav-list>li>a{padding:9px 12px}.sidebar.h-sidebar.menu-min .nav-list>li>a>.menu-text{left:-1px;top:100%;width:190px}.sidebar.h-sidebar.menu-min .nav-list>li>a>.menu-icon{margin:2px 0}.sidebar.h-sidebar.menu-min .nav-list>li.hover>.submenu{top:100%;margin-top:41px}.sidebar.h-sidebar.menu-min .nav-list>li.hover.hover-show>a~.arrow,.sidebar.h-sidebar.menu-min .nav-list>li.hover:hover>a~.arrow{display:block}.sidebar.h-sidebar.menu-min .sidebar-toggle{top:6px}.sidebar.h-sidebar.menu-min .sidebar-shortcuts{padding:0}.sidebar.h-sidebar.menu-min .sidebar-shortcuts-mini{padding-bottom:4px;padding-top:4px}.sidebar.h-sidebar.menu-min .sidebar-shortcuts-mini>.btn{padding:8px}.sidebar.h-sidebar.menu-min .sidebar-shortcuts-large{left:1px;margin-top:4px}.sidebar.h-sidebar.compact .nav-list>li>a>.menu-icon{font-size:18px;height:auto}.sidebar.h-sidebar.compact.menu-min .nav-list>li>a{height:auto;line-height:22px}}.main-container .menu-toggler{display:none}@media only screen and (max-width:991px){.sidebar.responsive:before{display:none}.sidebar.responsive{-webkit-box-shadow:2px 1px 2px 0 rgba(0,0,0,.15);box-shadow:2px 1px 2px 0 rgba(0,0,0,.15);z-index:1027;overflow:hidden;max-height:0;-moz-transform:translateX(-200px);-webkit-transform:translateX(-200px);-o-transform:translateX(-200px);-ms-transform:translateX(-200px);transform:translateX(-200px);-webkit-transition:-webkit-transform .2s linear 0s,max-height 0s linear .2s;-moz-transition:-moz-transform .2s linear 0s,max-height 0s linear .2s;-o-transition:-o-transform .2s linear 0s,max-height 0s linear .2s;transition:transform .2s linear 0s,max-height 0s linear .2s;position:relative;bottom:auto;left:190px;margin-left:-190px}}@media (min-width:992px) and (max-width:991px){.sidebar.responsive.compact{-moz-transform:translateX(-115px);-webkit-transform:translateX(-115px);-o-transform:translateX(-115px);-ms-transform:translateX(-115px);transform:translateX(-115px)}.navbar.navbar-fixed-top+.main-container .sidebar.responsive.compact.push_away.display~.footer .footer-inner,.sidebar.responsive.compact.push_away.display+.main-content{-moz-transform:translateX(105px);-webkit-transform:translateX(105px);-o-transform:translateX(105px);-ms-transform:translateX(105px);transform:translateX(105px)}}@media only screen and (max-width:991px){.sidebar.responsive.menu-min{-moz-transform:translateX(-53px);-webkit-transform:translateX(-53px);-o-transform:translateX(-53px);-ms-transform:translateX(-53px);transform:translateX(-53px)}.sidebar.responsive.display{-moz-transform:none!important;-webkit-transform:none!important;-o-transform:none!important;-ms-transform:none!important;transform:none!important;overflow:visible;max-height:2000px;-webkit-transition-delay:0s;-moz-transition-delay:0s;-o-transition-delay:0s;transition-delay:0s}.sidebar.responsive.push_away{-webkit-box-shadow:none!important;box-shadow:none!important}.sidebar.responsive.push_away:before{display:block!important}.sidebar.responsive.push_away+.main-content{-webkit-transition:-webkit-transform .2s linear 0s;-moz-transition:-moz-transform .2s linear 0s;-o-transition:-o-transform .2s linear 0s;transition:transform .2s linear 0s}.sidebar.responsive.push_away.display+.main-content{-moz-transform:translateX(190px);-webkit-transform:translateX(190px);-o-transform:translateX(190px);-ms-transform:translateX(190px);transform:translateX(190px)}.sidebar.responsive.push_away.display.menu-min+.main-content{-moz-transform:translateX(43px);-webkit-transform:translateX(43px);-o-transform:translateX(43px);-ms-transform:translateX(43px);transform:translateX(43px)}.navbar.navbar-fixed-top+.main-container .sidebar.responsive.push_away:before{height:5000px}.navbar.navbar-fixed-top+.main-container .sidebar.responsive.push_away~.footer .footer-inner{-webkit-transition:-webkit-transform .2s linear 0s;-moz-transition:-moz-transform .2s linear 0s;-o-transition:-o-transform .2s linear 0s;transition:transform .2s linear 0s}.navbar.navbar-fixed-top+.main-container .sidebar.responsive.push_away.display~.footer .footer-inner{-moz-transform:translateX(190px);-webkit-transform:translateX(190px);-o-transform:translateX(190px);-ms-transform:translateX(190px);transform:translateX(190px)}.navbar.navbar-fixed-top+.main-container .sidebar.responsive.push_away.display.menu-min~.footer .footer-inner{-moz-transform:translateX(43px);-webkit-transform:translateX(43px);-o-transform:translateX(43px);-ms-transform:translateX(43px);transform:translateX(43px)}.sidebar.responsive+.main-content{margin-left:0!important;margin-right:0!important}.responsive.sidebar-fixed{position:fixed}.main-container .menu-toggler.fixed{position:fixed;left:auto;z-index:1026;-moz-backface-visibility:hidden}}@media only screen and (min-width:768px) and (max-width:991px){.main-container.container .sidebar.responsive{-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none;display:none}.main-container.container .sidebar.responsive:before{display:none!important}.main-container.container .sidebar.responsive.display{display:block}.main-container.container .sidebar.responsive.push_away+.main-content,.main-container.container .sidebar.responsive.push_away~.footer .footer-inner{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;transition:none!important;-moz-transform:none!important;-webkit-transform:none!important;-o-transform:none!important;-ms-transform:none!important;transform:none!important}}@media only screen and (max-width:991px){.menu-toggler+.sidebar.responsive{margin-top:40px}.main-container .menu-toggler{display:block;position:absolute;z-index:1026;width:52px;height:32px;margin-right:2px;line-height:normal;padding-left:33px;padding-top:7px;padding-bottom:1px;font-size:13px;font-weight:700;text-transform:uppercase;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.main-container .menu-toggler:after,.main-container .menu-toggler:before{content:"";height:2px;width:24px;left:4px;position:absolute}.main-container .menu-toggler:hover{text-decoration:none}.main-container .menu-toggler:focus{outline:0}.main-container .menu-toggler:before{border-top:1px solid #87B87F;border-bottom:1px solid #6FB3E0;z-index:1;top:13px;-webkit-transition:all .1s ease;transition:all .1s ease;-o-transition:none;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.main-container .menu-toggler:after{border-top:1px solid #FFA24D;border-bottom:1px solid #D15B47;top:19px;-webkit-transition:all .1s ease;transition:all .1s ease;-o-transition:none;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.main-container .menu-toggler.display:before{height:4px;top:8px;border-width:2px}.main-container .menu-toggler.display:after{height:4px;top:20px;border-width:2px}.main-container .menu-toggler>.toggler-text{display:block;position:absolute;bottom:-9px;left:0;border:1px solid transparent;border-width:9px 42px 0;border-top-color:#444}.main-container .menu-toggler>.toggler-text:after{display:block;content:"MENU";color:#FFF;position:absolute;left:-8px;top:-41px}.menu-toggler+.responsive.sidebar-scroll .nav-wrap{overflow:hidden}}@media only screen and (max-width:320px){.main-container .menu-toggler{width:0}.main-container .menu-toggler>.toggler-text{border-width:7px 16px;bottom:-14px}.main-container .menu-toggler>.toggler-text:after{font-size:9px;font-weight:400;color:#FFF;position:absolute;left:-13px;top:-42px}.main-container .menu-toggler:after,.main-container .menu-toggler:before{margin-top:8px}.main-container .menu-toggler.display:after,.main-container .menu-toggler.display:before{height:2px;border-width:1px}.main-container .menu-toggler.display:before{top:13px}.main-container .menu-toggler.display:after{top:19px}}.sidebar-toggle.sidebar-expand{display:none}@media (max-width:991px){.menu-toggler.invisible{position:fixed;z-index:-999;visibility:hidden;opacity:0;width:1px;height:1px}.sidebar.responsive-min,.sidebar.responsive-min.compact,.sidebar.responsive-min.navbar-collapse{width:43px}.sidebar.responsive-min .nav-list a .badge,.sidebar.responsive-min .nav-list a .label{position:relative;top:-1px;right:auto;left:4px}.sidebar.responsive-min .nav-list .submenu .submenu a .badge,.sidebar.responsive-min .nav-list .submenu .submenu a .label{top:0}.sidebar.responsive-min .nav-list>li>a{position:relative;height:39px;line-height:37px;padding:0}.sidebar.responsive-min .nav-list>li>a>.menu-icon{font-size:18px;height:auto;line-height:inherit;display:inline-block;vertical-align:sub;margin-right:0;width:44px}.sidebar.responsive-min .nav-list>li>a>.menu-text{display:none;text-align:left;position:absolute;top:-1px;left:42px;z-index:1025;width:176px;height:41px;line-height:38px;padding-left:12px;border:1px solid}.sidebar.responsive-min .nav-list>li>a.dropdown-toggle>.menu-text{top:-1px;border-width:1px 1px 0}.sidebar.responsive-min .nav-list>li>a .arrow{display:none}.sidebar.responsive-min .nav-list>li.active.open>a:after,.sidebar.responsive-min .nav-list>li.hover-show>a>.menu-text,.sidebar.responsive-min .nav-list>li:hover>a>.menu-text{display:block}.sidebar.responsive-min .nav-list>li.active>a:after{border-width:10px 6px;top:8px}.sidebar.responsive-min .nav-list>li.active.open li.active>a:after{display:none}.sidebar.responsive-min .nav-list>li>.submenu{position:absolute;z-index:1026;left:42px;top:-1px;margin-top:40px;padding-bottom:2px;width:176px;display:none!important;height:auto!important;visibility:visible!important}.sidebar.responsive-min .nav-list>li>.submenu:before{display:none}.sidebar.responsive-min .nav-list>li>.submenu:after{content:"";display:block;height:1px;width:1px;position:absolute;right:-1px;top:-1px;border-right:1px solid;border-right-color:inherit}.sidebar.responsive-min .nav-list>li.open>.submenu,.sidebar.responsive-min .nav-list>li>.submenu li:before{display:none}.sidebar.responsive-min .nav-list>li>.submenu li>a{margin-left:0;padding-left:22px}.sidebar.responsive-min .nav-list>li>.submenu li>a>.menu-icon{left:4px}.sidebar.responsive-min .nav-list>li.hover>.submenu{padding-bottom:0}.sidebar.responsive-min .nav-list>li.hover-show>.submenu,.sidebar.responsive-min .nav-list>li:hover>.submenu{display:block!important}.sidebar.responsive-min .nav-list>li.hover-show>.arrow,.sidebar.responsive-min .nav-list>li:hover>.arrow,.sidebar.responsive-min .sidebar-shortcuts-mini{display:block}.sidebar.responsive-min .nav-list>li>.arrow{top:10px}.sidebar.responsive-min .nav-list>li>.arrow:after,.sidebar.responsive-min .nav-list>li>.arrow:before{border-width:8px;left:-16px}.sidebar.responsive-min .nav-list>li>.arrow:before{left:-17px}.sidebar.responsive-min .nav-list li>.arrow{right:-1px}.sidebar.responsive-min .sidebar-shortcuts{position:relative;overflow:visible;z-index:1}.sidebar.responsive-min .sidebar-shortcuts-large{display:none;position:absolute;top:0;left:42px;width:182px;padding:0 2px 3px;border:1px solid;border-top-width:0}.sidebar.responsive-min .sidebar-shortcuts.hover-show .sidebar-shortcuts-large,.sidebar.responsive-min .sidebar-shortcuts:hover .sidebar-shortcuts-large{display:block}.sidebar.responsive-min .sidebar-toggle:before{left:5px;right:5px}.sidebar.responsive-min .sidebar-toggle>.ace-icon{font-size:13px;padding:0 4px;line-height:15px;border-width:1px}.sidebar.responsive-min .nav-list>li>.submenu li>.submenu>li>a{margin-left:2px;padding-left:30px}.sidebar.responsive-min .nav-list>li>.submenu li>.submenu>li>.submenu>li>a{margin-left:2px;padding-left:45px}.sidebar.responsive-min .nav-list li.active.open>.submenu>li.active>a:after,.sidebar.responsive-min .nav-list>li.active.hover-show>a:after,.sidebar.responsive-min .nav-list>li.active.open:hover>a:after,.sidebar.responsive-min .nav-list>li.active:hover:after,.sidebar.responsive-min .nav-list>li.active:hover>a:after,.sidebar.responsive-min .nav-list>li>.submenu li.active>a:after{display:none}.sidebar.responsive-min:before{display:block}.sidebar.responsive-min .sidebar-toggle.sidebar-collapse{display:none}.sidebar.responsive-min .sidebar-toggle.sidebar-expand{display:block}.sidebar.responsive-min+.main-content{margin-left:43px!important}.rtl .sidebar.responsive-min+.main-content{margin-left:auto!important;margin-right:43px!important}.sidebar.responsive-min+.main-content .breadcrumb{margin-left:12px}.sidebar.responsive-max{display:block;position:relative;left:190px;margin-left:-190px;z-index:1027;-webkit-box-shadow:2px 1px 2px 0 rgba(0,0,0,.15);box-shadow:2px 1px 2px 0 rgba(0,0,0,.15)}.sidebar.responsive-max .sidebar-toggle.sidebar-collapse,.sidebar.responsive-max:before{display:none}.sidebar.responsive-max .sidebar-toggle.sidebar-expand{display:block;z-index:1}.sidebar.responsive-max+.main-content{margin-left:43px!important}.sidebar.responsive-max+.main-content .breadcrumb{margin-left:12px}}@media only screen and (min-width:992px){.sidebar.navbar-collapse{max-height:none}}@media only screen and (max-width:991px){.sidebar.navbar-collapse{position:relative;float:none!important;margin-top:auto!important;z-index:1;width:100%!important;max-height:340px;margin-left:0;margin-right:0}.sidebar.navbar-collapse:before{display:none}.sidebar.navbar-collapse .nav-list>li:last-child{border-bottom-width:0}.sidebar.navbar-collapse .nav-list>li>a{padding-top:10px!important;padding-bottom:10px!important;line-height:20px;height:41px}.sidebar.navbar-collapse .nav-list>li:before{height:43px}.sidebar.navbar-collapse li>.arrow{display:none!important}.sidebar.navbar-collapse .nav-wrap+.ace-scroll,.sidebar.navbar-collapse .sidebar-toggle{display:none}.sidebar.navbar-collapse .nav-list li>.submenu{border-left-width:0}.sidebar.navbar-collapse .sidebar-shortcuts{padding:3px 0 6px;max-height:none;border-bottom-width:0}.sidebar.navbar-collapse+.main-content{margin-left:0!important;margin-right:0!important}.sidebar.navbar-collapse+.main-content .breadcrumb{margin-left:12px}.sidebar.navbar-collapse.menu-min .nav-list>li>.submenu{position:relative;left:auto;top:auto;width:auto;z-index:auto;margin-top:auto;padding-top:0;padding-bottom:0;border-width:1px 0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}.sidebar.navbar-collapse.menu-min .nav-list>li>.submenu:before,.sidebar.navbar-collapse.menu-min .nav-list>li>.submenu>li:before{display:block}.sidebar.navbar-collapse.menu-min .nav-list>li>.submenu li>a>.menu-icon{left:10px}.sidebar.navbar-collapse.menu-min .nav-list>li>.submenu:after{display:none}.sidebar.navbar-collapse.menu-min .nav-list>li>.submenu li>a{padding:7px 0 9px 37px}.sidebar.navbar-collapse.menu-min .nav-list>li>.submenu li>.submenu>li>a{margin-left:20px;padding-left:22px}.sidebar.navbar-collapse.menu-min .nav-list>li>.submenu li>.submenu>li>.submenu>li>a{margin-left:20px;padding-left:38px}.sidebar.navbar-collapse.menu-min .nav-list>li>a:hover:before{width:3px}.sidebar.navbar-collapse.menu-min .nav-list>li>a{text-align:left;padding-left:7px}.sidebar.navbar-collapse.menu-min .nav-list>li>a>.menu-icon{display:inline-block;width:auto;margin-right:2px}.sidebar.navbar-collapse.menu-min .nav-list>li>a>.menu-text{position:relative;display:inline;line-height:normal;padding-left:0;height:auto;top:auto;left:auto;z-index:auto;width:auto;border-width:0!important;background-color:transparent!important;-webkit-box-shadow:none!important;box-shadow:none!important}.sidebar.navbar-collapse.menu-min .nav-list a>.arrow{display:block}.sidebar.navbar-collapse.menu-min .nav-list>li:hover>.submenu{display:none!important}.sidebar.navbar-collapse.menu-min .nav-list>li.active>.submenu,.sidebar.navbar-collapse.menu-min .nav-list>li>.submenu.nav-show{display:block!important}.sidebar.navbar-collapse.menu-min .nav-list>li>.submenu.nav-hide{display:none!important}.sidebar.navbar-collapse.menu-min .sidebar-shortcuts-large{display:block;position:static;-webkit-box-shadow:none!important;box-shadow:none!important;border-width:0!important;background-color:transparent!important;width:auto;padding:0}.sidebar.navbar-collapse.menu-min .sidebar-shortcuts-mini{display:none}.sidebar.navbar-collapse .nav-list a .badge,.sidebar.navbar-collapse .nav-list a .label{position:relative;top:-1px;right:auto;left:4px}.sidebar.navbar-collapse .nav-list li.active>a:after,.sidebar.navbar-collapse .nav-list li.active>a:before,.sidebar.navbar-collapse .nav-list>li.active:after,.sidebar.navbar-collapse .nav-list>li.highlight.active>a:after,.sidebar.navbar-collapse .nav-list>li.highlight.active>a:before{display:none!important}}@media (max-width:991px) and (max-height:400px){.sidebar.navbar-collapse{max-height:300px}}@media (max-width:991px) and (max-height:350px){.sidebar.navbar-collapse{max-height:250px}}@media (max-width:991px) and (max-height:300px){.sidebar.navbar-collapse{max-height:200px}}@media (max-width:991px) and (max-height:250px){.sidebar.navbar-collapse{max-height:150px}}@media (min-width:992px) and (max-width:991px){.sidebar.navbar-collapse .nav-list>li>.submenu li.hover>.submenu>li>a,.sidebar.navbar-collapse .nav-list>li>.submenu li>.submenu>li.hover>.submenu>li>a{margin-left:20px!important}}@media (max-width:991px){.navbar-fixed-top+.main-container .sidebar.navbar-collapse{position:fixed;z-index:1027}}@media (min-width:768px) and (max-width:991px){.navbar-fixed-top+.main-container.container .sidebar.navbar-collapse{width:744px!important}}.main-content-inner{float:left;width:100%}.main-content .sidebar:before{top:150px}@media only screen and (min-width:992px){body.mob-safari .sidebar.h-sidebar+.main-content .sidebar.sidebar-fixed:not(.h-sidebar){top:131px}body.mob-safari .sidebar.h-sidebar.no-gap+.main-content .sidebar.sidebar-fixed:not(.h-sidebar){top:114px}body.mob-safari .sidebar.h-sidebar.menu-min+.main-content .sidebar.sidebar-fixed:not(.h-sidebar){top:106px}body.mob-safari .sidebar.h-sidebar.menu-min.no-gap+.main-content .sidebar.sidebar-fixed:not(.h-sidebar){top:89px}.h-navbar.navbar-fixed-top+.main-container .sidebar:not(.h-sidebar):before{top:150px}.h-navbar.navbar-fixed-top+.main-container .sidebar:not(.h-sidebar) .nav-list{padding-top:3px}.h-navbar.navbar-fixed-top+.main-container .sidebar:not(.h-sidebar) .sidebar-shortcuts~.nav-list,.h-navbar.navbar-fixed-top+.main-container .sidebar:not(.h-sidebar) .sidebar-shortcuts~.nav-wrap-up .nav-list{padding-top:0}.h-navbar.navbar-fixed-top+.main-container .sidebar:not(.h-sidebar) .sidebar-shortcuts{padding-top:3px;min-height:43px}.h-navbar.navbar-fixed-top+.main-container .sidebar:not(.h-sidebar).menu-min .sidebar-shortcuts-large{line-height:40px}.h-navbar.navbar-fixed-top+.main-container .main-content .sidebar:not(.h-sidebar) .nav-list{padding-top:0}.h-navbar.navbar-fixed-top+.main-container .main-content .sidebar.sidebar-fixed{z-index:1026}.main-content .h-sidebar{padding-top:1px;margin-top:0}.main-content .h-sidebar:before{display:none}.main-content .h-sidebar+.page-content{margin-left:auto}.main-content .h-sidebar.sidebar-fixed{left:190px}.main-content .h-sidebar.sidebar-fixed+.page-content{margin-top:74px}.main-content .h-sidebar.sidebar-fixed.menu-min+.page-content{margin-top:49px}.main-content .h-sidebar.menu-min .nav-list>li>a{padding:8px 12px 7px}.sidebar.compact+.main-content .h-sidebar.sidebar-fixed{left:105px}.sidebar.menu-min+.main-content .h-sidebar.sidebar-fixed{left:43px}.navbar.navbar-fixed-top+.main-container .main-content .h-sidebar.sidebar-fixed{padding-top:3px}}.container.main-container .sidebar+.main-content .h-sidebar.sidebar-fixed{left:auto;right:auto}@media (min-width:992px){.container.main-container .sidebar.compact+.main-content .h-sidebar.sidebar-fixed{width:859px}.container.main-container .main-content .h-sidebar.sidebar-fixed{width:964px}.container.main-container .sidebar+.main-content .h-sidebar.sidebar-fixed{width:774px}.container.main-container .sidebar.menu-min+.main-content .h-sidebar.sidebar-fixed{width:921px}}@media (min-width:1200px){.container.main-container .sidebar.compact+.main-content .h-sidebar.sidebar-fixed{width:1059px}.container.main-container .main-content .h-sidebar.sidebar-fixed{width:1164px}.container.main-container .sidebar+.main-content .h-sidebar.sidebar-fixed{width:974px}.container.main-container .sidebar.menu-min+.main-content .h-sidebar.sidebar-fixed{width:1121px}}@media only screen and (max-width:991px){.main-container .main-content .sidebar.sidebar-fixed{z-index:1026}.navbar-fixed-top+.main-container .main-content .sidebar{position:fixed;z-index:1026}}.sidebar-scroll .sidebar-shortcuts{min-height:41px;border-bottom:1px solid}.sidebar-scroll .sidebar-toggle{border-top:1px solid}.sidebar-scroll .nav-list>li:first-child{border-top-width:0}.sidebar-scroll .nav-list>li:last-child{border-bottom-width:0}.sidebar-scroll .nav-wrap .sidebar-shortcuts{min-height:40px;border-bottom-width:0}.sidebar-scroll .nav-wrap .sidebar-shortcuts+.nav-list>li:first-child,.sidebar-scroll .nav-wrap .sidebar-shortcuts+.nav-wrap-up .nav-list>li:first-child{border-top-width:1px}.sidebar-scroll .nav-wrap-t .sidebar-toggle{border-top-width:0}.sidebar-scroll .nav-wrap-t .nav-list>li:last-child{border-bottom-width:1px}.sidebar .nav-wrap+.ace-scroll{position:absolute;right:0;top:0;z-index:1}.sidebar .nav-wrap+.scrollout{right:-8px}.sidebar .submenu.sub-scroll{overflow-y:scroll;overflow-x:hidden;-webkit-overflow-scrolling:touch}.ace-scroll,.scroll-content{overflow:hidden}.scroll-content{position:static}.scroll-disabled.ace-scroll,.scroll-disabled.ace-scroll .scroll-content{overflow:visible}.scroll-track{position:absolute;top:auto;bottom:auto;right:0;height:auto;background-color:#E7E7E7;z-index:99;width:0;opacity:0}.scroll-bar{position:absolute;top:0;left:0;width:inherit;background:#bbd4e5}.scroll-track.scroll-hz{top:auto;left:auto;right:auto;bottom:0;height:8px;width:auto}.scroll-hz .scroll-bar{height:inherit;width:auto}.scroll-track.scroll-active{-webkit-transition:width .25s ease .75s,opacity .25s ease .75s;-o-transition:width .25s ease .75s,opacity .25s ease .75s;transition:width .25s ease .75s,opacity .25s ease .75s}.ace-scroll:hover .scroll-active,.scroll-active.scroll-track.active,.scroll-active.scroll-track.scroll-hover,.scroll-active.scroll-track:active,.scroll-active.scroll-track:hover{width:8px;opacity:1;-webkit-transition-duration:.15s;transition-duration:.15s;-webkit-transition-delay:0s;transition-delay:0s}.scroll-track.active>.scroll-bar{transition-property:none!important;transition-duration:0s!important}.scroll-track.scroll-margin{margin-left:-1px}.scroll-track.scroll-left{right:auto;left:0}.scroll-track.scroll-left.scroll-margin{margin-left:1px}.scroll-track.scroll-top{bottom:auto;top:0}.scroll-track.scroll-top.scroll-margin{top:1px}.scroll-dark .scroll-bar{background-color:transparent;background-color:rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#40000000', endColorstr='#40000000', GradientType=0 )}.scroll-track.scroll-dark{background-color:transparent;background-color:rgba(0,0,0,.15);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#26000000', endColorstr='#26000000', GradientType=0 )}.scroll-light .scroll-bar{background-color:transparent;background-color:rgba(0,0,0,.14);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#24000000', endColorstr='#24000000', GradientType=0 )}.scroll-track.scroll-light{background-color:transparent;background-color:rgba(0,0,0,.07);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#12000000', endColorstr='#12000000', GradientType=0 )}.scroll-white .scroll-bar{background-color:transparent;background-color:rgba(255,255,255,.33);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#55FFFFFF', endColorstr='#55FFFFFF', GradientType=0 )}.scroll-track.scroll-white{background-color:transparent;background-color:rgba(255,255,255,.2);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#33FFFFFF', endColorstr='#33FFFFFF', GradientType=0 )}.no-track.scroll-track{background-color:transparent;filter:progid:DXImageTransform.Microsoft.gradient( enabled=false )}.scroll-track.scroll-visible{opacity:1;width:8px}.scroll-hz.scroll-visible{height:8px;width:auto}.ace-scroll:hover .scroll-thin.scroll-track,.scroll-thin.scroll-track.active,.scroll-thin.scroll-track.scroll-hover,.scroll-thin.scroll-track.scroll-visible,.scroll-thin.scroll-track:active,.scroll-thin.scroll-track:hover{width:6px}.ace-scroll:hover .scroll-thin.scroll-hz,.scroll-thin.scroll-hz.active,.scroll-thin.scroll-hz.scroll-hover,.scroll-thin.scroll-hz.scroll-visible,.scroll-thin.scroll-hz:active,.scroll-thin.scroll-hz:hover{width:auto;height:6px}.scroll-chrome.scroll-active .scroll-bar{background-color:transparent;width:11px}.scroll-chrome.scroll-active .scroll-bar:before{display:block;content:"";position:absolute;top:1px;bottom:3px;left:1px;right:1px;background-color:#D9D9D9;border:1px solid #BBB;border-radius:1px}.scroll-chrome.scroll-active .scroll-track{width:12px;background-color:#F2F2F2;border:1px solid;border-width:1px 0 1px 1px;border-color:#E6E6E6 transparent #E6E6E6 #DBDBDB}.scroll-chrome.scroll-active .scroll-track:hover .scroll-bar:before{background-color:silver;border-color:#A6A6A6}.scroll-chrome.scroll-active .scroll-track.active .scroll-bar:before{background-color:#A9A9A9;border-color:#8B8B8B}.scroll-active.scroll-track.idle-hide{opacity:0;filter:alpha(opacity=0);width:8px}.scroll-active.scroll-track.idle-hide.not-idle{width:8px;opacity:1;filter:alpha(opacity=100)}.scroll-active.scroll-thin.scroll-track.idle-hide{width:6px}.scroll-active.scroll-chrome .scroll-track.idle-hide{width:12px}.nav-wrap+.scroll-active .scroll-track{width:8px}.nav-scroll.scroll-active .scroll-track{width:8px;right:0}.nav-scroll.scroll-active:hover .scroll-track,.nav-wrap:hover+.scroll-active .scroll-track{width:8px;opacity:1;-webkit-transition-duration:.15s;transition-duration:.15s;-webkit-transition-delay:0s;transition-delay:0s}.nav-scroll.scroll-active:hover .scroll-track{width:8px}.nav-scroll.ace-scroll,.nav-scroll.ace-scroll .scroll-content{overflow:hidden}.modal.aside-vc,.nav-scroll.ace-scroll.scroll-disabled,.nav-scroll.ace-scroll.scroll-disabled .scroll-content{overflow:visible}.scroll-track.scroll-detached{position:absolute;z-index:1029;bottom:auto;right:auto}.modal-content{border-radius:0;-webkit-box-shadow:none;box-shadow:none}.modal-footer{padding-top:12px;padding-bottom:14px;border-top-color:#E4E9EE;-webkit-box-shadow:none;box-shadow:none;background-color:#EFF3F8}.modal-header .close{font-size:32px}.modal-body.padding-25{padding-left:25px;padding-right:25px}.modal.aside-dark .modal-content{background-color:rgba(0,0,0,.85);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#D8000000', endColorstr='#D8000000', GradientType=0 )}.modal.aside{z-index:999;position:absolute}.aside.aside-contained,.modal.aside-fixed.aside-vc,.modal.aside.in{position:fixed}.navbar-fixed-top~.modal.aside-vc{z-index:1025}.modal.aside-fixed.aside-hz,.navbar-fixed-bottom~.modal.aside-hz,.navbar-fixed-top~.modal.aside-hz{position:fixed;z-index:1049}.modal.aside.in{z-index:1050}.modal.aside-vc{margin:auto;width:0;left:auto;right:auto;top:0;bottom:0;display:block!important}.modal.in.aside-vc{width:100%}.modal.aside-vc .modal-dialog{margin:inherit;overflow:inherit;width:250px;max-width:66%;height:inherit;position:inherit;right:inherit;top:inherit;bottom:inherit;left:inherit;opacity:1;transition:transform .3s ease-out 0s;-webkit-transition:-webkit-transform .3s ease-out 0s}@media only screen and (max-width:319px){.modal.aside-vc .modal-dialog{max-width:none;width:200px}.aside-contained.aside-vc .modal-dialog{width:180px}}@media only screen and (max-width:240px){.modal.aside-vc .modal-dialog{max-width:none;width:160px}.aside-contained.aside-vc .modal-dialog{width:140px}}.modal.aside-vc .modal-content{height:100%;overflow:hidden}.modal.in.aside-vc .modal-dialog{transform:none;-webkit-transform:none;height:auto}.modal.aside-vc .aside-trigger{position:absolute;top:155px;right:auto;left:auto;bottom:auto;margin-top:-1px;width:37px;outline:0}.modal.aside-vc .aside-trigger.ace-settings-btn{width:42px}.modal.in.aside-vc .aside-trigger{z-index:-1}.aside.modal.in .modal-backdrop.in+.modal-dialog .aside-trigger{z-index:auto}@media only screen and (max-height:240px){.modal.aside-vc .aside-trigger{top:130px}}.modal.aside-vc.navbar-offset .modal-dialog{top:45px}.modal.aside-vc.navbar-offset .modal-dialog .aside-trigger{top:110px}@media (max-width:479px){.navbar:not(.navbar-collapse)~.modal.aside-vc.navbar-offset .modal-dialog{top:90px}}.modal.aside-right{right:0}.modal.aside-right .modal-content{border-width:0 0 0 1px;box-shadow:-2px 1px 2px 0 rgba(0,0,0,.15)}.modal.aside-right .aside-trigger{right:100%}.modal.aside-right .modal-dialog{transform:translateX(100%);-webkit-transform:translateX(100%)}.modal.aside-left{left:0}.modal.aside-left .modal-content{border-width:0 1px 0 0;box-shadow:2px -1px 2px 0 rgba(0,0,0,.15)}.modal.aside-left .aside-trigger{left:100%}.modal.aside-right .aside-trigger.btn.ace-settings-btn{border-radius:6px 0 0 6px}.modal.aside-left .aside-trigger.btn.ace-settings-btn{border-radius:0 6px 6px 0}.modal.aside-left .modal-dialog{transform:translateX(-100%);-webkit-transform:translateX(-100%)}.modal.aside-hz{margin:auto;height:0;left:0;right:0;top:auto;bottom:auto;display:block!important;overflow:visible}.aside.aside-hidden .modal-content,.wz-finish.ng-hide,.wz-next.ng-hide{display:none}.modal.in.aside-hz{height:100%}.modal.aside-hz .modal-dialog{margin:inherit;height:auto;overflow:inherit;max-height:50%;width:inherit;position:inherit;right:inherit;top:inherit;bottom:inherit;left:inherit;opacity:1;transition:transform .3s ease-out 0s;-webkit-transition:-webkit-transform .3s ease-out 0s}@media only screen and (max-height:320px){.modal.aside-hz .modal-dialog{max-height:66%}}.modal.aside-hz .modal-content{width:100%;overflow:hidden}.modal.in.aside-hz .modal-dialog{transform:none;-webkit-transform:none;height:auto}.modal.aside-hz .aside-trigger{position:absolute;top:auto;right:auto;bottom:auto;margin-top:-1px;z-index:auto;outline:0;margin-left:-15px;left:50%}.modal.aside-hz .aside-trigger.ace-settings-btn{margin-left:-20px}.modal.in.aside-hz .aside-trigger{z-index:-1}.modal.aside-top{top:0}.modal.aside-top .modal-dialog{transform:translateY(-100%);-webkit-transform:translateY(-100%)}.modal.aside-top .modal-content{border-width:0;box-shadow:1px 2px 2px 0 rgba(0,0,0,.15)}.modal.aside-bottom{bottom:0}.modal.aside-bottom .modal-dialog{transform:translateY(100%);-webkit-transform:translateY(100%)}.modal.aside-bottom .modal-content{border-width:0;box-shadow:-1px 2px 2px 0 rgba(0,0,0,.15)}.modal.aside-bottom .aside-trigger{bottom:100%;margin-top:auto;margin-bottom:-1px}.modal.aside-top .aside-trigger.ace-settings-btn{border-radius:0 0 6px 6px!important}.modal.aside-bottom .aside-trigger.ace-settings-btn{border-radius:6px 6px 0 0!important}@media only screen and (min-width:768px){.container.main-container~.modal.aside-vc .modal-dialog{transition:none;-webkit-transition:none}.container.main-container~.modal.aside-vc:not(.in) .modal-content{display:none}}.aside-vc.in.no-backdrop{width:auto}.aside-hz.in.no-backdrop{height:auto}.modal.aside .modal-backdrop{position:fixed;bottom:0;height:auto!important}.modal.aside-hz .aside-trigger.align-left{left:15px;margin-left:auto;text-align:center}.modal.aside-hz .aside-trigger.align-right{text-align:center;left:auto;margin-left:auto;right:15px}.modal.transition-off .modal-dialog{transition:none;-webkit-transition:none}.modal.ng-aside .modal-content{box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal.ng-aside.bottom .modal-content{border-top:1px solid rgba(0,0,0,.2)}.modal.ng-aside.top .modal-content{border-bottom:1px solid rgba(0,0,0,.2)}.modal.ng-aside.left .modal-content{border-right:1px solid rgba(0,0,0,.2)}.modal.ng-aside.right .modal-content{border-left:1px solid rgba(0,0,0,.2)}.modal-backdrop.in[ng-class]{bottom:0}.ng-aside .modal-dialog{width:320px}.breadcrumb,.breadcrumb>li>a,.btn{display:inline-block}.breadcrumbs{position:relative;z-index:auto;border-bottom:1px solid #E5E5E5;background-color:#F5F5F5;min-height:41px;line-height:40px;padding:0 12px 0 0}.breadcrumb{background-color:transparent;line-height:20px;margin:6px 22px 0 12px;padding:0;font-size:13px;color:#333;border-radius:0}.breadcrumb>li,.breadcrumb>li.active{color:#555;padding:0 3px}.breadcrumb>li>a{color:#4C8FBD}.breadcrumb>li+li:before{font-family:FontAwesome;font-size:14px;content:"\f105";color:#B2B6BF;padding:0;margin:0 8px 0 0;position:relative;top:1px}.breadcrumb .home-icon{font-size:20px;margin-left:2px;margin-right:2px;vertical-align:top}@media only screen and (max-width:480px){.modal.aside-vc .modal-dialog{width:240px}.breadcrumb>li>a{padding:0 1px}}@media only screen and (max-width:991px){.menu-toggler+.sidebar.responsive+.main-content .breadcrumb{margin-left:90px}}@media only screen and (max-width:320px){.modal.aside-vc .modal-dialog{width:200px}.breadcrumb{margin-left:8px}.menu-toggler+.sidebar.responsive+.main-content .breadcrumb{margin-left:36px}}@media (min-width:992px){.breadcrumbs-fixed{position:fixed;right:0;left:0;top:auto;z-index:1024}.breadcrumbs-fixed+.page-content{padding-top:49px}.sidebar+.main-content .breadcrumbs-fixed{left:190px}body.mob-safari .breadcrumbs-fixed{top:45px}.sidebar.compact+.main-content .breadcrumbs-fixed{left:105px}.sidebar.menu-min+.main-content .breadcrumbs-fixed{left:43px}}@media (min-width:992px) and (max-width:991px){.breadcrumbs-fixed,.sidebar.menu-min+.main-content .breadcrumbs-fixed{left:0}.sidebar.responsive-max+.main-content .breadcrumbs-fixed,.sidebar.responsive-min+.main-content .breadcrumbs-fixed{left:43px}}@media (min-width:992px){.container.main-container .sidebar.compact+.main-content .breadcrumbs-fixed{width:859px}.container.main-container .breadcrumbs-fixed{left:auto;right:auto;width:964px}.container.main-container .sidebar+.main-content .breadcrumbs-fixed{left:auto;right:auto;width:774px}.container.main-container .sidebar.menu-min+.main-content .breadcrumbs-fixed{left:auto;right:auto;width:921px}}@media (min-width:1200px){.container.main-container .sidebar.compact+.main-content .breadcrumbs-fixed{width:1059px}.container.main-container .breadcrumbs-fixed{width:1164px}.container.main-container .sidebar+.main-content .breadcrumbs-fixed{width:974px}.container.main-container .sidebar.menu-min+.main-content .breadcrumbs-fixed{width:1121px}}@media (min-width:992px) and (max-width:991px){.container.main-container .breadcrumbs-fixed,.container.main-container .sidebar.compact+.main-content .breadcrumbs-fixed,.container.main-container .sidebar.menu-min+.main-content .breadcrumbs-fixed{width:744px}.container.main-container .sidebar.responsive-max+.main-content .breadcrumbs-fixed,.container.main-container .sidebar.responsive-min+.main-content .breadcrumbs-fixed{left:auto;right:auto;width:701px}}@media (min-width:992px){.h-sidebar+.main-content .breadcrumbs.breadcrumbs-fixed{position:relative;top:auto;left:auto;z-index:auto;width:auto}.h-sidebar+.main-content .page-content{padding-top:12px}}.nav-search{position:absolute;right:22px;line-height:24px}.breadcrumbs .nav-search{top:6px}.nav-search .form-search{margin-bottom:0}.nav-search .nav-search-input{border:1px solid #6FB3E0;width:152px;height:28px!important;padding-top:2px;padding-bottom:2px;border-radius:4px!important;font-size:13px;line-height:1.3;color:#666!important;z-index:11;-webkit-transition:width ease .15s;-o-transition:width ease .15s;transition:width ease .15s}.nav-search .nav-search-input+.dropdown-menu{min-width:0;left:0;right:0}.nav-search .nav-search-input:focus,.nav-search .nav-search-input:hover{border-color:#6FB3E0}.nav-search .nav-search-icon{color:#6FB3E0!important;font-size:14px!important;line-height:24px!important;background-color:transparent}.nav-search.minimized .nav-search-input{width:0;opacity:0;filter:alpha(opacity=0);max-width:0}.nav-search.minimized .nav-search-btn:active+.nav-search-input,.nav-search.minimized .nav-search-input:active,.nav-search.minimized .nav-search-input:focus,.nav-search.minimized .nav-search-input:hover,.nav-search.minimized:hover .nav-search-input{opacity:1;filter:alpha(opacity=100);width:152px;max-width:152px}.nav-search.minimized .nav-search-icon{border:1px solid;border-radius:100%;background-color:#FFF;padding:0 5px!important}.nav-search-icon,.nav-search.minimized .nav-search-input:active~.nav-search-icon,.nav-search.minimized .nav-search-input:focus~.nav-search-icon,.nav-search.minimized .nav-search-input:hover~.nav-search-icon,.nav-search.minimized:hover .nav-search-icon{border:none;border-radius:0;padding:0 3px!important}.sidebar>.nav-search{position:static;background-color:#FAFAFA;border-bottom:1px solid #DDD;text-align:center;height:35px;padding-top:6px}.sidebar>.nav-search .nav-search-input{width:162px!important;border-radius:0!important;max-width:162px!important;opacity:1!important;filter:alpha(opacity=100)!important}.sidebar>.nav-search .nav-search-input+.dropdown-menu{text-align:left}.sidebar.menu-min .nav-search .form-search{position:absolute;left:5px;z-index:14}.sidebar.menu-min .nav-search .nav-search-input{width:0!important;max-width:0!important;opacity:0!important;filter:alpha(opacity=0)!important}.sidebar.menu-min .nav-search .nav-search-input:active,.sidebar.menu-min .nav-search .nav-search-input:focus,.sidebar.menu-min .nav-search .nav-search-input:hover,.sidebar.menu-min .nav-search:hover .nav-search-input{width:162px!important;max-width:162px!important;opacity:1!important;filter:alpha(opacity=100)!important}.sidebar.menu-min .nav-search .nav-search-input:active~#nav-search-icon,.sidebar.menu-min .nav-search .nav-search-input:focus~#nav-search-icon,.sidebar.menu-min .nav-search .nav-search-input:hover~#nav-search-icon{border:none;border-radius:0;padding:0 3px!important}.sidebar.menu-min .nav-search:hover .nav-search-input~.nav-search-icon{border:none;border-radius:0;padding:0 3px!important}.sidebar.menu-min .nav-search .nav-search-icon{border:1px solid;border-radius:32px;background-color:#FFF;padding:0 5px!important}@media (max-width:991px){.sidebar.responsive-min .nav-search .form-search{position:absolute;left:5px;z-index:14}.sidebar.responsive-min .nav-search .nav-search-input{width:0!important;max-width:0!important;opacity:0!important;filter:alpha(opacity=0)!important}.sidebar.responsive-min .nav-search .nav-search-input:active,.sidebar.responsive-min .nav-search .nav-search-input:focus,.sidebar.responsive-min .nav-search .nav-search-input:hover,.sidebar.responsive-min .nav-search:hover .nav-search-input{width:162px!important;max-width:162px!important;opacity:1!important;filter:alpha(opacity=100)!important}.sidebar.responsive-min .nav-search .nav-search-input:active~#nav-search-icon,.sidebar.responsive-min .nav-search .nav-search-input:focus~#nav-search-icon,.sidebar.responsive-min .nav-search .nav-search-input:hover~#nav-search-icon{border:none;border-radius:0;padding:0 3px!important}.sidebar.responsive-min .nav-search:hover .nav-search-input~.nav-search-icon{border:none;border-radius:0;padding:0 3px!important}.sidebar.responsive-min .nav-search .nav-search-icon{border:1px solid;border-radius:32px;background-color:#FFF;padding:0 5px!important}}@media only screen and (max-width:991px){.nav-search{right:10px}.nav-search .nav-search-input{width:105px}.nav-search .nav-search-btn:active+.nav-search-input,.nav-search .nav-search-input:active,.nav-search .nav-search-input:focus,.nav-search .nav-search-input:hover,.nav-search:hover .nav-search-input{width:145px}}@media only screen and (max-width:767px){.nav-search .nav-search-input{width:0;opacity:0;filter:alpha(opacity=0);max-width:0}.nav-search .nav-search-btn:active+.nav-search-input,.nav-search .nav-search-input:active,.nav-search .nav-search-input:focus,.nav-search .nav-search-input:hover,.nav-search:hover .nav-search-input{opacity:1;filter:alpha(opacity=100);width:152px;max-width:152px}.nav-search .nav-search-icon{border:1px solid;border-radius:100%;background-color:#FFF;padding:0 5px!important}.nav-search .nav-search-input:active~.nav-search-icon,.nav-search .nav-search-input:focus~.nav-search-icon,.nav-search .nav-search-input:hover~.nav-search-icon,.nav-search:hover .nav-search-icon{border:none;border-radius:0;padding:0 3px!important}}.footer{padding-top:75px;height:0;width:0}.footer .footer-inner{text-align:center;position:absolute;z-index:auto;left:0;right:0;bottom:0}.sidebar~.footer .footer-inner{left:190px}@media (min-width:992px){.sidebar.compact~.footer .footer-inner{left:105px}}.sidebar.menu-min~.footer .footer-inner{left:43px}@media (min-width:992px){.sidebar.h-sidebar~.footer .footer-inner{left:0}}@media (max-width:991px){.footer .footer-inner,.sidebar.compact~.footer .footer-inner,.sidebar.menu-min~.footer .footer-inner,.sidebar~.footer .footer-inner{left:0}.sidebar.responsive-min~.footer .footer-inner{left:43px}}@media (min-width:768px) and (max-width:991px){.container.main-container .footer .footer-inner{left:auto!important;right:auto!important;margin-left:auto;width:744px}}@media (min-width:992px){.container.main-container .footer .footer-inner{left:auto!important;right:auto!important;width:964px}}@media (min-width:1200px){.container.main-container .footer .footer-inner{width:1164px}}@media (min-width:768px) and (max-width:991px){.container.main-container .sidebar~.footer .footer-inner{left:auto!important;right:auto!important;margin-left:auto;width:744px}}@media (min-width:992px){.container.main-container .sidebar~.footer .footer-inner{left:auto!important;right:auto!important;margin-left:190px;width:774px}}@media (min-width:1200px){.container.main-container .sidebar~.footer .footer-inner{margin-left:190px;width:974px}}@media (min-width:992px){.container.main-container .sidebar.compact~.footer .footer-inner{margin-left:105px;width:859px}}@media (min-width:1200px){.container.main-container .sidebar.compact~.footer .footer-inner{margin-left:105px;width:1059px}}@media (min-width:992px){.container.main-container .sidebar.menu-min~.footer .footer-inner{margin-left:43px;width:921px}}@media (min-width:1200px){.container.main-container .sidebar.menu-min~.footer .footer-inner{margin-left:43px;width:1121px}}@media (min-width:992px){.container.main-container .sidebar.h-sidebar~.footer .footer-inner{margin-left:0;width:964px}}@media (min-width:1200px){.container.main-container .sidebar.h-sidebar~.footer .footer-inner{margin-left:0;width:1164px}}@media (min-width:768px) and (max-width:991px){.container.main-container .sidebar.responsive-min~.footer .footer-inner{margin-left:43px;width:701px}}.footer .footer-inner .footer-content{position:absolute;left:12px;right:12px;bottom:4px;padding:8px;line-height:36px;border-top:3px double #E5E5E5}.footer.footer-fixed .footer-inner{position:fixed;z-index:999;bottom:0}.footer.footer-fixed .footer-inner .footer-content{left:2px;right:2px;bottom:2px;border:1px solid #DDD;background-color:#F2F2F2}.footer.footer-fixed+.btn-scroll-up{z-index:999}.btn{color:#FFF!important;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-image:none!important;border:5px solid #FFF;border-radius:0;box-shadow:none!important;-webkit-transition:background-color .15s,border-color .15s,opacity .15s;-o-transition:background-color .15s,border-color .15s,opacity .15s;transition:background-color .15s,border-color .15s,opacity .15s;vertical-align:middle;margin:0;position:relative}.btn-group .dropdown-toggle,.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{border-radius:0}.btn.active,.open>.btn.active.dropdown-toggle{box-shadow:none}.btn-group-lg>.btn,.btn-lg{border-width:5px;line-height:1.4;padding:5px 16px 6px}.btn-group-xlg>.btn,.btn-xlg{border-width:5px;line-height:1.35;padding:7px 16px;font-size:18px}.btn-group-sm>.btn,.btn-sm{border-width:4px;font-size:13px;padding:4px 9px;line-height:1.38}.btn-group-xs>.btn,.btn-xs{padding-top:3px;padding-bottom:3px;border-width:3px}.btn-group-mini>.btn,.btn-mini{padding:1px 5px;border-width:3px;font-size:12px;line-height:1.5}.btn-group-minier>.btn,.btn-minier{padding:0 4px;line-height:18px;border-width:2px;font-size:12px}button.btn:active{top:1px}.btn,.btn-default,.btn-default.focus,.btn-default:focus,.btn.focus,.btn:focus{background-color:#ABBAC3!important;border-color:#ABBAC3}.btn-default.focus:hover,.btn-default:active:hover,.btn-default:focus:active,.btn-default:focus:hover,.btn-default:hover,.btn.focus:hover,.btn:active:hover,.btn:focus:active,.btn:focus:hover,.btn:hover,.open>.btn-default.dropdown-toggle,.open>.btn-default.dropdown-toggle.focus,.open>.btn-default.dropdown-toggle:active,.open>.btn-default.dropdown-toggle:focus,.open>.btn-default.dropdown-toggle:hover,.open>.btn.dropdown-toggle,.open>.btn.dropdown-toggle.focus,.open>.btn.dropdown-toggle:active,.open>.btn.dropdown-toggle:focus,.open>.btn.dropdown-toggle:hover{background-color:#8B9AA3!important;border-color:#ABBAC3}.btn-default.no-border:active,.btn-default.no-border:hover,.btn.no-border:active,.btn.no-border:hover{border-color:#8B9AA3}.btn-default.no-hover:active,.btn-default.no-hover:hover,.btn.no-hover:active,.btn.no-hover:hover{background-color:#ABBAC3!important}.btn-default.active,.btn-default.active:focus,.btn-default.active:hover,.btn-default.focus.active,.btn.active,.btn.active:focus,.btn.active:hover,.btn.focus.active,.open>.btn-default.dropdown-toggle.active,.open>.btn.dropdown-toggle.active{background-color:#9baab3!important;border-color:#8799a4}.btn-default.no-border.active,.btn.no-border.active{background-color:#92a3ac!important;border-color:#92a3ac}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,.btn.disabled,.btn.disabled.active,.btn.disabled:active,.btn.disabled:focus,.btn.disabled:hover,.btn[disabled],.btn[disabled].active,.btn[disabled]:active,.btn[disabled]:focus,.btn[disabled]:hover,fieldset[disabled] .btn,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover,fieldset[disabled] .btn.active,fieldset[disabled] .btn:active,fieldset[disabled] .btn:focus,fieldset[disabled] .btn:hover{background-color:#ABBAC3!important;border-color:#ABBAC3}.btn-primary,.btn-primary.focus,.btn-primary:focus{background-color:#428BCA!important;border-color:#428BCA}.btn-primary.focus:hover,.btn-primary:active:hover,.btn-primary:focus:active,.btn-primary:focus:hover,.btn-primary:hover,.open>.btn-primary.dropdown-toggle,.open>.btn-primary.dropdown-toggle.focus,.open>.btn-primary.dropdown-toggle:active,.open>.btn-primary.dropdown-toggle:focus,.open>.btn-primary.dropdown-toggle:hover{background-color:#1B6AAA!important;border-color:#428BCA}.btn-primary.no-border:active,.btn-primary.no-border:hover{border-color:#1B6AAA}.btn-primary.no-hover:active,.btn-primary.no-hover:hover{background-color:#428BCA!important}.btn-primary.active,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary.focus.active,.open>.btn-primary.dropdown-toggle.active{background-color:#2f7bba!important;border-color:#27689d}.btn-primary.no-border.active{background-color:#2b72ae!important;border-color:#2b72ae}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#428BCA!important;border-color:#428BCA}.btn-info,.btn-info.focus,.btn-info:focus{background-color:#6FB3E0!important;border-color:#6FB3E0}.btn-info.focus:hover,.btn-info:active:hover,.btn-info:focus:active,.btn-info:focus:hover,.btn-info:hover,.open>.btn-info.dropdown-toggle,.open>.btn-info.dropdown-toggle.focus,.open>.btn-info.dropdown-toggle:active,.open>.btn-info.dropdown-toggle:focus,.open>.btn-info.dropdown-toggle:hover{background-color:#4F99C6!important;border-color:#6FB3E0}.btn-info.no-border:active,.btn-info.no-border:hover{border-color:#4F99C6}.btn-info.no-hover:active,.btn-info.no-hover:hover{background-color:#6FB3E0!important}.btn-info.active,.btn-info.active:focus,.btn-info.active:hover,.btn-info.focus.active,.open>.btn-info.dropdown-toggle.active{background-color:#5fa6d3!important;border-color:#4396cb}.btn-info.no-border.active{background-color:#539fd0!important;border-color:#539fd0}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#6FB3E0!important;border-color:#6FB3E0}.btn-info2,.btn-info2.focus,.btn-info2:focus{background-color:#95C6E5!important;border-color:#95C6E5}.btn-info2.focus:hover,.btn-info2:active:hover,.btn-info2:focus:active,.btn-info2:focus:hover,.btn-info2:hover,.open>.btn-info2.dropdown-toggle,.open>.btn-info2.dropdown-toggle.focus,.open>.btn-info2.dropdown-toggle:active,.open>.btn-info2.dropdown-toggle:focus,.open>.btn-info2.dropdown-toggle:hover{background-color:#67A6CE!important;border-color:#95C6E5}.btn-info2.no-border:active,.btn-info2.no-border:hover{border-color:#67A6CE}.btn-info2.no-hover:active,.btn-info2.no-hover:hover{background-color:#95C6E5!important}.btn-info2.active,.btn-info2.active:focus,.btn-info2.active:hover,.btn-info2.focus.active,.open>.btn-info2.dropdown-toggle.active{background-color:#7eb6da!important;border-color:#62a6d1}.btn-info2.no-border.active{background-color:#72afd6!important;border-color:#72afd6}.btn-info2.disabled,.btn-info2.disabled.active,.btn-info2.disabled:active,.btn-info2.disabled:focus,.btn-info2.disabled:hover,.btn-info2[disabled],.btn-info2[disabled].active,.btn-info2[disabled]:active,.btn-info2[disabled]:focus,.btn-info2[disabled]:hover,fieldset[disabled] .btn-info2,fieldset[disabled] .btn-info2.active,fieldset[disabled] .btn-info2:active,fieldset[disabled] .btn-info2:focus,fieldset[disabled] .btn-info2:hover{background-color:#95C6E5!important;border-color:#95C6E5}.btn-success,.btn-success.focus,.btn-success:focus{background-color:#87B87F!important;border-color:#87B87F}.btn-success.focus:hover,.btn-success:active:hover,.btn-success:focus:active,.btn-success:focus:hover,.btn-success:hover,.open>.btn-success.dropdown-toggle,.open>.btn-success.dropdown-toggle.focus,.open>.btn-success.dropdown-toggle:active,.open>.btn-success.dropdown-toggle:focus,.open>.btn-success.dropdown-toggle:hover{background-color:#629B58!important;border-color:#87B87F}.btn-success.no-border:active,.btn-success.no-border:hover{border-color:#629B58}.btn-success.no-hover:active,.btn-success.no-hover:hover{background-color:#87B87F!important}.btn-success.active,.btn-success.active:focus,.btn-success.active:hover,.btn-success.focus.active,.open>.btn-success.dropdown-toggle.active{background-color:#75aa6c!important;border-color:#629959}.btn-success.no-border.active{background-color:#6ba462!important;border-color:#6ba462}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#87B87F!important;border-color:#87B87F}.btn-warning,.btn-warning.focus,.btn-warning:focus{background-color:#FFB752!important;border-color:#FFB752}.btn-warning.focus:hover,.btn-warning:active:hover,.btn-warning:focus:active,.btn-warning:focus:hover,.btn-warning:hover,.open>.btn-warning.dropdown-toggle,.open>.btn-warning.dropdown-toggle.focus,.open>.btn-warning.dropdown-toggle:active,.open>.btn-warning.dropdown-toggle:focus,.open>.btn-warning.dropdown-toggle:hover{background-color:#E59729!important;border-color:#FFB752}.btn-warning.no-border:active,.btn-warning.no-border:hover{border-color:#E59729}.btn-warning.no-hover:active,.btn-warning.no-hover:hover{background-color:#FFB752!important}.btn-warning.active,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning.focus.active,.open>.btn-warning.dropdown-toggle.active{background-color:#f2a73e!important;border-color:#f0981c}.btn-warning.no-border.active{background-color:#f1a02f!important;border-color:#f1a02f}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#FFB752!important;border-color:#FFB752}.btn-danger,.btn-danger.focus,.btn-danger:focus{background-color:#D15B47!important;border-color:#D15B47}.btn-danger.focus:hover,.btn-danger:active:hover,.btn-danger:focus:active,.btn-danger:focus:hover,.btn-danger:hover,.open>.btn-danger.dropdown-toggle,.open>.btn-danger.dropdown-toggle.focus,.open>.btn-danger.dropdown-toggle:active,.open>.btn-danger.dropdown-toggle:focus,.open>.btn-danger.dropdown-toggle:hover{background-color:#B74635!important;border-color:#D15B47}.btn-danger.no-border:active,.btn-danger.no-border:hover{border-color:#B74635}.btn-danger.no-hover:active,.btn-danger.no-hover:hover{background-color:#D15B47!important}.btn-danger.active,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger.focus.active,.open>.btn-danger.dropdown-toggle.active{background-color:#c4513e!important;border-color:#aa4434}.btn-danger.no-border.active{background-color:#ba4b39!important;border-color:#ba4b39}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#D15B47!important;border-color:#D15B47}.btn-inverse,.btn-inverse.focus,.btn-inverse:focus{background-color:#555!important;border-color:#555}.btn-inverse.focus:hover,.btn-inverse:active:hover,.btn-inverse:focus:active,.btn-inverse:focus:hover,.btn-inverse:hover,.open>.btn-inverse.dropdown-toggle,.open>.btn-inverse.dropdown-toggle.focus,.open>.btn-inverse.dropdown-toggle:active,.open>.btn-inverse.dropdown-toggle:focus,.open>.btn-inverse.dropdown-toggle:hover{background-color:#303030!important;border-color:#555}.btn-inverse.no-border:active,.btn-inverse.no-border:hover{border-color:#303030}.btn-inverse.no-hover:active,.btn-inverse.no-hover:hover{background-color:#555!important}.btn-inverse.active,.btn-inverse.active:focus,.btn-inverse.active:hover,.btn-inverse.focus.active,.open>.btn-inverse.dropdown-toggle.active{background-color:#434343!important;border-color:#313131}.btn-inverse.no-border.active{background-color:#3b3b3b!important;border-color:#3b3b3b}.btn-inverse.disabled,.btn-inverse.disabled.active,.btn-inverse.disabled:active,.btn-inverse.disabled:focus,.btn-inverse.disabled:hover,.btn-inverse[disabled],.btn-inverse[disabled].active,.btn-inverse[disabled]:active,.btn-inverse[disabled]:focus,.btn-inverse[disabled]:hover,fieldset[disabled] .btn-inverse,fieldset[disabled] .btn-inverse.active,fieldset[disabled] .btn-inverse:active,fieldset[disabled] .btn-inverse:focus,fieldset[disabled] .btn-inverse:hover{background-color:#555!important;border-color:#555}.btn-pink,.btn-pink.focus,.btn-pink:focus{background-color:#D6487E!important;border-color:#D6487E}.btn-pink.focus:hover,.btn-pink:active:hover,.btn-pink:focus:active,.btn-pink:focus:hover,.btn-pink:hover,.open>.btn-pink.dropdown-toggle,.open>.btn-pink.dropdown-toggle.focus,.open>.btn-pink.dropdown-toggle:active,.open>.btn-pink.dropdown-toggle:focus,.open>.btn-pink.dropdown-toggle:hover{background-color:#B73766!important;border-color:#D6487E}.btn-pink.no-border:active,.btn-pink.no-border:hover{border-color:#B73766}.btn-pink.no-hover:active,.btn-pink.no-hover:hover{background-color:#D6487E!important}.btn-pink.active,.btn-pink.active:focus,.btn-pink.active:hover,.btn-pink.focus.active,.open>.btn-pink.dropdown-toggle.active{background-color:#c74072!important;border-color:#af3462}.btn-pink.no-border.active{background-color:#be386a!important;border-color:#be386a}.btn-pink.disabled,.btn-pink.disabled.active,.btn-pink.disabled:active,.btn-pink.disabled:focus,.btn-pink.disabled:hover,.btn-pink[disabled],.btn-pink[disabled].active,.btn-pink[disabled]:active,.btn-pink[disabled]:focus,.btn-pink[disabled]:hover,fieldset[disabled] .btn-pink,fieldset[disabled] .btn-pink.active,fieldset[disabled] .btn-pink:active,fieldset[disabled] .btn-pink:focus,fieldset[disabled] .btn-pink:hover{background-color:#D6487E!important;border-color:#D6487E}.btn-purple,.btn-purple.focus,.btn-purple:focus{background-color:#9585BF!important;border-color:#9585BF}.btn-purple.focus:hover,.btn-purple:active:hover,.btn-purple:focus:active,.btn-purple:focus:hover,.btn-purple:hover,.open>.btn-purple.dropdown-toggle,.open>.btn-purple.dropdown-toggle.focus,.open>.btn-purple.dropdown-toggle:active,.open>.btn-purple.dropdown-toggle:focus,.open>.btn-purple.dropdown-toggle:hover{background-color:#7461AA!important;border-color:#9585BF}.btn-purple.no-border:active,.btn-purple.no-border:hover{border-color:#7461AA}.btn-purple.no-hover:active,.btn-purple.no-hover:hover{background-color:#9585BF!important}.btn-purple.active,.btn-purple.active:focus,.btn-purple.active:hover,.btn-purple.focus.active,.open>.btn-purple.dropdown-toggle.active{background-color:#8573b5!important;border-color:#705ca8}.btn-purple.no-border.active{background-color:#7c69af!important;border-color:#7c69af}.btn-purple.disabled,.btn-purple.disabled.active,.btn-purple.disabled:active,.btn-purple.disabled:focus,.btn-purple.disabled:hover,.btn-purple[disabled],.btn-purple[disabled].active,.btn-purple[disabled]:active,.btn-purple[disabled]:focus,.btn-purple[disabled]:hover,fieldset[disabled] .btn-purple,fieldset[disabled] .btn-purple.active,fieldset[disabled] .btn-purple:active,fieldset[disabled] .btn-purple:focus,fieldset[disabled] .btn-purple:hover{background-color:#9585BF!important;border-color:#9585BF}.btn-grey,.btn-grey.focus,.btn-grey:focus{background-color:#A0A0A0!important;border-color:#A0A0A0}.btn-grey.focus:hover,.btn-grey:active:hover,.btn-grey:focus:active,.btn-grey:focus:hover,.btn-grey:hover,.open>.btn-grey.dropdown-toggle,.open>.btn-grey.dropdown-toggle.focus,.open>.btn-grey.dropdown-toggle:active,.open>.btn-grey.dropdown-toggle:focus,.open>.btn-grey.dropdown-toggle:hover{background-color:#888!important;border-color:#A0A0A0}.btn-grey.no-border:active,.btn-grey.no-border:hover{border-color:#888}.btn-grey.no-hover:active,.btn-grey.no-hover:hover{background-color:#A0A0A0!important}.btn-grey.active,.btn-grey.active:focus,.btn-grey.active:hover,.btn-grey.focus.active,.open>.btn-grey.dropdown-toggle.active{background-color:#949494!important;border-color:#828282}.btn-grey.no-border.active{background-color:#8c8c8c!important;border-color:#8c8c8c}.btn-grey.disabled,.btn-grey.disabled.active,.btn-grey.disabled:active,.btn-grey.disabled:focus,.btn-grey.disabled:hover,.btn-grey[disabled],.btn-grey[disabled].active,.btn-grey[disabled]:active,.btn-grey[disabled]:focus,.btn-grey[disabled]:hover,fieldset[disabled] .btn-grey,fieldset[disabled] .btn-grey.active,fieldset[disabled] .btn-grey:active,fieldset[disabled] .btn-grey:focus,fieldset[disabled] .btn-grey:hover{background-color:#A0A0A0!important;border-color:#A0A0A0}.btn-yellow{color:#963!important;text-shadow:0 -1px 0 rgba(255,255,255,.4)!important}.btn-yellow,.btn-yellow.focus,.btn-yellow:focus{background-color:#FEE188!important;border-color:#FEE188}.btn-yellow.focus:hover,.btn-yellow:active:hover,.btn-yellow:focus:active,.btn-yellow:focus:hover,.btn-yellow:hover,.open>.btn-yellow.dropdown-toggle,.open>.btn-yellow.dropdown-toggle.focus,.open>.btn-yellow.dropdown-toggle:active,.open>.btn-yellow.dropdown-toggle:focus,.open>.btn-yellow.dropdown-toggle:hover{background-color:#F7D05B!important;border-color:#FEE188}.btn-yellow.no-border:active,.btn-yellow.no-border:hover{border-color:#F7D05B}.btn-yellow.no-hover:active,.btn-yellow.no-hover:hover{background-color:#FEE188!important}.btn-yellow.active,.btn-yellow.active:focus,.btn-yellow.active:hover,.btn-yellow.focus.active,.open>.btn-yellow.dropdown-toggle.active{background-color:#fbd972!important;border-color:#f9cf4f}.btn-yellow.no-border.active{background-color:#fad463!important;border-color:#fad463}.btn-yellow.disabled,.btn-yellow.disabled.active,.btn-yellow.disabled:active,.btn-yellow.disabled:focus,.btn-yellow.disabled:hover,.btn-yellow[disabled],.btn-yellow[disabled].active,.btn-yellow[disabled]:active,.btn-yellow[disabled]:focus,.btn-yellow[disabled]:hover,fieldset[disabled] .btn-yellow,fieldset[disabled] .btn-yellow.active,fieldset[disabled] .btn-yellow:active,fieldset[disabled] .btn-yellow:focus,fieldset[disabled] .btn-yellow:hover{background-color:#FEE188!important;border-color:#FEE188}.btn-yellow.active,.btn-yellow.focus,.btn-yellow:focus,.btn-yellow:hover,.open>.btn-yellow.active.dropdown-toggle,.open>.btn-yellow.dropdown-toggle{color:#963}.btn-light{color:#888!important;text-shadow:0 -1px 0 rgba(250,250,250,.25)!important}.btn.btn-link,.btn.btn-link:hover,.btn.btn-white{text-shadow:none!important}.btn-light,.btn-light.focus,.btn-light:focus{background-color:#E7E7E7!important;border-color:#E7E7E7}.btn-light.focus:hover,.btn-light:active:hover,.btn-light:focus:active,.btn-light:focus:hover,.btn-light:hover,.open>.btn-light.dropdown-toggle,.open>.btn-light.dropdown-toggle.focus,.open>.btn-light.dropdown-toggle:active,.open>.btn-light.dropdown-toggle:focus,.open>.btn-light.dropdown-toggle:hover{background-color:#D9D9D9!important;border-color:#E7E7E7}.btn-light.no-border:active,.btn-light.no-border:hover{border-color:#D9D9D9}.btn-light.no-hover:active,.btn-light.no-hover:hover{background-color:#E7E7E7!important}.btn-light.active,.btn-light.active:focus,.btn-light.active:hover,.btn-light.focus.active,.open>.btn-light.dropdown-toggle.active{background-color:#e0e0e0!important;border-color:#cecece}.btn-light.no-border.active{background-color:#d8d8d8!important;border-color:#d8d8d8}.btn-light.disabled,.btn-light.disabled.active,.btn-light.disabled:active,.btn-light.disabled:focus,.btn-light.disabled:hover,.btn-light[disabled],.btn-light[disabled].active,.btn-light[disabled]:active,.btn-light[disabled]:focus,.btn-light[disabled]:hover,fieldset[disabled] .btn-light,fieldset[disabled] .btn-light.active,fieldset[disabled] .btn-light:active,fieldset[disabled] .btn-light:focus,fieldset[disabled] .btn-light:hover{background-color:#E7E7E7!important;border-color:#E7E7E7}.btn.btn-white,.btn.btn-white.no-hover:active,.btn.btn-white.no-hover:hover{background-color:#FFF!important}.btn.btn-white,.btn.btn-white.active.no-border,.btn.btn-white.disabled,.btn.btn-white.disabled.active,.btn.btn-white.disabled:active,.btn.btn-white.disabled:focus,.btn.btn-white.disabled:hover,.btn.btn-white:active.no-border,.btn.btn-white:focus.no-border,.btn.btn-white:hover.no-border,.btn.btn-white[disabled],.btn.btn-white[disabled].active,.btn.btn-white[disabled]:active,.btn.btn-white[disabled]:focus,.btn.btn-white[disabled]:hover,.open>.btn.btn-white.active.dropdown-toggle.no-border,.open>.btn.btn-white.dropdown-toggle.no-border,fieldset[disabled] .btn.btn-white,fieldset[disabled] .btn.btn-white.active,fieldset[disabled] .btn.btn-white:active,fieldset[disabled] .btn.btn-white:focus,fieldset[disabled] .btn.btn-white:hover{border-color:#CCC}.btn-light.active,.btn-light.focus,.btn-light:focus,.btn-light:hover,.open>.btn-light.active.dropdown-toggle,.open>.btn-light.dropdown-toggle{color:#888}.btn-light.btn-mini:after,.btn-light.btn-xs:after{left:-2px;right:-2px;top:-2px;bottom:-2px}.btn-light.btn-sm:after{left:-4px;right:-4px;top:-4px;bottom:-4px}.btn-light .btn-lg:after{left:-6px;right:-6px;top:-6px;bottom:-6px}.btn.btn-white{color:#444!important}.btn.btn-white.active,.btn.btn-white:focus{box-shadow:inset 1px 1px 2px 0 rgba(0,0,0,.1)!important}.btn.btn-white.active.btn-bold,.btn.btn-white:focus.btn-bold{box-shadow:inset 1px 1px 3px 0 rgba(0,0,0,.15)!important}.btn.btn-white.active:after{display:none}.btn.btn-white.active,.btn.btn-white:active,.btn.btn-white:focus,.btn.btn-white:hover,.open>.btn.btn-white.active.dropdown-toggle,.open>.btn.btn-white.dropdown-toggle{background-color:#EBEBEB!important;border-color:#CCC;color:#3a3434!important}.btn-white.btn-default{border-color:#ABBAC3;color:#80909a!important}.btn-white.btn-default.active,.btn-white.btn-default:active,.btn-white.btn-default:focus,.btn-white.btn-default:hover,.open>.btn-white.btn-default.active.dropdown-toggle,.open>.btn-white.btn-default.dropdown-toggle{background-color:#eff2f4!important;border-color:#ABBAC3;color:#6b8595!important}.btn-white.btn-default.active.no-border,.btn-white.btn-default.disabled,.btn-white.btn-default.disabled.active,.btn-white.btn-default.disabled:active,.btn-white.btn-default.disabled:focus,.btn-white.btn-default.disabled:hover,.btn-white.btn-default:active.no-border,.btn-white.btn-default:focus.no-border,.btn-white.btn-default:hover.no-border,.btn-white.btn-default[disabled],.btn-white.btn-default[disabled].active,.btn-white.btn-default[disabled]:active,.btn-white.btn-default[disabled]:focus,.btn-white.btn-default[disabled]:hover,.open>.btn-white.btn-default.active.dropdown-toggle.no-border,.open>.btn-white.btn-default.dropdown-toggle.no-border,fieldset[disabled] .btn-white.btn-default,fieldset[disabled] .btn-white.btn-default.active,fieldset[disabled] .btn-white.btn-default:active,fieldset[disabled] .btn-white.btn-default:focus,fieldset[disabled] .btn-white.btn-default:hover{border-color:#ABBAC3}.btn-white.btn-primary{border-color:#8aafce;color:#6688a6!important}.btn-white.btn-primary.active,.btn-white.btn-primary:active,.btn-white.btn-primary:focus,.btn-white.btn-primary:hover,.open>.btn-white.btn-primary.active.dropdown-toggle,.open>.btn-white.btn-primary.dropdown-toggle{background-color:#eaf2f8!important;border-color:#8aafce;color:#537c9f!important}.btn-white.btn-primary.active.no-border,.btn-white.btn-primary.disabled,.btn-white.btn-primary.disabled.active,.btn-white.btn-primary.disabled:active,.btn-white.btn-primary.disabled:focus,.btn-white.btn-primary.disabled:hover,.btn-white.btn-primary:active.no-border,.btn-white.btn-primary:focus.no-border,.btn-white.btn-primary:hover.no-border,.btn-white.btn-primary[disabled],.btn-white.btn-primary[disabled].active,.btn-white.btn-primary[disabled]:active,.btn-white.btn-primary[disabled]:focus,.btn-white.btn-primary[disabled]:hover,.open>.btn-white.btn-primary.active.dropdown-toggle.no-border,.open>.btn-white.btn-primary.dropdown-toggle.no-border,fieldset[disabled] .btn-white.btn-primary,fieldset[disabled] .btn-white.btn-primary.active,fieldset[disabled] .btn-white.btn-primary:active,fieldset[disabled] .btn-white.btn-primary:focus,fieldset[disabled] .btn-white.btn-primary:hover{border-color:#8aafce}.btn-white.btn-success{border-color:#a7c9a1;color:#81a87b!important}.btn-white.btn-success.active,.btn-white.btn-success:active,.btn-white.btn-success:focus,.btn-white.btn-success:hover,.open>.btn-white.btn-success.active.dropdown-toggle,.open>.btn-white.btn-success.dropdown-toggle{background-color:#edf4eb!important;border-color:#a7c9a1;color:#6ea465!important}.btn-white.btn-success.active.no-border,.btn-white.btn-success.disabled,.btn-white.btn-success.disabled.active,.btn-white.btn-success.disabled:active,.btn-white.btn-success.disabled:focus,.btn-white.btn-success.disabled:hover,.btn-white.btn-success:active.no-border,.btn-white.btn-success:focus.no-border,.btn-white.btn-success:hover.no-border,.btn-white.btn-success[disabled],.btn-white.btn-success[disabled].active,.btn-white.btn-success[disabled]:active,.btn-white.btn-success[disabled]:focus,.btn-white.btn-success[disabled]:hover,.open>.btn-white.btn-success.active.dropdown-toggle.no-border,.open>.btn-white.btn-success.dropdown-toggle.no-border,fieldset[disabled] .btn-white.btn-success,fieldset[disabled] .btn-white.btn-success.active,fieldset[disabled] .btn-white.btn-success:active,fieldset[disabled] .btn-white.btn-success:focus,fieldset[disabled] .btn-white.btn-success:hover{border-color:#a7c9a1}.btn-white.btn-danger{border-color:#d7a59d;color:#b7837a!important}.btn-white.btn-danger.active,.btn-white.btn-danger:active,.btn-white.btn-danger:focus,.btn-white.btn-danger:hover,.open>.btn-white.btn-danger.active.dropdown-toggle,.open>.btn-white.btn-danger.dropdown-toggle{background-color:#fbf4f3!important;border-color:#d7a59d;color:#b46f64!important}.btn-white.btn-danger.active.no-border,.btn-white.btn-danger.disabled,.btn-white.btn-danger.disabled.active,.btn-white.btn-danger.disabled:active,.btn-white.btn-danger.disabled:focus,.btn-white.btn-danger.disabled:hover,.btn-white.btn-danger:active.no-border,.btn-white.btn-danger:focus.no-border,.btn-white.btn-danger:hover.no-border,.btn-white.btn-danger[disabled],.btn-white.btn-danger[disabled].active,.btn-white.btn-danger[disabled]:active,.btn-white.btn-danger[disabled]:focus,.btn-white.btn-danger[disabled]:hover,.open>.btn-white.btn-danger.active.dropdown-toggle.no-border,.open>.btn-white.btn-danger.dropdown-toggle.no-border,fieldset[disabled] .btn-white.btn-danger,fieldset[disabled] .btn-white.btn-danger.active,fieldset[disabled] .btn-white.btn-danger:active,fieldset[disabled] .btn-white.btn-danger:focus,fieldset[disabled] .btn-white.btn-danger:hover{border-color:#d7a59d}.btn-white.btn-warning{border-color:#e7b979;color:#daa458!important}.btn-white.btn-warning.active,.btn-white.btn-warning:active,.btn-white.btn-warning:focus,.btn-white.btn-warning:hover,.open>.btn-white.btn-warning.active.dropdown-toggle,.open>.btn-white.btn-warning.dropdown-toggle{background-color:#fef7ec!important;border-color:#e7b979;color:#db9a3d!important}.btn-white.btn-warning.active.no-border,.btn-white.btn-warning.disabled,.btn-white.btn-warning.disabled.active,.btn-white.btn-warning.disabled:active,.btn-white.btn-warning.disabled:focus,.btn-white.btn-warning.disabled:hover,.btn-white.btn-warning:active.no-border,.btn-white.btn-warning:focus.no-border,.btn-white.btn-warning:hover.no-border,.btn-white.btn-warning[disabled],.btn-white.btn-warning[disabled].active,.btn-white.btn-warning[disabled]:active,.btn-white.btn-warning[disabled]:focus,.btn-white.btn-warning[disabled]:hover,.open>.btn-white.btn-warning.active.dropdown-toggle.no-border,.open>.btn-white.btn-warning.dropdown-toggle.no-border,fieldset[disabled] .btn-white.btn-warning,fieldset[disabled] .btn-white.btn-warning.active,fieldset[disabled] .btn-white.btn-warning:active,fieldset[disabled] .btn-white.btn-warning:focus,fieldset[disabled] .btn-white.btn-warning:hover{border-color:#e7b979}.btn-white.btn-info,.btn-white.btn-info.active.no-border,.btn-white.btn-info.disabled,.btn-white.btn-info.disabled.active,.btn-white.btn-info.disabled:active,.btn-white.btn-info.disabled:focus,.btn-white.btn-info.disabled:hover,.btn-white.btn-info:active.no-border,.btn-white.btn-info:focus.no-border,.btn-white.btn-info:hover.no-border,.btn-white.btn-info[disabled],.btn-white.btn-info[disabled].active,.btn-white.btn-info[disabled]:active,.btn-white.btn-info[disabled]:focus,.btn-white.btn-info[disabled]:hover,.open>.btn-white.btn-info.active.dropdown-toggle.no-border,.open>.btn-white.btn-info.dropdown-toggle.no-border,fieldset[disabled] .btn-white.btn-info,fieldset[disabled] .btn-white.btn-info.active,fieldset[disabled] .btn-white.btn-info:active,fieldset[disabled] .btn-white.btn-info:focus,fieldset[disabled] .btn-white.btn-info:hover{border-color:#8fbcd9}.btn-white.btn-info{color:#70a0c1!important}.btn-white.btn-info.active,.btn-white.btn-info:active,.btn-white.btn-info:focus,.btn-white.btn-info:hover,.open>.btn-white.btn-info.active.dropdown-toggle,.open>.btn-white.btn-info.dropdown-toggle{background-color:#eef5fa!important;border-color:#8fbcd9;color:#5896bf!important}.btn-white.btn-inverse{border-color:#959595;color:#555!important}.btn-white.btn-inverse.active,.btn-white.btn-inverse:active,.btn-white.btn-inverse:focus,.btn-white.btn-inverse:hover,.open>.btn-white.btn-inverse.active.dropdown-toggle,.open>.btn-white.btn-inverse.dropdown-toggle{background-color:#e4e4e4!important;border-color:#959595;color:#4c4545!important}.btn-white.btn-inverse.active.no-border,.btn-white.btn-inverse.disabled,.btn-white.btn-inverse.disabled.active,.btn-white.btn-inverse.disabled:active,.btn-white.btn-inverse.disabled:focus,.btn-white.btn-inverse.disabled:hover,.btn-white.btn-inverse:active.no-border,.btn-white.btn-inverse:focus.no-border,.btn-white.btn-inverse:hover.no-border,.btn-white.btn-inverse[disabled],.btn-white.btn-inverse[disabled].active,.btn-white.btn-inverse[disabled]:active,.btn-white.btn-inverse[disabled]:focus,.btn-white.btn-inverse[disabled]:hover,.open>.btn-white.btn-inverse.active.dropdown-toggle.no-border,.open>.btn-white.btn-inverse.dropdown-toggle.no-border,fieldset[disabled] .btn-white.btn-inverse,fieldset[disabled] .btn-white.btn-inverse.active,fieldset[disabled] .btn-white.btn-inverse:active,fieldset[disabled] .btn-white.btn-inverse:focus,fieldset[disabled] .btn-white.btn-inverse:hover{border-color:#959595}.btn-white.btn-pink,.btn-white.btn-pink.active.no-border,.btn-white.btn-pink.disabled,.btn-white.btn-pink.disabled.active,.btn-white.btn-pink.disabled:active,.btn-white.btn-pink.disabled:focus,.btn-white.btn-pink.disabled:hover,.btn-white.btn-pink:active.no-border,.btn-white.btn-pink:focus.no-border,.btn-white.btn-pink:hover.no-border,.btn-white.btn-pink[disabled],.btn-white.btn-pink[disabled].active,.btn-white.btn-pink[disabled]:active,.btn-white.btn-pink[disabled]:focus,.btn-white.btn-pink[disabled]:hover,.open>.btn-white.btn-pink.active.dropdown-toggle.no-border,.open>.btn-white.btn-pink.dropdown-toggle.no-border,fieldset[disabled] .btn-white.btn-pink,fieldset[disabled] .btn-white.btn-pink.active,fieldset[disabled] .btn-white.btn-pink:active,fieldset[disabled] .btn-white.btn-pink:focus,fieldset[disabled] .btn-white.btn-pink:hover{border-color:#d299ae}.btn-white.btn-pink{color:#af6f87!important}.btn-white.btn-pink.active,.btn-white.btn-pink:active,.btn-white.btn-pink:focus,.btn-white.btn-pink:hover,.open>.btn-white.btn-pink.active.dropdown-toggle,.open>.btn-white.btn-pink.dropdown-toggle{background-color:#fbeff4!important;border-color:#d299ae;color:#ac5978!important}.btn-white.btn-purple{border-color:#b7b1c6;color:#7d6fa2!important}.btn-white.btn-purple.active,.btn-white.btn-purple:active,.btn-white.btn-purple:focus,.btn-white.btn-purple:hover,.open>.btn-white.btn-purple.active.dropdown-toggle,.open>.btn-white.btn-purple.dropdown-toggle{background-color:#efedf5!important;border-color:#b7b1c6;color:#6d5b9c!important}.btn-white.btn-purple.active.no-border,.btn-white.btn-purple.disabled,.btn-white.btn-purple.disabled.active,.btn-white.btn-purple.disabled:active,.btn-white.btn-purple.disabled:focus,.btn-white.btn-purple.disabled:hover,.btn-white.btn-purple:active.no-border,.btn-white.btn-purple:focus.no-border,.btn-white.btn-purple:hover.no-border,.btn-white.btn-purple[disabled],.btn-white.btn-purple[disabled].active,.btn-white.btn-purple[disabled]:active,.btn-white.btn-purple[disabled]:focus,.btn-white.btn-purple[disabled]:hover,.open>.btn-white.btn-purple.active.dropdown-toggle.no-border,.open>.btn-white.btn-purple.dropdown-toggle.no-border,fieldset[disabled] .btn-white.btn-purple,fieldset[disabled] .btn-white.btn-purple.active,fieldset[disabled] .btn-white.btn-purple:active,fieldset[disabled] .btn-white.btn-purple:focus,fieldset[disabled] .btn-white.btn-purple:hover{border-color:#b7b1c6}.btn-white.btn-yellow{border-color:#ecd181;color:#d3a61a!important}.btn-white.btn-yellow.active,.btn-white.btn-yellow:active,.btn-white.btn-yellow:focus,.btn-white.btn-yellow:hover,.open>.btn-white.btn-yellow.active.dropdown-toggle,.open>.btn-white.btn-yellow.dropdown-toggle{background-color:#fdf7e4!important;border-color:#ecd181;color:#c29712!important}.btn-white.btn-yellow.active.no-border,.btn-white.btn-yellow.disabled,.btn-white.btn-yellow.disabled.active,.btn-white.btn-yellow.disabled:active,.btn-white.btn-yellow.disabled:focus,.btn-white.btn-yellow.disabled:hover,.btn-white.btn-yellow:active.no-border,.btn-white.btn-yellow:focus.no-border,.btn-white.btn-yellow:hover.no-border,.btn-white.btn-yellow[disabled],.btn-white.btn-yellow[disabled].active,.btn-white.btn-yellow[disabled]:active,.btn-white.btn-yellow[disabled]:focus,.btn-white.btn-yellow[disabled]:hover,.open>.btn-white.btn-yellow.active.dropdown-toggle.no-border,.open>.btn-white.btn-yellow.dropdown-toggle.no-border,fieldset[disabled] .btn-white.btn-yellow,fieldset[disabled] .btn-white.btn-yellow.active,fieldset[disabled] .btn-white.btn-yellow:active,fieldset[disabled] .btn-white.btn-yellow:focus,fieldset[disabled] .btn-white.btn-yellow:hover{border-color:#ecd181}.btn-white.btn-grey,.btn-white.btn-grey.active.no-border,.btn-white.btn-grey.disabled,.btn-white.btn-grey.disabled.active,.btn-white.btn-grey.disabled:active,.btn-white.btn-grey.disabled:focus,.btn-white.btn-grey.disabled:hover,.btn-white.btn-grey:active.no-border,.btn-white.btn-grey:focus.no-border,.btn-white.btn-grey:hover.no-border,.btn-white.btn-grey[disabled],.btn-white.btn-grey[disabled].active,.btn-white.btn-grey[disabled]:active,.btn-white.btn-grey[disabled]:focus,.btn-white.btn-grey[disabled]:hover,.open>.btn-white.btn-grey.active.dropdown-toggle.no-border,.open>.btn-white.btn-grey.dropdown-toggle.no-border,fieldset[disabled] .btn-white.btn-grey,fieldset[disabled] .btn-white.btn-grey.active,fieldset[disabled] .btn-white.btn-grey:active,fieldset[disabled] .btn-white.btn-grey:focus,fieldset[disabled] .btn-white.btn-grey:hover{border-color:#c6c6c6}.btn-white.btn-grey{color:#8c8c8c!important}.btn-white.btn-grey.active,.btn-white.btn-grey:active,.btn-white.btn-grey:focus,.btn-white.btn-grey:hover,.open>.btn-white.btn-grey.active.dropdown-toggle,.open>.btn-white.btn-grey.dropdown-toggle{background-color:#ededed!important;border-color:#c6c6c6;color:#857979!important}.btn-white.btn-transparent{background-color:rgba(0,0,0,.4)!important}.btn-white.btn-transparent:hover{background-color:rgba(0,0,0,.5)!important}.btn-white.btn-transparent:active,.btn-white.btn-transparent:focus{background-color:rgba(0,0,0,.6)!important}.btn-white.no-border{border-color:transparent!important}.btn.disabled.active,.btn.disabled:active,.btn.disabled:focus,.btn[disabled].active,.btn[disabled]:active,.btn[disabled]:focus{outline:0}.btn.disabled:active,.btn[disabled]:active{top:0;left:0}.btn.active:after{display:inline-block;content:"";position:absolute;border-bottom:1px solid #EFE5B5;left:-4px;right:-4px;bottom:-4px}.btn.btn-link,.btn.btn-no-border{border-width:0!important}.btn.active.btn-sm:after{left:-3px;right:-3px;bottom:-3px}.btn.active.btn-lg:after{left:-5px;right:-5px;bottom:-5px}.btn.active.btn-mini:after,.btn.active.btn-minier:after,.btn.active.btn-xs:after{left:-1px;right:-1px;bottom:-2px}.btn.active.btn-minier:after{bottom:-1px}.btn.active.btn-yellow:after{border-bottom-color:#C96338}.btn.active.btn-light{color:#515151}.btn.active.btn-light:after{border-bottom-color:#B5B5B5}.btn>.ace-icon{margin-right:4px}.btn>.ace-icon.icon-on-right{margin-right:0;margin-left:4px}.btn>.icon-only.ace-icon{margin:0!important;text-align:center;padding:0}.btn-lg>.ace-icon{margin-right:6px}.btn-lg>.ace-icon.icon-on-right{margin-right:0;margin-left:6px}.btn-sm>.ace-icon{margin-right:3px}.btn-sm>.ace-icon.icon-on-right{margin-right:0;margin-left:3px}.btn-mini>.ace-icon,.btn-minier>.ace-icon,.btn-xs>.ace-icon{margin-right:2px}.btn-mini>.ace-icon.icon-on-right,.btn-minier>.ace-icon.icon-on-right,.btn-xs>.ace-icon.icon-on-right{margin-right:0;margin-left:2px}.btn.btn-link{background:0 0!important;color:#08C!important;padding:4px 12px!important;line-height:20px!important}.btn.btn-link:hover{background:0 0!important}.btn.btn-link.active,.btn.btn-link:active,.btn.btn-link:focus,.open>.btn.btn-link.active,.open>.btn.btn-link:active,.open>.btn.btn-link:focus{background:0 0!important;text-decoration:underline;color:#009ceb!important}.btn.btn-link.active:after,.btn.btn-link:active:after,.btn.btn-link:focus:after{display:none}.btn.btn-link.disabled,.btn.btn-link[disabled]{background:0 0!important;opacity:.65;filter:alpha(opacity=65);text-decoration:none!important}.btn-group:first-child{margin-left:0}.btn-group>.btn,.btn-group>.btn+.btn,.btn-group>.btn:first-child{margin:0 1px 0 0}.btn-group>.btn>.caret{margin-top:15px;margin-left:1px;border-width:5px;border-top-color:#FFF}.btn-group>.btn.btn-sm>.caret{margin-top:10px;border-width:4px}.btn-group>.btn.btn-lg>.caret{margin-top:18px;border-width:6px}.btn-group>.btn.btn-mini>.caret,.btn-group>.btn.btn-xs>.caret{margin-top:9px;border-width:4px}.btn-group>.btn.btn-minier>.caret{margin-top:7px;border-width:3px}.btn-group>.btn+.btn.dropdown-toggle{padding-right:3px;padding-left:3px}.btn-group>.btn+.btn-lg.dropdown-toggle{padding-right:4px;padding-left:4px}.btn-group+.btn,.btn-group>.btn{margin:0 1px 0 0;border-width:3px}.btn-group+.btn.active:after,.btn-group>.btn.active:after{left:-2px;right:-2px;bottom:-2px;border-bottom-width:1px}.btn-group+.btn-lg,.btn-group>.btn-lg{border-width:4px}.btn-group+.btn-lg.active:after,.btn-group>.btn-lg.active:after{left:-3px;right:-3px;bottom:-3px;border-bottom-width:1px}.btn-group+.btn-sm,.btn-group>.btn-sm{border-width:2px}.btn-group+.btn-mini,.btn-group+.btn-minier,.btn-group+.btn-xs,.btn-group>.btn-mini,.btn-group>.btn-minier,.btn-group>.btn-xs,.btn.btn-white{border-width:1px}.btn-group+.btn-sm.active:after,.btn-group>.btn-sm.active:after{left:-1px;right:-1px;bottom:-1px;border-bottom-width:1px}.btn-group+.btn-mini.active:after,.btn-group+.btn-minier.active:after,.btn-group+.btn-xs.active:after,.btn-group>.btn-mini.active:after,.btn-group>.btn-minier.active:after,.btn-group>.btn-xs.active:after{left:0;right:0;bottom:0;border-bottom-width:1px}.btn.btn-bold,.btn.btn-round{border-bottom-width:2px}.btn-group-vertical>.btn:first-child:not(:last-child),.btn-group-vertical>.btn:last-child:not(:first-child){border-radius:0}.btn-group-vertical>.btn,.btn-group-vertical>.btn+.btn{margin:1px 0 0}.btn-group-vertical>.btn:first-child{margin-top:0}.btn-group.btn-overlap>.btn{margin-right:-1px}.btn-group.btn-corner>.btn:first-child{border-bottom-left-radius:8px;border-top-left-radius:8px}.btn-group.btn-corner>.btn:last-child{border-bottom-right-radius:8px;border-top-right-radius:8px}.btn-group.btn-corner>.btn.btn-sm:first-child{border-bottom-left-radius:6px;border-top-left-radius:6px}.btn-group.btn-corner>.btn.btn-sm:last-child{border-bottom-right-radius:6px;border-top-right-radius:6px}.btn-group.btn-corner>.btn.btn-mini:first-child,.btn-group.btn-corner>.btn.btn-xs:first-child{border-bottom-left-radius:4px;border-top-left-radius:4px}.btn-group.btn-corner>.btn.btn-mini:last-child,.btn-group.btn-corner>.btn.btn-xs:last-child{border-bottom-right-radius:4px;border-top-right-radius:4px}.btn.btn-round{border-radius:4px!important}.btn.btn-app{display:inline-block;width:100px;font-size:18px;font-weight:400;color:#FFF;text-align:center;text-shadow:0 -1px -1px rgba(0,0,0,.2)!important;border:none;border-radius:12px;padding:12px 0 8px;margin:2px;line-height:1.7;position:relative}.btn-app,.btn-app.btn-default,.btn-app.btn-default.disabled:hover,.btn-app.btn-default.no-hover:hover,.btn-app.disabled:hover,.btn-app.no-hover:hover{background:repeat-x #b4c2cc!important;background-image:-webkit-linear-gradient(top,#BCC9D5 0,#ABBAC3 100%)!important;background-image:-o-linear-gradient(top,#BCC9D5 0,#ABBAC3 100%)!important;background-image:linear-gradient(to bottom,#BCC9D5 0,#ABBAC3 100%)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffbcc9d5', endColorstr='#ffabbac3', GradientType=0)!important}.btn-app.btn-default:hover,.btn-app:hover{background:repeat-x #9baebc!important;background-image:-webkit-linear-gradient(top,#a3b5c5 0,#93a6b2 100%)!important;background-image:-o-linear-gradient(top,#a3b5c5 0,#93a6b2 100%)!important;background-image:linear-gradient(to bottom,#a3b5c5 0,#93a6b2 100%)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa3b5c5', endColorstr='#ff93a6b2', GradientType=0)!important}.btn-app.btn-primary,.btn-app.btn-primary.disabled:hover,.btn-app.btn-primary.no-hover:hover{background:repeat-x #2a8bcb!important;background-image:-webkit-linear-gradient(top,#3B98D6 0,#197EC1 100%)!important;background-image:-o-linear-gradient(top,#3B98D6 0,#197EC1 100%)!important;background-image:linear-gradient(to bottom,#3B98D6 0,#197EC1 100%)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3b98d6', endColorstr='#ff197ec1', GradientType=0)!important}.btn-app.btn-primary:hover{background:repeat-x #1d6fa6!important;background-image:-webkit-linear-gradient(top,#267eb8 0,#136194 100%)!important;background-image:-o-linear-gradient(top,#267eb8 0,#136194 100%)!important;background-image:linear-gradient(to bottom,#267eb8 0,#136194 100%)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff267eb8', endColorstr='#ff136194', GradientType=0)!important}.btn-app.btn-info,.btn-app.btn-info.disabled:hover,.btn-app.btn-info.no-hover:hover{background:repeat-x #68adde!important;background-image:-webkit-linear-gradient(top,#75B5E6 0,#5BA4D5 100%)!important;background-image:-o-linear-gradient(top,#75B5E6 0,#5BA4D5 100%)!important;background-image:linear-gradient(to bottom,#75B5E6 0,#5BA4D5 100%)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff75b5e6', endColorstr='#ff5ba4d5', GradientType=0)!important}.btn-app.btn-info:hover{background:repeat-x #3f96d4!important;background-image:-webkit-linear-gradient(top,#4a9ede 0,#348dc9 100%)!important;background-image:-o-linear-gradient(top,#4a9ede 0,#348dc9 100%)!important;background-image:linear-gradient(to bottom,#4a9ede 0,#348dc9 100%)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4a9ede', endColorstr='#ff348dc9', GradientType=0)!important}.btn-app.btn-success,.btn-app.btn-success.disabled:hover,.btn-app.btn-success.no-hover:hover{background:repeat-x #85b558!important;background-image:-webkit-linear-gradient(top,#8EBF60 0,#7DAA50 100%)!important;background-image:-o-linear-gradient(top,#8EBF60 0,#7DAA50 100%)!important;background-image:linear-gradient(to bottom,#8EBF60 0,#7DAA50 100%)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff8ebf60', endColorstr='#ff7daa50', GradientType=0)!important}.btn-app.btn-success:hover{background:repeat-x #6c9842!important;background-image:-webkit-linear-gradient(top,#74a844 0,#648740 100%)!important;background-image:-o-linear-gradient(top,#74a844 0,#648740 100%)!important;background-image:linear-gradient(to bottom,#74a844 0,#648740 100%)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff74a844', endColorstr='#ff648740', GradientType=0)!important}.btn-app.btn-danger,.btn-app.btn-danger.disabled:hover,.btn-app.btn-danger.no-hover:hover{background:repeat-x #d3413b!important;background-image:-webkit-linear-gradient(top,#D55B52 0,#D12723 100%)!important;background-image:-o-linear-gradient(top,#D55B52 0,#D12723 100%)!important;background-image:linear-gradient(to bottom,#D55B52 0,#D12723 100%)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd55b52', endColorstr='#ffd12723', GradientType=0)!important}.btn-app.btn-danger:hover{background:repeat-x #b52c26!important;background-image:-webkit-linear-gradient(top,#c43a30 0,#a51f1c 100%)!important;background-image:-o-linear-gradient(top,#c43a30 0,#a51f1c 100%)!important;background-image:linear-gradient(to bottom,#c43a30 0,#a51f1c 100%)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffc43a30', endColorstr='#ffa51f1c', GradientType=0)!important}.btn-app.btn-warning,.btn-app.btn-warning.disabled:hover,.btn-app.btn-warning.no-hover:hover{background:repeat-x #ffb44b!important;background-image:-webkit-linear-gradient(top,#FFBF66 0,#FFA830 100%)!important;background-image:-o-linear-gradient(top,#FFBF66 0,#FFA830 100%)!important;background-image:linear-gradient(to bottom,#FFBF66 0,#FFA830 100%)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffbf66', endColorstr='#ffffa830', GradientType=0)!important}.btn-app.btn-warning:hover{background:repeat-x #fe9e19!important;background-image:-webkit-linear-gradient(top,#fa3 0,#fc9200 100%)!important;background-image:-o-linear-gradient(top,#fa3 0,#fc9200 100%)!important;background-image:linear-gradient(to bottom,#fa3 0,#fc9200 100%)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffaa33', endColorstr='#fffc9200', GradientType=0)!important}.btn-app.btn-purple,.btn-app.btn-purple.disabled:hover,.btn-app.btn-purple.no-hover:hover{background:repeat-x #9889c1!important;background-image:-webkit-linear-gradient(top,#A696CE 0,#8A7CB4 100%)!important;background-image:-o-linear-gradient(top,#A696CE 0,#8A7CB4 100%)!important;background-image:linear-gradient(to bottom,#A696CE 0,#8A7CB4 100%)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa696ce', endColorstr='#ff8a7cb4', GradientType=0)!important}.btn-app.btn-purple:hover{background:repeat-x #7b68af!important;background-image:-webkit-linear-gradient(top,#8973be 0,#6d5ca1 100%)!important;background-image:-o-linear-gradient(top,#8973be 0,#6d5ca1 100%)!important;background-image:linear-gradient(to bottom,#8973be 0,#6d5ca1 100%)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff8973be', endColorstr='#ff6d5ca1', GradientType=0)!important}.btn-app.btn-pink,.btn-app.btn-pink.disabled:hover,.btn-app.btn-pink.no-hover:hover{background:repeat-x #d54c7e!important;background-image:-webkit-linear-gradient(top,#DB5E8C 0,#CE3970 100%)!important;background-image:-o-linear-gradient(top,#DB5E8C 0,#CE3970 100%)!important;background-image:linear-gradient(to bottom,#DB5E8C 0,#CE3970 100%)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdb5e8c', endColorstr='#ffce3970', GradientType=0)!important}.btn-app.btn-pink:hover{background:repeat-x #be2f64!important;background-image:-webkit-linear-gradient(top,#d2346e 0,#aa2a59 100%)!important;background-image:-o-linear-gradient(top,#d2346e 0,#aa2a59 100%)!important;background-image:linear-gradient(to bottom,#d2346e 0,#aa2a59 100%)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd2346e', endColorstr='#ffaa2a59', GradientType=0)!important}.btn-app.btn-inverse,.btn-app.btn-inverse.disabled:hover,.btn-app.btn-inverse.no-hover:hover{background:repeat-x #444!important;background-image:-webkit-linear-gradient(top,#555 0,#333 100%)!important;background-image:-o-linear-gradient(top,#555 0,#333 100%)!important;background-image:linear-gradient(to bottom,#555 0,#333 100%)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff555555', endColorstr='#ff333333', GradientType=0)!important}.btn-app.btn-inverse:hover{background:repeat-x #2b2b2b!important;background-image:-webkit-linear-gradient(top,#3b3b3b 0,#1a1a1a 100%)!important;background-image:-o-linear-gradient(top,#3b3b3b 0,#1a1a1a 100%)!important;background-image:linear-gradient(to bottom,#3b3b3b 0,#1a1a1a 100%)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3b3b3b', endColorstr='#ff1a1a1a', GradientType=0)!important}.btn-app.btn-grey,.btn-app.btn-grey.disabled:hover,.btn-app.btn-grey.no-hover:hover{background:repeat-x #797979!important;background-image:-webkit-linear-gradient(top,#898989 0,#696969 100%)!important;background-image:-o-linear-gradient(top,#898989 0,#696969 100%)!important;background-image:linear-gradient(to bottom,#898989 0,#696969 100%)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff898989', endColorstr='#ff696969', GradientType=0)!important}.btn-app.btn-grey:hover{background:repeat-x #6c6c6c!important;background-image:-webkit-linear-gradient(top,#7c7c7c 0,#5c5c5c 100%)!important;background-image:-o-linear-gradient(top,#7c7c7c 0,#5c5c5c 100%)!important;background-image:linear-gradient(to bottom,#7c7c7c 0,#5c5c5c 100%)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff7c7c7c', endColorstr='#ff5c5c5c', GradientType=0)!important}.btn.btn-app.btn-light{color:#5A5A5A!important;text-shadow:0 1px 1px #EEE!important}.btn.btn-app.btn-light,.btn.btn-app.btn-light.disabled:hover,.btn.btn-app.btn-light.no-hover:hover{background:repeat-x #ededed!important;background-image:-webkit-linear-gradient(top,#F4F4F4 0,#E6E6E6 100%)!important;background-image:-o-linear-gradient(top,#F4F4F4 0,#E6E6E6 100%)!important;background-image:linear-gradient(to bottom,#F4F4F4 0,#E6E6E6 100%)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff4f4f4', endColorstr='#ffe6e6e6', GradientType=0)!important}.btn.btn-app.btn-light:hover{background:repeat-x #e0e0e0!important;background-image:-webkit-linear-gradient(top,#e7e7e7 0,#d9d9d9 100%)!important;background-image:-o-linear-gradient(top,#e7e7e7 0,#d9d9d9 100%)!important;background-image:linear-gradient(to bottom,#e7e7e7 0,#d9d9d9 100%)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe7e7e7', endColorstr='#ffd9d9d9', GradientType=0)!important}.btn.btn-app.btn-yellow{color:#963!important;text-shadow:0 -1px 0 rgba(255,255,255,.4)!important}.btn.btn-app.btn-yellow,.btn.btn-app.btn-yellow.disabled:hover,.btn.btn-app.btn-yellow.no-hover:hover{background:repeat-x #fee088!important;background-image:-webkit-linear-gradient(top,#FFE8A5 0,#FCD76A 100%)!important;background-image:-o-linear-gradient(top,#FFE8A5 0,#FCD76A 100%)!important;background-image:linear-gradient(to bottom,#FFE8A5 0,#FCD76A 100%)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffe8a5', endColorstr='#fffcd76a', GradientType=0)!important}.btn.btn-app.btn-yellow:hover{background:repeat-x #fdd96e!important;background-image:-webkit-linear-gradient(top,#ffe18b 0,#fbd051 100%)!important;background-image:-o-linear-gradient(top,#ffe18b 0,#fbd051 100%)!important;background-image:linear-gradient(to bottom,#ffe18b 0,#fbd051 100%)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffe18b', endColorstr='#fffbd051', GradientType=0)!important}.badge,.label{font-weight:400;background-color:#ABBAC3;text-shadow:none}.btn.btn-app>.ace-icon{opacity:.88}.btn.btn-app:hover>.ace-icon{opacity:1}.btn.btn-app.btn-sm{width:80px;font-size:16px;border-radius:10px;line-height:1.5}.btn.btn-app.btn-xs{width:64px;font-size:15px;border-radius:8px;padding-bottom:7px;padding-top:8px;line-height:1.45}.btn.btn-app>.ace-icon{display:block;font-size:42px;margin:0 0 4px;line-height:36px;min-width:0;padding:0}.dropdown-50,.dropdown-menu.dropdown-only-icon{min-width:50px}.btn.btn-app.btn-sm>.ace-icon{display:block;font-size:32px;line-height:30px;margin:0 0 3px}.btn.btn-app.btn-xs>.ace-icon{display:block;font-size:24px;line-height:24px;margin:0}.btn.btn-app.no-radius{border-radius:0}.btn.btn-app.radius-4{border-radius:4px}.btn.btn-app>.badge,.btn.btn-app>.label{position:absolute!important;top:-2px;right:-2px;padding:1px 3px;text-align:center;font-size:12px;color:#FFF}.btn.btn-app>.badge.badge-left,.btn.btn-app>.badge.label-left,.btn.btn-app>.label.badge-left,.btn.btn-app>.label.label-left{right:auto;left:-2px}.btn.btn-app>.badge-yellow,.btn.btn-app>.label-yellow{color:#963}.btn.btn-app>.badge-light,.btn.btn-app>.label-light{color:#888}.btn.btn-app>.label{padding:1px 6px 3px;font-size:13px}.badge,.label{font-size:12px}.btn.btn-app.no-radius>.badge,.btn.btn-app.radius-4>.badge{border-radius:3px}.badge.no-radius,.btn.btn-app.no-radius>.badge.no-radius,.btn.btn-app.radius-4>.badge.no-radius,.label{border-radius:0}.btn.btn-app.active{color:#FFF}.btn.btn-app.active:after{display:none}.btn.btn-app.active.btn-yellow{color:#963;border-color:#FEE188}.btn.btn-app.active.btn-light{color:#515151}.btn-group>.btn-app:first-child:not(:last-child):not(.dropdown-toggle){margin-right:24px}.label.arrowed-in-right,.label.arrowed-right{margin-right:5px}.btn-group>.btn-app+.btn-app.dropdown-toggle{position:absolute;width:auto;height:100%;padding-left:6px;padding-right:6px;margin-left:-23px;border-bottom-left-radius:0;border-top-left-radius:0;right:0}.label.arrowed,.label.arrowed-in{margin-left:5px}.btn.btn-app.btn-light,.btn.btn-app.btn-yellow{-webkit-box-shadow:0 0 0 1px rgba(0,0,0,.08) inset!important;box-shadow:0 0 0 1px rgba(0,0,0,.08) inset!important}.dropdown-menu,.ui-datepicker{-webkit-box-shadow:0 2px 4px rgba(0,0,0,.2)}.label{color:#FFF;display:inline-block}.label[class*=col-][class*=arrow]{min-height:0}@media screen and (-webkit-min-device-pixel-ratio:0){.label:empty,::safari-only{display:inline-block}.badge:empty,::safari-only{display:inline-block}}.badge{padding-top:1px;padding-bottom:3px;line-height:15px}.badge.radius-1{border-radius:1px}.badge.radius-2{border-radius:2px}.badge.radius-3{border-radius:3px}.badge.radius-4{border-radius:4px}.badge.radius-5{border-radius:5px}.badge.radius-6{border-radius:6px}.badge-transparent,.badge.badge-transparent,.label-transparent,.label.label-transparent{background-color:transparent}.badge-grey,.badge.badge-grey,.label-grey,.label.label-grey{background-color:#A0A0A0}.badge-info,.badge.badge-info,.label-info,.label.label-info{background-color:#3A87AD}.badge-primary,.badge.badge-primary,.label-primary,.label.label-primary{background-color:#428BCA}.badge-success,.badge.badge-success,.label-success,.label.label-success{background-color:#82AF6F}.badge-danger,.badge-important,.badge.badge-danger,.badge.badge-important,.label-danger,.label-important,.label.label-danger,.label.label-important{background-color:#D15B47}.badge-inverse,.badge.badge-inverse,.label-inverse,.label.label-inverse{background-color:#333}.badge-warning,.badge.badge-warning,.label-warning,.label.label-warning{background-color:#F89406}.badge-pink,.badge.badge-pink,.label-pink,.label.label-pink{background-color:#D6487E}.badge-purple,.badge.badge-purple,.label-purple,.label.label-purple{background-color:#9585BF}.badge-yellow,.badge.badge-yellow,.label-yellow,.label.label-yellow{background-color:#FEE188}.badge-light,.badge.badge-light,.label-light,.label.label-light{background-color:#E7E7E7}.badge-yellow,.label-yellow{color:#963;border-color:#FEE188}.badge-light,.label-light{color:#888}.label.arrowed,.label.arrowed-in{position:relative;z-index:1}.label.arrowed-in:before,.label.arrowed:before{display:inline-block;content:"";position:absolute;top:0;z-index:-1;border:1px solid transparent;border-right-color:#ABBAC3}.label.arrowed-in:before{border-color:#ABBAC3 #ABBAC3 #ABBAC3 transparent}.label.arrowed-in-right,.label.arrowed-right{position:relative;z-index:1}.label.arrowed-in-right:after,.label.arrowed-right:after{display:inline-block;content:"";position:absolute;top:0;z-index:-1;border:1px solid transparent;border-left-color:#ABBAC3}.label.arrowed-in-right:after{border-color:#ABBAC3 transparent #ABBAC3 #ABBAC3}.label-info.arrowed:before{border-right-color:#3A87AD}.label-info.arrowed-in:before{border-color:#3A87AD #3A87AD #3A87AD transparent}.label-info.arrowed-right:after{border-left-color:#3A87AD}.label-info.arrowed-in-right:after{border-color:#3A87AD transparent #3A87AD #3A87AD}.label-primary.arrowed:before{border-right-color:#428BCA}.label-primary.arrowed-in:before{border-color:#428BCA #428BCA #428BCA transparent}.label-primary.arrowed-right:after{border-left-color:#428BCA}.label-primary.arrowed-in-right:after{border-color:#428BCA transparent #428BCA #428BCA}.label-success.arrowed:before{border-right-color:#82AF6F}.label-success.arrowed-in:before{border-color:#82AF6F #82AF6F #82AF6F transparent}.label-success.arrowed-right:after{border-left-color:#82AF6F}.label-success.arrowed-in-right:after{border-color:#82AF6F transparent #82AF6F #82AF6F}.label-warning.arrowed:before{border-right-color:#F89406}.label-danger.arrowed:before,.label-important.arrowed:before{border-right-color:#D15B47}.label-warning.arrowed-in:before{border-color:#F89406 #F89406 #F89406 transparent}.label-warning.arrowed-right:after{border-left-color:#F89406}.label-danger.arrowed-right:after,.label-important.arrowed-right:after{border-left-color:#D15B47}.label-warning.arrowed-in-right:after{border-color:#F89406 transparent #F89406 #F89406}.label-important.arrowed-in:before{border-color:#D15B47 #D15B47 #D15B47 transparent}.label-important.arrowed-in-right:after{border-color:#D15B47 transparent #D15B47 #D15B47}.label-danger.arrowed-in:before{border-color:#D15B47 #D15B47 #D15B47 transparent}.label-danger.arrowed-in-right:after{border-color:#D15B47 transparent #D15B47 #D15B47}.label-inverse.arrowed:before{border-right-color:#333}.label-inverse.arrowed-in:before{border-color:#333 #333 #333 transparent}.label-inverse.arrowed-right:after{border-left-color:#333}.label-inverse.arrowed-in-right:after{border-color:#333 transparent #333 #333}.label-pink.arrowed:before{border-right-color:#D6487E}.label-pink.arrowed-in:before{border-color:#D6487E #D6487E #D6487E transparent}.label-pink.arrowed-right:after{border-left-color:#D6487E}.label-pink.arrowed-in-right:after{border-color:#D6487E transparent #D6487E #D6487E}.label-purple.arrowed:before{border-right-color:#9585BF}.label-purple.arrowed-in:before{border-color:#9585BF #9585BF #9585BF transparent}.label-purple.arrowed-right:after{border-left-color:#9585BF}.label-purple.arrowed-in-right:after{border-color:#9585BF transparent #9585BF #9585BF}.label-yellow.arrowed:before{border-right-color:#FEE188}.label-yellow.arrowed-in:before{border-color:#FEE188 #FEE188 #FEE188 transparent}.label-yellow.arrowed-right:after{border-left-color:#FEE188}.label-yellow.arrowed-in-right:after{border-color:#FEE188 transparent #FEE188 #FEE188}.label-light.arrowed:before{border-right-color:#E7E7E7}.label-light.arrowed-in:before{border-color:#E7E7E7 #E7E7E7 #E7E7E7 transparent}.label-light.arrowed-right:after{border-left-color:#E7E7E7}.label-light.arrowed-in-right:after{border-color:#E7E7E7 transparent #E7E7E7 #E7E7E7}.label-grey.arrowed:before{border-right-color:#A0A0A0}.label-grey.arrowed-in:before{border-color:#A0A0A0 #A0A0A0 #A0A0A0 transparent}.label-grey.arrowed-right:after{border-left-color:#A0A0A0}.label-grey.arrowed-in-right:after{border-color:#A0A0A0 transparent #A0A0A0 #A0A0A0}.label{line-height:1.15;height:20px}.label.arrowed:before{left:-10px;border-width:10px 5px}.label-lg.arrowed,.label-lg.arrowed-in{margin-left:6px}.label.arrowed-in:before{left:-5px;border-width:10px 5px}.label.arrowed-right:after{right:-10px;border-width:10px 5px}.label-lg.arrowed-in-right,.label-lg.arrowed-right{margin-right:6px}.label.arrowed-in-right:after{right:-5px;border-width:10px 5px}.label-lg{padding:.3em .6em .4em;font-size:13px;line-height:1.1;height:24px}.label-lg.arrowed:before{left:-12px;border-width:12px 6px}.label-xlg.arrowed,.label-xlg.arrowed-in{margin-left:7px}.label-lg.arrowed-in:before{left:-6px;border-width:12px 6px}.label-lg.arrowed-right:after{right:-12px;border-width:12px 6px}.label-xlg.arrowed-in-right,.label-xlg.arrowed-right{margin-right:7px}.label-lg.arrowed-in-right:after{right:-6px;border-width:12px 6px}.label-xlg{padding:.3em .7em .4em;font-size:14px;line-height:1.3;height:28px}.label-xlg.arrowed:before{left:-14px;border-width:14px 7px}.label-sm.arrowed,.label-sm.arrowed-in{margin-left:4px}.label-xlg.arrowed-in:before{left:-7px;border-width:14px 7px}.label-xlg.arrowed-right:after{right:-14px;border-width:14px 7px}.label-sm.arrowed-in-right,.label-sm.arrowed-right{margin-right:4px}.label-xlg.arrowed-in-right:after{right:-7px;border-width:14px 7px}.label-sm{padding:.2em .4em .3em;font-size:11px;line-height:1;height:18px}.label-sm.arrowed:before{left:-8px;border-width:9px 4px}.label-sm.arrowed-in:before{left:-4px;border-width:9px 4px}.label-sm.arrowed-right:after{right:-8px;border-width:9px 4px}.label-sm.arrowed-in-right:after{right:-4px;border-width:9px 4px}.label>.ace-icon,.label>span{line-height:1;vertical-align:bottom}.label.label-white{color:#879da9;border:1px solid #ABBAC3;background-color:#f2f5f6;border-right-width:1px;border-left-width:2px}.label-white.label-success{color:#7b9e6c;border-color:#9fbf92;background-color:#edf3ea}.label-white.label-warning{color:#d9993e;border-color:#e4ae62;background-color:#fef6eb}.label-white.label-primary{color:#6688a6;border-color:#8aafce;background-color:#eaf2f8}.label-white.label-danger{color:#bd7f75;border-color:#d28679;background-color:#fcf4f2}.label-white.label-info{color:#4e7a8f;border-color:#7aa1b4;background-color:#eaf3f7}.label-white.label-inverse{color:#404040;border-color:#737373;background-color:#ededed}.label-white.label-pink{color:#af6f87;border-color:#d299ae;background-color:#fbeff4}.label-white.label-purple{color:#7d6fa2;border-color:#b7b1c6;background-color:#efedf5}.label-white.label-yellow{color:#cfa114;border-color:#ecd181;background-color:#fdf7e4}.label-white.label-grey{color:#878787;border-color:#cecece;background-color:#ededed}@media screen and (-webkit-min-device-pixel-ratio:1.08) and (-webkit-max-device-pixel-ratio:1.15),screen and (min--moz-device-pixel-ratio:1.08) and (max--moz-device-pixel-ratio:1.15){.label:not(.label-lg):not(.label-xlg):not(.label-sm).arrowed:before{border-width:10.5px 6px 11px;left:-11px}.label:not(.label-lg):not(.label-xlg):not(.label-sm).arrowed-right:after{border-width:10.5px 6px 11px;right:-11px}.label:not(.label-lg):not(.label-xlg):not(.label-sm).arrowed-in:before{border-width:10.5px 5px 11px;left:-6px}.label:not(.label-lg):not(.label-xlg):not(.label-sm).arrowed-in-right:after{border-width:10.5px 5px 11px;right:-6px}}@media screen and (-webkit-min-device-pixel-ratio:1.2) and (-webkit-max-device-pixel-ratio:1.45),screen and (min--moz-device-pixel-ratio:1.2) and (max--moz-device-pixel-ratio:1.45),screen and (-webkit-min-device-pixel-ratio:1.6) and (-webkit-max-device-pixel-ratio:1.9),screen and (min--moz-device-pixel-ratio:1.6) and (max--moz-device-pixel-ratio:1.9){.label:not(.label-lg):not(.label-xlg):not(.label-sm).arrowed:before{border-width:10.5px 6px;left:-11px}.label:not(.label-lg):not(.label-xlg):not(.label-sm).arrowed-right:after{border-width:10.5px 6px;right:-11px}.label:not(.label-lg):not(.label-xlg):not(.label-sm).arrowed-in:before{border-width:10.5px 5px 10px;left:-6px}.label:not(.label-lg):not(.label-xlg):not(.label-sm).arrowed-in-right:after{border-width:10.5px 5px 10px;right:-6px}}@media screen and (-webkit-min-device-pixel-ratio:1.5) and (-webkit-max-device-pixel-ratio:1.6),screen and (min--moz-device-pixel-ratio:1.5) and (max--moz-device-pixel-ratio:1.6){.label:not(.label-lg):not(.label-xlg):not(.label-sm).arrowed:before{border-width:10px 6px;left:-12px}.label:not(.label-lg):not(.label-xlg):not(.label-sm).arrowed-right:after{border-width:10px 6px;right:-12px}}@media screen and (-webkit-min-device-pixel-ratio:1.7) and (-webkit-max-device-pixel-ratio:1.8),screen and (min--moz-device-pixel-ratio:1.7) and (max--moz-device-pixel-ratio:1.8){.label:not(.label-lg):not(.label-xlg):not(.label-sm).arrowed:before{border-width:10px 6px;left:-11.5px}.label:not(.label-lg):not(.label-xlg):not(.label-sm).arrowed-right:after{border-width:10px 6px;right:-11.5px}.label:not(.label-lg):not(.label-xlg):not(.label-sm).arrowed-in:before{border-width:10px 5px;left:-6px}.label:not(.label-lg):not(.label-xlg):not(.label-sm).arrowed-in-right:after{border-width:10px 5px;right:-6px}}@media screen and (-webkit-min-device-pixel-ratio:0.8) and (-webkit-max-device-pixel-ratio:0.9),screen and (min--moz-device-pixel-ratio:0.8) and (max--moz-device-pixel-ratio:0.9){.label:not(.label-lg):not(.label-xlg):not(.label-sm).arrowed:before{border-width:11px 6px;left:-11.5px}.label:not(.label-lg):not(.label-xlg):not(.label-sm).arrowed-right:after{border-width:11px 6px;right:-11.5px}.label:not(.label-lg):not(.label-xlg):not(.label-sm).arrowed-in:before{border-width:11px 5px;left:-6px}.label:not(.label-lg):not(.label-xlg):not(.label-sm).arrowed-in-right:after{border-width:11px 5px;right:-6px}}@media screen and (-webkit-min-device-pixel-ratio:1.08) and (-webkit-max-device-pixel-ratio:1.15),screen and (min--moz-device-pixel-ratio:1.08) and (max--moz-device-pixel-ratio:1.15){.label-lg.arrowed:before{left:-11px}.label-lg.arrowed-right:after{right:-11px}}@media screen and (-webkit-min-device-pixel-ratio:1.7) and (-webkit-max-device-pixel-ratio:1.8),screen and (min--moz-device-pixel-ratio:1.7) and (max--moz-device-pixel-ratio:1.8){.label-lg.arrowed:before{left:-11.5px}.label-lg.arrowed-right:after{right:-11.5px}.label-lg.arrowed-in:before{border-width:12.5px 6px 12px;left:-6px}.label-lg.arrowed-in-right:after{border-width:12.5px 6px 12px;right:-6px}}@media screen and (-webkit-min-device-pixel-ratio:1.08) and (-webkit-max-device-pixel-ratio:1.15),screen and (min--moz-device-pixel-ratio:1.08) and (max--moz-device-pixel-ratio:1.15){.label-xlg.arrowed:before{left:-13px}.label-xlg.arrowed-right:after{right:-13px}.label-xlg.arrowed-in-right:after,.label-xlg.arrowed-in:before{border-width:14px 7px 14.5px}}@media screen and (-webkit-min-device-pixel-ratio:1.2) and (-webkit-max-device-pixel-ratio:1.3),screen and (min--moz-device-pixel-ratio:1.2) and (max--moz-device-pixel-ratio:1.3){.label-xlg.arrowed:before{border-width:14.5px 7px;left:-13.5px}.label-xlg.arrowed-right:after{border-width:14.5px 7px;right:-13.5px}.label-xlg.arrowed-in-right:after,.label-xlg.arrowed-in:before{border-width:14.5px 7px}}@media screen and (-webkit-min-device-pixel-ratio:1.3) and (-webkit-max-device-pixel-ratio:1.4),screen and (-webkit-min-device-pixel-ratio:1.5) and (-webkit-max-device-pixel-ratio:1.6),screen and (min--moz-device-pixel-ratio:1.3) and (max--moz-device-pixel-ratio:1.4),screen and (min--moz-device-pixel-ratio:1.5) and (max--moz-device-pixel-ratio:1.6){.label-xlg.arrowed:before{border-width:14.5px 7.5px;left:-14.5px}.label-xlg.arrowed-right:after{border-width:14.5px 7.5px;right:-14.5px}.label-xlg.arrowed-in-right:after,.label-xlg.arrowed-in:before{border-width:14.5px 7px}}@media screen and (-webkit-min-device-pixel-ratio:1.08) and (-webkit-max-device-pixel-ratio:1.15),screen and (min--moz-device-pixel-ratio:1.08) and (max--moz-device-pixel-ratio:1.15){.label-sm.arrowed:before{border-width:9px 5px;left:-9px}.label-sm.arrowed-right:after{border-width:9px 5px;right:-9px}.label-sm.arrowed-in-right:after,.label-sm.arrowed-in:before{border-width:10px 4px}}@media screen and (-webkit-min-device-pixel-ratio:1.2) and (-webkit-max-device-pixel-ratio:1.3),screen and (min--moz-device-pixel-ratio:1.2) and (max--moz-device-pixel-ratio:1.3){.label-sm.arrowed:before{border-width:9.5px 5px;left:-10px}.label-sm.arrowed-right:after{border-width:9.5px 5px;right:-10px}.label-sm.arrowed-in-right:after,.label-sm.arrowed-in:before{border-width:9.5px 4px}}.dropdown-menu>.active>a>.ace-icon,.dropdown-menu>li>a:focus>.ace-icon,.dropdown-menu>li>a:hover>.ace-icon,.dropdown-submenu:focus>a>.ace-icon,.dropdown-submenu:hover>a>.ace-icon,.icon-white,.nav-list>.active>a>.ace-icon,.nav-pills>.active>a>.ace-icon,.navbar-inverse .nav>.active>a>.ace-icon{background-image:none}.dropdown-menu{border-radius:0!important;box-shadow:0 2px 4px rgba(0,0,0,.2)}.dropdown-menu>li>a{font-size:13px;padding-left:11px;padding-right:11px;padding-bottom:4px;margin-bottom:1px;margin-top:1px}.dropdown-menu.dropdown-only-icon>li{margin:0 4px}.dropdown-menu.dropdown-only-icon>li>a .ace-icon{width:18px;display:inline-block;text-align:center}.dropdown-menu.dropdown-only-icon>li>a .icon-2x{width:36px}.dropdown-menu>li.active:hover>a,.dropdown-menu>li.active>a,.dropdown-menu>li:hover>a,.dropdown-menu>li>a:active,.dropdown-menu>li>a:focus{background:#4F99C6;color:#FFF}.dropdown-default>li.active:hover>a,.dropdown-default>li.active>a,.dropdown-default>li:hover>a,.dropdown-default>li>a:active,.dropdown-default>li>a:focus{background:#ABBAC3;color:#FFF}.dropdown-info>li.active:hover>a,.dropdown-info>li.active>a,.dropdown-info>li:hover>a,.dropdown-info>li>a:active,.dropdown-info>li>a:focus{background:#6FB3E0;color:#FFF}.dropdown-primary>li.active:hover>a,.dropdown-primary>li.active>a,.dropdown-primary>li:hover>a,.dropdown-primary>li>a:active,.dropdown-primary>li>a:focus{background:#428BCA;color:#FFF}.dropdown-success>li.active:hover>a,.dropdown-success>li.active>a,.dropdown-success>li:hover>a,.dropdown-success>li>a:active,.dropdown-success>li>a:focus{background:#87B87F;color:#FFF}.dropdown-warning>li.active:hover>a,.dropdown-warning>li.active>a,.dropdown-warning>li:hover>a,.dropdown-warning>li>a:active,.dropdown-warning>li>a:focus{background:#FFA24D;color:#FFF}.dropdown-danger>li.active:hover>a,.dropdown-danger>li.active>a,.dropdown-danger>li:hover>a,.dropdown-danger>li>a:active,.dropdown-danger>li>a:focus{background:#D15B47;color:#FFF}.dropdown-inverse>li.active:hover>a,.dropdown-inverse>li.active>a,.dropdown-inverse>li:hover>a,.dropdown-inverse>li>a:active,.dropdown-inverse>li>a:focus{background:#555;color:#FFF}.dropdown-purple>li.active:hover>a,.dropdown-purple>li.active>a,.dropdown-purple>li:hover>a,.dropdown-purple>li>a:active,.dropdown-purple>li>a:focus{background:#9585BF;color:#FFF}.dropdown-pink>li.active:hover>a,.dropdown-pink>li.active>a,.dropdown-pink>li:hover>a,.dropdown-pink>li>a:active,.dropdown-pink>li>a:focus{background:#D6487E;color:#FFF}.dropdown-grey>li.active:hover>a,.dropdown-grey>li.active>a,.dropdown-grey>li:hover>a,.dropdown-grey>li>a:active,.dropdown-grey>li>a:focus{background:#A0A0A0;color:#FFF}.dropdown-light>li.active:hover>a,.dropdown-light>li.active>a,.dropdown-light>li:hover>a,.dropdown-light>li>a:active,.dropdown-light>li>a:focus{background:#E7E7E7;color:#333}.dropdown-lighter>li.active:hover>a,.dropdown-lighter>li.active>a,.dropdown-lighter>li:hover>a,.dropdown-lighter>li>a:active,.dropdown-lighter>li>a:focus{background:#EFEFEF;color:#444}.dropdown-lightest>li.active:hover>a,.dropdown-lightest>li.active>a,.dropdown-lightest>li:hover>a,.dropdown-lightest>li>a:active,.dropdown-lightest>li>a:focus{background:#F3F3F3;color:#444}.dropdown-yellow>li.active:hover>a,.dropdown-yellow>li.active>a,.dropdown-yellow>li:hover>a,.dropdown-yellow>li>a:active,.dropdown-yellow>li>a:focus{background:#FEE188;color:#444}.dropdown-yellow2>li.active:hover>a,.dropdown-yellow2>li.active>a,.dropdown-yellow2>li:hover>a,.dropdown-yellow2>li>a:active,.dropdown-yellow2>li>a:focus{background:#F9E8B3;color:#444}.dropdown-light-blue>li.active:hover>a,.dropdown-light-blue>li.active>a,.dropdown-light-blue>li:hover>a,.dropdown-light-blue>li>a:active,.dropdown-light-blue>li>a:focus{background:#ECF3F9;color:#456}.dropdown-menu.dropdown-close{top:92%;left:-5px}.dropdown-menu.dropdown-close.dropdown-menu-right{left:auto;right:-5px}.dropdown-menu.dropdown-closer{top:80%;left:-10px}.dropdown-menu.dropdown-closer.dropdown-menu-right{right:-10px;left:auto}.dropup>.dropdown-menu,.navbar-fixed-bottom .dropdown>.dropdown-menu{top:auto!important;bottom:100%}.dropup>.dropdown-menu.dropdown-close,.navbar-fixed-bottom .dropdown>.dropdown-menu.dropdown-close{bottom:92%}.dropup>.dropdown-menu.dropdown-closer,.navbar-fixed-bottom .dropdown>.dropdown-menu.dropdown-closer{bottom:80%}.dropdown-submenu>.dropdown-menu{border-radius:0}.dropdown-submenu>a:after{margin-right:-5px}.dropdown-75{min-width:75px}.dropdown-100{min-width:100px}.dropdown-125{min-width:125px}.dropdown-150{min-width:150px}.dropdown-hover{position:relative}.dropdown-hover:before{display:block;content:"";position:absolute;top:-2px;bottom:-2px;left:-2px;right:-2px;background-color:transparent}.dropdown-hover:hover>.dropdown-menu{display:block}.dropdown-menu.dropdown-caret:after,.dropdown-menu.dropdown-caret:before{content:"";display:inline-block;position:absolute}.dropdown-menu>.dropdown-hover>.dropdown-menu{top:-5px;left:99%;right:auto}.dropdown-menu>.dropdown-hover>.dropdown-menu.dropdown-menu-right{left:auto;right:99%}.dropdown-menu>.dropdown-hover.dropup>.dropdown-menu,.dropup .dropdown-menu>.dropdown-hover>.dropdown-menu{top:auto;bottom:-5px}.dropdown-menu.dropdown-caret:before{border-bottom:7px solid rgba(0,0,0,.2);border-left:7px solid transparent;border-right:7px solid transparent;left:9px;top:-6px}.dropdown-menu.dropdown-caret:after{border-bottom:6px solid #FFF;border-left:6px solid transparent;border-right:6px solid transparent;left:10px;top:-5px}.dropdown-menu.dropdown-caret-right.dropdown-caret:before,.dropdown-menu.dropdown-menu-right.dropdown-caret:before{left:auto;right:9px}.dropdown-menu.dropdown-caret-right.dropdown-caret:after,.dropdown-menu.dropdown-menu-right.dropdown-caret:after{left:auto;right:10px}.dropup>.dropdown-menu.dropdown-caret:before,.navbar-fixed-bottom .dropdown>.dropdown-menu.dropdown-caret:before{border-bottom-width:0;border-top:7px solid rgba(0,0,0,.2);bottom:-7px;top:auto}.dropup>.dropdown-menu.dropdown-caret:after,.navbar-fixed-bottom .dropdown>.dropdown-menu.dropdown-caret:after{border-bottom-width:0;border-top:6px solid #FFF;bottom:-6px;top:auto}.dropdown-colorpicker>.dropdown-menu{padding:4px;min-width:130px;max-width:130px;top:80%;left:-7px}.dropdown-colorpicker>.dropdown-menu.dropdown-menu-right{right:-7px;left:auto}.dropdown-colorpicker>.dropdown-menu>li{display:block;float:left;width:20px;height:20px;margin:2px}.dropdown-colorpicker>.dropdown-menu>li>.colorpick-btn{display:block;width:20px;height:20px;margin:0;padding:0;border-radius:0;position:relative;-webkit-transition:all ease .1s;-o-transition:all ease .1s;transition:all ease .1s}.dropdown-colorpicker>.dropdown-menu>li>.colorpick-btn:hover{text-decoration:none;opacity:.8;filter:alpha(opacity=80);-webkit-transform:scale(1.08,1.08);-ms-transform:scale(1.08,1.08);-o-transform:scale(1.08,1.08);transform:scale(1.08,1.08)}.dropdown-colorpicker>.dropdown-menu>li>.colorpick-btn.selected:after{content:"\f00c";display:inline-block;font-family:FontAwesome;font-size:11px;color:#FFF;position:absolute;left:0;right:0;text-align:center;line-height:20px}.btn-colorpicker{display:inline-block;width:20px;height:20px;background-color:#DDD;vertical-align:middle;border-radius:0}.dropdown-navbar{padding:0;width:240px;-webkit-box-shadow:0 2px 4px rgba(30,30,100,.25);box-shadow:0 2px 4px rgba(30,30,100,.25);border-color:#BCD4E5}.dropdown-navbar>li{padding:0 8px;background-color:#FFF}.dropdown-navbar>li.dropdown-header{text-shadow:none;padding-top:0;padding-bottom:0;line-height:34px;font-size:13px;font-weight:700;text-transform:none;border-bottom:1px solid}.dropdown-navbar>li>.ace-icon,.dropdown-navbar>li>a>.ace-icon{margin-right:5px!important;color:#555;font-size:14px}.dropdown-navbar>li>a{padding:10px 2px;margin:0;border-top:1px solid;font-size:12px;line-height:16px;color:#555!important;background-color:transparent!important;white-space:normal;border-top-color:#E4ECF3}.dropdown-navbar>li>a .progress{margin-bottom:0;margin-top:4px}.dropdown-navbar>li>a .badge{line-height:16px;padding-right:4px;padding-left:4px;font-size:12px}.dropdown-navbar>li.dropdown-header+li>a,.dropdown-navbar>li:first-child>a{border-top-width:0}.dropdown-navbar>li.dropdown-footer>a{color:#4F99C6!important;text-align:center;font-size:13px}.dropdown-navbar>li.dropdown-footer>a:hover{background-color:#FFF;text-decoration:underline}.dropdown-navbar>li.dropdown-footer>a:hover>.ace-icon{text-decoration:none}.dropdown-navbar>li:hover{background-color:#F4F9FC}.dropdown-navbar>li.dropdown-header{background-color:#ECF2F7;color:#8090A0;border-bottom-color:#BCD4E5}.dropdown-navbar>li.dropdown-header>.ace-icon{color:#8090A0}.dropdown-navbar.navbar-pink{border-color:#E5BCD4}.dropdown-navbar.navbar-pink>li:hover{background-color:#FCF4F9}.dropdown-navbar.navbar-pink>li.dropdown-header{background-color:#F7ECF2;color:#B471A0;border-bottom-color:#E5BCD4}.dropdown-navbar.navbar-pink>li.dropdown-header>.ace-icon{color:#C06090}.dropdown-navbar.navbar-pink>li>a{border-top-color:#F3E4EC}.dropdown-navbar.navbar-grey{border-color:#E5E5E5}.dropdown-navbar.navbar-grey>li:hover{background-color:#F8F8F8}.dropdown-navbar.navbar-grey>li.dropdown-header{background-color:#F2F2F2;color:#3A87AD;border-bottom-color:#E5E5E5}.dropdown-navbar.navbar-grey>li.dropdown-header>.ace-icon{color:#3A87AD}.dropdown-navbar.navbar-grey>li>a{border-top-color:#EEE}.dropdown-navbar.navbar-green{border-color:#B4D5AC}.dropdown-navbar.navbar-green>li:hover{background-color:#F4F9EF}.dropdown-navbar.navbar-green>li.dropdown-header{background-color:#EBF7E4;color:#8A6;border-bottom-color:#B4D5AC}.dropdown-navbar.navbar-green>li.dropdown-header>.ace-icon{color:#90C060}.dropdown-navbar.navbar-green>li>a{border-top-color:#ECF3E4}.dropdown-navbar [class*=btn].ace-icon{display:inline-block;margin:0 5px 0 0;width:24px;text-align:center;padding-left:0;padding-right:0}.dropdown-navbar .msg-photo{max-width:42px;float:left;margin-top:2px}.dropdown-navbar .msg-body{display:block;line-height:20px;white-space:normal;vertical-align:middle;margin-left:50px}.dropdown-navbar .msg-title{display:inline-block;line-height:14px}.dropdown-navbar .msg-time{display:block;font-size:11px;color:#777}.dropdown-navbar .msg-time>.ace-icon{font-size:14px;color:#555}.dropdown-navbar>.dropdown-content{padding:0}.dropdown-navbar>.dropdown-content .dropdown-navbar{list-style:none;margin:0;padding:0!important;-webkit-box-shadow:none;box-shadow:none;width:auto;display:block;float:none;border-width:0;position:static;z-index:auto}.dropdown-navbar .nav-tabs{border-width:0;box-shadow:none;background-color:#F9F9F9!important;top:auto;width:100%}.dropdown-navbar .nav-tabs>li{display:table-cell;width:1%;float:none!important}.dropdown-navbar .nav-tabs>li>a{margin:0 0 0 1px!important;text-align:center;box-shadow:none!important;background-color:#F9F9F9!important;border-width:0!important;border-bottom:2px solid #BECAD1!important}.dropdown-navbar .nav-tabs>li>a:before{display:block;content:"";position:absolute;left:-1px;top:3px;bottom:3px;width:1px;background-color:#BECAD1}.dropdown-navbar .nav-tabs>li:first-child>a{margin-left:0!important}.dropdown-navbar .nav-tabs>li:first-child>a:before{display:none}.dropdown-navbar .nav-tabs>li.active>a{border-bottom:2px solid #79B0CE!important;color:#5085AF!important;background-color:#ECF2F7!important}.dropdown-navbar .tab-content{padding:0!important;border-color:#FFF!important}.dropdown-navbar .tab-content .dropdown-menu{display:block;position:static;margin:0!important;padding-top:2px;border-color:#FFF!important;box-shadow:none!important;width:100%}.dropdown-navbar.navbar-pink .nav-tabs>li.active>a{border-bottom:2px solid #E5BCD4!important;color:#C06090!important;background-color:#F7ECF2!important}.dropdown-navbar.navbar-pink .nav-tabs>li:not(.active)>a:hover{color:#BA7396}.dropdown-navbar.navbar-pink .nav-tabs>li>a:before{background-color:#CEBBCB}.dropdown-navbar.navbar-pink .nav-tabs>li>a{border-bottom-color:#CEBBCD!important}.form-line{margin-bottom:24px;padding-bottom:12px;border-bottom:1px solid #EEE}.form-actions{display:block;background-color:#F5F5F5;border-top:1px solid #E5E5E5;margin-bottom:20px;margin-top:20px;padding:19px 20px 20px}.help-button{display:inline-block;height:22px;width:22px;line-height:22px;text-align:center;padding:0;background-color:#65BCDA;color:#FFF;font-size:12px;font-weight:700;cursor:default;margin-left:4px;border-radius:100%;border:2px solid #FFF;-webkit-box-shadow:0 1px 0 1px rgba(0,0,0,.2);box-shadow:0 1px 0 1px rgba(0,0,0,.2)}.help-button:hover{background-color:#65BCDA;text-shadow:none}label{font-weight:400;font-size:14px}.form-group>label[class*=col-]{margin-bottom:4px}td>label,th>label{margin-bottom:0;line-height:inherit;vertical-align:middle}label.inline{margin-bottom:3px}input[type=email],input[type=url],input[type=search],input[type=tel],input[type=color],input[type=text],input[type=password],input[type=datetime],input[type=datetime-local],input[type=date],input[type=month],input[type=time],input[type=week],input[type=number],textarea{border-radius:0!important;color:#858585;background-color:#FFF;border:1px solid #D5D5D5;padding:5px 4px 6px;font-size:14px;font-family:inherit;-webkit-box-shadow:none!important;box-shadow:none!important;-webkit-transition-duration:.1s;transition-duration:.1s}input[type=email]:hover,input[type=url]:hover,input[type=search]:hover,input[type=tel]:hover,input[type=color]:hover,input[type=text]:hover,input[type=password]:hover,input[type=datetime]:hover,input[type=datetime-local]:hover,input[type=date]:hover,input[type=month]:hover,input[type=time]:hover,input[type=week]:hover,input[type=number]:hover,textarea:hover{border-color:#b5b5b5}input[type=email]:focus,input[type=url]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=color]:focus,input[type=text]:focus,input[type=password]:focus,input[type=datetime]:focus,input[type=datetime-local]:focus,input[type=date]:focus,input[type=month]:focus,input[type=time]:focus,input[type=week]:focus,input[type=number]:focus,textarea:focus{-webkit-box-shadow:none;box-shadow:none;color:#696969;border-color:#F59942;background-color:#FFF;outline:0}.form-control::-webkit-input-placeholder,input::-webkit-input-placeholder{color:silver}.form-control:-moz-placeholder,input:-moz-placeholder{color:silver;opacity:1}.form-control::-moz-placeholder,input::-moz-placeholder{color:silver;opacity:1}.form-control:-ms-input-placeholder,input:-ms-input-placeholder{color:silver}.form-control,select{border-radius:0;-webkit-box-shadow:none!important;box-shadow:none!important;color:#858585;background-color:#FFF;border:1px solid #D5D5D5}.form-control:focus,select:focus{color:#696969;border-color:#F59942;background-color:#FFF;outline:0}textarea.form-control{padding:5px 9px}select{padding:3px 4px;height:30px}select.form-control{padding:4px 6px}select.form-control[multiple],select[multiple]{height:auto}select.input-sm{border-radius:0;padding:2px 3px}select.input-lg{border-radius:0;padding:6px 8px}input.block{display:block;margin-bottom:9px}textarea.autosize-transition{-webkit-transition-duration:"height 0.2s";transition-duration:"height 0.2s"}.limiterBox{border:1px solid #222;border-top:none;background-color:#333;padding:3px 6px;font-size:13px;color:#FFF;margin-top:6px}.limiterBox:after{display:none}.limiterBox:before{display:block;content:"";position:absolute;width:0;height:0;top:-8px;left:50%;margin-left:-5px;border-color:transparent transparent #333;border-style:solid;border-width:0 8px 8px}select option,select.form-control option{padding:3px 4px 5px}select option:active,select option:focus,select option:hover,select.form-control option:active,select.form-control option:focus,select.form-control option:hover{background-color:#EEE;color:#444}select option.no-option,select.form-control option.no-option{padding:1px 0}input[disabled]{color:#848484!important;background-color:#EEE!important}input[disabled]:hover{border-color:#D5D5D5!important}input[readonly]{color:#939192;background:#F5F5F5!important;cursor:default}input[readonly]:hover{border-color:#c3c3c3}input[readonly]:focus{-webkit-box-shadow:none;box-shadow:none;border-color:#AAA;background-color:#F9F9F9}.help-inline{font-size:13px!important}.input-icon{position:relative}span.input-icon{display:inline-block}.input-icon>input{padding-left:24px;padding-right:6px}.input-icon.input-icon-right>input{padding-left:6px;padding-right:24px}.input-icon>.ace-icon{padding:0 3px;z-index:2;position:absolute;top:1px;bottom:1px;left:3px;line-height:30px;display:inline-block;color:#909090;font-size:16px}.input-icon.input-icon-right>.ace-icon{left:auto;right:3px}.input-icon>input:focus+.ace-icon{color:#579}.input-icon~.help-inline{padding-left:8px}.form-inline .checkbox [type=checkbox]+label,.form-inline .radio [type=radio]+label,.form-search .checkbox [type=checkbox]+label,.form-search .radio [type=radio]+label{float:left;margin-left:-20px}.form-inline .form-inline .checkbox [type=checkbox]+label,.form-inline .form-inline .radio [type=radio]+label,.form-inline .form-search .checkbox [type=checkbox]+label,.form-inline .form-search .radio [type=radio]+label,.form-search .form-inline .checkbox [type=checkbox]+label,.form-search .form-inline .radio [type=radio]+label,.form-search .form-search .checkbox [type=checkbox]+label,.form-search .form-search .radio [type=radio]+label{margin-left:0;margin-right:3px}.form-search .input-append .search-query:focus,.form-search .input-prepend .search-query:focus{-webkit-box-shadow:none;box-shadow:none}.input-append .uneditable-input,.input-append input,.input-append select,.input-prepend .uneditable-input,.input-prepend input,.input-prepend select{border-radius:0}.input-mini{width:60px;max-width:100%}.input-small{width:90px;max-width:100%}.input-md,.input-medium{width:150px;max-width:100%}.input-large{width:210px;max-width:100%}.input-xlarge{width:270px;max-width:100%}.input-xxlarge{width:530px;max-width:100%}input.input-lg{font-size:18px}input[type=checkbox].ace,input[type=radio].ace{opacity:0;position:absolute;z-index:1;width:18px;height:18px;cursor:pointer}label input[type=checkbox].ace,label input[type=radio].ace{z-index:-100!important;width:1px!important;height:1px!important;clip:rect(1px,1px,1px,1px);position:absolute}input[type=checkbox].ace:checked,input[type=checkbox].ace:focus,input[type=radio].ace:checked,input[type=radio].ace:focus{outline:0!important}input[type=checkbox].ace+.lbl,input[type=radio].ace+.lbl{position:relative;display:inline-block;margin:0;line-height:20px;min-height:18px;min-width:18px;font-weight:400;cursor:pointer}input[type=checkbox].ace+.lbl::before,input[type=radio].ace+.lbl::before{cursor:pointer;font-family:fontAwesome;font-weight:400;font-size:12px;color:#FFF;content:"\a0";background-color:#FAFAFA;border:1px solid #C8C8C8;box-shadow:0 1px 2px rgba(0,0,0,.05);border-radius:0;display:inline-block;text-align:center;height:16px;line-height:14px;min-width:16px;margin-right:1px;position:relative;top:-1px}input[type=checkbox].ace:checked+.lbl::before,input[type=radio].ace:checked+.lbl::before{display:inline-block;content:'\f00c';color:#32A3CE;background-color:#F5F8FC;border-color:#ADB8C0;box-shadow:0 1px 2px rgba(0,0,0,.05),inset 0 -15px 10px -12px rgba(0,0,0,.05),inset 15px 10px -12px rgba(255,255,255,.1)}input[type=checkbox].ace+.lbl:hover::before,input[type=checkbox].ace:hover+.lbl::before,input[type=radio].ace+.lbl:hover::before,input[type=radio].ace:hover+.lbl::before{border-color:#FF893C}input[type=checkbox].ace:focus+.lbl::before,input[type=radio].ace:focus+.lbl::before{border-color:#F59942}input[type=checkbox].ace:active+.lbl::before,input[type=checkbox].ace:checked:active+.lbl::before,input[type=radio].ace:active+.lbl::before,input[type=radio].ace:checked:active+.lbl::before{box-shadow:0 1px 2px rgba(0,0,0,.05),inset 0 1px 3px rgba(0,0,0,.1)}input[type=checkbox].ace.ace-checkbox-2+.lbl::before,input[type=radio].ace.ace-checkbox-2+.lbl::before{box-shadow:none}input[type=checkbox].ace.ace-checkbox-2:checked+.lbl::before,input[type=radio].ace.ace-checkbox-2:checked+.lbl::before{background-color:#F9A021;border-color:#F9A021;color:#FFF}input[type=checkbox].ace.disabled+.lbl::before,input[type=checkbox].ace:disabled+.lbl::before,input[type=checkbox].ace[disabled]+.lbl::before,input[type=radio].ace.disabled+.lbl::before,input[type=radio].ace:disabled+.lbl::before,input[type=radio].ace[disabled]+.lbl::before{background-color:#DDD!important;border-color:#CCC!important;box-shadow:none!important;color:#BBB}.checkbox label input[type=checkbox].ace+.lbl,.radio label input[type=radio].ace+.lbl{margin-left:-10px}input[type=radio].ace+.lbl::before{border-radius:100%;font-size:10px;font-family:FontAwesome;text-shadow:0 0 1px #32A3CE;line-height:15px;height:17px;min-width:17px}input[type=radio].ace:checked+.lbl::before{content:"\f111"}input[type=checkbox].ace.input-lg+.lbl::before{border-radius:4px;font-size:16px;height:24px;line-height:21px;min-width:24px;top:auto}input[type=radio].ace.input-lg+.lbl::before{font-size:14px;height:24px;line-height:22px;min-width:24px;top:auto}input[type=checkbox].ace.ace-switch{width:55px;height:25px}input[type=checkbox].ace.ace-switch+.lbl{margin:0 4px;min-height:24px}input[type=checkbox].ace.ace-switch+.lbl::before{font-family:'Open Sans';content:"ON\a0\a0\a0\a0\a0\a0\a0\a0\a0OFF";color:#999;text-shadow:0 0 0 #999;font-weight:400;font-size:11px;line-height:17px;height:20px;overflow:hidden;border-radius:12px;background-color:#F5F5F5;-webkit-box-shadow:inset 0 1px 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 1px 0 rgba(0,0,0,.15);border:1px solid #CCC;text-align:left;float:left;padding:0;width:52px;text-indent:-21px;margin-right:0;-webkit-transition:text-indent .25s ease;-o-transition:text-indent .25s ease;transition:text-indent .25s ease;top:auto}input[type=checkbox].ace.ace-switch+.lbl::after{font-family:'Open Sans';content:'III';font-size:12px;font-weight:400;letter-spacing:0;color:#AAA;text-shadow:none;background-color:#FFF;border-radius:100%;width:22px;height:22px;line-height:22px;text-align:center;position:absolute;top:-2px;left:-3px;-webkit-box-shadow:0 1px 1px 1px rgba(0,0,0,.3);box-shadow:0 1px 1px 1px rgba(0,0,0,.3);-webkit-transition:left .25s ease;-o-transition:left .25s ease;transition:left .25s ease}input[type=checkbox].ace.ace-switch:checked+.lbl::before{text-indent:8px;color:#FFF;text-shadow:0 0 0 #FFF;background-color:#8AB2C9;border-color:#6A8CA8}input[type=checkbox].ace.ace-switch:checked+.lbl::after{left:34px;background-color:#FFF;color:#98A0A5}input[type=checkbox].ace.ace-switch.ace-switch-2+.lbl::before{content:"YES\a0\a0\a0\a0\a0\a0\a0\a0\a0NO"}input[type=checkbox].ace.ace-switch.ace-switch-3+.lbl::after{font-family:FontAwesome;font-size:13px;line-height:22px;content:"\f00d";top:-1px;text-shadow:none;padding:0;text-align:center;color:#BBB;letter-spacing:0}input[type=checkbox].ace.ace-switch.ace-switch-3:checked+.lbl::after{content:"\f00c";color:#8AB2C9;text-shadow:none}input[type=checkbox].ace.ace-switch.ace-switch-4,input[type=checkbox].ace.ace-switch.ace-switch-5{width:60px}input[type=checkbox].ace.ace-switch.ace-switch-4+.lbl::before,input[type=checkbox].ace.ace-switch.ace-switch-5+.lbl::before{content:"ON\a0\a0\a0\a0\a0\a0\a0\a0\a0\a0\a0OFF";font-size:12px;line-height:21px;height:24px;overflow:hidden;border-radius:12px;background-color:#8B9AA3;border:1px solid #8B9AA3;color:#FFF;width:56px;text-shadow:0 0 0 #FFF;display:inline-block;position:relative;box-shadow:none;-webkit-transition:all .25s ease;-o-transition:all .25s ease;transition:all .25s ease}input[type=checkbox].ace.ace-switch.ace-switch-4+.lbl::after,input[type=checkbox].ace.ace-switch.ace-switch-5+.lbl::after{content:'III';font-size:11px;position:absolute;top:2px;left:2px;letter-spacing:0;width:20px;height:20px;line-height:19px;text-shadow:none!important;color:#939393;background-color:#FFF;-webkit-transition:all .25s ease;-o-transition:all .25s ease;transition:all .25s ease}input[type=checkbox].ace.ace-switch.ace-switch-4:checked+.lbl::before,input[type=checkbox].ace.ace-switch.ace-switch-5:checked+.lbl::before{background-color:#468FCC;border-color:#468FCC}input[type=checkbox].ace.ace-switch.ace-switch-4:checked+.lbl::after,input[type=checkbox].ace.ace-switch.ace-switch-5:checked+.lbl::after{left:34px;background-color:#FFF;color:#848484}input[type=checkbox].ace.ace-switch.ace-switch-5+.lbl::before{content:"YES\a0\a0\a0\a0\a0\a0\a0\a0\a0\a0\a0NO"}input[type=checkbox].ace.ace-switch.ace-switch-5:checked+.lbl::before{text-indent:8px}input[type=checkbox].ace.ace-switch.ace-switch-6+.lbl{position:relative}input[type=checkbox].ace.ace-switch.ace-switch-6+.lbl::before{font-family:FontAwesome;content:"\f00d";text-shadow:0 -1px 0 rgba(0,0,0,.25);box-shadow:none;border-width:0;font-weight:lighter;font-size:16px;border-radius:12px;display:inline-block;background-color:#888;color:#F2F2F2;width:52px;height:22px;line-height:21px;text-indent:32px;-webkit-transition:background .25s ease;-o-transition:background .25s ease;transition:background .25s ease}input[type=checkbox].ace.ace-switch.ace-switch-6+.lbl::after{content:'';text-shadow:0 -1px 0 rgba(0,0,0,.25);position:absolute;top:2px;left:3px;border-radius:12px;box-shadow:0 -1px 0 rgba(0,0,0,.25);width:18px;height:18px;text-align:center;background-color:#F2F2F2;border:4px solid #F2F2F2;-webkit-transition:left .25s ease;-o-transition:left .25s ease;transition:left .25s ease}input[type=checkbox].ace.ace-switch.ace-switch-6:checked+.lbl::before{content:"\f00c";text-indent:6px;color:#FFF;border-color:#B7D3E5;background-color:#FF893C}input[type=checkbox].ace.ace-switch.ace-switch-6:checked+.lbl::after{left:32px;background-color:#FFF;border:4px solid #FFF;text-shadow:0 -1px 0 rgba(0,200,0,.25)}input[type=checkbox].ace.ace-switch.ace-switch-7{width:75px}input[type=checkbox].ace.ace-switch.ace-switch-7+.lbl{position:relative}input[type=checkbox].ace.ace-switch.ace-switch-7+.lbl::before{content:"OFF\a0\a0\a0\a0\a0\a0\a0\a0\a0\a0\a0\a0\a0\a0ON";font-weight:bolder;font-size:13px;background-color:#FFF;border:2px solid #AAA;border-radius:0;box-shadow:none;color:#AAA;width:74px;height:26px;line-height:22px;overflow:hidden;text-indent:5px;display:inline-block;position:relative;-webkit-transition:all .25s ease;-o-transition:all .25s ease;transition:all .25s ease}input[type=checkbox].ace.ace-switch.ace-switch-7+.lbl::after{content:'\f00d';font-family:FontAwesome;font-size:16px;position:absolute;top:3px;left:39px;width:32px;height:20px;line-height:18px;text-align:center;padding:0;text-indent:0;background-color:#AAA;color:#FFF;border-radius:0;box-shadow:none;-webkit-transition:all .25s ease;-o-transition:all .25s ease;transition:all .25s ease}input[type=checkbox].ace.ace-switch.ace-switch-7:checked+.lbl::before{color:#468FCC;background-color:#FFF;text-indent:-28px;border-color:#6FB3E0}input[type=checkbox].ace.ace-switch.ace-switch-7:checked+.lbl::after{left:3px;content:'\f00c';background-color:#468FCC;color:#FFF}input[type=checkbox].ace.ace-switch+.lbl[data-lbl]::before{content:attr(data-lbl)}input[type=checkbox].ace.ace-switch.btn-empty+.lbl::after{content:""}input[type=checkbox].ace.ace-switch.btn-rotate+.lbl::after{content:"\2261";line-height:20px;font-size:17px}input[type=checkbox].ace.ace-switch-4.btn-rotate+.lbl::after,input[type=checkbox].ace.ace-switch-5.btn-rotate+.lbl::after{line-height:17px}input[type=checkbox].ace.ace-switch.btn-flat+.lbl::after,input[type=checkbox].ace.ace-switch.btn-flat+.lbl::before{border-radius:0!important}input[type=checkbox].ace.ace-switch.ace-switch-4+.lbl::before,input[type=checkbox].ace.ace-switch.ace-switch-5+.lbl::before{text-indent:-24px}input[type=checkbox].ace.ace-switch.ace-switch-4:checked+.lbl::before,input[type=checkbox].ace.ace-switch.ace-switch-5:checked+.lbl::before{text-indent:7px}input.ace+.lbl.padding-16::before{margin-right:16px}input.ace+.lbl.padding-14::before{margin-right:14px}input.ace+.lbl.padding-12::before{margin-right:12px}input.ace+.lbl.padding-10::before{margin-right:10px}input.ace+.lbl.padding-8::before{margin-right:8px}input.ace+.lbl.padding-6::before{margin-right:6px}input.ace+.lbl.padding-4::before{margin-right:4px}input.ace+.lbl.padding-2::before{margin-right:2px}input.ace+.lbl.padding-0::before{margin-right:0}.ace-file-input{display:block;font-size:inherit;position:relative;height:30px}.ace-file-input input[type=file]{position:absolute;z-index:-999;width:1px;height:1px;overflow:hidden;opacity:0;filter:alpha(opacity=0)}.ace-file-input input[type=file]:focus{outline:0}.ace-file-input .ace-file-container{display:block;position:absolute;top:0;left:0;right:0;height:30px;background-color:#FFF;border:1px solid #D5D5D5;cursor:pointer;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:all .15s;-o-transition:all .15s;transition:all .15s}.ace-file-input .ace-file-container:hover{-webkit-box-shadow:none;box-shadow:none;border-color:#F59942}.ace-file-input .ace-file-container:before{display:inline-block;content:attr(data-title);position:absolute;right:0;top:0;bottom:0;line-height:24px;text-align:center;padding:0 8px;background-color:#6FB3E0;color:#FFF;font-size:11px;font-weight:700;border:2px solid #FFF;border-left-width:4px;-webkit-transition:all .3s;-o-transition:all .3s;transition:all .3s}.ace-file-input .ace-file-container .ace-file-name{display:inline-block;height:28px;max-width:80%;white-space:nowrap;overflow:hidden;line-height:28px;color:#888;font-size:13px;vertical-align:top;position:static;padding-left:30px}.ace-file-input .ace-file-container .ace-file-name:after{display:inline-block;content:attr(data-title)}.ace-file-input .ace-file-container.selected{right:16px}.ace-file-input .ace-file-container.selected .ace-file-name{color:#666}.ace-file-input .ace-file-container .ace-icon{display:inline-block;position:absolute;left:0;top:0;bottom:0;line-height:24px;width:26px;text-align:center;font-family:FontAwesome;font-size:13px;border:2px solid #FFF;color:#FFF;-webkit-transition:all .1s;-o-transition:all .1s;transition:all .1s;background-color:#D1D1D1}.ace-file-input .ace-file-container.selected .ace-file-name .ace-icon{background-color:#EFAD62}.ace-file-input .ace-file-container.selected .ace-file-name .file-image{background-color:#BD7A9D}.ace-file-input .ace-file-container.selected .ace-file-name .file-video{background-color:#87B87F}.ace-file-input .ace-file-container.selected .ace-file-name .file-audio{background-color:#8B7AC9}.ace-file-input .ace-file-container.selected .ace-file-name .file-archive{background-color:#EFAD62}.ace-file-input .ace-file-container.hide-placeholder:before{display:none}.ace-file-input a:hover{text-decoration:none}.ace-file-input .remove{position:absolute;right:-8px;top:6px;display:none;width:17px;text-align:center;height:17px;line-height:15px;font-size:11px;font-weight:400;background-color:#FB7142;border-radius:100%;color:#FFF;text-decoration:none}.ace-file-input .ace-file-container.selected+.remove{display:inline-block}@media screen and (-webkit-min-device-pixel-ratio:0){.ace-file-input input[type=file]{position:absolute;width:0;height:0}}.ace-file-input input[type=file].disabled+.ace-file-container,.ace-file-input input[type=file][disabled]+.ace-file-container,.ace-file-input input[type=file][readonly]+.ace-file-container{cursor:not-allowed;background-color:#EEE}.ace-file-input input[type=file].disabled+.ace-file-container:hover,.ace-file-input input[type=file][disabled]+.ace-file-container:hover,.ace-file-input input[type=file][readonly]+.ace-file-container:hover{-webkit-box-shadow:none;box-shadow:none;border-color:#E3E3E3}.ace-file-input input[type=file].disabled+.ace-file-container:before,.ace-file-input input[type=file][disabled]+.ace-file-container:before,.ace-file-input input[type=file][readonly]+.ace-file-container:before{border-color:#EEE;background-color:#A1AAAF}.ace-file-input input[type=file][readonly]+.ace-file-container{cursor:default}.fc-event.ui-draggable-dragging,.item-list>li.ui-sortable-helper{cursor:move}.ace-file-input .ace-file-overlay{position:absolute;top:-2px;bottom:-2px;left:-2px;right:-10px;z-index:99;background-color:rgba(0,0,0,.5)}.ace-file-input .ace-file-overlay>.overlay-content{display:inline-block;position:relative;top:10%;left:0;right:0;text-align:center}.ace-file-multiple{height:auto}.ace-file-multiple .ace-file-container{position:relative;height:auto;border:1px dashed #AAA;border-radius:4px;text-align:center}.ace-file-multiple .ace-file-container:before{display:inline-block;content:attr(data-title);position:relative;right:0;left:0;margin:12px;line-height:22px;background-color:#FFF;color:#CCC;font-size:18px;font-weight:700;border-width:0}.ace-file-multiple .ace-file-container.selected .ace-file-name .ace-icon{display:inline-block;left:0;top:0;bottom:0;width:26px;text-align:center;font-family:FontAwesome;font-size:13px;border:2px solid #FFF;color:#FFF;-webkit-transition:all .1s;-o-transition:all .1s;transition:all .1s}.ace-file-multiple .ace-file-container .ace-file-name{position:relative;display:block;padding:0;height:auto;width:auto;max-width:100%;margin:0 4px;border-bottom:1px solid #DDD;text-align:left}.ace-file-multiple .ace-file-container .ace-file-name:first-child{margin-top:1px}.ace-file-multiple .ace-file-container .ace-file-name:last-child{border-bottom-width:0;margin-bottom:1px}.ace-file-multiple .ace-file-container .ace-file-name img{padding:2px;border:1px solid #D7D7D7;background-color:#FFF;background-repeat:no-repeat;background-position:center;margin:4px 8px 4px 1px}.ace-file-multiple .ace-file-container .ace-file-name:after{display:none}.ace-file-multiple .ace-file-container.selected .ace-file-name:after{display:inline-block;white-space:pre}.ace-file-multiple .ace-file-container .ace-file-name img+.ace-icon,.ace-file-multiple .ace-file-container.selected .ace-file-name img+.ace-icon{display:none}.ace-file-multiple .remove{right:-11px;top:-11px;border:3px solid #BBB;border-radius:32px;background-color:#FFF;color:red;width:23px;height:23px;line-height:16px}.input-group .input-group-addon,.input-group>.btn{border-radius:0!important}.ace-file-multiple .ace-file-container.selected+.remove:hover{border-color:#F4C0B1}.ace-file-multiple .ace-file-overlay{position:absolute;top:-12px;bottom:-6px;left:-12px;right:-12px}.ace-file-multiple .ace-file-overlay>.overlay-content{top:20%}.ace-file-multiple .ace-file-container .ace-file-name .ace-icon{position:relative;display:block;text-align:center;height:auto;line-height:64px;width:auto;font-size:64px;color:#D5D5D5;margin:4px 0;background-color:transparent}.ace-file-multiple .ace-file-container.selected:after{display:none}.ace-file-multiple .ace-file-container.selected .ace-file-name .ace-icon{position:relative;margin-right:4px;margin-left:2px;line-height:24px}.ace-file-multiple .ace-file-container .ace-file-name.large{text-align:center;border-bottom:1px solid #222;margin:0 1px 3px}.ace-file-multiple .ace-file-container .ace-file-name.large:last-child{margin:0 1px}.ace-file-multiple .ace-file-container .ace-file-name.large:after{position:absolute;top:auto;bottom:0;left:0;right:0;padding:0 4px;background-color:#555;color:#FFF;opacity:.8;filter:alpha(opacity=80)}.ace-file-multiple .ace-file-container .ace-file-name.large img{border-width:0;margin:0!important;padding:0}.ace-file-multiple input[type=file].disabled+.ace-file-container:hover,.ace-file-multiple input[type=file][disabled]+.ace-file-container:hover,.ace-file-multiple input[type=file][readonly]+.ace-file-container:hover{border-color:#AAA}.ace-file-multiple input[type=file].disabled+.ace-file-container:before,.ace-file-multiple input[type=file][disabled]+.ace-file-container:before,.ace-file-multiple input[type=file][readonly]+.ace-file-container:before{background-color:transparent}.ace-file-multiple input[type=file].disabled+.ace-file-container .ace-icon,.ace-file-multiple input[type=file][disabled]+.ace-file-container .ace-icon,.ace-file-multiple input[type=file][readonly]+.ace-file-container .ace-icon{border-color:#EEE}.form-group.has-success .input-group .input-group-addon{border-color:#9cc573}.form-group.has-error .input-group .input-group-addon{border-color:#f2a696}.form-group.has-warning .input-group .input-group-addon{border-color:#e3c94c}.form-group.has-info .input-group .input-group-addon{border-color:#72aec2}.input-group>.btn{line-height:20px;padding:0 6px}.input-group>.btn.btn-sm{line-height:22px}.input-group>.btn+.btn{margin-left:1px}.nav-tabs,.nav-tabs>li:first-child>a{margin-left:0}.input-group>.btn-group>.btn{line-height:23px}.input-group>.btn-group>.btn.btn-sm{line-height:26px}.input-group>.btn-group>.btn.btn-sm>.caret,.input-group>.btn-group>.btn>.caret,.input-group>.btn.btn-sm>.caret,.input-group>.btn>.caret{margin-top:10px}.input-group.input-group-compact{width:1px}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{padding-top:6px;padding-bottom:6px}.form-group input[type=email],.form-group input[type=url],.form-group input[type=search],.form-group input[type=tel],.form-group input[type=color],.form-group input[type=text],.form-group input[type=password],.form-group input[type=datetime],.form-group input[type=datetime-local],.form-group input[type=date],.form-group input[type=month],.form-group input[type=time],.form-group input[type=week],.form-group input[type=number],.form-group select,.form-group textarea{background:#FFF}.form-group.has-success input,.form-group.has-success select,.form-group.has-success textarea{border-color:#9cc573;color:#8BAD4C;-webkit-box-shadow:none;box-shadow:none}.form-group.has-success input:focus,.form-group.has-success select:focus,.form-group.has-success textarea:focus{-webkit-box-shadow:0 0 0 2px rgba(130,188,58,.3);box-shadow:0 0 0 2px rgba(130,188,58,.3);color:#6f8a3c;border-color:#779c52;background-color:#f4f9f0}.form-group.has-success .ace-icon,.form-group.has-success input:focus+.ace-icon,.form-group.has-success select:focus+.ace-icon,.form-group.has-success textarea:focus+.ace-icon{color:#8BAD4C}.form-group.has-success .btn .ace-icon{color:inherit}.form-group.has-success .control-label,.form-group.has-success .help-block,.form-group.has-success .help-inline{color:#7BA065}.form-group.has-info input,.form-group.has-info select,.form-group.has-info textarea{border-color:#72aec2;color:#4B89AA;-webkit-box-shadow:none;box-shadow:none}.form-group.has-info input:focus,.form-group.has-info select:focus,.form-group.has-info textarea:focus{-webkit-box-shadow:0 0 0 2px rgba(58,120,188,.3);box-shadow:0 0 0 2px rgba(58,120,188,.3);color:#3b6c87;border-color:#488ea5;background-color:#f1f7f9}.form-group.has-info .ace-icon,.form-group.has-info input:focus+.ace-icon,.form-group.has-info select:focus+.ace-icon,.form-group.has-info textarea:focus+.ace-icon{color:#4B89AA}.form-group.has-info .btn .ace-icon{color:inherit}.form-group.has-info .control-label,.form-group.has-info .help-block,.form-group.has-info .help-inline{color:#657BA0}.form-group.has-error input,.form-group.has-error select,.form-group.has-error textarea{border-color:#f2a696;color:#D68273;-webkit-box-shadow:none;box-shadow:none}.form-group.has-error input:focus,.form-group.has-error select:focus,.form-group.has-error textarea:focus{-webkit-box-shadow:0 0 0 2px rgba(219,137,120,.3);box-shadow:0 0 0 2px rgba(219,137,120,.3);color:#ca5f4c;border-color:#d77b68;background-color:#fef9f8}.form-group.has-error .ace-icon,.form-group.has-error input:focus+.ace-icon,.form-group.has-error select:focus+.ace-icon,.form-group.has-error textarea:focus+.ace-icon{color:#D68273}.form-group.has-error .btn .ace-icon{color:inherit}.form-group.has-error .control-label,.form-group.has-error .help-block,.form-group.has-error .help-inline{color:#D16E6C}.form-group.has-warning input,.form-group.has-warning select,.form-group.has-warning textarea{border-color:#e3c94c;color:#D3BD50;-webkit-box-shadow:none;box-shadow:none}.form-group.has-warning input:focus,.form-group.has-warning select:focus,.form-group.has-warning textarea:focus{-webkit-box-shadow:0 0 0 2px rgba(216,188,65,.3);box-shadow:0 0 0 2px rgba(216,188,65,.3);color:#c0a830;border-color:#d5b630;background-color:#fdfbf3}.form-group.has-warning .ace-icon,.form-group.has-warning input:focus+.ace-icon,.form-group.has-warning select:focus+.ace-icon,.form-group.has-warning textarea:focus+.ace-icon{color:#D3BD50}.form-group.has-warning .btn .ace-icon{color:inherit}.form-group.has-warning .control-label,.form-group.has-warning .help-block,.form-group.has-warning .help-inline{color:#D19D59}.form-group input:disabled,.form-group input[disabled]{color:#848484!important;background-color:#EEE!important}.input-transparent,input[type].input-transparent,textarea.input-transparent{background-color:rgba(0,0,0,.5);color:#bbb;border-color:transparent!important}.input-transparent:focus,input[type].input-transparent:focus,textarea.input-transparent:focus{background-color:rgba(0,0,0,.66);color:#f0f0f0}@media only screen and (max-width:767px){.help-inline,.input-icon+.help-inline{padding-left:0;display:block!important}}.tab-content{border:1px solid #C5D0DC;padding:16px 12px;position:relative}.tab-content.no-padding{padding:0}.tab-content.no-border{border:none;padding:12px}.tab-content.padding-32{padding:32px 24px}.tab-content.no-border.padding-32{padding:32px}.tab-content.padding-30{padding:30px 23px}.tab-content.no-border.padding-30{padding:30px}.tab-content.padding-28{padding:28px 21px}.tab-content.no-border.padding-28{padding:28px}.tab-content.padding-26{padding:26px 20px}.tab-content.no-border.padding-26{padding:26px}.tab-content.padding-24{padding:24px 18px}.tab-content.no-border.padding-24{padding:24px}.tab-content.padding-22{padding:22px 17px}.tab-content.no-border.padding-22{padding:22px}.tab-content.padding-20{padding:20px 15px}.tab-content.no-border.padding-20{padding:20px}.tab-content.padding-18{padding:18px 14px}.tab-content.no-border.padding-18{padding:18px}.tab-content.padding-16{padding:16px 12px}.tab-content.no-border.padding-16{padding:16px}.tab-content.padding-14{padding:14px 11px}.tab-content.no-border.padding-14{padding:14px}.tab-content.padding-12{padding:12px 9px}.tab-content.no-border.padding-12{padding:12px}.tab-content.padding-10{padding:10px 8px}.tab-content.no-border.padding-10{padding:10px}.tab-content.padding-8{padding:8px 6px}.tab-content.no-border.padding-8{padding:8px}.tab-content.padding-6{padding:6px 5px}.tab-content.no-border.padding-6{padding:6px}.tab-content.padding-4{padding:4px 3px}.tab-content.no-border.padding-4{padding:4px}.tab-content.no-border.padding-2,.tab-content.padding-2{padding:2px}.tab-content.no-border.padding-0,.tab-content.padding-0{padding:0}.nav.nav-tabs.padding-32{padding-left:32px}.tabs-left>.nav.nav-tabs.padding-32,.tabs-right>.nav.nav-tabs.padding-32{padding-left:0;padding-top:32px}.nav.nav-tabs.padding-30{padding-left:30px}.tabs-left>.nav.nav-tabs.padding-30,.tabs-right>.nav.nav-tabs.padding-30{padding-left:0;padding-top:30px}.nav.nav-tabs.padding-28{padding-left:28px}.tabs-left>.nav.nav-tabs.padding-28,.tabs-right>.nav.nav-tabs.padding-28{padding-left:0;padding-top:28px}.nav.nav-tabs.padding-26{padding-left:26px}.tabs-left>.nav.nav-tabs.padding-26,.tabs-right>.nav.nav-tabs.padding-26{padding-left:0;padding-top:26px}.nav.nav-tabs.padding-24{padding-left:24px}.tabs-left>.nav.nav-tabs.padding-24,.tabs-right>.nav.nav-tabs.padding-24{padding-left:0;padding-top:24px}.nav.nav-tabs.padding-22{padding-left:22px}.tabs-left>.nav.nav-tabs.padding-22,.tabs-right>.nav.nav-tabs.padding-22{padding-left:0;padding-top:22px}.nav.nav-tabs.padding-20{padding-left:20px}.tabs-left>.nav.nav-tabs.padding-20,.tabs-right>.nav.nav-tabs.padding-20{padding-left:0;padding-top:20px}.nav.nav-tabs.padding-18{padding-left:18px}.tabs-left>.nav.nav-tabs.padding-18,.tabs-right>.nav.nav-tabs.padding-18{padding-left:0;padding-top:18px}.nav.nav-tabs.padding-16{padding-left:16px}.tabs-left>.nav.nav-tabs.padding-16,.tabs-right>.nav.nav-tabs.padding-16{padding-left:0;padding-top:16px}.nav.nav-tabs.padding-14{padding-left:14px}.tabs-left>.nav.nav-tabs.padding-14,.tabs-right>.nav.nav-tabs.padding-14{padding-left:0;padding-top:14px}.nav.nav-tabs.padding-12{padding-left:12px}.tabs-left>.nav.nav-tabs.padding-12,.tabs-right>.nav.nav-tabs.padding-12{padding-left:0;padding-top:12px}.nav.nav-tabs.padding-10{padding-left:10px}.tabs-left>.nav.nav-tabs.padding-10,.tabs-right>.nav.nav-tabs.padding-10{padding-left:0;padding-top:10px}.nav.nav-tabs.padding-8{padding-left:8px}.tabs-left>.nav.nav-tabs.padding-8,.tabs-right>.nav.nav-tabs.padding-8{padding-left:0;padding-top:8px}.nav.nav-tabs.padding-6{padding-left:6px}.tabs-left>.nav.nav-tabs.padding-6,.tabs-right>.nav.nav-tabs.padding-6{padding-left:0;padding-top:6px}.nav.nav-tabs.padding-4{padding-left:4px}.tabs-left>.nav.nav-tabs.padding-4,.tabs-right>.nav.nav-tabs.padding-4{padding-left:0;padding-top:4px}.nav.nav-tabs.padding-2{padding-left:2px}.tabs-left>.nav.nav-tabs.padding-2,.tabs-right>.nav.nav-tabs.padding-2{padding-left:0;padding-top:2px}.nav-tabs{border-color:#C5D0DC;margin-bottom:0!important;position:relative;top:1px}.nav-tabs>li>a{padding:7px 12px 8px}.nav-tabs>li>a,.nav-tabs>li>a:focus{border-radius:0!important;border-color:#C5D0DC;background-color:#F9F9F9;color:#999;margin-right:-1px;line-height:18px;position:relative}.nav-tabs>li>a:hover{background-color:#FFF;color:#4C8FBD;border-color:#C5D0DC}.nav-tabs>li>a:active,.nav-tabs>li>a:focus{outline:0!important}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#576373;border-color:#C5D0DC #C5D0DC transparent;border-top:2px solid #4C8FBD;background-color:#FFF;z-index:1;line-height:18px;margin-top:-1px;box-shadow:0 -2px 3px 0 rgba(0,0,0,.15)}.tabs-below>.nav-tabs{top:auto;margin-bottom:0;margin-top:-1px;border-color:#C5D0DC;border-bottom-width:0}.tabs-below>.nav-tabs>li>a,.tabs-below>.nav-tabs>li>a:focus,.tabs-below>.nav-tabs>li>a:hover{border-color:#C5D0DC}.tabs-below>.nav-tabs>li.active>a,.tabs-below>.nav-tabs>li.active>a:focus,.tabs-below>.nav-tabs>li.active>a:hover{border-color:transparent #C5D0DC #C5D0DC;border-top-width:1px;border-bottom:2px solid #4C8FBD;margin-top:0;box-shadow:0 2px 3px 0 rgba(0,0,0,.15)}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:60px}.tabs-left>.nav-tabs{top:auto;margin-bottom:0;border-color:#C5D0DC;float:left}.tabs-left>.nav-tabs>li{float:none!important}.tabs-left>.nav-tabs>li>a,.tabs-left>.nav-tabs>li>a:focus,.tabs-left>.nav-tabs>li>a:hover{border-color:#C5D0DC;margin:0 -1px 0 0}.tabs-left>.nav-tabs>li.active>a,.tabs-left>.nav-tabs>li.active>a:focus,.tabs-left>.nav-tabs>li.active>a:hover{border-color:#C5D0DC transparent #C5D0DC #C5D0DC;border-top-width:1px;border-left:2px solid #4C8FBD;margin:0 -1px;-webkit-box-shadow:-2px 0 3px 0 rgba(0,0,0,.15)!important;box-shadow:-2px 0 3px 0 rgba(0,0,0,.15)!important}.tabs-right>.nav-tabs{top:auto;margin-bottom:0;border-color:#C5D0DC;float:right}.tabs-right>.nav-tabs>li{float:none!important}.tabs-right>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a:focus,.tabs-right>.nav-tabs>li>a:hover{border-color:#C5D0DC;margin:0 -1px}.tabs-right>.nav-tabs>li.active>a,.tabs-right>.nav-tabs>li.active>a:focus,.tabs-right>.nav-tabs>li.active>a:hover{border-color:#C5D0DC #C5D0DC #C5D0DC transparent;border-top-width:1px;border-right:2px solid #4C8FBD;margin:0 -2px 0 -1px;-webkit-box-shadow:2px 0 3px 0 rgba(0,0,0,.15);box-shadow:2px 0 3px 0 rgba(0,0,0,.15)}.nav-tabs>li>a .badge{padding:1px 5px;line-height:15px;opacity:.75;vertical-align:initial}.nav-tabs>li>a .ace-icon{opacity:.75}.nav-tabs>li.active>a .ace-icon,.nav-tabs>li.active>a .badge{opacity:1}.nav-tabs li .ace-icon{width:1.25em;display:inline-block;text-align:center}.nav-tabs>li.open .dropdown-toggle{background-color:#4F99C6;border-color:#4F99C6;color:#FFF}.nav-tabs>li.open .dropdown-toggle>.ace-icon{color:#FFF!important}.tabs-left .tab-content,.tabs-right .tab-content{overflow:auto}.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:focus,.nav>li.dropdown.open.active>a:hover{background-color:#4F99C6;border-color:#4F99C6;color:#FFF}.nav-pills .open .dropdown-toggle>.ace-icon,.nav>li.dropdown.open.active>a:focus>.ace-icon,.nav>li.dropdown.open.active>a:hover>.ace-icon{color:#FFF!important}.nav-tabs>li:not(.active):not(.open)>a:not(:hover)>.ace-icon:first-child.disabled{color:#909090!important}.nav-tabs.tab-size-bigger>li>a{padding-left:14px;padding-right:14px}.nav-tabs.tab-size-bigger>li>a>.ace-icon:first-child{display:block;margin-bottom:6px;width:auto}.nav-tabs.tab-space-1>li>a{margin-right:1px}.nav-tabs.tab-space-2>li>a{margin-right:2px}.nav-tabs.tab-space-3>li>a{margin-right:3px}.nav-tabs.tab-space-4>li>a{margin-right:4px}.nav-tabs[class*=tab-color-]>li>a,.nav-tabs[class*=tab-color-]>li>a:focus,.nav-tabs[class*=tab-color-]>li>a:hover{color:#FFF;border-color:transparent;margin-right:3px}.nav-tabs[class*=tab-color-]>li>a>.badge{border-radius:2px}.nav-tabs[class*=tab-color-]>li:not(.active)>a:hover{opacity:.85;border-color:rgba(0,0,0,.15);border-bottom-color:transparent}.nav-tabs[class*=tab-color-]>li:not(.active)>a>.ace-icon:first-child{color:#FFF!important}.nav-tabs[class*=tab-color-]>li:not(.active)>a>.badge{color:rgba(0,0,0,.4)!important;background-color:#FFF!important;border-radius:2px}.nav-tabs.tab-color-blue>li>a,.nav-tabs.tab-color-blue>li>a:focus{background-color:#7DB4D8}.nav-tabs[class*=tab-color-]>li.active>a,.nav-tabs[class*=tab-color-]>li.active>a:focus,.nav-tabs[class*=tab-color-]>li.active>a:hover{background-color:#FFF;color:#4f80a0;-webkit-box-shadow:none!important;box-shadow:none!important}.nav-tabs.tab-color-blue>li.active>a,.nav-tabs.tab-color-blue>li.active>a:focus,.nav-tabs.tab-color-blue>li.active>a:hover{color:#4c718a;border-color:#7DB4D8 #7DB4D8 transparent}.tabs-below .nav-tabs.tab-color-blue>li.active>a{border-color:transparent #7DB4D8 #7DB4D8}.nav-tabs.tab-color-blue{border-bottom-color:#C5D0DC}.nav-tabs.background-blue{padding-top:6px;background-color:#EFF3F8;border:1px solid #C5D0DC}.tabs-below .nav-tabs.background-blue{padding-top:0;padding-bottom:6px}.tabs-below .nav-tabs.tab-color-blue{border-top:none;border-bottom-color:#C5D0DC}.accordion-style1.panel-group .panel{border-radius:0;border-color:#CDD8E3;background-color:#FFF;box-shadow:none}.progress,.widget-box{-webkit-box-shadow:none}.accordion-style1.panel-group .panel:last-child{border-bottom-width:1px}.accordion-style1.panel-group .panel .collapse{background-color:#FFF}.accordion-style1.panel-group .panel+.panel{margin-top:2px}.accordion-style1.panel-group .panel-heading+.panel-collapse .panel-body{border-top-color:#CDD8E3!important}.accordion-style1.panel-group .panel-heading{padding:0}.accordion-style1.panel-group .panel-heading .accordion-toggle{color:#4C8FBD;background-color:#EEF4F9;position:relative;font-weight:700;font-size:13px;line-height:1;padding:10px;display:block}.accordion-style1.panel-group .panel-heading .accordion-toggle.collapsed{color:#478FCA;font-weight:400;background-color:#F9F9F9}.accordion-style1.panel-group .panel-heading .accordion-toggle:hover{color:#6EA6CC;background-color:#F1F8FD;text-decoration:none}.accordion-style1.panel-group .panel-heading .accordion-toggle:active,.accordion-style1.panel-group .panel-heading .accordion-toggle:focus{outline:0;text-decoration:none}.accordion-style1.panel-group .panel-heading .accordion-toggle>.ace-icon:first-child{width:16px}.accordion-style1.panel-group .panel-heading .accordion-toggle:hover>.ace-icon:first-child{text-decoration:none}.accordion-style1.panel-group .collapse.in>.panel-body,.accordion-style1.panel-group .panel-body{border-top:1px solid #CDD8E3}.accordion-style1.panel-group.no-padding{padding:0}.accordion-style2.panel-group .panel{border-width:0}.accordion-style2.panel-group .panel:last-child{border-bottom-width:0}.accordion-style2.panel-group .panel+.panel{margin-top:4px}.accordion-style2.panel-group .panel .panel-body{border-top:none}.accordion-style2.panel-group .panel-heading .accordion-toggle{background-color:#EDF3F7;border:2px solid #6EAED1;border-width:0 0 0 2px}.accordion-style2.panel-group .panel-heading .accordion-toggle:hover{text-decoration:none}.accordion-style2.panel-group .panel-heading .accordion-toggle.collapsed{background-color:#F3F3F3;color:#606060;border-width:0 0 0 1px;border-color:#D9D9D9}.accordion-style2.panel-group .panel-heading .accordion-toggle.collapsed:hover{background-color:#F6F6F6;color:#438EB9;text-decoration:none}.accordion-style2.panel-group .collapse.in>.panel-body,.accordion-style2.panel-group .panel-body{border-top:none}.accordion-style2.panel-group .accordion-style2.panel-group .panel{border-bottom:1px dotted #D9D9D9}.accordion-style2.panel-group .accordion-style2.panel-group .panel:last-child{border-bottom:none}.accordion-style2.panel-group .accordion-style2.panel-group .panel .panel-heading,.accordion-style2.panel-group .accordion-style2.panel-group .panel .panel-heading .accordion-toggle{background-color:transparent;border-width:0;font-size:13px;padding-top:6px;padding-bottom:8px}.accordion-style2.panel-group .accordion-style2.panel-group .panel .panel-heading{padding-top:0;padding-bottom:0}.table-bordered,td,th{border-radius:0!important}.table>thead>tr{color:#707070;font-weight:400;background:repeat-x #F2F2F2;background-image:-webkit-linear-gradient(top,#F8F8F8 0,#ECECEC 100%);background-image:-o-linear-gradient(top,#F8F8F8 0,#ECECEC 100%);background-image:linear-gradient(to bottom,#F8F8F8 0,#ECECEC 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff8f8f8', endColorstr='#ffececec', GradientType=0)}.table>thead>tr>th{border-color:#ddd;font-weight:700}.table>thead>tr>th .ace-icon:first-child{margin-right:2px}.table>thead>tr>th:first-child{border-left-color:#F1F1F1}.table>thead>tr>th:last-child{border-right-color:#F1F1F1}.table.table-bordered>thead>tr>th{vertical-align:middle}.table.table-bordered>thead>tr>th:first-child{border-left-color:#ddd}td.center,th.center{text-align:center}td .lbl,th .lbl{margin-bottom:0}td .lbl:only-child,th .lbl:only-child{vertical-align:top}.table-header{background-color:#307ECC;color:#FFF;font-size:14px;line-height:38px;padding-left:12px;margin-bottom:1px}.table-header .close{margin-right:8px;margin-top:0;opacity:.45;filter:alpha(opacity=45)}.table-header .close:hover{opacity:.75;filter:alpha(opacity=75)}th.detail-col{width:48px;text-align:center}tr.detail-row{display:none}tr.detail-row.open{display:block;display:table-row}tr.detail-row>td{background-color:#f1f6f8;border-top:3px solid #d1e1ea!important}.table-detail{background-color:#fff;border:1px solid #dcebf7;width:100%;padding:12px}.table-detail td>.profile-user-info{width:100%}.widget-box{padding:0;box-shadow:none;margin:3px 0;border:1px solid #CCC}@media only screen and (max-width:767px){.widget-box{margin-top:7px;margin-bottom:7px}}.widget-header{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;position:relative;min-height:38px;background:repeat-x #f7f7f7;background-image:-webkit-linear-gradient(top,#FFF 0,#EEE 100%);background-image:-o-linear-gradient(top,#FFF 0,#EEE 100%);background-image:linear-gradient(to bottom,#FFF 0,#EEE 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffeeeeee', GradientType=0);color:#669FC7;border-bottom:1px solid #DDD;padding-left:12px}.widget-box.transparent>.widget-header,.widget-header-flat{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.widget-header:after,.widget-header:before{content:"";display:table;line-height:0}.widget-header:after{clear:right}.widget-box.collapsed>.widget-header{border-bottom-width:0}.collapsed.fullscreen>.widget-header{border-bottom-width:1px}.collapsed>.widget-body{display:none}.widget-header-flat{background:#F7F7F7}.widget-header-large{min-height:49px;padding-left:18px}.widget-header-small{min-height:31px;padding-left:10px}.widget-header>.widget-title{line-height:36px;padding:0;margin:0;display:inline}.widget-header>.widget-title>.ace-icon{margin-right:5px;font-weight:400;display:inline-block}.infobox .infobox-content:first-child,.infobox>.badge,.infobox>.stat,.percentage{font-weight:700}.widget-header-large>.widget-title{line-height:48px}.widget-header-small>.widget-title{line-height:30px}.widget-toolbar{display:inline-block;padding:0 10px;line-height:37px;float:right;position:relative}.widget-header-large>.widget-toolbar{line-height:48px}.widget-header-small>.widget-toolbar{line-height:29px}.widget-toolbar.no-padding{padding:0}.widget-toolbar.padding-5{padding:0 5px}.widget-toolbar:before{display:inline-block;content:"";position:absolute;top:3px;bottom:3px;left:-1px;border:1px solid #D9D9D9;border-width:0 1px 0 0}.popover-notitle+.popover .popover-title,.popover.popover-notitle .popover-title,.widget-toolbar.no-border:before{display:none}.widget-header-large>.widget-toolbar:before{top:6px;bottom:6px}[class*=widget-color-]>.widget-header>.widget-toolbar:before{border-color:#EEE}.widget-color-orange>.widget-header>.widget-toolbar:before{border-color:#FEA}.widget-color-dark>.widget-header>.widget-toolbar:before{border-color:#222;box-shadow:-1px 0 0 rgba(255,255,255,.2),inset 1px 0 0 rgba(255,255,255,.1)}.widget-toolbar label{display:inline-block;vertical-align:middle;margin-bottom:0}.widget-toolbar>.widget-menu>a,.widget-toolbar>a{font-size:14px;margin:0 1px;display:inline-block;padding:0;line-height:24px}.widget-toolbar>.widget-menu>a:hover,.widget-toolbar>a:hover{text-decoration:none}.widget-header-large>.widget-toolbar>.widget-menu>a,.widget-header-large>.widget-toolbar>a{font-size:15px;margin:0 1px}.widget-toolbar>.btn{line-height:27px;margin-top:-2px}.widget-toolbar>.btn.smaller{line-height:26px}.widget-toolbar>.btn.bigger{line-height:28px}.widget-toolbar>.btn-sm{line-height:24px}.widget-toolbar>.btn-sm.smaller{line-height:23px}.widget-toolbar>.btn-sm.bigger{line-height:25px}.widget-toolbar>.btn-xs{line-height:22px}.widget-toolbar>.btn-xs.smaller{line-height:21px}.widget-toolbar>.btn-xs.bigger{line-height:23px}.widget-toolbar>.btn-minier{line-height:18px}.widget-toolbar>.btn-minier.smaller{line-height:17px}.widget-toolbar>.btn-minier.bigger{line-height:19px}.widget-toolbar>.btn-lg{line-height:36px}.widget-toolbar>.btn-lg.smaller{line-height:34px}.widget-toolbar>.btn-lg.bigger{line-height:38px}.widget-toolbar-dark{background:#444}.widget-toolbar-light{background:rgba(255,255,255,.85)}.widget-toolbar>.widget-menu{display:inline-block;position:relative}.widget-toolbar>.widget-menu>a[data-action],.widget-toolbar>a[data-action]{-webkit-transition:transform .1s;-o-transition:transform .1s;transition:transform .1s}.widget-toolbar>.widget-menu>a[data-action]>.ace-icon,.widget-toolbar>a[data-action]>.ace-icon{margin-right:0}.widget-toolbar>.widget-menu>a[data-action]:focus,.widget-toolbar>a[data-action]:focus{text-decoration:none;outline:0}.widget-toolbar>.widget-menu>a[data-action]:hover,.widget-toolbar>a[data-action]:hover{-moz-transform:scale(1.2);-webkit-transform:scale(1.2);-o-transform:scale(1.2);-ms-transform:scale(1.2);transform:scale(1.2)}.widget-body{background-color:#FFF}.widget-main{padding:12px}.widget-main.padding-32{padding:32px}.widget-main.padding-30{padding:30px}.widget-main.padding-28{padding:28px}.widget-main.padding-26{padding:26px}.widget-main.padding-24{padding:24px}.widget-main.padding-22{padding:22px}.widget-main.padding-20{padding:20px}.widget-main.padding-18{padding:18px}.widget-main.padding-16{padding:16px}.widget-main.padding-14{padding:14px}.widget-main.padding-12{padding:12px}.widget-main.padding-10{padding:10px}.widget-main.padding-8{padding:8px}.widget-main.padding-6{padding:6px}.widget-main.padding-4{padding:4px}.widget-main.padding-2{padding:2px}.widget-main.no-padding,.widget-main.padding-0{padding:0}.widget-toolbar .progress{vertical-align:middle;display:inline-block;margin:0}.widget-toolbar>.dropdown,.widget-toolbar>.dropup{display:inline-block}.widget-toolbox.toolbox-vertical,.widget-toolbox.toolbox-vertical+.widget-main{display:table-cell;vertical-align:top}.widget-box>.widget-header>.widget-toolbar>.widget-menu>[data-action=settings],.widget-box>.widget-header>.widget-toolbar>[data-action=settings],.widget-color-dark>.widget-header>.widget-toolbar>.widget-menu>[data-action=settings],.widget-color-dark>.widget-header>.widget-toolbar>[data-action=settings]{color:#99CADB}.widget-box>.widget-header>.widget-toolbar>.widget-menu>[data-action=reload],.widget-box>.widget-header>.widget-toolbar>[data-action=reload],.widget-color-dark>.widget-header>.widget-toolbar>.widget-menu>[data-action=reload],.widget-color-dark>.widget-header>.widget-toolbar>[data-action=reload]{color:#ACD392}.widget-box>.widget-header>.widget-toolbar>.widget-menu>[data-action=collapse],.widget-box>.widget-header>.widget-toolbar>[data-action=collapse],.widget-color-dark>.widget-header>.widget-toolbar>.widget-menu>[data-action=collapse],.widget-color-dark>.widget-header>.widget-toolbar>[data-action=collapse]{color:#AAA}.widget-box>.widget-header>.widget-toolbar>.widget-menu>[data-action=close],.widget-box>.widget-header>.widget-toolbar>[data-action=close],.widget-color-dark>.widget-header>.widget-toolbar>.widget-menu>[data-action=close],.widget-color-dark>.widget-header>.widget-toolbar>[data-action=close]{color:#E09E96}.widget-box[class*=widget-color-]>.widget-header{color:#FFF;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.widget-color-blue{border-color:#307ECC}.widget-color-blue>.widget-header{background:#307ECC;border-color:#307ECC}.widget-color-blue2{border-color:#5090C1}.widget-color-blue2>.widget-header{background:#5090C1;border-color:#5090C1}.widget-color-blue3{border-color:#6379AA}.widget-color-blue3>.widget-header{background:#6379AA;border-color:#6379AA}.widget-color-green{border-color:#82AF6F}.widget-color-green>.widget-header{background:#82AF6F;border-color:#82AF6F}.widget-color-green2{border-color:#2E8965}.widget-color-green2>.widget-header{background:#2E8965;border-color:#2E8965}.widget-color-green3{border-color:#4EBC30}.widget-color-green3>.widget-header{background:#4EBC30;border-color:#4EBC30}.widget-color-red{border-color:#E2755F}.widget-color-red>.widget-header{background:#E2755F;border-color:#E2755F}.widget-color-red2{border-color:#E04141}.widget-color-red2>.widget-header{background:#E04141;border-color:#E04141}.widget-color-red3{border-color:#D15B47}.widget-color-red3>.widget-header{background:#D15B47;border-color:#D15B47}.widget-color-purple{border-color:#7E6EB0}.widget-color-purple>.widget-header{background:#7E6EB0;border-color:#7E6EB0}.widget-color-pink{border-color:#CE6F9E}.widget-color-pink>.widget-header{background:#CE6F9E;border-color:#CE6F9E}.widget-color-orange{border-color:#E8B10D}.widget-color-orange>.widget-header{color:#855D10!important;border-color:#E8B10D;background:#FFC657}.widget-color-dark{border-color:#5a5a5a}.widget-color-dark>.widget-header{border-color:#666;background:#404040}.widget-color-grey{border-color:#9e9e9e}.widget-color-grey>.widget-header{border-color:#aaa;background:#848484}.widget-box.transparent{border-width:0}.widget-box.transparent>.widget-header{background:0 0;border-width:0;border-bottom:1px solid #DCE8F1;color:#4383B4;padding-left:3px}.widget-box.transparent>.widget-header-large{padding-left:5px}.widget-box.transparent>.widget-header-small{padding-left:1px}.widget-box.transparent>.widget-body{border-width:0;background-color:transparent}[class*=widget-color-]>.widget-header>.widget-toolbar>.widget-menu>[data-action],[class*=widget-color-]>.widget-header>.widget-toolbar>[data-action]{text-shadow:0 1px 1px rgba(0,0,0,.2)}[class*=widget-color-]>.widget-header>.widget-toolbar>.widget-menu>[data-action=settings],[class*=widget-color-]>.widget-header>.widget-toolbar>[data-action=settings]{color:#D3E4ED}[class*=widget-color-]>.widget-header>.widget-toolbar>.widget-menu>[data-action=reload],[class*=widget-color-]>.widget-header>.widget-toolbar>[data-action=reload]{color:#DEEAD3}[class*=widget-color-]>.widget-header>.widget-toolbar>.widget-menu>[data-action=collapse],[class*=widget-color-]>.widget-header>.widget-toolbar>[data-action=collapse]{color:#E2E2E2}[class*=widget-color-]>.widget-header>.widget-toolbar>.widget-menu>[data-action=close],[class*=widget-color-]>.widget-header>.widget-toolbar>[data-action=close]{color:#FFD9D5}.widget-color-orange>.widget-header>.widget-toolbar>.widget-menu>[data-action],.widget-color-orange>.widget-header>.widget-toolbar>[data-action]{text-shadow:none}.widget-color-orange>.widget-header>.widget-toolbar>.widget-menu>[data-action=settings],.widget-color-orange>.widget-header>.widget-toolbar>[data-action=settings]{color:#559AAB}.widget-color-orange>.widget-header>.widget-toolbar>.widget-menu>[data-action=reload],.widget-color-orange>.widget-header>.widget-toolbar>[data-action=reload]{color:#7CA362}.widget-color-orange>.widget-header>.widget-toolbar>.widget-menu>[data-action=collapse],.widget-color-orange>.widget-header>.widget-toolbar>[data-action=collapse]{color:#777}.widget-color-orange>.widget-header>.widget-toolbar>.widget-menu>[data-action=close],.widget-color-orange>.widget-header>.widget-toolbar>[data-action=close]{color:#A05656}.widget-box.light-border[class*=widget-color-]:not(.fullscreen){border-width:0}.widget-box.light-border[class*=widget-color-]:not(.fullscreen)>.widget-header{border:1px solid;border-color:inherit}.widget-box.light-border[class*=widget-color-]:not(.fullscreen)>.widget-body{border:1px solid #D6D6D6;border-width:0 1px 1px}.widget-box.no-border{border-width:0}.widget-box.fullscreen{position:fixed;margin:0;top:0;bottom:0;left:0;right:0;background-color:#FFF;border-width:3px;z-index:1040!important}.widget-box.fullscreen:not([class*=widget-color-]){border-color:#AAA}.widget-body .table{border-top:1px solid #E5E5E5}.widget-body .table thead:first-child tr{background:#FFF}[class*=widget-color-]>.widget-body .table thead:first-child tr{background:repeat-x #f2f2f2;background-image:-webkit-linear-gradient(top,#F8F8F8 0,#ECECEC 100%);background-image:-o-linear-gradient(top,#F8F8F8 0,#ECECEC 100%);background-image:linear-gradient(to bottom,#F8F8F8 0,#ECECEC 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff8f8f8', endColorstr='#ffececec', GradientType=0)}.infobox-dark>.infobox-icon>.ace-icon:before,.tooltip.in{opacity:1;filter:alpha(opacity=100)}.widget-body .table.table-bordered thead:first-child>tr{border-top-width:0}.widget-main.no-padding .table{margin-bottom:0;border-width:0}.widget-main.no-padding .table-bordered td:first-child,.widget-main.no-padding .table-bordered th:first-child{border-left-width:0}.transparent>.widget-body .widget-main .table-bordered>tbody>tr>td:last-child,.transparent>.widget-body .widget-main .table-bordered>tfoot>tr>td:last-child,.transparent>.widget-body .widget-main .table-bordered>thead>tr>th:last-child,.widget-main.no-padding .table-bordered>tbody>tr>td:last-child,.widget-main.no-padding .table-bordered>tfoot>tr>td:last-child,.widget-main.no-padding .table-bordered>thead>tr>th:last-child{border-right-width:0!important}.transparent>.widget-body .widget-main .table-bordered>tbody>tr:last-child>td,.widget-main.no-padding .table-bordered>tbody>tr:last-child>td{border-bottom-width:0!important}.table-bordered>thead.thin-border-bottom>tr>td,.table-bordered>thead.thin-border-bottom>tr>th{border-bottom-width:1px}.widget-body .alert:last-child{margin-bottom:0}.widget-main .tab-content{border-width:0}.widget-toolbar>.nav-tabs{border-bottom-width:0;margin-bottom:0;top:auto;margin-top:3px!important}.widget-toolbar>.nav-tabs>li{margin-bottom:auto}.widget-toolbar>.nav-tabs>li>a{box-shadow:none;position:relative;top:1px;margin-top:1px}.widget-toolbar>.nav-tabs>li:not(.active)>a{border-color:transparent;background-color:transparent}.widget-toolbar>.nav-tabs>li:not(.active)>a:hover{background-color:transparent}.widget-toolbar>.nav-tabs>li.active>a{background-color:#FFF;border-bottom-color:transparent;box-shadow:none;margin-top:auto}.widget-header-small>.widget-toolbar>.nav-tabs>li>a{line-height:16px;padding-top:6px;padding-bottom:6px}.widget-header-small>.widget-toolbar>.nav-tabs>li.active>a{border-top-width:2px}.widget-header-large>.widget-toolbar>.nav-tabs>li>a{line-height:22px;padding-top:9px;padding-bottom:9px;margin-top:4px}.widget-header-large>.widget-toolbar>.nav-tabs>li.active>a{margin-top:3px}[class*=widget-color-]>.widget-header>.widget-toolbar>.nav-tabs>li>a{border-color:transparent;background-color:transparent;color:#FFF;margin-right:1px}[class*=widget-color-]>.widget-header>.widget-toolbar>.nav-tabs>li>a:hover{background-color:#FFF;color:#555;border-top-color:#FFF}[class*=widget-color-]>.widget-header>.widget-toolbar>.nav-tabs>li.active>a{background-color:#FFF;color:#555;border-top-width:1px;margin-top:0}.widget-toolbar>.nav-tabs .widget-color-orange>.widget-header>li>a{color:#855D10}.transparent>.widget-header>.widget-toolbar>.nav-tabs>li>a{color:#555;background-color:transparent;border-right:1px solid transparent;border-left:1px solid transparent}.transparent>.widget-header>.widget-toolbar>.nav-tabs>li.active>a{border-top-color:#4C8FBD;border-right:1px solid #C5D0DC;border-left:1px solid #C5D0DC;background-color:#FFF;box-shadow:none}.widget-toolbox{background-color:#EEE}.widget-toolbox:first-child{padding:2px;border-bottom:1px solid #CCC}.widget-toolbox:last-child{padding:2px;border-top:1px solid #CCC}.transparent>.widget-body>.widget-toolbox:last-child{border:none;border-top:1px solid #CCC}.widget-toolbox>.btn-toolbar{margin:0!important;padding:0}.widget-toolbox.center{text-align:center}.widget-toolbox.toolbox-vertical{border-bottom-width:0;border-right:1px solid #D9D9D9;padding:6px 4px;width:1px}.widget-toolbox.padding-16{padding:16px}.widget-toolbox.padding-14{padding:14px}.widget-toolbox.padding-12{padding:12px}.widget-toolbox.padding-10{padding:10px}.widget-toolbox.padding-8{padding:8px}.widget-toolbox.padding-6{padding:6px}.widget-toolbox.padding-4{padding:4px}.widget-toolbox.padding-2{padding:2px}.widget-toolbox.padding-0{padding:0}.widget-box-overlay{position:absolute;top:-1px;bottom:-1px;right:-1px;left:-1px;z-index:999;text-align:center;min-height:100%;background-color:rgba(0,0,0,.3)}.widget-box-overlay>.loading-icon{position:relative;top:20%;left:0;right:0;text-align:center}.widget-box.collapsed .widget-box-overlay>.loading-icon{top:10%}.widget-box-overlay>.loading-icon.icon-spin{-moz-animation-duration:1.2s;-webkit-animation-duration:1.2s;-o-animation-duration:1.2s;-ms-animation-duration:1.2s;animation-duration:1.2s}.widget-main>form,.widget-main>form .input-append,.widget-main>form .input-prepend{margin-bottom:0}.widget-main.no-padding>form>fieldset,.widget-main.padding-0>form>fieldset{padding:16px}.widget-main.no-padding>form>fieldset+.form-actions,.widget-main.padding-0>form>fieldset+.form-actions{padding:10px 0 12px}.widget-main.no-padding>form>.form-actions,.widget-main.padding-0>form>.form-actions{margin:0;padding:10px 12px 12px}.widget-placeholder{border:2px dashed #D9D9D9}.infobox,.popover,.popover-title,.progress,.tooltip-inner{border-radius:0}.widget-container-col{min-height:10px}.tooltip-inner{background-color:#333;color:#FFF;font-size:12px;text-shadow:1px 1px 0 rgba(42,45,50,.5);padding:5px 9px}.tooltip.top .tooltip-arrow{border-bottom-width:0;border-top-color:#333}.tooltip.right .tooltip-arrow{border-left-width:0;border-right-color:#333}.tooltip.left .tooltip-arrow{border-right-width:0;border-left-color:#333}.tooltip.bottom .tooltip-arrow{border-top-width:0;border-bottom-color:#333}.tooltip-error+.tooltip>.tooltip-inner,.tooltip.tooltip-error>.tooltip-inner{background-color:#C94D32;text-shadow:1px 1px 0 rgba(100,60,20,.3)}.tooltip-error+.tooltip.top .tooltip-arrow,.tooltip.tooltip-error.top .tooltip-arrow{border-top-color:#C94D32}.tooltip-error+.tooltip.right .tooltip-arrow,.tooltip.tooltip-error.right .tooltip-arrow{border-right-color:#C94D32}.tooltip-error+.tooltip.left .tooltip-arrow,.tooltip.tooltip-error.left .tooltip-arrow{border-left-color:#C94D32}.tooltip-error+.tooltip.bottom .tooltip-arrow,.tooltip.tooltip-error.bottom .tooltip-arrow{border-bottom-color:#C94D32}.tooltip-success+.tooltip>.tooltip-inner,.tooltip.tooltip-success>.tooltip-inner{background-color:#629B58;text-shadow:1px 1px 0 rgba(60,100,20,.3)}.tooltip-success+.tooltip.top .tooltip-arrow,.tooltip.tooltip-success.top .tooltip-arrow{border-top-color:#629B58}.tooltip-success+.tooltip.right .tooltip-arrow,.tooltip.tooltip-success.right .tooltip-arrow{border-right-color:#629B58}.tooltip-success+.tooltip.left .tooltip-arrow,.tooltip.tooltip-success.left .tooltip-arrow{border-left-color:#629B58}.tooltip-success+.tooltip.bottom .tooltip-arrow,.tooltip.tooltip-success.bottom .tooltip-arrow{border-bottom-color:#629B58}.tooltip-warning+.tooltip>.tooltip-inner,.tooltip.tooltip-warning>.tooltip-inner{background-color:#ED9421;text-shadow:1px 1px 0 rgba(100,90,10,.3)}.tooltip-warning+.tooltip.top .tooltip-arrow,.tooltip.tooltip-warning.top .tooltip-arrow{border-top-color:#ED9421}.tooltip-warning+.tooltip.right .tooltip-arrow,.tooltip.tooltip-warning.right .tooltip-arrow{border-right-color:#ED9421}.tooltip-warning+.tooltip.left .tooltip-arrow,.tooltip.tooltip-warning.left .tooltip-arrow{border-left-color:#ED9421}.tooltip-warning+.tooltip.bottom .tooltip-arrow,.tooltip.tooltip-warning.bottom .tooltip-arrow{border-bottom-color:#ED9421}.tooltip-info+.tooltip>.tooltip-inner,.tooltip.tooltip-info>.tooltip-inner{background-color:#4B89AA;text-shadow:1px 1px 0 rgba(40,50,100,.3)}.tooltip-info+.tooltip.top .tooltip-arrow,.tooltip.tooltip-info.top .tooltip-arrow{border-top-color:#4B89AA}.tooltip-info+.tooltip.right .tooltip-arrow,.tooltip.tooltip-info.right .tooltip-arrow{border-right-color:#4B89AA}.tooltip-info+.tooltip.left .tooltip-arrow,.tooltip.tooltip-info.left .tooltip-arrow{border-left-color:#4B89AA}.tooltip-info+.tooltip.bottom .tooltip-arrow,.tooltip.tooltip-info.bottom .tooltip-arrow{border-bottom-color:#4B89AA}.popover{padding:0;border-color:#ccc;border-width:1px;-webkit-box-shadow:0 0 4px 2px rgba(0,0,0,.2);box-shadow:0 0 4px 2px rgba(0,0,0,.2);color:#4D5C73}.popover-title{background-color:#EFF3F8;color:#555;border-bottom:1px solid #dde6f0;text-shadow:1px 1px 1px rgba(220,220,220,.2)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;border-bottom-color:#EFF3F8;border-top-width:0}.popover-error+.popover,.popover.popover-error{border-color:#F7F0EF}.popover-error+.popover .popover-title,.popover.popover-error .popover-title{background-color:#F7F0EF;border-bottom-color:#efe0de;color:#B75445;text-shadow:none}.popover-error+.popover.top .arrow:after,.popover.popover-error.top .arrow:after{border-top-color:#F7F0EF}.popover-error+.popover.bottom .arrow:after,.popover.popover-error.bottom .arrow:after{border-bottom-color:#F7F0EF}.popover-error+.popover.right .arrow:after,.popover.popover-error.right .arrow:after{border-right-color:#F7F0EF}.popover-error+.popover.left .arrow:after,.popover.popover-error.left .arrow:after{border-left-color:#F7F0EF}.popover-warning+.popover,.popover.popover-warning{border-color:#F4EEE3}.popover-warning+.popover .popover-title,.popover.popover-warning .popover-title{background-color:#F4EEE3;border-bottom-color:#ede3d1;color:#D67E31;text-shadow:none}.popover-warning+.popover.top .arrow:after,.popover.popover-warning.top .arrow:after{border-top-color:#F4EEE3}.popover-warning+.popover.bottom .arrow:after,.popover.popover-warning.bottom .arrow:after{border-bottom-color:#F4EEE3}.popover-warning+.popover.right .arrow:after,.popover.popover-warning.right .arrow:after{border-right-color:#F4EEE3}.popover-warning+.popover.left .arrow:after,.popover.popover-warning.left .arrow:after{border-left-color:#F4EEE3}.popover-success+.popover,.popover.popover-success{border-color:#E8F2E3}.popover-success+.popover .popover-title,.popover.popover-success .popover-title{background-color:#E8F2E3;border-bottom-color:#daead2;color:#629B58;text-shadow:none}.popover-success+.popover.top .arrow:after,.popover.popover-success.top .arrow:after{border-top-color:#E8F2E3}.popover-success+.popover.bottom .arrow:after,.popover.popover-success.bottom .arrow:after{border-bottom-color:#E8F2E3}.popover-success+.popover.right .arrow:after,.popover.popover-success.right .arrow:after{border-right-color:#E8F2E3}.popover-success+.popover.left .arrow:after,.popover.popover-success.left .arrow:after{border-left-color:#E8F2E3}.popover-info+.popover,.popover.popover-info{border-color:#E5EDF8}.popover-info+.popover .popover-title,.popover.popover-info .popover-title{background-color:#E5EDF8;border-bottom-color:#d1dff3;color:#3F79B6;text-shadow:none}.popover-info+.popover.top .arrow:after,.popover.popover-info.top .arrow:after{border-top-color:#E5EDF8}.popover-info+.popover.bottom .arrow:after,.popover.popover-info.bottom .arrow:after{border-bottom-color:#E5EDF8}.popover-info+.popover.right .arrow:after,.popover.popover-info.right .arrow:after{border-right-color:#E5EDF8}.popover-info+.popover.left .arrow:after,.popover.popover-info.left .arrow:after{border-left-color:#E5EDF8}.popover-notitle+.popover.top .arrow:after,.popover.popover-notitle.top .arrow:after{border-top-color:#FFF}.popover-notitle+.popover.bottom .arrow:after,.popover.popover-notitle.bottom .arrow:after{border-bottom-color:#FFF}.popover-notitle+.popover.left .arrow:after,.popover.popover-notitle.left .arrow:after{border-left-color:#FFF}.popover-notitle+.popover.right .arrow:after,.popover.popover-notitle.right .arrow:after{border-right-color:#FFF}.progress{box-shadow:none;background:#e9e9e9;height:18px}.progress-striped .progress-bar,.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress .progress-bar{-webkit-box-shadow:none;box-shadow:none;line-height:18px}.progress[data-percent]:after{display:inline-block;content:attr(data-percent);color:#FFF;position:absolute;left:0;right:0;top:0;bottom:0;line-height:16px;text-align:center;font-size:12px}.infobox>.stat:after,.infobox>.stat:before,.social-or-login:before{content:""}.progress.progress-yellow[data-percent]:after{color:#963}.progress.progress-small{height:12px}.progress.progress-small .progress-bar,.progress.progress-small[data-percent]:after{line-height:10px;font-size:11px}.progress.progress-mini{height:9px}.progress.progress-mini .progress-bar,.progress.progress-mini[data-percent]:after{line-height:8px;font-size:11px}.progress-bar{background-color:#2A91D8}.progress-striped .progress-bar{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#CA5952}.progress-striped .progress-bar-danger{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-striped .progress-bar-success,.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-success{background-color:#59A84B}.progress-striped .progress-bar-success{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#F2BB46}.progress-striped .progress-bar-warning{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-striped .progress-bar-pink,.progress-striped .progress-bar-purple{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-pink{background-color:#D6487E}.progress-striped .progress-bar-pink{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-purple{background-color:#9585BF}.progress-striped .progress-bar-purple{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-striped .progress-bar-inverse,.progress-striped .progress-bar-yellow{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-yellow{background-color:#FFD259}.progress-striped .progress-bar-yellow{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-inverse{background-color:#404040}.progress-striped .progress-bar-inverse{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-grey{background-color:#8A8A8A}.progress-striped .progress-bar-grey{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.infobox-container{text-align:center;font-size:0}.infobox{display:inline-block;width:210px;height:66px;color:#555;background-color:#FFF;box-shadow:none;margin:-1px 0 0 -1px;padding:8px 3px 6px 9px;border:1px dotted;border-color:#D8D8D8!important;vertical-align:middle;text-align:left;position:relative}.infobox>.infobox-icon{display:inline-block;vertical-align:top;width:44px}.infobox>.infobox-icon>.ace-icon{display:inline-block;height:42px;margin:0;padding:1px 1px 0 2px;background-color:transparent;border-width:0;text-align:center;position:relative;border-radius:100%;-webkit-box-shadow:1px 1px 0 rgba(0,0,0,.2);box-shadow:1px 1px 0 rgba(0,0,0,.2)}.infobox>.infobox-icon>.ace-icon:before{font-size:24px;display:block;padding:6px 0 7px;width:40px;text-align:center;border-radius:100%;color:#FFF;color:rgba(255,255,255,.9);background-color:transparent;background-color:rgba(255,255,255,.2);text-shadow:1px 1px 1px rgba(0,0,0,.14)}.infobox .infobox-content{color:#555;max-width:140px}.infobox>.infobox-data{display:inline-block;border-width:0;font-size:13px;text-align:left;line-height:21px;min-width:130px;padding-left:8px;position:relative;top:0}.infobox>.infobox-data>.infobox-data-number{display:block;font-size:22px;margin:2px 0 4px;position:relative;text-shadow:1px 1px 0 rgba(0,0,0,.15)}.infobox>.infobox-data>.infobox-text{display:block;font-size:16px;margin:2px 0 4px;position:relative;text-shadow:none}.infobox.no-border{border-width:0!important}@media only screen and (max-width:479px){.infobox{min-width:95%;margin-top:2px;margin-bottom:2px}}.infobox-purple{color:#6F3CC4;border-color:#6F3CC4}.infobox-purple>.infobox-icon>.ace-icon{background-color:#6F3CC4}.infobox-purple.infobox-dark{background-color:#6F3CC4;border-color:#6F3CC4}.infobox-purple2{color:#5F47B0;border-color:#5F47B0}.infobox-purple2>.infobox-icon>.ace-icon{background-color:#5F47B0}.infobox-purple2.infobox-dark{background-color:#5F47B0;border-color:#5F47B0}.infobox-pink{color:#CB6FD7;border-color:#CB6FD7}.infobox-pink>.infobox-icon>.ace-icon{background-color:#CB6FD7}.infobox-pink.infobox-dark{background-color:#CB6FD7;border-color:#CB6FD7}.infobox-blue{color:#6FB3E0;border-color:#6FB3E0}.infobox-blue>.infobox-icon>.ace-icon{background-color:#6FB3E0}.infobox-blue.infobox-dark{background-color:#6FB3E0;border-color:#6FB3E0}.infobox-blue2{color:#3983C2;border-color:#3983C2}.infobox-blue2>.infobox-icon>.ace-icon{background-color:#3983C2}.infobox-blue2.infobox-dark{background-color:#3983C2;border-color:#3983C2}.infobox-blue3{color:#1144EB;border-color:#1144EB}.infobox-blue3>.infobox-icon>.ace-icon{background-color:#1144EB}.infobox-blue3.infobox-dark{background-color:#1144EB;border-color:#1144EB}.infobox-red{color:#D53F40;border-color:#D53F40}.infobox-red>.infobox-icon>.ace-icon{background-color:#D53F40}.infobox-red.infobox-dark{background-color:#D53F40;border-color:#D53F40}.infobox-brown{color:#C67A3E;border-color:#C67A3E}.infobox-brown>.infobox-icon>.ace-icon{background-color:#C67A3E}.infobox-brown.infobox-dark{background-color:#C67A3E;border-color:#C67A3E}.infobox-wood{color:#7B3F25;border-color:#7B3F25}.infobox-wood>.infobox-icon>.ace-icon{background-color:#7B3F25}.infobox-wood.infobox-dark{background-color:#7B3F25;border-color:#7B3F25}.infobox-light-brown{color:#CEBEA5;border-color:#CEBEA5}.infobox-light-brown>.infobox-icon>.ace-icon{background-color:#CEBEA5}.infobox-light-brown.infobox-dark{background-color:#CEBEA5;border-color:#CEBEA5}.infobox-orange{color:#E8B110;border-color:#E8B110}.infobox-orange>.infobox-icon>.ace-icon{background-color:#E8B110}.infobox-orange.infobox-dark{background-color:#E8B110;border-color:#E8B110}.infobox-orange2{color:#F79263;border-color:#F79263}.infobox-orange2>.infobox-icon>.ace-icon{background-color:#F79263}.infobox-orange2.infobox-dark{background-color:#F79263;border-color:#F79263}.infobox-green{color:#9ABC32;border-color:#9ABC32}.infobox-green>.infobox-icon>.ace-icon{background-color:#9ABC32}.infobox-green.infobox-dark{background-color:#9ABC32;border-color:#9ABC32}.infobox-green2{color:#0490A6;border-color:#0490A6}.infobox-green2>.infobox-icon>.ace-icon{background-color:#0490A6}.infobox-green2.infobox-dark{background-color:#0490A6;border-color:#0490A6}.infobox-grey{color:#999;border-color:#999}.infobox-grey>.infobox-icon>.ace-icon{background-color:#999}.infobox-grey.infobox-dark{background-color:#999;border-color:#999}.infobox-black{color:#393939;border-color:#393939}.infobox-black>.infobox-icon>.ace-icon{background-color:#393939}.infobox-black.infobox-dark{background-color:#393939;border-color:#393939}.infobox-dark{margin:1px 1px 0 0;border-color:transparent!important;border-width:0;color:#FFF;padding:4px}.infobox-dark>.infobox-icon>.ace-icon,.infobox-dark>.infobox-icon>.ace-icon:before{background-color:transparent;box-shadow:none!important;text-shadow:none;border-radius:0;font-size:30px}.infobox-dark .infobox-content{color:#FFF}.infobox>.infobox-progress{padding-top:0;display:inline-block;vertical-align:top;width:44px}.infobox>.infobox-chart{padding-top:0;display:inline-block;vertical-align:text-bottom;width:44px;text-align:center}.infobox>.infobox-chart>.sparkline{font-size:24px}.infobox>.infobox-chart canvas{vertical-align:middle!important}.infobox>.stat{display:inline-block;position:absolute;right:20px;top:11px;text-shadow:none;color:#ABBAC3;font-size:13px;padding-right:18px;padding-top:3px}.infobox>.stat:before{display:inline-block;width:8px;height:11px;background-color:#ABBAC3;position:absolute;right:4px;top:7px}.infobox>.stat:after{display:inline-block;position:absolute;right:1px;top:-8px;border:12px solid transparent;border-width:8px 7px;border-bottom-color:#ABBAC3}.infobox>.stat.stat-success{color:#77C646}.infobox>.stat.stat-success:before{background-color:#77C646}.infobox>.stat.stat-success:after{border-bottom-color:#77C646}.infobox>.stat.stat-important{color:#E4564F}.infobox.infobox-dark>.stat,.infobox.infobox-dark>.stat.stat-important,.infobox.infobox-dark>.stat.stat-success,.infobox>.badge{color:#FFF}.infobox>.stat.stat-important:before{background-color:#E4564F;top:3px}.infobox>.stat.stat-important:after{border-top-color:#E4564F;border-bottom-color:transparent;bottom:-6px;top:auto}.infobox.infobox-dark>.stat:before{background-color:#E1E5E8}.infobox.infobox-dark>.stat:after{border-bottom-color:#E1E5E8}.infobox.infobox-dark>.stat.stat-success:before{background-color:#D0E29E}.infobox.infobox-dark>.stat.stat-success:after{border-bottom-color:#D0E29E}.infobox.infobox-dark>.stat.stat-important:before{background-color:#FF8482;top:3px}.infobox.infobox-dark>.stat.stat-important:after{border-top-color:#FF8482;border-bottom-color:transparent;bottom:-6px;top:auto}.infobox>.badge{position:absolute;right:20px;top:11px;border-radius:0;text-shadow:none;font-size:11px;line-height:15px;height:16px;padding:0 1px}.infobox.infobox-dark>.badge{color:#FFF;background-color:rgba(255,255,255,.2)!important;border:1px solid #F1F1F1;top:2px;right:2px}.infobox.infobox-dark>.badge.badge-success>.ace-icon{color:#C6E9A1}.infobox.infobox-dark>.badge.badge-important>.ace-icon,.infobox.infobox-dark>.badge.badge-warning>.ace-icon{color:#ECB792}.infobox-small{width:135px;height:52px;text-align:left;padding-bottom:5px}.infobox-small>.infobox-chart,.infobox-small>.infobox-icon,.infobox-small>.infobox-progress{display:inline-block;width:40px;max-width:40px;height:42px;line-height:38px;vertical-align:middle}.infobox-small>.infobox-data{display:inline-block;text-align:left;vertical-align:middle;max-width:72px;min-width:0}.infobox-small>.infobox-chart>.sparkline{font-size:14px;margin-left:2px}.percentage{font-size:14px;display:inline-block;vertical-align:top}.infobox-small .percentage{font-size:13px;font-weight:400;margin-top:2px;margin-left:2px}.pricing-box:not(:first-child){padding-left:7px}.pricing-box:not(:last-child){padding-right:7px}.pricing-box .price{font-size:22px;line-height:20px;height:28px;text-align:center;color:#555}.pricing-box .price small{font-size:22px}.pricing-box .btn{font-size:16px}.pricing-box .widget-header{text-align:center;padding-left:0}@media only screen and (max-width:480px){.pricing-box{margin:0 0 16px -1px;padding-left:0!important;padding-right:0!important}.pricing-box:nth-child(odd){padding-left:12px!important}.pricing-box:nth-child(even){padding-right:12px!important}}@media only screen and (max-width:479px){.pricing-box{margin:0 0 16px;width:100%;padding-left:12px!important;padding-right:12px!important}}.pricing-table-header{padding-top:0;margin-top:0;text-align:left}.pricing-table-header>li{padding:7px 0 7px 11px;font-size:13px}.pricing-table{margin-top:0}.pricing-table>li{text-align:center;padding:7px 0;font-size:13px}.list-striped>li:nth-child(odd){background-color:#FFF}.list-striped>li:nth-child(even){background-color:#F2F3EB}.list-striped.pricing-table-header>li:nth-child(even){background-color:#EEE}.pricing-box-small{box-shadow:none;margin-left:-2px;background-color:#FFF;position:relative;z-index:10}.pricing-box-small .price{line-height:20px;height:28px;text-align:center}.pricing-box-small .price .label:after,.pricing-box-small .price .label:before{margin-top:-2px;opacity:.9;filter:alpha(opacity=90)}.pricing-box-small:hover{box-shadow:0 0 4px 2px rgba(0,0,0,.15);z-index:11;-webkit-transform:scale(1.04);-ms-transform:scale(1.04);-o-transform:scale(1.04);transform:scale(1.04)}.pricing-box-small:hover .price>.label{-webkit-transform:scale(.96);-ms-transform:scale(.96);-o-transform:scale(.96);transform:scale(.96)}.pricing-span{margin:0;width:19%;max-width:150px!important;min-width:110px!important;float:left!important}.pricing-span-header{padding-right:0}@media only screen and (min-width:480px){.pricing-span-body{padding-left:0;padding-right:0}}@media only screen and (max-width:480px){.pricing-span-body,.pricing-span-header{width:100%;padding-right:12px}}.login-container{width:375px;margin:0 auto}.login-layout label,.ui-jqdialog-content .searchFilter .queryresult{margin-bottom:11px}.login-layout{background-color:#1D2024}.login-layout .main-container:before{display:none}.login-layout .main-content{margin-left:0!important;margin-right:0!important;min-height:100%;padding-left:15px;padding-right:15px}.login-layout .widget-box{visibility:hidden;position:fixed;z-index:-5;border-bottom:none;box-shadow:none;padding:6px;background-color:#394557;-moz-transform:scale(0,1) translate(-150px);-webkit-transform:scale(0,1) translate(-150px);-o-transform:scale(0,1) translate(-150px);-ms-transform:scale(0,1) translate(-150px);transform:scale(0,1) translate(-150px)}.login-layout .widget-box.visible{visibility:visible;position:relative;z-index:auto;-moz-transform:scale(1,1) translate(0);-webkit-transform:scale(1,1) translate(0);-o-transform:scale(1,1) translate(0);-ms-transform:scale(1,1) translate(0);transform:scale(1,1) translate(0);transition:transform .3s ease;-moz-transition:-moz-transform .3s ease;-webkit-transition:-webkit-transform .3s ease;-o-transition:-o-transform .2s ease}.login-layout .widget-box .widget-main{padding:16px 36px 36px;background:#F7F7F7}.login-layout .widget-box .widget-main form{margin:0}.login-layout .widget-box .widget-body .toolbar>div>a{font-size:15px;font-weight:400;text-shadow:1px 0 1px rgba(0,0,0,.25)}.login-box .forgot-password-link{color:#FE9}.login-box .user-signup-link{color:#CF7}.login-box .toolbar{background:#5090C1;border-top:2px solid #597597}.login-box .toolbar>div{width:50%;display:inline-block;padding:9px 0 11px}.login-box .toolbar>div:first-child{float:left;text-align:left}.login-box .toolbar>div:first-child>a{margin-left:11px}.login-box .toolbar>div:first-child+div{float:right;text-align:right}.login-box .toolbar>div:first-child+div>a{margin-right:11px}.forgot-box .toolbar{background:#C16050;border-top:2px solid #976559;padding:9px 18px}.signup-box .toolbar{background:#76B774;border-top:2px solid #759759;padding:9px 18px}.forgot-box .back-to-login-link,.signup-box .back-to-login-link{color:#FE9;font-size:14px;font-weight:700;text-shadow:1px 0 1px rgba(0,0,0,.25)}.login-layout .login-box .widget-main{padding-bottom:16px}.social-or-login{margin-top:4px;text-align:center;position:relative;z-index:1}.social-or-login :first-child{display:inline-block;background:#F7F7F7;padding:0 8px;color:#5090C1;font-size:13px}.social-or-login:before{display:block;position:absolute;z-index:-1;top:50%;left:0;right:0;border-top:1px dotted #A6C4DB}.social-login a{border-radius:100%;width:42px;height:42px;line-height:46px;padding:0;margin:0 1px;border-width:0}.social-login a>.ace-icon{font-size:24px;margin:0}@media only screen and (max-width:540px){.login-layout .widget-box .widget-main{padding:16px}.login-container{width:98%}.login-layout .widget-box{padding:0}.login-layout .main-content{padding-left:6px;padding-right:6px}.login-box .toolbar>div{width:auto}}.light-login{background:url(images/pattern.jpg) #DFE0E2}.light-login .widget-box{padding:1px 1px 0;-webkit-box-shadow:0 0 2px 1px rgba(0,0,0,.12);box-shadow:0 0 2px 1px rgba(0,0,0,.12);border-bottom:1px solid rgba(50,50,50,.33)}.light-login .widget-box .toolbar{border-top-width:1px}.light-login .widget-box.login-box{background-color:#BCC6CF;background-color:rgba(100,110,120,.4)}.light-login .widget-box.signup-box{background-color:#C1CEC4;background-color:rgba(110,120,100,.4)}.light-login .widget-box.forgot-box{background-color:#D2C5C5;background-color:rgba(120,110,100,.4)}.blur-login{background:url(images/meteorshower2.jpg) #394557}.invoice-info{line-height:24px!important;color:#444;vertical-align:bottom;margin-left:9px;margin-right:9px}.invoice-info-label{display:inline-block;max-width:100px;text-align:right;font-size:14px}.ace-thumbnails>li,.ace-thumbnails>li>:first-child{display:block;position:relative}.invoice-box .label-large[class*=arrowed]{margin-left:11px!important;max-width:95%}.error-container{margin:20px;padding:0;background:#FFF}@media only screen and (max-width:767px){.error-container{margin:12px}}@media only screen and (max-width:479px){.error-container{margin:6px}}.ace-thumbnails{list-style:none;margin:0;padding:0}.ace-thumbnails>li{float:left;overflow:hidden;margin:2px;border:2px solid #333}.ace-thumbnails>li>:first-child:focus{outline:0}.ace-thumbnails>li .tags{display:inline-block;position:absolute;bottom:0;right:0;overflow:visible;direction:rtl;padding:0;margin:0;height:auto;width:auto;background-color:transparent;border-width:0;vertical-align:inherit}.ace-thumbnails>li .tags>.label-holder{opacity:.92;filter:alpha(opacity=92);display:table;margin:1px 0 0;direction:ltr;text-align:left}.ace-thumbnails>li>.tools,.ace-thumbnails>li>:first-child>.text{position:absolute;text-align:center;background-color:rgba(0,0,0,.55)}.ace-thumbnails>li .tags>.label-holder:hover{opacity:1;filter:alpha(opacity=100)}.ace-thumbnails>li>.tools{top:0;bottom:0;left:-30px;width:24px;vertical-align:middle;-webkit-transition:all .2s ease;-o-transition:all .2s ease;transition:all .2s ease}.ace-thumbnails>li>.tools.tools-right{left:auto;right:-30px}.ace-thumbnails>li>.tools.tools-bottom{width:auto;height:28px;left:0;right:0;top:auto;bottom:-30px}.ace-thumbnails>li>.tools.tools-top{width:auto;height:28px;left:0;right:0;top:-30px;bottom:auto}.ace-thumbnails>li:hover>.tools{left:0;right:0}.ace-thumbnails>li:hover>.tools.tools-bottom{top:auto;bottom:0}.ace-thumbnails>li:hover>.tools.tools-top{bottom:auto;top:0}.ace-thumbnails>li:hover>.tools.tools-right{left:auto;right:0}.ace-thumbnails>li>.in.tools{left:0;right:0}.ace-thumbnails>li>.in.tools.tools-bottom{top:auto;bottom:0}.ace-thumbnails>li>.in.tools.tools-top{bottom:auto;top:0}.ace-thumbnails>li>.in.tools.tools-right{left:auto;right:0}.ace-thumbnails>li>.tools>a,.ace-thumbnails>li>:first-child .inner a{display:inline-block;color:#FFF;font-size:18px;font-weight:400;padding:0 4px}.ace-thumbnails>li>.tools>a:hover,.ace-thumbnails>li>:first-child .inner a:hover{text-decoration:none;color:#C9E2EA}.ace-thumbnails>li .tools.tools-bottom>a,.ace-thumbnails>li .tools.tools-top>a{display:inline-block}.ace-thumbnails>li>:first-child>.text{right:0;left:0;bottom:0;top:0;color:#FFF;opacity:0;filter:alpha(opacity=0);-webkit-transition:all .2s ease;-o-transition:all .2s ease;transition:all .2s ease}.dialogs,.itemdiv{position:relative}.ace-thumbnails>li>:first-child>.text:before{content:'';display:inline-block;height:100%;vertical-align:middle;margin-right:0}.ace-thumbnails>li>:first-child>.text>.inner{padding:4px 0;margin:0;display:inline-block;vertical-align:middle;max-width:90%}.ace-thumbnails>li:hover>:first-child>.text{opacity:1;filter:alpha(opacity=100)}@media only screen and (max-width:480px){.ace-thumbnails{text-align:center}.ace-thumbnails>li{float:none;display:inline-block}}.dialogs{padding:9px}.itemdiv{padding-right:3px;min-height:66px}.itemdiv>.user{display:inline-block;width:42px;position:absolute;left:0}.itemdiv>.user>.img,.itemdiv>.user>img{border-radius:100%;border:2px solid #5293C4;max-width:40px;position:relative}.itemdiv>.user>.img{padding:2px}.itemdiv>.body{width:auto;margin-left:50px;margin-right:12px;position:relative}.itemdiv>.body>.time{display:block;font-size:11px;font-weight:700;color:#666;position:absolute;right:9px;top:0}.itemdiv>.body>.time .ace-icon{font-size:14px;font-weight:400}.itemdiv>.body>.name{display:block;color:#999}.itemdiv>.body>.name>b{color:#777}.itemdiv>.body>.text{display:block;position:relative;margin-top:2px;padding-bottom:19px;padding-left:7px;font-size:13px}.itemdiv.dialogdiv:before,.itemdiv.dialogdiv>.body:before,.itemdiv>.body>.text:after{content:"";position:absolute}.itemdiv>.body>.text:after{display:block;height:1px;font-size:0;overflow:hidden;left:16px;right:-12px;margin-top:9px;border-top:1px solid #E4ECF3}.itemdiv>.body>.text>.ace-icon:first-child{color:#DCE3ED;margin-right:4px}.itemdiv:last-child>.body>.text{border-bottom-width:0}.itemdiv:last-child>.body>.text:after{display:none}.itemdiv.dialogdiv{padding-bottom:14px}.itemdiv.dialogdiv:before{display:block;top:0;bottom:0;left:19px;width:3px;max-width:3px;background-color:#E1E6ED;border:1px solid #D7DBDD;border-width:0 1px}.itemdiv.dialogdiv:last-child{padding-bottom:0}.itemdiv.dialogdiv:last-child:before{display:none}.itemdiv.dialogdiv>.user>img{border-color:#C9D6E5}.itemdiv.dialogdiv>.body{border:1px solid #DDE4ED;padding:5px 8px 8px;border-left-width:2px;margin-right:1px}.itemdiv.dialogdiv>.body:before{display:block;left:-7px;top:11px;width:8px;height:8px;border:2px solid #DDE4ED;border-width:2px 0 0 2px;background-color:#FFF;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}.itemdiv.dialogdiv>.body>.time{position:static;float:right}.itemdiv.dialogdiv>.body>.text{padding-left:0;padding-bottom:0}.itemdiv.dialogdiv>.body>.text:after{display:none}.itemdiv.dialogdiv .tooltip-inner{word-break:break-all}.itemdiv.memberdiv{width:175px;padding:2px;margin:3px 0;float:left;border-bottom:1px solid #E8E8E8}@media (min-width:992px){.itemdiv.memberdiv{max-width:50%}}@media (max-width:991px){.itemdiv.memberdiv{min-width:33.333%}}.itemdiv.memberdiv>.user>img{border-color:#DCE3ED}.itemdiv.memberdiv>.body>.time{position:static}.itemdiv.memberdiv>.body>.name{line-height:18px;height:18px;margin-bottom:0}.itemdiv.memberdiv>.body>.name>a{display:inline-block;max-width:100px;max-height:18px;overflow:hidden;text-overflow:ellipsis;word-break:break-all}.itemdiv .tools{position:absolute;right:5px;bottom:10px;display:none}.item-list>li>.checkbox,.item-list>li>label.inline,.itemdiv:hover .tools{display:inline-block}.itemdiv .tools .btn{border-radius:36px;margin:1px 0}.itemdiv .body .tools{bottom:4px}.itemdiv.commentdiv .tools{right:9px}.item-list{margin:0;padding:0;list-style:none}.item-list>li{padding:9px;background-color:#FFF;margin-top:-1px;position:relative}.item-list>li.selected{color:#8090A0;background-color:#F4F9FC}.item-list>li.selected .lbl,.item-list>li.selected label{text-decoration:line-through;color:#8090A0}.item-list>li label{font-size:13px}.item-list>li .percentage{font-size:11px;font-weight:700;color:#777}li[class*=item-]{border:1px solid #DDD;border-left-width:3px}li.item-orange{border-left-color:#E8B110}li.item-orange2{border-left-color:#F79263}li.item-red{border-left-color:#D53F40}li.item-red2{border-left-color:#D15B47}li.item-green{border-left-color:#9ABC32}li.item-green2{border-left-color:#0490A6}li.item-blue{border-left-color:#4F99C6}li.item-blue2{border-left-color:#3983C2}li.item-blue3{border-left-color:#1144EB}li.item-pink{border-left-color:#CB6FD7}li.item-purple{border-left-color:#6F3CC4}li.item-black{border-left-color:#505050}li.item-grey{border-left-color:#A0A0A0}li.item-brown{border-left-color:brown}li.item-default{border-left-color:#ABBAC3}.ui-sortable-helper,.ui-sortable-helper>a,.ui-sortable-placeholder,.ui-sortable-placeholder>a{cursor:move!important}@media only screen and (max-width:480px){.itemdiv.memberdiv{float:none;width:auto}}.profile-user-info{display:table;width:98%;width:calc(100% - 24px);margin:0 auto}.profile-info-row{display:table-row}.profile-info-name,.profile-info-value{display:table-cell;border-top:1px dotted #D5E4F1}.profile-info-name{text-align:right;padding:6px 10px 6px 4px;font-weight:400;color:#667E99;background-color:transparent;width:110px;vertical-align:middle}.profile-info-value{padding:6px 4px 6px 6px}.profile-info-value>span+span:before{display:inline;content:",";margin-left:1px;margin-right:3px;color:#666;border-bottom:1px solid #FFF}.profile-info-value>span+span.editable-container:before{display:none}.profile-info-row:first-child .profile-info-name,.profile-info-row:first-child .profile-info-value{border-top:none}.profile-user-info-striped{border:1px solid #DCEBF7}.profile-user-info-striped .profile-info-name{color:#336199;background-color:#EDF3F4;border-top:1px solid #F7FBFF}.profile-user-info-striped .profile-info-value{border-top:1px dotted #DCEBF7;padding-left:12px}.profile-picture{border:1px solid #CCC;background-color:#FFF;padding:4px;display:inline-block;max-width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;box-shadow:1px 1px 1px rgba(0,0,0,.15)}.dd-empty,.dd-handle,.dd-placeholder,.dd2-content{-webkit-box-sizing:border-box;-moz-box-sizing:border-box}.profile-activity{padding:10px 4px;border-bottom:1px dotted #D0D8E0;position:relative;border-left:1px dotted #FFF;border-right:1px dotted #FFF}.profile-activity:first-child{border-top:1px dotted transparent}.profile-activity:first-child:hover{border-top-color:#D0D8E0}.profile-activity:hover{background-color:#F4F9FD;border-left:1px dotted #D0D8E0;border-right:1px dotted #D0D8E0}.profile-activity img{border:2px solid #C9D6E5;border-radius:100%;max-width:40px;margin-right:10px;margin-left:0;box-shadow:none}.profile-activity .thumbicon{background-color:#74ABD7;display:inline-block;border-radius:100%;width:38px;height:38px;color:#FFF;font-size:18px;text-align:center;line-height:38px;margin-right:10px;margin-left:0;text-shadow:none!important}.profile-activity .time{display:block;margin-top:4px;color:#777}.profile-activity a.user{font-weight:700;color:#9585BF}.profile-activity .tools{position:absolute;right:12px;bottom:8px;display:none}.profile-activity:hover .tools{display:block}.user-profile .ace-thumbnails li{border:1px solid #CCC;padding:3px;margin:6px}.user-profile .ace-thumbnails li .tools{left:3px;right:3px}.user-profile .ace-thumbnails li:hover .tools{bottom:3px}.user-title-label:hover{text-decoration:none}.user-title-label+.dropdown-menu{margin-left:-12px}.profile-contact-links{padding:4px 2px 5px;border:1px solid #E0E2E5;background-color:#F8FAFC}.btn-link:hover .ace-icon{text-decoration:none!important}.profile-social-links>a:hover>.ace-icon,.profile-users .memberdiv .name a:hover .ace-icon,.profile-users .memberdiv .tools>a:hover{text-decoration:none}.profile-social-links>a{text-decoration:none;margin:0 1px}.profile-skills .progress{height:26px;margin-bottom:2px;background-color:transparent}.profile-skills .progress .progress-bar{line-height:26px;font-size:13px;font-weight:700;font-family:"Open Sans";padding:0 8px}.profile-users .user{display:block;position:static;text-align:center;width:auto}.profile-users .user img{padding:2px;border-radius:100%;border:1px solid #AAA;max-width:none;width:64px;-webkit-transition:all .1s;-o-transition:all .1s;transition:all .1s}.profile-users .user img:hover{-webkit-box-shadow:0 0 1px 1px rgba(0,0,0,.33);box-shadow:0 0 1px 1px rgba(0,0,0,.33)}.profile-users .memberdiv{background-color:#FFF;width:100px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:none;text-align:center;margin:0 8px 24px}.profile-users .memberdiv .body{display:inline-block;margin:8px 0 0}.profile-users .memberdiv .popover{visibility:hidden;min-width:0;max-height:0;max-width:0;margin-left:0;margin-right:0;top:-5%;left:auto;right:auto;opacity:0;display:none;position:absolute;-webkit-transition:opacity .2s linear 0s,visibility 0s linear .2s,max-height 0s linear .2s,max-width 0s linear .2s,min-width 0s linear .2s;-o-transition:opacity .2s linear 0s,visibility 0s linear .2s,max-height 0s linear .2s,max-width 0s linear .2s,min-width 0s linear .2s;transition:opacity .2s linear 0s,visibility 0s linear .2s,max-height 0s linear .2s,max-width 0s linear .2s,min-width 0s linear .2s}.profile-users .memberdiv .popover.right{left:100%;right:auto;display:block}.profile-users .memberdiv .popover.left{left:auto;right:100%;display:block}.profile-users .memberdiv>:first-child:hover .popover{visibility:visible;opacity:1;z-index:1060;max-height:250px;max-width:250px;min-width:150px;-webkit-transition-delay:0s;-moz-transition-delay:0s;-o-transition-delay:0s;transition-delay:0s}.profile-users .memberdiv .tools{position:static;display:block;width:100%;margin-top:2px}.profile-users .memberdiv .tools>a{margin:0 2px}.user-status{display:inline-block;width:11px;height:11px;background-color:#FFF;border:3px solid #AAA;border-radius:100%;vertical-align:middle;margin-right:1px}.user-status.status-online{border-color:#8AC16C}.user-status.status-busy{border-color:#E07F69}.user-status.status-idle{border-color:#FFB752}.tab-content.profile-edit-tab-content{border:1px solid #DDD;padding:8px 32px 32px;-webkit-box-shadow:1px 1px 0 0 rgba(0,0,0,.2);box-shadow:1px 1px 0 0 rgba(0,0,0,.2);background-color:#FFF}@media only screen and (max-width:480px){.profile-info-name{width:80px}.profile-user-info-striped .profile-info-name{float:none;width:auto;text-align:left;padding:6px 4px 6px 10px;display:block}.profile-user-info-striped .profile-info-value{margin-left:10px;display:block}.user-profile .memberdiv{width:50%;margin-left:0;margin-right:0}}.inbox-tabs.nav-tabs>li>a{background-color:#FAFAFA}.inbox-tabs.nav-tabs>li.active:not(.open)>a,.inbox-tabs.nav-tabs>li.active:not(.open)>a:focus,.inbox-tabs.nav-tabs>li.active:not(.open)>a:hover{background-color:#F1F5FA;box-shadow:0 -2px 3px 0 rgba(0,0,0,.1);color:#48768E}.inbox-tabs.nav-tabs>li>a.btn-new-mail{background-color:transparent;border:none!important;padding:0!important}.inbox-tabs.nav-tabs>li>a.btn-new-mail>.btn{border-width:0!important;border-radius:3px!important;padding:0 6px!important;position:relative;transition:none!important}.inbox-tabs.nav-tabs>li.active>a.btn-new-mail{box-shadow:none!important}.inbox-tabs.nav-tabs>li.active>a.btn-new-mail>.btn:before{content:"";display:block;position:absolute;top:100%;left:50%;margin-left:-6px;border-width:6px 8px;border-style:solid;border-color:transparent;border-top-color:inherit}.message-container,.message-item,.message-list{position:relative}.inbox-tabs.nav-tabs.tab-size-bigger>li>a{padding:5px 15px 7px;font-size:14px}.inbox-tabs.nav-tabs.tab-size-bigger>li>a>.ace-icon:first-child{margin-bottom:5px}.inbox-tabs.nav-tabs.tab-size-bigger>li>a.btn-new-mail>.btn{padding:10px!important;border-radius:7px!important}.inbox-tabs.nav-tabs.tab-size-bigger>li.active>a.btn-new-mail{margin-top:0!important;top:1px}.inbox-tabs.nav-tabs.tab-size-bigger>li.active>a.btn-new-mail>.btn:before{left:50%;margin-left:-8px;border-width:8px 10px}@media only screen and (max-width:479px){.inbox-tabs>.li-new-mail{display:block;text-align:right;margin-bottom:8px!important;float:none!important}.inbox-tabs>.li-new-mail>.btn-new-mail{display:inline-block;width:auto}}.message-item .sender,.message-item .summary,.message-item .summary .text{display:inline-block;white-space:nowrap;vertical-align:middle}.message-item{border:1px solid #EAEDF1;border-bottom-width:0;padding:12px 12px 14px;line-height:18px;background-color:#FFF}.message-item:first-child{border-top-width:0}.message-item:hover{border-color:#E2EAF2;background-color:#F2F6F9}.message-item:hover+.message-item{border-top-color:#E2EAF2}.message-item.selected+.message-item,.message-item.selected+.message-item:hover+.message-item,.message-item:hover+.message-item.selected{border-top-color:#FFF}.message-item.selected{background-color:#EFF4F7;border-color:#FFF #E2EAF2}.message-item input.ace+.lbl::before,.message-navbar input.ace+.lbl::before{top:auto}.message-item .sender{margin:0 6px 0 4px;color:#467287;width:110px;height:18px;text-overflow:ellipsis;overflow:hidden;cursor:pointer}.message-item.message-unread .sender{color:#6A9CBA;font-weight:700}.message-item .summary{position:relative;margin-left:30px;max-width:250px;max-width:calc(100% - 300px);min-width:200px}.message-item .summary .text{color:#555;width:auto;max-width:100%;height:18px;text-overflow:ellipsis;overflow:hidden;cursor:pointer}.message-item .summary .text:hover{text-decoration:underline}.message-item .summary .message-flags{display:block;position:absolute;right:100%;margin-right:4px;height:18px;white-space:nowrap}.message-item.message-unread .summary .text{color:#609FC4;font-weight:700}.message-item .time{float:right;width:60px;height:18px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;color:#666}.message-item.message-unread .time{font-weight:700;color:#609FC4}.message-content .time,.message-item.message-unread .message-content .time{font-weight:400}.message-item .attachment{color:#999;font-size:18px;vertical-align:middle;float:right;margin:0 12px;position:relative}.message-item.message-unread .attachment{color:#4F99C6}.message-star{vertical-align:middle;margin:2px 4px 0 6px;font-size:15px;cursor:pointer}.message-star:hover{color:#FEB902!important;text-decoration:none}.mail-tag:empty{display:inline-block;width:8px;height:11px;padding:0;line-height:normal;vertical-align:middle;margin:0 1px 0 0}.badge.mail-tag{border-radius:2px}.dropdown-menu>li>a>.mail-tag{vertical-align:inherit}@media only screen and (max-width:991px){.message-item .summary{min-width:0}.message-item .sender{width:100px}}@media only screen and (max-width:550px){.message-item .summary{margin:8px 0 0 32px;max-width:95%;min-width:0;display:block}.message-item .sender{width:auto;max-width:150px}.message-item .summary .text{max-width:95%}}.btn-message,.btn-message:active,.btn-message:focus,.btn-message:hover,.open .btn-message.dropdown-toggle{background-color:#FFF!important;border:1px solid #94B9CE!important;color:#7CA3BA!important;text-shadow:none!important}.message-content{padding:16px 12px;border:1px solid #E9E9E9;-webkit-box-shadow:0 0 1px 1px rgba(0,0,0,.02);box-shadow:0 0 1px 1px rgba(0,0,0,.02);background-color:rgba(255,255,255,.8);border-top-width:0}.message-item .message-content{margin-top:16px;border-top-width:1px}.message-body{padding:0 9px;color:#6A7177}.message-navbar{line-height:24px;padding:10px 12px;border:1px solid #D6E1EA;border-color:#D6E1EA transparent;background-color:#F1F5FA;text-align:center;position:relative}.message-content .dropdown-toggle,.message-navbar .dropdown-toggle{color:#777}.message-content .dropdown-toggle:focus,.message-content .dropdown-toggle:hover,.message-navbar .dropdown-toggle:focus,.message-navbar .dropdown-toggle:hover{text-decoration:none;color:#2283C5}.message-bar{display:inline-block;min-height:28px}@media only screen and (max-width:480px){.message-bar{display:block;min-height:60px}}.message-footer{background-color:#F1F1F1;padding:12px 16px;border:1px solid #E6E6E6;border-width:1px 0;border-top:1px solid #E4E9EE}.message-footer .pagination{margin:0}.message-footer .pagination>li{margin:0;padding:0}.message-footer .pagination>li>a,.message-footer .pagination>li>span{color:#777;padding:3px 6px;margin-left:1px;margin-right:1px;background-color:transparent;border:1px solid transparent}.message-footer .pagination>li.disabled>span{color:#BBB;cursor:default;background-color:transparent;border-color:transparent}.message-footer .pagination>li>a:hover{border-color:#91bad6;color:#2283C5;text-decoration:none;background-color:#FFF}.message-footer input[type=text]{font-size:12px;width:34px;height:24px;line-height:20px;margin-bottom:0;padding:3px;vertical-align:middle;text-align:center}.message-footer-style2 .pagination>li>a,.message-footer-style2 .pagination>li>span{border:1px solid #B5B5B5;border-radius:100%!important;width:26px;height:26px;line-height:26px;display:inline-block;text-align:center;padding:0}.message-content .sender,.message-content .time{width:auto;text-overflow:inherit;vertical-align:middle}.message-footer-style2 .pagination>li.disabled>span,.message-footer-style2 .pagination>li>span{border-color:#CCC}.message-footer-style2 .pagination>li>a:hover{border-color:#84AFC9;background-color:#F7F7F7}.message-item.message-inline-open{background-color:#F2F6F9;border:1px solid #DDD;border-bottom-color:#CCC}.message-item.message-inline-open:first-child{border-top-color:#EEE}.message-item.message-inline-open:last-child{border-bottom-color:#DDD}.message-item.message-inline-open+.message-item{border-bottom-color:transparent}.message-loading-overlay{position:absolute;z-index:14;top:0;bottom:0;right:0;left:0;background-color:rgba(255,255,255,.5);text-align:center}.message-loading-overlay>.ace-icon{position:absolute;top:15%;left:0;right:0;text-align:center}.message-content .sender{color:#6A9CBA;font-weight:700;margin:0}.dataTables_filter label,.dataTables_length label{font-weight:400}.message-content .time{white-space:normal;float:none}ul.attachment-list{margin:6px 0 4px 8px}ul.attachment-list>li{margin-bottom:3px}.message-attachment{padding-left:10px;padding-right:10px}.attached-file{color:#777;width:200px;display:inline-block}.attached-file>.ace-icon{display:inline-block;width:16px;margin-right:2px;vertical-align:middle}.attached-file:hover{text-decoration:none;color:#438EB9}.attached-file:hover .attached-name{color:#2283C5}.attached-file .attached-name{display:inline-block;max-width:175px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;vertical-align:middle}.messagebar-item-left,.messagebar-item-right{position:absolute;bottom:14px;left:12px;text-align:left}.messagebar-item-right{right:12px;left:auto}.message-navbar .nav-search{right:auto;left:5px;top:auto;bottom:11px}.message-navbar .messagebar-item-left~.nav-search{left:60px}.message-form{border:1px solid #ddd;border-top:none;padding-top:22px}.message-form .form-actions{margin-bottom:0}.message-form .wysiwyg-editor{overflow:auto;min-height:150px;max-height:250px;height:auto}.btn-send-message{position:relative;top:6px;vertical-align:middle}.btn-back-message-list{color:#777}.btn-back-message-list:hover{color:#478FCA;text-decoration:none}.message-condensed .message-item{padding-top:8px;padding-bottom:9px}.message-condensed .message-footer,.message-condensed .message-navbar{padding-top:7px;padding-bottom:7px}.message-condensed .messagebar-item-left,.message-condensed .messagebar-item-right{bottom:9px}.message-condensed .message-navbar .nav-search{bottom:7px}@media only screen and (max-width:480px){.message-form{padding-left:16px;padding-right:16px}.message-condensed .message-bar{min-height:42px}}.inbox-folders .btn-block{margin-top:0}@media only screen and (max-width:767px){.inbox-folders.inbox-folders-responsive .btn-block{width:24%}}@media only screen and (max-width:600px){.inbox-folders.inbox-folders-responsive .btn-block{width:48%}}@media only screen and (max-width:320px){.inbox-folders.inbox-folders-responsive .btn-block{width:99%}}.inbox-folders .btn-lighter,.inbox-folders .btn-lighter.active{background-color:#F4F4F4!important;text-shadow:none!important;color:#7C8395!important;border:1px solid #FFF!important;padding:5px 11px}.inbox-folders .btn-lighter.active{background-color:#EDF2F8!important;color:#53617C!important}.inbox-folders .btn-lighter:hover{background-color:#EFEFEF!important;color:#6092C4!important}.inbox-folders .btn>.ace-icon:first-child{display:inline-block;width:14px;text-align:left}.inbox-folders .btn-lighter+.btn-lighter{border-top-width:0!important}.inbox-folders .btn.active:before{display:block;content:"";position:absolute;top:1px;bottom:1px;left:-1px;border-left:3px solid #4F99C6}.inbox-folders .btn.active:after{display:none}.inbox-folders .btn .counter{border-radius:3px;position:absolute;right:8px;top:8px;padding-left:6px;padding-right:6px;opacity:.75;filter:alpha(opacity=75)}.inbox-folders .btn:hover .badge{opacity:1;filter:alpha(opacity=100)}.timeline-container{position:relative;padding-top:4px;margin-bottom:32px}.timeline-container:last-child{margin-bottom:0}.timeline-container:before{content:"";display:block;position:absolute;left:28px;top:0;bottom:0;border:1px solid #E2E3E7;background-color:#E7EAEF;width:4px;border-width:0 1px}.timeline-container:first-child:before{border-top-width:1px}.timeline-container:last-child:before{border-bottom-width:1px}.timeline-item{position:relative;margin-bottom:8px}.timeline-item .widget-box{background-color:#F2F6F9;color:#595C66}.timeline-item .transparent.widget-box{border-left:3px solid #DAE1E5}.timeline-item .transparent .widget-header{background-color:#ECF1F4;border-bottom-width:0}.timeline-item .transparent .widget-header>.widget-title{margin-left:8px}.timeline-item:nth-child(even) .widget-box{background-color:#F3F3F3;color:#616161}.timeline-item:nth-child(even) .widget-box.transparent{border-left-color:#DBDBDB!important}.timeline-item:nth-child(even) .widget-box.transparent .widget-header{background-color:#EEE!important}.timeline-item .widget-box{margin:0 0 0 60px;position:relative;max-width:none}.timeline-item .widget-main{margin:0;position:relative;max-width:none;border-bottom-width:0}.timeline-item .widget-body{background-color:transparent}.timeline-item .widget-toolbox{padding:4px 8px 0!important;background-color:transparent!important;border-width:0!important;margin:0!important}.timeline-info{float:left;width:60px;text-align:center;position:relative}.timeline-info img{border-radius:100%;max-width:42px}.timeline-info .badge,.timeline-info .label{font-size:12px}.timeline-container:not(.timeline-style2) .timeline-indicator{opacity:1;border-radius:100%;display:inline-block;font-size:16px;height:36px;line-height:30px;width:36px;text-align:center;text-shadow:none!important;padding:0;cursor:default;border:3px solid #FFF!important}.timeline-label{display:block;clear:both;margin:0 0 18px 34px}.timeline-item img{border:1px solid #AAA;padding:2px;background-color:#FFF}.timeline-style2:before{display:none}.timeline-style2 .timeline-item{padding-bottom:22px;margin-bottom:0}.timeline-style2 .timeline-item:last-child{padding-bottom:0}.timeline-style2 .timeline-item:before{content:"";display:block;position:absolute;left:90px;top:5px;bottom:-5px;border-width:0;background-color:#DDD;width:2px;max-width:2px}.timeline-style2 .timeline-item:last-child:before{display:none}.timeline-style2 .timeline-item:first-child:before{display:block}.timeline-style2 .timeline-item .transparent .widget-header{background-color:transparent!important}.timeline-style2 .timeline-item .transparent.widget-box{background-color:transparent!important;border-left:none!important}.timeline-style2 .timeline-info{width:100px}.timeline-style2 .timeline-indicator{font-size:0;height:12px;line-height:12px;width:12px;border-width:1px!important;background-color:#FFF!important;position:absolute;left:85px;top:3px;opacity:1;border-radius:100%;display:inline-block;padding:0}.timeline-style2 .timeline-date{display:inline-block;width:72px;text-align:right;margin-right:25px;color:#777}.timeline-style2 .timeline-item .widget-box{margin-left:112px}.timeline-style2 .timeline-label{width:75px;margin-left:0;margin-bottom:10px;text-align:right;color:#666;font-size:14px}.timeline-time{text-align:center;position:static}.dataTables_filter,.dataTables_paginate{text-align:right}.well.search-area{background-color:#ecf1f4;border-color:#d6e1ea;-webkit-box-shadow:none;box-shadow:none}.search-thumbnail{-webkit-transition-duration:.1s;transition-duration:.1s}.search-thumbnail:hover{border-color:#75A8CE}.search-thumbnail .search-title{margin-top:15px}.search-media{border:1px solid #ddd;margin-top:-1px;padding:12px 150px 12px 12px;-webkit-transition:border .1s ease-in-out 0s;-o-transition:border .1s ease-in-out 0s;transition:border .1s ease-in-out 0s;position:relative}.search-media:hover{border-color:#75A8CE;z-index:1}.search-media .search-actions{position:absolute;right:0;top:0;bottom:0;height:100%;width:20%;min-width:100px;max-width:150px;padding:6px 9px}.search-media .search-actions::before{content:"";display:block;position:absolute;left:0;top:8px;bottom:16px;width:1px;background-image:-webkit-linear-gradient(top,#FFF 0,#DDD 100%);background-image:-o-linear-gradient(top,#FFF 0,#DDD 100%);background-image:linear-gradient(to bottom,#FFF 0,#DDD 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffdddddd', GradientType=0)}.search-media:hover .search-actions{background-color:#F0F4F7}.search-media.disabled:hover .search-actions{background-color:#F6F6F6}.search-media:not(.disabled):hover .search-actions::before{background-image:-webkit-linear-gradient(top,#FFF 0,#84bee5 100%);background-image:-o-linear-gradient(top,#FFF 0,#84bee5 100%);background-image:linear-gradient(to bottom,#FFF 0,#84bee5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ff84bee5', GradientType=0)}.search-filter-header{padding:8px;margin:-4px}.search-btn-action{position:absolute;bottom:-5px;left:0;right:0;width:auto;-webkit-transition:bottom .15s;-o-transition:bottom .15s;transition:bottom .15s}.search-media:hover .search-btn-action{bottom:1px}.search-promotion.label{position:absolute;margin-top:-1px;margin-left:-1px}.search-filter-element{padding:12px;background-color:#FFF;border:1px solid #C9DDE7}.search-results{padding:24px 12px;min-height:20px}.search-result{margin-top:-1px;position:relative;padding:12px;border:1px dotted;border-color:#DDD #FFF #FFF;border-color:rgba(0,0,0,.11) transparent transparent}.search-result:hover{background-color:#F7F7F7;border-color:#D6E1EA;border-style:solid;z-index:1}.search-result:first-child{border-top-color:transparent}.search-result:first-child:hover{border-top-color:#D6E1EA}.search-result .search-title{font-size:16px;margin-top:0;margin-bottom:6px}.search-result .search-content{margin-top:2px}.dataTables_length select{width:70px;height:25px;padding:2px 3px}.dataTables_filter input[type=search],.dataTables_filter input[type=text]{width:125px;height:18px;line-height:18px;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;padding:4px 6px}.dataTables_info{font-size:14px}.dataTables_paginate .pagination{margin:0 12px}.dataTables_wrapper label{display:inline-block;font-size:13px}.dataTables_wrapper input[type=search],.dataTables_wrapper input[type=text],.dataTables_wrapper select{margin-bottom:0!important;margin:0 4px}div.dataTables_scrollBody table,div.dataTables_scrollFoot table{margin-top:0!important;border-top:none}.dataTables_wrapper .row{margin:0!important}.dataTables_wrapper .row:first-child{padding-top:12px;padding-bottom:12px;background-color:#EFF3F8}.dataTables_wrapper .row:first-child+.dataTable{border-top:1px solid #ddd;border-bottom:1px solid #ddd}.dataTables_wrapper .row:last-child{border-bottom:1px solid #e0e0e0;padding-top:12px;padding-bottom:12px;background-color:#EFF3F8}.dataTables_wrapper .dataTables_scroll+.row{border-top:1px solid #e0e0e0}.dataTable{margin-bottom:0}.dataTable>thead>tr>th[class*=sort]{cursor:pointer}.dataTable>thead>tr>th[class*=sort]:after{float:right;display:inline;content:"\f0dc";font-family:FontAwesome;font-size:13px;font-weight:400;color:#555}.dataTable>thead>tr>th.sorting_disabled:after,.dataTables_scrollHead+.dataTables_scrollBody>.dataTable>thead>tr>th:after,.fc-state-default .fc-button-effect{display:none}.dataTable>thead>tr>th[class*=sort]:hover{color:#547EA8}.dataTable>thead>tr>th[class*=sorting_]{color:#307ECC}.dataTable>thead>tr>th.sorting_asc,.dataTable>thead>tr>th.sorting_desc{background-image:-webkit-linear-gradient(top,#EFF3F8 0,#E3E7ED 100%);background-image:-o-linear-gradient(top,#EFF3F8 0,#E3E7ED 100%);background-image:linear-gradient(to bottom,#EFF3F8 0,#E3E7ED 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffeff3f8', endColorstr='#ffe3e7ed', GradientType=0)}.dataTable>thead>tr>th.sorting_desc:after{content:"\f0dd";top:-6px;color:#307ECC}.dataTable>thead>tr>th.sorting_asc:after{content:"\f0de";top:4px;color:#307ECC}.dataTable>thead>tr>th.sorting_disabled{cursor:inherit}.dataTables_scrollHeadInner{width:auto!important}.dataTables_scrollHeadInner>.dataTable>thead>tr>th{border-bottom-width:0!important}.dataTables_borderWrap .dataTables_scrollBody,.dataTables_borderWrap .dataTables_scrollHead{border:1px solid #ddd!important;border-width:0 1px!important}.dataTables_borderWrap .dataTables_scrollBody .table-bordered,.dataTables_borderWrap .dataTables_scrollHead .table-bordered{border-left-width:0;border-right-width:0}.dataTables_borderWrap .dataTables_scrollBody .table-bordered>tbody>tr>td:first-child,.dataTables_borderWrap .dataTables_scrollBody .table-bordered>thead>tr>th:first-child,.dataTables_borderWrap .dataTables_scrollHead .table-bordered>tbody>tr>td:first-child,.dataTables_borderWrap .dataTables_scrollHead .table-bordered>thead>tr>th:first-child{border-left-width:0}.dataTables_borderWrap .dataTables_scrollBody .table-bordered>tbody>tr>td:last-child,.dataTables_borderWrap .dataTables_scrollBody .table-bordered>thead>tr>th:last-child,.dataTables_borderWrap .dataTables_scrollHead .table-bordered>tbody>tr>td:last-child,.dataTables_borderWrap .dataTables_scrollHead .table-bordered>thead>tr>th:last-child{border-right-width:0}table.dataTable{clear:both;max-width:none!important}table.dataTable th:active{outline:0}div.dataTables_scrollHead table{margin-bottom:0!important;border-bottom-left-radius:0;border-bottom-right-radius:0}div.dataTables_scrollHead table thead tr:last-child td:first-child,div.dataTables_scrollHead table thead tr:last-child th:first-child{border-bottom-left-radius:0!important;border-bottom-right-radius:0!important}div.dataTables_scrollBody table{margin-bottom:0!important}div.dataTables_scrollBody tbody tr:first-child td,div.dataTables_scrollBody tbody tr:first-child th{border-top:none}.tableTools-container{margin-bottom:8px;position:relative}.gritter-item-wrapper.dt-button-info{padding:12px 11px 8px;z-index:1999}.gritter-item-wrapper.dt-button-info>h2{margin-top:0}.dt-button-collection .dropdown-menu{display:block;z-index:1101}.dt-button-collection .dropdown-menu>li>a{color:#888;text-decoration:line-through}.dt-button-collection .dropdown-menu>li>a.active{color:#333;text-decoration:none}div.dt-button-background{position:fixed;top:0;left:0;height:100%;width:100%;background-color:#000;z-index:1100;opacity:.1}.dataTable>tbody>tr.selected>td{background-color:#dff0d8}.dataTable>tbody>tr.selected:hover>td{background-color:#d0e9c6}div.dataTables_processing{position:absolute;top:50%;left:50%;width:80%;height:60px;margin-left:-40%;margin-top:-25px;padding-top:20px;padding-bottom:20px;text-align:center;font-size:1.2em;background-color:#fff;border:2px solid #DDD;background-color:rgba(255,255,255,.66)}.fc-toolbar h2{font-size:22px;color:#65A0CE}.fc-unthemed .fc-popover,.fc-unthemed .fc-row,.fc-unthemed hr,.fc-unthemed tbody,.fc-unthemed td,.fc-unthemed th,.fc-unthemed thead{border-color:#BCD4E5}.fc-unthemed .fc-today{background:#FFC}.fc-event{border-width:0;color:#FFF;padding:1px 1px 2px 2px;border-radius:0}.fc-event:not([class*=label-]){background-color:#ABBAC3}.fc-event.label-yellow{color:#963}.fc-event.label-light{color:#888}.label-yellow .fc-event{color:#963}.label-light .fc-event{color:#888}[class*=label-]>.fc-event,[class*=label-]>.fc-event>.fc-event-skin.fc-event-head{background-color:inherit}.fc-event-vert>.fc-event,.fc-event.fc-event-vert{padding:0 0 1px}.fc-day-number{color:#2E6589;opacity:1;filter:alpha(opacity=100)}.fc .fc-axis,.fc-widget-header{background:#ECF2F7;color:#8090A0}.fc-event-hori,.fc-event-vert{border-radius:0!important;border-color:transparent}.fc-event-vert .fc-event-content{padding-left:1px;padding-right:1px}.fc-event-vert .fc-event-time{padding:0}.fc-state-default{border:none}.fc-state-default,.fc-state-default .fc-button-inner{border:none;background-color:#ABBAC3;color:#FFF;background-image:none;box-shadow:none;text-shadow:none;border-radius:0!important;margin-left:2px}.fc-state-disabled,.fc-state-disabled .fc-button-inner{opacity:.75;filter:alpha(opacity=75);color:#DDD}.fc-state-active,.fc-state-active .fc-button-inner{border-color:#4F99C6;background-color:#6FB3E0}.fc-state-hover,.fc-state-hover .fc-button-inner{background-color:#8B9AA3}.fc .fc-button-group>*{margin:0 1px 0 0}.external-event{margin:6px 0;padding:0;cursor:default;display:block;font-size:13px;line-height:28px;color:#FFF}.external-event:not([class*=label-]){background-color:#ABBAC3}.external-event:hover{opacity:1;filter:alpha(opacity=100)}.external-event.ui-draggable-dragging{cursor:move}.external-event.label-yellow{color:#963}.external-event.label-light{color:#888}.external-event>.ace-icon:first-child{display:inline-block;height:32px;width:32px;text-align:center;line-height:30px;margin-right:5px;font-size:15px;border-right:1px solid #FFF}@media only screen and (max-width:480px){.fc-header td{display:block;width:auto;text-align:left}}.chosen-container,.chosen-container+.help-inline,[class*=chosen-container]{vertical-align:middle}.select2-container-multi.tag-input-style .select2-choices .select2-search-choice,.select2.tag-input-style .select2-selection .select2-selection__choice,.tag-input-style+.chosen-container-multi .chosen-choices li.search-choice{font-weight:400;text-shadow:1px 1px 1px rgba(0,0,0,.15);transition:all .2s ease 0s;vertical-align:baseline;white-space:nowrap}.chosen-container>.chosen-single,[class*=chosen-container]>.chosen-single{line-height:28px;height:32px;box-shadow:none;background:#FAFAFA}.chosen-choices{box-shadow:none!important}.chosen-container-single .chosen-single abbr{background:0 0}.chosen-container-single .chosen-single abbr:after{content:"\f00d";display:inline-block;color:#888;font-family:FontAwesome;font-size:13px;position:absolute;right:0;top:-7px}.chosen-container-single .chosen-single abbr:hover:after,.chosen-container-single.chosen-disabled .chosen-single abbr:hover:after{color:#464646}.chosen-single div b{background:0 0!important}.chosen-container .chosen-results-scroll-down span,.chosen-container .chosen-results-scroll-up span,.chosen-container-multi .chosen-choices li.search-choice .search-choice-close,.chosen-rtl .chosen-search input[type=text]{background:0 0}.chosen-single div b:before{content:"\f0d7";display:inline-block;color:#888;font-family:FontAwesome;font-size:12px;position:relative;top:-1px;left:1px}.chosen-container-active.chosen-with-drop .chosen-single div b:before{content:"\f0d8"}.chosen-container-single .chosen-search{position:relative}.chosen-container-single .chosen-search input[type=text]{background:0 0;border-radius:0;line-height:28px;height:28px}.chosen-container-single .chosen-search:after{content:"\f002";display:inline-block;color:#888;font-family:FontAwesome;font-size:14px;position:absolute;top:8px;right:12px}.chosen-container-multi .chosen-choices li.search-field input[type=text]{height:25px}.chosen-container-multi .chosen-choices li.search-choice{line-height:16px;padding-bottom:4px}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:before{content:"\f00d";display:inline-block;color:#888;font-family:FontAwesome;font-size:13px;position:absolute;right:2px;top:-1px}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover{text-decoration:none}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover:before,.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close:before{color:#464646}.chosen-container .chosen-results-scroll-down span:before,.chosen-container .chosen-results-scroll-up span:before{content:"\f0d7";display:inline-block;color:#888;font-family:FontAwesome;font-size:12px;position:relative;top:-1px;left:1px}.chosen-container .chosen-results-scroll-up span:before,.chosen-container-active .chosen-single-with-drop div b:before{content:"\f0d8"}.chosen-rtl .chosen-search:after{content:"";display:none}.chosen-rtl .chosen-search:before,.select2-search:before{content:"\f002";font-family:FontAwesome}.chosen-rtl .chosen-search:before{display:inline-block;color:#888;font-size:14px;position:absolute;top:9px;left:12px}.chosen-container-single .chosen-single{border-radius:0}.chosen-container .chosen-results li.highlighted{background:#316AC5;color:#FFF}.chosen-container-single .chosen-drop{border-radius:0;border-bottom:3px solid #4492C9;border-color:#4492C9}.chosen-container-active .chosen-single,.chosen-single.chosen-single-with-drop{border-color:#4492C9}.form-group.has-error .chosen-single{border-color:#f2a696!important}.form-group.has-info .chosen-single{border-color:#72aec2!important}.form-group.has-warning .chosen-single{border-color:#e3c94c!important}.form-group.has-success .chosen-single{border-color:#9cc573!important}.chosen-container-active.chosen-with-drop .chosen-single{border-color:#4492C9}.chosen-container.chosen-with-drop .chosen-drop{left:auto;right:auto;display:block}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-resolution:144dpi){.chosen-container .chosen-results-scroll-down span,.chosen-container .chosen-results-scroll-up span,.chosen-container-multi .chosen-choices li.search-choice .search-choice-close,.chosen-container-single .chosen-search input[type=text],.chosen-container-single .chosen-single abbr,.chosen-container-single .chosen-single div b,.chosen-rtl .chosen-search input[type=text]{background-image:none!important;background-repeat:no-repeat!important;background-size:auto!important}}.tag-input-style+.chosen-container-multi .chosen-choices li.search-choice{background-image:none;background-color:#91B8D0;color:#FFF;display:inline-block;font-size:13px;margin-bottom:3px;margin-right:3px;padding:6px 22px 7px 9px;position:relative;border:none;-webkit-box-shadow:none;box-shadow:none;border-radius:0}.tag-input-style+.chosen-container-multi .chosen-choices li.search-choice .search-choice-close{position:absolute;top:0;bottom:0;right:0;width:18px;height:auto;line-height:25px;text-align:center}.tag-input-style+.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:before{color:#FFF;position:static;font-size:11px}.tag-input-style+.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover{background-color:rgba(0,0,0,.2)}.tag-input-style+.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover:before{color:#FFF}.tag-input-style+.chosen-container-multi.chosen-rtl .chosen-choices li.search-choice{padding:6px 9px 7px 22px;margin-left:0;margin-right:3px!important}.tag-input-style+.chosen-container-multi.chosen-rtl .chosen-choices li.search-choice .search-choice-close{right:auto;left:0}.select2-container--default .select2-selection{border-radius:0;line-height:24px;border-color:#AAA}.select2-container--default.select2-container--focus .select2-selection{border-color:#4492C9}.select2-container--open .select2-dropdown{border-radius:0;border-color:#4492c9;-webkit-box-shadow:0 -4px 5px rgba(0,0,0,.15);box-shadow:0 -4px 5px rgba(0,0,0,.15)}.select2-container--default .select2-selection .select2-selection__clear{position:absolute;right:-32px;font-size:16px}.select2-container .select2-selection--single{height:32px}.select2-container--default .select2-selection .select2-selection__choice__remove{font-size:15px;margin-right:3px}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#E4EEF5}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#4F99C6}.select2-search{background:0 0}.select2-search:before{font-size:12px;display:inline;color:#888;position:absolute;right:12px;top:8px}.select2-search:hover:before{color:#555}.select2-selection--multiple .select2-search:before{display:none}.form-group.has-error .select2-container--default .select2-selection{border-color:#f2a696!important}.form-group.has-info .select2-container--default .select2-selection{border-color:#72aec2!important}.form-group.has-warning .select2-container--default .select2-selection{border-color:#e3c94c!important}.form-group.has-success .select2-container--default .select2-selection{border-color:#9cc573!important}.select2.tag-input-style .select2-selection .select2-selection__choice{background-color:#91B8D0;color:#FFF;display:inline-block;font-size:13px;margin-bottom:2px;margin-right:2px;padding:6px 22px 7px 9px;position:relative;border:none;-webkit-box-shadow:none;box-shadow:none;border-radius:0}.select2-container.select2-drop-above .select2-choice,.select2-drop{border-radius:0}.select2.tag-input-style .select2-selection .select2-selection__choice .select2-selection__choice__remove{position:absolute;top:0;bottom:0;right:-2px;left:auto;width:18px;height:auto;line-height:36px;text-align:center;color:#FFF}.select2.tag-input-style .select2-selection .select2-selection__choice .select2-selection__choice__remove:hover{background-color:rgba(0,0,0,.2);color:#FFF}.select2-container .select2-choice{border-radius:0;height:32px;line-height:28px}.select2-container[class*=input-]{max-width:none}.select2-container.input-mini{min-width:100px}.select2-container .select2-choice abbr,.select2-search-choice-close{background:0 0}.select2-container .select2-choice abbr:before,.select2-search-choice-close:before{font-family:FontAwesome;font-size:12px;display:inline;content:"\f00d";color:#888;position:relative;top:-1px}.select2-container .select2-choice abbr:hover:before,.select2-search-choice-close:hover:before{color:#555}.select2-container .select2-choice abbr:before{top:-7px}.select2-search-choice-close:hover{text-decoration:none!important}.select2-result-single{margin-left:0}.select2-drop{border:1px solid #4492C9;border-width:0 1px 3px}.select2-drop.select2-drop-above{border-radius:0}.select2-container .select2-choice{background:#FAFAFA}.select2-container-active .select2-choice,.select2-container-active .select2-choices,.select2-container-multi.select2-container-active .select2-choices,.select2-dropdown-open.select2-drop-above .select2-choice,.select2-dropdown-open.select2-drop-above .select2-choices{border-color:#4492C9}.select2-results .select2-highlighted{background:#316AC5}.select2-container .select2-choice .select2-arrow{border-radius:0;background:0 0;border:none}.select2-container .select2-choice .select2-arrow b{background:0 0}.select2-container .select2-choice .select2-arrow b:before{font-family:FontAwesome;font-size:12px;display:inline;content:"\f0d7";color:#888;position:relative;left:5px}.select2-dropdown-open .select2-choice .select2-arrow b:before{content:"\f0d8"}.select2-search-field .select2-search .select2-input{background:#fff;margin-top:4px}.select2-search-field .select2-search:after{font-family:FontAwesome;font-size:14px;display:inline;content:"\f002";color:#777;position:relative;top:0;left:-20px;z-index:0}.select2-dropdown-open.select2-drop-above .select2-choice,.select2-dropdown-open.select2-drop-above .select2-choices{background-image:none;background-color:#F6F6F6}.select2-container-multi .select2-choices .select2-search-field input{border:none!important;-webkit-box-shadow:none!important;box-shadow:none!important;background:0 0!important;font-size:14px}.select2-container-multi .select2-choices .select2-search-choice{line-height:16px;padding-bottom:4px}.select2-container-active .select2-choice,.select2-container-active .select2-choices,.select2-container-multi.select2-container-active .select2-choices,.select2-dropdown-open.select2-drop-above .select2-choice,.select2-dropdown-open.select2-drop-above .select2-choices{-webkit-box-shadow:none;box-shadow:none}.select2-search-field .select2-search input.select2-active{background-color:#FFF;position:relative;z-index:1}@media only screen and (-webkit-min-device-pixel-ratio:1.5),only screen and (min-resolution:144dpi){.select2-container .select2-choice abbr,.select2-container .select2-choice div b,.select2-search-choice-close,.select2-search-field .select2-search input{background-image:none!important;background-size:auto!important}.select2-search-field .select2-search input{background-position:auto!important}}.select2-container-active.select2-dropdown-open .select2-choice{background-image:-webkit-linear-gradient(top,#EEE 0,#FFF 100%);background-image:-o-linear-gradient(top,#EEE 0,#FFF 100%);background-image:linear-gradient(to bottom,#EEE 0,#FFF 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffeeeeee', endColorstr='#ffffffff', GradientType=0)}.select2-container-active.select2-drop-above .select2-choice,.ui-jqdialog .ui-widget-header{background-image:-webkit-linear-gradient(top,#FFF 0,#EEE 100%);background-image:-o-linear-gradient(top,#FFF 0,#EEE 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffeeeeee', GradientType=0)}.select2-container-active.select2-drop-above .select2-choice{background-image:linear-gradient(to bottom,#FFF 0,#EEE 100%);background-repeat:repeat-x}.form-group.has-error .select2-choice,.form-group.has-error .select2-choices{border-color:#f2a696!important}.form-group.has-info .select2-choice,.form-group.has-info .select2-choices{border-color:#72aec2!important}.form-group.has-warning .select2-choice,.form-group.has-warning .select2-choices{border-color:#e3c94c!important}.form-group.has-success .select2-choice,.form-group.has-success .select2-choices{border-color:#9cc573!important}@media only screen and (-webkit-min-device-pixel-ratio:1.5),only screen and (min-resolution:144dpi){.select2-container .select2-choice .select2-arrow b,.select2-container .select2-choice abbr,.select2-search-choice-close,.select2-search-field .select2-search input{background-image:none!important;background-repeat:no-repeat!important;background-size:auto!important}.select2-search-field .select2-search input{background-position:auto!important}}.select2-container-multi.tag-input-style .select2-choices .select2-search-choice{background-image:none;background-color:#91B8D0;color:#FFF;display:inline-block;font-size:13px;margin-bottom:3px;margin-right:0;padding:6px 22px 7px 9px;position:relative;border:none;-webkit-box-shadow:none;box-shadow:none;border-radius:0}.gritter-light .gritter-title,.gritter-title{text-shadow:none}#cboxLoadingGraphic>.ace-icon,.ace-spinner.touch-spinner .spinbox-buttons>.btn>.ace-icon{vertical-align:middle;display:inline-block}.select2-container-multi.tag-input-style .select2-choices .select2-search-choice .select2-search-choice-close{position:absolute;top:0;bottom:0;right:0;left:auto;width:18px;height:auto;line-height:25px;text-align:center}.select2-container-multi.tag-input-style .select2-choices .select2-search-choice .select2-search-choice-close:before{color:#FFF;position:static;font-size:11px}#cboxCurrent,#cboxTitle{margin-bottom:4px;font-size:14px}.select2-container-multi.tag-input-style .select2-choices .select2-search-choice .select2-search-choice-close:hover{background-color:rgba(0,0,0,.2)}.select2-container-multi.tag-input-style .select2-choices .select2-search-choice .select2-search-choice-close:hover:before{color:#FFF}#colorbox:active,#colorbox:focus{outline:0}#cboxBottomCenter,#cboxBottomLeft,#cboxBottomRight,#cboxMiddleLeft,#cboxMiddleRight,#cboxTopCenter,#cboxTopLeft,#cboxTopRight{background:0 0!important;opacity:0}#cboxContent{border:12px solid #000;background-color:#FFF;padding:7px;overflow:visible}#cboxOverlay{background:rgba(0,0,0,.95);background:#000}#cboxCurrent{left:64px}#cboxTitle{color:#777}#cboxClose,#cboxNext,#cboxPrevious{background:0 0;text-indent:0;width:26px;height:26px;line-height:22px;padding:0 4px;text-align:center;border:2px solid #999;border-radius:16px;color:#666;font-size:12px;margin-left:5px;margin-bottom:5px}#cboxNext:hover,#cboxPrevious:hover{color:#333;border-color:#666}#cboxClose{background-color:#000;border:2px solid #FFF;border-radius:32px;color:#FFF;font-size:21px;height:28px;width:28px;padding-bottom:2px;margin-left:0;right:-14px;top:-14px}#cboxLoadingOverlay{background:0 0!important}#cboxLoadingGraphic{background:#FFF!important;text-align:center}#cboxLoadingGraphic>.ace-icon{background-color:#FFF;border-radius:8px;width:32px;height:32px;position:relative;top:48%;text-align:center;font-size:24px;color:#FE7E3E}.ace-spinner{display:inline-block}.ace-spinner .spinbox-buttons.btn-group-vertical{min-width:18px}.ace-spinner .spinbox-buttons.btn-group-vertical>.btn{font-size:10px;padding:0;width:22px;height:16px;line-height:8px;margin-left:0}.ace-spinner .spinbox-buttons.btn-group-vertical>.btn:first-child{margin-top:0}.ace-spinner .spinbox-buttons.btn-group-vertical>.btn>.ace-icon{margin:0;padding:0}.ace-spinner .spinbox-buttons.btn-group-vertical>.btn+.btn{margin-top:2px}.ace-spinner .spinbox-buttons.btn-group-vertical>.btn-xs{height:14px;line-height:7px}.ace-spinner .spinbox-buttons.btn-group-vertical>.btn-lg{height:22px;line-height:10px;width:22px}.steps>li .step,.steps>li.complete .step:before{line-height:30px;background-color:#FFF;text-align:center}.ace-spinner .spinbox-buttons>button.btn.spinbox-up:active{top:-1px}.ace-spinner:not(.touch-spinner) .spinbox-buttons>.btn>.ace-icon{margin-top:-1px}.ace-spinner.touch-spinner .spinbox-buttons{margin:0;font-size:0}.ace-spinner.touch-spinner .spinbox-buttons .btn-sm{width:32px;padding-left:6px;padding-right:6px}.ace-spinner.touch-spinner .spinbox-buttons .btn-xs{width:24px;padding-left:4px;padding-right:4px}.ace-spinner.touch-spinner .spinbox-buttons .btn-lg{width:40px;padding-left:8px;padding-right:8px}.ace-spinner.touch-spinner .spinbox-buttons>.btn{margin:0 1px!important}.ace-spinner.touch-spinner .spinbox-buttons>.btn-xs{padding-top:3px;padding-bottom:3px}.steps{list-style:none;display:table;width:100%;padding:0;margin:0;position:relative}.steps>li{display:table-cell;text-align:center;width:1%}.steps>li .step{border:5px solid #CED1D6;color:#546474;font-size:15px;border-radius:100%;position:relative;z-index:2;display:inline-block;width:40px;height:40px}.steps>li:before{display:block;content:"";width:100%;height:1px;font-size:0;overflow:hidden;border-top:4px solid #CED1D6;position:relative;top:21px;z-index:1}.steps>li.last-child:before{max-width:50%;width:50%}.steps>li:last-child:before{max-width:50%;width:50%}.steps>li:first-child:before{max-width:51%;left:50%}.steps>li.active .step,.steps>li.active:before,.steps>li.complete .step,.steps>li.complete:before{border-color:#5293C4}.steps>li.complete .step{cursor:default;color:#FFF;-webkit-transition:transform ease .1s;-o-transition:transform ease .1s;transition:transform ease .1s}.steps>li.complete .step:before{display:block;position:absolute;top:0;left:0;bottom:0;right:0;border-radius:100%;content:"\f00c";z-index:3;font-family:FontAwesome;font-size:17px;color:#87BA21}.step-content,.tree{position:relative}.steps>li.complete:hover .step{-moz-transform:scale(1.1);-webkit-transform:scale(1.1);-o-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1);border-color:#80afd4}.steps>li.complete:hover:before{border-color:#80afd4}.steps>li .title{display:block;margin-top:4px;max-width:100%;color:#949EA7;font-size:14px;z-index:104;text-align:center;table-layout:fixed;word-wrap:break-word}.steps>li.active .title,.steps>li.complete .title{color:#2B3D53}.step-content .step-pane{display:none;min-height:200px;padding:4px 8px 12px}.step-content .step-pane.active{display:block}.wizard-actions{text-align:right}@media only screen and (max-width:767px){.steps li .step,.steps li:after,.steps li:before{border-width:3px}.steps li .step{width:30px;height:30px;line-height:24px}.steps li.complete .step:before{line-height:24px;font-size:13px}.steps li:before{top:16px}.step-content .step-pane{padding:4px 4px 6px;min-height:150px}}.tree{margin:auto;padding:0 0 0 9px;overflow-x:hidden;overflow-y:auto}.tree:before{display:inline-block;content:"";position:absolute;top:-20px;bottom:16px;left:0;z-index:1;border:1px dotted #67B2DD;border-width:0 0 0 1px}.tree .tree{padding:0;overflow:visible}.tree .tree:before{display:none}.tree .tree-branch-name,.tree .tree-item-name{cursor:pointer}.tree .icon-caret{vertical-align:baseline!important}.tree .tree-branch{width:auto;min-height:20px;cursor:pointer}.tree .tree-branch .tree-branch-header{position:relative;height:20px;line-height:20px}.tree .tree-branch .tree-branch-header:hover{background-color:rgba(98,168,209,.1)}.tree .tree-branch .icon-caret~.tree-branch-header{display:inline-block;width:80%;width:calc(100% - 36px)}.tree .tree-branch.tree-selected>.tree-branch-header{background-color:rgba(98,168,209,.18)}.tree .tree-branch .tree-branch-header .tree-branch-name,.tree .tree-item .tree-item-name{display:inline;z-index:2}.tree .tree-branch .tree-branch-header>.tree-branch-name>.ace-icon:first-child,.tree .tree-item>.tree-item-name>.ace-icon:first-child{display:inline-block;position:relative;z-index:2;top:-1px}.tree .tree-branch>.tree-branch-header>.tree-branch-name>.tree-label{margin-left:2px}.tree .tree-branch>.tree-branch-header>.tree-branch-name>.ace-icon:first-child{margin:-2px 0 0 -2px}.tree .tree-branch:last-child:after{display:inline-block;content:"";position:absolute;z-index:1;top:15px;bottom:0;left:-10px;border-left:2px solid #FFF}.tree .tree-branch .tree-branch-children,.tree .tree-branch .tree-branch-children.tree{margin:0 0 0 23px;padding:0;position:relative}.tree .tree-branch .tree-branch-children.tree:before,.tree .tree-branch .tree-branch-children:before{display:inline-block;content:"";position:absolute;z-index:1;top:-14px;bottom:16px;left:-14px;border:1px dotted #67B2DD;border-width:0 0 0 1px}.tree .tree-branch.tree-selected>.icon-caret~.tree-branch-header>.tree-branch-name>.tree-label{font-weight:700}.tree .tree-item{height:20px;line-height:20px;cursor:pointer;max-width:calc(100% - 20px)}.tree .tree-item:hover{background-color:rgba(98,168,209,.1)}.tree .tree-item.tree-selected,.tree .tree-item.tree-selected:hover{background-color:rgba(98,168,209,.16)}.tree .tree-item>.tree-item-name>.ace-icon:first-child{margin-right:3px}.tree .tree-item>.tree-item-name>.tree-label>.ace-icon:first-child{margin-left:3px;margin-right:3px}.tree .tree-item>.ace-icon:first-child{margin-top:-1px}.tree .tree-branch,.tree .tree-item{position:relative;list-style:none;border-left:1px solid #FFF;margin:1px 0}.tree .tree-branch:before,.tree .tree-item:before{display:inline-block;content:"";position:absolute;top:14px;left:-13px;width:18px;height:0;border-top:1px dotted #67B2DD;z-index:1}.tree .tree-selected{color:#6398B0}.tree .tree-branch .tree-branch-header{border-radius:0}.tree .tree-branch .tree-branch-header,.tree .tree-item{padding:5px;color:#4D6878;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.tree .tree-item>.tree-item-name>.ace-icon:first-child{color:#F9E8CE;width:13px;height:13px;line-height:13px;font-size:11px;text-align:center;border-radius:3px;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;background-color:#FAFAFA;border:1px solid #CCC;box-shadow:0 1px 2px rgba(0,0,0,.05)}.tree .tree-selected>.tree-item-name>.ace-icon:first-child{background-color:#F9A021;border-color:#F9A021;color:#FFF}.tree .tree-minus.ace-icon:first-child,.tree .tree-plus.ace-icon:first-child{display:inline-block;font-style:normal;vertical-align:middle;height:11px;width:11px;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;text-align:center;border:1px solid #8BAEBF;line-height:10px;background-color:#FFF;position:relative;z-index:2}.tree .tree-minus.ace-icon:first-child:before,.tree .tree-plus.ace-icon:first-child:before{content:"";display:block;width:7px;height:0;border-top:1px solid #4D6878;position:absolute;top:5px;left:2px}.tree .tree-plus.ace-icon:first-child:after{content:"";display:block;height:7px;width:0;border-left:1px solid #4D6878;position:absolute;top:2px;left:5px}.tree .tree-unselectable .tree-item>.tree-item-name>.tree-label>.ace-icon:first-child{color:#5084A0;width:13px;height:13px;line-height:13px;font-size:10px;text-align:center;border-radius:0;background-color:transparent;border:none;box-shadow:none}.tree .ace-icon[class*="-down"]{transform:rotate(-45deg)}.tree .ace-icon[class*="-download"]{transform:none}.tree .fa-spin{height:auto}.tree .tree-loading{margin-left:36px}.tree img{display:inline;veritcal-align:middle}.tree .icon-open{width:16px;position:relative;z-index:2;padding-left:2px}.tree .tree-branch .tree-leaf-head.ace-icon,.tree .tree-leaf .tree-branch-head.ace-icon{display:none}.tree .tree-branch.tree-leaf .tree-leaf-head{display:inline-block;position:relative;z-index:2;color:#DDD;background-color:#FFF}.tree .tree-selected.tree-branch.tree-leaf .tree-leaf-head{color:#FEB902}.tree-container{background-color:#FFF;border:1px solid #DDD;border-left-color:#67B2DD;display:block;padding:0;max-width:200px;max-height:250px}.tree-container .tree::before{margin-left:-1px}.gritter-item-wrapper{background-image:none!important;box-shadow:0 2px 10px rgba(50,50,50,.5);background:rgba(50,50,50,.92)}.gritter-item-wrapper.gritter-info{background:rgba(49,81,133,.92)}.gritter-item-wrapper.gritter-error{background:rgba(153,40,18,.92)}.gritter-item-wrapper.gritter-success{background:rgba(89,131,75,.92)}.gritter-item-wrapper.gritter-warning{background:rgba(190,112,31,.92)}.gritter-item-wrapper.gritter-light{background:rgba(245,245,245,.95);border:1px solid #BBB}.gritter-item-wrapper.gritter-light.gritter-info{background:rgba(232,242,255,.95)}.gritter-item-wrapper.gritter-light.gritter-info .gritter-item{color:#4A577D}.gritter-item-wrapper.gritter-light.gritter-error{background:rgba(255,235,235,.95)}.gritter-item-wrapper.gritter-light.gritter-error .gritter-item{color:#894A38}.gritter-item-wrapper.gritter-light.gritter-success{background:rgba(239,250,227,.95)}.gritter-item-wrapper.gritter-light.gritter-success .gritter-item{color:#416131}.gritter-item-wrapper.gritter-light.gritter-warning{background:rgba(252,248,227,.95)}.gritter-bottom,.gritter-close,.gritter-item,.gritter-top{background-image:none}.gritter-item-wrapper.gritter-light.gritter-warning .gritter-item{color:#946446}.gritter-item p{line-height:1.8}.gritter-close{left:auto;right:4px;width:18px;height:18px;line-height:17px;text-align:center;border:2px solid transparent;border-radius:16px;color:#E17B67;font-size:0;text-indent:0}.gritter-close:before{font-family:FontAwesome;font-size:16px;content:"\f00d"}.gritter-info .gritter-close{color:orange}.gritter-error .gritter-close,.gritter-success .gritter-close,.gritter-warning .gritter-close{color:#FFEA07}.gritter-close:hover{color:#FFF!important;text-decoration:none}.gritter-light .gritter-bottom,.gritter-light .gritter-close,.gritter-light .gritter-item,.gritter-light .gritter-top{background-image:none;color:#444}.gritter-light .gritter-close:hover{color:#8A3104!important}.gritter-center{position:fixed;left:33%;right:33%;top:33%}.wysiwyg-style1 .btn-group,.wysiwyg-style2 .btn-group,.wysiwyg-toolbar{position:relative}@media only screen and (max-width:767px){.gritter-center{left:16%;right:16%;top:30%}}@media only screen and (max-width:480px){.gritter-center{left:30px;right:30px}}@media only screen and (max-width:320px){.gritter-center{left:10px;right:10px}}.wysiwyg-editor{max-height:250px;height:250px;background-color:#F7F8FA;border-collapse:separate;border:1px solid #BBC0CA;padding:4px;box-sizing:content-box;overflow-y:scroll;overflow-x:hidden;outline:0}.wysiwyg-editor:focus{background-color:#FFF}.wysiwyg-toolbar{line-height:33px;margin:0!important}.wysiwyg-toolbar .dropdown-menu{text-align:left}.wysiwyg-toolbar .btn-group{float:none!important;font-size:0}.wysiwyg-toolbar .btn-group>.btn{float:none;padding-left:0;padding-right:0;text-align:center;margin-left:1px}.wysiwyg-toolbar .btn-group>.btn>.ace-icon:first-child{font-size:14px;width:25px;max-width:25px;display:inline-block;border-width:1px!important}.wysiwyg-toolbar .btn-group>.btn.dropdown-toggle>.ace-icon:last-child{margin-right:4px}.wysiwyg-style1 .btn-group>.btn,.wysiwyg-style1 .btn-group>.inline>.btn,.wysiwyg-style2 .btn-group>.btn,.wysiwyg-style2 .btn-group>.inline>.btn{margin:0!important;background:#FFF!important;border-width:0!important;color:#ADB3BE!important;text-shadow:none!important}.wysiwyg-style1 .btn-group>.btn:hover,.wysiwyg-style1 .btn-group>.inline>.btn:hover,.wysiwyg-style2 .btn-group>.btn:hover,.wysiwyg-style2 .btn-group>.inline>.btn:hover{background:#FFF!important}.wysiwyg-style1 .btn-group>.btn.active,.wysiwyg-style1 .btn-group>.inline>.btn.active,.wysiwyg-style2 .btn-group>.btn.active,.wysiwyg-style2 .btn-group>.inline>.btn.active{color:#5B80CE!important}.wysiwyg-style1 .btn-group>.btn.active:after,.wysiwyg-style1 .btn-group>.inline>.btn.active:after,.wysiwyg-style2 .btn-group>.btn.active:after,.wysiwyg-style2 .btn-group>.inline>.btn.active:after{display:none}.wysiwyg-style1 .btn-group:after,.wysiwyg-style2 .btn-group:after{display:block;content:"";position:absolute;left:-2px;top:6px;bottom:6px;width:0;max-width:0;border-left:1px solid #E1E6EA}.wysiwyg-style1 .btn-group:first-child:after,.wysiwyg-style2 .btn-group:after,.wysiwyg-style2 .btn-group:first-child:after{display:none}.wysiwyg-style2{background-color:#E5E5E5}.wysiwyg-style2+.wysiwyg-editor{border-color:#DDD;background-color:#FFF;border-top:none}.wysiwyg-style2 .btn-group>.btn,.wysiwyg-style2 .btn-group>.inline>.btn{margin:0 1px 0 0!important;background:#FFF!important;border:none!important;color:#8D939E!important;text-shadow:none!important}.wysiwyg-style2 .btn-group>.btn.active,.wysiwyg-style2 .btn-group>.inline>.btn.active{color:#FFF!important;background:#6AAEDF!important}.wysiwyg-toolbar .btn-colorpicker{width:24px;height:24px;position:relative;background:#87B87F;background:-moz-linear-gradient(top,#CF3E73 10%,#FFF 20%,#2283C5 30%,#FFF 40%,#87B87F 50%,#FFF 60%,#FFB752 70%,#FFF 80%,#D15B47 90%,#FFF 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(10%,#CF3E73),color-stop(20%,#FFF),color-stop(30%,#2283C5),color-stop(40%,#FFF),color-stop(50%,#87B87F),color-stop(60%,#FFF),color-stop(70%,#FFB752),color-stop(80%,#FFF),color-stop(90%,#D15B47),color-stop(100%,#FFF));background:-webkit-linear-gradient(top,#CF3E73 10%,#FFF 20%,#2283C5 30%,#FFF 40%,#87B87F 50%,#FFF 60%,#FFB752 70%,#FFF 80%,#D15B47 90%,#FFF 100%);background:-o-linear-gradient(top,#CF3E73 10%,#FFF 20%,#2283C5 30%,#FFF 40%,#87B87F 50%,#FFF 60%,#FFB752 70%,#FFF 80%,#D15B47 90%,#FFF 100%);background:-ms-linear-gradient(top,#CF3E73 10%,#FFF 20%,#2283C5 30%,#FFF 40%,#87B87F 50%,#FFF 60%,#FFB752 70%,#FFF 80%,#D15B47 90%,#FFF 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#CF3E73', endColorstr='#FFB752', GradientType=0);background:linear-gradient(top,#CF3E73 10%,#FFF 20%,#2283C5 30%,#FFF 40%,#87B87F 50%,#FFF 60%,#FFB752 70%,#FFF 80%,#D15B47 90%,#FFF 100%)}.wysiwyg-toolbar .dropdown-colorpicker>.dropdown-menu{top:auto}.wysiwyg-toolbar input[type=file]{position:fixed;z-index:-10;opacity:0;max-width:0;max-height:0;display:block}.wysiwyg-toolbar .wysiwyg-choose-file{display:inline-block;width:auto;margin:4px auto 0;padding-left:5px;padding-right:5px}.wysiwyg-toolbar .dropdown-menu input[type=text]{margin-left:8px;margin-bottom:0}.wysiwyg-toolbar .dropdown-menu input[type=text].form-control{min-width:150px}.wysiwyg-toolbar .dropdown-menu .btn{margin-right:8px;margin-left:8px}.wysiwyg-style1 .btn-colorpicker{width:20px;height:20px;margin-left:4px}@media screen and (-webkit-min-device-pixel-ratio:0){.wysiwyg-editor img{display:inline!important}.wysiwyg-editor .ui-wrapper{border:1px dotted #D00;overflow:visible!important;display:inline-block!important;vertical-align:middle}.wysiwyg-editor .ui-wrapper:after{content:"";display:block;position:absolute;right:-3px;bottom:-3px;width:7px;height:7px;border:1px solid #D00;background-color:#FFF;z-index:1}}.widget-header .wysiwyg-toolbar{background-color:transparent}.widget-header .wysiwyg-toolbar .btn-group>.btn,.widget-header .wysiwyg-toolbar .btn-group>.inline>.btn{border-color:transparent;background:rgba(255,255,255,.25)!important;color:#FFF!important;min-width:32px;border-width:1px!important;border-radius:4px!important;padding:2px 1px 4px}.widget-header .wysiwyg-toolbar .btn-group>.btn.active,.widget-header .wysiwyg-toolbar .btn-group>.inline>.btn.active{background:rgba(0,0,0,.25)!important}.widget-body .wysiwyg-editor{border-width:0}.wysiwyg-speech-input{width:20px!important;color:transparent!important;background:0 0!important;border-width:0!important;-moz-transform:scale(2,2);-webkit-transform:scale(2,2);-o-transform:scale(2,2);-ms-transform:scale(2,2);transform:scale(2,2);-webkit-box-shadow:none!important;box-shadow:none!important;position:absolute;right:0;top:-10px;cursor:pointer}.wysiwyg-speech-input:focus{-webkit-box-shadow:none!important;box-shadow:none!important}.md-editor{display:block;border:1px solid #ddd}.md-editor .md-footer,.md-editor>.md-header{display:block;padding:6px 4px;background:#f5f5f5}.md-editor>.md-header{margin:0}.md-editor>.md-preview{border-top:1px dashed #ddd;border-bottom:1px dashed #ddd;min-height:10px;overflow:auto}.md-editor>textarea{font-family:Menlo,Monaco,Consolas,"Courier New",monospace;font-size:14px;outline:0;outline:dotted thin\9;margin:0;display:block;padding:0;width:100%;border:0;border-top:1px dashed #ddd;border-bottom:1px dashed #ddd;border-radius:0;box-shadow:none;background:#f7f8fa}.md-editor>textarea:focus{box-shadow:none;background:#fff}.md-editor.active{border-color:#F59942;outline:0}.md-editor .md-controls{float:right;padding:3px}.md-editor .md-controls .md-control{right:5px;color:#bebebe;padding:3px 3px 3px 10px}.md-editor .md-controls .md-control:hover{color:#333}.md-editor.md-fullscreen-mode{width:100%;height:100%;position:fixed;top:0;left:0;z-index:99999;padding:60px 30px 15px;background:#fff!important;border:0!important}.md-editor.md-fullscreen-mode .md-footer{display:none}.md-editor.md-fullscreen-mode .md-input,.md-editor.md-fullscreen-mode .md-preview{margin:0 auto!important;height:100%!important;font-size:20px!important;padding:20px!important;color:#999;line-height:1.6em!important;resize:none!important;box-shadow:none!important;background:#fff!important;border:0!important}.md-editor.md-fullscreen-mode .md-preview{color:#333;overflow:auto}.md-editor.md-fullscreen-mode .md-input:focus,.md-editor.md-fullscreen-mode .md-input:hover{color:#333;background:#fff!important}.md-editor.md-fullscreen-mode .md-header{background:0 0;text-align:center;position:fixed;width:100%;top:20px}.md-editor.md-fullscreen-mode .btn-group{float:none}.md-editor.md-fullscreen-mode .btn{border:0;background:0 0;color:#b3b3b3}.md-editor.md-fullscreen-mode .btn.active,.md-editor.md-fullscreen-mode .btn:active,.md-editor.md-fullscreen-mode .btn:focus,.md-editor.md-fullscreen-mode .btn:hover{box-shadow:none;color:#333}.md-editor.md-fullscreen-mode .md-fullscreen-controls{position:absolute;top:20px;right:20px;text-align:right;z-index:1002;display:block}.md-editor.md-fullscreen-mode .md-fullscreen-controls a{color:#b3b3b3;clear:right;margin:10px;width:30px;height:30px;text-align:center}.md-editor.md-fullscreen-mode .md-fullscreen-controls a:hover{color:#333;text-decoration:none}.md-editor.md-fullscreen-mode .md-editor{height:100%!important;position:relative}.md-editor .md-fullscreen-controls{display:none}.md-nooverflow{overflow:hidden;position:fixed;width:100%}.editable-container .popover-title{color:#438EB9}.editable-click{border-bottom:1px dashed #BBB;cursor:pointer;font-weight:400}img.editable-click{border:1px dotted #BBB}.editable-click:hover{border-color:#08C;color:#08C}img.editable-click:hover{opacity:.75;filter:alpha(opacity=75)}.editable-buttons,.editable-input{display:inline-block}.editable-buttons{margin-left:1px}.editable-buttons .btn{padding:0;width:28px;line-height:24px;border-width:3px;font-size:12px;margin:0 1px 0 0}.editable-buttons .btn>.ace-icon{margin:0}.editable-clear-x{cursor:pointer;color:#888;background:0 0}.editable-clear-x:hover{color:#D15B47}.editable-clear-x:before{display:inline-block;content:"\f057";font-family:FontAwesome;font-size:15px;position:absolute;margin-top:-9px;width:16px;height:30px;line-height:30px;text-align:center}.editable-input .ace-spinner{margin-right:8px}.editable-input .ace-spinner .spinner-input{width:100%}.editable-inline .editable-slider{margin-top:10px;margin-right:4px}.editable-popup .editable-slider{display:block;margin-bottom:16px;margin-top:4px}.editable-slider input[type=text]{display:none}.editable-slider input[type=range]{outline:0!important}.editable-input .ace-file-input{display:block}.editable-image .ace-file-multiple .ace-file-container.selected{border-color:transparent}.editable-image+.editable-buttons,.editable-wysiwyg+.editable-buttons{display:block;text-align:center;margin-top:8px}.editable-wysiwyg{width:95%}.editable-wysiwyg .wysiwyg-editor{height:auto;overflow-y:hidden;min-height:32px}.editableform .input-append.dropdown-menu{display:none}.editableform .control-group,.editableform .open .input-append.dropdown-menu{display:block}.editable-container .editableform{margin-bottom:10px}.editable-inline .editableform{margin-bottom:0}.editableform-loading{background:0 0}.editableform-loading .ace-icon,.editableform-loading .progress{position:relative;top:35%}.input-group.date .input-group-addon{cursor:pointer}.datepicker td,.datepicker th,.daterangepicker td,.daterangepicker th{border-radius:0!important;font-size:13px}.datepicker td.active,.datepicker td.active:hover,.daterangepicker td.active,.daterangepicker td.active:hover{background:#2283C5!important}.datepicker td.active.disabled,.datepicker td.active.disabled:hover,.daterangepicker td.active.disabled,.daterangepicker td.active.disabled:hover{background:#8B9AA3!important}.datepicker td,.datepicker th{min-width:32px}.daterangepicker .calendar-date{border-radius:0}.datepicker-months .month,.datepicker-years .year{border-radius:0!important}.bootstrap-datetimepicker-widget table td span,.bootstrap-timepicker-widget table td a:hover{border-radius:0}.datepicker-months .month.active,.datepicker-months .month.active:active,.datepicker-months .month.active:focus,.datepicker-months .month.active:hover,.datepicker-years .year.active,.datepicker-years .year.active:active,.datepicker-years .year.active:focus,.datepicker-years .year.active:hover{background-image:none!important;background-color:#2283C5!important}.bootstrap-timepicker-widget table td input{width:32px}.well .datepicker table tr td.day:hover{background-color:#7D8893;color:#FFF}.bootstrap-datetimepicker-widget [class=btn]{border-width:0!important;background-color:transparent!important;color:#7399b8!important;text-shadow:none!important}.bootstrap-datetimepicker-widget [class=btn]:hover{color:#1B6AAA!important}.bootstrap-datetimepicker-widget .btn.btn-primary{border-width:3px!important}.bootstrap-datetimepicker-widget .picker-switch{margin-bottom:2px}.bootstrap-datetimepicker-widget .picker-switch a{width:90%!important;background-color:#EEE!important;color:#478FCA!important;font-size:16px}.bootstrap-datetimepicker-widget .picker-switch a:hover{background-color:#e3edf5!important}.bootstrap-datetimepicker-widget .picker-switch a span{background:0 0!important;width:90%}.bootstrap-datetimepicker-widget .timepicker-hour,.bootstrap-datetimepicker-widget .timepicker-minute,.bootstrap-datetimepicker-widget .timepicker-second{color:#555!important}.ui-slider{background-color:#D5D5D5}.ui-slider-horizontal{height:9px}.ui-slider-vertical{width:9px}.ui-slider .ui-slider-handle{border-radius:0;width:1.45em;height:1.45em;background-color:#F8F8F8;border:1px solid}.ui-slider .ui-slider-handle:after,.ui-slider .ui-slider-handle:before{display:block;content:"";position:absolute;top:4px;left:5px;width:4px;height:8px;border:1px solid;border-width:0 1px;border-color:inherit}.ui-slider .ui-slider-handle:after{left:8px;border-width:0 1px 0 0}.ui-slider .ui-slider-handle:hover{background-color:#FFF}.ui-slider .ui-slider-handle:active,.ui-slider .ui-slider-handle:focus,.ui-slider .ui-slider-handle:hover{outline:0;-webkit-box-shadow:1px 1px 1px 0 rgba(0,0,0,.3);box-shadow:1px 1px 1px 0 rgba(0,0,0,.3)}.onpage-help-modal-buttons button:focus,.ui-slider-handle{outline:0!important}.ui-slider-horizontal .ui-slider-handle{margin-left:-.725em;top:-.4em}.ui-slider-vertical .ui-slider-handle{left:-.35em;margin-bottom:-.65em}.ui-slider-small.ui-slider-horizontal{height:5px}.ui-slider-small.ui-slider-vertical{width:5px}.ui-slider-small .ui-slider-handle{border-radius:100%;width:17px;height:17px;margin-bottom:-.45em;left:-.35em}.ui-slider-small .ui-slider-handle:after,.ui-slider-small .ui-slider-handle:before{height:7px;left:5px;width:3px}.ui-slider-small .ui-slider-handle:after{left:7px}.ui-slider-simple .ui-slider-handle:after,.ui-slider-simple .ui-slider-handle:before{display:none}.ui-slider-range{background-color:#4AA4CE}.ui-slider-handle{border-color:#4AA4CE!important}.ui-state-disabled.ui-slider{background-color:#E5E5E5}.ui-state-disabled .ui-slider-range{background-color:#8daebe}.ui-state-disabled .ui-slider-handle{-webkit-box-shadow:none!important;box-shadow:none!important;border-color:#8daebe!important}.ui-slider-green .ui-slider-range{background-color:#8BBC67}.ui-slider-green .ui-slider-handle{border-color:#8BBC67!important}.ui-slider-green.ui-state-disabled .ui-slider-range{background-color:#aab0a6}.ui-slider-green.ui-state-disabled .ui-slider-handle{border-color:#aab0a6!important}.ui-slider-red .ui-slider-range{background-color:#D36E6E}.ui-slider-red .ui-slider-handle{border-color:#D36E6E!important}.ui-slider-red.ui-state-disabled .ui-slider-range{background-color:#c8acac}.ui-slider-red.ui-state-disabled .ui-slider-handle{border-color:#c8acac!important}.ui-slider-purple .ui-slider-range{background-color:#AC68BA}.ui-slider-purple .ui-slider-handle{border-color:#AC68BA!important}.ui-slider-purple.ui-state-disabled .ui-slider-range{background-color:#ada7ae}.ui-slider-purple.ui-state-disabled .ui-slider-handle{border-color:#ada7ae!important}.ui-slider-orange .ui-slider-range{background-color:#EFAD62}.ui-slider-orange .ui-slider-handle{border-color:#EFAD62!important}.ui-slider-orange.ui-state-disabled .ui-slider-range{background-color:#e0c4a4}.ui-slider-orange.ui-state-disabled .ui-slider-handle{border-color:#e0c4a4!important}.ui-slider-dark .ui-slider-range{background-color:#606060}.ui-slider-dark .ui-slider-handle{border-color:#606060!important}.ui-slider-dark.ui-state-disabled .ui-slider-range{background-color:#7a7a7a}.ui-slider-dark.ui-state-disabled .ui-slider-handle{border-color:#7a7a7a!important}.ui-slider-pink .ui-slider-range{background-color:#D6487E}.ui-slider-pink .ui-slider-handle{border-color:#D6487E!important}.ui-slider-pink.ui-state-disabled .ui-slider-range{background-color:#c38ea2}.ui-slider-pink.ui-state-disabled .ui-slider-handle{border-color:#c38ea2!important}.ui-datepicker{background-color:#FFF;border:1px solid rgba(0,0,0,.2);box-shadow:0 2px 4px rgba(0,0,0,.2)}.ui-dialog,.ui-jqdialog,.ui-menu{-webkit-box-shadow:0 2px 4px rgba(0,0,0,.2)}.ui-datepicker .ui-datepicker-next,.ui-datepicker .ui-datepicker-prev{height:26px;min-width:32px;max-width:32px;text-align:center;cursor:pointer;color:transparent;line-height:26px;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.ui-datepicker .ui-datepicker-next .ui-icon,.ui-datepicker .ui-datepicker-prev .ui-icon{color:transparent;visibility:hidden}.ui-datepicker .ui-datepicker-next:hover,.ui-datepicker .ui-datepicker-prev:hover{background-color:#EEE;text-decoration:none}.ui-datepicker .ui-datepicker-next:before,.ui-datepicker .ui-datepicker-prev:before{display:inline;font-family:FontAwesome;font-size:14px;content:"\f060";color:#393939}.ui-datepicker .ui-datepicker-next-hover,.ui-datepicker .ui-datepicker-prev-hover{top:2px}.ui-datepicker .ui-datepicker-next:before{content:"\f061"}.ui-datepicker .ui-datepicker-prev-hover{left:2px}.ui-datepicker .ui-datepicker-next-hover{right:2px}.ui-datepicker td{padding:0}.ui-datepicker td>a,.ui-datepicker td>span{display:inline-block;height:22px;min-width:24px;max-width:24px;text-align:center;color:#393939;font-size:13px;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.ui-datepicker td>a:hover{background-color:#EEE}.ui-datepicker td>a.ui-state-highlight{background-color:#D5E5EF}.ui-datepicker td>a.ui-state-active{background-color:#2283C5;color:#FFF}.ui-datepicker td>a.ui-priority-secondary{color:#888}.ui-datepicker td>span{color:#999}.ui-datepicker td .ui-datepicker-title select{height:24px;line-height:24px;padding:2px 3px}.ui-datepicker td .ui-datepicker-buttonpane{background-color:#DDD;height:1px}.ui-widget-overlay{background:rgba(0,0,0,.25);opacity:1!important;filter:alpha(opacity=100)!important;z-index:1049!important}.ui-dialog,.ui-jqdialog{z-index:1050!important;background-color:#FFF;padding:0;border:1px solid #DDD;box-shadow:0 2px 4px rgba(0,0,0,.2)}.ui-dialog .ui-dialog-titlebar,.ui-dialog .ui-jqdialog-titlebar,.ui-jqdialog .ui-dialog-titlebar,.ui-jqdialog .ui-jqdialog-titlebar{background-color:#F1F1F1;font-size:16px;color:#669FC7;padding:0}.ui-dialog .ui-dialog-title,.ui-dialog .ui-jqdialog-title,.ui-jqdialog .ui-dialog-title,.ui-jqdialog .ui-jqdialog-title{float:none!important;width:auto}.ui-dialog .widget-header,.ui-jqdialog .widget-header{margin:0;border-width:0 0 1px}.ui-dialog .ui-dialog-buttonpane,.ui-dialog .ui-jqdialog-buttonpane,.ui-jqdialog .ui-dialog-buttonpane,.ui-jqdialog .ui-jqdialog-buttonpane{background-color:#EFF3F8;border-top:1px solid #E4E9EE}.ui-dialog .ui-dialog-buttonpane button,.ui-dialog .ui-jqdialog-buttonpane button,.ui-jqdialog .ui-dialog-buttonpane button,.ui-jqdialog .ui-jqdialog-buttonpane button{font-size:14px}.ui-dialog .ui-dialog-titlebar-close,.ui-dialog .ui-jqdialog-titlebar-close,.ui-jqdialog .ui-dialog-titlebar-close,.ui-jqdialog .ui-jqdialog-titlebar-close{border:none;background:0 0;opacity:.4;color:#D15B47;padding:0;top:50%;right:8px!important;text-align:center}.ui-dialog .ui-dialog-titlebar-close:before,.ui-dialog .ui-jqdialog-titlebar-close:before,.ui-jqdialog .ui-dialog-titlebar-close:before,.ui-jqdialog .ui-jqdialog-titlebar-close:before{content:"\f00d";display:inline;font-family:FontAwesome;font-size:16px}.ui-dialog .ui-dialog-titlebar-close:hover,.ui-dialog .ui-jqdialog-titlebar-close:hover,.ui-jqdialog .ui-dialog-titlebar-close:hover,.ui-jqdialog .ui-jqdialog-titlebar-close:hover{opacity:1;text-decoration:none;padding:0}.ui-dialog .ui-dialog-titlebar-close .ui-button-text,.ui-dialog .ui-jqdialog-titlebar-close .ui-button-text,.ui-jqdialog .ui-dialog-titlebar-close .ui-button-text,.ui-jqdialog .ui-jqdialog-titlebar-close .ui-button-text{text-indent:0;visibility:hidden}.ui-dialog .widget-header .ui-dialog-titlebar-close,.ui-dialog .widget-header .ui-jqdialog-titlebar-close,.ui-jqdialog .widget-header .ui-dialog-titlebar-close,.ui-jqdialog .widget-header .ui-jqdialog-titlebar-close{right:10px!important}.ui-accordion .ui-accordion-header{color:#478FCA;font-weight:400;background-color:#F9F9F9;border:1px solid #CDD8E3;padding:8px 8px 9px 24px}.ui-accordion .ui-accordion-header:hover{color:#6EA6CC;background-color:#F1F8FD}.ui-accordion .ui-accordion-header.ui-state-active{color:#4C8FBD;background-color:#EEF4F9;position:relative;font-weight:700}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{text-indent:0;margin-top:0;position:absolute;left:10px;top:7px}.ui-accordion .ui-accordion-header .ui-accordion-header-icon:before{display:inline;font-family:FontAwesome;font-size:15px;content:"\f0da"}.ui-accordion .ui-accordion-header.ui-state-active .ui-accordion-header-icon:before{content:"\f0d7";font-weight:400}.ui-accordion .ui-accordion-content{border:1px solid #CDD8E3;border-top-width:0;padding:11px 16px}.ui-tabs .ui-tabs-nav{padding:0;border-bottom:1px solid #C5D0DC}.ui-tabs .ui-tabs-nav li.ui-state-default>a{background-color:#F9F9F9;border:1px solid #C5D0DC;border-bottom-width:0;color:#999;line-height:16px;margin-right:-1px;z-index:11;padding:8px 12px;position:relative;top:2px}.ui-tabs .ui-tabs-nav li>a:focus{outline:0}.ui-tabs .ui-tabs-nav li.ui-tabs-active>a{background-color:#FFF;border:1px solid;border-color:#4C8FBD #C5D0DC transparent;border-top-width:2px;-webkit-box-shadow:0 -2px 3px 0 rgba(0,0,0,.15);box-shadow:0 -2px 3px 0 rgba(0,0,0,.15);color:#576373;position:relative;top:1px}.ui-tabs .ui-tabs-panel{border:1px solid #C5D0DC;border-top-width:0;margin:0;left:auto;right:auto;top:auto;bottom:auto}.ui-autocomplete,.ui-menu{border:1px solid rgba(0,0,0,.2)}.ui-menu{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;width:150px;box-shadow:0 2px 4px rgba(0,0,0,.2);background-color:#FFF;padding:3px}.ui-spinner-button,.ui-spinner-button>.ace-icon{width:18px;display:inline-block}.tt-menu,.ui-autocomplete{-webkit-box-shadow:0 2px 4px rgba(0,0,0,.2)}.ui-menu .ui-menu-item{padding:5px 10px 6px;color:#444;cursor:pointer;display:block;-webkit-box-sizing:inherit;-moz-box-sizing:inherit;box-sizing:inherit}.ui-menu .ui-menu-item .ui-menu-icon{float:right;position:relative;left:auto;right:4px;bottom:auto;text-indent:0}.ui-menu .ui-menu-item .ui-menu-icon:before{content:"\f105";font-family:FontAwesome;font-size:14px;display:inline}.ui-grid-ico-sort:before,.ui-selectmenu-button .ui-icon:before{content:"\f0d7";font-family:FontAwesome}.ui-menu .ui-menu-item:hover,.ui-menu .ui-menu-item:hover>.ui-menu-icon,.ui-menu .ui-state-active,.ui-menu .ui-state-active>.ui-menu-icon,.ui-menu .ui-state-focus,.ui-menu .ui-state-focus>.ui-menu-icon{text-decoration:none;background-color:#4F99C6;color:#FFF;margin:auto;font-weight:400}.ui-menu .ui-state-disabled,.ui-menu .ui-state-disabled .ui-menu-icon{color:#999;cursor:default}.ui-menu .ui-state-disabled.ui-state-active,.ui-menu .ui-state-disabled.ui-state-active .ui-menu-icon,.ui-menu .ui-state-disabled.ui-state-focus,.ui-menu .ui-state-disabled.ui-state-focus .ui-menu-icon,.ui-menu .ui-state-disabled:hover,.ui-menu .ui-state-disabled:hover .ui-menu-icon{background-color:#FFF;color:#999}.ui-autocomplete{background-color:#FFF;box-shadow:0 2px 4px rgba(0,0,0,.2)}.ui-autocomplete-category{padding:6px;position:relative;background-color:#EEF4F9;color:#478FCA;font-weight:bolder;border:1px solid #DAE6ED;border-width:1px 0}.ui-spinner-button{border-width:0!important;font-size:10px;height:16px;line-height:16px;color:#FFF!important;text-shadow:0 -1px 0 rgba(0,0,0,.25)!important;position:absolute;text-align:center;padding:0}.ui-spinner-up{top:0;right:5px}.ui-spinner-down{bottom:3px;right:5px}.ui-spinner-input{margin-top:0;padding:5px;max-width:100px;font-size:14px}.ui-tooltip{background-color:#444;color:#FFF}.ui-progressbar{background-color:#f5f5f5;height:22px}.ui-progressbar .ui-progressbar-value{margin:0}.ui-progressbar .ui-progressbar-value[class=progress-bar]{background-color:#2A91D8}.ui-selectmenu-button{border:1px solid #aaa}.ui-selectmenu-button[aria-expanded=true]{border-color:#4492C9}.ui-selectmenu-button span.ui-icon{text-indent:0;margin-top:-10px}.ui-selectmenu-button .ui-icon:before{display:inline-block;color:#888;font-size:14px}.ui-jqgrid .ui-jqgrid-view{z-index:auto}.ui-jqgrid .ui-jqgrid-view,.ui-jqgrid .ui-paging-info,.ui-jqgrid .ui-pg-selbox,.ui-jqgrid .ui-pg-table{font-size:13px}.ui-jqgrid .ui-jqgrid-title{float:left;margin:8px}.ui-jqgrid .ui-jqgrid-title-rtl{float:right;margin:8px}.ui-jqgrid-view>.ui-jqgrid-titlebar{height:40px;line-height:24px;color:#FFF;background:#307ECC;padding:0;font-size:15px}.ui-jqgrid tr.jqgrow.ui-row-rtl td:last-child{border-right:none;border-left:1px solid #E1E1E1}.ui-jqgrid .ui-jqgrid-hdiv{background-color:#EFF3F8;border:1px solid #D3D3D3;border-width:1px 0 0 1px;line-height:15px;font-weight:700;color:#777;text-shadow:none}.ui-jqgrid .ui-jqgrid-htable thead{background-color:#EFF3F8}.ui-jqgrid .ui-jqgrid-htable th span.ui-jqgrid-resize{height:45px!important}.ui-jqgrid .ui-jqgrid-htable th div{padding-top:12px;padding-bottom:12px;overflow:visible}.ui-jqgrid-hdiv .ui-jqgrid-htable{border-top:1px solid #E1E1E1}.ui-jqgrid-titlebar{position:relative;top:1px;z-index:1}.ui-jqgrid tr.jqgrow,.ui-jqgrid tr.ui-row-ltr,.ui-jqgrid tr.ui-row-rtl{border:none}.ui-jqgrid tr.ui-row-ltr td,.ui-jqgrid tr.ui-row-rtl td{border-bottom:1px solid #E1E1E1;padding:6px 4px;border-color:#E1E1E1}.ui-jqgrid tr.ui-state-highlight.ui-row-ltr td{border-right-color:#C7D3A9}.ui-jqgrid tr.ui-state-highlight.ui-row-rtl td{border-left-color:#C7D3A9}.ui-jqgrid-btable .ui-widget-content.ui-priority-secondary{background-image:none;background-color:#F9F9F9;opacity:1}.ui-jqgrid-btable .ui-widget-content.ui-state-hover{background-image:none;background-color:#EFF4F7;opacity:1}.ui-jqgrid-btable .ui-widget-content.ui-state-highlight{background-color:#E4EFC9}.ui-jqgrid .ui-jqgrid-pager{line-height:15px;height:55px;padding-top:10px!important;padding-bottom:10px!important;background-color:#EFF3F8!important;border-bottom:1px solid #E1E1E1!important;border-top:1px solid #E1E1E1!important}.ui-jqgrid .ui-pg-input{font-size:inherit;width:24px;height:20px;line-height:16px;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;text-align:center;padding-top:1px;padding-bottom:1px}.ui-jqgrid .ui-pg-selbox{display:block;height:24px;width:60px;margin:0;padding:1px;line-height:normal}.ui-jqgrid .ui-pager-control{height:50px;position:relative;padding-left:9px;padding-right:9px}.ui-jqgrid .ui-jqgrid-toppager{height:auto!important;background-color:#EFF3F8;border-bottom:1px solid #E1E1E1!important}.ui-jqgrid .jqgrow .editable{max-width:90%;max-width:calc(92%)!important}.ui-pg-table .navtable .ui-corner-all{border-radius:0}.ui-jqgrid .ui-pg-button .ui-separator{margin-left:4px;margin-right:4px;border-color:#C9D4DB}.ui-jqgrid .ui-jqgrid-btable{border-left:1px solid #E1E1E1}.ui-jqgrid .ui-jqgrid-bdiv{border-top:1px solid #E1E1E1;overflow-x:hidden}.ui-jqgrid .loading{position:absolute;top:45%;left:45%;width:auto;height:auto;z-index:111;padding:6px;margin:5px;text-align:center;font-weight:700;font-size:12px;background-color:#FFF;border:2px solid #8EB8D1;color:#E2B018}.ui-jqgrid .ui-search-toolbar{border-top:1px solid #E1E1E1}.ui-jqgrid .ui-jqgrid-labels{border-bottom:none;background:repeat-x #F2F2F2;background-image:-webkit-linear-gradient(top,#F8F8F8 0,#ECECEC 100%);background-image:-o-linear-gradient(top,#F8F8F8 0,#ECECEC 100%);background-image:linear-gradient(to bottom,#F8F8F8 0,#ECECEC 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff8f8f8', endColorstr='#ffececec', GradientType=0);padding:0!important;border-left:1px solid #E1E1E1!important}.ui-jqgrid .ui-jqgrid-labels th{border-right:1px solid #E1E1E1!important;text-align:left!important}.ui-jqgrid-labels th[id*="_cb"]:first-child>div{padding-top:0;text-align:center!important}.ui-jqgrid-sortable{padding-left:4px;font-size:13px;color:#777;font-weight:700}.ui-jqgrid-sortable:hover{color:#547EA8}th[aria-selected=true]{background-image:-webkit-linear-gradient(top,#EFF3F8 0,#E3E7ED 100%);background-image:-o-linear-gradient(top,#EFF3F8 0,#E3E7ED 100%);background-image:linear-gradient(to bottom,#EFF3F8 0,#E3E7ED 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffeff3f8', endColorstr='#ffe3e7ed', GradientType=0)}th[aria-selected=true] .ui-jqgrid-sortable{color:#307ECC}.ui-jqgrid .ui-icon{text-indent:0;color:#307ECC;float:none;right:2px}.rtl .ui-jqgrid .ui-icon{right:auto;left:2px}.ui-jqgrid .ui-icon.ui-state-disabled{color:#BBB}.ui-jqgrid .ui-icon.ui-state-disabled:hover{padding:0}.ui-grid-ico-sort:before{display:inline;font-size:12px}.ui-icon-asc:before{content:"\f0d8"}.ui-pg-table>tbody>tr>.ui-pg-button>.ui-icon{display:inline-block;padding:0;width:24px;height:24px;line-height:22px;text-align:center;position:static;float:none;margin:0 2px!important;color:grey;border:1px solid #CCC;background-color:#FFF;border-radius:100%}.ui-pg-table>tbody>tr>.ui-pg-button>.ui-icon:hover{color:#699AB5;border-color:#699AB5}.ui-pg-table>tbody>tr>.ui-pg-button>.ui-icon:before{width:20px;text-align:center;display:inline-block}.ui-pg-table>tbody>tr>.ui-pg-button.ui-state-disabled .ui-icon{color:#B0B0B0;background-color:#F7F7F7;border-color:#DDD;-moz-transform:scale(.9);-webkit-transform:scale(.9);-o-transform:scale(.9);-ms-transform:scale(.9);transform:scale(.9)}.ui-jqgrid-btable input,.ui-jqgrid-btable select,.ui-jqgrid-btable textarea{padding:2px;width:auto;max-width:100%;margin-bottom:0}.ui-jqgrid-btable select{padding:1px;height:25px;line-height:25px}.ui-jqgrid select.inline-edit-cell{padding:1px}.ui-pg-div .ui-icon{display:inline-block;width:18px;float:none;position:static;text-align:center;opacity:.85;-webkit-transition:all .12s;-o-transition:all .12s;transition:all .12s;margin:0 1px;vertical-align:middle;cursor:pointer;font-size:17px}.ui-pg-div .ui-icon:hover{-moz-transform:scale(1.2);-webkit-transform:scale(1.2);-o-transform:scale(1.2);-ms-transform:scale(1.2);transform:scale(1.2);opacity:1;position:static;margin:0 1px}.ui-pg-div .ui-icon:before{font-family:FontAwesome;display:inline}.ui-jqgrid .ui-icon-pencil{color:#478FCA}.ui-jqgrid .ui-icon-pencil:before{content:"\f040"}.ui-jqgrid .ui-icon-trash{color:#DD5A43}.ui-jqgrid .ui-icon-trash:before{content:"\f014"}.ui-jqgrid .ui-icon-disk{color:#69AA46}.ui-jqgrid .ui-icon-disk:before{content:"\f00c"}.ui-jqgrid .ui-icon-cancel{color:#DD5A43}.ui-jqgrid .ui-icon-cancel:before{content:"\f00d"}.ui-jqdialog .ui-jqdialog-content,.ui-jqdialog-content{font-size:13px;padding:4px 0 0}.ui-jqdialog .ui-jqdialog-content .formdata,.ui-jqdialog-content .formdata{font-size:13px;padding:6px 12px}.ui-jqdialog .ui-jqdialog-content .form-view-data,.ui-jqdialog-content .form-view-data{vertical-align:middle;font-size:13px}.ui-jqdialog .ui-jqdialog-content[id*=alertcnt_],.ui-jqdialog-content[id*=alertcnt_]{padding:8px 11px}.ui-jqdialog-content .CaptionTD{font-size:12px;text-align:right;color:#666}.ui-jqdialog-content .FormData{border-bottom:1px dotted #E8E8E8}.ui-jqdialog-content .FormData:last-child{border-bottom:none}.ui-jqdialog-content .FormData>td{padding-top:6px;padding-bottom:6px}.ui-jqdialog-content input.FormElement{width:auto}.ui-jqdialog-content select.FormElement{padding:1px;height:25px;line-height:25px;width:auto}.EditTable,.ui-jqdialog-content td.EditButton{padding:8px}.EditTable{background-color:#EFF3F8;border-top:1px solid #D6E1EA!important}.EditTable tr:first-child{display:none}.EditTable .navButton .fm-button{float:none!important;width:auto!important;margin:1px 1px 2px!important;background-color:transparent;border-radius:100%}.EditTable .navButton .fm-button:hover{background-color:transparent}.EditTable .navButton .fm-button:focus{outline:0}.EditTable .navButton .fm-button .ace-icon{display:inline-block;color:#999;border:1px solid #AAA;width:26px;height:26px;line-height:26px;text-align:center;border-radius:100%;background-color:#FFF}.EditTable .navButton .fm-button:hover .ace-icon{color:#699AB5;border-color:#699AB5}.EditTable .navButton .fm-button.ui-state-disabled .ace-icon,.EditTable .navButton .fm-button.ui-state-disabled:hover .ace-icon{color:#BBB;border-color:#CCC;-moz-transform:scale(.88);-webkit-transform:scale(.88);-o-transform:scale(.88);-ms-transform:scale(.88);transform:scale(.88)}.FormGrid .EditTable{background-color:#FFF;border-top:none!important;padding:0}.FormGrid .EditTable tr:first-child{display:none}.ui-jqgrid .ui-jqgrid-view button,.ui-jqgrid .ui-jqgrid-view input,.ui-jqgrid .ui-jqgrid-view select,.ui-jqgrid .ui-jqgrid-view textarea{font-size:13px}.ui-jqdialog-content .searchFilter select{padding:1px;height:26px;line-height:26px;width:auto;max-width:95%;margin-bottom:0}.ui-jqdialog-content .searchFilter .input-elm{margin-bottom:0;height:18px;line-height:18px;width:95%!important;padding-left:1px;padding-right:1px;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.ui-jqdialog-content .searchFilter table{margin-left:4px}.ui-jqdialog-content .searchFilter tr td{padding:5px 0}.ui-jqdialog-content .searchFilter .add-group,.ui-jqdialog-content .searchFilter .add-rule,.ui-jqdialog-content .searchFilter .delete-group{margin-left:4px!important;font-size:15px!important}.ui-jqdialog-content .searchFilter .delete-rule{border:none;background-color:#FFF;color:#D15B47;font-size:20px;width:22px;line-height:10px;padding:0;text-shadow:none!important;display:inline-block;-webkit-transition:all .1s;-o-transition:all .1s;transition:all .1s;opacity:.85}.ui-jqdialog-content .searchFilter .delete-rule:hover{-moz-transform:scale(1.1);-webkit-transform:scale(1.1);-o-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1);color:#B74635;opacity:1}.ui-jqdialog-content .searchFilter .queryresult td.query{padding:6px 11px;border:1px solid #E1E1E1;background-color:#EEE}.ui-jqdialog-content .searchFilter .queryresult td.query:empty{display:none}.ui-state-error{background-color:#f2dede;border:1px solid #ebccd1;color:#a94442;margin:4px 4px 8px;padding:6px 10px;text-shadow:0 1px 0 rgba(255,255,255,.5);font-size:13px}.ui-jqdialog .ui-widget-header{background-image:linear-gradient(to bottom,#FFF 0,#EEE 100%);background-repeat:repeat-x;border-image:none;border-bottom:1px solid solid;color:#669FC7;min-height:38px;position:relative}.ui-jqdialog .ui-widget-header .ui-jqdialog-title{line-height:38px;margin:0;padding:0 0 0 12px;text-align:left}.widget-header .ui-jqdialog-title{padding-left:0!important;padding-right:0!important}.ui-jqdialog .ui-widget-header .widget-header{border-bottom:none}.ui-jqdialog .ui-jqdialog-titlebar{border-bottom:1px solid #DDD!important}.fm-button{margin:0 4px;height:auto}.fm-button:not(.btn){background-color:#ABBAC3;border-radius:0;box-shadow:none;color:#FFF;cursor:pointer;display:inline-block;font-size:13px;line-height:28px;padding:0 12px 1px;margin:0 8px;position:relative;text-shadow:0 -1px 0 rgba(0,0,0,.25);-webkit-transition:all .15s;-o-transition:all .15s;transition:all .15s;vertical-align:middle}.dd2-content[class*=btn-],.dd2-handle.btn-yellow{text-shadow:none!important}.fm-button.ui-state-default:hover{background-color:#8B9AA3}.ui-jqgrid .ui-jqgrid-htable .ui-search-toolbar th{height:30px;padding-top:2px;white-space:normal}.ui-jqgrid .ui-jqgrid-htable .ui-search-toolbar th div{padding-top:0;padding-bottom:0;height:30px;line-height:26px}.ui-jqgrid .ui-jqgrid-titlebar-close{top:10%;height:auto;padding:0;margin:2px 8px 0 0;text-align:center;border-radius:4px}.ui-jqgrid .ui-jqgrid-titlebar-close:hover{background-color:rgba(255,255,255,.2)}.ui-jqgrid .ui-jqgrid-titlebar-close .ui-icon:before{display:inline-block;font-family:FontAwesome;content:"\f077";color:#FFF}.ui-jqgrid .ui-jqgrid-titlebar-close .ui-icon-circle-triangle-s:before{content:"\f078"}.ui-jqgrid .tree-wrap-ltr{margin:0 4px;float:none;display:inline}.ui-jqgrid .tree-wrap-rtl{margin:2px 4px 0}.ui-jqgrid .ui-subgrid{border-bottom:1px solid #E1E1E1;background-color:#F6FAFF}.ui-jqgrid .ui-subgrid .ui-jqgrid-btable{background-color:#FFF}.ui-jqgrid .ui-subgrid .ui-jqgrid .ui-jqgrid-hdiv{background-color:transparent;margin-top:4px}.ui-jqgrid .ui-subgrid .ui-jqgrid .ui-jqgrid-hdiv .ui-jqgrid-htable .ui-jqgrid-labels{border-bottom:1px solid #E1E1E1;background:#F1F1F1}.ui-jqgrid .ui-subgrid .ui-jqgrid .ui-jqgrid-hdiv .ui-jqgrid-htable th[aria-selected=true]{background:#E5E9EF}.ui-jqgrid .ui-subgrid .ui-jqgrid .ui-jqgrid-hdiv .ui-jqgrid-htable th .ui-jqgrid-sortable{font-size:12px}.ui-jqgrid .ui-subgrid .ui-jqgrid .ui-jqgrid-hdiv .ui-jqgrid-htable th div{padding-top:8px;padding-bottom:8px}.ui-jqgrid .ui-subgrid .ui-jqgrid .ui-jqgrid-hdiv .ui-jqgrid-htable th span.ui-jqgrid-resize{height:36px!important}.ui-jqgrid .ui-subgrid .ui-jqgrid .ui-jqgrid-bdiv{height:auto!important;max-height:150px;margin-bottom:4px;border-top-width:0;border-bottom:1px solid #E1E1E1}.ui-jqgrid .ui-sgcollapsed>a:hover{text-decoration:none}.ui-jqgrid .ui-pg-button:hover,.ui-jqgrid .ui-state-disabled:hover{padding:0 1px}.ui-jqgrid .ui-pg-table .ui-pg-button.ui-state-disabled:hover>.ui-pg-div>.ui-icon,.ui-jqgrid .ui-pg-table .ui-pg-button.ui-state-disabled:hover>.ui-separator{margin-left:4px;margin-right:4px}@media only screen and (max-width:767px){.ui-jqgrid .ui-jqgrid-pager{height:90px}.ui-jqgrid .ui-jqgrid-pager>.ui-pager-control{height:85px;padding-top:10px!important}.ui-jqgrid .ui-jqgrid-pager>.ui-pager-control>.ui-pg-table>tbody>tr>td{vertical-align:top}.ui-jqgrid .ui-jqgrid-pager>.ui-pager-control>.ui-pg-table>tbody>tr>td#grid-pager_center{width:0!important;position:static}.ui-jqgrid .ui-jqgrid-pager>.ui-pager-control>.ui-pg-table>tbody>tr>td#grid-pager_center>.ui-pg-table{margin:36px auto 0;position:absolute;right:0;left:0;text-align:center}.ui-jqgrid .ui-jqgrid-pager .navtable{height:auto}}.dd,.dd-list{display:block;padding:0;list-style:none}.dd,.dd-item>button,.dd-list{position:relative}@media only screen and (max-width:767px) and (-webkit-min-device-pixel-ratio:0){.ui-jqgrid .ui-jqgrid-pager>.ui-pager-control>.ui-pg-table>tbody>tr>td#grid-pager_center>.ui-pg-table{width:300px}}.dd{margin:0;max-width:600px;line-height:20px}.dd-list{margin:0}.dd-list .dd-list{padding-left:30px}.dd-collapsed .dd-list{display:none}.dd-empty,.dd-item,.dd-placeholder{display:block;position:relative;margin:0;padding:0;min-height:20px;line-height:20px}.dd-handle,.dd2-content{display:block;min-height:38px;margin:5px 0;padding:8px 12px;background:#F8FAFF;border:1px solid #DAE2EA;color:#7C9EB2;text-decoration:none;font-weight:700;box-sizing:border-box}.dd-handle:hover,.dd2-content:hover{color:#438EB9;background:#F4F6F7;border-color:#DCE2E8}.dd-handle[class*=btn-],.dd2-content[class*=btn-]{color:#FFF;border:none;padding:9px 12px}.dd-handle[class*=btn-]:hover,.dd2-content[class*=btn-]:hover{opacity:.85;color:#FFF}.dd2-handle+.dd2-content,.dd2-handle+.dd2-content[class*=btn-]{padding-left:44px}.dd-handle[class*=btn-]:hover,.dd2-content[class*=btn-] .dd2-handle[class*=btn-]:hover+.dd2-content[class*=btn-]{color:#FFF}.dd-item>button:hover~.dd-handle,.dd-item>button:hover~.dd2-content{color:#438EB9;background:#F4F6F7;border-color:#DCE2E8}.dd-item>button:hover~.dd-handle[class*=btn-],.dd-item>button:hover~.dd2-content[class*=btn-]{opacity:.85;color:#FFF}.dd2-handle:hover~.dd2-content{color:#438EB9;background:#F4F6F7;border-color:#DCE2E8}.dd2-handle:hover~.dd2-content[class*=btn-]{opacity:.85;color:#FFF}.dd2-item.dd-item>button{margin-left:34px}.dd-item>button{display:block;z-index:1;cursor:pointer;float:left;width:25px;height:20px;margin:5px 1px 5px 5px;padding:0;text-indent:100%;white-space:nowrap;overflow:hidden;border:0;background:0 0;font-size:12px;line-height:1;text-align:center;font-weight:700;top:4px;left:1px;color:#707070}.dd-item>button:before{font-family:FontAwesome;content:'\f067';display:block;position:absolute;width:100%;text-align:center;text-indent:0;font-weight:400;font-size:14px}.dd-item>button[data-action=collapse]:before{content:'\f068'}.dd-item>button:hover{color:#707070}.dd-item.dd-colored>button,.dd-item.dd-colored>button:hover{color:#EEE}.dd-empty,.dd-placeholder{margin:5px 0;padding:0;min-height:30px;background:#F0F9FF;border:2px dashed #BED2DB;box-sizing:border-box}.dd-empty{border-color:#AAA;border-style:solid;background-color:#e5e5e5}.dd-dragel{position:absolute;pointer-events:none;z-index:999;opacity:.8}.dd-dragel>li>.dd-handle{color:#4B92BE;background:#F1F5FA;border-color:#D6E1EA;border-left:2px solid #777;position:relative}.dd-dragel>li>.dd-handle[class*=btn-]{color:#FFF}.dd-dragel>.dd-item>.dd-handle{margin-top:0}.dd-list>li[class*=item-]{border-width:0;padding:0}.dd-list>li[class*=item-]>.dd-handle{border-left:2px solid;border-left-color:inherit}.dd-list>li>.dd-handle .sticker{position:absolute;right:0;top:0}.dd-dragel>li>.dd2-handle,.dd2-handle{left:0;top:0;width:36px;margin:0;text-align:center;padding:0!important;line-height:38px;height:38px;background:#EBEDF2;border:1px solid #DEE4EA;cursor:pointer;overflow:hidden;position:absolute;z-index:1}.dd-dragel>li>.dd2-handle,.dd2-handle:hover{background:#E3E8ED}.dd2-handle[class*=btn-]{text-shadow:none!important;background:rgba(0,0,0,.1)!important;border-right:1px solid #EEE}.dd2-handle[class*=btn-]:hover{background:rgba(0,0,0,.08)!important}.dd-dragel .dd2-handle[class*=btn-]{border-color:transparent #EEE transparent transparent}.dd2-handle.btn-yellow{background:rgba(0,0,0,.05)!important;border-right:1px solid #FFF}.dd2-handle.btn-yellow:hover{background:rgba(0,0,0,.08)!important}.dd-dragel .dd2-handle.btn-yellow{border-color:transparent #FFF transparent transparent}.dd-item>.dd2-handle .drag-icon{display:none}.dd-dragel>.dd-item>.dd2-handle .drag-icon{display:inline}.dd-dragel>.dd-item>.dd2-handle .normal-icon{display:none}.dropzone{border-radius:0;border:1px solid rgba(0,0,0,.06)}.dropzone.well{background-color:#f5f5f5;border:1px solid #e3e3e3}.dropzone .dz-default.dz-message{background-image:none;font-size:24px;text-align:center;line-height:32px;left:0;width:100%;margin-left:auto}.dropzone .dz-default.dz-message span{display:inline;color:#555}.dropzone .dz-default.dz-message span .upload-icon{opacity:.7;filter:alpha(opacity=70);margin-top:8px;cursor:pointer}.dropzone .dz-default.dz-message span .upload-icon:hover{opacity:1;filter:alpha(opacity=100)}.dropzone .dz-preview.dz-image-preview{background-color:transparent}input.tt-hint,input.tt-query,input.typeahead{min-width:175px;font-size:16px;line-height:24px;border:1px solid #CCC;border-radius:0;outline:0}.form-group input.tt-hint,input.tt-hint{background-color:#FFF!important;color:#B0B0B0!important}.tt-menu{text-align:left;position:absolute;left:0!important;right:0!important;min-width:175px;margin-top:2px;padding:8px 0;background-color:#FFF;border:1px solid #D0D0D0;border:1px solid rgba(0,0,0,.15);border-radius:0;box-shadow:0 2px 4px rgba(0,0,0,.2)}.btn-group>.btn.moveall:first-child,.btn-group>.btn.moveall:first-child+.btn.move,.btn-group>.btn.remove:first-child,.btn-group>.btn.remove:first-child+.btn.removeall,.tt-suggestion p{margin:0}.tt-suggestion{padding:3px 12px 4px;font-size:16px;line-height:24px}.tt-suggestion.tt-cursor,.tt-suggestion.tt-selectable:hover{color:#FFF;background-color:#4F99C6;cursor:pointer}input.typeahead.scrollable~.tt-menu{max-height:200px;overflow-y:auto}.bootstrap-duallistbox-container .clear1,.bootstrap-duallistbox-container .clear2,.bootstrap-duallistbox-container .info{font-size:12px}.btn.multiselect-clear-filter{padding-left:6px;padding-right:6px;line-height:1.45}.multiselect-container>li>a{padding:0}.multiselect-container>li>a>label{padding:7px 10px 7px 20px}.cancel-off-png,.cancel-on-png,.star-half-png,.star-off-png,.star-on-png{font-size:2em;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:FontAwesome;font-style:normal;font-variant:normal;font-weight:400;line-height:1;speak:none;text-transform:none;color:#777}.ace-settings-box .ace-settings-item>label.lbl,.tags .tag{font-size:13px}.cancel-on-png{color:#DD5A43}.cancel-on-png:before{content:"\f057"}.cancel-off-png{color:#E08374}.cancel-off-png:before{content:"\f05c"}.star-on-png{color:#FEB902}.star-on-png:before{content:"\f005"}.star-off-png{color:#777}.star-off-png:before{content:"\f006"}.star-half-png{color:#FEB902}.star-half-png:before{content:"\f123"}.icon-animated-bell{display:inline-block;-moz-animation:ringing 2s 5 ease 1s;-webkit-animation:ringing 2s 5 ease 1s;-o-animation:ringing 2s 5 ease 1s;-ms-animation:ringing 2s 5 ease 1s;animation:ringing 2s 5 ease 1s;-moz-transform-origin:50% 0;-webkit-transform-origin:50% 0;-o-transform-origin:50% 0;-ms-transform-origin:50% 0;transform-origin:50% 0}@-moz-keyframes ringing{0%{-moz-transform:rotate(-15deg)}2%{-moz-transform:rotate(15deg)}12%,4%{-moz-transform:rotate(-18deg)}14%,6%{-moz-transform:rotate(18deg)}8%{-moz-transform:rotate(-22deg)}10%{-moz-transform:rotate(22deg)}16%{-moz-transform:rotate(-12deg)}18%{-moz-transform:rotate(12deg)}20%{-moz-transform:rotate(0)}}@-webkit-keyframes ringing{0%{-webkit-transform:rotate(-15deg)}2%{-webkit-transform:rotate(15deg)}12%,4%{-webkit-transform:rotate(-18deg)}14%,6%{-webkit-transform:rotate(18deg)}8%{-webkit-transform:rotate(-22deg)}10%{-webkit-transform:rotate(22deg)}16%{-webkit-transform:rotate(-12deg)}18%{-webkit-transform:rotate(12deg)}20%{-webkit-transform:rotate(0)}}@-ms-keyframes ringing{0%{-ms-transform:rotate(-15deg)}2%{-ms-transform:rotate(15deg)}12%,4%{-ms-transform:rotate(-18deg)}14%,6%{-ms-transform:rotate(18deg)}8%{-ms-transform:rotate(-22deg)}10%{-ms-transform:rotate(22deg)}16%{-ms-transform:rotate(-12deg)}18%{-ms-transform:rotate(12deg)}20%{-ms-transform:rotate(0)}}@keyframes ringing{0%{transform:rotate(-15deg)}2%{transform:rotate(15deg)}12%,4%{transform:rotate(-18deg)}14%,6%{transform:rotate(18deg)}8%{transform:rotate(-22deg)}10%{transform:rotate(22deg)}16%{transform:rotate(-12deg)}18%{transform:rotate(12deg)}20%{transform:rotate(0)}}.icon-animated-vertical{display:inline-block;-moz-animation:vertical 2s 5 ease 2s;-webkit-animation:vertical 2s 5 ease 2s;-o-animation:vertical 2s 5 ease 2s;-ms-animation:vertical 2s 5 ease 2s;animation:vertical 2s 5 ease 2s}@-moz-keyframes vertical{0%,16%,8%{-moz-transform:translate(0,-3px)}12%,20%,4%{-moz-transform:translate(0,3px)}22%{-moz-transform:translate(0,0)}}@-webkit-keyframes vertical{0%,16%,8%{-webkit-transform:translate(0,-3px)}12%,20%,4%{-webkit-transform:translate(0,3px)}22%{-webkit-transform:translate(0,0)}}@-ms-keyframes vertical{0%,16%,8%{-ms-transform:translate(0,-3px)}12%,20%,4%{-ms-transform:translate(0,3px)}22%{-ms-transform:translate(0,0)}}@keyframes vertical{0%,16%,8%{transform:translate(0,-3px)}12%,20%,4%{transform:translate(0,3px)}22%{transform:translate(0,0)}}.icon-animated-hand-pointer{display:inline-block;-moz-animation:hand-pointer 2s 4 ease 2s;-webkit-animation:hand-pointer 2s 4 ease 2s;-o-animation:hand-pointer 2s 4 ease 2s;-ms-animation:hand-pointer 2s 4 ease 2s;animation:hand-pointer 2s 4 ease 2s}@-moz-keyframes hand-pointer{0%,12%,24%,36%{-moz-transform:translate(0,0)}18%,30%,6%{-moz-transform:translate(5px,0)}}.icon-animated-wrench{display:inline-block;-moz-animation:wrenching 2.5s 4 ease;-webkit-animation:wrenching 2.5s 4 ease;-o-animation:wrenching 2.5s 4 ease;-ms-animation:wrenching 2.5s 4 ease;animation:wrenching 2.5s 4 ease;-moz-transform-origin:90% 35%;-webkit-transform-origin:90% 35%;-o-transform-origin:90% 35%;-ms-transform-origin:90% 35%;transform-origin:90% 35%}@-moz-keyframes wrenching{0%{-moz-transform:rotate(-12deg)}8%{-moz-transform:rotate(12deg)}10%,28%,30%,48%,50%,68%{-moz-transform:rotate(24deg)}18%,20%,38%,40%,58%,60%{-moz-transform:rotate(-24deg)}75%{-moz-transform:rotate(0)}}@-webkit-keyframes wrenching{0%{-webkit-transform:rotate(-12deg)}8%{-webkit-transform:rotate(12deg)}10%,28%,30%,48%,50%,68%{-webkit-transform:rotate(24deg)}18%,20%,38%,40%,58%,60%{-webkit-transform:rotate(-24deg)}75%{-webkit-transform:rotate(0)}}@-o-keyframes wrenching{0%{-o-transform:rotate(-12deg)}8%{-o-transform:rotate(12deg)}10%,28%,30%,48%,50%,68%{-o-transform:rotate(24deg)}18%,20%,38%,40%,58%,60%{-o-transform:rotate(-24deg)}75%{-o-transform:rotate(0)}}@-ms-keyframes wrenching{0%{-ms-transform:rotate(-12deg)}8%{-ms-transform:rotate(12deg)}10%,28%,30%,48%,50%,68%{-ms-transform:rotate(24deg)}18%,20%,38%,40%,58%,60%{-ms-transform:rotate(-24deg)}75%{-ms-transform:rotate(0)}}@keyframes wrenching{0%{transform:rotate(-12deg)}8%{transform:rotate(12deg)}10%,28%,30%,48%,50%,68%{transform:rotate(24deg)}18%,20%,38%,40%,58%,60%{transform:rotate(-24deg)}75%{transform:rotate(0)}}@-moz-keyframes blinking{0%,80%{opacity:1}40%{opacity:0}}@-webkit-keyframes blinking{0%,80%{opacity:1}40%{opacity:0}}@-ms-keyframes blinking{0%,80%{opacity:1}40%{opacity:0}}@keyframes blinking{0%,80%{opacity:1}40%{opacity:0}}@-moz-keyframes pulsating{0%,10%,20%,30%,40%{-moz-transform:scale(1)}25%,5%{-moz-transform:scale(.75)}15%,35%{-moz-transform:scale(1.25)}}@-webkit-keyframes pulsating{0%,10%,20%,30%,40%{-webkit-transform:scale(1)}25%,5%{-webkit-transform:scale(.75)}15%,35%{-webkit-transform:scale(1.25)}}@-ms-keyframes pulsating{0%,10%,20%,30%,40%{-ms-transform:scale(1)}25%,5%{-ms-transform:scale(.75)}15%,35%{-ms-transform:scale(1.25)}}@keyframes pulsating{0%,10%,20%,30%,40%{transform:scale(1)}25%,5%{transform:scale(.75)}15%,35%{transform:scale(1.25)}}.btn-scroll-up{border-width:0;position:fixed;right:2px;z-index:99;-webkit-transition-duration:.3s;transition-duration:.3s;opacity:0;filter:alpha(opacity=0);bottom:-24px;visibility:hidden}.btn-scroll-up.display{opacity:.7;filter:alpha(opacity=70);bottom:2px;visibility:visible}.btn-scroll-up:hover{opacity:1;filter:alpha(opacity=100)}.btn-scroll-up:focus{outline:0}@media (min-width:768px){.main-container.container>.btn-scroll-up{right:auto;margin-left:714px}}@media (min-width:992px){.main-container.container>.btn-scroll-up{right:auto;margin-left:934px}}@media (min-width:1200px){.main-container.container>.btn-scroll-up{right:auto;margin-left:1134px}}.ace-settings-container{position:absolute;right:0;top:auto;z-index:12}.btn.btn-app.ace-settings-btn{float:left;display:block;text-align:center;border-radius:6px 0 0 6px;opacity:.55;vertical-align:top;margin:0}.btn.btn-app.ace-settings-btn.open,.btn.btn-app.ace-settings-btn:hover{opacity:1}.btn.btn-app.ace-settings-btn.btn-xs{width:42px}.ace-settings-box{display:block;float:left;max-width:0;max-height:0;overflow:hidden;padding:0;-moz-transform:translate(0,0);-webkit-transform:translate(0,0);-o-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0);background-color:#FFF;border:0 solid #FFB34B;-webkit-transition:max-width .25s linear 0s,max-height 0s linear .25s,padding 0s linear .25s,border-width 0s linear .25s;-o-transition:max-width .25s linear 0s,max-height 0s linear .25s,padding 0s linear .25s,border-width 0s linear .25s;transition:max-width .25s linear 0s,max-height 0s linear .25s,padding 0s linear .25s,border-width 0s linear .25s}.ace-settings-box.open{max-width:320px;max-height:1000px;padding:0 14px;border-width:2px;-webkit-transition-delay:0s;-moz-transition-delay:0s;-o-transition-delay:0s;transition-delay:0s}.ace-settings-box.open .ace-settings-item{z-index:auto;min-width:140px}.ace-settings-box .ace-settings-item{margin:6px 0;color:#444;max-height:24px;position:relative;z-index:-1;white-space:nowrap}@media (max-width:480px){.ace-settings-container{text-align:right}.ace-settings-box{float:none!important;text-align:left}.btn.ace-settings-btn{float:none!important;display:inline-block}}@media (max-width:320px){.ace-settings-box>.clearfix>.pull-left,.ace-settings-box>.clearfix>.pull-right{float:none!important}}.grid2,.grid3,.grid4{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin:0 1%;padding:0 2%;float:left;border-left:1px solid #E3E3E3}.grid2:first-child,.grid3:first-child,.grid4:first-child{border-left:none}.grid2{width:48%}.grid3{width:31.33%}.grid4{width:23%;padding:0 1%}.draggable-placeholder{border:2px dashed #D9D9D9!important;background-color:#F7F7F7!important}.easy-pie-chart,.easyPieChart{position:relative;text-align:center}.easy-pie-chart canvas,.easyPieChart canvas{position:absolute;top:0;left:0}.knob-container{direction:ltr;text-align:left}.tags{display:inline-block;padding:4px 6px;color:#777;vertical-align:middle;background-color:#FFF;border:1px solid #D5D5D5;width:206px}.tags:hover{border-color:#b5b5b5}.tags-hover,.tags-hover:hover{border-color:#F59942;outline:0}.tags[class*=span]{float:none;margin-left:0}.tags input[type=text],.tags input[type=text]:focus{border:none;display:inline;outline:0;margin:0;padding:0;line-height:18px;-webkit-box-shadow:none;box-shadow:none;width:100%}.tags .tag{display:inline-block;position:relative;font-weight:400;vertical-align:baseline;white-space:nowrap;background-color:#91B8D0;color:#FFF;text-shadow:1px 1px 1px rgba(0,0,0,.15);padding:4px 22px 5px 9px;margin-bottom:3px;margin-right:3px;-webkit-transition:all .2s;-o-transition:all .2s;transition:all .2s}.tags .tag:empty{display:none}.tags .tag-important{background-color:#D15B47}.tags .tag-warning{background-color:#FFB752}.tags .tag-success{background-color:#87B87F}.tags .tag-info{background-color:#6FB3E0}.tags .tag-inverse{background-color:#555}.tags .tag .close{font-size:15px;line-height:20px;opacity:1;filter:alpha(opacity=100);color:#FFF;text-shadow:none;float:none;position:absolute;right:0;top:0;bottom:0;width:18px;text-align:center}.tags .tag .close:hover{background-color:rgba(0,0,0,.2)}.page-content>.row .col-lg-12,.page-content>.row .col-md-12,.page-content>.row .col-sm-12,.page-content>.row .col-xs-12{float:left;max-width:100%}.col-xs-reset{width:auto;padding-left:0;padding-right:0;float:none!important}@media (min-width:768px){.col-sm-reset{width:auto;padding-left:0;padding-right:0;float:none!important}}@media (min-width:992px){.col-md-reset{width:auto;padding-left:0;padding-right:0;float:none!important}}@media (min-width:1200px){.col-lg-reset{width:auto;padding-left:0;padding-right:0;float:none!important}}.jqstooltip,.legendColorBox div{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.legendLabel{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:22px;padding-left:2px;font-size:10px}.navbar-fixed-top+.main-container{padding-top:45px}@media (max-width:479px){.navbar-fixed-top+.main-container{padding-top:90px}.navbar-fixed-top.navbar-collapse+.main-container{padding-top:45px}}@media only screen and (max-width:360px){.grid2,.grid3,.grid4{float:none;display:block;width:96%;border-left-width:0;position:relative;margin-bottom:11px;border-bottom:1px solid #E3E3E3;padding-bottom:4px}.grid2>[class*=pull-],.grid3>[class*=pull-],.grid4>[class*=pull-]{float:none!important;display:inline-block;position:absolute;right:11px;top:0;margin-top:0}.grid2:last-child,.grid3:last-child,.grid4:last-child{border-bottom-width:0}}@media only screen and (max-width:480px){.hidden-480{display:none!important}}@media only screen and (max-width:320px){.hidden-320{display:none!important}}.no-skin .navbar .navbar-toggle{background-color:#75B3D7}.no-skin .navbar .navbar-toggle:focus{background-color:#75B3D7;border-color:transparent}.no-skin .navbar .navbar-toggle:hover{background-color:#61a8d1;border-color:rgba(255,255,255,.1)}.no-skin .navbar .navbar-toggle.display,.no-skin .navbar .navbar-toggle[data-toggle=collapse]:not(.collapsed){background-color:#4d9dcc;box-shadow:inset 1px 1px 2px 0 rgba(0,0,0,.25);border-color:rgba(255,255,255,.35)}.no-skin .sidebar{background-color:#F2F2F2;border-style:solid;border-color:#CCC;border-width:0 1px 0 0}.no-skin .nav-list .open>a,.no-skin .nav-list .open>a:focus,.no-skin .nav-list .open>a:hover{background-color:#FAFAFA}.no-skin .nav-list>li{border-color:#E5E5E5}.no-skin .nav-list>li>a{background-color:#F8F8F8;color:#585858}.no-skin .nav-list>li>a:focus{background-color:#F8F8F8;color:#1963AA}.no-skin .nav-list>li:hover>a{background-color:#FFF;color:#266cad}.no-skin .nav-list>li.open>a{background-color:#FAFAFA;color:#1963AA}.no-skin .nav-list>li.active>a{font-weight:700;color:#2B7DBC}.no-skin .nav-list>li.active>a,.no-skin .nav-list>li.active>a:focus,.no-skin .nav-list>li.active>a:hover{background-color:#FFF}.no-skin .nav-list>li .submenu{background-color:#FFF;border-color:#E5E5E5}.no-skin .nav-list>li .submenu>li>a{border-top-color:#E4E4E4;background-color:#FFF;color:#616161}.no-skin .nav-list>li .submenu>li>a:hover{color:#4B88B7;background-color:#F1F5F9}.no-skin .nav-list>li .submenu>li.active>a{color:#2B7DBC}.no-skin .nav-list>li .submenu>li.active>a>.menu-icon{color:#C86139}.no-skin .nav-list>li .submenu>li.active.open>a>.menu-icon{color:inherit}@media only screen and (min-width:992px){.no-skin .nav-list>li .submenu>li.active.hover>a.dropdown-toggle>.menu-icon{color:inherit}}.no-skin .nav-list>li .submenu>li.active:not(.open)>a{background-color:#F5F7FA}.no-skin .nav-list>li .submenu>li.active:not(.open)>a:hover{background-color:#F1F5F9}.no-skin .nav-list>li>.submenu .open>a,.no-skin .nav-list>li>.submenu .open>a:focus,.no-skin .nav-list>li>.submenu .open>a:hover{border-color:#E4E4E4}.no-skin .nav-list>li>.submenu li>.submenu>li a{color:#757575}.no-skin .nav-list>li>.submenu li>.submenu>li a:hover{color:#4B88B7;background-color:#F1F5F9}.no-skin .nav-list>li>.submenu li.open>a,.no-skin .nav-list>li>.submenu li>.submenu li.active>a,.no-skin .nav-list>li>.submenu li>.submenu li.open>a{color:#4B88B7}.no-skin .nav-list>li>.submenu:before,.no-skin .nav-list>li>.submenu>li:before{border-color:#9dbdd6}.no-skin .nav-list>li.active>.submenu:before,.no-skin .nav-list>li.active>.submenu>li:before{border-color:#8eb3d0}.no-skin .sidebar-toggle{background-color:#F3F3F3;border-color:#E0E0E0}.no-skin .sidebar-toggle>.ace-icon{border-color:#BBB;color:#AAA;background-color:#FFF}.no-skin .sidebar-shortcuts{background-color:#FAFAFA}.no-skin .sidebar-fixed .sidebar-shortcuts{border-color:#DDD}.no-skin .sidebar-shortcuts-mini{background-color:#FFF}.no-skin .nav-list li>.arrow:before{border-right-color:#B8B8B8;border-width:10px 10px 10px 0;left:-10px}.no-skin .nav-list li>.arrow:after{border-right-color:#FFF;border-width:10px 10px 10px 0;left:-9px}.no-skin .nav-list>li.pull_up>.arrow:after{border-right-color:#FFF!important}.no-skin .nav-list li.active>a:after{border-right-color:#2B7DBC}.no-skin .nav-list>li.active:after{display:block;content:"";position:absolute;right:-2px;top:-1px;bottom:0;z-index:1;border:2px solid #2B7DBC;border-width:0 2px 0 0}.no-skin .sidebar-scroll .nav-list>li.active:after{right:0}.no-skin .sidebar.menu-min .nav-list>li>a>.menu-text{background-color:#F5F5F5;-webkit-box-shadow:2px 1px 2px 0 rgba(0,0,0,.1);box-shadow:2px 1px 2px 0 rgba(0,0,0,.1);border-color:#CCC}.no-skin .sidebar.menu-min .nav-list>li>a.dropdown-toggle>.menu-text{-webkit-box-shadow:2px 2px 2px 0 rgba(0,0,0,.1);box-shadow:2px 2px 2px 0 rgba(0,0,0,.1)}.no-skin .sidebar.menu-min .nav-list>li.active>.submenu{border-left-color:#83B6D1}.no-skin .sidebar.menu-min .nav-list>li>.submenu{background-color:#FFF;border:1px solid #CCC;border-top-color:#e6e6e6;-webkit-box-shadow:2px 2px 2px 0 rgba(0,0,0,.1);box-shadow:2px 2px 2px 0 rgba(0,0,0,.1)}.no-skin .sidebar.menu-min .nav-list>li>.arrow:after{border-right-color:#F5F5F5;border-width:8px 8px 8px 0;left:-8px}.no-skin .sidebar.menu-min .nav-list>li>.arrow:before{border-width:8px 8px 8px 0;left:-9px}.no-skin .sidebar.menu-min .nav-list>li.active>.arrow:before{border-right-color:#5a9ec2}.no-skin .sidebar.menu-min .nav-list>li.active>a>.menu-text{border-left-color:#83B6D1}.no-skin .sidebar.menu-min .sidebar-shortcuts-large{background-color:#FFF;-webkit-box-shadow:2px 1px 2px 0 rgba(0,0,0,.1);box-shadow:2px 1px 2px 0 rgba(0,0,0,.1);border-color:#CCC}.no-skin .sidebar.menu-min .sidebar-toggle>.ace-icon{border-color:#b1b1b1}@media (max-width:991px){.no-skin .sidebar.responsive-min .nav-list>li>a>.menu-text{background-color:#F5F5F5;-webkit-box-shadow:2px 1px 2px 0 rgba(0,0,0,.1);box-shadow:2px 1px 2px 0 rgba(0,0,0,.1);border-color:#CCC}.no-skin .sidebar.responsive-min .nav-list>li>a.dropdown-toggle>.menu-text{-webkit-box-shadow:2px 2px 2px 0 rgba(0,0,0,.1);box-shadow:2px 2px 2px 0 rgba(0,0,0,.1)}.no-skin .sidebar.responsive-min .nav-list>li.active>.submenu{border-left-color:#83B6D1}.no-skin .sidebar.responsive-min .nav-list>li>.submenu{background-color:#FFF;border:1px solid #CCC;border-top-color:#e6e6e6;-webkit-box-shadow:2px 2px 2px 0 rgba(0,0,0,.1);box-shadow:2px 2px 2px 0 rgba(0,0,0,.1)}.no-skin .sidebar.responsive-min .nav-list>li>.arrow:after{border-right-color:#F5F5F5;border-width:8px 8px 8px 0;left:-8px}.no-skin .sidebar.responsive-min .nav-list>li>.arrow:before{border-width:8px 8px 8px 0;left:-9px}.no-skin .sidebar.responsive-min .nav-list>li.active>.arrow:before{border-right-color:#5a9ec2}.no-skin .sidebar.responsive-min .nav-list>li.active>a>.menu-text{border-left-color:#83B6D1}.no-skin .sidebar.responsive-min .sidebar-shortcuts-large{background-color:#FFF;-webkit-box-shadow:2px 1px 2px 0 rgba(0,0,0,.1);box-shadow:2px 1px 2px 0 rgba(0,0,0,.1);border-color:#CCC}.no-skin .sidebar.responsive-min .sidebar-toggle>.ace-icon{border-color:#b1b1b1}}@media only screen and (min-width:992px){.no-skin .nav-list li.hover>.submenu{-webkit-box-shadow:2px 1px 2px 0 rgba(0,0,0,.1);box-shadow:2px 1px 2px 0 rgba(0,0,0,.1);border-color:#CCC}.no-skin .nav-list li.hover>.submenu>li.active>a{background-color:#F5F5F5}.no-skin .nav-list li.hover>.submenu>li:hover>a{background-color:#EEF3F7;color:#2E7DB4}}@media only screen and (min-width:992px) and (max-width:991px){.no-skin .sidebar.navbar-collapse .nav-list li li.hover.active.open>a,.no-skin .sidebar.navbar-collapse .nav-list li li.hover:hover>a{background-color:#FFF}.no-skin .sidebar.navbar-collapse .nav-list li li.hover.open.active>a:hover,.no-skin .sidebar.navbar-collapse .nav-list li li.hover.open>a:hover,.no-skin .sidebar.navbar-collapse .nav-list li li.hover>a:hover{background-color:#F1F5F9}.no-skin .sidebar.navbar-collapse .nav-list>li .submenu>li.active.hover>a.dropdown-toggle>.menu-icon{color:#C86139}.no-skin .sidebar.navbar-collapse .nav-list>li .submenu>li.active.open.hover>a.dropdown-toggle>.menu-icon{color:inherit}}@media only screen and (min-width:992px){.no-skin .sidebar.navbar-collapse .nav-list>li.open.hover:not(:hover):not(:focus):not(.active)>a{color:#585858}.no-skin .sidebar.navbar-collapse .nav-list>li.open.hover:not(:hover):not(:focus):not(.active)>a>.arrow{color:inherit}.no-skin .sidebar.navbar-collapse .nav-list>li.open.hover:hover>a{background-color:#FFF}.no-skin .sidebar.navbar-collapse .nav-list>li>.submenu li.open.hover:not(:hover):not(:focus):not(.active)>a{color:#616161}.no-skin .sidebar.navbar-collapse .nav-list>li>.submenu li.open.hover:not(:hover):not(:focus):not(.active)>a>.arrow{color:inherit}}@media only screen and (min-width:992px) and (max-width:991px){.no-skin .sidebar.navbar-collapse .nav-list li.hover>.submenu{border-top-color:#E5E5E5;background-color:#FFF}.no-skin .nav-list li.hover>.submenu>li.active:not(.open)>a{background-color:#F5F7FA}.no-skin .nav-list li.hover>.submenu>li.active:not(.open)>a:hover{background-color:#F1F5F9}}@media only screen and (min-width:992px){.no-skin .sidebar.h-sidebar{background-color:#F8F8F8}.no-skin .sidebar.h-sidebar:before{background-color:#E4E4E4;-webkit-box-shadow:0 -1px 1px 0 rgba(0,0,0,.05) inset;box-shadow:0 -1px 1px 0 rgba(0,0,0,.05) inset}.no-skin .sidebar.h-sidebar .nav-list>li:hover,.no-skin .sidebar.h-sidebar .nav-list>li:hover+li{border-left-color:#CEDDE5}.no-skin .sidebar.h-sidebar .nav-list>li:last-child:hover{border-right-color:#CEDDE5}.no-skin .sidebar.h-sidebar .nav-list>li.active,.no-skin .sidebar.h-sidebar .nav-list>li.active+li,.no-skin .sidebar.h-sidebar .nav-list>li:hover+li.active{border-left-color:#79B0CE}.no-skin .sidebar.h-sidebar .nav-list>li.active:last-child{border-right-color:#79B0CE}.no-skin .sidebar.h-sidebar .nav-list>li.active:before{background-color:#2B7DBC}.no-skin .sidebar.h-sidebar .nav-list>li.active>a:after{border-width:0 0 2px;border-color:transparent transparent #FFF;left:0;right:0;top:auto;bottom:-2px}.no-skin .sidebar.h-sidebar .sidebar-shortcuts-large{background-color:#FFF;border-color:#CCC;-webkit-box-shadow:2px 1px 2px 0 rgba(0,0,0,.1);box-shadow:2px 1px 2px 0 rgba(0,0,0,.1)}.no-skin .sidebar.h-sidebar .sidebar-shortcuts-large:after{border-bottom-color:#FFF}.no-skin .sidebar.h-sidebar .nav-list>li.hover>.submenu{border-color:#CCC}.no-skin .sidebar.h-sidebar.menu-min .nav-list>li.hover>.submenu{border-top-color:#e6e6e6}.no-skin .sidebar.h-sidebar .nav-list>li.hover>.arrow:after{border-color:transparent transparent #FFF}.no-skin .sidebar.h-sidebar .nav-list>li.hover>.arrow:before{border-color:transparent transparent #B8B8B8}.no-skin .sidebar.h-sidebar.menu-min .nav-list>li.hover>.arrow:after{border-bottom-color:#F5F5F5}.no-skin .sidebar.h-sidebar.menu-min .nav-list>li.active>a>.menu-text{border-left-color:#CCC}}@media only screen and (max-width:991px){body{overflow-x:hidden}.no-skin .sidebar.responsive .nav-list>li.active.open>a:after,.no-skin .sidebar.responsive-max .nav-list>li.active.open>a:after{display:block}.no-skin .sidebar.responsive .nav-list li li.active>a:after,.no-skin .sidebar.responsive-max .nav-list li li.active>a:after{display:none}.no-skin .sidebar.responsive .nav-list>li.active:after,.no-skin .sidebar.responsive-max .nav-list>li.active:after{height:41px}.no-skin .sidebar{border-width:0 1px 1px 0;border-top-color:#d6d6d6}.no-skin .menu-toggler+.sidebar.responsive{border-top-width:1px}.no-skin .sidebar.responsive-min{border-width:0 1px 0 0}.no-skin .sidebar.navbar-collapse{border-width:0;border-bottom-width:1px!important;border-bottom-color:#CCC;-webkit-box-shadow:0 2px 2px rgba(0,0,0,.1)!important;box-shadow:0 2px 2px rgba(0,0,0,.1)!important}.no-skin .sidebar.navbar-collapse.menu-min .nav-list>li>.submenu{background-color:#FFF}}.no-skin .sidebar-scroll .sidebar-shortcuts{border-bottom-color:#ddd}.no-skin .sidebar-scroll .sidebar-toggle{border-top-color:#ddd}.no-skin .main-container .menu-toggler{background-color:#444}.no-skin .main-container .menu-toggler:before{border-top-color:#87B87F;border-bottom-color:#6FB3E0}.no-skin .main-container .menu-toggler:after{border-top-color:#FFA24D;border-bottom-color:#D15B47}.no-skin .main-container .menu-toggler>.toggler-text{border-top-color:#444}.no-skin .nav-list>li.disabled:before{display:none!important}.no-skin .nav-list>li.disabled>a{background-color:#ebebeb!important;color:#656565!important}.no-skin .nav-list li .submenu>li.disabled>a,.no-skin .nav-list li.disabled .submenu>li>a{background-color:#f2f2f2!important;color:#7a7a7a!important;cursor:not-allowed!important}.nav-list li li.highlight.active>a:after,.nav-list li li.highlight.active>a:before,.nav-list li.highlight li.active>a:after,.nav-list li.highlight li.active>a:before,.no-skin .nav-list li .submenu>li.disabled>a>.menu-icon,.no-skin .nav-list li.disabled .submenu>li>a>.menu-icon{display:none}.nav-list>li.highlight.active>a:after,.nav-list>li.highlight.active>a:before{display:block}.no-skin .nav-list>li.highlight.active,.no-skin .nav-list>li.highlight:hover{border-color:#C8D8E2}.no-skin .nav-list>li.highlight.active+li,.no-skin .nav-list>li.highlight:hover+li{border-top-color:#C8D8E2}.no-skin .nav-list>li.highlight.active>a,.no-skin .nav-list>li.highlight:hover>a{background-color:#FFF}.no-skin .nav-list>li.highlight.active:after{display:none}.no-skin .nav-list>li.highlight.active:before{display:block;background-color:#4f90c2}.no-skin .nav-list>li.highlight.active>a{background-color:#F2F6F9!important}.no-skin .nav-list>li.highlight.active>a:after,.no-skin .nav-list>li.highlight.active>a:before{display:block;content:"";position:absolute;top:-1px;right:-9px;bottom:auto;z-index:1;border-style:solid;border-width:20px 0 21px 10px;border-color:transparent}.no-skin .nav-list>li.highlight.active>a:before{border-left-color:#a0bccd;right:-10px}.no-skin .nav-list>li.highlight.active>a:after{border-left-color:#F2F6F9}.no-skin .nav-list li li.highlight.active>a{background-color:#F2F6F9}.no-skin .nav-list li li.highlight.active.open>a{background-color:#FFF}.no-skin .nav-list li li.highlight.active.open>a:hover{background-color:#F1F5F9}@media (min-width:992px){.no-skin .sidebar.h-sidebar .nav-list>li.highlight.active>a:after{display:block;content:"";position:absolute;top:auto;right:auto;bottom:-2px;left:50%;margin-left:-7px;border-color:transparent transparent #FFF;border-width:8px 7px}.no-skin .sidebar.h-sidebar .nav-list>li.highlight.active>a:before{content:"";position:absolute;display:block;top:auto;right:auto;bottom:-1px;left:50%;margin-left:-7px;border-width:8px;border-color:transparent transparent #74add7}.no-skin .sidebar.h-sidebar .nav-list>li.highlight.active.hover-show>a:after,.no-skin .sidebar.h-sidebar .nav-list>li.highlight.active.hover-show>a:before,.no-skin .sidebar.h-sidebar .nav-list>li.highlight.active:hover>a:after,.no-skin .sidebar.h-sidebar .nav-list>li.highlight.active:hover>a:before,.sidebar.compact .nav-list li.highlight.active>a:after,.sidebar.compact .nav-list li.highlight.active>a:before{display:none}.sidebar.compact.menu-min .nav-list li.highlight.active>a:after,.sidebar.compact.menu-min .nav-list li.highlight.active>a:before{display:block}.sidebar.h-sidebar .nav-list li.highlight.active>a:after,.sidebar.h-sidebar .nav-list li.highlight.active>a:before{display:block;border-width:8px!important;border-left-color:transparent!important;border-right-color:transparent!important}.sidebar.h-sidebar .nav-list>li.highlight.active:hover>a:after,.sidebar.h-sidebar .nav-list>li.highlight.active:hover>a:before{display:none!important}}.sidebar-scroll .nav-list>li.active.highlight>a:after,.sidebar-scroll .nav-list>li.active.highlight>a:before{display:none!important}.onpage-help-backdrop{position:absolute;z-index:99990;top:0;bottom:0;left:0;right:0;background-color:#000;filter:alpha(opacity=5);background-color:rgba(0,0,0,.05)}.onpage-help-section{display:block;position:absolute;z-index:100000;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#4DFFFFFF', endColorstr='#4DFFFFFF', GradientType=0);background-color:rgba(255,255,255,.3);border:1px dashed #8BBCD3;border-radius:4px;transition:background-color .2s,border-color .2s;-webkit-transition:background-color .2s,border-color .2s;text-align:center;vertical-align:middle;outline:0!important}.onpage-help-section>.ie-hover-fix{display:block;position:absolute;top:0;bottom:0;left:0;right:0;background-color:#FFF;filter:alpha(opacity=1)}.onpage-help-section:active,.onpage-help-section:focus{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#33C9D8EA', endColorstr='#33C9D8EA', GradientType=0);background-color:rgba(201,216,234,.2);border-color:#77ACC4}.onpage-help-section:hover{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#66C9D8EA', endColorstr='#66C9D8EA', GradientType=0);background-color:rgba(201,216,234,.4);border-color:#77ACC4;border-style:solid}.onpage-help-section>.help-icon-1{font-size:18px;display:inline-block;position:absolute;z-index:1;top:50%;left:50%;transform:translate(-50%,-50%);-webkit-transform:translate(-50%,-50%);opacity:0;filter:alpha(opacity=0);color:#FFF;text-shadow:0 0 2px #000;background-color:#85B8DB;border:2px solid #FFF;border-radius:100%;box-shadow:0 0 2px 1px rgba(0,0,0,.4);width:48px;height:48px;line-height:46px;transition:opacity .2s;-webkit-transition:opacity .2s}.onpage-help-section:active>.help-icon-1,.onpage-help-section:focus>.help-icon-1{opacity:.5}.onpage-help-section:hover>.help-icon-1{opacity:1;filter:alpha(opacity=100)}.onpage-help-section.help-section-small>.help-icon-1{font-size:18px;width:28px;height:28px;line-height:26px;border-radius:12px}.onpage-help-section.help-section-smaller>.help-icon-1{font-size:14px;width:20px;height:20px;line-height:17px;border-radius:8px}.onpage-help-section>.help-icon-2{position:absolute;z-index:2;left:-4px;top:-4px;width:18px;height:18px;line-height:16px;display:block;font-size:16px;color:orange;background-color:#FFF;border:1px solid orange;border-radius:4px;opacity:1;transition:all .2s;-webkit-transition:all .2s}.onpage-help-section:hover>.help-icon-2{color:#59A34E;border-color:#59A34E;transform:scale(1.25);-webkit-transform:scale(1.25)}.onpage-help-modal{z-index:100010}.onpage-help-modal+.modal-backdrop{z-index:100009}.onpage-help-modal-buttons button{border-radius:100%;border-width:2px!important}.onpage-help-modal-buttons button.disabled{transform:scale(.9);-webkit-transform:scale(.9)}.onpage-help-content{max-width:800px;margin:0 auto}.code-modal.onpage-help-modal .modal-dialog{margin-top:6px;margin-bottom:6px}.code-modal.onpage-help-modal .modal-header{padding-top:6px;padding-bottom:6px}.code-modal.onpage-help-modal .modal-body{padding:10px 12px}.onpage-help-modal pre{border-width:0;box-shadow:none;border-radius:0;margin-top:8px}.onpage-help-modal .modal-title code{font-size:13px}.onpage-help-modal .modal-body{font-size:14px}@media print{.main-content .nav-search,.navbar,.sidebar{display:none!important}.footer,.footer .footer-inner,.footer .footer-inner .footer-content{width:100%}.main-content{margin-left:0!important;margin-right:0!important}.main-content .breadcrumbs{float:right;border-width:0!important}.main-content .breadcrumbs .breadcrumb>li+li:before{content:"/"}.main-content .breadcrumbs .breadcrumb .home-icon{display:none}.ace-settings-container,.btn-scroll-up,.label[class*=arrowed]:after,.label[class*=arrowed]:before{display:none!important}.footer{height:auto;position:relative}.btn,.btn.btn-app{background:0 0!important;border-width:1px!important;border-radius:0!important;color:#555!important}.label{border:1px solid #666!important}} \ No newline at end of file diff --git a/backend/web/static/css/bokeh-tables.min.css b/backend/web/static/css/bokeh-tables.min.css new file mode 100644 index 0000000..8da0c31 --- /dev/null +++ b/backend/web/static/css/bokeh-tables.min.css @@ -0,0 +1 @@ +.bk-root .slick-header.ui-state-default,.bk-root .slick-headerrow.ui-state-default,.bk-root .slick-footerrow.ui-state-default{width:100%;overflow:hidden;border-left:0 !important}.bk-root .slick-header-columns,.bk-root .slick-headerrow-columns,.bk-root .slick-footerrow-columns{position:relative;white-space:nowrap;cursor:default;overflow:hidden}.bk-root .slick-header-column.ui-state-default{position:relative;display:inline-block;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis;height:16px;line-height:16px;margin:0;padding:4px;border-right:1px solid silver;border-left:0 !important;border-top:0 !important;border-bottom:0 !important;float:left}.bk-root .slick-headerrow-column.ui-state-default,.bk-root .slick-footerrow-column.ui-state-default{padding:4px}.bk-root .slick-header-column-sorted{font-style:italic}.bk-root .slick-sort-indicator{display:inline-block;width:8px;height:5px;margin-left:4px;margin-top:6px;float:left}.bk-root .slick-sort-indicator-numbered{display:inline-block;width:8px;height:5px;margin-left:4px;margin-top:0;padding-left:1px;line-height:20px;float:left;font-family:Arial;font-style:normal;font-weight:bold;color:#6190cd}.bk-root .slick-sort-indicator-desc{background:url(images/sort-desc.gif)}.bk-root .slick-sort-indicator-asc{background:url(images/sort-asc.gif)}.bk-root .slick-resizable-handle{position:absolute;font-size:.1px;display:block;cursor:col-resize;width:4px;right:0;top:0;height:100%}.bk-root .slick-sortable-placeholder{background:silver}.bk-root .grid-canvas{position:relative;outline:0}.bk-root .slick-row.ui-widget-content,.bk-root .slick-row.ui-state-active{position:absolute;border:0;width:100%}.bk-root .slick-cell,.bk-root .slick-headerrow-column,.bk-root .slick-footerrow-column{position:absolute;border:1px solid transparent;border-right:1px dotted silver;border-bottom-color:silver;overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis;vertical-align:middle;z-index:1;padding:1px 2px 2px 1px;margin:0;white-space:nowrap;cursor:default}.bk-root .slick-cell,.bk-root .slick-headerrow-column{border-bottom-color:silver}.bk-root .slick-footerrow-column{border-top-color:silver}.bk-root .slick-group-toggle{display:inline-block}.bk-root .slick-cell.highlighted{background:lightskyblue;background:rgba(0,0,255,0.2);-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;transition:all .5s}.bk-root .slick-cell.flashing{border:1px solid red !important}.bk-root .slick-cell.editable{z-index:11;overflow:visible;background:white;border-color:black;border-style:solid}.bk-root .slick-cell:focus{outline:0}.bk-root .slick-reorder-proxy{display:inline-block;background:blue;opacity:.15;cursor:move}.bk-root .slick-reorder-guide{display:inline-block;height:2px;background:blue;opacity:.7}.bk-root .slick-selection{z-index:10;position:absolute;border:2px dashed black}.bk-root .slick-header-columns{background:url('images/header-columns-bg.gif') repeat-x center bottom;border-bottom:1px solid silver}.bk-root .slick-header-column{background:url('images/header-columns-bg.gif') repeat-x center bottom;border-right:1px solid silver}.bk-root .slick-header-column:hover,.bk-root .slick-header-column-active{background:white url('images/header-columns-over-bg.gif') repeat-x center bottom}.bk-root .slick-headerrow{background:#fafafa}.bk-root .slick-headerrow-column{background:#fafafa;border-bottom:0;height:100%}.bk-root .slick-row.ui-state-active{background:#f5f7d7}.bk-root .slick-row{position:absolute;background:white;border:0;line-height:20px}.bk-root .slick-row.selected{z-index:10;background:#dfe8f6}.bk-root .slick-cell{padding-left:4px;padding-right:4px}.bk-root .slick-group{border-bottom:2px solid silver}.bk-root .slick-group-toggle{width:9px;height:9px;margin-right:5px}.bk-root .slick-group-toggle.expanded{background:url(images/collapse.gif) no-repeat center center}.bk-root .slick-group-toggle.collapsed{background:url(images/expand.gif) no-repeat center center}.bk-root .slick-group-totals{color:gray;background:white}.bk-root .slick-group-select-checkbox{width:13px;height:13px;margin:3px 10px 0 0;display:inline-block}.bk-root .slick-group-select-checkbox.checked{background:url(images/GrpCheckboxY.png) no-repeat center center}.bk-root .slick-group-select-checkbox.unchecked{background:url(images/GrpCheckboxN.png) no-repeat center center}.bk-root .slick-cell.selected{background-color:beige}.bk-root .slick-cell.active{border-color:gray;border-style:solid}.bk-root .slick-sortable-placeholder{background:silver !important}.bk-root .slick-row.odd{background:#fafafa}.bk-root .slick-row.ui-state-active{background:#f5f7d7}.bk-root .slick-row.loading{opacity:.5}.bk-root .slick-cell.invalid{border-color:red;-moz-animation-duration:.2s;-webkit-animation-duration:.2s;-moz-animation-name:slickgrid-invalid-hilite;-webkit-animation-name:slickgrid-invalid-hilite}@-moz-keyframes slickgrid-invalid-hilite{from{box-shadow:0 0 6px red}to{box-shadow:none}}@-webkit-keyframes slickgrid-invalid-hilite{from{box-shadow:0 0 6px red}to{box-shadow:none}}.bk-root .slick-column-name,.bk-root .slick-sort-indicator{display:inline-block;float:left;margin-bottom:100px}.bk-root .slick-header-button{display:inline-block;float:right;vertical-align:top;margin:1px;margin-bottom:100px;height:15px;width:15px;background-repeat:no-repeat;background-position:center center;cursor:pointer}.bk-root .slick-header-button-hidden{width:0;-webkit-transition:.2s width;-ms-transition:.2s width;transition:.2s width}.bk-root .slick-header-column:hover>.slick-header-button{width:15px}.bk-root .slick-header-menubutton{position:absolute;right:0;top:0;bottom:0;width:14px;background-repeat:no-repeat;background-position:left center;background-image:url(../images/down.gif);cursor:pointer;display:none;border-left:thin ridge silver}.bk-root .slick-header-column:hover>.slick-header-menubutton,.bk-root .slick-header-column-active .slick-header-menubutton{display:inline-block}.bk-root .slick-header-menu{position:absolute;display:inline-block;margin:0;padding:2px;cursor:default}.bk-root .slick-header-menuitem{list-style:none;margin:0;padding:0;cursor:pointer}.bk-root .slick-header-menuicon{display:inline-block;width:16px;height:16px;vertical-align:middle;margin-right:4px;background-repeat:no-repeat;background-position:center center}.bk-root .slick-header-menucontent{display:inline-block;vertical-align:middle}.bk-root .slick-header-menuitem-disabled{color:silver}.bk-root .slick-columnpicker{border:1px solid #718bb7;background:#f0f0f0;padding:6px;-moz-box-shadow:2px 2px 2px silver;-webkit-box-shadow:2px 2px 2px silver;box-shadow:2px 2px 2px silver;min-width:100px;cursor:default}.bk-root .slick-columnpicker li{list-style:none;margin:0;padding:0;background:0}.bk-root .slick-columnpicker input{margin:4px}.bk-root .slick-columnpicker li a{display:block;padding:4px;font-weight:bold}.bk-root .slick-columnpicker li a:hover{background:white}.bk-root .slick-pager{width:100%;height:26px;border:1px solid gray;border-top:0;background:url('../images/header-columns-bg.gif') repeat-x center bottom;vertical-align:middle}.bk-root .slick-pager .slick-pager-status{display:inline-block;padding:6px}.bk-root .slick-pager .ui-icon-container{display:inline-block;margin:2px;border-color:gray}.bk-root .slick-pager .slick-pager-nav{display:inline-block;float:left;padding:2px}.bk-root .slick-pager .slick-pager-settings{display:block;float:right;padding:2px}.bk-root .slick-pager .slick-pager-settings *{vertical-align:middle}.bk-root .slick-pager .slick-pager-settings a{padding:2px;text-decoration:underline;cursor:pointer}.bk-root .slick-header-columns{background-image:url("data:image/gif;base64,R0lGODlhAgAYAIcAANDQ0Ovs7uzt7+3u8O7v8e/w8vDx8/Hy9Pn5+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAP8ALAAAAAACABgAAAghABEIHEiwYMEDCA8YWMiwgMMCBAgMmDhAgIAAGAMAABAQADs=")}.bk-root .slick-header-column{background-image:url("data:image/gif;base64,R0lGODlhAgAYAIcAANDQ0Ovs7uzt7+3u8O7v8e/w8vDx8/Hy9Pn5+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAP8ALAAAAAACABgAAAghABEIHEiwYMEDCA8YWMiwgMMCBAgMmDhAgIAAGAMAABAQADs=")}.bk-root .slick-header-column:hover,.bk-root .slick-header-column-active{background-image:url("data:image/gif;base64,R0lGODlhAgAWAIcAAKrM9tno++vz/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAP8ALAAAAAACABYAAAgUAAUIHEiwoIAACBMqXMhwIQAAAQEAOw==")}.bk-root .slick-group-toggle.expanded{background-image:url("data:image/gif;base64,R0lGODlhCQAJAPcAAAFGeoCAgNXz/+v5/+v6/+z5/+36//L7//X8//j9/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAACQAJAAAIMwADCBxIUIDBgwIEChgwwECBAgQUFjBAkaJCABgxGlB4AGHCAAIQiBypEEECkScJqgwQEAA7")}.bk-root .slick-group-toggle.collapsed{background-image:url("data:image/gif;base64,R0lGODlhCQAJAPcAAAFGeoCAgNXz/+v5/+v6/+z5/+36//L7//X8//j9/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAACQAJAAAIOAADCBxIUIDBgwIEChgwAECBAgQUFjAAQIABAwoBaNSIMYCAAwIqGlSIAEHFkiQTIBCgkqDLAAEBADs=")}.bk-root .slick-group-select-checkbox.checked{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAIAAACQKrqGAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOwQAADsEBuJFr7QAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xNkRpr/UAAAEcSURBVChTjdI9S8NQFAbg/raQXVwCRRFE7GK7OXTwD+ikk066VF3a0ja0hQTyQdJrwNq0zrYSQRLEXMSWSlCIb8glqRcFD+9yz3nugXwU4n9XQqMoGjj36uBJsTwuaNo3EwBG4Yy7pe7Gv8YcvhJCGFVsjxsjxujj6OTSGlHv+U2WZUZbPWKOv1ZjT5a7pbIoiptbO5b73mwrjHa1B27l8VlTEIS1damlTnEE+EEN9/P8WrfH81qdAIGeXvTTmzltdCy46sEhxpKUINReZR9NnqZbr9puugxV3NjWh/k74WmmEdWhmUNy2jNmWRc6fZTVADCqao52u+DGWTACYNT3fRxwtatPufTNR4yCIGAUn5hS+vJHhWGY/ANx/A3tvdv+1tZmuwAAAABJRU5ErkJggg==")}.bk-root .slick-group-select-checkbox.unchecked{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAIAAACQKrqGAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOwQAADsEBuJFr7QAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xNkRpr/UAAACXSURBVChT1dIxC4MwEAXg/v8/VOhQVDBNakV0KA6pxS4JhWRSIYPEJxwdDi1de7wleR+3JIf486w0hKCKRpSvvOhZcCmvNQBRuKqdah03U7UjNNH81rOaBYDo8SQaPX8JANFEaLaGBeAPaaY61rGksiN6TmR5H1j9CSoAosYYHLA7vTxYMvVEZa0liif23r93xjm3/oEYF8PiDn/I2FHCAAAAAElFTkSuQmCC")}.bk-root .slick-sort-indicator-desc{background-image:url("data:image/gif;base64,R0lGODlhDQAFAIcAAGGQzUD/QOPu+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAMAAAEALAAAAAANAAUAAAgeAAUAGEgQgIAACBEKLHgwYcKFBh1KFNhQosOKEgMCADs=")}.bk-root .slick-sort-indicator-asc{background-image:url("data:image/gif;base64,R0lGODlhDQAFAIcAAGGQzUD/QOPu+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAMAAAEALAAAAAANAAUAAAgbAAMIDABgoEGDABIeRJhQ4cKGEA8KmEiRosGAADs=")}.bk-root .slick-header-menubutton{background-image:url("data:image/gif;base64,R0lGODlhDgAOAIABADtKYwAAACH5BAEAAAEALAAAAAAOAA4AAAISjI+py+0PHZgUsGobhTn6DxoFADs=")}.bk-root .slick-pager{background-image:url("data:image/gif;base64,R0lGODlhAgAYAIcAANDQ0Ovs7uzt7+3u8O7v8e/w8vDx8/Hy9Pn5+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAP8ALAAAAAACABgAAAghABEIHEiwYMEDCA8YWMiwgMMCBAgMmDhAgIAAGAMAABAQADs=")}.bk-root .bk-data-table{font-size:11px}.bk-root .bk-data-table input[type="checkbox"]{margin-left:4px;margin-right:4px}.bk-root .bk-data-table *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.bk-root .bk-data-table *:before,.bk-root .bk-data-table *:after{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.bk-root .bk-cell-special-defaults{border-right-color:silver;border-right-style:solid;background:#f5f5f5}.bk-root .bk-cell-select{border-right-color:silver;border-right-style:solid;background:#f5f5f5}.bk-root .bk-cell-index{border-right-color:silver;border-right-style:solid;background:#f5f5f5;text-align:right;color:gray}.bk-root .slick-row.selected .bk-cell-index{background-color:transparent}.bk-root .slick-cell{padding-left:4px;padding-right:4px}.bk-root .slick-cell.active{border-style:dashed}.bk-root .slick-cell.editable{padding-left:0;padding-right:0}.bk-root .bk-cell-editor input,.bk-root .bk-cell-editor select{width:100%;height:100%;border:0;margin:0;padding:0;outline:0;background:transparent;vertical-align:baseline}.bk-root .bk-cell-editor input{padding-left:4px;padding-right:4px}.bk-root .bk-cell-editor-completion{font-size:11px}//# sourceMappingURL=bokeh-tables.min.css.map diff --git a/backend/web/static/css/bokeh-widgets.min.css b/backend/web/static/css/bokeh-widgets.min.css new file mode 100644 index 0000000..826895f --- /dev/null +++ b/backend/web/static/css/bokeh-widgets.min.css @@ -0,0 +1,4 @@ +@charset "UTF-8";.bk-root{/*! + * Pikaday + * Copyright © 2014 David Bushell | BSD & MIT license | http://dbushell.com/ + */}.bk-root .bk-noUi-target,.bk-root .bk-noUi-target *{-webkit-touch-callout:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-user-select:none;-ms-touch-action:none;touch-action:none;-ms-user-select:none;-moz-user-select:none;user-select:none;-moz-box-sizing:border-box;box-sizing:border-box}.bk-root .bk-noUi-target{position:relative;direction:ltr}.bk-root .bk-noUi-base{width:100%;height:100%;position:relative;z-index:1}.bk-root .bk-noUi-connect{position:absolute;right:0;top:0;left:0;bottom:0}.bk-root .bk-noUi-origin{position:absolute;height:0;width:0}.bk-root .bk-noUi-handle{position:relative;z-index:1}.bk-root .bk-noUi-state-tap .bk-noUi-connect,.bk-root .bk-noUi-state-tap .bk-noUi-origin{-webkit-transition:top .3s,right .3s,bottom .3s,left .3s;transition:top .3s,right .3s,bottom .3s,left .3s}.bk-root .bk-noUi-state-drag *{cursor:inherit !important}.bk-root .bk-noUi-base,.bk-root .bk-noUi-handle{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.bk-root .bk-noUi-horizontal{height:18px}.bk-root .bk-noUi-horizontal .bk-noUi-handle{width:34px;height:28px;left:-17px;top:-6px}.bk-root .bk-noUi-vertical{width:18px}.bk-root .bk-noUi-vertical .bk-noUi-handle{width:28px;height:34px;left:-6px;top:-17px}.bk-root .bk-noUi-target{background:#fafafa;border-radius:4px;border:1px solid #d3d3d3;box-shadow:inset 0 1px 1px #f0f0f0,0 3px 6px -5px #BBB}.bk-root .bk-noUi-connect{background:#3fb8af;border-radius:4px;box-shadow:inset 0 0 3px rgba(51,51,51,0.45);-webkit-transition:background 450ms;transition:background 450ms}.bk-root .bk-noUi-draggable{cursor:ew-resize}.bk-root .bk-noUi-vertical .bk-noUi-draggable{cursor:ns-resize}.bk-root .bk-noUi-handle{border:1px solid #d9d9d9;border-radius:3px;background:#FFF;cursor:default;box-shadow:inset 0 0 1px #FFF,inset 0 1px 7px #ebebeb,0 3px 6px -3px #BBB}.bk-root .bk-noUi-active{box-shadow:inset 0 0 1px #FFF,inset 0 1px 7px #DDD,0 3px 6px -3px #BBB}.bk-root .bk-noUi-handle:before,.bk-root .bk-noUi-handle:after{content:"";display:block;position:absolute;height:14px;width:1px;background:#e8e7e6;left:14px;top:6px}.bk-root .bk-noUi-handle:after{left:17px}.bk-root .bk-noUi-vertical .bk-noUi-handle:before,.bk-root .bk-noUi-vertical .bk-noUi-handle:after{width:14px;height:1px;left:6px;top:14px}.bk-root .bk-noUi-vertical .bk-noUi-handle:after{top:17px}.bk-root [disabled] .bk-noUi-connect{background:#b8b8b8}.bk-root [disabled].bk-noUi-target,.bk-root [disabled].bk-noUi-handle,.bk-root [disabled] .bk-noUi-handle{cursor:not-allowed}.bk-root .bk-noUi-pips,.bk-root .bk-noUi-pips *{-moz-box-sizing:border-box;box-sizing:border-box}.bk-root .bk-noUi-pips{position:absolute;color:#999}.bk-root .bk-noUi-value{position:absolute;white-space:nowrap;text-align:center}.bk-root .bk-noUi-value-sub{color:#ccc;font-size:10px}.bk-root .bk-noUi-marker{position:absolute;background:#CCC}.bk-root .bk-noUi-marker-sub{background:#AAA}.bk-root .bk-noUi-marker-large{background:#AAA}.bk-root .bk-noUi-pips-horizontal{padding:10px 0;height:80px;top:100%;left:0;width:100%}.bk-root .bk-noUi-value-horizontal{-webkit-transform:translate3d(-50%,50%,0);transform:translate3d(-50%,50%,0)}.bk-root .bk-noUi-marker-horizontal.bk-noUi-marker{margin-left:-1px;width:2px;height:5px}.bk-root .bk-noUi-marker-horizontal.bk-noUi-marker-sub{height:10px}.bk-root .bk-noUi-marker-horizontal.bk-noUi-marker-large{height:15px}.bk-root .bk-noUi-pips-vertical{padding:0 10px;height:100%;top:0;left:100%}.bk-root .bk-noUi-value-vertical{-webkit-transform:translate3d(0,50%,0);transform:translate3d(0,50%,0);padding-left:25px}.bk-root .bk-noUi-marker-vertical.bk-noUi-marker{width:5px;height:2px;margin-top:-1px}.bk-root .bk-noUi-marker-vertical.bk-noUi-marker-sub{width:10px}.bk-root .bk-noUi-marker-vertical.bk-noUi-marker-large{width:15px}.bk-root .bk-noUi-tooltip{display:block;position:absolute;border:1px solid #d9d9d9;border-radius:3px;background:#fff;color:#000;padding:5px;text-align:center;white-space:nowrap}.bk-root .bk-noUi-horizontal .bk-noUi-tooltip{-webkit-transform:translate(-50%,0);transform:translate(-50%,0);left:50%;bottom:120%}.bk-root .bk-noUi-vertical .bk-noUi-tooltip{-webkit-transform:translate(0,-50%);transform:translate(0,-50%);top:50%;right:120%}.bk-root .bk-noUi-handle{cursor:grab;cursor:-webkit-grab}.bk-root .bk-noUi-handle.bk-noUi-active{cursor:grabbing;cursor:-webkit-grabbing}.bk-root .bk-noUi-tooltip{display:none;white-space:nowrap}.bk-root .bk-noUi-handle:hover .bk-noUi-tooltip{display:block}.bk-root .bk-noUi-horizontal{width:100%;height:10px}.bk-root .bk-noUi-horizontal .bk-noUi-handle{width:14px;height:18px;left:-7px;top:-5px}.bk-root .bk-noUi-vertical{width:10px;height:100%}.bk-root .bk-noUi-vertical .bk-noUi-handle{width:18px;height:14px;left:-5px;top:-7px}.bk-root .bk-noUi-handle:after,.bk-root .bk-noUi-handle:before{display:none}.bk-root .bk-noUi-connect{box-shadow:none}.bk-root fieldset{padding:0;margin:0;border:0;min-width:0}.bk-root legend{display:block;width:100%;padding:0;margin-bottom:17px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}.bk-root label{display:inline-block;margin-bottom:5px}.bk-root input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bk-root input[type="radio"],.bk-root input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}.bk-root input[type="file"]{display:block}.bk-root input[type="range"]{display:block;width:100%}.bk-root select[multiple],.bk-root select[size]{height:auto}.bk-root input[type="file"]:focus,.bk-root input[type="radio"]:focus,.bk-root input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.bk-root output{display:block;padding-top:7px;line-height:1.42857143;color:#555}.bk-root .bk-bs-form-control{display:block;height:31px;padding:0 12px;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px}.bk-root .bk-bs-form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,0.6)}.bk-root .bk-bs-form-control::-moz-placeholder{color:#999;opacity:1}.bk-root .bk-bs-form-control:-ms-input-placeholder{color:#999}.bk-root .bk-bs-form-control::-webkit-input-placeholder{color:#999}.bk-root .bk-bs-form-control[disabled],.bk-root .bk-bs-form-control[readonly],fieldset[disabled] .bk-root .bk-bs-form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.bk-root .bk-bs-form-control{height:auto}.bk-root input[type="search"]{-webkit-appearance:none}.bk-root input[type="date"]{line-height:31px}.bk-root .bk-bs-form-group{margin-bottom:15px}.bk-root .bk-bs-radio,.bk-root .bk-bs-checkbox{display:block;min-height:17px;margin-top:10px;margin-bottom:10px;padding-left:20px}.bk-root .bk-bs-radio label,.bk-root .bk-bs-checkbox label{display:inline;font-weight:normal;cursor:pointer}.bk-root .bk-bs-radio input[type="radio"],.bk-root .bk-bs-radio-inline input[type="radio"],.bk-root .bk-bs-checkbox input[type="checkbox"],.bk-root .bk-bs-checkbox-inline input[type="checkbox"]{float:left;margin-left:-20px}.bk-root .bk-bs-radio+.bk-bs-radio,.bk-root .bk-bs-checkbox+.bk-bs-checkbox{margin-top:-5px}.bk-root .bk-bs-radio-inline,.bk-root .bk-bs-checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.bk-root .bk-bs-radio-inline+.bk-bs-radio-inline,.bk-root .bk-bs-checkbox-inline+.bk-bs-checkbox-inline{margin-top:0;margin-left:10px}.bk-root input[type="radio"][disabled],.bk-root input[type="checkbox"][disabled],.bk-root .bk-bs-radio[disabled],.bk-root .bk-bs-radio-inline[disabled],.bk-root .bk-bs-checkbox[disabled],.bk-root .bk-bs-checkbox-inline[disabled],fieldset[disabled] .bk-root input[type="radio"],fieldset[disabled] .bk-root input[type="checkbox"],fieldset[disabled] .bk-root .bk-bs-radio,fieldset[disabled] .bk-root .bk-bs-radio-inline,fieldset[disabled] .bk-root .bk-bs-checkbox,fieldset[disabled] .bk-root .bk-bs-checkbox-inline{cursor:not-allowed}.bk-root .bk-bs-input-sm{height:28px;padding:5px 10px;font-size:11px;line-height:1.5;border-radius:3px}select.bk-root .bk-bs-input-sm{height:28px;line-height:28px}textarea.bk-root .bk-bs-input-sm,select[multiple].bk-root .bk-bs-input-sm{height:auto}.bk-root .bk-bs-input-lg{height:42px;padding:10px 16px;font-size:15px;line-height:1.33;border-radius:6px}select.bk-root .bk-bs-input-lg{height:42px;line-height:42px}textarea.bk-root .bk-bs-input-lg,select[multiple].bk-root .bk-bs-input-lg{height:auto}.bk-root .bk-bs-has-feedback{position:relative}.bk-root .bk-bs-has-feedback .bk-bs-form-control{padding-right:38.75px}.bk-root .bk-bs-has-feedback .bk-bs-form-control-feedback{position:absolute;top:22px;right:0;display:block;width:31px;height:31px;line-height:31px;text-align:center}.bk-root .bk-bs-has-success .bk-bs-help-block,.bk-root .bk-bs-has-success .bk-bs-control-label,.bk-root .bk-bs-has-success .bk-bs-radio,.bk-root .bk-bs-has-success .bk-bs-checkbox,.bk-root .bk-bs-has-success .bk-bs-radio-inline,.bk-root .bk-bs-has-success .bk-bs-checkbox-inline{color:#3c763d}.bk-root .bk-bs-has-success .bk-bs-form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.bk-root .bk-bs-has-success .bk-bs-form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.bk-root .bk-bs-has-success .bk-bs-input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.bk-root .bk-bs-has-success .bk-bs-form-control-feedback{color:#3c763d}.bk-root .bk-bs-has-warning .bk-bs-help-block,.bk-root .bk-bs-has-warning .bk-bs-control-label,.bk-root .bk-bs-has-warning .bk-bs-radio,.bk-root .bk-bs-has-warning .bk-bs-checkbox,.bk-root .bk-bs-has-warning .bk-bs-radio-inline,.bk-root .bk-bs-has-warning .bk-bs-checkbox-inline{color:#8a6d3b}.bk-root .bk-bs-has-warning .bk-bs-form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.bk-root .bk-bs-has-warning .bk-bs-form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.bk-root .bk-bs-has-warning .bk-bs-input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.bk-root .bk-bs-has-warning .bk-bs-form-control-feedback{color:#8a6d3b}.bk-root .bk-bs-has-error .bk-bs-help-block,.bk-root .bk-bs-has-error .bk-bs-control-label,.bk-root .bk-bs-has-error .bk-bs-radio,.bk-root .bk-bs-has-error .bk-bs-checkbox,.bk-root .bk-bs-has-error .bk-bs-radio-inline,.bk-root .bk-bs-has-error .bk-bs-checkbox-inline{color:#a94442}.bk-root .bk-bs-has-error .bk-bs-form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.bk-root .bk-bs-has-error .bk-bs-form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.bk-root .bk-bs-has-error .bk-bs-input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.bk-root .bk-bs-has-error .bk-bs-form-control-feedback{color:#a94442}.bk-root .bk-bs-form-control-static{margin-bottom:0}.bk-root .bk-bs-help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media(min-width:768px){.bk-root .bk-bs-form-inline .bk-bs-form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.bk-root .bk-bs-form-inline .bk-bs-form-control{display:inline-block;width:auto;vertical-align:middle}.bk-root .bk-bs-form-inline .bk-bs-input-group>.bk-bs-form-control{width:100%}.bk-root .bk-bs-form-inline .bk-bs-control-label{margin-bottom:0;vertical-align:middle}.bk-root .bk-bs-form-inline .bk-bs-radio,.bk-root .bk-bs-form-inline .bk-bs-checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.bk-root .bk-bs-form-inline .bk-bs-radio input[type="radio"],.bk-root .bk-bs-form-inline .bk-bs-checkbox input[type="checkbox"]{float:none;margin-left:0}.bk-root .bk-bs-form-inline .bk-bs-has-feedback .bk-bs-form-control-feedback{top:0}}.bk-root .bk-bs-form-horizontal .bk-bs-control-label,.bk-root .bk-bs-form-horizontal .bk-bs-radio,.bk-root .bk-bs-form-horizontal .bk-bs-checkbox,.bk-root .bk-bs-form-horizontal .bk-bs-radio-inline,.bk-root .bk-bs-form-horizontal .bk-bs-checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.bk-root .bk-bs-form-horizontal .bk-bs-radio,.bk-root .bk-bs-form-horizontal .bk-bs-checkbox{min-height:24px}.bk-root .bk-bs-form-horizontal .bk-bs-form-group{margin-left:-15px;margin-right:-15px}.bk-root .bk-bs-form-horizontal .bk-bs-form-control-static{padding-top:7px}@media(min-width:768px){.bk-root .bk-bs-form-horizontal .bk-bs-control-label{text-align:right}}.bk-root .bk-bs-form-horizontal .bk-bs-has-feedback .bk-bs-form-control-feedback{top:0;right:15px}.bk-root .bk-bs-btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:12px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bk-root .bk-bs-btn:focus,.bk-root .bk-bs-btn:active:focus,.bk-root .bk-bs-btn.bk-bs-active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.bk-root .bk-bs-btn:hover,.bk-root .bk-bs-btn:focus{color:#333;text-decoration:none}.bk-root .bk-bs-btn:active,.bk-root .bk-bs-btn.bk-bs-active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.bk-root .bk-bs-btn.bk-bs-disabled,.bk-root .bk-bs-btn[disabled],fieldset[disabled] .bk-root .bk-bs-btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.bk-root .bk-bs-btn-default{color:#333;background-color:#fff;border-color:#ccc}.bk-root .bk-bs-btn-default:hover,.bk-root .bk-bs-btn-default:focus,.bk-root .bk-bs-btn-default:active,.bk-root .bk-bs-btn-default.bk-bs-active,.bk-bs-open .bk-bs-dropdown-toggle.bk-root .bk-bs-btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.bk-root .bk-bs-btn-default:active,.bk-root .bk-bs-btn-default.bk-bs-active,.bk-bs-open .bk-bs-dropdown-toggle.bk-root .bk-bs-btn-default{background-image:none}.bk-root .bk-bs-btn-default.bk-bs-disabled,.bk-root .bk-bs-btn-default[disabled],fieldset[disabled] .bk-root .bk-bs-btn-default,.bk-root .bk-bs-btn-default.bk-bs-disabled:hover,.bk-root .bk-bs-btn-default[disabled]:hover,fieldset[disabled] .bk-root .bk-bs-btn-default:hover,.bk-root .bk-bs-btn-default.bk-bs-disabled:focus,.bk-root .bk-bs-btn-default[disabled]:focus,fieldset[disabled] .bk-root .bk-bs-btn-default:focus,.bk-root .bk-bs-btn-default.bk-bs-disabled:active,.bk-root .bk-bs-btn-default[disabled]:active,fieldset[disabled] .bk-root .bk-bs-btn-default:active,.bk-root .bk-bs-btn-default.bk-bs-disabled.bk-bs-active,.bk-root .bk-bs-btn-default[disabled].bk-bs-active,fieldset[disabled] .bk-root .bk-bs-btn-default.bk-bs-active{background-color:#fff;border-color:#ccc}.bk-root .bk-bs-btn-default .bk-bs-badge{color:#fff;background-color:#333}.bk-root .bk-bs-btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.bk-root .bk-bs-btn-primary:hover,.bk-root .bk-bs-btn-primary:focus,.bk-root .bk-bs-btn-primary:active,.bk-root .bk-bs-btn-primary.bk-bs-active,.bk-bs-open .bk-bs-dropdown-toggle.bk-root .bk-bs-btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.bk-root .bk-bs-btn-primary:active,.bk-root .bk-bs-btn-primary.bk-bs-active,.bk-bs-open .bk-bs-dropdown-toggle.bk-root .bk-bs-btn-primary{background-image:none}.bk-root .bk-bs-btn-primary.bk-bs-disabled,.bk-root .bk-bs-btn-primary[disabled],fieldset[disabled] .bk-root .bk-bs-btn-primary,.bk-root .bk-bs-btn-primary.bk-bs-disabled:hover,.bk-root .bk-bs-btn-primary[disabled]:hover,fieldset[disabled] .bk-root .bk-bs-btn-primary:hover,.bk-root .bk-bs-btn-primary.bk-bs-disabled:focus,.bk-root .bk-bs-btn-primary[disabled]:focus,fieldset[disabled] .bk-root .bk-bs-btn-primary:focus,.bk-root .bk-bs-btn-primary.bk-bs-disabled:active,.bk-root .bk-bs-btn-primary[disabled]:active,fieldset[disabled] .bk-root .bk-bs-btn-primary:active,.bk-root .bk-bs-btn-primary.bk-bs-disabled.bk-bs-active,.bk-root .bk-bs-btn-primary[disabled].bk-bs-active,fieldset[disabled] .bk-root .bk-bs-btn-primary.bk-bs-active{background-color:#428bca;border-color:#357ebd}.bk-root .bk-bs-btn-primary .bk-bs-badge{color:#428bca;background-color:#fff}.bk-root .bk-bs-btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.bk-root .bk-bs-btn-success:hover,.bk-root .bk-bs-btn-success:focus,.bk-root .bk-bs-btn-success:active,.bk-root .bk-bs-btn-success.bk-bs-active,.bk-bs-open .bk-bs-dropdown-toggle.bk-root .bk-bs-btn-success{color:#fff;background-color:#47a447;border-color:#398439}.bk-root .bk-bs-btn-success:active,.bk-root .bk-bs-btn-success.bk-bs-active,.bk-bs-open .bk-bs-dropdown-toggle.bk-root .bk-bs-btn-success{background-image:none}.bk-root .bk-bs-btn-success.bk-bs-disabled,.bk-root .bk-bs-btn-success[disabled],fieldset[disabled] .bk-root .bk-bs-btn-success,.bk-root .bk-bs-btn-success.bk-bs-disabled:hover,.bk-root .bk-bs-btn-success[disabled]:hover,fieldset[disabled] .bk-root .bk-bs-btn-success:hover,.bk-root .bk-bs-btn-success.bk-bs-disabled:focus,.bk-root .bk-bs-btn-success[disabled]:focus,fieldset[disabled] .bk-root .bk-bs-btn-success:focus,.bk-root .bk-bs-btn-success.bk-bs-disabled:active,.bk-root .bk-bs-btn-success[disabled]:active,fieldset[disabled] .bk-root .bk-bs-btn-success:active,.bk-root .bk-bs-btn-success.bk-bs-disabled.bk-bs-active,.bk-root .bk-bs-btn-success[disabled].bk-bs-active,fieldset[disabled] .bk-root .bk-bs-btn-success.bk-bs-active{background-color:#5cb85c;border-color:#4cae4c}.bk-root .bk-bs-btn-success .bk-bs-badge{color:#5cb85c;background-color:#fff}.bk-root .bk-bs-btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.bk-root .bk-bs-btn-info:hover,.bk-root .bk-bs-btn-info:focus,.bk-root .bk-bs-btn-info:active,.bk-root .bk-bs-btn-info.bk-bs-active,.bk-bs-open .bk-bs-dropdown-toggle.bk-root .bk-bs-btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.bk-root .bk-bs-btn-info:active,.bk-root .bk-bs-btn-info.bk-bs-active,.bk-bs-open .bk-bs-dropdown-toggle.bk-root .bk-bs-btn-info{background-image:none}.bk-root .bk-bs-btn-info.bk-bs-disabled,.bk-root .bk-bs-btn-info[disabled],fieldset[disabled] .bk-root .bk-bs-btn-info,.bk-root .bk-bs-btn-info.bk-bs-disabled:hover,.bk-root .bk-bs-btn-info[disabled]:hover,fieldset[disabled] .bk-root .bk-bs-btn-info:hover,.bk-root .bk-bs-btn-info.bk-bs-disabled:focus,.bk-root .bk-bs-btn-info[disabled]:focus,fieldset[disabled] .bk-root .bk-bs-btn-info:focus,.bk-root .bk-bs-btn-info.bk-bs-disabled:active,.bk-root .bk-bs-btn-info[disabled]:active,fieldset[disabled] .bk-root .bk-bs-btn-info:active,.bk-root .bk-bs-btn-info.bk-bs-disabled.bk-bs-active,.bk-root .bk-bs-btn-info[disabled].bk-bs-active,fieldset[disabled] .bk-root .bk-bs-btn-info.bk-bs-active{background-color:#5bc0de;border-color:#46b8da}.bk-root .bk-bs-btn-info .bk-bs-badge{color:#5bc0de;background-color:#fff}.bk-root .bk-bs-btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.bk-root .bk-bs-btn-warning:hover,.bk-root .bk-bs-btn-warning:focus,.bk-root .bk-bs-btn-warning:active,.bk-root .bk-bs-btn-warning.bk-bs-active,.bk-bs-open .bk-bs-dropdown-toggle.bk-root .bk-bs-btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.bk-root .bk-bs-btn-warning:active,.bk-root .bk-bs-btn-warning.bk-bs-active,.bk-bs-open .bk-bs-dropdown-toggle.bk-root .bk-bs-btn-warning{background-image:none}.bk-root .bk-bs-btn-warning.bk-bs-disabled,.bk-root .bk-bs-btn-warning[disabled],fieldset[disabled] .bk-root .bk-bs-btn-warning,.bk-root .bk-bs-btn-warning.bk-bs-disabled:hover,.bk-root .bk-bs-btn-warning[disabled]:hover,fieldset[disabled] .bk-root .bk-bs-btn-warning:hover,.bk-root .bk-bs-btn-warning.bk-bs-disabled:focus,.bk-root .bk-bs-btn-warning[disabled]:focus,fieldset[disabled] .bk-root .bk-bs-btn-warning:focus,.bk-root .bk-bs-btn-warning.bk-bs-disabled:active,.bk-root .bk-bs-btn-warning[disabled]:active,fieldset[disabled] .bk-root .bk-bs-btn-warning:active,.bk-root .bk-bs-btn-warning.bk-bs-disabled.bk-bs-active,.bk-root .bk-bs-btn-warning[disabled].bk-bs-active,fieldset[disabled] .bk-root .bk-bs-btn-warning.bk-bs-active{background-color:#f0ad4e;border-color:#eea236}.bk-root .bk-bs-btn-warning .bk-bs-badge{color:#f0ad4e;background-color:#fff}.bk-root .bk-bs-btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.bk-root .bk-bs-btn-danger:hover,.bk-root .bk-bs-btn-danger:focus,.bk-root .bk-bs-btn-danger:active,.bk-root .bk-bs-btn-danger.bk-bs-active,.bk-bs-open .bk-bs-dropdown-toggle.bk-root .bk-bs-btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.bk-root .bk-bs-btn-danger:active,.bk-root .bk-bs-btn-danger.bk-bs-active,.bk-bs-open .bk-bs-dropdown-toggle.bk-root .bk-bs-btn-danger{background-image:none}.bk-root .bk-bs-btn-danger.bk-bs-disabled,.bk-root .bk-bs-btn-danger[disabled],fieldset[disabled] .bk-root .bk-bs-btn-danger,.bk-root .bk-bs-btn-danger.bk-bs-disabled:hover,.bk-root .bk-bs-btn-danger[disabled]:hover,fieldset[disabled] .bk-root .bk-bs-btn-danger:hover,.bk-root .bk-bs-btn-danger.bk-bs-disabled:focus,.bk-root .bk-bs-btn-danger[disabled]:focus,fieldset[disabled] .bk-root .bk-bs-btn-danger:focus,.bk-root .bk-bs-btn-danger.bk-bs-disabled:active,.bk-root .bk-bs-btn-danger[disabled]:active,fieldset[disabled] .bk-root .bk-bs-btn-danger:active,.bk-root .bk-bs-btn-danger.bk-bs-disabled.bk-bs-active,.bk-root .bk-bs-btn-danger[disabled].bk-bs-active,fieldset[disabled] .bk-root .bk-bs-btn-danger.bk-bs-active{background-color:#d9534f;border-color:#d43f3a}.bk-root .bk-bs-btn-danger .bk-bs-badge{color:#d9534f;background-color:#fff}.bk-root .bk-bs-btn-link{color:#428bca;font-weight:normal;cursor:pointer;border-radius:0}.bk-root .bk-bs-btn-link,.bk-root .bk-bs-btn-link:active,.bk-root .bk-bs-btn-link[disabled],fieldset[disabled] .bk-root .bk-bs-btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.bk-root .bk-bs-btn-link,.bk-root .bk-bs-btn-link:hover,.bk-root .bk-bs-btn-link:focus,.bk-root .bk-bs-btn-link:active{border-color:transparent}.bk-root .bk-bs-btn-link:hover,.bk-root .bk-bs-btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.bk-root .bk-bs-btn-link[disabled]:hover,fieldset[disabled] .bk-root .bk-bs-btn-link:hover,.bk-root .bk-bs-btn-link[disabled]:focus,fieldset[disabled] .bk-root .bk-bs-btn-link:focus{color:#999;text-decoration:none}.bk-root .bk-bs-btn-lg{padding:10px 16px;font-size:15px;line-height:1.33;border-radius:6px}.bk-root .bk-bs-btn-sm{padding:5px 10px;font-size:11px;line-height:1.5;border-radius:3px}.bk-root .bk-bs-btn-xs{padding:1px 5px;font-size:11px;line-height:1.5;border-radius:3px}.bk-root .bk-bs-btn-block{display:block;width:100%;padding-left:0;padding-right:0}.bk-root .bk-bs-btn-block+.bk-bs-btn-block{margin-top:5px}.bk-root input[type="submit"].bk-bs-btn-block,.bk-root input[type="reset"].bk-bs-btn-block,.bk-root input[type="button"].bk-bs-btn-block{width:100%}.bk-root .bk-bs-caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.bk-root .bk-bs-dropdown{position:relative}.bk-root .bk-bs-dropdown-toggle:focus{outline:0}.bk-root .bk-bs-dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:12px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.bk-root .bk-bs-dropdown-menu.bk-bs-pull-right{right:0;left:auto}.bk-root .bk-bs-dropdown-menu .bk-bs-divider{height:1px;margin:7.5px 0;overflow:hidden;background-color:#e5e5e5}.bk-root .bk-bs-dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333;white-space:nowrap}.bk-root .bk-bs-dropdown-menu>li>a:hover,.bk-root .bk-bs-dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.bk-root .bk-bs-dropdown-menu>.bk-bs-active>a,.bk-root .bk-bs-dropdown-menu>.bk-bs-active>a:hover,.bk-root .bk-bs-dropdown-menu>.bk-bs-active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.bk-root .bk-bs-dropdown-menu>.bk-bs-disabled>a,.bk-root .bk-bs-dropdown-menu>.bk-bs-disabled>a:hover,.bk-root .bk-bs-dropdown-menu>.bk-bs-disabled>a:focus{color:#999}.bk-root .bk-bs-dropdown-menu>.bk-bs-disabled>a:hover,.bk-root .bk-bs-dropdown-menu>.bk-bs-disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.bk-bs-Microsoft.bk-bs-gradient(enabled = false);cursor:not-allowed}.bk-root .bk-bs-open>.bk-bs-dropdown-menu{display:block}.bk-root .bk-bs-open>a{outline:0}.bk-root .bk-bs-dropdown-menu-right{left:auto;right:0}.bk-root .bk-bs-dropdown-menu-left{left:0;right:auto}.bk-root .bk-bs-dropdown-header{display:block;padding:3px 20px;font-size:11px;line-height:1.42857143;color:#999}.bk-root .bk-bs-dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.bk-root .bk-bs-pull-right>.bk-bs-dropdown-menu{right:0;left:auto}.bk-root .bk-bs-dropup .bk-bs-caret,.bk-root .bk-bs-navbar-fixed-bottom .bk-bs-dropdown .bk-bs-caret{border-top:0;border-bottom:4px solid;content:""}.bk-root .bk-bs-dropup .bk-bs-dropdown-menu,.bk-root .bk-bs-navbar-fixed-bottom .bk-bs-dropdown .bk-bs-dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media(min-width:768px){.bk-root .bk-bs-navbar-right .bk-bs-dropdown-menu{left:auto;right:0}.bk-root .bk-bs-navbar-right .bk-bs-dropdown-menu-left{left:0;right:auto}}.bk-root .bk-bs-btn-group,.bk-root .bk-bs-btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.bk-root .bk-bs-btn-group>.bk-bs-btn,.bk-root .bk-bs-btn-group-vertical>.bk-bs-btn{position:relative;float:left}.bk-root .bk-bs-btn-group>.bk-bs-btn:hover,.bk-root .bk-bs-btn-group-vertical>.bk-bs-btn:hover,.bk-root .bk-bs-btn-group>.bk-bs-btn:focus,.bk-root .bk-bs-btn-group-vertical>.bk-bs-btn:focus,.bk-root .bk-bs-btn-group>.bk-bs-btn:active,.bk-root .bk-bs-btn-group-vertical>.bk-bs-btn:active,.bk-root .bk-bs-btn-group>.bk-bs-btn.bk-bs-active,.bk-root .bk-bs-btn-group-vertical>.bk-bs-btn.bk-bs-active{z-index:2}.bk-root .bk-bs-btn-group>.bk-bs-btn:focus,.bk-root .bk-bs-btn-group-vertical>.bk-bs-btn:focus{outline:0}.bk-root .bk-bs-btn-group .bk-bs-btn+.bk-bs-btn,.bk-root .bk-bs-btn-group .bk-bs-btn+.bk-bs-btn-group,.bk-root .bk-bs-btn-group .bk-bs-btn-group+.bk-bs-btn,.bk-root .bk-bs-btn-group .bk-bs-btn-group+.bk-bs-btn-group{margin-left:-1px}.bk-root .bk-bs-btn-toolbar{margin-left:-5px}.bk-root .bk-bs-btn-toolbar .bk-bs-btn-group,.bk-root .bk-bs-btn-toolbar .bk-bs-input-group{float:left}.bk-root .bk-bs-btn-toolbar>.bk-bs-btn,.bk-root .bk-bs-btn-toolbar>.bk-bs-btn-group,.bk-root .bk-bs-btn-toolbar>.bk-bs-input-group{margin-left:5px}.bk-root .bk-bs-btn-group>.bk-bs-btn:not(:first-child):not(:last-child):not(.bk-bs-dropdown-toggle){border-radius:0}.bk-root .bk-bs-btn-group>.bk-bs-btn:first-child{margin-left:0}.bk-root .bk-bs-btn-group>.bk-bs-btn:first-child:not(:last-child):not(.bk-bs-dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.bk-root .bk-bs-btn-group>.bk-bs-btn:last-child:not(:first-child),.bk-root .bk-bs-btn-group>.bk-bs-dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.bk-root .bk-bs-btn-group>.bk-bs-btn-group{float:left}.bk-root .bk-bs-btn-group>.bk-bs-btn-group:not(:first-child):not(:last-child)>.bk-bs-btn{border-radius:0}.bk-root .bk-bs-btn-group>.bk-bs-btn-group:first-child>.bk-bs-btn:last-child,.bk-root .bk-bs-btn-group>.bk-bs-btn-group:first-child>.bk-bs-dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.bk-root .bk-bs-btn-group>.bk-bs-btn-group:last-child>.bk-bs-btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.bk-root .bk-bs-btn-group .bk-bs-dropdown-toggle:active,.bk-root .bk-bs-btn-group.bk-bs-open .bk-bs-dropdown-toggle{outline:0}.bk-root .bk-bs-btn-group>.bk-bs-btn+.bk-bs-dropdown-toggle{padding-left:8px;padding-right:8px}.bk-root .bk-bs-btn-group>.bk-bs-btn-lg+.bk-bs-dropdown-toggle{padding-left:12px;padding-right:12px}.bk-root .bk-bs-btn-group.bk-bs-open .bk-bs-dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.bk-root .bk-bs-btn-group.bk-bs-open .bk-bs-dropdown-toggle.bk-bs-btn-link{-webkit-box-shadow:none;box-shadow:none}.bk-root .bk-bs-btn .bk-bs-caret{margin-left:0}.bk-root .bk-bs-btn-lg .bk-bs-caret{border-width:5px 5px 0;border-bottom-width:0}.bk-root .bk-bs-dropup .bk-bs-btn-lg .bk-bs-caret{border-width:0 5px 5px}.bk-root .bk-bs-btn-group-vertical>.bk-bs-btn,.bk-root .bk-bs-btn-group-vertical>.bk-bs-btn-group,.bk-root .bk-bs-btn-group-vertical>.bk-bs-btn-group>.bk-bs-btn{display:block;float:none;width:100%;max-width:100%}.bk-root .bk-bs-btn-group-vertical>.bk-bs-btn-group>.bk-bs-btn{float:none}.bk-root .bk-bs-btn-group-vertical>.bk-bs-btn+.bk-bs-btn,.bk-root .bk-bs-btn-group-vertical>.bk-bs-btn+.bk-bs-btn-group,.bk-root .bk-bs-btn-group-vertical>.bk-bs-btn-group+.bk-bs-btn,.bk-root .bk-bs-btn-group-vertical>.bk-bs-btn-group+.bk-bs-btn-group{margin-top:-1px;margin-left:0}.bk-root .bk-bs-btn-group-vertical>.bk-bs-btn:not(:first-child):not(:last-child){border-radius:0}.bk-root .bk-bs-btn-group-vertical>.bk-bs-btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.bk-root .bk-bs-btn-group-vertical>.bk-bs-btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.bk-root .bk-bs-btn-group-vertical>.bk-bs-btn-group:not(:first-child):not(:last-child)>.bk-bs-btn{border-radius:0}.bk-root .bk-bs-btn-group-vertical>.bk-bs-btn-group:first-child:not(:last-child)>.bk-bs-btn:last-child,.bk-root .bk-bs-btn-group-vertical>.bk-bs-btn-group:first-child:not(:last-child)>.bk-bs-dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.bk-root .bk-bs-btn-group-vertical>.bk-bs-btn-group:last-child:not(:first-child)>.bk-bs-btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.bk-root .bk-bs-btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.bk-root .bk-bs-btn-group-justified>.bk-bs-btn,.bk-root .bk-bs-btn-group-justified>.bk-bs-btn-group{float:none;display:table-cell;width:1%}.bk-root .bk-bs-btn-group-justified>.bk-bs-btn-group .bk-bs-btn{width:100%}.bk-root .bk-bs-btn-group>.bk-bs-btn>input[type="radio"],.bk-root .bk-bs-btn-group>.bk-bs-btn>input[type="checkbox"]{display:none}.bk-root .bk-bs-input-group{position:relative;display:table;border-collapse:separate}.bk-root .bk-bs-input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.bk-root .bk-bs-input-group .bk-bs-form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.bk-root .bk-bs-input-group-lg>.bk-bs-form-control,.bk-root .bk-bs-input-group-lg>.bk-bs-input-group-addon,.bk-root .bk-bs-input-group-lg>.bk-bs-input-group-btn>.bk-bs-btn{height:42px;padding:10px 16px;font-size:15px;line-height:1.33;border-radius:6px}select.bk-root .bk-bs-input-group-lg>.bk-bs-form-control,select.bk-root .bk-bs-input-group-lg>.bk-bs-input-group-addon,select.bk-root .bk-bs-input-group-lg>.bk-bs-input-group-btn>.bk-bs-btn{height:42px;line-height:42px}textarea.bk-root .bk-bs-input-group-lg>.bk-bs-form-control,textarea.bk-root .bk-bs-input-group-lg>.bk-bs-input-group-addon,textarea.bk-root .bk-bs-input-group-lg>.bk-bs-input-group-btn>.bk-bs-btn,select[multiple].bk-root .bk-bs-input-group-lg>.bk-bs-form-control,select[multiple].bk-root .bk-bs-input-group-lg>.bk-bs-input-group-addon,select[multiple].bk-root .bk-bs-input-group-lg>.bk-bs-input-group-btn>.bk-bs-btn{height:auto}.bk-root .bk-bs-input-group-sm>.bk-bs-form-control,.bk-root .bk-bs-input-group-sm>.bk-bs-input-group-addon,.bk-root .bk-bs-input-group-sm>.bk-bs-input-group-btn>.bk-bs-btn{height:28px;padding:5px 10px;font-size:11px;line-height:1.5;border-radius:3px}select.bk-root .bk-bs-input-group-sm>.bk-bs-form-control,select.bk-root .bk-bs-input-group-sm>.bk-bs-input-group-addon,select.bk-root .bk-bs-input-group-sm>.bk-bs-input-group-btn>.bk-bs-btn{height:28px;line-height:28px}textarea.bk-root .bk-bs-input-group-sm>.bk-bs-form-control,textarea.bk-root .bk-bs-input-group-sm>.bk-bs-input-group-addon,textarea.bk-root .bk-bs-input-group-sm>.bk-bs-input-group-btn>.bk-bs-btn,select[multiple].bk-root .bk-bs-input-group-sm>.bk-bs-form-control,select[multiple].bk-root .bk-bs-input-group-sm>.bk-bs-input-group-addon,select[multiple].bk-root .bk-bs-input-group-sm>.bk-bs-input-group-btn>.bk-bs-btn{height:auto}.bk-root .bk-bs-input-group-addon,.bk-root .bk-bs-input-group-btn,.bk-root .bk-bs-input-group .bk-bs-form-control{display:table-cell}.bk-root .bk-bs-input-group-addon:not(:first-child):not(:last-child),.bk-root .bk-bs-input-group-btn:not(:first-child):not(:last-child),.bk-root .bk-bs-input-group .bk-bs-form-control:not(:first-child):not(:last-child){border-radius:0}.bk-root .bk-bs-input-group-addon,.bk-root .bk-bs-input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.bk-root .bk-bs-input-group-addon{padding:6px 12px;font-size:12px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.bk-root .bk-bs-input-group-addon.bk-bs-input-sm{padding:5px 10px;font-size:11px;border-radius:3px}.bk-root .bk-bs-input-group-addon.bk-bs-input-lg{padding:10px 16px;font-size:15px;border-radius:6px}.bk-root .bk-bs-input-group-addon input[type="radio"],.bk-root .bk-bs-input-group-addon input[type="checkbox"]{margin-top:0}.bk-root .bk-bs-input-group .bk-bs-form-control:first-child,.bk-root .bk-bs-input-group-addon:first-child,.bk-root .bk-bs-input-group-btn:first-child>.bk-bs-btn,.bk-root .bk-bs-input-group-btn:first-child>.bk-bs-btn-group>.bk-bs-btn,.bk-root .bk-bs-input-group-btn:first-child>.bk-bs-dropdown-toggle,.bk-root .bk-bs-input-group-btn:last-child>.bk-bs-btn:not(:last-child):not(.bk-bs-dropdown-toggle),.bk-root .bk-bs-input-group-btn:last-child>.bk-bs-btn-group:not(:last-child)>.bk-bs-btn{border-bottom-right-radius:0;border-top-right-radius:0}.bk-root .bk-bs-input-group-addon:first-child{border-right:0}.bk-root .bk-bs-input-group .bk-bs-form-control:last-child,.bk-root .bk-bs-input-group-addon:last-child,.bk-root .bk-bs-input-group-btn:last-child>.bk-bs-btn,.bk-root .bk-bs-input-group-btn:last-child>.bk-bs-btn-group>.bk-bs-btn,.bk-root .bk-bs-input-group-btn:last-child>.bk-bs-dropdown-toggle,.bk-root .bk-bs-input-group-btn:first-child>.bk-bs-btn:not(:first-child),.bk-root .bk-bs-input-group-btn:first-child>.bk-bs-btn-group:not(:first-child)>.bk-bs-btn{border-bottom-left-radius:0;border-top-left-radius:0}.bk-root .bk-bs-input-group-addon:last-child{border-left:0}.bk-root .bk-bs-input-group-btn{position:relative;font-size:0;white-space:nowrap}.bk-root .bk-bs-input-group-btn>.bk-bs-btn{position:relative}.bk-root .bk-bs-input-group-btn>.bk-bs-btn+.bk-bs-btn{margin-left:-1px}.bk-root .bk-bs-input-group-btn>.bk-bs-btn:hover,.bk-root .bk-bs-input-group-btn>.bk-bs-btn:focus,.bk-root .bk-bs-input-group-btn>.bk-bs-btn:active{z-index:2}.bk-root .bk-bs-input-group-btn:first-child>.bk-bs-btn,.bk-root .bk-bs-input-group-btn:first-child>.bk-bs-btn-group{margin-right:-1px}.bk-root .bk-bs-input-group-btn:last-child>.bk-bs-btn,.bk-root .bk-bs-input-group-btn:last-child>.bk-bs-btn-group{margin-left:-1px}.bk-root .bk-bs-nav{margin-bottom:0;padding-left:0;list-style:none}.bk-root .bk-bs-nav>li{position:relative;display:block}.bk-root .bk-bs-nav>li>span{position:relative;display:block;padding:10px 15px}.bk-root .bk-bs-nav>li>span:hover,.bk-root .bk-bs-nav>li>span:focus{text-decoration:none;background-color:#eee}.bk-root .bk-bs-nav>li.bk-bs-disabled>span{color:#999}.bk-root .bk-bs-nav>li.bk-bs-disabled>span:hover,.bk-root .bk-bs-nav>li.bk-bs-disabled>span:focus{color:#999;text-decoration:none;background-color:transparent;cursor:not-allowed}.bk-root .bk-bs-nav-tabs{border-bottom:1px solid #ddd}.bk-root .bk-bs-nav-tabs>li{float:left;margin-bottom:-1px}.bk-root .bk-bs-nav-tabs>li>span{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.bk-root .bk-bs-nav-tabs>li>span:hover{border-color:#eee #eee #ddd;cursor:pointer}.bk-root .bk-bs-nav-tabs>li.bk-bs-active>span,.bk-root .bk-bs-nav-tabs>li.bk-bs-active>span:hover,.bk-root .bk-bs-nav-tabs>li.bk-bs-active>span:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.bk-root .bk-bs-tab-content>.bk-bs-tab-pane{display:none}.bk-root .bk-bs-tab-content>.bk-bs-active{display:block}.bk-root .pika-single{z-index:9999;display:block;position:relative;color:#333;background:#fff;border:1px solid #ccc;border-bottom-color:#bbb;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.bk-root .pika-single:before,.bk-root .pika-single:after{content:" ";display:table}.bk-root .pika-single:after{clear:both}.bk-root .pika-single{*zoom:1}.bk-root .pika-single.is-hidden{display:none}.bk-root .pika-single.is-bound{position:absolute;box-shadow:0 5px 15px -5px rgba(0,0,0,0.5)}.bk-root .pika-lendar{float:left;width:240px;margin:8px}.bk-root .pika-title{position:relative;text-align:center}.bk-root .pika-label{display:inline-block;*display:inline;position:relative;z-index:9999;overflow:hidden;margin:0;padding:5px 3px;font-size:14px;line-height:20px;font-weight:bold;background-color:#fff}.bk-root .pika-title select{cursor:pointer;position:absolute;z-index:9998;margin:0;left:0;top:5px;filter:alpha(opacity=0);opacity:0}.bk-root .pika-prev,.bk-root .pika-next{display:block;cursor:pointer;position:relative;outline:0;border:0;padding:0;width:20px;height:30px;text-indent:20px;white-space:nowrap;overflow:hidden;background-color:transparent;background-position:center center;background-repeat:no-repeat;background-size:75% 75%;opacity:.5;*position:absolute;*top:0}.bk-root .pika-prev:hover,.bk-root .pika-next:hover{opacity:1}.bk-root .pika-prev,.bk-root .is-rtl .pika-next{float:left;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==');*left:0}.bk-root .pika-next,.bk-root .is-rtl .pika-prev{float:right;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=');*right:0}.bk-root .pika-prev.is-disabled,.bk-root .pika-next.is-disabled{cursor:default;opacity:.2}.bk-root .pika-select{display:inline-block;*display:inline}.bk-root .pika-table{width:100%;border-collapse:collapse;border-spacing:0;border:0}.bk-root .pika-table th,.bk-root .pika-table td{width:14.285714285714286%;padding:0}.bk-root .pika-table th{color:#999;font-size:12px;line-height:25px;font-weight:bold;text-align:center}.bk-root .pika-button{cursor:pointer;display:block;box-sizing:border-box;-moz-box-sizing:border-box;outline:0;border:0;margin:0;width:100%;padding:5px;color:#666;font-size:12px;line-height:15px;text-align:right;background:#f5f5f5}.bk-root .pika-week{font-size:11px;color:#999}.bk-root .is-today .pika-button{color:#3af;font-weight:bold}.bk-root .is-selected .pika-button,.bk-root .has-event .pika-button{color:#fff;font-weight:bold;background:#3af;box-shadow:inset 0 1px 3px #178fe5;border-radius:3px}.bk-root .has-event .pika-button{background:#005da9;box-shadow:inset 0 1px 3px #0076c9}.bk-root .is-disabled .pika-button,.bk-root .is-inrange .pika-button{background:#d5e9f7}.bk-root .is-startrange .pika-button{color:#fff;background:#6cb31d;box-shadow:none;border-radius:3px}.bk-root .is-endrange .pika-button{color:#fff;background:#3af;box-shadow:none;border-radius:3px}.bk-root .is-disabled .pika-button{pointer-events:none;cursor:default;color:#999;opacity:.3}.bk-root .is-outside-current-month .pika-button{color:#999;opacity:.3}.bk-root .is-selection-disabled{pointer-events:none;cursor:default}.bk-root .pika-button:hover,.bk-root .pika-row.pick-whole-week:hover .pika-button{color:#fff;background:#ff8000;box-shadow:none;border-radius:3px}.bk-root .pika-table abbr{border-bottom:0;cursor:help}.bk-root .bk-widget-box{overflow:visible;padding:5px 10px}.bk-root .bk-widget label{margin-bottom:2px}.bk-root .bk-widget{margin-top:10px}.bk-root .bk-widget h1:first-child,.bk-root .bk-widget h2:first-child,.bk-root .bk-widget h3:first-child,.bk-root .bk-widget h4:first-child,.bk-root .bk-widget h5:first-child,.bk-root .bk-widget h6:first-child,.bk-root .bk-widget p:first-child{margin-top:0}.bk-root .bk-widget-form-input{display:block;height:31px;padding:0 12px;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px}.bk-root .bk-widget-form-input:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,0.6)}.bk-root .bk-widget-form-input::-moz-placeholder{color:#999;opacity:1}.bk-root .bk-widget-form-input:-ms-input-placeholder{color:#999}.bk-root .bk-widget-form-input::-webkit-input-placeholder{color:#999}.bk-root .bk-widget-form-input[disabled],.bk-root .bk-widget-form-input[readonly],fieldset[disabled] .bk-root .bk-widget-form-input{cursor:not-allowed;background-color:#eee;opacity:1}textarea.bk-root .bk-widget-form-input{height:auto}.bk-root .bk-widget button{min-width:100%}.bk-root .bk-widget input[type="text"]{min-width:90%}.bk-root .bk-widget select{min-width:97%}.bk-root .bk-bs-dropdown-toggle .bk-bs-caret{margin-left:5px}.bk-root .bk-bs-dropdown-menu{width:100%}.bk-root .bk-bs-nav-tabs{overflow:hidden}.bk-root .bk-bs-tab-pane{float:left}.bk-root .bk-slider label{margin-right:5px}.bk-root .bk-slider .bk-slider-value{display:inline-block;font-weight:600}.bk-root .bk-slider input,.bk-root .bk-slider .bk-slider-value{margin-bottom:5px}//# sourceMappingURL=bokeh-widgets.min.css.map diff --git a/backend/web/static/css/bokeh.min.css b/backend/web/static/css/bokeh.min.css new file mode 100644 index 0000000..9e1b6cc --- /dev/null +++ b/backend/web/static/css/bokeh.min.css @@ -0,0 +1 @@ +.bk-root{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:10pt;position:relative;width:100%;height:100%}.bk-root .bk-shading{position:absolute;display:block;border:1px dashed green;z-index:100}.bk-root .bk-tool-icon-box-select{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAgCAYAAAB6kdqOAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIE1hY2ludG9zaCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpBODVDNDBCRjIwQjMxMUU0ODREQUYzNzM5QTM2MjBCRSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpBODVDNDBDMDIwQjMxMUU0ODREQUYzNzM5QTM2MjBCRSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkE4NUM0MEJEMjBCMzExRTQ4NERBRjM3MzlBMzYyMEJFIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkE4NUM0MEJFMjBCMzExRTQ4NERBRjM3MzlBMzYyMEJFIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+hdQ7dQAAAJdJREFUeNpiXLhs5X8GBPgIxAJQNjZxfiD+wIAKGCkUZ0SWZGIYZIAF3YVoPkEHH6kojhUMyhD6jydEaAlgaWnwh9BAgf9DKpfxDxYHjeay0Vw2bHMZw2guG81lwyXKRnMZWlt98JdDTFAX/x9NQwPkIH6kGMAVEyjyo7lstC4jouc69Moh9L42rlyBTZyYXDS00xBAgAEAqsguPe03+cYAAAAASUVORK5CYII=")}.bk-root .bk-tool-icon-box-zoom{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAAgCAYAAAB3j6rJAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIE1hY2ludG9zaCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozMjFERDhEMjIwQjIxMUU0ODREQUYzNzM5QTM2MjBCRSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDozMjFERDhEMzIwQjIxMUU0ODREQUYzNzM5QTM2MjBCRSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjMyMUREOEQwMjBCMjExRTQ4NERBRjM3MzlBMzYyMEJFIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjMyMUREOEQxMjBCMjExRTQ4NERBRjM3MzlBMzYyMEJFIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+a2Q0KAAAAmVJREFUeNq8V19EpFEUvzOtmKfpJSJKDL2WiLJExKaUEq0eeikiaolZLT2lVUpPydqHqIlIo1ilFOmphxj1miKWWHppnobIt7+zeyZ3jjvz/bnf9OPHd8/9d77z3XN+94ts7ew6SqksWKX+w1GFiLjYdVSAfeAQ2Ag2sf0GvAXT4C/wle1x3lt9UOGBNk6BrYa+FuYIeAWOsmNviGqe6W+q081OmAGvizgh0cpjZ3RjGBFZBpMG+xn4wM8NYJfWFwNXwXrwS96RiIUTwwYn6AxMgb+FvQ5c4zOUxzR4Ce5GLZyo5LfSsQP2G5xQbKO+bWFfoLWinA1OAEcoM2rFRpMe5sloJWgtm4j0iPZcPhVdkOWxBWvZONIi2uc+5sqxbTaO1Ij2o4+5T6JdGy1SF4Kg2mLsi01E/oh2l4+5HTKaNlmTEe0ka40XyNqTsYnIkWiTwC16rMRNci0bR0hJ7w1veizqy9uB5D4ZDZKBtI3WvLCCJoT9E3jHny4j1DdmWOcbrWWjNYuGoqaL2kdmKayTztio7yzTJprz4A/9PuI3a8YMh5IKVC9fetxAY5rB79pNzXdESMJ/GrSjm8/DCTjAgpjQZCDDh5I+w4HuQBBHOsE9USty4KB2KF85m9J+v5XX9KXr3T7fQZS26WefYlcU+ayJlxhDIT40jBnn21hQOPrfgFtEqAhdGETqK7gZ4h/Av4g4Jf5TUoYquQSuqJDhFpEJca3b4EoYOtyyhrSkHTzlcj4R4t4FZ9NL+j6yMzlT/ocZES9aky3D3r6y5t2gaw3xWXgs7XFhdyzsgSpr2fFXgAEAmp2J9DuX/WgAAAAASUVORK5CYII=")}.bk-root .bk-tool-icon-zoom-in{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAgCAYAAABpRpp6AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4AcRDi0ZzsqC7QAAA5RJREFUWMO9mE1oXUUUx39z8/K1aF0JSqBpoFBoIgYKVqFQEQuCYDePTjqSjKIroQhCs6oF3SgK3Yi40EVvhasDAaHQVangqiJ9pFoUK8FCJSAEhIL0I8nLdTMpk+O8vLnX5x0YeOfcc2b+c+Z8zVNAC9ikwZEXbgh4BWgDB4FZ/+kGcAtYAi5Zo7tSVzUNOC/cQeAi8Ewf0R+ABWv0rZCZNWzZd4DlBLB4mWWvs8PCQ0C3AbAfAWcin64At/3vKeB4ROZja/TiNuAM2PqfwWrga8G+BJy2Rt8RsvuAT7yPh2POGu3U6NjY0MMHD7oDAKWs0WWEPwL8DkwE7MIa/Wqf9S4C8wFrBZhuHZqeUcud6/3AXAFeDFg/W6Nn8sJl/paGgf154bas0b8J9bYAewd4K8EGp4FjwD5PHwDarcnJ/fQDDLwrAB8AsEZvu1IX+LWH7suCPmuNvttvQ2v03bxwZ31GebRWtmfv3q0E5e8Fa7iCtxwW9LcVdKXsc9nY+HiZqLwpskvqeEIcfrWC7pqgJ7LPP/u0pMGRF+7xCuJSdr2JwvGnoI9X0D0m6NUmAHcEfcb3EilDFppOS1zXTZ8BhiN+Gh5O5YWTwVoqpTaAlYVTJ2cC/mXABPQs8AGwmFAZZwX78g7ASqnpR7uXpVJKlQEda5x20GVZjiqlpgR/CXhvOxUGVn4KeFMGYV64CeAL4CWxzm1gSQnhrdQMEB5m+4Ce/9PCqZNPJ5RmgPveZTpBCjwMjEdk56zRLuuTxsKJALgZTqD080YkjzvgfGSPceAo8LafR3uAPe/XQLrEVaWyc/Nz7Wve0mVgpY1AvrRGj/zL775yR4DJHgZYBP4CzgEjiUG3DrwPfFi5AEQAZzXz8PVI9evVwL9ujf4lZLYaLhqHImA7Aa/jg8sB38SeSI0CBl4T9HfW6OerLFDlWsPDlTWsOyTyMcCFqutkeeFUwmbPCtZGDeu+IPri+z5HU9XCKYE36fvSm36jlRqA35AFxRr9d9VFWn6u9+mHnQ+EusH2WOSN9mWdtZIA7/aO8zc05p8yo9boHyOibVEQVis28jsAP8wLlwXPneThH50lcC8v3B/eXWJjXtBFLGUl+bBXHESbeS926LxwU5G+9kLdTTJvqc2UbJFg7RTrdmT1qp2H/bN90GN+EMHWs5eo68+7/PG3HARcF3jSGr02MMBB9O92zVVTmvZlec0afeK/rPcPRydBWFnJL+gAAAAASUVORK5CYII=")}.bk-root .bk-tool-icon-zoom-out{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAgCAYAAABpRpp6AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4AcRDi4PETNkfwAAA0xJREFUWMO9mEFIFUEYx3+zPlMP1SkoBE0IBDUShCIIikAIgro8GpvQKeoUSBDkKYK6FAVeIjrUwS3YWhCCoFMUdArCh1YUFZJgCIEQBFFqPrdD82od5j13n+/twMD7vv3m2/9+883/m+8JIAcsk+Hwg7ABOALkgU6g1zyaAj4C48BjrWTRXiuyBuwHYSdwD9i9hukrYEgr+TGu9DKO7HlgMgFYjM2kWbMqwg1AMQOw14ELjkdPgRnzuwPod9jc0EqOlAB7wEqdwUrgoaV+DAxrJWct2zbgpsnx+BjQSoaiqbm5YXFhoVgDUEIrGTn0G4DPQGtMHWglT6zh7x4wGFNNA925ru4eMVmYqBakZ3apEdjuB+GKVvKTZZa3wM4CZxO4Hwb2A21G3gHkc+3t26kWsFaylEpF4EMZs8OWfFEr+T2B7+9+EF40jPLPl7dx06aVOp+3Pkt+nmKtbbvXa25pieoMeKsVubkUa+ctudW7c/tWvQHbeb8lhbltu5RF4fhqyf0p1u635LksABcs+YK5SyQZdqEp5Kztemvoo9HQ1f+SKP6KURSJMs4jIcRvYHro+LGemP4JoGJyL3AVGElQGXst9ZOcBar739ujSAghXPldDrCIoqhJCNFh6ceByyYQ8SjvBM7Yh9APwlbgLnDI8jMDjAvLeKUCoNJHOQ9pKfJCiDdDx4/tSlCaAX6ZlCnEKLAPaHHYDmglw0o5vFxpRlG0agKRmVOOIhACo453tAD7gHNm7isDdtT4wE6JZ0J4lwYH8i9NpFNRnv8g3AO0l3k8AnwDLgEbErpcAq4A19bKx3ry8ISj+pW7wJ/SSr5PcoDqBbYLeOegvb7Y7xkgBB65WqRcxgE+ackvtJIH0jjwMoxug8XHAGNp/Xh+EGaVFgete/Evw9GkjXBWgE/bBUUr+aMawLkM0mGzo0e7X42vnJlL1fZxZoeaTSvTpJV87TDNWwVhLuVFfhXgRT8IvVi7k6ZFKlW3n34QfjF56RqDlhy4KCtRSpiFtWCLn66P9oOww3GvHav2JZ6J1PJ62cLV4peJbsGuXlXzsGnbaz0Ga3HYypbmavO5wh9/k7EDVwS2aSXnawY4dvorbXNaSpOmLM9rJY+ux98fNUQlTNeDDboAAAAASUVORK5CYII=")}.bk-root .bk-tool-icon-help{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAABltpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPHRpZmY6Q29tcHJlc3Npb24+NTwvdGlmZjpDb21wcmVzc2lvbj4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24+NzI8L3RpZmY6WFJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOllSZXNvbHV0aW9uPjcyPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MzI8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+MzI8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPHhtcE1NOkluc3RhbmNlSUQ+eG1wLmlpZDpBODVDNDBDMzIwQjMxMUU0ODREQUYzNzM5QTM2MjBCRTwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDpBODVDNDBDNDIwQjMxMUU0ODREQUYzNzM5QTM2MjBCRTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOkRlcml2ZWRGcm9tIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgPHN0UmVmOmluc3RhbmNlSUQ+eG1wLmlpZDpBODVDNDBDMTIwQjMxMUU0ODREQUYzNzM5QTM2MjBCRTwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ+eG1wLmRpZDpBODVDNDBDMjIwQjMxMUU0ODREQUYzNzM5QTM2MjBCRTwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgPC94bXBNTTpEZXJpdmVkRnJvbT4KICAgICAgICAgPGRjOnN1YmplY3Q+CiAgICAgICAgICAgIDxyZGY6U2VxLz4KICAgICAgICAgPC9kYzpzdWJqZWN0PgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxNjoxMToyOCAxMToxMTo4MjwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+UGl4ZWxtYXRvciAzLjY8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+Cphjt2AAAAT7SURBVFgJxRdbaFxFdGb2bhui227BWrsVKYgf2kJUbP9EUPuzEB803WTXJjH61Q/7Ya1+CMYKEVTsh4J/EpvY7BoabUiNiA8s1p+4KIhpoUUEselHqyS76TbZ3HuP58ydc3d2u4+IkQxczpz3mZkzZ86VYpXjvenpjZsLhUcliE4AuUuASAgptmt1EFdwPiclzIIUUwubNn17OJlcXo1p2UpodHRiux9xB1Eug1+slbzhFxGOKc851tu7/0oznYYBDA8Pt0U2tL8KQryIq2tvZqQhD0QJHRz3yqWhgYGBpXpydQMwqz6NCnurleCSADkJEfgKfOePqL80R/wV1ZaQyr1LenKfkPCkEPKeaj0xg7vxVL3duCmA0Vyuw/fl52hgBxsBED+h4Cv9z3R/zbRm8MTJTx7HQN7GQB6w5C4L4SX7M5lfLBpurjXMyvNIShiyi0l1pL8n9b7EDGPR8fHxzSsQ6XDB3618/xqo6Pk25V5MpVJllgHM1BO58RdQ612kOYZ+GXdij70TYQB05mpj+1kU5G2fB+l3PZtOf8NGx6ambnMXb3yAxg8wjSEG6OKKR9oicBQD+ZvpH2Wzj0lQpxCPG9qMv1x6hHNCsSAlHM7ZOa682vlI9tRDbvHGbD3nZAPpDoD/3JIrLpAs26UFkC3EMUA99hpfGtEBfJjNJnS2Gwnadnvl+Xw+iuc3DAJuNyIaSCHpilVldyDjjUxj3WDZIAhxhHHyRcdNuA7AAfUaXzVKODpzFiZ4/uLvh5G+m2no+C/pyIf7MqlEJB7bpqR6nXkEUfbeawuLaZsW2ISfNQ2vtaktQlGFQyIVGT0o2+2EC4iQNGwjBIN9qdQ5Qg4mk4X4rW3vCClLtowE2FOFUxKDfNmiZci3ovKKRFPh4FK9q4Zbdr+lKKJiA13TcHR2dmLBgdmQ0GAS2MZaEowY+XbAk09IvgtYZGp16SyvFhaHcIUh645t8T9DBCcnz5zZ4hZLu3DzK2QlL1QQa0Y+pHiJKPSuOGj3PmZTheM5w2TwqBxnvBZOTk7G5gvXJ5Aelms8wnJURL+olSWcfEhf6gDoUXPMq6ZlqbzWU2pE+3hi4s6F68tfIj9cBMlikr7Z0/P0b/X0yIcUXsDCF1WhtL4OROHaXk+xlkbV0Cu732Nmhc4peaWSg73pA8dq5RkvO37ldUTfXCKZv2q45MkhvG87WQEzpCCUSvV1d9GONBy3lMvgKSwrZig8gjAietWY0QriylO2jIo4yVbOSb7KB/qmI9BPKjHpSSXYauRyn92Nq9/Kcrj13x3s3v8D481glQ/0raiNYgX9njPSBOImbrHZePl+tfFmc9sH+Xaoh8NjOKSVdDMhjjYzQLy+dFceH5+IJQf9VYXX4tROg4ZFU8m31M3mfPEqUoJqCGJfvWpo2xnNfdrhC28n06SCeSzNZxlvBINGRXCtKS7EY1uV6V7HWAm38y1cXaXsMcOCvr9ySPj+af7A1U2HJXHzVNvUXVLIGyPf+jV0pf8GHoN+TLAyPkidTCi2RpPApmnR0Bd1zGRaB/B8Oj2HSw7LLbVR1MmskW8RdEWVXSJf3JbpAMgRtc4IZoxTh9qotQjCasm46M0YX9pV1VmbpvRH5OwwgdRtSg2vKaAz/1dNKVtb17Y8DCL4HVufHxMOYl1/zTgIgiYvBnFKfaNp3YjTdPz3n9Na8//X7/k/O1tdwopcZlcAAAAASUVORK5CYII=")}.bk-root .bk-tool-icon-hover{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4AoSEhIO6t4cXQAAAI1JREFUWMPtVjsWwCAIUx937NClR3Nx8JT2AlVATe0HRhUSSPTpnMXfw18txpQLAuzYN88SQIHXSJCWcU+0mgpocK5WWG1CGhnfaPfvmMBML5gHzAPmAfPAIycQUNpLa5EmUSqHhrz6S8aR0OaS9KBWEoh5Y8qlRYTbh5K4BbwGNgLuZ10t9IO1TvPPxwnW4GRq8RbypgAAAABJRU5ErkJggg==")}.bk-root .bk-tool-icon-crosshair{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADEUlEQVRYR81XXVIaQRCeHqug8CXmBNETaE4gniDwIgpVspxAbxC9ATkBkCpQ8gKeQDiB5AQxNyAvUlrldr7eHxyGXZi1rMJ5opbp7m++7un+htSGF204vsoMoNXrlzSpfWa1oxQfhAegCZGaEtPorHo8znIoJwCt6+td8uk7ApUQCIHTF4BNAWzImq8ap6cP68CsBdDp9i9ZqXM7ML79g/EnCWD+jgMKENKqWT+tXK0CkQqgNRjs0OxpQIqKhoMxaG6/6JeRnK7T6yO2UvVqhYSlLX+ryORfgKn9ORDFIy7ky41yGcwsr0QAQfDH5zucOswx819fs4egI9OFCcD8DjBF7VNbEX0JzdWEt3NHSSASAcCxBDqMgt/623kvyTgNgNjJIfTjk4D4FqaJR1715MjmYAmA5Bx3AwUXQL+t105KaTlcBSC26XRvhjEIoLiq1yqXpr8FAGG16/ug4IT27fxBWu7EiQuAiImJpEMKE6nYM30uAIDDttSUOPfJP7JzbjPhAiBIh9QE67vIvoOi9WJfCwDavf40ulpjbCqmUf+W753ezURuh7Dg1SqflwAEHU6pgfyBq9Y4qx0LG++2fnZ/eUzcstmdM2AWH+jfc+liWdBJfSENf8Lifi3GVwC9mybOfi5dzatWVrbbLIHNva8p5h/16gkaFiLGGxbufkoE6XguwePiXLF3XmMfCUCUAqtKXU7sumd1CowOuJEi3Pg1FBpjitIGhyvVSfvmjci6ZR+rFQfDiPVE2jFYeICQ+PoewwjC5h7CZld6DBdyu6nDSKgzOyIMhmhK5TTqXYbRorZYM46TmpKAAOrGWwSJJekSB1yqJNOzp1Gs7YJ0EDeySDIMtJbQHh6Kf/uFfNFZkolJICRmz0P8DKWZuIG2g1hpok+Mk0Qphs0h9lzMtWRoNvYLuVImUWrmPJDlBKeRBDfATGOpHkhw670QSHWGLLckmF1PTsMlYqMJpyUbiO0weiMMceqLVTcotnMCYAYJJbcuQrVgZFP0NOOJYpr62pf3AmrHfWUG4O7abefGAfwH7EXSMJafOlYAAAAASUVORK5CYII=")}.bk-root .bk-tool-icon-lasso-select{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAgCAYAAAB6kdqOAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo3NzIwRUFGMDYyMjE2ODExOTdBNUNBNjVEQTY5OTRDRSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1ODBEQzAzNDQ0RTMxMUU0QTE0ODk2NTE1M0M0MkZENCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1ODBEQzAzMzQ0RTMxMUU0QTE0ODk2NTE1M0M0MkZENCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1LjEgTWFjaW50b3NoIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6OTU0QzIwMUM1RjIxNjgxMUE3QkFFMzhGRjc2NTI3MjgiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NzcyMEVBRjA2MjIxNjgxMTk3QTVDQTY1REE2OTk0Q0UiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7r0xDwAAAC9klEQVR42sSXb2hNcRjHz50rt1aslNQitSimq6VESW6SFMvFyJ+UknnhhVhkRIkX/iRbSPMnyt95sblZFvMC02patEKtaE3Km1taqWlxfZ/6Hj39+p17zr3nHJ76dO4953d+53ue5/k9v+ck2jseORHYRDAXpHmcDSar84McNwLegwHQa5soGULENFAPMmApH+5laXVcw9/fwA1wDYyFEbQI7FITl2vTQTPYDnaCj3KyooQJVoNu0BmBGG0zQc71YhAPzQEnGRY/+8R8+QGGVCjcXEqBZQy3tkrQBpYnfRL1EGgEEzzGSB48AT2gT+eCj8nLbQCbDU9lk0USto35Ytov0MWE7C8zTL3kKbiiFsQqWw7VcaBNzD2wGOwJIUabePeB+l9tCloI2i0xlnCsBAfAVyda69Pe1yGbBW4ywVwbB2fBRSc+0y8/5AqSpL0KpqqLo2BHRKHxMnnuFvW/xxUkD65VF76DBpb5OG0vy8rfFVtBrzQbA/f9AzFZ0KT+t0iKiKCNRt7kuMriNAlTq6pvkti33Eq9whh8N0YhUqlPcP9ybRjs1pvrfEv5j8NkyzgFatS5PNjKo+NurinjxtqIhcgedh3cN8SIZ9by6GhBI8YEkuBVHpNXlyAkQyHP2SloG7CJcQW9tOzu3VwFlVyFl8Bn8AZ8AMctnk1RxFHwDtyxCBG7DNbrMGlLoIWVXfaVR8f3ExQsDxf7wpeZwp067eMxaUsOg7fFBiUZsiPgjOX6pCL3zgDbAvZIp8HjIHF2K/VturDVqElhrJ8tShdbFqcUQW4rIK3FfrCpTGHS47wGHZbFEsjM9iPP8M3j/pYPOI+smgV8kZZyxRRr8sfZlh4LOI/0UReiiLPfV4e4/pwlB3571J3GsIKCfHWcp7cyLIzyNfGCHqkzxjaxzR0tV1CiUChYLzzszPndKx3mM0vyH+SqdRrW1UfnIT2Zh7hhtilZ4/wSV1AcOeRntmJXE2dS+9mg5VzV/xRkq1NjYSb8I8AAdTOa+zQjMmsAAAAASUVORK5CYII=")}.bk-root .bk-tool-icon-pan{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIE1hY2ludG9zaCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpCRTI5MDhEODIwQjUxMUU0ODREQUYzNzM5QTM2MjBCRSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpCRTI5MDhEOTIwQjUxMUU0ODREQUYzNzM5QTM2MjBCRSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkJFMjkwOEQ2MjBCNTExRTQ4NERBRjM3MzlBMzYyMEJFIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkJFMjkwOEQ3MjBCNTExRTQ4NERBRjM3MzlBMzYyMEJFIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+OXzPwwAAAKNJREFUeNrsVsEKgCAM3cyj0f8fuwT9XdEHrLyVIOKYY4kPPDim0+fenF+3HZi4nhFec+Rs4oCPAALwjDVUsKMWA6DNAFX6YXcMYIERdRWIYBzAZbKYGsSKex6mVUAK8Za0TphgoFTbpSvlx3/I0EQOILO2i/ibegLk/mgVONM4JvuBVizgkGH3XTGrR/xlV0ycbO8qCeMN54wdtVQwSTFwCzAATqEZUn8W8W4AAAAASUVORK5CYII=")}.bk-root .bk-tool-icon-xpan{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4AoSFS02n02YegAAAG5JREFUWMPtlDEOgDAMAx3Ezv9HFiR+By8ICwOKoBNWPPikrsk1bhrrtqOTCc1YwAIWsMCbQN7nbxLAITeBuRiyWR59QmYCOciMSXoNZd5AfGQejMxrfakIgnDryln7SP2ErOyHdb2GFrCABdoFLtthDii1Jv8gAAAAAElFTkSuQmCC")}.bk-root .bk-tool-icon-ypan{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4AoSFS0IXiyF0QAAAHFJREFUWMPtlrEKgEAMQxN1PP9/dhH8Pj+gri5yGkrBI9laeuURrhBu+wFRJ4B2q6ksmaCrIUGL8CY6fVY5gGoH4uMch3OAHUfKryBFBjCAAQxgAAMYwAAGyEzFUkb8ZSqOl3PjfkICWB/6rLqCOcuBCwLtC1jsosQGAAAAAElFTkSuQmCC")}.bk-root .bk-tool-icon-polygon-select{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAgCAYAAAB6kdqOAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIE1hY2ludG9zaCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpFMzNBREIxOTQ0MUExMUU0QTE0ODk2NTE1M0M0MkZENCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpFMzNBREIxQTQ0MUExMUU0QTE0ODk2NTE1M0M0MkZENCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkUzM0FEQjE3NDQxQTExRTRBMTQ4OTY1MTUzQzQyRkQ0IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkUzM0FEQjE4NDQxQTExRTRBMTQ4OTY1MTUzQzQyRkQ0Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+xB9jgwAAAe5JREFUeNrsmL1LAzEYxu9KUVDBW8RBhRscXNSCoyA6uIl0kYqIXFcXBRdBoYpuDi7iYEFbkFZPpX6sin+BtAhODloHRZTaSkEUUZ/A23rUer275mjFBn40hJA8eZI3ea+iGjn4FL5LCkigHiQ5trM5HEPuQaFQcQhlVpy0GoFWpF2hmKe/lfaUWUHZYsRSM2Vn/9CSQ5LNu2Bq/LI7Qw6KgqSNc5gavywdqgiqRFklyv7doS7q7flrUbYImkG61FvmAU9gBvhLHWUrYIucfwdxM6kNL4fqwBzV18AHOAaNYJo1BsOqDFyiKAp68BA0Cx6BD4yDc8ql+0FC008Gp4HQtttOh6JgAVSDF/BM7WmdZyQCUct6giSTkdYCpqjup+0JghqwaXCMSYhibknFOFQFwnRIl0AbWKXtUSy42wuuIMplNcoewDB9XdyB2gLbYzQTiEKUYtShHjBK9RM6JxOgCZxxvCo2IIohOX/pwMJ1D3STCBWMgTeCZyYQI+I/3jKNmFuNe5d0zyRsSt68yojnOl+UeUEXuAc3dLew67WTs5gYzZUpvtxD3UEurINdam8HDeCIsyNMTB8cCeA344qCsyNrBbFOrfQPxQWHyCkkJhPR8/lcYoJe6XJj98GAXXkIE6IRI+S4lHXoS4ABAP0ljy6tE4wBAAAAAElFTkSuQmCC")}.bk-root .bk-tool-icon-redo{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAgCAYAAABgrToAAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3wwGEDEBYlsi0wAAAYBJREFUWMPtl71Lw0AYxn9ppVAodKoUBGfHDtJJR0FRFAc5uMEbBFcdBcXi4G5Hhw5ZAkFQHASho07i0L+hUCi4KBSKQsHlLYSS0iQ0rcI9EMjHfTz3e58LCVhZWf1vOVEbup6fBTbkWAOyQEUet4AB8Ao0gabRajATg67nl4ErQAHFiON+AT5QM1p1UzHoen4eOAdOgELC8XtAHbg2WvWnZlCoPQLVKUXpDdhLQtMJMVcRc8sh7TvAA/AEfEj2kCyWgG1gH1ga03fHaNVKbFDIvYdM0AVqQGNS+GUzHUluyyEmV+OQdAID54CXkLI+AwdGq16clbueXwDugM2Qcq8brX6ijLMQOL8MMVc3Wp0mCZ0saMv1/BvZaENVZa6Lqb4Hk0pKfg/sjuzuFaNVZ1L/TNoGJbOHkr+hCsDZnyAYIHkM3AZu9YHFSdnOMDs1gHbgOj9S9tkTdD2/CHzGjIQzL4Lpfs2kTXKUnCU4hmQO+I5Cbl4ES/YfwcrKyiqefgEvB2gLTkQWKgAAAABJRU5ErkJggg==")}.bk-root .bk-tool-icon-reset{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAgCAYAAABgrToAAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIE1hY2ludG9zaCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpCRTI5MDhFMDIwQjUxMUU0ODREQUYzNzM5QTM2MjBCRSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoyOUMzNDE3NDIwQkIxMUU0ODREQUYzNzM5QTM2MjBCRSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkJFMjkwOERFMjBCNTExRTQ4NERBRjM3MzlBMzYyMEJFIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkJFMjkwOERGMjBCNTExRTQ4NERBRjM3MzlBMzYyMEJFIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+kFHGtQAAAm1JREFUeNrMmE9ExFEQx3+7ZYmlLrEsUUTHaEV0iESJVqduXaJr1xKlFB1bdYqoQ9GlFBFdikgpIhLd0rLqUsQqrW2G7+YZr+2993vaHT6H3583M795897M+0U2t3cCR6kh+kA3rtvx7IYoEGfEMSi4GIk4OJgg5ogRot5wzBvBhmaJnI2xqMW7dcQC8UCMWzgX4N1xjF2ALq8OctROiGkiHrhLHDpOoNOLg5xXF0Sn5lmWWCUGiBRRC1K4t4p3pLCuKyVnnXMwAUVJcT+HfFo3SH5ePGPI24TmA1Pl8rJcBGPEvsa5I6KVWDNcmQW824qxqiRhI+bi4IxmWjOYuneH/HvH2Ixmumd8bjNhhad8lxgSzrfp8jUa/L/wlI8KZ3h1T4bdB30Kb9zz4t6YbgurlIMBdoBHUQiGTBx8JYoKPqVe0ftFNInnW8J20SSCjRWM8k8E1S+TNfbZYyQ59yJEg0kjw1QyB42k1iI6ReXLfEWSK8iHJnJVsYqN8jtammuFc/FOr3juU7Ia+39uM7fiuq8aVrEqp+J6BPWzahw8IPLKdTPKUNU4yJ3Fhqb1inu0y7qeRNVYsWkWFkXPl0QZ8iVbohFmW0s2DmY1jSUX8mUPzi1rmoLML2eXsvsgR/FO3JtAix53nNZ96FDlDrasW35eKGniRRPJeywck9VdOjTdayL3Ahv5MC1/xy+Hp1Iq7BGHMHatjOEqMUgMlxmbVsaEOpMk4GSnp0VyCedyLtuMTlhRD1ZaPoRjeejoMf1HE7VUPkW04Jz7Ztm9rGHslM1Hhjl2xlCn+4muQP/77RyHdf799uli5FuAAQC+l5Sj5nEBdwAAAABJRU5ErkJggg==")}.bk-root .bk-tool-icon-save{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIE1hY2ludG9zaCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozMjFERDhENjIwQjIxMUU0ODREQUYzNzM5QTM2MjBCRSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDozMjFERDhENzIwQjIxMUU0ODREQUYzNzM5QTM2MjBCRSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjMyMUREOEQ0MjBCMjExRTQ4NERBRjM3MzlBMzYyMEJFIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjMyMUREOEQ1MjBCMjExRTQ4NERBRjM3MzlBMzYyMEJFIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+h5hT8AAAAKBJREFUeNpiWbhs5QcGBgZ+hgECTAwDDGAO+AjEjGj4Lw5xUrAAkl3ocr8IhQAzjT3PRu0o+I+EHw65NDDqgJHrABYC8t9JMIuRmiHACS2IKC0LOKH0X1JDAOTzs0BsBs3XlIKz5KSBRCA+RQXLjwNxNDlp4BoQm9Mo7fGPZsNRB4w6YNQBI94BfwfaAV9G08CoA9DbA/xUavkMvRAACDAAaPgYViexODkAAAAASUVORK5CYII=")}.bk-root .bk-tool-icon-tap-select{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo3NzIwRUFGMDYyMjE2ODExOTdBNUNBNjVEQTY5OTRDRSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpCOTJBQzE0RDQ0RDUxMUU0QTE0ODk2NTE1M0M0MkZENCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpCOTJBQzE0QzQ0RDUxMUU0QTE0ODk2NTE1M0M0MkZENCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1LjEgTWFjaW50b3NoIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6OTQ0QzIwMUM1RjIxNjgxMUE3QkFFMzhGRjc2NTI3MjgiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NzcyMEVBRjA2MjIxNjgxMTk3QTVDQTY1REE2OTk0Q0UiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6eYZ88AAADLklEQVR42rSXf2TUYRzHv7tuGcfE6Vwb5zLSSjEj7Y9KWqfEmFZJP+yPMdKKmUrrn0iUfjhWlLFi6YfNrF+StBoTo39iYkTGco4xxxG59P7k/T2PT8/37nu3bx9ezvPj+zyf5/PreS78bGLS8SmrwE6yje3NHJsDBTALpknBz6JhH3NiYAB0gHqPOVv52wJ6QQ48BzdAttTioRJjdeA8mAHHS2xuk3p+M8M16ipVQE49Ds6CiFO9RLjGONf05QLx6wPQaBlbBlPgJVgkP0ETiIJ2sB/E1XfimjfgBOOlKDUqCGOcqBcQnw6BYW5YTo4wbvQhMmCfGRemC2rBiGXzWUb+kM/NRZ6CHWBM9ce5R61NgX6ayhSJ5EPlItlDRNkz4JbFHf06BkSzHjXxM+gDv1S/mPUo2AXWgt9UUHL/IVhS8yUV1/EbV3o4N+NaoE9Fu/i827K5pNYHnqAVJECShWmAaddpscYFFXwR7vnXBRGlnUN/L6kqKJlxnRUuDbaDBiL+vst5d4gpcpBrqk/2jIgCKVUolhntplzivHmwh4stGOPfwBWwl/2dpp8p7xjQZqFLiQJtauKkivYm+kzccpK57yXfOUe+P23JqAnVbhMFmlXntCWnxbT31am9ZJ4BJifsUmNTqt0cYhA5ypympPg7VkEKunPbVb8cIG+0kyHLJZNR7fUMooUKFHAPkfQo58VLK+RzwRDd4FdWG9mjpaAXzqkJa1R7kQttqEABWXMjOOxxVRfnhRm5URX1prk/0pQHwNcKlchZ+jdpC+hFdVqO0my9Hj5dkYgCn1Rfh/KdlNDHrJhPqlDih+IfBd6qwpOgEqYMsorJ2HtWxtagLJDn/W3KRfPOZhoeBJfZPgVeGKeKrkQBh5dLXl25Ny3pc4/1fkTdbvFqFQgbxWeYD0hXulhQ0pYiM1jG547fcbMQpVnHTZEn9W3ljsCzwHxCdVteNHIZvQa7/7cC7nV6zHIfyFP9EXjFa7YxKAVqPP4bxhhoLWW+z9JyCb6M/MREg59/RlmmXbmneIybB+YC/ay+yrffqEddDzwGvKxxDmzhc0tc80XVgblqFfgjwAAPubcGjAOl1wAAAABJRU5ErkJggg==")}.bk-root .bk-tool-icon-undo{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAgCAYAAABgrToAAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3wwGEAgO/GCy+AAAAXlJREFUWMPtlr1LQzEUxX+1ohQKuhQK/Sc6SCcdBUVQFCSQwQwOjjoKisXB3a5Ch7c8CA6iKAgddRKHjs6FQtGpUBCEoksK5RE179FPyIEs+bg59+TcJODh4THdSA0qUBDqNLBq2jKQBopmuA50gWegBtSUFN2REAxCnQfOAQEsOC5rAxooKylaQyEYhDoDnACHQDZhmA5QAS6UFJ8DI2hUuwVKA3LIC7BlUzOVgFwRuAcKluEmcAM8AB/Gexgv5oANYPuXtQ1Dsp6YoFHu1bJBCygD1f/Mb4pp3/g2b0lwqV/JVAxyc8CT5VgfgV0lRSdmslngGlizHPeKkuILYDZGzDMLuYqS4iiJ6UxC60GoL02h9VAye506KxiEugC8Rar1Dthxvc+SYsZx3nGEXBPYGzY5JwWNV96BTF/3gZLiahRPnYuCmxFyDaA6trc4CPV3zBiLSor2uD04eb8ZByWHqtz0K/iHkvO9W35SqjiKnP/ne3h4eIwOP9GxagtPmsh6AAAAAElFTkSuQmCC")}.bk-root .bk-tool-icon-wheel-pan{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAgCAYAAABpRpp6AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4AgeExIQIQWn0QAABMFJREFUWMPFmG9olVUcxz+/c7e76bw3CXxlyqppoQRFr/oDmkEGRlHU9M72R42LxqIIiszRnBhJUhSJ1QPL7S437/YihCTthaxeJARBIBtpYqH5ai9a+5Nz8z6/XnQeezzc+9znLlY/ONzn/p7zO+f7nPP7L739eYrQLUAzsAl4wP4HuAKcAfLAF0ChmHBLppEoyg0MEoeKrWOKzNsFXAQ+Ah4PgQVYDjwLDAE/2Q+qiOKCLTU3DHgRcAw4DNwaY70G4Etg/0KALSUTBvwpsJnKaQ/w1kKALSZbZX+zVmfDVAC6rb6eAa4CDwNPW7VZFJrbBXwPnKwUrKunpebmBgZpyTQivf35JVYfl4fejwFPWBDF6C7gK+D2EO8scB9QCIMoBaAl00ju2FCTqt+FUgV0tjZtzpWTM0CTA7YAPBUBFuAc8BgwFeLdY420LM1Mjlf3HB3YieoLKHeKSD2wrefo4E7P86qjZA3wpMPrsypQji4ABxzepjhga+vSG0VMM/CIiAiAiKwX0ebauvRGz/OqS7lGA9zr8HqKzHvZDop8XJjWlQNck0qtVjFdQIOqTgR8+9ygYrpqUqnVUSe8zOGNOv9fAz6w41Xn3SVrjAEtKwe4NZMZQQotiL9BlEMBX5RDiL8BKbS0ZjIjpeSrgKTDm3VcVtjPvgckgIOOga60z8k4LioA1NufvySW7+NfbosAGhXpSoEN6F176sQ1MKWwdr4++HpB1sxMjlfHAfw2ICXGwTibeZ5XXVuX3ogmcmHQcYOIUlibMNqdTKUeDUAbFpCSdakdKrIb9Lb5RzetF5WOZF1qRzjSUeHV7wM6Izc8NtRsTKIReFBVJ8Q3TSp6KXjf259HRNbfuGqTWNfbn9fwGqJmpQqLRcxDoHOITEcBft0a4B6H32HVJfo6fX+fDQiISBrhTYkW2SIiW27iyN/6F/hp9f36qjL7doQMMPiIg/yPVBVjTocN138A71ewdqeqbhOR9ao6IcohH//yTS7KJNYBW2zgyKv6wze7MLNChXYRSavqMHCkKu7mlZ5Ea9PmXM/RwcWgSaBBjd/flsmMhD2EqmqgBqr+sDGJT1wvgZrtqpxVlXzb1sbcgnqJ2enxblF9B+S3+efE8quK7J+dHu+OqxLzpmw2O+d53qmaVOqXVud0Y9ZwI599PrTj+p+//5zNZucWHHAAGhiZb8Wx/fnnRl2jm3VygGSFay4rkYdERrDAzwZ+y2BW9A4MrL2RIEXkEmMOb00FYFc6pdJYLLCayKHmtArtN/hCO2pOo4lcALwU4B8dXnMFgN2535Sr6a5NTp4X9TuBCyKS5p/AkAYuiPqd1yYnz0cBPuHw2mzzJE6Z/4bDO1FOqDa1dG5meuKUivT5yrchFzesKn0z0xOnAgMrFTj6bNUb6GICOF6mCG0AvgaWOCXTyTjXUptaOnfx3KhXv+ruOUWCXPpI29bGXJxIN2UDw2HHkL4DPFvmB1d9v+1dtDu6C/BSsdZVKe+wd+9e37YRuucTmj8GNtg2FKGT3mVHOToQ93Tj9N7iVhwttsFXKX0I7P6vkp8w4KvAM3bzqRiyV2zi8spCtKcqqekOAHfYLO2HIu2rk8CLwCqr3xVd/b9RB4C/ACaltuFyjACwAAAAAElFTkSuQmCC")}.bk-root .bk-tool-icon-wheel-zoom{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAgCAYAAABpRpp6AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIE1hY2ludG9zaCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpCRTI5MDhEQzIwQjUxMUU0ODREQUYzNzM5QTM2MjBCRSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpCRTI5MDhERDIwQjUxMUU0ODREQUYzNzM5QTM2MjBCRSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkJFMjkwOERBMjBCNTExRTQ4NERBRjM3MzlBMzYyMEJFIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkJFMjkwOERCMjBCNTExRTQ4NERBRjM3MzlBMzYyMEJFIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+sFLapAAAA8xJREFUeNq8WH9k1VEU/+67ecTYxKM8xlJiifKIMUqUKMvy1CqbEmUxJZbSlGXTLBuJpYi18dpqStOzacT+WcTXpkiRUjziETEeY9bnzHm5O53vj/te7fDx3r3fc+/9fM/3nHPPvWWP0mOOIlVAC3AQqOc2SRZ4A9Cg58CSNrj1+FEnSIYfPynHTyOQArYCO/jRPPAJGAcmMM9f87vKfG3AF+AucMAgS5LgRZ4CH/mFrARkieAs8Aw4ASSBckaS++jZLOv6El4HjAKDwPoIa28GXgLdFmQv4WcO2BVBnXTmeIxK+D5wzLGXa8D1CGT78NPPhjFlGnjAmBbPSLefx65IBf+eZZ81hfznIfsr+W0eaACa2G3MhbuAt8CUD1kyRIfongDa4affhW4Nu2Oj0d2Bfg+6Y2UIukr2x4ShkAMOMQlNyLcmgVqj7z2wk17UDDosFOOYMOdPQ+dkyBcZFkb8DGxz2ckTwrKHA8g6HMn7gQWjbzsHqZSUmJ8sej6Cq7WzrhkzKVeYnmSEXSBM6I17RZ+WNWRfJ6z7K2xy1umUc7lGDizIkDL+AsNRXs6U3YpOUrRfWwS01K2noIuLzg+iTcFSiFLKlQPi8+aNAIwri24QlstaEM6JdoIsHBOdiyJl9RntfiXazUljEdJb3IKw1F10Q/Krtin0KaSD5Ido77MYK10sG0S4ByjzwW2LRT3pYlxLRBFpGM91/r9kRJuC/FbEnVEmhEwQYRqw7IMuC8LjnAKllSeBhEI0Qc8U636luWinWxYPqoFCnuxmX16VR9ldCvINqOH/NK5alpe8NY8qL5Nnl/GMFJhU6g2SZtqaw1xCkrss2pGEFhLp0CxuGow83+BDdoDn+FP8hJFeYusNlODL9LI/ubKLRRxDKfamuaNWRBx4o9TI49NDD9yjSdn9NKFa5jTGrdrIKpw1FJCtU8h6Rp/HwbVyBNOOSGtKGHJKtGdAao/NBO4aWrecS9mwQiuU8KLoi1nOEfepQ6TsFXVxnnO0NWFZEdVZjK8RaSgXoHtGbihwh4ViCM+LvhaL8VJ3xscdqnwOCk4xhDNKYNRHPOZfCakbzGOS+SWyloX8KsIj4lNScLwIuTsgsq+ASnFkmor4JdJayopKeEHZGOJ8OzMoatIkF0XvxIm5cGhcUtyhVqlrh4rNNoU8fI+jOCUs3cYIk14L63py9yo2D7fyBZ+t3AGuWgTmiFOCuCIvHuHFo6QbCpxm4GLIxZ+880j/K8Lm593EVZqnXF9N8UXIFt7zgwoeunDZCJzju44M+nKlEP4twAAD1RclkNDukAAAAABJRU5ErkJggg==")}.bk-root .bk-grid-row,.bk-root .bk-grid-column{display:flex;display:-webkit-flex;flex-wrap:nowrap;-webkit-flex-wrap:nowrap}.bk-root .bk-grid-row>*,.bk-root .bk-grid-column>*{flex-shrink:0;-webkit-flex-shrink:0}.bk-root .bk-grid-row{flex-direction:row;-webkit-flex-direction:row}.bk-root .bk-grid-column{flex-direction:column;-webkit-flex-direction:column}.bk-root .bk-canvas-wrapper{position:relative;font-size:12pt}.bk-root .bk-canvas,.bk-root .bk-canvas-overlays,.bk-root .bk-canvas-events{position:absolute;top:0;left:0;width:100%;height:100%}.bk-root .bk-canvas-map{position:absolute;border:0}.bk-root .bk-logo{margin:5px;position:relative;display:block;background-repeat:no-repeat}.bk-root .bk-logo.bk-grey{filter:url("data:image/svg+xml;utf8,#grayscale");filter:gray;-webkit-filter:grayscale(100%)}.bk-root .bk-logo-notebook{display:inline-block;vertical-align:middle;margin-right:5px}.bk-root .bk-logo-small{width:20px;height:20px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAOkSURBVDiNjZRtaJVlGMd/1/08zzln5zjP1LWcU9N0NkN8m2CYjpgQYQXqSs0I84OLIC0hkEKoPtiH3gmKoiJDU7QpLgoLjLIQCpEsNJ1vqUOdO7ppbuec5+V+rj4ctwzd8IIbbi6u+8f1539dt3A78eXC7QizUF7gyV1fD1Yqg4JWz84yffhm0qkFqBogB9rM8tZdtwVsPUhWhGcFJngGeWrPzHm5oaMmkfEg1usvLFyc8jLRqDOMru7AyC8saQr7GG7f5fvDeH7Ej8CM66nIF+8yngt6HWaKh7k49Soy9nXurCi1o3qUbS3zWfrYeQDTB/Qj6kX6Ybhw4B+bOYoLKCC9H3Nu/leUTZ1JdRWkkn2ldcCamzrcf47KKXdAJllSlxAOkRgyHsGC/zRday5Qld9DyoM4/q/rUoy/CXh3jzOu3bHUVZeU+DEn8FInkPBFlu3+nW3Nw0mk6vCDiWg8CeJaxEwuHS3+z5RgY+YBR6V1Z1nxSOfoaPa4LASWxxdNp+VWTk7+4vzaou8v8PN+xo+KY2xsw6une2frhw05CTYOmQvsEhjhWjn0bmXPjpE1+kplmmkP3suftwTubK9Vq22qKmrBhpY4jvd5afdRA3wGjFAgcnTK2s4hY0/GPNIb0nErGMCRxWOOX64Z8RAC4oCXdklmEvcL8o0BfkNK4lUg9HTl+oPlQxdNo3Mg4Nv175e/1LDGzZen30MEjRUtmXSfiTVu1kK8W4txyV6BMKlbgk3lMwYCiusNy9fVfvvwMxv8Ynl6vxoByANLTWplvuj/nF9m2+PDtt1eiHPBr1oIfhCChQMBw6Aw0UulqTKZdfVvfG7VcfIqLG9bcldL/+pdWTLxLUy8Qq38heUIjh4XlzZxzQm19lLFlr8vdQ97rjZVOLf8nclzckbcD4wxXMidpX30sFd37Fv/GtwwhzhxGVAprjbg0gCAEeIgwCZyTV2Z1REEW8O4py0wsjeloKoMr6iCY6dP92H6Vw/oTyICIthibxjm/DfN9lVz8IqtqKYLUXfoKVMVQVVJOElGjrnnUt9T9wbgp8AyYKaGlqingHZU/uG2NTZSVqwHQTWkx9hxjkpWDaCg6Ckj5qebgBVbT3V3NNXMSiWSDdGV3hrtzla7J+duwPOToIg42ChPQOQjspnSlp1V+Gjdged7+8UN5CRAV7a5EdFNwCjEaBR27b3W890TE7g24NAP/mMDXRWrGoFPQI9ls/MWO2dWFAar/xcOIImbbpA3zgAAAABJRU5ErkJggg==)}.bk-root .bk-toolbar,.bk-root .bk-toolbar *{box-sizing:border-box;margin:0;padding:0}.bk-root .bk-toolbar,.bk-root .bk-button-bar{display:flex;display:-webkit-flex;flex-wrap:nowrap;-webkit-flex-wrap:nowrap;align-items:center;-webkit-align-items:center;user-select:none;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.bk-root .bk-toolbar .bk-logo{flex-shrink:0;-webkit-flex-shrink:0}.bk-root .bk-toolbar-above,.bk-root .bk-toolbar-below{flex-direction:row;-webkit-flex-direction:row;justify-content:flex-end;-webkit-justify-content:flex-end}.bk-root .bk-toolbar-above .bk-button-bar,.bk-root .bk-toolbar-below .bk-button-bar{display:flex;display:-webkit-flex;flex-direction:row;-webkit-flex-direction:row}.bk-root .bk-toolbar-above .bk-logo,.bk-root .bk-toolbar-below .bk-logo{order:1;-webkit-order:1;margin-left:5px}.bk-root .bk-toolbar-left,.bk-root .bk-toolbar-right{flex-direction:column;-webkit-flex-direction:column;justify-content:flex-start;-webkit-justify-content:flex-start}.bk-root .bk-toolbar-left .bk-button-bar,.bk-root .bk-toolbar-right .bk-button-bar{display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column}.bk-root .bk-toolbar-left .bk-logo,.bk-root .bk-toolbar-right .bk-logo{order:0;-webkit-order:0;margin-bottom:5px}.bk-root .bk-toolbar-button{width:30px;height:30px;background-size:60%;background-color:transparent;background-repeat:no-repeat;background-position:center center}.bk-root .bk-toolbar-button:hover{background-color:#f9f9f9}.bk-root .bk-toolbar-button:focus{outline:0}.bk-root .bk-toolbar-button::-moz-focus-inner{border:0}.bk-root .bk-toolbar-above .bk-toolbar-button{border-bottom:2px solid transparent}.bk-root .bk-toolbar-above .bk-toolbar-button.bk-active{border-bottom-color:#26aae1}.bk-root .bk-toolbar-below .bk-toolbar-button{border-top:2px solid transparent}.bk-root .bk-toolbar-below .bk-toolbar-button.bk-active{border-top-color:#26aae1}.bk-root .bk-toolbar-right .bk-toolbar-button{border-left:2px solid transparent}.bk-root .bk-toolbar-right .bk-toolbar-button.bk-active{border-left-color:#26aae1}.bk-root .bk-toolbar-left .bk-toolbar-button{border-right:2px solid transparent}.bk-root .bk-toolbar-left .bk-toolbar-button.bk-active{border-right-color:#26aae1}.bk-root .bk-button-bar+.bk-button-bar:before{content:" ";display:inline-block;background-color:lightgray}.bk-root .bk-toolbar-above .bk-button-bar+.bk-button-bar:before,.bk-root .bk-toolbar-below .bk-button-bar+.bk-button-bar:before{height:10px;width:1px}.bk-root .bk-toolbar-left .bk-button-bar+.bk-button-bar:before,.bk-root .bk-toolbar-right .bk-button-bar+.bk-button-bar:before{height:1px;width:10px}.bk-root .bk-tooltip{font-family:"HelveticaNeue-Light","Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;font-weight:300;font-size:12px;position:absolute;padding:5px;border:1px solid #e5e5e5;background-color:white;pointer-events:none;opacity:.95}.bk-root .bk-tooltip>div:not(:first-child){margin-top:5px;border-top:#e5e5e5 1px dashed}.bk-root .bk-tooltip.bk-left.bk-tooltip-arrow::before{position:absolute;margin:-7px 0 0 0;top:50%;width:0;height:0;border-style:solid;border-width:7px 0 7px 0;border-color:transparent;content:" ";display:block;left:-10px;border-right-width:10px;border-right-color:#909599}.bk-root .bk-tooltip.bk-left::before{left:-10px;border-right-width:10px;border-right-color:#909599}.bk-root .bk-tooltip.bk-right.bk-tooltip-arrow::after{position:absolute;margin:-7px 0 0 0;top:50%;width:0;height:0;border-style:solid;border-width:7px 0 7px 0;border-color:transparent;content:" ";display:block;right:-10px;border-left-width:10px;border-left-color:#909599}.bk-root .bk-tooltip.bk-right::after{right:-10px;border-left-width:10px;border-left-color:#909599}.bk-root .bk-tooltip.bk-above::before{position:absolute;margin:0 0 0 -7px;left:50%;width:0;height:0;border-style:solid;border-width:0 7px 0 7px;border-color:transparent;content:" ";display:block;top:-10px;border-bottom-width:10px;border-bottom-color:#909599}.bk-root .bk-tooltip.bk-below::after{position:absolute;margin:0 0 0 -7px;left:50%;width:0;height:0;border-style:solid;border-width:0 7px 0 7px;border-color:transparent;content:" ";display:block;bottom:-10px;border-top-width:10px;border-top-color:#909599}.bk-root .bk-tooltip-row-label{text-align:right;color:#26aae1}.bk-root .bk-tooltip-row-value{color:default}.bk-root .bk-tooltip-color-block{width:12px;height:12px;margin-left:5px;margin-right:5px;outline:#ddd solid 1px;display:inline-block}.bk-root .bk-plotdiv{position:relative;width:100%;height:100%}.rendered_html .bk-root .bk-tooltip table,.rendered_html .bk-root .bk-tooltip tr,.rendered_html .bk-root .bk-tooltip th,.rendered_html .bk-root .bk-tooltip td{border:0;padding:1px}//# sourceMappingURL=bokeh.min.css.map diff --git a/backend/web/static/css/bootstrap-colorpicker.min.css b/backend/web/static/css/bootstrap-colorpicker.min.css new file mode 100755 index 0000000..5196b77 --- /dev/null +++ b/backend/web/static/css/bootstrap-colorpicker.min.css @@ -0,0 +1,9 @@ +/*! + * Bootstrap Colorpicker + * http://mjolnic.github.io/bootstrap-colorpicker/ + * + * Originally written by (c) 2012 Stefan Petre + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0.txt + * + */.colorpicker-saturation{float:left;width:100px;height:100px;cursor:crosshair;background-image:url(../images/bootstrap-colorpicker/saturation.png)}.colorpicker-saturation i{position:absolute;top:0;left:0;display:block;width:5px;height:5px;margin:-4px 0 0 -4px;border:1px solid #000;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.colorpicker-saturation i b{display:block;width:5px;height:5px;border:1px solid #fff;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.colorpicker-alpha,.colorpicker-hue{float:left;width:15px;height:100px;margin-bottom:4px;margin-left:4px;cursor:row-resize}.colorpicker-alpha i,.colorpicker-hue i{position:absolute;top:0;left:0;display:block;width:100%;height:1px;margin-top:-1px;background:#000;border-top:1px solid #fff}.colorpicker-hue{background-image:url(../images/bootstrap-colorpicker/hue.png)}.colorpicker-alpha,.colorpicker-color{background-image:url(../images/bootstrap-colorpicker/alpha.png)}.colorpicker-alpha{display:none}.colorpicker:after,.colorpicker:before{position:absolute;display:inline-block;content:''}.colorpicker-alpha,.colorpicker-hue,.colorpicker-saturation{background-size:contain}.colorpicker{top:0;left:0;z-index:2500;min-width:130px;padding:4px;margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1}.colorpicker:after,.colorpicker:before{line-height:0}.colorpicker:before{top:-7px;left:6px;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,.2)}.colorpicker:after{clear:both;top:-6px;left:7px;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent}.colorpicker div{position:relative}.colorpicker.colorpicker-with-alpha{min-width:140px}.colorpicker.colorpicker-with-alpha .colorpicker-alpha{display:block}.colorpicker-color{height:10px;margin-top:5px;clear:both;background-position:0 100%}.colorpicker-color div{height:10px}.colorpicker-selectors{display:none;height:10px;margin-top:5px;clear:both}.colorpicker-selectors i{float:left;width:10px;height:10px;cursor:pointer}.colorpicker-selectors i+i{margin-left:3px}.colorpicker-element .add-on i,.colorpicker-element .input-group-addon i{display:inline-block;width:16px;height:16px;vertical-align:text-top;cursor:pointer}.colorpicker.colorpicker-inline{position:relative;z-index:auto;display:inline-block;float:none}.colorpicker.colorpicker-horizontal{width:110px;height:auto;min-width:110px}.colorpicker.colorpicker-horizontal .colorpicker-saturation{margin-bottom:4px}.colorpicker.colorpicker-horizontal .colorpicker-color{width:100px}.colorpicker.colorpicker-horizontal .colorpicker-alpha,.colorpicker.colorpicker-horizontal .colorpicker-hue{float:left;width:100px;height:15px;margin-bottom:4px;margin-left:0;cursor:col-resize}.colorpicker.colorpicker-horizontal .colorpicker-alpha i,.colorpicker.colorpicker-horizontal .colorpicker-hue i{position:absolute;top:0;left:0;display:block;width:1px;height:15px;margin-top:0;background:#fff;border:none}.colorpicker.colorpicker-horizontal .colorpicker-hue{background-image:url(../images/bootstrap-colorpicker/hue-horizontal.png)}.colorpicker.colorpicker-horizontal .colorpicker-alpha{background-image:url(../images/bootstrap-colorpicker/alpha-horizontal.png)}.colorpicker.colorpicker-hidden{display:none}.colorpicker.colorpicker-visible{display:block}.colorpicker-inline.colorpicker-visible{display:inline-block}.colorpicker-right:before{right:6px;left:auto}.colorpicker-right:after{right:7px;left:auto} \ No newline at end of file diff --git a/backend/web/static/css/bootstrap-datepicker3.min.css b/backend/web/static/css/bootstrap-datepicker3.min.css new file mode 100755 index 0000000..a6851d4 --- /dev/null +++ b/backend/web/static/css/bootstrap-datepicker3.min.css @@ -0,0 +1,7 @@ +/*! + * Datepicker for Bootstrap v1.6.0 (https://github.com/eternicode/bootstrap-datepicker) + * + * Copyright 2012 Stefan Petre + * Improvements by Andrew Rowls + * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) + */.datepicker-dropdown:after,.datepicker-dropdown:before{content:'';display:inline-block;border-top:0;position:absolute}.datepicker{border-radius:4px;direction:ltr}.datepicker-inline{width:220px}.datepicker.datepicker-rtl{direction:rtl}.datepicker.datepicker-rtl table tr td span{float:right}.datepicker-dropdown{top:0;left:0;padding:4px}.datepicker-dropdown:before{border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid rgba(0,0,0,.15);border-bottom-color:rgba(0,0,0,.2)}.datepicker-dropdown:after{border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff}.datepicker-dropdown.datepicker-orient-left:before{left:6px}.datepicker-dropdown.datepicker-orient-left:after{left:7px}.datepicker-dropdown.datepicker-orient-right:before{right:6px}.datepicker-dropdown.datepicker-orient-right:after{right:7px}.datepicker-dropdown.datepicker-orient-bottom:before{top:-7px}.datepicker-dropdown.datepicker-orient-bottom:after{top:-6px}.datepicker-dropdown.datepicker-orient-top:before{bottom:-7px;border-bottom:0;border-top:7px solid rgba(0,0,0,.15)}.datepicker-dropdown.datepicker-orient-top:after{bottom:-6px;border-bottom:0;border-top:6px solid #fff}.datepicker>div{display:none}.datepicker table{margin:0;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.datepicker table tr td,.datepicker table tr th{text-align:center;width:30px;height:30px;border-radius:4px;border:none}.table-striped .datepicker table tr td,.table-striped .datepicker table tr th{background-color:transparent}.datepicker table tr td.new,.datepicker table tr td.old{color:#777}.datepicker table tr td.day:hover,.datepicker table tr td.focused{background:#eee;cursor:pointer}.datepicker table tr td.disabled,.datepicker table tr td.disabled:hover{background:0 0;color:#777;cursor:default}.datepicker table tr td.highlighted{color:#000;background-color:#d9edf7;border-color:#85c5e5;border-radius:0}.datepicker table tr td.highlighted.focus,.datepicker table tr td.highlighted:focus{color:#000;background-color:#afd9ee;border-color:#298fc2}.datepicker table tr td.highlighted.active,.datepicker table tr td.highlighted:active,.datepicker table tr td.highlighted:hover{color:#000;background-color:#afd9ee;border-color:#52addb}.datepicker table tr td.highlighted.active.focus,.datepicker table tr td.highlighted.active:focus,.datepicker table tr td.highlighted.active:hover,.datepicker table tr td.highlighted:active.focus,.datepicker table tr td.highlighted:active:focus,.datepicker table tr td.highlighted:active:hover{color:#000;background-color:#91cbe8;border-color:#298fc2}.datepicker table tr td.highlighted.disabled.focus,.datepicker table tr td.highlighted.disabled:focus,.datepicker table tr td.highlighted.disabled:hover,.datepicker table tr td.highlighted[disabled].focus,.datepicker table tr td.highlighted[disabled]:focus,.datepicker table tr td.highlighted[disabled]:hover,fieldset[disabled] .datepicker table tr td.highlighted.focus,fieldset[disabled] .datepicker table tr td.highlighted:focus,fieldset[disabled] .datepicker table tr td.highlighted:hover{background-color:#d9edf7;border-color:#85c5e5}.datepicker table tr td.highlighted.focused{background:#afd9ee}.datepicker table tr td.highlighted.disabled,.datepicker table tr td.highlighted.disabled:active{background:#d9edf7;color:#777}.datepicker table tr td.today{color:#000;background-color:#ffdb99;border-color:#ffb733}.datepicker table tr td.today.focus,.datepicker table tr td.today:focus{color:#000;background-color:#ffc966;border-color:#b37400}.datepicker table tr td.today.active,.datepicker table tr td.today:active,.datepicker table tr td.today:hover{color:#000;background-color:#ffc966;border-color:#f59e00}.datepicker table tr td.today.active.focus,.datepicker table tr td.today.active:focus,.datepicker table tr td.today.active:hover,.datepicker table tr td.today:active.focus,.datepicker table tr td.today:active:focus,.datepicker table tr td.today:active:hover{color:#000;background-color:#ffbc42;border-color:#b37400}.datepicker table tr td.today.disabled.focus,.datepicker table tr td.today.disabled:focus,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today[disabled].focus,.datepicker table tr td.today[disabled]:focus,.datepicker table tr td.today[disabled]:hover,fieldset[disabled] .datepicker table tr td.today.focus,fieldset[disabled] .datepicker table tr td.today:focus,fieldset[disabled] .datepicker table tr td.today:hover{background-color:#ffdb99;border-color:#ffb733}.datepicker table tr td.today.focused{background:#ffc966}.datepicker table tr td.today.disabled,.datepicker table tr td.today.disabled:active{background:#ffdb99;color:#777}.datepicker table tr td.range{color:#000;background-color:#eee;border-color:#bbb;border-radius:0}.datepicker table tr td.range.focus,.datepicker table tr td.range:focus{color:#000;background-color:#d5d5d5;border-color:#7c7c7c}.datepicker table tr td.range.active,.datepicker table tr td.range:active,.datepicker table tr td.range:hover{color:#000;background-color:#d5d5d5;border-color:#9d9d9d}.datepicker table tr td.range.active.focus,.datepicker table tr td.range.active:focus,.datepicker table tr td.range.active:hover,.datepicker table tr td.range:active.focus,.datepicker table tr td.range:active:focus,.datepicker table tr td.range:active:hover{color:#000;background-color:#c3c3c3;border-color:#7c7c7c}.datepicker table tr td.range.disabled.focus,.datepicker table tr td.range.disabled:focus,.datepicker table tr td.range.disabled:hover,.datepicker table tr td.range[disabled].focus,.datepicker table tr td.range[disabled]:focus,.datepicker table tr td.range[disabled]:hover,fieldset[disabled] .datepicker table tr td.range.focus,fieldset[disabled] .datepicker table tr td.range:focus,fieldset[disabled] .datepicker table tr td.range:hover{background-color:#eee;border-color:#bbb}.datepicker table tr td.range.focused{background:#d5d5d5}.datepicker table tr td.range.disabled,.datepicker table tr td.range.disabled:active{background:#eee;color:#777}.datepicker table tr td.range.highlighted{color:#000;background-color:#e4eef3;border-color:#9dc1d3}.datepicker table tr td.range.highlighted.focus,.datepicker table tr td.range.highlighted:focus{color:#000;background-color:#c1d7e3;border-color:#4b88a6}.datepicker table tr td.range.highlighted.active,.datepicker table tr td.range.highlighted:active,.datepicker table tr td.range.highlighted:hover{color:#000;background-color:#c1d7e3;border-color:#73a6c0}.datepicker table tr td.range.highlighted.active.focus,.datepicker table tr td.range.highlighted.active:focus,.datepicker table tr td.range.highlighted.active:hover,.datepicker table tr td.range.highlighted:active.focus,.datepicker table tr td.range.highlighted:active:focus,.datepicker table tr td.range.highlighted:active:hover{color:#000;background-color:#a8c8d8;border-color:#4b88a6}.datepicker table tr td.range.highlighted.disabled.focus,.datepicker table tr td.range.highlighted.disabled:focus,.datepicker table tr td.range.highlighted.disabled:hover,.datepicker table tr td.range.highlighted[disabled].focus,.datepicker table tr td.range.highlighted[disabled]:focus,.datepicker table tr td.range.highlighted[disabled]:hover,fieldset[disabled] .datepicker table tr td.range.highlighted.focus,fieldset[disabled] .datepicker table tr td.range.highlighted:focus,fieldset[disabled] .datepicker table tr td.range.highlighted:hover{background-color:#e4eef3;border-color:#9dc1d3}.datepicker table tr td.range.highlighted.focused{background:#c1d7e3}.datepicker table tr td.range.highlighted.disabled,.datepicker table tr td.range.highlighted.disabled:active{background:#e4eef3;color:#777}.datepicker table tr td.range.today{color:#000;background-color:#f7ca77;border-color:#f1a417}.datepicker table tr td.range.today.focus,.datepicker table tr td.range.today:focus{color:#000;background-color:#f4b747;border-color:#815608}.datepicker table tr td.range.today.active,.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:hover{color:#000;background-color:#f4b747;border-color:#bf800c}.datepicker table tr td.range.today.active.focus,.datepicker table tr td.range.today.active:focus,.datepicker table tr td.range.today.active:hover,.datepicker table tr td.range.today:active.focus,.datepicker table tr td.range.today:active:focus,.datepicker table tr td.range.today:active:hover{color:#000;background-color:#f2aa25;border-color:#815608}.datepicker table tr td.range.today.disabled.focus,.datepicker table tr td.range.today.disabled:focus,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today[disabled].focus,.datepicker table tr td.range.today[disabled]:focus,.datepicker table tr td.range.today[disabled]:hover,fieldset[disabled] .datepicker table tr td.range.today.focus,fieldset[disabled] .datepicker table tr td.range.today:focus,fieldset[disabled] .datepicker table tr td.range.today:hover{background-color:#f7ca77;border-color:#f1a417}.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today.disabled:active{background:#f7ca77;color:#777}.datepicker table tr td.selected,.datepicker table tr td.selected.highlighted{color:#fff;background-color:#777;border-color:#555;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datepicker table tr td.selected.focus,.datepicker table tr td.selected.highlighted.focus,.datepicker table tr td.selected.highlighted:focus,.datepicker table tr td.selected:focus{color:#fff;background-color:#5e5e5e;border-color:#161616}.datepicker table tr td.selected.active,.datepicker table tr td.selected.highlighted.active,.datepicker table tr td.selected.highlighted:active,.datepicker table tr td.selected.highlighted:hover,.datepicker table tr td.selected:active,.datepicker table tr td.selected:hover{color:#fff;background-color:#5e5e5e;border-color:#373737}.datepicker table tr td.selected.active.focus,.datepicker table tr td.selected.active:focus,.datepicker table tr td.selected.active:hover,.datepicker table tr td.selected.highlighted.active.focus,.datepicker table tr td.selected.highlighted.active:focus,.datepicker table tr td.selected.highlighted.active:hover,.datepicker table tr td.selected.highlighted:active.focus,.datepicker table tr td.selected.highlighted:active:focus,.datepicker table tr td.selected.highlighted:active:hover,.datepicker table tr td.selected:active.focus,.datepicker table tr td.selected:active:focus,.datepicker table tr td.selected:active:hover{color:#fff;background-color:#4c4c4c;border-color:#161616}.datepicker table tr td.selected.disabled.focus,.datepicker table tr td.selected.disabled:focus,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected.highlighted.disabled.focus,.datepicker table tr td.selected.highlighted.disabled:focus,.datepicker table tr td.selected.highlighted.disabled:hover,.datepicker table tr td.selected.highlighted[disabled].focus,.datepicker table tr td.selected.highlighted[disabled]:focus,.datepicker table tr td.selected.highlighted[disabled]:hover,.datepicker table tr td.selected[disabled].focus,.datepicker table tr td.selected[disabled]:focus,.datepicker table tr td.selected[disabled]:hover,fieldset[disabled] .datepicker table tr td.selected.focus,fieldset[disabled] .datepicker table tr td.selected.highlighted.focus,fieldset[disabled] .datepicker table tr td.selected.highlighted:focus,fieldset[disabled] .datepicker table tr td.selected.highlighted:hover,fieldset[disabled] .datepicker table tr td.selected:focus,fieldset[disabled] .datepicker table tr td.selected:hover{background-color:#777;border-color:#555}.datepicker table tr td.active,.datepicker table tr td.active.highlighted{color:#fff;background-color:#337ab7;border-color:#2e6da4;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datepicker table tr td.active.focus,.datepicker table tr td.active.highlighted.focus,.datepicker table tr td.active.highlighted:focus,.datepicker table tr td.active:focus{color:#fff;background-color:#286090;border-color:#122b40}.datepicker table tr td.active.active,.datepicker table tr td.active.highlighted.active,.datepicker table tr td.active.highlighted:active,.datepicker table tr td.active.highlighted:hover,.datepicker table tr td.active:active,.datepicker table tr td.active:hover{color:#fff;background-color:#286090;border-color:#204d74}.datepicker table tr td.active.active.focus,.datepicker table tr td.active.active:focus,.datepicker table tr td.active.active:hover,.datepicker table tr td.active.highlighted.active.focus,.datepicker table tr td.active.highlighted.active:focus,.datepicker table tr td.active.highlighted.active:hover,.datepicker table tr td.active.highlighted:active.focus,.datepicker table tr td.active.highlighted:active:focus,.datepicker table tr td.active.highlighted:active:hover,.datepicker table tr td.active:active.focus,.datepicker table tr td.active:active:focus,.datepicker table tr td.active:active:hover{color:#fff;background-color:#204d74;border-color:#122b40}.datepicker table tr td.active.disabled.focus,.datepicker table tr td.active.disabled:focus,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active.highlighted.disabled.focus,.datepicker table tr td.active.highlighted.disabled:focus,.datepicker table tr td.active.highlighted.disabled:hover,.datepicker table tr td.active.highlighted[disabled].focus,.datepicker table tr td.active.highlighted[disabled]:focus,.datepicker table tr td.active.highlighted[disabled]:hover,.datepicker table tr td.active[disabled].focus,.datepicker table tr td.active[disabled]:focus,.datepicker table tr td.active[disabled]:hover,fieldset[disabled] .datepicker table tr td.active.focus,fieldset[disabled] .datepicker table tr td.active.highlighted.focus,fieldset[disabled] .datepicker table tr td.active.highlighted:focus,fieldset[disabled] .datepicker table tr td.active.highlighted:hover,fieldset[disabled] .datepicker table tr td.active:focus,fieldset[disabled] .datepicker table tr td.active:hover{background-color:#337ab7;border-color:#2e6da4}.datepicker table tr td span{display:block;width:23%;height:54px;line-height:54px;float:left;margin:1%;cursor:pointer;border-radius:4px}.datepicker table tr td span.focused,.datepicker table tr td span:hover{background:#eee}.datepicker table tr td span.disabled,.datepicker table tr td span.disabled:hover{background:0 0;color:#777;cursor:default}.datepicker .datepicker-switch,.datepicker .next,.datepicker .prev,.datepicker tfoot tr th,.input-group.date .input-group-addon{cursor:pointer}.datepicker table tr td span.active,.datepicker table tr td span.active.disabled,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active:hover{color:#fff;background-color:#337ab7;border-color:#2e6da4;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datepicker table tr td span.active.disabled.focus,.datepicker table tr td span.active.disabled:focus,.datepicker table tr td span.active.disabled:hover.focus,.datepicker table tr td span.active.disabled:hover:focus,.datepicker table tr td span.active.focus,.datepicker table tr td span.active:focus,.datepicker table tr td span.active:hover.focus,.datepicker table tr td span.active:hover:focus{color:#fff;background-color:#286090;border-color:#122b40}.datepicker table tr td span.active.active,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active.disabled:hover.active,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active.disabled:hover:hover,.datepicker table tr td span.active:active,.datepicker table tr td span.active:hover,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active:hover:active,.datepicker table tr td span.active:hover:hover{color:#fff;background-color:#286090;border-color:#204d74}.datepicker table tr td span.active.active.focus,.datepicker table tr td span.active.active:focus,.datepicker table tr td span.active.active:hover,.datepicker table tr td span.active.disabled.active.focus,.datepicker table tr td span.active.disabled.active:focus,.datepicker table tr td span.active.disabled.active:hover,.datepicker table tr td span.active.disabled:active.focus,.datepicker table tr td span.active.disabled:active:focus,.datepicker table tr td span.active.disabled:active:hover,.datepicker table tr td span.active.disabled:hover.active.focus,.datepicker table tr td span.active.disabled:hover.active:focus,.datepicker table tr td span.active.disabled:hover.active:hover,.datepicker table tr td span.active.disabled:hover:active.focus,.datepicker table tr td span.active.disabled:hover:active:focus,.datepicker table tr td span.active.disabled:hover:active:hover,.datepicker table tr td span.active:active.focus,.datepicker table tr td span.active:active:focus,.datepicker table tr td span.active:active:hover,.datepicker table tr td span.active:hover.active.focus,.datepicker table tr td span.active:hover.active:focus,.datepicker table tr td span.active:hover.active:hover,.datepicker table tr td span.active:hover:active.focus,.datepicker table tr td span.active:hover:active:focus,.datepicker table tr td span.active:hover:active:hover{color:#fff;background-color:#204d74;border-color:#122b40}.datepicker table tr td span.active.disabled.disabled.focus,.datepicker table tr td span.active.disabled.disabled:focus,.datepicker table tr td span.active.disabled.disabled:hover,.datepicker table tr td span.active.disabled.focus,.datepicker table tr td span.active.disabled:focus,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active.disabled:hover.disabled.focus,.datepicker table tr td span.active.disabled:hover.disabled:focus,.datepicker table tr td span.active.disabled:hover.disabled:hover,.datepicker table tr td span.active.disabled:hover[disabled].focus,.datepicker table tr td span.active.disabled:hover[disabled]:focus,.datepicker table tr td span.active.disabled:hover[disabled]:hover,.datepicker table tr td span.active.disabled[disabled].focus,.datepicker table tr td span.active.disabled[disabled]:focus,.datepicker table tr td span.active.disabled[disabled]:hover,.datepicker table tr td span.active:hover.disabled.focus,.datepicker table tr td span.active:hover.disabled:focus,.datepicker table tr td span.active:hover.disabled:hover,.datepicker table tr td span.active:hover[disabled].focus,.datepicker table tr td span.active:hover[disabled]:focus,.datepicker table tr td span.active:hover[disabled]:hover,.datepicker table tr td span.active[disabled].focus,.datepicker table tr td span.active[disabled]:focus,.datepicker table tr td span.active[disabled]:hover,fieldset[disabled] .datepicker table tr td span.active.disabled.focus,fieldset[disabled] .datepicker table tr td span.active.disabled:focus,fieldset[disabled] .datepicker table tr td span.active.disabled:hover,fieldset[disabled] .datepicker table tr td span.active.disabled:hover.focus,fieldset[disabled] .datepicker table tr td span.active.disabled:hover:focus,fieldset[disabled] .datepicker table tr td span.active.disabled:hover:hover,fieldset[disabled] .datepicker table tr td span.active.focus,fieldset[disabled] .datepicker table tr td span.active:focus,fieldset[disabled] .datepicker table tr td span.active:hover,fieldset[disabled] .datepicker table tr td span.active:hover.focus,fieldset[disabled] .datepicker table tr td span.active:hover:focus,fieldset[disabled] .datepicker table tr td span.active:hover:hover{background-color:#337ab7;border-color:#2e6da4}.datepicker table tr td span.new,.datepicker table tr td span.old{color:#777}.datepicker .datepicker-switch{width:145px}.datepicker .datepicker-switch:hover,.datepicker .next:hover,.datepicker .prev:hover,.datepicker tfoot tr th:hover{background:#eee}.datepicker .cw{font-size:10px;width:12px;padding:0 2px 0 5px;vertical-align:middle}.input-daterange{width:100%}.input-daterange input{text-align:center}.input-daterange input:first-child{border-radius:3px 0 0 3px}.input-daterange input:last-child{border-radius:0 3px 3px 0}.input-daterange .input-group-addon{width:auto;min-width:16px;padding:4px 5px;line-height:1.42857143;text-shadow:0 1px 0 #fff;border-width:1px 0;margin-left:-5px;margin-right:-5px} \ No newline at end of file diff --git a/backend/web/static/css/bootstrap-datetimepicker.min.css b/backend/web/static/css/bootstrap-datetimepicker.min.css new file mode 100755 index 0000000..a28844f --- /dev/null +++ b/backend/web/static/css/bootstrap-datetimepicker.min.css @@ -0,0 +1,5 @@ +/*! + * Datetimepicker for Bootstrap 3 + * version : 4.17.37 + * https://github.com/Eonasdan/bootstrap-datetimepicker/ + */.bootstrap-datetimepicker-widget{list-style:none}.bootstrap-datetimepicker-widget.dropdown-menu{margin:2px 0;padding:4px;width:19em}@media (min-width:768px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}@media (min-width:992px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}@media (min-width:1200px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}.bootstrap-datetimepicker-widget.dropdown-menu:after,.bootstrap-datetimepicker-widget.dropdown-menu:before{content:'';display:inline-block;position:absolute}.bootstrap-datetimepicker-widget.dropdown-menu.bottom:before{border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,.2);top:-7px;left:7px}.bootstrap-datetimepicker-widget.dropdown-menu.bottom:after{border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;top:-6px;left:8px}.bootstrap-datetimepicker-widget.dropdown-menu.top:before{border-left:7px solid transparent;border-right:7px solid transparent;border-top:7px solid #ccc;border-top-color:rgba(0,0,0,.2);bottom:-7px;left:6px}.bootstrap-datetimepicker-widget.dropdown-menu.top:after{border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #fff;bottom:-6px;left:7px}.bootstrap-datetimepicker-widget.dropdown-menu.pull-right:before{left:auto;right:6px}.bootstrap-datetimepicker-widget.dropdown-menu.pull-right:after{left:auto;right:7px}.bootstrap-datetimepicker-widget .list-unstyled{margin:0}.bootstrap-datetimepicker-widget a[data-action]{padding:6px 0}.bootstrap-datetimepicker-widget a[data-action]:active{box-shadow:none}.bootstrap-datetimepicker-widget .timepicker-hour,.bootstrap-datetimepicker-widget .timepicker-minute,.bootstrap-datetimepicker-widget .timepicker-second{width:54px;font-weight:700;font-size:1.2em;margin:0}.bootstrap-datetimepicker-widget button[data-action]{padding:6px}.bootstrap-datetimepicker-widget .btn[data-action=incrementHours]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0;content:"Increment Hours"}.bootstrap-datetimepicker-widget .btn[data-action=incrementMinutes]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0;content:"Increment Minutes"}.bootstrap-datetimepicker-widget .btn[data-action=decrementHours]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0;content:"Decrement Hours"}.bootstrap-datetimepicker-widget .btn[data-action=decrementMinutes]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0;content:"Decrement Minutes"}.bootstrap-datetimepicker-widget .btn[data-action=showHours]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0;content:"Show Hours"}.bootstrap-datetimepicker-widget .btn[data-action=showMinutes]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0;content:"Show Minutes"}.bootstrap-datetimepicker-widget .btn[data-action=togglePeriod]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0;content:"Toggle AM/PM"}.bootstrap-datetimepicker-widget .btn[data-action=clear]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0;content:"Clear the picker"}.bootstrap-datetimepicker-widget .btn[data-action=today]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0;content:"Set the date to today"}.bootstrap-datetimepicker-widget .picker-switch{text-align:center}.bootstrap-datetimepicker-widget .picker-switch::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0;content:"Toggle Date and Time Screens"}.bootstrap-datetimepicker-widget .picker-switch td{padding:0;margin:0;height:auto;width:auto;line-height:inherit}.bootstrap-datetimepicker-widget .picker-switch td span{line-height:2.5;height:2.5em;width:100%}.bootstrap-datetimepicker-widget table{width:100%;margin:0}.bootstrap-datetimepicker-widget table td,.bootstrap-datetimepicker-widget table th{text-align:center;border-radius:4px}.bootstrap-datetimepicker-widget table th{height:20px;line-height:20px;width:20px}.bootstrap-datetimepicker-widget table th.picker-switch{width:145px}.bootstrap-datetimepicker-widget table th.disabled,.bootstrap-datetimepicker-widget table th.disabled:hover{background:0 0;color:#777;cursor:not-allowed}.bootstrap-datetimepicker-widget table th.prev::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0;content:"Previous Month"}.bootstrap-datetimepicker-widget table th.next::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0;content:"Next Month"}.bootstrap-datetimepicker-widget table thead tr:first-child th{cursor:pointer}.bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#eee}.bootstrap-datetimepicker-widget table td{height:54px;line-height:54px;width:54px}.bootstrap-datetimepicker-widget table td.cw{font-size:.8em;height:20px;line-height:20px;color:#777}.bootstrap-datetimepicker-widget table td.day{height:20px;line-height:20px;width:20px}.bootstrap-datetimepicker-widget table td.day:hover,.bootstrap-datetimepicker-widget table td.hour:hover,.bootstrap-datetimepicker-widget table td.minute:hover,.bootstrap-datetimepicker-widget table td.second:hover{background:#eee;cursor:pointer}.bootstrap-datetimepicker-widget table td.new,.bootstrap-datetimepicker-widget table td.old{color:#777}.bootstrap-datetimepicker-widget table td.today{position:relative}.bootstrap-datetimepicker-widget table td.today:before{content:'';display:inline-block;border:solid transparent;border-width:0 0 7px 7px;border-bottom-color:#337ab7;border-top-color:rgba(0,0,0,.2);position:absolute;bottom:4px;right:4px}.bootstrap-datetimepicker-widget table td.active,.bootstrap-datetimepicker-widget table td.active:hover{background-color:#337ab7;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.bootstrap-datetimepicker-widget table td.active.today:before{border-bottom-color:#fff}.bootstrap-datetimepicker-widget table td.disabled,.bootstrap-datetimepicker-widget table td.disabled:hover{background:0 0;color:#777;cursor:not-allowed}.bootstrap-datetimepicker-widget table td span{display:inline-block;width:54px;height:54px;line-height:54px;margin:2px 1.5px;cursor:pointer;border-radius:4px}.bootstrap-datetimepicker-widget table td span:hover{background:#eee}.bootstrap-datetimepicker-widget table td span.active{background-color:#337ab7;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.bootstrap-datetimepicker-widget table td span.old{color:#777}.bootstrap-datetimepicker-widget table td span.disabled,.bootstrap-datetimepicker-widget table td span.disabled:hover{background:0 0;color:#777;cursor:not-allowed}.bootstrap-datetimepicker-widget.usetwentyfour td.hour{height:27px;line-height:27px}.bootstrap-datetimepicker-widget.wider{width:21em}.bootstrap-datetimepicker-widget .datepicker-decades .decade{line-height:1.8em!important}.input-group.date .input-group-addon{cursor:pointer}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0} \ No newline at end of file diff --git a/backend/web/static/css/bootstrap-timepicker.min.css b/backend/web/static/css/bootstrap-timepicker.min.css new file mode 100755 index 0000000..040668e --- /dev/null +++ b/backend/web/static/css/bootstrap-timepicker.min.css @@ -0,0 +1,10 @@ +/*! + * Timepicker Component for Twitter Bootstrap + * + * Copyright 2013 Joris de Wit + * + * Contributors https://github.com/jdewit/bootstrap-timepicker/graphs/contributors + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */.bootstrap-timepicker{position:relative}.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu{left:auto;right:0}.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:before{left:auto;right:12px}.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:after{left:auto;right:13px}.bootstrap-timepicker .input-group-addon{cursor:pointer}.bootstrap-timepicker .input-group-addon i{display:inline-block;width:16px;height:16px}.bootstrap-timepicker-widget.dropdown-menu{padding:4px}.bootstrap-timepicker-widget.dropdown-menu.open{display:inline-block}.bootstrap-timepicker-widget.dropdown-menu:before{border-bottom:7px solid rgba(0,0,0,.2);border-left:7px solid transparent;border-right:7px solid transparent;content:"";display:inline-block;position:absolute}.bootstrap-timepicker-widget.dropdown-menu:after{border-bottom:6px solid #FFF;border-left:6px solid transparent;border-right:6px solid transparent;content:"";display:inline-block;position:absolute}.bootstrap-timepicker-widget.timepicker-orient-left:before{left:6px}.bootstrap-timepicker-widget.timepicker-orient-left:after{left:7px}.bootstrap-timepicker-widget.timepicker-orient-right:before{right:6px}.bootstrap-timepicker-widget.timepicker-orient-right:after{right:7px}.bootstrap-timepicker-widget.timepicker-orient-top:before{top:-7px}.bootstrap-timepicker-widget.timepicker-orient-top:after{top:-6px}.bootstrap-timepicker-widget.timepicker-orient-bottom:before{bottom:-7px;border-bottom:0;border-top:7px solid #999}.bootstrap-timepicker-widget.timepicker-orient-bottom:after{bottom:-6px;border-bottom:0;border-top:6px solid #fff}.bootstrap-timepicker-widget a.btn,.bootstrap-timepicker-widget input{border-radius:4px}.bootstrap-timepicker-widget table{width:100%;margin:0}.bootstrap-timepicker-widget table td{text-align:center;height:30px;margin:0;padding:2px}.bootstrap-timepicker-widget table td:not(.separator){min-width:30px}.bootstrap-timepicker-widget table td span{width:100%}.bootstrap-timepicker-widget table td a{border:1px solid transparent;width:100%;display:inline-block;margin:0;padding:8px 0;outline:0;color:#333}.bootstrap-timepicker-widget table td a:hover{text-decoration:none;background-color:#eee;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border-color:#ddd}.bootstrap-timepicker-widget table td a i{margin-top:2px;font-size:18px}.bootstrap-timepicker-widget table td input{width:25px;margin:0;text-align:center}.bootstrap-timepicker-widget .modal-content{padding:4px}@media (min-width:767px){.bootstrap-timepicker-widget.modal{width:200px;margin-left:-100px}}@media (max-width:767px){.bootstrap-timepicker,.bootstrap-timepicker .dropdown-menu{width:100%}} \ No newline at end of file diff --git a/backend/web/static/css/bootstrap.min.css b/backend/web/static/css/bootstrap.min.css new file mode 100755 index 0000000..71cbd6e --- /dev/null +++ b/backend/web/static/css/bootstrap.min.css @@ -0,0 +1,5 @@ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */.label,sub,sup{vertical-align:baseline}hr,img{border:0}body,figure{margin:0}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.pre-scrollable{max-height:340px}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}b,optgroup,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{background:#ff0;color:#000}sub,sup{font-size:75%;line-height:0;position:relative}sup{top:-.5em}sub{bottom:-.25em}img{vertical-align:middle}svg:not(:root){overflow:hidden}hr{box-sizing:content-box;height:0}pre,textarea{overflow:auto}code,kbd,pre,samp{font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}.glyphicon,address{font-style:normal}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{blockquote,img,pre,tr{page-break-inside:avoid}*,:after,:before{background:0 0!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999}thead{display:table-header-group}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}.btn,.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-warning.active,.btn-warning:active,.btn.active,.btn:active,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover,.form-control,.navbar-toggle,.open>.dropdown-toggle.btn-danger,.open>.dropdown-toggle.btn-default,.open>.dropdown-toggle.btn-info,.open>.dropdown-toggle.btn-primary,.open>.dropdown-toggle.btn-warning{background-image:none}.img-thumbnail,body{background-color:#fff}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before,.glyphicon-btc:before,.glyphicon-xbt:before{content:"\e227"}.glyphicon-jpy:before,.glyphicon-yen:before{content:"\00a5"}.glyphicon-rub:before,.glyphicon-ruble:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}dt,kbd kbd,label{font-weight:700}address,blockquote .small,blockquote footer,blockquote small,dd,dt,pre{line-height:1.42857143}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{background-color:#fcf8e3;padding:.2em}.list-inline,.list-unstyled{padding-left:0;list-style:none}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}pre code,table{background-color:transparent}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}dl,ol,ul{margin-top:0}address,dl{margin-bottom:20px}ol,ul{margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-inline{margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dd{margin-left:0}@media (min-width:992px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;color:#777}legend,pre{display:block;color:#333}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}code,kbd{padding:2px 4px;font-size:90%}caption,th{text-align:left}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;box-shadow:none}pre{padding:9.5px;margin:0 0 10px;font-size:13px;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}.container,.container-fluid{margin-right:auto;margin-left:auto}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;border-radius:0}.container,.container-fluid{padding-left:12px;padding-right:12px}.pre-scrollable{overflow-y:scroll}@media (min-width:768px){.container{width:744px}}@media (min-width:992px){.container{width:964px}}@media (min-width:1200px){.container{width:1164px}}.row{margin-left:-12px;margin-right:-12px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-left:12px;padding-right:12px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.666%}.col-xs-10{width:83.333%}.col-xs-9{width:75%}.col-xs-8{width:66.666%}.col-xs-7{width:58.333%}.col-xs-6{width:50%}.col-xs-5{width:41.666%}.col-xs-4{width:33.333%}.col-xs-3{width:25%}.col-xs-2{width:16.666%}.col-xs-1{width:8.333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.666%}.col-xs-pull-10{right:83.333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.666%}.col-xs-pull-7{right:58.333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.666%}.col-xs-pull-4{right:33.333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.666%}.col-xs-pull-1{right:8.333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.666%}.col-xs-push-10{left:83.333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.666%}.col-xs-push-7{left:58.333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.666%}.col-xs-push-4{left:33.333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.666%}.col-xs-push-1{left:8.333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.666%}.col-xs-offset-10{margin-left:83.333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.666%}.col-xs-offset-7{margin-left:58.333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.666%}.col-xs-offset-4{margin-left:33.333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.666%}.col-xs-offset-1{margin-left:8.333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.666%}.col-sm-10{width:83.333%}.col-sm-9{width:75%}.col-sm-8{width:66.666%}.col-sm-7{width:58.333%}.col-sm-6{width:50%}.col-sm-5{width:41.666%}.col-sm-4{width:33.333%}.col-sm-3{width:25%}.col-sm-2{width:16.666%}.col-sm-1{width:8.333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.666%}.col-sm-pull-10{right:83.333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.666%}.col-sm-pull-7{right:58.333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.666%}.col-sm-pull-4{right:33.333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.666%}.col-sm-pull-1{right:8.333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.666%}.col-sm-push-10{left:83.333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.666%}.col-sm-push-7{left:58.333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.666%}.col-sm-push-4{left:33.333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.666%}.col-sm-push-1{left:8.333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.666%}.col-sm-offset-10{margin-left:83.333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.666%}.col-sm-offset-7{margin-left:58.333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.666%}.col-sm-offset-4{margin-left:33.333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.666%}.col-sm-offset-1{margin-left:8.333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.666%}.col-md-10{width:83.333%}.col-md-9{width:75%}.col-md-8{width:66.666%}.col-md-7{width:58.333%}.col-md-6{width:50%}.col-md-5{width:41.666%}.col-md-4{width:33.333%}.col-md-3{width:25%}.col-md-2{width:16.666%}.col-md-1{width:8.333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.666%}.col-md-pull-10{right:83.333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.666%}.col-md-pull-7{right:58.333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.666%}.col-md-pull-4{right:33.333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.666%}.col-md-pull-1{right:8.333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.666%}.col-md-push-10{left:83.333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.666%}.col-md-push-7{left:58.333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.666%}.col-md-push-4{left:33.333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.666%}.col-md-push-1{left:8.333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.666%}.col-md-offset-10{margin-left:83.333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.666%}.col-md-offset-7{margin-left:58.333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.666%}.col-md-offset-4{margin-left:33.333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.666%}.col-md-offset-1{margin-left:8.333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.666%}.col-lg-10{width:83.333%}.col-lg-9{width:75%}.col-lg-8{width:66.666%}.col-lg-7{width:58.333%}.col-lg-6{width:50%}.col-lg-5{width:41.666%}.col-lg-4{width:33.333%}.col-lg-3{width:25%}.col-lg-2{width:16.666%}.col-lg-1{width:8.333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.666%}.col-lg-pull-10{right:83.333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.666%}.col-lg-pull-7{right:58.333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.666%}.col-lg-pull-4{right:33.333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.666%}.col-lg-pull-1{right:8.333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.666%}.col-lg-push-10{left:83.333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.666%}.col-lg-push-7{left:58.333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.666%}.col-lg-push-4{left:33.333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.666%}.col-lg-push-1{left:8.333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.666%}.col-lg-offset-10{margin-left:83.333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.666%}.col-lg-offset-7{margin-left:58.333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.666%}.col-lg-offset-4{margin-left:33.333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.666%}.col-lg-offset-1{margin-left:8.333%}.col-lg-offset-0{margin-left:0}}caption{padding-top:8px;padding-bottom:8px;color:#777}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}table col[class*=col-]{position:static;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.btn-group>.btn-group,.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group,.dropdown-menu{float:left}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset,legend{padding:0;border:0}fieldset{margin:0;min-width:0}legend{width:100%;margin-bottom:20px;font-size:21px;line-height:inherit;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}.form-control,output{font-size:14px;line-height:1.42857143;color:#555;display:block}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}output{padding-top:7px}.form-control{width:100%;height:34px;padding:6px 12px;background-color:#fff;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .form-control-feedback,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.form-control::-ms-expand{border:0;background-color:transparent}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-left:-20px;margin-top:4px\9}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.checkbox-inline.disabled,.checkbox.disabled label,.radio-inline.disabled,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio label,fieldset[disabled] .radio-inline,fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0;min-height:34px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.form-group-sm .form-control,.input-sm{padding:5px 10px;border-radius:3px;font-size:12px}.input-sm{height:30px;line-height:1.5}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;line-height:1.5}.form-group-lg .form-control,.input-lg{border-radius:6px;padding:10px 16px;font-size:18px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;line-height:1.3333333}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;line-height:1.3333333}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.collapsing,.dropdown,.dropup{position:relative}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .form-control-feedback,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .form-control-feedback,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-control-static,.form-inline .form-group{display:inline-block}.form-inline .control-label,.form-inline .form-group{margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-left:-12px;margin-right:-12px}.form-horizontal .has-feedback .form-control-feedback{right:12px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary.active,.btn-primary:active,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success.active,.btn-success:active,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info.active,.btn-info:active,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger.active,.btn-danger:active,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#337ab7;font-weight:400;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{height:0;overflow:hidden;-webkit-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-menu-right,.dropdown-menu.pull-right{left:auto;right:0}.dropdown-header,.dropdown-menu>li>a{display:block;padding:3px 20px;line-height:1.42857143;white-space:nowrap}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{clear:both;font-weight:400;color:#333}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;outline:0;background-color:#337ab7}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;background-color:transparent;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{font-size:12px;color:#777}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.nav-justified>.dropdown .dropdown-menu,.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:992px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn .caret,.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn-lg .caret{border-width:5px 5px 0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child:not(:first-child){border-radius:0 0 4px 4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.nav>li,.nav>li>a{display:block;position:relative}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.badge,.label{font-weight:700;white-space:nowrap;text-align:center}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li>a{padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px;margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0;border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-justified>li,.nav-stacked>li{float:none}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar-collapse{overflow-x:visible;padding-right:12px;padding-left:12px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:992px){.navbar{border-radius:4px}.navbar-header{float:left}.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-left:0;padding-right:0}}.embed-responsive,.modal,.modal-open,.progress{overflow:hidden}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-12px;margin-left:-12px}.navbar-static-top{z-index:1000;border-width:0 0 1px}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 12px;font-size:18px;line-height:20px;height:50px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:992px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-12px}}.navbar-toggle{position:relative;float:right;margin-right:12px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}.navbar-nav{margin:7.5px -12px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:991px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}.progress-bar-striped,.progress-striped .progress-bar,.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}@media (min-width:992px){.navbar-toggle{display:none}.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 12px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin:8px -12px}@media (min-width:768px){.navbar-form .form-control-static,.navbar-form .form-group{display:inline-block}.navbar-form .control-label,.navbar-form .form-group{margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}.breadcrumb>li,.pagination{display:inline-block}.btn .badge,.btn .label{top:-1px;position:relative}@media (max-width:991px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:992px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-text{float:left;margin-left:12px;margin-right:12px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-radius:4px 4px 0 0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.media,.navbar-text{margin-top:15px}.navbar-text{margin-bottom:15px}@media (min-width:992px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-12px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-nav>li>a,.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{background-color:#e7e7e7;color:#555}@media (max-width:991px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>li>a,.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{background-color:#080808;color:#fff}@media (max-width:991px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#777}.pagination{padding-left:0;margin:20px 0;border-radius:4px}.pager li,.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#337ab7;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;background-color:#337ab7;border-color:#337ab7;cursor:default}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.badge,.close,.label{line-height:1}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;background-color:#fff;cursor:not-allowed}a.badge:focus,a.badge:hover,a.label:focus,a.label:hover{color:#fff;cursor:pointer;text-decoration:none}.label{display:inline;padding:.2em .6em .3em;font-size:75%;color:#fff;border-radius:.25em}.label:empty{display:none}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;color:#fff;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.media-object,.thumbnail{display:block}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.jumbotron,.jumbotron .h1,.jumbotron h1{color:inherit}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;background-color:#eee}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.alert,.thumbnail{margin-bottom:20px}.alert .alert-link,.close{font-weight:700}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px;padding-left:12px;padding-right:12px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-left:auto;margin-right:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.modal,.modal-backdrop{right:0;bottom:0;left:0}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-striped .progress-bar-info,.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{text-decoration:none;color:#555;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{background-color:#eee;color:#777;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.panel-heading>.dropdown .dropdown-toggle,.panel-title,.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-title,.panel>.list-group,.panel>.panel-collapse>.list-group,.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-title{margin-top:0;font-size:16px}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel-group .panel-heading,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel>.table-responsive:first-child>.table:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.list-group+.panel-footer,.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-left:15px;padding-right:15px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.popover,.tooltip{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;text-decoration:none}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-content,.popover{background-clip:padding-box}.modal{display:none;position:fixed;top:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0}.modal-backdrop{position:fixed;top:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}.tooltip.top-left .tooltip-arrow,.tooltip.top-right .tooltip-arrow{bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;text-align:left;text-align:start;font-size:12px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px}.tooltip.top-right .tooltip-arrow{left:5px}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow,.tooltip.bottom-left .tooltip-arrow,.tooltip.bottom-right .tooltip-arrow{border-width:0 5px 5px;border-bottom-color:#000;top:0}.tooltip.bottom .tooltip-arrow{left:50%;margin-left:-5px}.tooltip.bottom-left .tooltip-arrow{right:5px;margin-top:-5px}.tooltip.bottom-right .tooltip-arrow{left:5px;margin-top:-5px}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;text-align:left;text-align:start;font-size:14px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.carousel-caption,.carousel-control{color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.carousel,.carousel-inner{position:relative}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.left>.arrow:after,.popover.right>.arrow:after{content:" ";bottom:-10px}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{left:1px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;border-right-width:0;border-left-color:#fff}.carousel-inner{overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-moz-transition:-moz-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;-moz-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;background-color:rgba(0,0,0,0)}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:focus,.carousel-control:hover{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px}.carousel-caption .btn,.text-hide{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{content:" ";display:table}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.hidden,.visible-lg,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;background-color:transparent;border:0}.affix{position:fixed}@-ms-viewport{width:device-width}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}.visible-xs-block{display:block!important}.visible-xs-inline{display:inline!important}.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}.visible-sm-block{display:block!important}.visible-sm-inline{display:inline!important}.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}.visible-md-block{display:block!important}.visible-md-inline{display:inline!important}.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}.visible-lg-block{display:block!important}.visible-lg-inline{display:inline!important}.visible-lg-inline-block{display:inline-block!important}.hidden-lg{display:none!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}.hidden-print{display:none!important}} \ No newline at end of file diff --git a/backend/web/static/css/buttons.dataTables.min.css b/backend/web/static/css/buttons.dataTables.min.css new file mode 100644 index 0000000..112078b --- /dev/null +++ b/backend/web/static/css/buttons.dataTables.min.css @@ -0,0 +1 @@ +@keyframes dtb-spinner{100%{transform:rotate(360deg)}}@-o-keyframes dtb-spinner{100%{-o-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes dtb-spinner{100%{-ms-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes dtb-spinner{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes dtb-spinner{100%{-moz-transform:rotate(360deg);transform:rotate(360deg)}}div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:white;border:2px solid #111;box-shadow:3px 3px 8px rgba(0,0,0,0.3);border-radius:3px;text-align:center;z-index:21}div.dt-button-info h2{padding:0.5em;margin:0;font-weight:normal;border-bottom:1px solid #ddd;background-color:#f3f3f3}div.dt-button-info>div{padding:1em}button.dt-button,div.dt-button,a.dt-button{position:relative;display:inline-block;box-sizing:border-box;margin-right:0.333em;padding:0.5em 1em;border:1px solid #999;border-radius:2px;cursor:pointer;font-size:0.88em;color:black;white-space:nowrap;overflow:hidden;background-color:#e9e9e9;background-image:-webkit-linear-gradient(top, #fff 0%, #e9e9e9 100%);background-image:-moz-linear-gradient(top, #fff 0%, #e9e9e9 100%);background-image:-ms-linear-gradient(top, #fff 0%, #e9e9e9 100%);background-image:-o-linear-gradient(top, #fff 0%, #e9e9e9 100%);background-image:linear-gradient(to bottom, #fff 0%, #e9e9e9 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='white', EndColorStr='#e9e9e9');-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;outline:none}button.dt-button.disabled,div.dt-button.disabled,a.dt-button.disabled{color:#999;border:1px solid #d0d0d0;cursor:default;background-color:#f9f9f9;background-image:-webkit-linear-gradient(top, #fff 0%, #f9f9f9 100%);background-image:-moz-linear-gradient(top, #fff 0%, #f9f9f9 100%);background-image:-ms-linear-gradient(top, #fff 0%, #f9f9f9 100%);background-image:-o-linear-gradient(top, #fff 0%, #f9f9f9 100%);background-image:linear-gradient(to bottom, #fff 0%, #f9f9f9 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#ffffff', EndColorStr='#f9f9f9')}button.dt-button:active:not(.disabled),button.dt-button.active:not(.disabled),div.dt-button:active:not(.disabled),div.dt-button.active:not(.disabled),a.dt-button:active:not(.disabled),a.dt-button.active:not(.disabled){background-color:#e2e2e2;background-image:-webkit-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);background-image:-moz-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);background-image:-ms-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);background-image:-o-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);background-image:linear-gradient(to bottom, #f3f3f3 0%, #e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f3f3f3', EndColorStr='#e2e2e2');box-shadow:inset 1px 1px 3px #999999}button.dt-button:active:not(.disabled):hover:not(.disabled),button.dt-button.active:not(.disabled):hover:not(.disabled),div.dt-button:active:not(.disabled):hover:not(.disabled),div.dt-button.active:not(.disabled):hover:not(.disabled),a.dt-button:active:not(.disabled):hover:not(.disabled),a.dt-button.active:not(.disabled):hover:not(.disabled){box-shadow:inset 1px 1px 3px #999999;background-color:#cccccc;background-image:-webkit-linear-gradient(top, #eaeaea 0%, #ccc 100%);background-image:-moz-linear-gradient(top, #eaeaea 0%, #ccc 100%);background-image:-ms-linear-gradient(top, #eaeaea 0%, #ccc 100%);background-image:-o-linear-gradient(top, #eaeaea 0%, #ccc 100%);background-image:linear-gradient(to bottom, #eaeaea 0%, #ccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#eaeaea', EndColorStr='#cccccc')}button.dt-button:hover,div.dt-button:hover,a.dt-button:hover{text-decoration:none}button.dt-button:hover:not(.disabled),div.dt-button:hover:not(.disabled),a.dt-button:hover:not(.disabled){border:1px solid #666;background-color:#e0e0e0;background-image:-webkit-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);background-image:-moz-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);background-image:-ms-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);background-image:-o-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);background-image:linear-gradient(to bottom, #f9f9f9 0%, #e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f9f9f9', EndColorStr='#e0e0e0')}button.dt-button:focus:not(.disabled),div.dt-button:focus:not(.disabled),a.dt-button:focus:not(.disabled){border:1px solid #426c9e;text-shadow:0 1px 0 #c4def1;outline:none;background-color:#79ace9;background-image:-webkit-linear-gradient(top, #bddef4 0%, #79ace9 100%);background-image:-moz-linear-gradient(top, #bddef4 0%, #79ace9 100%);background-image:-ms-linear-gradient(top, #bddef4 0%, #79ace9 100%);background-image:-o-linear-gradient(top, #bddef4 0%, #79ace9 100%);background-image:linear-gradient(to bottom, #bddef4 0%, #79ace9 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#bddef4', EndColorStr='#79ace9')}.dt-button embed{outline:none}div.dt-buttons{position:relative;float:left}div.dt-buttons.buttons-right{float:right}div.dt-button-collection{position:absolute;top:0;left:0;width:150px;margin-top:3px;padding:8px 8px 4px 8px;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.4);background-color:white;overflow:hidden;z-index:2002;border-radius:5px;box-shadow:3px 3px 5px rgba(0,0,0,0.3);z-index:2002;-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}div.dt-button-collection button.dt-button,div.dt-button-collection div.dt-button,div.dt-button-collection a.dt-button{position:relative;left:0;right:0;display:block;float:none;margin-bottom:4px;margin-right:0}div.dt-button-collection button.dt-button:active:not(.disabled),div.dt-button-collection button.dt-button.active:not(.disabled),div.dt-button-collection div.dt-button:active:not(.disabled),div.dt-button-collection div.dt-button.active:not(.disabled),div.dt-button-collection a.dt-button:active:not(.disabled),div.dt-button-collection a.dt-button.active:not(.disabled){background-color:#dadada;background-image:-webkit-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:-moz-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:-ms-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:-o-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:linear-gradient(to bottom, #f0f0f0 0%, #dadada 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f0f0f0', EndColorStr='#dadada');box-shadow:inset 1px 1px 3px #666}div.dt-button-collection.fixed{position:fixed;top:50%;left:50%;margin-left:-75px;border-radius:0}div.dt-button-collection.fixed.two-column{margin-left:-150px}div.dt-button-collection.fixed.three-column{margin-left:-225px}div.dt-button-collection.fixed.four-column{margin-left:-300px}div.dt-button-collection>*{-webkit-column-break-inside:avoid;break-inside:avoid}div.dt-button-collection.two-column{width:300px;padding-bottom:1px;-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2}div.dt-button-collection.three-column{width:450px;padding-bottom:1px;-webkit-column-count:3;-moz-column-count:3;-ms-column-count:3;-o-column-count:3;column-count:3}div.dt-button-collection.four-column{width:600px;padding-bottom:1px;-webkit-column-count:4;-moz-column-count:4;-ms-column-count:4;-o-column-count:4;column-count:4}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);background:-ms-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-moz-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-o-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, rgba(0,0,0,0.3)), color-stop(1, rgba(0,0,0,0.7)));background:-webkit-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:radial-gradient(ellipse farthest-corner at center, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);z-index:2001}@media screen and (max-width: 640px){div.dt-buttons{float:none !important;text-align:center}}button.dt-button.processing,div.dt-button.processing,a.dt-button.processing{color:rgba(0,0,0,0.2)}button.dt-button.processing:after,div.dt-button.processing:after,a.dt-button.processing:after{position:absolute;top:50%;left:50%;width:16px;height:16px;margin:-8px 0 0 -8px;box-sizing:border-box;display:block;content:' ';border:2px solid #282828;border-radius:50%;border-left-color:transparent;border-right-color:transparent;animation:dtb-spinner 1500ms infinite linear;-o-animation:dtb-spinner 1500ms infinite linear;-ms-animation:dtb-spinner 1500ms infinite linear;-webkit-animation:dtb-spinner 1500ms infinite linear;-moz-animation:dtb-spinner 1500ms infinite linear} diff --git a/backend/web/static/css/chosen.min.css b/backend/web/static/css/chosen.min.css new file mode 100755 index 0000000..b585821 --- /dev/null +++ b/backend/web/static/css/chosen.min.css @@ -0,0 +1,11 @@ +/*! +Chosen, a Select Box Enhancer for jQuery and Prototype +by Patrick Filler for Harvest, http://getharvest.com + +Version 1.5.0 +Full source at https://github.com/harvesthq/chosen +Copyright (c) 2011-2016 Harvest http://getharvest.com + +MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md +This file is generated by `grunt build`, do not edit it by hand. +*/.chosen-container{position:relative;display:inline-block;vertical-align:middle;font-size:13px;-webkit-user-select:none;-moz-user-select:none;user-select:none}.chosen-container *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.chosen-container .chosen-drop{position:absolute;top:100%;left:-9999px;z-index:1010;width:100%;border:1px solid #aaa;border-top:0;background:#fff;box-shadow:0 4px 5px rgba(0,0,0,.15)}.chosen-container.chosen-with-drop .chosen-drop{left:0}.chosen-container a{cursor:pointer}.chosen-container .chosen-single .group-name,.chosen-container .search-choice .group-name{margin-right:4px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:400;color:#999}.chosen-container .chosen-single .group-name:after,.chosen-container .search-choice .group-name:after{content:":";padding-left:2px;vertical-align:top}.chosen-container-single .chosen-single{position:relative;display:block;overflow:hidden;padding:0 0 0 8px;height:25px;border:1px solid #aaa;border-radius:5px;background-color:#fff;background:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#fff),color-stop(50%,#f6f6f6),color-stop(52%,#eee),color-stop(100%,#f4f4f4));background:-webkit-linear-gradient(#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background:-moz-linear-gradient(#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background:-o-linear-gradient(#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background:linear-gradient(#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background-clip:padding-box;box-shadow:0 0 3px #fff inset,0 1px 1px rgba(0,0,0,.1);color:#444;text-decoration:none;white-space:nowrap;line-height:24px}.chosen-container-single .chosen-default{color:#999}.chosen-container-single .chosen-single span{display:block;overflow:hidden;margin-right:26px;text-overflow:ellipsis;white-space:nowrap}.chosen-container-single .chosen-single-with-deselect span{margin-right:38px}.chosen-container-single .chosen-single abbr{position:absolute;top:6px;right:26px;display:block;width:12px;height:12px;background:url(chosen-sprite.png) -42px 1px no-repeat;font-size:1px}.chosen-container-single .chosen-single abbr:hover,.chosen-container-single.chosen-disabled .chosen-single abbr:hover{background-position:-42px -10px}.chosen-container-single .chosen-single div{position:absolute;top:0;right:0;display:block;width:18px;height:100%}.chosen-container-single .chosen-single div b{display:block;width:100%;height:100%;background:url(chosen-sprite.png) 0 2px no-repeat}.chosen-container-single .chosen-search{position:relative;z-index:1010;margin:0;padding:3px 4px;white-space:nowrap}.chosen-container-single .chosen-search input[type=text]{margin:1px 0;padding:4px 20px 4px 5px;width:100%;height:auto;outline:0;border:1px solid #aaa;background:url(chosen-sprite.png) 100% -20px no-repeat;font-size:1em;font-family:sans-serif;line-height:normal;border-radius:0}.chosen-container-single .chosen-drop{margin-top:-1px;border-radius:0 0 4px 4px;background-clip:padding-box}.chosen-container-single.chosen-container-single-nosearch .chosen-search{position:absolute;left:-9999px}.chosen-container .chosen-results{color:#444;position:relative;overflow-x:hidden;overflow-y:auto;margin:0 4px 4px 0;padding:0 0 0 4px;max-height:240px;-webkit-overflow-scrolling:touch}.chosen-container .chosen-results li{display:none;margin:0;padding:5px 6px;list-style:none;line-height:15px;word-wrap:break-word;-webkit-touch-callout:none}.chosen-container .chosen-results li.active-result{display:list-item;cursor:pointer}.chosen-container .chosen-results li.disabled-result{display:list-item;color:#ccc;cursor:default}.chosen-container .chosen-results li.highlighted{background-color:#3875d7;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#3875d7),color-stop(90%,#2a62bc));background-image:-webkit-linear-gradient(#3875d7 20%,#2a62bc 90%);background-image:-moz-linear-gradient(#3875d7 20%,#2a62bc 90%);background-image:-o-linear-gradient(#3875d7 20%,#2a62bc 90%);background-image:linear-gradient(#3875d7 20%,#2a62bc 90%);color:#fff}.chosen-container .chosen-results li.no-results{color:#777;display:list-item;background:#f4f4f4}.chosen-container .chosen-results li.group-result{display:list-item;font-weight:700;cursor:default}.chosen-container .chosen-results li.group-option{padding-left:15px}.chosen-container .chosen-results li em{font-style:normal;text-decoration:underline}.chosen-container-multi .chosen-choices{position:relative;overflow:hidden;margin:0;padding:0 5px;width:100%;height:auto!important;height:1%;border:1px solid #aaa;background-color:#fff;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(1%,#eee),color-stop(15%,#fff));background-image:-webkit-linear-gradient(#eee 1%,#fff 15%);background-image:-moz-linear-gradient(#eee 1%,#fff 15%);background-image:-o-linear-gradient(#eee 1%,#fff 15%);background-image:linear-gradient(#eee 1%,#fff 15%);cursor:text}.chosen-container-multi .chosen-choices li{float:left;list-style:none}.chosen-container-multi .chosen-choices li.search-field{margin:0;padding:0;white-space:nowrap}.chosen-container-multi .chosen-choices li.search-field input[type=text]{margin:1px 0;padding:0;height:25px;outline:0;border:0!important;background:0 0!important;box-shadow:none;color:#999;font-size:100%;font-family:sans-serif;line-height:normal;border-radius:0}.chosen-container-multi .chosen-choices li.search-choice{position:relative;margin:3px 5px 3px 0;padding:3px 20px 3px 5px;border:1px solid #aaa;max-width:100%;border-radius:3px;background-color:#eee;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#f4f4f4),color-stop(50%,#f0f0f0),color-stop(52%,#e8e8e8),color-stop(100%,#eee));background-image:-webkit-linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-moz-linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-o-linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-size:100% 19px;background-repeat:repeat-x;background-clip:padding-box;box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);color:#333;line-height:13px;cursor:default}.chosen-container-multi .chosen-choices li.search-choice span{word-wrap:break-word}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close{position:absolute;top:4px;right:3px;display:block;width:12px;height:12px;background:url(chosen-sprite.png) -42px 1px no-repeat;font-size:1px}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover{background-position:-42px -10px}.chosen-container-multi .chosen-choices li.search-choice-disabled{padding-right:5px;border:1px solid #ccc;background-color:#e4e4e4;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#f4f4f4),color-stop(50%,#f0f0f0),color-stop(52%,#e8e8e8),color-stop(100%,#eee));background-image:-webkit-linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-moz-linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-o-linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);color:#666}.chosen-container-multi .chosen-choices li.search-choice-focus{background:#d4d4d4}.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close{background-position:-42px -10px}.chosen-container-multi .chosen-results{margin:0;padding:0}.chosen-container-multi .chosen-drop .result-selected{display:list-item;color:#ccc;cursor:default}.chosen-container-active .chosen-single{border:1px solid #5897fb;box-shadow:0 0 5px rgba(0,0,0,.3)}.chosen-container-active.chosen-with-drop .chosen-single{border:1px solid #aaa;-moz-border-radius-bottomright:0;border-bottom-right-radius:0;-moz-border-radius-bottomleft:0;border-bottom-left-radius:0;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#eee),color-stop(80%,#fff));background-image:-webkit-linear-gradient(#eee 20%,#fff 80%);background-image:-moz-linear-gradient(#eee 20%,#fff 80%);background-image:-o-linear-gradient(#eee 20%,#fff 80%);background-image:linear-gradient(#eee 20%,#fff 80%);box-shadow:0 1px 0 #fff inset}.chosen-container-active.chosen-with-drop .chosen-single div{border-left:none;background:0 0}.chosen-container-active.chosen-with-drop .chosen-single div b{background-position:-18px 2px}.chosen-container-active .chosen-choices{border:1px solid #5897fb;box-shadow:0 0 5px rgba(0,0,0,.3)}.chosen-container-active .chosen-choices li.search-field input[type=text]{color:#222!important}.chosen-disabled{opacity:.5!important;cursor:default}.chosen-disabled .chosen-choices .search-choice .search-choice-close,.chosen-disabled .chosen-single{cursor:default}.chosen-rtl{text-align:right}.chosen-rtl .chosen-single{overflow:visible;padding:0 8px 0 0}.chosen-rtl .chosen-single span{margin-right:0;margin-left:26px;direction:rtl}.chosen-rtl .chosen-single-with-deselect span{margin-left:38px}.chosen-rtl .chosen-single div{right:auto;left:3px}.chosen-rtl .chosen-single abbr{right:auto;left:26px}.chosen-rtl .chosen-choices li{float:right}.chosen-rtl .chosen-choices li.search-field input[type=text]{direction:rtl}.chosen-rtl .chosen-choices li.search-choice{margin:3px 5px 3px 0;padding:3px 5px 3px 19px}.chosen-rtl .chosen-choices li.search-choice .search-choice-close{right:auto;left:4px}.chosen-rtl .chosen-drop,.chosen-rtl.chosen-container-single-nosearch .chosen-search{left:9999px}.chosen-rtl.chosen-container-single .chosen-results{margin:0 0 4px 4px;padding:0 4px 0 0}.chosen-rtl .chosen-results li.group-option{padding-right:15px;padding-left:0}.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div{border-right:none}.chosen-rtl .chosen-search input[type=text]{padding:4px 5px 4px 20px;background:url(chosen-sprite.png) -30px -20px no-repeat;direction:rtl}.chosen-rtl.chosen-container-single .chosen-single div b{background-position:6px 2px}.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b{background-position:-12px 2px}@media only screen and (-webkit-min-device-pixel-ratio:1.5),only screen and (min-resolution:144dpi),only screen and (min-resolution:1.5dppx){.chosen-container .chosen-results-scroll-down span,.chosen-container .chosen-results-scroll-up span,.chosen-container-multi .chosen-choices .search-choice .search-choice-close,.chosen-container-single .chosen-search input[type=text],.chosen-container-single .chosen-single abbr,.chosen-container-single .chosen-single div b,.chosen-rtl .chosen-search input[type=text]{background-image:url(chosen-sprite@2x.png)!important;background-size:52px 37px!important;background-repeat:no-repeat!important}} \ No newline at end of file diff --git a/backend/web/static/css/daterangepicker.min.css b/backend/web/static/css/daterangepicker.min.css new file mode 100755 index 0000000..630f7ea --- /dev/null +++ b/backend/web/static/css/daterangepicker.min.css @@ -0,0 +1 @@ +.daterangepicker{position:absolute;background:#fff;top:100px;left:20px;padding:4px;margin-top:1px;border-radius:4px;width:278px}.daterangepicker.opensleft:before{position:absolute;top:-7px;right:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,.2);content:''}.daterangepicker.opensleft:after{position:absolute;top:-6px;right:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.daterangepicker.openscenter:after,.daterangepicker.openscenter:before{left:0;right:0;width:0;margin-left:auto;margin-right:auto;display:inline-block;content:'';position:absolute}.daterangepicker.openscenter:before{top:-7px;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,.2)}.daterangepicker.openscenter:after{top:-6px;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent}.daterangepicker.opensright:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,.2);content:''}.daterangepicker.opensright:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.daterangepicker.dropup{margin-top:-5px}.daterangepicker.dropup:before{top:initial;bottom:-7px;border-bottom:initial;border-top:7px solid #ccc}.daterangepicker.dropup:after{top:initial;bottom:-6px;border-bottom:initial;border-top:6px solid #fff}.daterangepicker.dropdown-menu{max-width:none;z-index:3000}.daterangepicker.single .calendar,.daterangepicker.single .ranges{float:none}.daterangepicker .calendar{display:none;max-width:270px;margin:4px}.daterangepicker.show-calendar .calendar{display:block}.daterangepicker .calendar.single .calendar-table{border:none}.daterangepicker .calendar td,.daterangepicker .calendar th{white-space:nowrap;text-align:center;min-width:32px}.daterangepicker .calendar-table{border:1px solid #ddd;padding:4px;border-radius:4px;background:#fff}.daterangepicker table{width:100%;margin:0}.daterangepicker td,.daterangepicker th{text-align:center;width:20px;height:20px;border-radius:4px;white-space:nowrap;cursor:pointer}.daterangepicker td.off,.daterangepicker td.off.end-date,.daterangepicker td.off.in-range,.daterangepicker td.off.start-date{color:#999;background:#fff}.daterangepicker option.disabled,.daterangepicker td.disabled{color:#999;cursor:not-allowed;text-decoration:line-through}.daterangepicker td.available:hover,.daterangepicker th.available:hover{background:#eee}.daterangepicker td.in-range{background:#ebf4f8;border-radius:0}.daterangepicker td.start-date{border-radius:4px 0 0 4px}.daterangepicker td.end-date{border-radius:0 4px 4px 0}.daterangepicker td.start-date.end-date{border-radius:4px}.daterangepicker td.active,.daterangepicker td.active:hover{background-color:#357ebd;border-color:#3071a9;color:#fff}.daterangepicker td.week,.daterangepicker th.week{font-size:80%;color:#ccc}.daterangepicker select.monthselect,.daterangepicker select.yearselect{font-size:12px;padding:1px;height:auto;margin:0;cursor:default}.daterangepicker select.monthselect{margin-right:2%;width:56%}.daterangepicker select.yearselect{width:40%}.daterangepicker select.ampmselect,.daterangepicker select.hourselect,.daterangepicker select.minuteselect,.daterangepicker select.secondselect{width:50px;margin-bottom:0}.daterangepicker th.month{width:auto}.daterangepicker .input-mini{border:1px solid #ccc;border-radius:4px;color:#555;display:block;height:30px;line-height:30px;vertical-align:middle;margin:0 0 5px;padding:0 6px 0 28px;width:100%}.daterangepicker .input-mini.active{border:1px solid #357ebd}.daterangepicker .daterangepicker_input i{position:absolute;left:8px;top:8px}.daterangepicker .daterangepicker_input{position:relative}.daterangepicker .calendar-time{text-align:center;margin:5px auto;line-height:30px;position:relative;padding-left:28px}.daterangepicker .calendar-time select.disabled{color:#ccc;cursor:not-allowed}.daterangepicker .ranges{font-size:11px;float:none;margin:4px;text-align:left}.daterangepicker .ranges ul{list-style:none;margin:0 auto;padding:0;width:100%}.daterangepicker .ranges li{font-size:13px;background:#f5f5f5;border:1px solid #f5f5f5;color:#08c;padding:3px 12px;margin-bottom:8px;border-radius:5px;cursor:pointer}.daterangepicker .ranges li.active,.daterangepicker .ranges li:hover{background:#08c;border:1px solid #08c;color:#fff}@media (min-width:564px){.daterangepicker .calendar,.daterangepicker .ranges,.daterangepicker.single .calendar,.daterangepicker.single .ranges{float:left}.daterangepicker{width:auto}.daterangepicker .ranges ul{width:160px}.daterangepicker.single .ranges ul{width:100%}.daterangepicker .calendar.left .calendar-table{border-right:none;border-top-right-radius:0;border-bottom-right-radius:0}.daterangepicker .calendar.right .calendar-table{border-left:none;border-top-left-radius:0;border-bottom-left-radius:0}.daterangepicker .calendar.left{clear:left;margin-right:0}.daterangepicker.single .calendar.left{clear:none}.daterangepicker .calendar.right{margin-left:0}.daterangepicker .calendar.left .calendar-table,.daterangepicker .left .daterangepicker_input{padding-right:12px}}@media (min-width:730px){.daterangepicker .ranges{width:auto;float:left}.daterangepicker .calendar.left{clear:none}} \ No newline at end of file diff --git a/backend/web/static/css/editor.dataTables.min.css b/backend/web/static/css/editor.dataTables.min.css new file mode 100755 index 0000000..4a6e748 --- /dev/null +++ b/backend/web/static/css/editor.dataTables.min.css @@ -0,0 +1,5 @@ +div.DTE{position:relative}div.DTE div.DTE_Header{position:absolute;top:0;left:0;height:50px;width:100%;background-color:#f3f3f3;border-bottom:1px solid #ddd;padding:16px 10px 2px 16px;font-size:1.3em;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}div.DTE div.DTE_Footer{position:absolute;bottom:0;left:0;height:50px;width:100%;background-color:#f3f3f3;border-top:1px solid #ddd;padding:10px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}div.DTE div.DTE_Body{position:relative}div.DTE div.DTE_Form_Info{margin-bottom:0.5em;display:none}div.DTE div.DTE_Form_Content{position:relative;padding:10px}div.DTE div.DTE_Form_Error{float:left;padding:5px;display:none;color:#b11f1f}div.DTE button.btn,div.DTE div.DTE_Form_Buttons button{position:relative;text-align:center;display:block;margin-top:0;padding:5px 15px;cursor:pointer;float:right;margin-left:0.75em;font-size:14px;text-shadow:0 1px 0 white;border:1px solid #999;-webkit-border-radius:4px;-moz-border-radius:4px;-ms-border-radius:4px;-o-border-radius:4px;border-radius:4px;-webkit-box-shadow:1px 1px 3px #ccc;-moz-box-shadow:1px 1px 3px #ccc;box-shadow:1px 1px 3px #ccc;background-color:#f9f9f9 100%;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 65%, #f9f9f9 100%);background-image:-moz-linear-gradient(top, #fff 0%, #eee 65%, #f9f9f9 100%);background-image:-ms-linear-gradient(top, #fff 0%, #eee 65%, #f9f9f9 100%);background-image:-o-linear-gradient(top, #fff 0%, #eee 65%, #f9f9f9 100%);background-image:linear-gradient(to bottom, #fff 0%, #eee 65%, #f9f9f9 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#ffffff', EndColorStr='#f9f9f9')}div.DTE button.btn:hover,div.DTE div.DTE_Form_Buttons button:hover{border:1px solid #666;-webkit-box-shadow:1px 1px 3px #999;-moz-box-shadow:1px 1px 3px #999;box-shadow:1px 1px 3px #999;background-color:#f4f4f4 100%;background-image:-webkit-linear-gradient(top, #f3f3f3 0%, #dbdbdb 65%, #f4f4f4 100%);background-image:-moz-linear-gradient(top, #f3f3f3 0%, #dbdbdb 65%, #f4f4f4 100%);background-image:-ms-linear-gradient(top, #f3f3f3 0%, #dbdbdb 65%, #f4f4f4 100%);background-image:-o-linear-gradient(top, #f3f3f3 0%, #dbdbdb 65%, #f4f4f4 100%);background-image:linear-gradient(to bottom, #f3f3f3 0%, #dbdbdb 65%, #f4f4f4 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f3f3f3', EndColorStr='#f4f4f4')}div.DTE button.btn:active,div.DTE div.DTE_Form_Buttons button:active{-webkit-box-shadow:inset 1px 1px 3px #999;-moz-box-shadow:inset 1px 1px 3px #999;box-shadow:inset 1px 1px 3px #999}div.DTE button.btn:focus,div.DTE div.DTE_Form_Buttons button:focus{border:1px solid #426c9e;text-shadow:0 1px 0 #c4def1;background-color:#a3d0ef 100%;background-image:-webkit-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);background-image:-moz-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);background-image:-ms-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);background-image:-o-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);background-image:linear-gradient(to bottom, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#a3d0ef', EndColorStr='#a3d0ef');outline:none}div.DTE button.btn:focus:after,div.DTE div.DTE_Form_Buttons button:focus:after{position:absolute;top:0;left:0;right:0;bottom:0;background:white;display:block;content:" ";-webkit-animation-duration:1s;-webkit-animation-name:buttonPulse;-webkit-animation-fill-mode:forwards;-webkit-animation-iteration-count:infinite;-webkit-animation-timing-function:linear;-webkit-animation-direction:alternate;-moz-animation-duration:1s;-moz-animation-name:buttonPulse;-moz-animation-fill-mode:forwards;-moz-animation-iteration-count:infinite;-moz-animation-timing-function:linear;-moz-animation-direction:alternate;-o-animation-duration:1s;-o-animation-name:buttonPulse;-o-animation-fill-mode:forwards;-o-animation-iteration-count:infinite;-o-animation-timing-function:linear;-o-animation-direction:alternate;animation-duration:1s;animation-name:buttonPulse;animation-fill-mode:forwards;animation-iteration-count:infinite;animation-timing-function:linear;animation-direction:alternate}div.DTE.DTE_Action_Remove div.DTE_Body_Content{text-align:center;padding:20px 0}@-webkit-keyframes buttonPulse{0%{opacity:0}100%{opacity:0.2}}@-moz-keyframes buttonPulse{0%{opacity:0}100%{opacity:0.2}}@-o-keyframes buttonPulse{0%{opacity:0}100%{opacity:0.2}}@keyframes buttonPulse{0%{opacity:0}100%{opacity:0.2}}div.DTTT_container{float:left}div.DTE_Field input,div.DTE_Field textarea{box-sizing:border-box;background-color:white;-webkit-transition:background-color ease-in-out .15s;transition:background-color ease-in-out .15s}div.DTE_Field input:focus,div.DTE_Field textarea:focus{background-color:#ffffee}div.DTE_Field input[type="color"],div.DTE_Field input[type="date"],div.DTE_Field input[type="datetime"],div.DTE_Field input[type="datetime-local"],div.DTE_Field input[type="email"],div.DTE_Field input[type="month"],div.DTE_Field input[type="number"],div.DTE_Field input[type="password"],div.DTE_Field input[type="search"],div.DTE_Field input[type="tel"],div.DTE_Field input[type="text"],div.DTE_Field input[type="time"],div.DTE_Field input[type="url"],div.DTE_Field input[type="week"]{padding:6px 4px;width:100%}div.DTE_Field label div.DTE_Label_Info{font-size:0.85em;margin-top:0.25em}div.DTE_Field label div.DTE_Label_Info:empty{margin-top:0}div.DTE_Field div.DTE_Field_Info,div.DTE_Field div.DTE_Field_Message,div.DTE_Field div.DTE_Field_Error{font-size:11px;line-height:1em;margin-top:5px}div.DTE_Field div.DTE_Field_Info:empty,div.DTE_Field div.DTE_Field_Message:empty,div.DTE_Field div.DTE_Field_Error:empty{margin-top:0}div.DTE_Field div.DTE_Field_Error{display:none;color:#b11f1f}div.DTE_Field div.multi-value{display:none;border:1px dotted #666;border-radius:3px;padding:5px;background-color:#fafafa;cursor:pointer}div.DTE_Field div.multi-value span{font-size:0.8em;line-height:1.25em;display:block;color:#666}div.DTE_Field div.multi-value.multi-noEdit{border:1px solid #ccc;cursor:auto;background-color:#fcfcfc}div.DTE_Field div.multi-value.multi-noEdit:hover{background-color:#fcfcfc}div.DTE_Field div.multi-value:hover{background-color:#f1f1f1}div.DTE_Field.disabled{color:grey}div.DTE_Field.disabled div.multi-value{cursor:default;border:1px dotted #aaa;background-color:transparent}div.DTE_Field div.multi-restore{display:none;margin-top:0.5em;font-size:0.8em;line-height:1.25em;color:#3879d9}div.DTE_Field div.multi-restore:hover{text-decoration:underline;cursor:pointer}div.DTE_Field_Type_textarea textarea{padding:3px;width:100%;height:80px}div.DTE_Field.DTE_Field_Type_date img{vertical-align:middle;cursor:pointer;*cursor:hand}div.DTE_Field.DTE_Field_Type_date input.jqueryui{width:87%;margin-right:6px}div.DTE_Field_Type_checkbox div.DTE_Field_Input>div>div,div.DTE_Field_Type_radio div.DTE_Field_Input>div>div{margin-bottom:0.25em}div.DTE_Field_Type_checkbox div.DTE_Field_Input>div>div:last-child,div.DTE_Field_Type_radio div.DTE_Field_Input>div>div:last-child{margin-bottom:0}div.DTE_Field_Type_checkbox div.DTE_Field_Input>div>div label,div.DTE_Field_Type_radio div.DTE_Field_Input>div>div label{margin-left:0.75em;vertical-align:middle}div.DTE_Field_Type_select div.DTE_Field_Input{padding-top:4px}div.DTE_Body{padding:50px 0}div.DTE_Body div.DTE_Body_Content{position:relative;overflow:auto}div.DTE_Body div.DTE_Body_Content div.DTE_Form_Info{padding:1em 1em 0 1em;margin:0}div.DTE_Body div.DTE_Body_Content div.DTE_Field{position:relative;zoom:1;clear:both;padding:5px 20%;border:1px solid transparent}div.DTE_Body div.DTE_Body_Content div.DTE_Field:after{display:block;content:".";height:0;line-height:0;clear:both;visibility:hidden}div.DTE_Body div.DTE_Body_Content div.DTE_Field:hover{background-color:#f9f9f9;border:1px solid #f3f3f3}div.DTE_Body div.DTE_Body_Content div.DTE_Field>label{float:left;width:40%;padding-top:6px}div.DTE_Body div.DTE_Body_Content div.DTE_Field>div.DTE_Field_Input{float:right;width:60%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full{padding:5px 0 5px 20%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full>label{width:30%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full>div.DTE_Field_Input{width:70%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.block>div.DTE_Field_Input{float:none;clear:both;width:100%}html[dir="rtl"] div.DTE_Body div.DTE_Body_Content div.DTE_Field>label{float:right}html[dir="rtl"] div.DTE_Body div.DTE_Body_Content div.DTE_Field>div.DTE_Field_Input{float:left}html[dir="rtl"] div.DTE div.DTE_Form_Buttons button{float:left}@media only screen and (max-width: 768px){div.DTE_Body div.DTE_Body_Content div.DTE_Field{padding:5px 10%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full{padding:5px 0 5px 10%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full>label{width:35.5%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full>div.DTE_Field_Input{width:64.5%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.block>div.DTE_Field_Input{width:100%}}@media only screen and (max-width: 640px){div.DTE_Body div.DTE_Body_Content div.DTE_Field{padding:5px 0}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full{padding:5px 0%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full>label{width:40%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full>div.DTE_Field_Input{width:60%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.block>div.DTE_Field_Input{width:100%}}@media only screen and (max-width: 580px){div.DTE_Body div.DTE_Body_Content div.DTE_Field{position:relative;zoom:1;clear:both;padding:5px 0}div.DTE_Body div.DTE_Body_Content div.DTE_Field>label{float:none;width:auto;padding-top:0}div.DTE_Body div.DTE_Body_Content div.DTE_Field>div.DTE_Field_Input{float:none;width:auto}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full,div.DTE_Body div.DTE_Body_Content div.DTE_Field.block{padding:5px 0}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full>label,div.DTE_Body div.DTE_Body_Content div.DTE_Field.full>div.DTE_Field_Input,div.DTE_Body div.DTE_Body_Content div.DTE_Field.block>label,div.DTE_Body div.DTE_Body_Content div.DTE_Field.block>div.DTE_Field_Input{width:100%}}div.DTE_Bubble{position:absolute;z-index:11;margin-top:-6px;opacity:0}div.DTE_Bubble div.DTE_Bubble_Liner{position:absolute;bottom:0;border:1px solid black;width:300px;margin-left:-150px;background-color:white;box-shadow:2px 2px 7px #555;border-radius:5px;border:2px solid #444;padding:1em;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table{display:table;width:100%}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table>form{display:table-cell}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table>form div.DTE_Form_Content{padding:0}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table>form div.DTE_Form_Content div.DTE_Field{position:relative;zoom:1;margin-bottom:0.5em}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table>form div.DTE_Form_Content div.DTE_Field:last-child{margin-bottom:0}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table div.DTE_Form_Buttons{display:table-cell;vertical-align:bottom;padding:0 0 0 0.75em;width:1%}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Header{border-top-left-radius:5px;border-top-right-radius:5px}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Header+div.DTE_Form_Info,div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Header+div.DTE_Bubble_Table{padding-top:42px}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Form_Error{float:none;display:none;padding:0;margin-bottom:0.5em}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Close{position:absolute;top:-11px;right:-11px;width:22px;height:22px;border:2px solid white;background-color:black;text-align:center;border-radius:15px;cursor:pointer;z-index:12;box-shadow:2px 2px 6px #111}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Close:after{content:'\00d7';color:white;font-weight:bold;font-size:18px;line-height:22px;font-family:'Courier New', Courier, monospace;padding-left:1px}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Close:hover{background-color:#092079;box-shadow:2px 2px 9px #111}div.DTE_Bubble div.DTE_Bubble_Triangle{position:absolute;height:10px;width:10px;top:-6px;background-color:white;border:2px solid #444;border-top:none;border-right:none;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}div.DTE_Bubble.below div.DTE_Bubble_Liner{top:10px;bottom:auto}div.DTE_Bubble.below div.DTE_Bubble_Triangle{top:4px;-webkit-transform:rotate(135deg);-moz-transform:rotate(135deg);-ms-transform:rotate(135deg);-o-transform:rotate(135deg);transform:rotate(135deg)}div.DTE_Bubble_Background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);background:-ms-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-moz-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-o-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, rgba(0,0,0,0.3)), color-stop(1, rgba(0,0,0,0.7)));background:-webkit-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:radial-gradient(ellipse farthest-corner at center, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);z-index:10}div.DTE_Bubble_Background>div{position:absolute;top:0;right:0;left:0;bottom:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)"}div.DTE_Bubble_Background>div:not([dummy]){filter:progid:DXImageTransform.Microsoft.gradient(enabled='false')}div.DTE_Inline{position:relative;display:table;width:100%}div.DTE_Inline div.DTE_Inline_Field,div.DTE_Inline div.DTE_Inline_Buttons{display:table-cell;vertical-align:middle}div.DTE_Inline div.DTE_Inline_Field div.DTE_Field,div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Field{padding:0}div.DTE_Inline div.DTE_Inline_Field div.DTE_Field>label,div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Field>label{display:none}div.DTE_Inline div.DTE_Inline_Field div.DTE_Field input,div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Field input{width:100%}div.DTE_Inline div.DTE_Inline_Field div.DTE_Form_Buttons button,div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Form_Buttons button{margin:-6px 0 -6px 4px;padding:5px}div.DTE_Inline div.DTE_Field input[type="color"],div.DTE_Inline div.DTE_Field input[type="date"],div.DTE_Inline div.DTE_Field input[type="datetime"],div.DTE_Inline div.DTE_Field input[type="datetime-local"],div.DTE_Inline div.DTE_Field input[type="email"],div.DTE_Inline div.DTE_Field input[type="month"],div.DTE_Inline div.DTE_Field input[type="number"],div.DTE_Inline div.DTE_Field input[type="password"],div.DTE_Inline div.DTE_Field input[type="search"],div.DTE_Inline div.DTE_Field input[type="tel"],div.DTE_Inline div.DTE_Field input[type="text"],div.DTE_Inline div.DTE_Field input[type="time"],div.DTE_Inline div.DTE_Field input[type="url"],div.DTE_Inline div.DTE_Field input[type="week"]{margin:-6px 0}div.DTE_Inline div.DTE_Field_Error,div.DTE_Inline div.DTE_Form_Error{font-size:11px;line-height:1.2em;padding:0;margin-top:10px}div.DTE_Inline div.DTE_Field_Error:empty,div.DTE_Inline div.DTE_Form_Error:empty{margin-top:0}span.dtr-data div.DTE_Inline{display:inline-table}div.DTED_Lightbox_Wrapper{position:fixed;top:0;left:50%;margin-left:-390px;width:780px;height:100%;z-index:11}div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container{*position:absolute;*top:50%;#position:absolute;#top:50%;display:table;height:100%;width:100%}div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper{*position:relative;#position:relative;display:table-cell;vertical-align:middle;width:100%}div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content{*top:-50%;#top:-50%;position:relative;border:7px solid rgba(220,220,220,0.5);box-shadow:2px 2px 10px #555;border-radius:10px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTE{background:white;border-radius:6px;box-shadow:0 0 5px #555;border:2px solid #444;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTE div.DTE_Header{top:2px;left:2px;right:2px;width:auto;border-top-left-radius:5px;border-top-right-radius:5px}div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTE div.DTE_Footer{bottom:2px;left:2px;right:2px;width:auto;border-bottom-left-radius:5px;border-bottom-right-radius:5px}div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTED_Lightbox_Close{position:absolute;top:-11px;right:-11px;width:22px;height:22px;border:2px solid white;background-color:black;text-align:center;border-radius:15px;cursor:pointer;z-index:12;box-shadow:2px 2px 6px #111}div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTED_Lightbox_Close:after{content:'\00d7';color:white;font-weight:bold;font-size:18px;line-height:22px;font-family:'Courier New', Courier, monospace;padding-left:1px}div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTED_Lightbox_Close:hover{background-color:#092079;box-shadow:2px 2px 9px #111}div.DTED_Lightbox_Background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);background:-ms-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-moz-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-o-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, rgba(0,0,0,0.3)), color-stop(1, rgba(0,0,0,0.7)));background:-webkit-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:radial-gradient(ellipse farthest-corner at center, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);z-index:10}div.DTED_Lightbox_Background>div{position:absolute;top:0;right:0;left:0;bottom:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)"}div.DTED_Lightbox_Background>div:not([dummy]){filter:progid:DXImageTransform.Microsoft.gradient(enabled='false')}body.DTED_Lightbox_Mobile div.DTED_Lightbox_Background{height:0}body.DTED_Lightbox_Mobile div.DTED_Lightbox_Shown{display:none}body.DTED_Lightbox_Mobile div.DTED_Lightbox_Wrapper{position:absolute;top:0px;left:0px;right:0px;bottom:0px;width:auto;height:auto;margin-left:0;-webkit-overflow-scrolling:touch}body.DTED_Lightbox_Mobile div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container{display:block}body.DTED_Lightbox_Mobile div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper{display:block}body.DTED_Lightbox_Mobile div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content{border:4px solid rgba(220,220,220,0.5);border-radius:0}body.DTED_Lightbox_Mobile div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTE{border-radius:0;box-shadow:0 0 5px #555;border:2px solid #444}body.DTED_Lightbox_Mobile div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTE div.DTE_Header{border-top-left-radius:0;border-top-right-radius:0}body.DTED_Lightbox_Mobile div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTE div.DTE_Footer{border-bottom-left-radius:0;border-bottom-right-radius:0}body.DTED_Lightbox_Mobile div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTED_Lightbox_Close{top:11px;right:15px}@media only screen and (max-width: 780px){div.DTED_Lightbox_Wrapper{position:fixed;top:0;left:0;width:100%;margin-left:0}}div.DTED_Envelope_Wrapper{position:absolute;top:0;bottom:0;left:50%;height:100%;z-index:11;display:none;overflow:hidden}div.DTED_Envelope_Wrapper div.DTED_Envelope_Shadow{position:absolute;top:-10px;left:10px;right:10px;height:10px;z-index:10;box-shadow:0 0 20px black}div.DTED_Envelope_Wrapper div.DTED_Envelope_Container{position:absolute;top:0;left:5%;width:90%;border-left:1px solid #777;border-right:1px solid #777;border-bottom:1px solid #777;box-shadow:3px 3px 10px #555;border-bottom-left-radius:5px;border-bottom-right-radius:5px;background-color:white}div.DTED_Envelope_Wrapper div.DTED_Envelope_Container div.DTE_Processing_Indicator{right:36px}div.DTED_Envelope_Wrapper div.DTED_Envelope_Container div.DTE_Footer{border-bottom-left-radius:5px;border-bottom-right-radius:5px}div.DTED_Envelope_Wrapper div.DTED_Envelope_Container div.DTED_Envelope_Close{position:absolute;top:16px;right:10px;width:18px;height:18px;cursor:pointer;*cursor:hand;z-index:12;text-align:center;font-size:12px;background:#F8F8F8;background:-webkit-gradient(linear, center bottom, center top, from(#CCC), to(#fff));background:-moz-linear-gradient(top, #fff, #CCC);background:linear-gradient(to bottom, #fff, #CCC);text-shadow:0 1px 0 white;border:1px solid #999;border-radius:2px;-moz-border-radius:2px;-webkit-border-radius:2px;box-shadow:0px 0px 1px #999;-moz-box-shadow:0px 0px 1px #999;-webkit-box-shadow:0px 0px 1px #999}div.DTED_Envelope_Background{position:fixed;top:0;left:0;width:100%;height:100%;z-index:10;background:rgba(0,0,0,0.4);background:-ms-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.1) 0%, rgba(0,0,0,0.4) 100%);background:-moz-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.1) 0%, rgba(0,0,0,0.4) 100%);background:-o-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.1) 0%, rgba(0,0,0,0.4) 100%);background:-webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, rgba(0,0,0,0.1)), color-stop(1, rgba(0,0,0,0.4)));background:-webkit-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.1) 0%, rgba(0,0,0,0.4) 100%);background:radial-gradient(ellipse farthest-corner at center, rgba(0,0,0,0.1) 0%, rgba(0,0,0,0.4) 100%)}table.dataTable tbody tr.highlight{background-color:#FFFBCC !important}table.dataTable tbody tr.highlight,table.dataTable tbody tr.noHighlight,table.dataTable tbody tr.highlight td,table.dataTable tbody tr.noHighlight td{-webkit-transition:background-color 500ms linear;-moz-transition:background-color 500ms linear;-ms-transition:background-color 500ms linear;-o-transition:background-color 500ms linear;transition:background-color 500ms linear}table.dataTable.stripe tbody tr.odd.highlight,table.dataTable.display tbody tr.odd.highlight{background-color:#f9f5c7}table.dataTable.hover tbody tr:hover.highlight,table.dataTable.hover tbody tr.odd:hover.highlight,table.dataTable.hover tbody tr.even:hover.highlight,table.dataTable.display tbody tr:hover.highlight,table.dataTable.display tbody tr.odd:hover.highlight,table.dataTable.display tbody tr.even:hover.highlight{background-color:#f6f2c5}table.dataTable.order-column tbody tr.highlight>.sorting_1,table.dataTable.order-column tbody tr.highlight>.sorting_2,table.dataTable.order-column tbody tr.highlight>.sorting_3,table.dataTable.display tbody tr.highlight>.sorting_1,table.dataTable.display tbody tr.highlight>.sorting_2,table.dataTable.display tbody tr.highlight>.sorting_3{background-color:#faf6c8}table.dataTable.display tbody tr.odd.highlight>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.highlight>.sorting_1{background-color:#f1edc1}table.dataTable.display tbody tr.odd.highlight>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.highlight>.sorting_2{background-color:#f3efc2}table.dataTable.display tbody tr.odd.highlight>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.highlight>.sorting_3{background-color:#f5f1c4}table.dataTable.display tbody tr.even.highlight>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.highlight>.sorting_1{background-color:#faf6c8}table.dataTable.display tbody tr.even.highlight>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.highlight>.sorting_2{background-color:#fcf8ca}table.dataTable.display tbody tr.even.highlight>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.highlight>.sorting_3{background-color:#fefacb}table.dataTable.display tbody tr:hover.highlight>.sorting_1,table.dataTable.display tbody tr.odd:hover.highlight>.sorting_1,table.dataTable.display tbody tr.even:hover.highlight>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.highlight>.sorting_1,table.dataTable.order-column.hover tbody tr.odd:hover.highlight>.sorting_1,table.dataTable.order-column.hover tbody tr.even:hover.highlight>.sorting_1{background-color:#eae6bb}table.dataTable.display tbody tr:hover.highlight>.sorting_2,table.dataTable.display tbody tr.odd:hover.highlight>.sorting_2,table.dataTable.display tbody tr.even:hover.highlight>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.highlight>.sorting_2,table.dataTable.order-column.hover tbody tr.odd:hover.highlight>.sorting_2,table.dataTable.order-column.hover tbody tr.even:hover.highlight>.sorting_2{background-color:#ece8bd}table.dataTable.display tbody tr:hover.highlight>.sorting_3,table.dataTable.display tbody tr.odd:hover.highlight>.sorting_3,table.dataTable.display tbody tr.even:hover.highlight>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.highlight>.sorting_3,table.dataTable.order-column.hover tbody tr.odd:hover.highlight>.sorting_3,table.dataTable.order-column.hover tbody tr.even:hover.highlight>.sorting_3{background-color:#efebbf}div.DTE div.editor_upload{padding-top:4px}div.DTE div.editor_upload div.eu_table{display:table;width:100%}div.DTE div.editor_upload div.row{display:table-row}div.DTE div.editor_upload div.cell{display:table-cell;position:relative;width:50%;vertical-align:top}div.DTE div.editor_upload div.cell+div.cell{padding-left:10px}div.DTE div.editor_upload div.row+div.row div.cell{padding-top:10px}div.DTE div.editor_upload button.btn,div.DTE div.editor_upload input[type=file]{width:100%;height:2.3em;font-size:0.8em;text-align:center;line-height:1em}div.DTE div.editor_upload input[type=file]{position:absolute;top:0;left:0;width:100%;opacity:0}div.DTE div.editor_upload div.drop{position:relative;box-sizing:border-box;width:100%;height:100%;border:3px dashed #ccc;border-radius:6px;min-height:4em;color:#999;padding-top:3px;text-align:center}div.DTE div.editor_upload div.drop.over{border:3px dashed #111;color:#111}div.DTE div.editor_upload div.drop span{max-width:75%;font-size:0.85em;line-height:1em}div.DTE div.editor_upload div.rendered img{max-width:8em;margin:0 auto}div.DTE div.editor_upload.noDrop div.drop{display:none}div.DTE div.editor_upload.noDrop div.row.second{display:none}div.DTE div.editor_upload.noDrop div.rendered{margin-top:10px}div.DTE div.editor_upload.noClear div.clearValue button{display:none}div.DTE div.editor_upload.multi div.cell{display:block;width:100%}div.DTE div.editor_upload.multi div.cell div.drop{min-height:0;padding-bottom:5px}div.DTE div.editor_upload.multi div.clearValue{display:none}div.DTE div.editor_upload.multi ul{list-style-type:none;margin:0;padding:0}div.DTE div.editor_upload.multi ul li{position:relative;margin-top:0.5em}div.DTE div.editor_upload.multi ul li:first-child{margin-top:0}div.DTE div.editor_upload.multi ul li img{vertical-align:middle}div.DTE div.editor_upload.multi ul li button{position:absolute;width:40px;right:0;top:50%;margin-top:-1.5em}div.editor-datetime{position:absolute;background-color:white;z-index:2050;border:1px solid #ccc;box-shadow:0 5px 15px -5px rgba(0,0,0,0.5);padding-bottom:5px}div.editor-datetime div.editor-datetime-title{text-align:center;padding:5px 0px 3px}div.editor-datetime table{border-spacing:0;margin:6px 13px}div.editor-datetime table th{font-size:0.8em;color:#777;font-weight:normal;width:14.285714286%;padding:0 0 4px 0;text-align:center}div.editor-datetime table td{font-size:0.9em;color:#444;padding:0}div.editor-datetime table td.day{text-align:right;background:#f5f5f5}div.editor-datetime table td.day.disabled{color:#aaa;background:white}div.editor-datetime table td.day.today{background-color:#ddd}div.editor-datetime table td.day.today button{font-weight:bold}div.editor-datetime table td.day.selected button{background:#4E6CA3;color:white;border-radius:2px}div.editor-datetime table td.day button:hover{background:#ff8000;color:white;border-radius:2px}div.editor-datetime table td.editor-datetime-week{font-size:0.7em}div.editor-datetime table button{width:100%;box-sizing:border-box;border:none;background:transparent;font-size:inherit;color:inherit;text-align:inherit;padding:5px 9px;cursor:pointer;margin:0}div.editor-datetime table.weekNumber th{width:12.5%}div.editor-datetime div.editor-datetime-label{position:relative;display:inline-block;height:30px;padding:5px 6px;border:1px solid transparent;box-sizing:border-box;cursor:pointer}div.editor-datetime div.editor-datetime-label:hover{border:1px solid #ddd;border-radius:2px;background-color:#f5f5f5}div.editor-datetime div.editor-datetime-label select{position:absolute;top:6px;left:0;cursor:pointer;opacity:0;-ms-filter:"alpha(opacity=0)"}div.editor-datetime div.editor-datetime-time{text-align:center}div.editor-datetime div.editor-datetime-time>span{vertical-align:middle}div.editor-datetime div.editor-datetime-time div.editor-datetime-timeblock{display:inline-block;vertical-align:middle}div.editor-datetime div.editor-datetime-iconLeft,div.editor-datetime div.editor-datetime-iconRight,div.editor-datetime div.editor-datetime-iconUp,div.editor-datetime div.editor-datetime-iconDown{width:30px;height:30px;background-position:center;background-repeat:no-repeat;opacity:0.3;overflow:hidden;box-sizing:border-box}div.editor-datetime div.editor-datetime-iconLeft:hover,div.editor-datetime div.editor-datetime-iconRight:hover,div.editor-datetime div.editor-datetime-iconUp:hover,div.editor-datetime div.editor-datetime-iconDown:hover{border:1px solid #ccc;border-radius:2px;background-color:#f0f0f0;opacity:0.6}div.editor-datetime div.editor-datetime-iconLeft button,div.editor-datetime div.editor-datetime-iconRight button,div.editor-datetime div.editor-datetime-iconUp button,div.editor-datetime div.editor-datetime-iconDown button{border:none;background:transparent;text-indent:30px;height:100%;width:100%;cursor:pointer}div.editor-datetime div.editor-datetime-iconLeft{position:absolute;top:5px;left:5px;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==")}div.editor-datetime div.editor-datetime-iconRight{position:absolute;top:5px;right:5px;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=")}div.editor-datetime div.editor-datetime-iconUp{height:20px;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAALCAMAAABf9c24AAAAFVBMVEX///99fX1+fn57e3t6enoAAAAAAAC73bqPAAAABnRSTlMAYmJkZt92bnysAAAAL0lEQVR4AWOgJmBhxCvLyopHnpmVjY2VCadeoCxIHrcsWJ4RlyxCHlMWCTBRJxwAjrIBDMWSiM0AAAAASUVORK5CYII=")}div.editor-datetime div.editor-datetime-iconDown{height:20px;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAALCAMAAABf9c24AAAAFVBMVEX///99fX1+fn57e3t6enoAAAAAAAC73bqPAAAABnRSTlMAYmJkZt92bnysAAAAMElEQVR4AWOgDmBiRQIsmPKMrGxQgJDFlEfIYpoPk8Utz8qM232MYFfhkQfKUg8AANefAQxecJ58AAAAAElFTkSuQmCC")}div.editor-datetime-error{padding:0 1em;max-width:240px;font-size:11px;line-height:1.25em;text-align:center;color:#b11f1f}div.DTE div.DTE_Processing_Indicator{position:absolute;top:17px;right:9px;height:2em;width:2em;z-index:20;font-size:12px;display:none;-webkit-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0)}div.DTE.processing div.DTE_Processing_Indicator{display:block}div.DTE.DTE_Inline div.DTE_Processing_Indicator{top:5px;right:6px;font-size:6px}div.DTE.DTE_Bubble div.DTE_Processing_Indicator{top:10px;right:14px;font-size:8px}div.DTE div.DTE_Processing_Indicator span,div.DTE div.DTE_Processing_Indicator:before,div.DTE div.DTE_Processing_Indicator:after{display:block;background:black;width:0.5em;height:1.5em;border:1px solid rgba(0,0,0,0.4);background-color:rgba(0,0,0,0.1);-webkit-animation:editorProcessing 0.9s infinite ease-in-out;animation:editorProcessing 0.9s infinite ease-in-out}div.DTE div.DTE_Processing_Indicator:before,div.DTE div.DTE_Processing_Indicator:after{position:absolute;top:0;content:''}div.DTE div.DTE_Processing_Indicator:before{left:-1em;-webkit-animation-delay:-0.3s;animation-delay:-0.3s}div.DTE div.DTE_Processing_Indicator span{-webkit-animation-delay:-0.15s;animation-delay:-0.15s}div.DTE div.DTE_Processing_Indicator:after{left:1em}@-webkit-keyframes editorProcessing{0%, + 80%, + 100%{transform:scale(1, 1)}40%{transform:scale(1, 1.5)}}@keyframes editorProcessing{0%, + 80%, + 100%{transform:scale(1, 1)}40%{transform:scale(1, 1.5)}} diff --git a/backend/web/static/css/font-awesome.min.css b/backend/web/static/css/font-awesome.min.css new file mode 100755 index 0000000..36753c5 --- /dev/null +++ b/backend/web/static/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.5.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../font-awesome/4.5.0/fonts/fontawesome-webfont.eot?v=4.5.0');src:url('../font-awesome/4.5.0/fonts/fontawesome-webfont.eot?#iefix&v=4.5.0') format('embedded-opentype'),url('../font-awesome/4.5.0/fonts/fontawesome-webfont.woff2?v=4.5.0') format('woff2'),url('../font-awesome/4.5.0/fonts/fontawesome-webfont.woff?v=4.5.0') format('woff'),url('../font-awesome/4.5.0/fonts/fontawesome-webfont.ttf?v=4.5.0') format('truetype'),url('../font-awesome/4.5.0/fonts/fontawesome-webfont.svg?v=4.5.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"} diff --git a/backend/web/static/css/fonts.googleapis.com.css b/backend/web/static/css/fonts.googleapis.com.css new file mode 100755 index 0000000..9c05fd8 --- /dev/null +++ b/backend/web/static/css/fonts.googleapis.com.css @@ -0,0 +1,12 @@ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 300; + src: local('Open Sans Light'), local('OpenSans-Light'), url(/static/font-awesome/opensans/v13/DXI1ORHCpsQm3Vp6mXoaTXhCUOGz7vYGh680lGh-uXM.woff) format('woff'); +} +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 400; + src: local('Open Sans'), local('OpenSans'), url(/static/font-awesome/opensans/v13/cJZKeOuBrn4kERxqtaUH3T8E0i7KZn-EPnyo3HZu7kw.woff) format('woff'); +} diff --git a/backend/web/static/css/jquery-ui.custom.min.css b/backend/web/static/css/jquery-ui.custom.min.css new file mode 100755 index 0000000..4c35f1a --- /dev/null +++ b/backend/web/static/css/jquery-ui.custom.min.css @@ -0,0 +1,4 @@ +/*! jQuery UI - v1.11.4 - 2015-09-20 +* http://jqueryui.com +* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, slider.css +* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:after,.ui-helper-clearfix:before{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-autohide .ui-resizable-handle,.ui-resizable-disabled .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted #000}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0} \ No newline at end of file diff --git a/backend/web/static/css/jquery-ui.min.css b/backend/web/static/css/jquery-ui.min.css new file mode 100755 index 0000000..c6d7005 --- /dev/null +++ b/backend/web/static/css/jquery-ui.min.css @@ -0,0 +1,4 @@ +/*! jQuery UI - v1.11.4 - 2015-09-20 +* http://jqueryui.com +* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css +* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */.ui-helper-reset,.ui-menu{outline:0;list-style:none}.ui-button,.ui-spinner,.ui-spinner-input{vertical-align:middle}.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;line-height:1.3;text-decoration:none;font-size:100%}.ui-helper-clearfix:after,.ui-helper-clearfix:before{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-autohide .ui-resizable-handle,.ui-resizable-disabled .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted #000}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0;padding:.5em .5em .5em .7em;min-height:0;font-size:100%}.ui-accordion .ui-accordion-icons,.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;text-align:center;overflow:visible}.ui-button,.ui-button:active,.ui-button:hover,.ui-button:link,.ui-button:visited{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-icons-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-icons-only .ui-button-icon-primary,.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary{left:.5em}.ui-button-icons-only .ui-button-icon-secondary,.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}button.ui-button::-moz-focus-inner,input.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-next,.ui-datepicker .ui-datepicker-prev{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-next-hover,.ui-datepicker .ui-datepicker-prev-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-next span,.ui-datepicker .ui-datepicker-prev span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:700;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td a,.ui-datepicker td span{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-multi .ui-datepicker-group,.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:0 0;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-slider-vertical .ui-slider-range-min,.ui-spinner-down{bottom:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{padding:0;margin:0;display:block}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{position:relative;margin:0;padding:3px 1em 3px .4em;cursor:pointer;min-height:0;list-style-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0}.ui-menu .ui-state-active,.ui-menu .ui-state-focus{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url(data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==);height:100%;filter:alpha(opacity=25);opacity:.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:700;line-height:1.5;padding:2px .4em;margin:.5em 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-button{display:inline-block;overflow:hidden;position:relative;text-decoration:none;cursor:pointer}.ui-selectmenu-button span.ui-icon{right:.5em;left:auto;margin-top:-8px;position:absolute;top:50%}.ui-selectmenu-button span.ui-selectmenu-text{text-align:left;padding:.4em 2.1em .4em 1em;display:block;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0}.ui-spinner-input{border:none;background:0 0;color:inherit;padding:0;margin:.2em 22px .2em .4em}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:0 0}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px} \ No newline at end of file diff --git a/backend/web/static/css/select.dataTables.min.css b/backend/web/static/css/select.dataTables.min.css new file mode 100644 index 0000000..2f5623a --- /dev/null +++ b/backend/web/static/css/select.dataTables.min.css @@ -0,0 +1 @@ +table.dataTable tbody>tr.selected,table.dataTable tbody>tr>.selected{background-color:#B0BED9}table.dataTable.stripe tbody>tr.odd.selected,table.dataTable.stripe tbody>tr.odd>.selected,table.dataTable.display tbody>tr.odd.selected,table.dataTable.display tbody>tr.odd>.selected{background-color:#acbad4}table.dataTable.hover tbody>tr.selected:hover,table.dataTable.hover tbody>tr>.selected:hover,table.dataTable.display tbody>tr.selected:hover,table.dataTable.display tbody>tr>.selected:hover{background-color:#aab7d1}table.dataTable.order-column tbody>tr.selected>.sorting_1,table.dataTable.order-column tbody>tr.selected>.sorting_2,table.dataTable.order-column tbody>tr.selected>.sorting_3,table.dataTable.order-column tbody>tr>.selected,table.dataTable.display tbody>tr.selected>.sorting_1,table.dataTable.display tbody>tr.selected>.sorting_2,table.dataTable.display tbody>tr.selected>.sorting_3,table.dataTable.display tbody>tr>.selected{background-color:#acbad5}table.dataTable.display tbody>tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.dataTable.display tbody>tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.dataTable.display tbody>tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.dataTable.display tbody>tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_1{background-color:#acbad5}table.dataTable.display tbody>tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_2{background-color:#aebcd6}table.dataTable.display tbody>tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody>tr.odd>.selected,table.dataTable.order-column.stripe tbody>tr.odd>.selected{background-color:#a6b4cd}table.dataTable.display tbody>tr.even>.selected,table.dataTable.order-column.stripe tbody>tr.even>.selected{background-color:#acbad5}table.dataTable.display tbody>tr.selected:hover>.sorting_1,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_1{background-color:#a2aec7}table.dataTable.display tbody>tr.selected:hover>.sorting_2,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_2{background-color:#a3b0c9}table.dataTable.display tbody>tr.selected:hover>.sorting_3,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_3{background-color:#a5b2cb}table.dataTable.display tbody>tr:hover>.selected,table.dataTable.display tbody>tr>.selected:hover,table.dataTable.order-column.hover tbody>tr:hover>.selected,table.dataTable.order-column.hover tbody>tr>.selected:hover{background-color:#a2aec7}table.dataTable tbody td.select-checkbox,table.dataTable tbody th.select-checkbox{position:relative}table.dataTable tbody td.select-checkbox:before,table.dataTable tbody td.select-checkbox:after,table.dataTable tbody th.select-checkbox:before,table.dataTable tbody th.select-checkbox:after{display:block;position:absolute;top:1.2em;left:50%;width:12px;height:12px;box-sizing:border-box}table.dataTable tbody td.select-checkbox:before,table.dataTable tbody th.select-checkbox:before{content:' ';margin-top:-6px;margin-left:-6px;border:1px solid black;border-radius:3px}table.dataTable tr.selected td.select-checkbox:after,table.dataTable tr.selected th.select-checkbox:after{content:'\2714';margin-top:-11px;margin-left:-4px;text-align:center;text-shadow:1px 1px #B0BED9, -1px -1px #B0BED9, 1px -1px #B0BED9, -1px 1px #B0BED9}div.dataTables_wrapper span.select-info,div.dataTables_wrapper span.select-item{margin-left:0.5em}@media screen and (max-width: 640px){div.dataTables_wrapper span.select-info,div.dataTables_wrapper span.select-item{margin-left:0;display:block}} diff --git a/backend/web/static/font-awesome/4.5.0/css/font-awesome.min.css b/backend/web/static/font-awesome/4.5.0/css/font-awesome.min.css new file mode 100755 index 0000000..d0603cb --- /dev/null +++ b/backend/web/static/font-awesome/4.5.0/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.5.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.5.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.5.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.5.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.5.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.5.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.5.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"} diff --git a/backend/web/static/font-awesome/4.5.0/fonts/fontawesome-webfont.ttf b/backend/web/static/font-awesome/4.5.0/fonts/fontawesome-webfont.ttf new file mode 100755 index 0000000..26dea79 Binary files /dev/null and b/backend/web/static/font-awesome/4.5.0/fonts/fontawesome-webfont.ttf differ diff --git a/backend/web/static/font-awesome/4.5.0/fonts/fontawesome-webfont.woff b/backend/web/static/font-awesome/4.5.0/fonts/fontawesome-webfont.woff new file mode 100755 index 0000000..dc35ce3 Binary files /dev/null and b/backend/web/static/font-awesome/4.5.0/fonts/fontawesome-webfont.woff differ diff --git a/backend/web/static/font-awesome/4.5.0/fonts/fontawesome-webfont.woff2 b/backend/web/static/font-awesome/4.5.0/fonts/fontawesome-webfont.woff2 new file mode 100755 index 0000000..500e517 Binary files /dev/null and b/backend/web/static/font-awesome/4.5.0/fonts/fontawesome-webfont.woff2 differ diff --git a/backend/web/static/font-awesome/opensans/v13/DXI1ORHCpsQm3Vp6mXoaTXhCUOGz7vYGh680lGh-uXM.woff b/backend/web/static/font-awesome/opensans/v13/DXI1ORHCpsQm3Vp6mXoaTXhCUOGz7vYGh680lGh-uXM.woff new file mode 100644 index 0000000..905f307 Binary files /dev/null and b/backend/web/static/font-awesome/opensans/v13/DXI1ORHCpsQm3Vp6mXoaTXhCUOGz7vYGh680lGh-uXM.woff differ diff --git a/backend/web/static/font-awesome/opensans/v13/cJZKeOuBrn4kERxqtaUH3T8E0i7KZn-EPnyo3HZu7kw.woff b/backend/web/static/font-awesome/opensans/v13/cJZKeOuBrn4kERxqtaUH3T8E0i7KZn-EPnyo3HZu7kw.woff new file mode 100644 index 0000000..e096d04 Binary files /dev/null and b/backend/web/static/font-awesome/opensans/v13/cJZKeOuBrn4kERxqtaUH3T8E0i7KZn-EPnyo3HZu7kw.woff differ diff --git a/backend/web/static/img/diff-n-bokeh.png b/backend/web/static/img/diff-n-bokeh.png new file mode 100644 index 0000000..e1c7e1e Binary files /dev/null and b/backend/web/static/img/diff-n-bokeh.png differ diff --git a/backend/web/static/img/stock-show-01.jpg b/backend/web/static/img/stock-show-01.jpg new file mode 100644 index 0000000..b0c3aa5 Binary files /dev/null and b/backend/web/static/img/stock-show-01.jpg differ diff --git a/backend/web/static/img/stock2-001.png b/backend/web/static/img/stock2-001.png new file mode 100644 index 0000000..8cbcca9 Binary files /dev/null and b/backend/web/static/img/stock2-001.png differ diff --git a/backend/web/static/img/stock2-002.png b/backend/web/static/img/stock2-002.png new file mode 100644 index 0000000..9d24da8 Binary files /dev/null and b/backend/web/static/img/stock2-002.png differ diff --git a/backend/web/static/img/stock2-003.png b/backend/web/static/img/stock2-003.png new file mode 100644 index 0000000..3468485 Binary files /dev/null and b/backend/web/static/img/stock2-003.png differ diff --git a/backend/web/static/img/支付宝--微信支付.jpg b/backend/web/static/img/支付宝--微信支付.jpg new file mode 100644 index 0000000..49e7f76 Binary files /dev/null and b/backend/web/static/img/支付宝--微信支付.jpg differ diff --git a/backend/web/static/js/ace-elements.min.js b/backend/web/static/js/ace-elements.min.js new file mode 100755 index 0000000..ad272fc --- /dev/null +++ b/backend/web/static/js/ace-elements.min.js @@ -0,0 +1,5 @@ +/*! + * Ace v1.4.0 + */ +if("undefined"==typeof jQuery)throw new Error("Ace's JavaScript requires jQuery");!function(a,b){var c=function(b,c){function d(a){a.preventDefault(),a.stopPropagation();var b=A.offset(),c=b[o],d=u?a.pageY:a.pageX;d>c+G?(G=d-c-F+I,G>H&&(G=H)):(G=d-c-I,0>G&&(G=0)),l.update_scroll()}function e(b){b.preventDefault(),b.stopPropagation(),ba=aa=u?b.pageY:b.pageX,Q=!0,a("html").off("mousemove.ace_scroll").on("mousemove.ace_scroll",f),a(R).off("mouseup.ace_scroll").on("mouseup.ace_scroll",g),A.addClass("active"),S&&l.$element.trigger("drag.start")}function f(a){a.preventDefault(),a.stopPropagation(),ba=u?a.pageY:a.pageX,ba-aa+G>H?ba=aa+H-G:0>ba-aa+G&&(ba=aa-G),G+=ba-aa,aa=ba,0>G?G=0:G>H&&(G=H),l.update_scroll()}function g(b){b.preventDefault(),b.stopPropagation(),Q=!1,a("html").off(".ace_scroll"),a(R).off(".ace_scroll"),A.removeClass("active"),S&&l.$element.trigger("drag.end"),w&&W&&!Y&&i()}function h(a){var b=+new Date;if(Z&&b-da>1e3){var c=z[t];$!=c&&($=c,_=!0,l.reset(!0)),da=b}w&&W&&(null!=ca&&(clearTimeout(ca),ca=null),A.addClass("not-idle"),Y||1!=a||i())}function i(){null!=ca&&(clearTimeout(ca),ca=null),ca=setTimeout(function(){ca=null,A.removeClass("not-idle")},X)}function j(){A.css("visibility","hidden").addClass("scroll-hover"),N=u?parseInt(A.outerWidth())||0:parseInt(A.outerHeight())||0,A.css("visibility","").removeClass("scroll-hover")}function k(){if(V!==!1){var a=y.offset(),b=a.left,c=a.top;u?M||(b+=y.outerWidth()-N):M||(c+=y.outerHeight()-N),V===!0?A.css({top:parseInt(c),left:parseInt(b)}):"left"===V?A.css("left",parseInt(b)):"top"===V&&A.css("top",parseInt(c))}}var l=this,m=ace.helper.getAttrSettings(b,a.fn.ace_scroll.defaults),n=a.extend({},a.fn.ace_scroll.defaults,c,m);this.size=0,this.lock=!1,this.lock_anyway=!1,this.$element=a(b),this.element=b;var o,p,q,r,s,t,u=!0,v=!1,w=!1,x=!1,y=null,z=null,A=null,B=null,C=null,D=null,E=null,F=0,G=0,H=0,I=0,J=!0,K=!1,L="",M=!1,N=0,O=1,P=!1,Q=!1,R="onmouseup"in window?window:"html",S=n.dragEvent||!1,T=c.scrollEvent||!1,U=n.detached||!1,V=n.updatePos||!1,W=n.hideOnIdle||!1,X=n.hideDelay||1500,Y=!1,Z=n.observeContent||!1,$=0,_=!0;this.ref=function(){return this},this.create=function(b){if(!x){b&&(n=a.extend({},a.fn.ace_scroll.defaults,b)),this.size=parseInt(this.$element.attr("data-size"))||n.size||200,u=!n.horizontal,o=u?"top":"left",p=u?"height":"width",q=u?"maxHeight":"maxWidth",r=u?"clientHeight":"clientWidth",s=u?"scrollTop":"scrollLeft",t=u?"scrollHeight":"scrollWidth",this.$element.addClass("ace-scroll"),"static"==this.$element.css("position")?(P=this.element.style.position,this.element.style.position="relative"):P=!1;var c=null;U?c=a('
').appendTo("body"):(this.$element.wrapInner('
'),this.$element.prepend('
')),y=this.$element,U||(y=this.$element.find(".scroll-content").eq(0)),u||y.wrapInner("
"),z=y.get(0),U?(A=c,k()):A=this.$element.find(".scroll-track").eq(0),B=A.find(".scroll-bar").eq(0),C=A.get(0),D=B.get(0),E=D.style,u||A.addClass("scroll-hz"),n.styleClass&&(L=n.styleClass,A.addClass(L),M=!!L.match(/scroll\-left|scroll\-top/)),0==N&&(A.show(),j()),A.hide(),A.on("mousedown",d),B.on("mousedown",e),y.on("scroll",function(){J&&(G=parseInt(Math.round(this[s]*O)),E[o]=G+"px"),J=!1,T&&this.$element.trigger("scroll",[z])}),n.mouseWheel&&(this.lock=n.mouseWheelLock,this.lock_anyway=n.lockAnyway,this.$element.on(a.event.special.mousewheel?"mousewheel.ace_scroll":"mousewheel.ace_scroll DOMMouseScroll.ace_scroll",function(b){if(!v){if(h(!0),!w)return!l.lock_anyway;Q&&(Q=!1,a("html").off(".ace_scroll"),a(R).off(".ace_scroll"),S&&l.$element.trigger("drag.end")),b.deltaY=b.deltaY||0;var c=b.deltaY>0||b.originalEvent.detail<0||b.originalEvent.wheelDelta>0?1:-1,d=!1,e=z[r],f=z[s];l.lock||(d=-1==c?z[t]<=f+e:0==f),l.move_bar(!0);var g=parseInt(e/8);return 80>g&&(g=80),g>l.size&&(g=l.size),g+=1,z[s]=f-c*g,d&&!l.lock_anyway}}));var f=ace.vars.touch&&"ace_drag"in a.event.special&&n.touchDrag;if(f){var g="",m=f?"ace_drag":"swipe";this.$element.on(m+".ace_scroll",function(a){if(v)return void(a.retval.cancel=!0);if(h(!0),!w)return void(a.retval.cancel=this.lock_anyway);if(g=a.direction,u&&("up"==g||"down"==g)||!u&&("left"==g||"right"==g)){var b=u?a.dy:a.dx;0!=b&&(Math.abs(b)>20&&f&&(b=2*b),l.move_bar(!0),z[s]=z[s]+b)}})}W&&A.addClass("idle-hide"),Z&&A.on("mouseenter.ace_scroll",function(){Y=!0,h(!1)}).on("mouseleave.ace_scroll",function(){Y=!1,0==Q&&i()}),this.$element.on("mouseenter.ace_scroll touchstart.ace_scroll",function(a){_=!0,Z?h(!0):n.hoverReset&&l.reset(!0),A.addClass("scroll-hover")}).on("mouseleave.ace_scroll touchend.ace_scroll",function(){A.removeClass("scroll-hover")}),u||y.children(0).css(p,this.size),y.css(q,this.size),v=!1,x=!0}},this.is_active=function(){return w},this.is_enabled=function(){return!v},this.move_bar=function(a){J=a},this.get_track=function(){return C},this.reset=function(a){if(!v){x||this.create();var b=this.size;if(!a||_){if(_=!1,U){var c=parseInt(Math.round((parseInt(y.css("border-top-width"))+parseInt(y.css("border-bottom-width")))/2.5));b-=c}var d=u?z[t]:b;if(u&&0==d||!u&&0==this.element.scrollWidth)return void A.removeClass("scroll-active");var e=u?b:z.clientWidth;u||y.children(0).css(p,b),y.css(q,this.size),d>e?(w=!0,A.css(p,e).show(),O=parseFloat((e/d).toFixed(5)),F=parseInt(Math.round(e*O)),I=parseInt(Math.round(F/2)),H=e-F,G=parseInt(Math.round(z[s]*O)),E[p]=F+"px",E[o]=G+"px",A.addClass("scroll-active"),0==N&&j(),K||(n.reset&&(z[s]=0,E[o]=0),K=!0),U&&k()):(w=!1,A.hide(),A.removeClass("scroll-active"),y.css(q,""))}}},this.disable=function(){z[s]=0,E[o]=0,v=!0,w=!1,A.hide(),this.$element.addClass("scroll-disabled"),A.removeClass("scroll-active"),y.css(q,"")},this.enable=function(){v=!1,this.$element.removeClass("scroll-disabled")},this.destroy=function(){w=!1,v=!1,x=!1,this.$element.removeClass("ace-scroll scroll-disabled scroll-active"),this.$element.off(".ace_scroll"),U||(u||y.find("> div").children().unwrap(),y.children().unwrap(),y.remove()),A.remove(),P!==!1&&(this.element.style.position=P),null!=ca&&(clearTimeout(ca),ca=null)},this.modify=function(b){b&&(n=a.extend({},n,b)),this.destroy(),this.create(),_=!0,this.reset(!0)},this.update=function(b){b&&(n=a.extend({},n,b)),this.size=n.size||this.size,this.lock=n.mouseWheelLock||this.lock,this.lock_anyway=n.lockAnyway||this.lock_anyway,W=n.hideOnIdle||W,X=n.hideDelay||X,Z=n.observeContent||!1,S=n.dragEvent||!1,"undefined"!=typeof b.styleClass&&(L&&A.removeClass(L),L=b.styleClass,L&&A.addClass(L),M=!!L.match(/scroll\-left|scroll\-top/))},this.start=function(){z[s]=0},this.end=function(){z[s]=z[t]},this.hide=function(){A.hide()},this.show=function(){A.show()},this.update_scroll=function(){J=!1,E[o]=G+"px",z[s]=parseInt(Math.round(G/O))};var aa=-1,ba=-1,ca=null,da=0;return this.track_size=function(){return 0==N&&j(),N},this.create(),_=!0,this.reset(!0),$=z[t],this};a.fn.ace_scroll=function(d,e){var f,g=this.each(function(){var b=a(this),g=b.data("ace_scroll"),h="object"==typeof d&&d;g||b.data("ace_scroll",g=new c(this,h)),"string"==typeof d&&(f=g[d](e))});return f===b?g:f},a.fn.ace_scroll.defaults={size:200,horizontal:!1,mouseWheel:!0,mouseWheelLock:!1,lockAnyway:!1,styleClass:!1,observeContent:!1,hideOnIdle:!1,hideDelay:1500,hoverReset:!0,reset:!1,dragEvent:!1,touchDrag:!0,touchSwipe:!1,scrollEvent:!1,detached:!1,updatePos:!0}}(window.jQuery),function(a,b){var c=function(b,c){var d=ace.helper.getAttrSettings(b,a.fn.ace_colorpicker.defaults),e=a.extend({},a.fn.ace_colorpicker.defaults,c,d),f=a(b),g="",h="",i=null,j=[];f.addClass("hide").find("option").each(function(){var a="colorpick-btn",b=this.value.replace(/[^\w\s,#\(\)\.]/g,"");b.indexOf("number")>=0||(this.value!=b&&(this.value=b),this.selected&&(a+=" selected",h=b),j.push(b),g+='
  • ')}).end().on("change.color",function(){f.next().find(".btn-colorpicker").css("background-color",this.value)}).after('");var k=f.next().find(".dropdown-menu");k.on(ace.click_event,function(b,c){var d=a(b.target);if(!d.is(".colorpick-btn"))return!1;i&&i.removeClass("selected"),i=d,i.addClass("selected");var e=i.data("color");return c!==!0&&f.val(e).trigger("change"),f.next().find(".btn-colorpicker").css("background-color",e),b.preventDefault(),!0}),i=f.next().find("a.selected"),this.pick=function(c,d){if("number"==typeof c){if(c>=j.length)return;b.selectedIndex=c,k.find("a:eq("+c+")").trigger(ace.click_event,[!0])}else if("string"==typeof c){var e=c.replace(/[^\w\s,#\(\)\.]/g,"");if(c=j.indexOf(e),-1==c&&d===!0&&(j.push(e),a("
    +{% end %} \ No newline at end of file diff --git a/backend/web/templates/common/meta.html b/backend/web/templates/common/meta.html new file mode 100644 index 0000000..7583023 --- /dev/null +++ b/backend/web/templates/common/meta.html @@ -0,0 +1,71 @@ +{% block meta %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{% end %} \ No newline at end of file diff --git a/backend/web/templates/data_editor.html b/backend/web/templates/data_editor.html new file mode 100644 index 0000000..555f189 --- /dev/null +++ b/backend/web/templates/data_editor.html @@ -0,0 +1,157 @@ +{% extends "layout/default.html" %} + + +{% block main_content %} + +

    {{ stockWeb.name }}

    +
    {{ stockWeb.name }}
    + +
     
    +
    + {% for index,element in enumerate(stockWeb.columns) %} +
    + {{ stockWeb.column_names[index] }}   + + +
    + {% end %} +
    + + + + + +
    + + +
    +
    + + + + + {% for column_name in stockWeb.column_names %} + + {% end %} + + +
    {{ column_name }}
    +
    + + + +{% end %} \ No newline at end of file diff --git a/backend/web/templates/index.html b/backend/web/templates/index.html new file mode 100644 index 0000000..a477e69 --- /dev/null +++ b/backend/web/templates/index.html @@ -0,0 +1,56 @@ +{% extends "layout/default.html" %} + + +{% block main_content %} + +

    开源Python全栈股票系统,数据抓取、统计分析、报表展示。

    + +
    +
    +

    基础库版本

    +

    1,pandas使用【 {{ pandasVersion }} 】版本, 中文文档

    +

    2,numpy使用【 {{ numpyVersion }} 】版本, 中文文档

    +

    3,akshare使用【 {{ akshareVersion }} 】版本, 中文文档

    +

    4,bokeh使用【 {{ bokehVersion }} 】版本, 官方文档

    +

    5,stockstats使用【 {{ stockstatsVersion }} 】版本, 官方文档

    +
    +
    + +
    +
    +

    相关资料信息

    +

    1,github项目地址。pythonstock

    +

    2,博客地址。博客地址

    +
    +
    + +
    +
    +

    2021年9月20日更新,发布2.0版本

    +

    1,修复bokeh的版本升级问题,可以显示趋势数据了。

    +

    2,使用 stock_zh_ah_name 做每日数据。

    +

    3,AkShare 升级到 1.1.9 版本。

    +
    +
    + +
    +
    +

    2021年8月31日更新job服务

    +

    1,过滤包括:600,6006,601,000,001,002,且不包括ST的股票数据。。

    +

    2,使用 stock_zh_ah_name 做每日数据。

    +

    3,AkShare 升级到 1.0.80 版本。

    + +
    +
    + +
    +
    +

    2021年6月3日使用 AkShare 做数据抓取服务

    +

    1,使用 stock_zh_a_spot 做实时行情数据。

    +

    2,使用 stock_zh_a_daily 做历史数据统计。

    +

    3,升级基础镜像使用python3.7,AkShare 的 0.9.65 版本。

    + +
    +
    + +{% end %} \ No newline at end of file diff --git a/backend/web/templates/layout/default.html b/backend/web/templates/layout/default.html new file mode 100644 index 0000000..a02fde9 --- /dev/null +++ b/backend/web/templates/layout/default.html @@ -0,0 +1,6 @@ +{% extends "../common/meta.html" %} +{% extends "../common/header.html" %} +{% extends "../common/footer.html" %} +{% extends "../common/left_menu.html" %} + +{% extends "main.html" %} \ No newline at end of file diff --git a/backend/web/templates/layout/indicators-main.html b/backend/web/templates/layout/indicators-main.html new file mode 100644 index 0000000..8a0acde --- /dev/null +++ b/backend/web/templates/layout/indicators-main.html @@ -0,0 +1,23 @@ + + + + + + 股票系统 + {% block meta %}{% end %} + + + +
    +
    +
    +
    +
    + {% block main_content %}{% end %} +
    +
    +
    +
    +
    + + diff --git a/backend/web/templates/layout/indicators.html b/backend/web/templates/layout/indicators.html new file mode 100644 index 0000000..05ea0e6 --- /dev/null +++ b/backend/web/templates/layout/indicators.html @@ -0,0 +1,3 @@ +{% extends "../common/meta.html" %} + +{% extends "indicators-main.html" %} \ No newline at end of file diff --git a/backend/web/templates/layout/main.html b/backend/web/templates/layout/main.html new file mode 100644 index 0000000..44cb10c --- /dev/null +++ b/backend/web/templates/layout/main.html @@ -0,0 +1,38 @@ + + + + + + 股票系统 {{ pythonStockVersion }} + {% block meta %}{% end %} + + + + + {% block header %}{% end %} + +
    + + + {% block left_menu %}{% end %} + +
    +
    +
    +
    +
    + {% block main_content %}{% end %} +
    +
    +
    +
    +
    + + + + +
    + + diff --git a/backend/web/templates/layout/single_default.html b/backend/web/templates/layout/single_default.html new file mode 100644 index 0000000..cbcda53 --- /dev/null +++ b/backend/web/templates/layout/single_default.html @@ -0,0 +1,5 @@ +{% extends "../common/meta.html" %} +{% extends "../common/header.html" %} +{% extends "../common/footer.html" %} + +{% extends "single_main.html" %} \ No newline at end of file diff --git a/backend/web/templates/layout/single_main.html b/backend/web/templates/layout/single_main.html new file mode 100644 index 0000000..9d668d4 --- /dev/null +++ b/backend/web/templates/layout/single_main.html @@ -0,0 +1,29 @@ + + + + + + {% block meta %}{% end %} + + + + +
    +
    +
    +
    +
    +
    + {% block main_content %}{% end %} +
    +
    +
    +
    +
    + + + + +
    + + diff --git a/backend/web/templates/minst_serving.html b/backend/web/templates/minst_serving.html new file mode 100644 index 0000000..43ee061 --- /dev/null +++ b/backend/web/templates/minst_serving.html @@ -0,0 +1,80 @@ +{% extends "layout/single_default.html" %} + + +{% block main_content %} + + +

    手写图片识别演示

    + +
    +
    + your browser don't support canvas! +
    + + +
    +
    +
    +

    result:

    +

    +
    +
    + +

    测试图片识别演示

    +
    + {% for image in image_array %} +
    + +
    + {% end %} +
    +
    +

    结果:

    +

    "-1"

    +
    + + + + +{% end %} \ No newline at end of file diff --git a/backend/web/templates/stock_chart.html b/backend/web/templates/stock_chart.html new file mode 100644 index 0000000..d1574bc --- /dev/null +++ b/backend/web/templates/stock_chart.html @@ -0,0 +1,12 @@ +{% extends "layout/default.html" %} + + +{% block main_content %} + +

    欢迎使用股票系统。

    + +
    +
    + +
    +{% end %} \ No newline at end of file diff --git a/backend/web/templates/stock_indicators.html b/backend/web/templates/stock_indicators.html new file mode 100644 index 0000000..5d84aed --- /dev/null +++ b/backend/web/templates/stock_indicators.html @@ -0,0 +1,32 @@ +{% extends "layout/indicators.html" %} + + +{% block main_content %} + + + + + + + + + + + + + + + + +{% for index,element in enumerate(comp_list) %} +

    {{ element["title"] }}

    +
    {{ element["desc"] }}
    +
    + {% raw element["div"] %} + {% raw element["script"] %} +
    +{% end %} + +{% end %} \ No newline at end of file diff --git a/backend/web/templates/stock_web.html b/backend/web/templates/stock_web.html new file mode 100644 index 0000000..0628cb9 --- /dev/null +++ b/backend/web/templates/stock_web.html @@ -0,0 +1,175 @@ +{% extends "layout/default.html" %} + + +{% block main_content %} + +

    {{ stockWeb.name }}

    +
    {{ stockWeb.name }}
    + +
     
    +
    + {% for index,element in enumerate(stockWeb.columns) %} + {% if index < 15 %} + {% if element != 'eastmoney_url' %} +
    + {{ stockWeb.column_names[index] }}   + + + +
    + {% end %} + {% end %}{% end %} +
    + + + + + +
    + + +
    +
    + + + {% for column_name in stockWeb.column_names %} + + {% end %} + + +
    {{ column_name }}
    +
    + + + + + + + + + +{% end %} \ No newline at end of file diff --git a/backend/web/templates/test.html b/backend/web/templates/test.html new file mode 100644 index 0000000..a607fb5 --- /dev/null +++ b/backend/web/templates/test.html @@ -0,0 +1,52 @@ +{% extends "layout/default.html" %} + + +{% block main_content %} + +

    欢迎使用股票系统。

    + +
    +
    +
    + +
    + +
    + + + + + + + + +{% end %} \ No newline at end of file diff --git a/backend/web/templates/test2.html b/backend/web/templates/test2.html new file mode 100644 index 0000000..65b2bc0 --- /dev/null +++ b/backend/web/templates/test2.html @@ -0,0 +1,44 @@ +{% extends "layout/default.html" %} + + +{% block main_content %} + +

    欢迎使用股票系统。

    + +
    +
    +
    + +
    + +
    + + + + + + + + +{% end %} \ No newline at end of file diff --git a/backend/web/test_thread.py b/backend/web/test_thread.py new file mode 100644 index 0000000..e874855 --- /dev/null +++ b/backend/web/test_thread.py @@ -0,0 +1,104 @@ +#!/usr/local/bin/python3 +# -*- coding: utf-8 -*- +import time +from tornado.httpserver import HTTPServer +from tornado.ioloop import IOLoop +from tornado.web import Application, asynchronous, RequestHandler +from multiprocessing.pool import ThreadPool +from multiprocessing.pool import ApplyResult +from tornado import gen + +# https://gist.github.com/methane/2185380 参考 + + + +html_content = """ + + + + + + +

    任务测试


    + + + + +""" + + +class MainPage(RequestHandler): + def get(self): + self.write(html_content) + + +_workers = ThreadPool(10) +_result = {} + + +# 后台任务。 +def blocking_task(n, tid): + time.sleep(n) + print(tid) + _result[tid] = {"finish"} + + +class AddJobHandler(RequestHandler): + @gen.coroutine + def get(self): + tid = str(int(time.time() * 10000)) + _workers.apply_async(blocking_task, (10, tid)) # 传递参数 10 秒。 + self.write(tid) + self.finish() # 先finish 掉,然后在后台执行。 + + +class JobCheckHandler(RequestHandler): + def get(self): + tid = self.get_argument("tid") + if tid in _result.keys(): + out = _result[tid] # 结果 + del _result[tid] # 删除tid的数据。 + self.write(str(out)) + else: + self.write("") + + +# main 启动。 +if __name__ == "__main__": + HTTPServer(Application([ + ("/", MainPage), + ("/add_job", AddJobHandler), + ("/job_check", JobCheckHandler) + ], debug=True)).listen(9090) + print("start web .") + IOLoop.instance().start() diff --git a/backend/web/test_thread_v2.py b/backend/web/test_thread_v2.py new file mode 100644 index 0000000..9684532 --- /dev/null +++ b/backend/web/test_thread_v2.py @@ -0,0 +1,104 @@ +#!/usr/local/bin/python3 +# -*- coding: utf-8 -*- +import time +from tornado.httpserver import HTTPServer +from tornado.ioloop import IOLoop +from tornado.web import Application, asynchronous, RequestHandler +from tornado import gen +from tornado.concurrent import run_on_executor +from concurrent.futures import ThreadPoolExecutor + +# `pip install futures` for python2 + +# https://gist.github.com/methane/2185380 参考 + +html_content = """ + + + + + + +

    任务测试


    + + + + +""" + + +class MainPage(RequestHandler): + def get(self): + self.write(html_content) + + +MAX_WORKERS = 4 +_result = {} + + +class AddJobHandler(RequestHandler): + # 必须定义一个executor的属性,然后run_on_executor 注解才管用。 + executor = ThreadPoolExecutor(max_workers=MAX_WORKERS) + + @run_on_executor # 标记成后台程序执行。 + def background_task(self, tid): + time.sleep(10) # 传递参数 10 秒。 + _result[tid] = {"finish"} + + @gen.coroutine + def get(self): + tid = str(int(time.time() * 10000)) + self.background_task(tid) + self.write(tid) + + +class JobCheckHandler(RequestHandler): + def get(self): + tid = self.get_argument("tid") + if tid in _result.keys(): + out = _result[tid] # 结果 + del _result[tid] # 删除tid的数据。 + self.write(str(out)) + else: + self.write("") + + +# main 启动。 +if __name__ == "__main__": + HTTPServer(Application([ + ("/", MainPage), + ("/add_job", AddJobHandler), + ("/job_check", JobCheckHandler) + ], debug=True)).listen(9999) + print("start web .") + IOLoop.instance().start() diff --git a/backend/web/tornado_bokeh_embed.py b/backend/web/tornado_bokeh_embed.py new file mode 100644 index 0000000..17992c9 --- /dev/null +++ b/backend/web/tornado_bokeh_embed.py @@ -0,0 +1,70 @@ +from jinja2 import Environment, FileSystemLoader + +from tornado.web import RequestHandler + +from bokeh.application import Application +from bokeh.application.handlers import FunctionHandler +from bokeh.embed import server_document +from bokeh.layouts import column +from bokeh.models import ColumnDataSource, Slider +from bokeh.plotting import figure +from bokeh.server.server import Server +from bokeh.themes import Theme + +from bokeh.sampledata.sea_surface_temperature import sea_surface_temperature + +env = Environment(loader=FileSystemLoader('templates')) +server_url = "http://localhost:9090/" + + +class IndexHandler(RequestHandler): + def get(self): + print("index ...") + template = env.get_template('bokeh_embed.html') + script = server_document(server_url + 'bkapp') + print(script) + self.write(template.render(script=script, template="Tornado")) + # self.write(html_content) + + +def modify_doc(doc): + df = sea_surface_temperature.copy() + source = ColumnDataSource(data=df) + + plot = figure(x_axis_type='datetime', y_range=(0, 25), y_axis_label='Temperature (Celsius)', + title="Sea Surface Temperature at 43.18, -70.43") + plot.line('time', 'temperature', source=source) + + def callback(attr, old, new): + if new == 0: + data = df + else: + data = df.rolling('{0}D'.format(new)).mean() + source.data = ColumnDataSource(data=data).data + + slider = Slider(start=0, end=30, value=0, step=1, title="Smoothing by N Days") + slider.on_change('value', callback) + + doc.add_root(column(slider, plot)) + + # doc.theme = Theme(filename="theme.yaml") + + +bokeh_app = Application(FunctionHandler(modify_doc)) + +# Setting num_procs here means we can't touch the IOLoop before now, we must +# let Server handle that. If you need to explicitly handle IOLoops then you +# will need to use the lower level BaseServer class. +server = Server( + {'/bkapp': bokeh_app}, num_procs=1, port=9999, + extra_patterns=[('/', IndexHandler)] +) +server.start() + +if __name__ == '__main__': + from bokeh.util.browser import view + + print('Opening Tornado app with embedded Bokeh application on ' + server_url) + + server.io_loop.add_callback(view, server_url) + server.io_loop.start() diff --git a/docker-compose/.gitignore b/docker-compose/.gitignore new file mode 100644 index 0000000..41ed8c8 --- /dev/null +++ b/docker-compose/.gitignore @@ -0,0 +1,14 @@ +# C extensions +*.so + +data +.idea +*.iml +.DS_Store +*.zip +*.log +*.pyc +doc +/bin +pkg +*.tmp \ No newline at end of file diff --git a/docker-compose/LICENSE b/docker-compose/LICENSE new file mode 100644 index 0000000..29f81d8 --- /dev/null +++ b/docker-compose/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/docker-compose/README.md b/docker-compose/README.md new file mode 100644 index 0000000..be99374 --- /dev/null +++ b/docker-compose/README.md @@ -0,0 +1,60 @@ +## 镜像仓库选择 + +https://github.com/DaoCloud/public-image-mirror + +```bash + +# python使用镜像 +docker.m.daocloud.io/library/python:3.11-slim-bullseye + +# mysql使用: +docker.m.daocloud.io/library/mysql:8 + +``` + + +## 本地部署方法 + + +``` +git clone git@gitee.com:pythonstock/docker-compose.git + +cd docker-compose + +docker-compose up -d + +``` + +## 访问地址 + +http://localhost:9090/ + + + +## 查看日至,进入项目代码 + +``` +# 查看启动日志: +docker logs -f stock + +# 进入stock容器 +docker exec -it stock bash +``` + +## 开发模式,映射stock 代码方法 + +直接使用 dev yml 即可,会映射stock到/data/stock 然后在外部修改代码容器中运行即可。 + +```bash +docker-compose -f dev-docker-compose.yml up -d +``` + +```bash +docker-compose -f docker-compose-v2.0.yml up -d +``` + +## 老镜像还保存一个版本 + +``` +pythonstock/pythonstock:v2021 +``` \ No newline at end of file diff --git a/docker-compose/build_stock.sh b/docker-compose/build_stock.sh new file mode 100755 index 0000000..ee099b1 --- /dev/null +++ b/docker-compose/build_stock.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +cd ../stock + +NOW_MONTH=$(date "+%Y-%m") + +DOCKER_TAG=pythonstock/pythonstock:latest +DOCKER_TAG_MONTH=pythonstock/pythonstock:stock-${NOW_MONTH} + +echo " docker build -f Dockerfile -t ${DOCKER_TAG} ." +docker build -f Dockerfile -t ${DOCKER_TAG} . +echo " docker build tag xxx ${DOCKER_TAG_MONTH} " +echo "#################################################################" +echo " docker push ${DOCKER_TAG} " + + diff --git a/docker-compose/dev-docker-compose-restart.sh b/docker-compose/dev-docker-compose-restart.sh new file mode 100755 index 0000000..5e1f06b --- /dev/null +++ b/docker-compose/dev-docker-compose-restart.sh @@ -0,0 +1,13 @@ +#!/bin/sh + + +git pull + +sleep 1 +docker-compose -f dev-docker-compose.yml down + +sleep 1 +docker-compose -f dev-docker-compose.yml up -d + +echo "restart dev-docker-compose" + diff --git a/docker-compose/dev-docker-compose.yml b/docker-compose/dev-docker-compose.yml new file mode 100644 index 0000000..2a1dc1f --- /dev/null +++ b/docker-compose/dev-docker-compose.yml @@ -0,0 +1,92 @@ +networks: + stock-dev-network: + driver: bridge + +version: "3" +services: + frontend: + image: pythonstock/frontend-dev:latest + build: + context: . + dockerfile: docker/DevFrontendDockerfile + container_name: frontend + ports: + - "8080:8080" + volumes: + # 设置开发目录,方便开发调试 + - "../frontend:/usr/src/app" + environment: + LANG: zh_CN.UTF-8 + LC_CTYPE: zh_CN.UTF-8 + restart: always + networks: + stock-dev-network: {} + # 入口写死,手动启动应用。 + entrypoint: /usr/src/app/docker-entrypoint.sh + depends_on: + - backend + backend: + image: pythonstock/backend-dev:latest + build: + context: . + dockerfile: docker/DevBackendDockerfile + container_name: backend + ports: + - "8888:8888" + - "9090:9090" + volumes: + # 设置开发目录,方便开发调试 + - "../backend/jobs/crontab:/var/spool/cron/crontabs/root" + - "../backend/jobs/cron.minutely:/etc/cron.minutely" + - "../backend/jobs/cron.hourly:/etc/cron.hourly" + - "../backend/jobs/cron.daily:/etc/cron.daily" + - "../backend/jobs/cron.monthly:/etc/cron.monthly" + - "../backend:/data/stock" + - "../backend/supervisor:/data/supervisor" + - "./data/notebooks:/data/notebooks" + - "./data/logs:/data/logs" + environment: + MYSQL_HOST: mysql-stock + MYSQL_USER: root + MYSQL_PWD: mysql-stock + MYSQL_DB: stock_data + MYSQL_PORT: 3306 + LANG: zh_CN.UTF-8 + LC_CTYPE: zh_CN.UTF-8 + PYTHONIOENCODING: utf-8 + restart: always + networks: + stock-dev-network: {} + # 入口写死,手动启动应用。 + #entrypoint: sleep 999999d + depends_on: + - mysql-stock + mysql-stock: + # image: hub.atomgit.com/library/mysql:5.7 + # https://hub.atomgit.com/repos/amd64/mysql + image: docker.m.daocloud.io/library/mysql:8 + container_name: mysql-stock + # 执行命令:https://juejin.cn/s/mysql%20healthcheck%20docker-compose + healthcheck: + test: ["CMD", "mysqladmin" ,"ping", "-uroot", "-pmysql-stock"] + interval: 10s + timeout: 5s + retries: 5 + ports: + - "3306:3306" + networks: + stock-dev-network: {} + volumes: + - "./mysql/my.cnf:/etc/mysql/my.cnf" + - "./data/mysql-stock/data:/var/lib/mysql" + - ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql + environment: + MYSQL_ROOT_PASSWORD: mysql-stock + MYSQL_DATABASE: stock_data + TZ: Asia/Shanghai + command: [ + '--character-set-server=utf8mb4', + '--collation-server=utf8mb4_general_ci', + '--max_connections=3000' + ] + restart: always diff --git a/docker-compose/docker-compose.yml b/docker-compose/docker-compose.yml new file mode 100644 index 0000000..b7a73ef --- /dev/null +++ b/docker-compose/docker-compose.yml @@ -0,0 +1,107 @@ +networks: + stock-dev-network: + driver: bridge + +version: "3" +services: + +#### 使用node 镜像进行编译,构建成 js 文件给nginx 使用。 + frontend-build: + image: pythonstock/frontend-dev:latest + build: + context: . + dockerfile: docker/DevFrontendDockerfile + container_name: frontend-build + volumes: + # 设置开发目录,方便开发调试,生产环境拷贝到 /data/html + - "../frontend:/usr/src/app" + - "./data/html:/data/html" + environment: + LANG: zh_CN.UTF-8 + LC_CTYPE: zh_CN.UTF-8 + networks: + stock-dev-network: {} + # 入口写死,手动启动应用。每次构建时候使用,构建完成结束 + entrypoint: /usr/src/app/docker-build.sh + nginx: + image: docker.m.daocloud.io/library/nginx:stable-alpine + container_name: nginx + ports: + - "8080:8080" + volumes: + # 设置开发目录,方便开发调试 + - "./data/html:/usr/share/nginx/html" + - "./nginx/nginx.conf:/etc/nginx/conf.d/default.conf" + environment: + LANG: zh_CN.UTF-8 + LC_CTYPE: zh_CN.UTF-8 + restart: always + networks: + stock-dev-network: {} + depends_on: + - backend + backend: + image: pythonstock/backend-dev:latest + build: + context: . + dockerfile: docker/DevBackendDockerfile + container_name: backend + ports: + - "8888:8888" + - "9090:9090" + volumes: + # 设置开发目录,方便开发调试 + - "../backend/jobs/crontab:/var/spool/cron/crontabs/root" + - "../backend/jobs/cron.minutely:/etc/cron.minutely" + - "../backend/jobs/cron.hourly:/etc/cron.hourly" + - "../backend/jobs/cron.daily:/etc/cron.daily" + - "../backend/jobs/cron.monthly:/etc/cron.monthly" + - "../backend:/data/stock" + - "../backend/supervisor:/data/supervisor" + - "./data/notebooks:/data/notebooks" + - "./data/logs:/data/logs" + environment: + MYSQL_HOST: mysql-stock + MYSQL_USER: root + MYSQL_PWD: mysql-stock + MYSQL_DB: stock_data + MYSQL_PORT: 3306 + LANG: zh_CN.UTF-8 + LC_CTYPE: zh_CN.UTF-8 + PYTHONIOENCODING: utf-8 + restart: always + networks: + stock-dev-network: {} + # 入口写死,手动启动应用。 + #entrypoint: sleep 999999d + depends_on: + - mysql-stock + mysql-stock: + # image: hub.atomgit.com/library/mysql:5.7 + # https://hub.atomgit.com/repos/amd64/mysql + image: docker.m.daocloud.io/library/mysql:8 + container_name: mysql-stock + # 执行命令:https://juejin.cn/s/mysql%20healthcheck%20docker-compose + healthcheck: + test: ["CMD", "mysqladmin" ,"ping", "-uroot", "-pmysql-stock"] + interval: 10s + timeout: 5s + retries: 5 + ports: + - "3306:3306" + networks: + stock-dev-network: {} + volumes: + - "./mysql/my.cnf:/etc/mysql/my.cnf" + - "./data/mysql-stock/data:/var/lib/mysql" + - ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql + environment: + MYSQL_ROOT_PASSWORD: mysql-stock + MYSQL_DATABASE: stock_data + TZ: Asia/Shanghai + command: [ + '--character-set-server=utf8mb4', + '--collation-server=utf8mb4_general_ci', + '--max_connections=3000' + ] + restart: always diff --git a/docker-compose/docker/DevBackendDockerfile b/docker-compose/docker/DevBackendDockerfile new file mode 100644 index 0000000..7cd1960 --- /dev/null +++ b/docker-compose/docker/DevBackendDockerfile @@ -0,0 +1,97 @@ + + +# https://hub.docker.com/_/python?tab=tags&page=1&name=3.11-slim-bullseye +# 用这个做为基础镜像,防止每次都进行构建。 + +#FROM docker.io/python:3.11-slim-bullseye +FROM docker.m.daocloud.io/library/python:3.11-slim-bullseye + +# https://opsx.alibaba.com/mirror +# 使用阿里云镜像地址。修改debian apt 更新地址,pip 地址,设置时区。 +# 设置debian的镜像源 +RUN echo "deb http://mirrors.aliyun.com/debian/ bullseye main non-free contrib" > /etc/apt/sources.list && \ +echo "deb-src http://mirrors.aliyun.com/debian/ bullseye main non-free contrib" >> /etc/apt/sources.list && \ +echo "deb http://mirrors.aliyun.com/debian-security/ bullseye-security main" >> /etc/apt/sources.list && \ +echo "deb-src http://mirrors.aliyun.com/debian-security/ bullseye-security main" >> /etc/apt/sources.list && \ +echo "deb http://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib" >> /etc/apt/sources.list && \ +echo "deb-src http://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib" >> /etc/apt/sources.list && \ +echo "deb http://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib" >> /etc/apt/sources.list && \ +echo "deb-src http://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib" >> /etc/apt/sources.list && \ +echo "[global]\n\ +trusted-host=mirrors.aliyun.com\n\ +index-url=http://mirrors.aliyun.com/pypi/simple" > /etc/pip.conf && \ +ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ + echo "Asia/Shanghai" > /etc/timezone + +#增加语言utf-8 +ENV LANG=zh_CN.UTF-8 +ENV LC_CTYPE=zh_CN.UTF-8 +ENV LC_ALL=C +ENV PYTHONPATH=/data/stock + +# 增加 TensorFlow 的支持,使用最新的2.0 编写代码。目前还是使用 1.x 吧,还没有学明白。 +# RUN pip3 install tensorflow==2.0.0-rc1 keras +# RUN pip3 install tensorflow keras sklearn + +# 设置 vim 的语言配置 +RUN mkdir -p /etc/vim/ && \ + echo "set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936" >> /etc/vim/vimrc && \ + echo "set termencoding=utf-8" >> /etc/vim/vimrc && \ + echo "set encoding=utf-8" >> /etc/vim/vimrc + +# 安装 mysqlclient akshare (pandas ,numpy) tornado bokeh +# 安装 nodejs 库 +# apt-get autoremove -y 删除没有用的依赖lib。减少镜像大小。1MB 也要节省。 +# apt-get --purge remove 软件包名称 , 删除已安装包(不保留配置文件)。 +RUN apt-get update && apt-get install -y git pkg-config net-tools procps gcc make python3-dev default-libmysqlclient-dev libxml2-dev cron && \ + pip3 install mysqlclient sqlalchemy && \ + pip3 install supervisor && \ + pip3 install numpy pandas && \ + pip3 install akshare --upgrade && \ + apt-get install -y nodejs && \ + pip3 install tornado torndb && \ + pip3 install bokeh stockstats scikit-learn && \ + apt-get --purge remove -y gcc make python3-dev default-libmysqlclient-dev libxml2-dev && \ + rm -rf /root/.cache/* && apt-get clean && apt-get autoremove -y && \ + cd /usr/local/lib/python3.11/site-packages && find ./ -name *.pyc | xargs rm -f + +# /usr/local/lib/python3.11/site-packages/pandas/ +# 1.解决 pandas 数据插入问题。直接修改数据库驱动 sqlalchemy +# 修改:statement.replace("INSERT INTO","INSERT IGNORE INTO") +# /usr/local/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqldb.py +# 增加了一个 IGNORE 参数。 +# 2.解决torndb在python3下面的问题: +# http://blog.csdn.net/littlethunder/article/details/8917378 +# 3. 解决 type 问题,使用sed 进行替换。 +# File "/usr/local/lib/python3.11/site-packages/torndb.py", line 260, in +# CONVERSIONS[field_type] = [(FLAG.BINARY, str)] + CONVERSIONS[field_type] +# TypeError: can only concatenate list (not "type") to list + +RUN echo `date +%Y-%m-%d:%H:%M:%S` >> /etc/docker.build && \ + sed -i -e 's/executemany(statement/executemany(statement.replace\("INSERT INTO","INSERT IGNORE INTO")/g' \ + /usr/local/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqldb.py && \ + rm -f /etc/cron.daily/apt-compat /etc/cron.daily/dpkg /etc/cron.daily/passwd && \ + sed -i -e 's/itertools\.izip/zip/g' \ + /usr/local/lib/python3.11/site-packages/torndb.py && \ + sed -i -e 's/\+ CONVERSIONS\[field_type\]/\+ \[CONVERSIONS\[field_type\],bytes\]/g' \ + /usr/local/lib/python3.11/site-packages/torndb.py + + +#add cron sesrvice. +#每分钟,每小时1分钟,每天1点1分,每月1号执行 +RUN mkdir -p /etc/cron.minutely && mkdir -p /etc/cron.hourly && mkdir -p /etc/cron.monthly && mkdir -p /var/spool/cron/crontabs && \ + echo "SHELL=/bin/sh \n\ +PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin \n\ +# min hour day month weekday command \n\ +*/1 * * * * /bin/run-parts /etc/cron.minutely \n\ +10 * * * * /bin/run-parts /etc/cron.hourly \n\ +30 16 * * * /bin/run-parts /etc/cron.daily \n\ +30 17 1,10,20 * * /bin/run-parts /etc/cron.monthly \n" > /var/spool/cron/crontabs/root && \ + chmod 600 /var/spool/cron/crontabs/root + + +#增加服务端口 +EXPOSE 8888 9090 + +ENTRYPOINT ["supervisord","-n","-c","/data/supervisor/supervisord.conf"] + diff --git a/docker-compose/docker/DevFrontendDockerfile b/docker-compose/docker/DevFrontendDockerfile new file mode 100644 index 0000000..02eaf3d --- /dev/null +++ b/docker-compose/docker/DevFrontendDockerfile @@ -0,0 +1,45 @@ +#使用 node:bullseye-slim 做基础镜像减少大小。 + +# FROM docker.m.daocloud.io/library/node:bullseye-slim +# fixbug 最新node 版本编译不过去, +# ERROR Error: Cannot find module './passes/web-incoming' + +FROM docker.m.daocloud.io/library/node:23.5.0-bullseye-slim + +# https://opsx.alibaba.com/mirror +# 使用阿里云镜像地址。修改debian apt 更新地址,pip 地址,设置时区。 +# 设置debian的镜像源 +RUN echo "deb http://mirrors.aliyun.com/debian/ bullseye main non-free contrib" > /etc/apt/sources.list && \ +echo "deb-src http://mirrors.aliyun.com/debian/ bullseye main non-free contrib" >> /etc/apt/sources.list && \ +echo "deb http://mirrors.aliyun.com/debian-security/ bullseye-security main" >> /etc/apt/sources.list && \ +echo "deb-src http://mirrors.aliyun.com/debian-security/ bullseye-security main" >> /etc/apt/sources.list && \ +echo "deb http://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib" >> /etc/apt/sources.list && \ +echo "deb-src http://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib" >> /etc/apt/sources.list && \ +echo "deb http://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib" >> /etc/apt/sources.list && \ +echo "deb-src http://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib" >> /etc/apt/sources.list && \ +echo "[global]\n\ +trusted-host=mirrors.aliyun.com\n\ +index-url=http://mirrors.aliyun.com/pypi/simple" > /etc/pip.conf && \ +ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ + echo "Asia/Shanghai" > /etc/timezone + +#增加语言utf-8 +ENV LANG=zh_CN.UTF-8 +ENV LC_CTYPE=zh_CN.UTF-8 +ENV LC_ALL=C + +# 增加 TensorFlow 的支持,使用最新的2.0 编写代码。目前还是使用 1.x 吧,还没有学明白。 +# RUN pip3 install tensorflow==2.0.0-rc1 keras +# RUN pip3 install tensorflow keras sklearn + +# 设置 vim 的语言配置 +RUN mkdir -p /etc/vim/ && \ + echo "set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936" >> /etc/vim/vimrc && \ + echo "set termencoding=utf-8" >> /etc/vim/vimrc && \ + echo "set encoding=utf-8" >> /etc/vim/vimrc + +# 安装 mysqlclient akshare (pandas ,numpy) tornado bokeh +# 安装 nodejs 库 +# apt-get autoremove -y 删除没有用的依赖lib。减少镜像大小。1MB 也要节省。 +# apt-get --purge remove 软件包名称 , 删除已安装包(不保留配置文件)。 +RUN apt-get update && apt-get install -y python3 make g++ && apt-get clean diff --git a/docker-compose/docker/Dockerfile b/docker-compose/docker/Dockerfile new file mode 100644 index 0000000..c8c8a68 --- /dev/null +++ b/docker-compose/docker/Dockerfile @@ -0,0 +1,103 @@ +#使用 python:3.8-slim 做基础镜像减少大小。其中tensorflow再用另外的镜像跑数据。 + +# 之前使用的是python:3.6-slim +# 可以更新 3.8-slim-bullseye slim-bullseye + +# https://hub.docker.com/_/python?tab=tags&page=1&name=3.8-slim-bullseye +# 用这个做为基础镜像,防止每次都进行构建。 + +#FROM docker.io/python:3.8-slim-bullseye +#FROM hub.atomgit.com/amd64/python:3.8-slim-bullseye +# https://hub.atomgit.com/repos/amd64/python +#FROM hub.atomgit.com/amd64/python:3.11-slim-bullseye +FROM docker.m.daocloud.io/library/python:3.11-slim-bullseye + +# https://opsx.alibaba.com/mirror +# 使用阿里云镜像地址。修改debian apt 更新地址,pip 地址,设置时区。 +# 设置debian的镜像源 +RUN echo "deb http://mirrors.aliyun.com/debian/ bullseye main non-free contrib" > /etc/apt/sources.list && \ +echo "deb-src http://mirrors.aliyun.com/debian/ bullseye main non-free contrib" >> /etc/apt/sources.list && \ +echo "deb http://mirrors.aliyun.com/debian-security/ bullseye-security main" >> /etc/apt/sources.list && \ +echo "deb-src http://mirrors.aliyun.com/debian-security/ bullseye-security main" >> /etc/apt/sources.list && \ +echo "deb http://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib" >> /etc/apt/sources.list && \ +echo "deb-src http://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib" >> /etc/apt/sources.list && \ +echo "deb http://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib" >> /etc/apt/sources.list && \ +echo "deb-src http://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib" >> /etc/apt/sources.list && \ +echo "[global]\n\ +trusted-host=mirrors.aliyun.com\n\ +index-url=http://mirrors.aliyun.com/pypi/simple" > /etc/pip.conf && \ +ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ + echo "Asia/Shanghai" > /etc/timezone + +#增加语言utf-8 +ENV LANG=zh_CN.UTF-8 +ENV LC_CTYPE=zh_CN.UTF-8 +ENV LC_ALL=C +ENV PYTHONPATH=/data/stock + +# 增加 TensorFlow 的支持,使用最新的2.0 编写代码。目前还是使用 1.x 吧,还没有学明白。 +# RUN pip3 install tensorflow==2.0.0-rc1 keras +# RUN pip3 install tensorflow keras sklearn + +# 设置 vim 的语言配置 +RUN mkdir -p /etc/vim/ && \ + echo "set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936" >> /etc/vim/vimrc && \ + echo "set termencoding=utf-8" >> /etc/vim/vimrc && \ + echo "set encoding=utf-8" >> /etc/vim/vimrc + +# 安装 mysqlclient akshare (pandas ,numpy) tornado bokeh +# 安装 nodejs 库 +# apt-get autoremove -y 删除没有用的依赖lib。减少镜像大小。1MB 也要节省。 +# apt-get --purge remove 软件包名称 , 删除已安装包(不保留配置文件)。 +RUN apt-get update && apt-get install -y git pkg-config net-tools procps gcc make python3-dev default-libmysqlclient-dev libxml2-dev cron && \ + pip3 install mysqlclient sqlalchemy && \ + pip3 install supervisor && \ + pip3 install numpy pandas && \ + pip3 install akshare --upgrade && \ + apt-get install -y nodejs && \ + pip3 install tornado torndb && \ + pip3 install bokeh stockstats scikit-learn && \ + apt-get --purge remove -y gcc make python3-dev default-libmysqlclient-dev libxml2-dev && \ + rm -rf /root/.cache/* && apt-get clean && apt-get autoremove -y && \ + cd /usr/local/lib/python3.11/site-packages && find ./ -name *.pyc | xargs rm -f + +# /usr/local/lib/python3.11/site-packages/pandas/ +# 1.解决 pandas 数据插入问题。直接修改数据库驱动 sqlalchemy +# 修改:statement.replace("INSERT INTO","INSERT IGNORE INTO") +# /usr/local/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqldb.py +# 增加了一个 IGNORE 参数。 +# 2.解决torndb在python3下面的问题: +# http://blog.csdn.net/littlethunder/article/details/8917378 +# 3. 解决 type 问题,使用sed 进行替换。 +# File "/usr/local/lib/python3.11/site-packages/torndb.py", line 260, in +# CONVERSIONS[field_type] = [(FLAG.BINARY, str)] + CONVERSIONS[field_type] +# TypeError: can only concatenate list (not "type") to list + +RUN echo `date +%Y-%m-%d:%H:%M:%S` >> /etc/docker.build && \ + sed -i -e 's/executemany(statement/executemany(statement.replace\("INSERT INTO","INSERT IGNORE INTO")/g' \ + /usr/local/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqldb.py && \ + rm -f /etc/cron.daily/apt-compat /etc/cron.daily/dpkg /etc/cron.daily/passwd && \ + sed -i -e 's/itertools\.izip/zip/g' \ + /usr/local/lib/python3.11/site-packages/torndb.py && \ + sed -i -e 's/\+ CONVERSIONS\[field_type\]/\+ \[CONVERSIONS\[field_type\],bytes\]/g' \ + /usr/local/lib/python3.11/site-packages/torndb.py + + +#add cron sesrvice. +#每分钟,每小时1分钟,每天1点1分,每月1号执行 +RUN mkdir -p /etc/cron.minutely && mkdir -p /etc/cron.hourly && mkdir -p /etc/cron.monthly && mkdir -p /var/spool/cron/crontabs && \ + echo "SHELL=/bin/sh \n\ +PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin \n\ +# min hour day month weekday command \n\ +*/1 * * * * /bin/run-parts /etc/cron.minutely \n\ +10 * * * * /bin/run-parts /etc/cron.hourly \n\ +30 16 * * * /bin/run-parts /etc/cron.daily \n\ +30 17 1,10,20 * * /bin/run-parts /etc/cron.monthly \n" > /var/spool/cron/crontabs/root && \ + chmod 600 /var/spool/cron/crontabs/root + + +#增加服务端口就两个 6006 8500 9001 +EXPOSE 8888 9999 + +ENTRYPOINT ["supervisord","-n","-c","/data/supervisor/supervisord.conf"] + diff --git a/docker-compose/docker/ProdBackendDockerfile b/docker-compose/docker/ProdBackendDockerfile new file mode 100644 index 0000000..c8c8a68 --- /dev/null +++ b/docker-compose/docker/ProdBackendDockerfile @@ -0,0 +1,103 @@ +#使用 python:3.8-slim 做基础镜像减少大小。其中tensorflow再用另外的镜像跑数据。 + +# 之前使用的是python:3.6-slim +# 可以更新 3.8-slim-bullseye slim-bullseye + +# https://hub.docker.com/_/python?tab=tags&page=1&name=3.8-slim-bullseye +# 用这个做为基础镜像,防止每次都进行构建。 + +#FROM docker.io/python:3.8-slim-bullseye +#FROM hub.atomgit.com/amd64/python:3.8-slim-bullseye +# https://hub.atomgit.com/repos/amd64/python +#FROM hub.atomgit.com/amd64/python:3.11-slim-bullseye +FROM docker.m.daocloud.io/library/python:3.11-slim-bullseye + +# https://opsx.alibaba.com/mirror +# 使用阿里云镜像地址。修改debian apt 更新地址,pip 地址,设置时区。 +# 设置debian的镜像源 +RUN echo "deb http://mirrors.aliyun.com/debian/ bullseye main non-free contrib" > /etc/apt/sources.list && \ +echo "deb-src http://mirrors.aliyun.com/debian/ bullseye main non-free contrib" >> /etc/apt/sources.list && \ +echo "deb http://mirrors.aliyun.com/debian-security/ bullseye-security main" >> /etc/apt/sources.list && \ +echo "deb-src http://mirrors.aliyun.com/debian-security/ bullseye-security main" >> /etc/apt/sources.list && \ +echo "deb http://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib" >> /etc/apt/sources.list && \ +echo "deb-src http://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib" >> /etc/apt/sources.list && \ +echo "deb http://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib" >> /etc/apt/sources.list && \ +echo "deb-src http://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib" >> /etc/apt/sources.list && \ +echo "[global]\n\ +trusted-host=mirrors.aliyun.com\n\ +index-url=http://mirrors.aliyun.com/pypi/simple" > /etc/pip.conf && \ +ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ + echo "Asia/Shanghai" > /etc/timezone + +#增加语言utf-8 +ENV LANG=zh_CN.UTF-8 +ENV LC_CTYPE=zh_CN.UTF-8 +ENV LC_ALL=C +ENV PYTHONPATH=/data/stock + +# 增加 TensorFlow 的支持,使用最新的2.0 编写代码。目前还是使用 1.x 吧,还没有学明白。 +# RUN pip3 install tensorflow==2.0.0-rc1 keras +# RUN pip3 install tensorflow keras sklearn + +# 设置 vim 的语言配置 +RUN mkdir -p /etc/vim/ && \ + echo "set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936" >> /etc/vim/vimrc && \ + echo "set termencoding=utf-8" >> /etc/vim/vimrc && \ + echo "set encoding=utf-8" >> /etc/vim/vimrc + +# 安装 mysqlclient akshare (pandas ,numpy) tornado bokeh +# 安装 nodejs 库 +# apt-get autoremove -y 删除没有用的依赖lib。减少镜像大小。1MB 也要节省。 +# apt-get --purge remove 软件包名称 , 删除已安装包(不保留配置文件)。 +RUN apt-get update && apt-get install -y git pkg-config net-tools procps gcc make python3-dev default-libmysqlclient-dev libxml2-dev cron && \ + pip3 install mysqlclient sqlalchemy && \ + pip3 install supervisor && \ + pip3 install numpy pandas && \ + pip3 install akshare --upgrade && \ + apt-get install -y nodejs && \ + pip3 install tornado torndb && \ + pip3 install bokeh stockstats scikit-learn && \ + apt-get --purge remove -y gcc make python3-dev default-libmysqlclient-dev libxml2-dev && \ + rm -rf /root/.cache/* && apt-get clean && apt-get autoremove -y && \ + cd /usr/local/lib/python3.11/site-packages && find ./ -name *.pyc | xargs rm -f + +# /usr/local/lib/python3.11/site-packages/pandas/ +# 1.解决 pandas 数据插入问题。直接修改数据库驱动 sqlalchemy +# 修改:statement.replace("INSERT INTO","INSERT IGNORE INTO") +# /usr/local/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqldb.py +# 增加了一个 IGNORE 参数。 +# 2.解决torndb在python3下面的问题: +# http://blog.csdn.net/littlethunder/article/details/8917378 +# 3. 解决 type 问题,使用sed 进行替换。 +# File "/usr/local/lib/python3.11/site-packages/torndb.py", line 260, in +# CONVERSIONS[field_type] = [(FLAG.BINARY, str)] + CONVERSIONS[field_type] +# TypeError: can only concatenate list (not "type") to list + +RUN echo `date +%Y-%m-%d:%H:%M:%S` >> /etc/docker.build && \ + sed -i -e 's/executemany(statement/executemany(statement.replace\("INSERT INTO","INSERT IGNORE INTO")/g' \ + /usr/local/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqldb.py && \ + rm -f /etc/cron.daily/apt-compat /etc/cron.daily/dpkg /etc/cron.daily/passwd && \ + sed -i -e 's/itertools\.izip/zip/g' \ + /usr/local/lib/python3.11/site-packages/torndb.py && \ + sed -i -e 's/\+ CONVERSIONS\[field_type\]/\+ \[CONVERSIONS\[field_type\],bytes\]/g' \ + /usr/local/lib/python3.11/site-packages/torndb.py + + +#add cron sesrvice. +#每分钟,每小时1分钟,每天1点1分,每月1号执行 +RUN mkdir -p /etc/cron.minutely && mkdir -p /etc/cron.hourly && mkdir -p /etc/cron.monthly && mkdir -p /var/spool/cron/crontabs && \ + echo "SHELL=/bin/sh \n\ +PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin \n\ +# min hour day month weekday command \n\ +*/1 * * * * /bin/run-parts /etc/cron.minutely \n\ +10 * * * * /bin/run-parts /etc/cron.hourly \n\ +30 16 * * * /bin/run-parts /etc/cron.daily \n\ +30 17 1,10,20 * * /bin/run-parts /etc/cron.monthly \n" > /var/spool/cron/crontabs/root && \ + chmod 600 /var/spool/cron/crontabs/root + + +#增加服务端口就两个 6006 8500 9001 +EXPOSE 8888 9999 + +ENTRYPOINT ["supervisord","-n","-c","/data/supervisor/supervisord.conf"] + diff --git a/docker-compose/docker/ProdFrontendDockerfile b/docker-compose/docker/ProdFrontendDockerfile new file mode 100644 index 0000000..fa1335a --- /dev/null +++ b/docker-compose/docker/ProdFrontendDockerfile @@ -0,0 +1,41 @@ +#使用 node:bullseye-slim 做基础镜像减少大小。 + +FROM docker.m.daocloud.io/library/node:bullseye-slim + +# https://opsx.alibaba.com/mirror +# 使用阿里云镜像地址。修改debian apt 更新地址,pip 地址,设置时区。 +# 设置debian的镜像源 +RUN echo "deb http://mirrors.aliyun.com/debian/ bullseye main non-free contrib" > /etc/apt/sources.list && \ +echo "deb-src http://mirrors.aliyun.com/debian/ bullseye main non-free contrib" >> /etc/apt/sources.list && \ +echo "deb http://mirrors.aliyun.com/debian-security/ bullseye-security main" >> /etc/apt/sources.list && \ +echo "deb-src http://mirrors.aliyun.com/debian-security/ bullseye-security main" >> /etc/apt/sources.list && \ +echo "deb http://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib" >> /etc/apt/sources.list && \ +echo "deb-src http://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib" >> /etc/apt/sources.list && \ +echo "deb http://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib" >> /etc/apt/sources.list && \ +echo "deb-src http://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib" >> /etc/apt/sources.list && \ +echo "[global]\n\ +trusted-host=mirrors.aliyun.com\n\ +index-url=http://mirrors.aliyun.com/pypi/simple" > /etc/pip.conf && \ +ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ + echo "Asia/Shanghai" > /etc/timezone + +#增加语言utf-8 +ENV LANG=zh_CN.UTF-8 +ENV LC_CTYPE=zh_CN.UTF-8 +ENV LC_ALL=C + +# 增加 TensorFlow 的支持,使用最新的2.0 编写代码。目前还是使用 1.x 吧,还没有学明白。 +# RUN pip3 install tensorflow==2.0.0-rc1 keras +# RUN pip3 install tensorflow keras sklearn + +# 设置 vim 的语言配置 +RUN mkdir -p /etc/vim/ && \ + echo "set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936" >> /etc/vim/vimrc && \ + echo "set termencoding=utf-8" >> /etc/vim/vimrc && \ + echo "set encoding=utf-8" >> /etc/vim/vimrc + +# 安装 mysqlclient akshare (pandas ,numpy) tornado bokeh +# 安装 nodejs 库 +# apt-get autoremove -y 删除没有用的依赖lib。减少镜像大小。1MB 也要节省。 +# apt-get --purge remove 软件包名称 , 删除已安装包(不保留配置文件)。 +RUN apt-get update && apt-get install -y python3 make g++ && apt-get clean diff --git a/docker-compose/docker/README.md b/docker-compose/docker/README.md new file mode 100644 index 0000000..c69c9fc --- /dev/null +++ b/docker-compose/docker/README.md @@ -0,0 +1,35 @@ + +# python 基础镜像 + +基础镜像升级到 2020年7月的版本 + +保证运行的最少基础环境,基础环境使用python3.6的版本。安装了超级多的lib库。非常的好用。 + +mysqlclient +sqlalchemy +requests +numpy +tushare +tornado torndb +bokeh +stockstats +ta-lib +jupyter +sklearn + +# 2021年6月版本,使用 akshare 替换掉 tushare 库 + +akshare 地址: + +https://www.akshare.xyz/zh_CN/latest/introduction.html + +AKShare 是基于 Python 的财经数据接口库, 目的是实现对股票、期货、期权、基金、外汇、债券、指数、 +加密货币等金融产品的基本面数据、实时和历史行情数据、衍生数据从数据采集、数据清洗到数据落地的一套工具, +主要用于学术研究目的。 + + +# 2021年 9 月版本,镜像裁剪,supervisor 使用python3 + +supervisor 使用 python3 后好像减少了不少大小。 +同时删除掉一直没有用的 ta-lib 和 jupyter 。升级python基础镜像。 + diff --git a/docker-compose/docker/build.sh b/docker-compose/docker/build.sh new file mode 100755 index 0000000..d0ccd21 --- /dev/null +++ b/docker-compose/docker/build.sh @@ -0,0 +1,13 @@ +#!/bin/sh + + +NOW_MONTH=$(date "+%Y-%m") + +DOCKER_TAG=pythonstock/pythonstock:base-${NOW_MONTH} + +echo " docker build -f Dockerfile -t ${DOCKER_TAG} ." +docker build -f Dockerfile -t ${DOCKER_TAG} . +echo "#################################################################" +echo " docker push ${DOCKER_TAG} " + + diff --git a/docker-compose/mysql/init.sql b/docker-compose/mysql/init.sql new file mode 100644 index 0000000..c2d19de --- /dev/null +++ b/docker-compose/mysql/init.sql @@ -0,0 +1,201 @@ +SET character_set_client = utf8; +-- 切库: +use stock_data; +-- 建表 +-- 表里面都是使用 code 和 date 两个字段做联合主键的。 + + +CREATE TABLE IF NOT EXISTS `stock_zh_a_spot_em` ( + `date` varchar(255) NOT NULL, + `code` varchar(255) NOT NULL, + `name` varchar(255) DEFAULT NULL, + `last_price` double(20,2) DEFAULT NULL, + `change_percent` double(20,2) DEFAULT NULL, + `change_amount` double(20,2) DEFAULT NULL, + `volume` double(20,2) DEFAULT NULL, + `turnover` double(20,2) DEFAULT NULL, + `amplitude` double(20,2) DEFAULT NULL, + `high` double(20,2) DEFAULT NULL, + `low` double(20,2) DEFAULT NULL, + `open` double(20,2) DEFAULT NULL, + `closed` double(20,2) DEFAULT NULL, + `volume_ratio` double(20,2) DEFAULT NULL, + `turnover_rate` double(20,2) DEFAULT NULL, + `pe_ratio` double(20,2) DEFAULT NULL, + `pb_ratio` double(20,2) DEFAULT NULL, + `market_cap` double(20,2) DEFAULT NULL, + `circulating_market_cap` double(20,2) DEFAULT NULL, + `rise_speed` double(20,2) DEFAULT NULL, + `change_5min` double(20,2) DEFAULT NULL, + `change_ercent_60day` double(20,2) DEFAULT NULL, + `ytd_change_percent` double(20,2) DEFAULT NULL, + PRIMARY KEY (`code`,`date`), + KEY `idx_code` (`code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +CREATE TABLE IF NOT EXISTS `stock_lhb_ggtj_sina` ( + `date` varchar(255) NOT NULL, + `code` varchar(255) NOT NULL, + `name` varchar(255) DEFAULT NULL, + `ranking_times` double(20,2) DEFAULT NULL, + `sum_buy` double(20,2) DEFAULT NULL, + `sum_sell` double(20,2) DEFAULT NULL, + `net_amount` double(20,2) DEFAULT NULL, + `buy_seat` double(20,2) DEFAULT NULL, + `sell_seat` double(20,2) DEFAULT NULL, + PRIMARY KEY (`code`,`date`), + KEY `idx_code` (`code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + + +CREATE TABLE `stock_dzjy_mrtj` ( + `date` varchar(255) NOT NULL, + `code` varchar(255) NOT NULL, + `name` varchar(255) DEFAULT NULL, + `quote_change` double(20,2) DEFAULT NULL, + `close_price` double(20,2) DEFAULT NULL, + `average_price` double(20,2) DEFAULT NULL, + `overflow_rate` double(20,2) DEFAULT NULL, + `trade_number` double(20,2) DEFAULT NULL, + `sum_volume` double(20,2) DEFAULT NULL, + `sum_turnover` double(20,2) DEFAULT NULL, + `turnover_market_rate` double(20,2) DEFAULT NULL, + PRIMARY KEY (`code`,`date`), + KEY `idx_code` (`code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + + +CREATE TABLE `guess_indicators_daily` ( + `date` varchar(255) NOT NULL, + `code` varchar(255) NOT NULL, + `name` varchar(255) DEFAULT NULL, + `last_price` double(20,2) DEFAULT NULL, + `change_percent` double(20,2) DEFAULT NULL, + `change_amount` double(20,2) DEFAULT NULL, + `volume` double(20,2) DEFAULT NULL, + `turnover` double(20,2) DEFAULT NULL, + `amplitude` double(20,2) DEFAULT NULL, + `high` double(20,2) DEFAULT NULL, + `low` double(20,2) DEFAULT NULL, + `open` double(20,2) DEFAULT NULL, + `closed` double(20,2) DEFAULT NULL, + `volume_ratio` double(20,2) DEFAULT NULL, + `turnover_rate` double(20,2) DEFAULT NULL, + `pe_ratio` double(20,2) DEFAULT NULL, + `pb_ratio` double(20,2) DEFAULT NULL, + `market_cap` double(20,2) DEFAULT NULL, + `circulating_market_cap` double(20,2) DEFAULT NULL, + `rise_speed` double(20,2) DEFAULT NULL, + `change_5min` double(20,2) DEFAULT NULL, + `change_ercent_60day` double(20,2) DEFAULT NULL, + `ytd_change_percent` double(20,2) DEFAULT NULL, + `boll` double(20,2) DEFAULT NULL, + `boll_lb` double(20,2) DEFAULT NULL, + `boll_ub` double(20,2) DEFAULT NULL, + `kdjd` double(20,2) DEFAULT NULL, + `kdjj` double(20,2) DEFAULT NULL, + `kdjk` double(20,2) DEFAULT NULL, + `macd` double(20,2) DEFAULT NULL, + `macdh` double(20,2) DEFAULT NULL, + `macds` double(20,2) DEFAULT NULL, + `pdi` double(20,2) DEFAULT NULL, + `trix` double(20,2) DEFAULT NULL, + `trix_9_sma` double(20,2) DEFAULT NULL, + `vr` double(20,2) DEFAULT NULL, + `vr_6_sma` double(20,2) DEFAULT NULL, + `wr_10` double(20,2) DEFAULT NULL, + `wr_6` double(20,2) DEFAULT NULL, + PRIMARY KEY (`code`,`date`), + KEY `idx_code` (`code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + + +CREATE TABLE `guess_indicators_lite_buy_daily` ( + `date` varchar(255) NOT NULL, + `code` varchar(255) NOT NULL, + `name` varchar(255) DEFAULT NULL, + `last_price` double(20,2) DEFAULT NULL, + `change_percent` double(20,2) DEFAULT NULL, + `change_amount` double(20,2) DEFAULT NULL, + `volume` double(20,2) DEFAULT NULL, + `turnover` double(20,2) DEFAULT NULL, + `amplitude` double(20,2) DEFAULT NULL, + `high` double(20,2) DEFAULT NULL, + `low` double(20,2) DEFAULT NULL, + `open` double(20,2) DEFAULT NULL, + `closed` double(20,2) DEFAULT NULL, + `volume_ratio` double(20,2) DEFAULT NULL, + `turnover_rate` double(20,2) DEFAULT NULL, + `pe_ratio` double(20,2) DEFAULT NULL, + `pb_ratio` double(20,2) DEFAULT NULL, + `market_cap` double(20,2) DEFAULT NULL, + `circulating_market_cap` double(20,2) DEFAULT NULL, + `rise_speed` double(20,2) DEFAULT NULL, + `change_5min` double(20,2) DEFAULT NULL, + `change_ercent_60day` double(20,2) DEFAULT NULL, + `ytd_change_percent` double(20,2) DEFAULT NULL, + `boll` double(20,2) DEFAULT NULL, + `boll_lb` double(20,2) DEFAULT NULL, + `boll_ub` double(20,2) DEFAULT NULL, + `kdjd` double(20,2) DEFAULT NULL, + `kdjj` double(20,2) DEFAULT NULL, + `kdjk` double(20,2) DEFAULT NULL, + `macd` double(20,2) DEFAULT NULL, + `macdh` double(20,2) DEFAULT NULL, + `macds` double(20,2) DEFAULT NULL, + `pdi` double(20,2) DEFAULT NULL, + `trix` double(20,2) DEFAULT NULL, + `trix_9_sma` double(20,2) DEFAULT NULL, + `vr` double(20,2) DEFAULT NULL, + `vr_6_sma` double(20,2) DEFAULT NULL, + `wr_10` double(20,2) DEFAULT NULL, + `wr_6` double(20,2) DEFAULT NULL, + PRIMARY KEY (`code`,`date`), + KEY `idx_code` (`code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + + +CREATE TABLE `guess_indicators_lite_sell_daily` ( + `date` varchar(255) NOT NULL, + `code` varchar(255) NOT NULL, + `name` varchar(255) DEFAULT NULL, + `last_price` double(20,2) DEFAULT NULL, + `change_percent` double(20,2) DEFAULT NULL, + `change_amount` double(20,2) DEFAULT NULL, + `volume` double(20,2) DEFAULT NULL, + `turnover` double(20,2) DEFAULT NULL, + `amplitude` double(20,2) DEFAULT NULL, + `high` double(20,2) DEFAULT NULL, + `low` double(20,2) DEFAULT NULL, + `open` double(20,2) DEFAULT NULL, + `closed` double(20,2) DEFAULT NULL, + `volume_ratio` double(20,2) DEFAULT NULL, + `turnover_rate` double(20,2) DEFAULT NULL, + `pe_ratio` double(20,2) DEFAULT NULL, + `pb_ratio` double(20,2) DEFAULT NULL, + `market_cap` double(20,2) DEFAULT NULL, + `circulating_market_cap` double(20,2) DEFAULT NULL, + `rise_speed` double(20,2) DEFAULT NULL, + `change_5min` double(20,2) DEFAULT NULL, + `change_ercent_60day` double(20,2) DEFAULT NULL, + `ytd_change_percent` double(20,2) DEFAULT NULL, + `boll` double(20,2) DEFAULT NULL, + `boll_lb` double(20,2) DEFAULT NULL, + `boll_ub` double(20,2) DEFAULT NULL, + `kdjd` double(20,2) DEFAULT NULL, + `kdjj` double(20,2) DEFAULT NULL, + `kdjk` double(20,2) DEFAULT NULL, + `macd` double(20,2) DEFAULT NULL, + `macdh` double(20,2) DEFAULT NULL, + `macds` double(20,2) DEFAULT NULL, + `pdi` double(20,2) DEFAULT NULL, + `trix` double(20,2) DEFAULT NULL, + `trix_9_sma` double(20,2) DEFAULT NULL, + `vr` double(20,2) DEFAULT NULL, + `vr_6_sma` double(20,2) DEFAULT NULL, + `wr_10` double(20,2) DEFAULT NULL, + `wr_6` double(20,2) DEFAULT NULL, + PRIMARY KEY (`code`,`date`), + KEY `idx_code` (`code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + diff --git a/docker-compose/mysql/my.cnf b/docker-compose/mysql/my.cnf new file mode 100644 index 0000000..4392d8c --- /dev/null +++ b/docker-compose/mysql/my.cnf @@ -0,0 +1,38 @@ +# https://blog.csdn.net/aichogn/article/details/117788275 +# mysql 推荐配置 +[client] +socket=/var/lib/mysql/mysql.sock +port=3306 +[mysqld] + +basedir=/var/lib/mysql/ +datadir=/var/lib/mysql/data +socket=/var/lib/mysql/mysql.sock +default-storage-engine=INNODB +character_set_server=utf8mb4 +collation_server=utf8mb4_general_ci + +port=3306 +# Disabling symbolic-links is recommended to prevent assorted security risks +symbolic-links=0 + +server_id=1 + + ## 最大连接数,MySQL服务器允许的最大连接数16384,连接数越多消耗内存越多 +max_connections = 1000 +## 日志过期时间,包括二进制日志(过期自动删除) +# expire_logs_days = 15 +## Enable Per Table Data for InnoDB to shrink ibdata1(innoDB表优化) +innodb_file_per_table = 1 +#默认128M,用于存储页面缓存数据外,另外正常情况下还有大约8%的开销,主要用在每个缓存页帧的描述、adaptive hash等数据结构,适当的增加这个参数的大小,可以有效的减少 InnoDB 类型的表的磁盘 I/O +innodb_buffer_pool_size = 2048M +innodb_log_file_size = 512M +#默认是8MB,InnoDB在写事务日志的时候,为了提高性能,也是先将信息写入Innofb Log Buffer中,当满足innodb_flush_log_trx_commit参数所设置的相应条件(或者日志缓冲区写满)之后,才会将日志写到文件 (或者同步到磁盘)中 +innodb_log_buffer_size = 8M +innodb_flush_log_at_trx_commit = 2 +#表大小写不敏感 +lower_case_table_names=1 +#跳过密码 安装完后屏蔽该选项 +#skip-grant-tables +#关闭 binlog +skip-log-bin \ No newline at end of file diff --git a/docker-compose/nginx.conf b/docker-compose/nginx.conf new file mode 100644 index 0000000..dddef81 --- /dev/null +++ b/docker-compose/nginx.conf @@ -0,0 +1,47 @@ +# 设置nginx启动 +# systemctl enable nginx +server { + listen 8080; + server_name www.pythonstock.com; + root /usr/share/nginx/html; + + error_page 404 /404.html; + error_page 500 502 503 504 /50x.html; + + # 开启gzip + gzip on; + # 启用gzip压缩的最小文件;小于设置值的文件将不会被压缩 + gzip_min_length 1k; + # gzip 压缩级别 1-10 + gzip_comp_level 2; + # 进行压缩的文件类型。 + gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; + # 是否在http header中添加Vary: Accept-Encoding,建议开启 + gzip_vary on; + + access_log /var/log/nginx/stock.access.log main; + error_log /var/log/nginx/stock.error.log warn; + + # https://medium.com/aviabird/413-414-request-url-entity-too-large-error-nginx-b6dcece6f5dd + # 解决GET 参数过长问题。 + client_max_body_size 10M; + large_client_header_buffers 4 20k; + + + location ^~ /static/ { + access_log off; + # 需要把源代码,再下载一遍。 + root /data/pythonstock/stock/web; + expires 30d; # 设置30天超时 + # 参考 https://www.cnblogs.com/kevingrace/p/10459429.html + # add_header Cache-Control max-age=360000; + } + + location / { + proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_pass http://127.0.0.1:9090; + expires 0; + } +} \ No newline at end of file diff --git a/docker-compose/nginx/nginx.conf b/docker-compose/nginx/nginx.conf new file mode 100644 index 0000000..65b4305 --- /dev/null +++ b/docker-compose/nginx/nginx.conf @@ -0,0 +1,22 @@ +server { + listen 8080; + server_name localhost; + #access_log /var/log/nginx/host.access.log main; + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + } + + location /api/v1 { + proxy_pass http://backend:9090; + } + + + error_page 404 /404.html; + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } + +} diff --git a/frontend/.eslintignore b/frontend/.eslintignore new file mode 100644 index 0000000..6b04c85 --- /dev/null +++ b/frontend/.eslintignore @@ -0,0 +1,5 @@ +build/*.js +src/assets +public +dist +eslint-disable \ No newline at end of file diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..b488630 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,16 @@ +.DS_Store +node_modules/ +dist/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +package-lock.json +tests/**/coverage/ + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln \ No newline at end of file diff --git a/frontend/LICENSE b/frontend/LICENSE new file mode 100644 index 0000000..6151575 --- /dev/null +++ b/frontend/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017-present PanJiaChen + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..879bf8b --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,42 @@ +### 说明,项目迁移到了Gitee 啦,最后一次修改,2023-06-02 执行存档 + +项目迁移到这里了:此项目后续更新访问这里: + +https://gitee.com/pythonstock/stock-ui + +github项目后续就Archives存档了,不再更新了! + +csdn的pythonstock专栏地址,相关资料都在这里有说明: + +https://blog.csdn.net/freewebsys/category_9285317.html + + +## 1,股票系统前端项目 + +elementUI + +https://element.eleme.cn/#/zh-CN + +使用vue-element-admin的模板进行项目开发: + +https://panjiachen.github.io/vue-element-admin-site/zh/guide/ + +在线预览地址: + +https://panjiachen.github.io/vue-element-admin/#/dashboard + +模板源自: +https://gitee.com/panjiachen/vue-admin-template + +【相关python stock资料分类】: +http://blog.csdn.net/freewebsys/article/category/7076584 + + +## 2,动态展示表格 + +http://localhost:9528/#/example/table + + +在.eslintrc.js 文件中配置 eslint-disable 指令来关闭ESlint语法检测。 + + diff --git a/frontend/babel.config.js b/frontend/babel.config.js new file mode 100644 index 0000000..fb82b27 --- /dev/null +++ b/frontend/babel.config.js @@ -0,0 +1,14 @@ +module.exports = { + presets: [ + // https://github.com/vuejs/vue-cli/tree/master/packages/@vue/babel-preset-app + '@vue/cli-plugin-babel/preset' + ], + 'env': { + 'development': { + // babel-plugin-dynamic-import-node plugin only does one thing by converting all import() to require(). + // This plugin can significantly increase the speed of hot updates, when you have a large number of pages. + // https://panjiachen.github.io/vue-element-admin-site/guide/advanced/lazy-loading.html + 'plugins': ['dynamic-import-node'] + } + } +} diff --git a/frontend/docker-build.sh b/frontend/docker-build.sh new file mode 100755 index 0000000..ceae844 --- /dev/null +++ b/frontend/docker-build.sh @@ -0,0 +1,24 @@ +#!/bin/sh + +sleep 1 +# 只依赖启动。 +cd /usr/src/app + +#!/bin/bash + +# 定义要检查的文件夹路径 +modules_path="/usr/src/app/node_modules" + +# 使用[ ]检查文件夹是否存在 +if [ -d "$modules_path" ]; then + echo "文件夹 $modules_path 存在" +else + echo "文件夹 $modules_path 不存在,执行 install 安装" + npm install --registry=https://registry.npmmirror.com +fi + +npm run build +# 编译完成之后拷贝 html 资源到 影射目录,等待即可。每次编译前都清空内容。 +rm -rf /data/html/* +cp -r ./dist/* /data/html/ +echo "######### build finish and cp all html #########" \ No newline at end of file diff --git a/frontend/docker-entrypoint.sh b/frontend/docker-entrypoint.sh new file mode 100755 index 0000000..064898f --- /dev/null +++ b/frontend/docker-entrypoint.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +sleep 1 +# 只依赖启动。 +cd /usr/src/app + +#!/bin/bash + +# 定义要检查的文件夹路径 +modules_path="/usr/src/app/node_modules" + +# 使用[ ]检查文件夹是否存在 +if [ -d "$modules_path" ]; then + echo "文件夹 $modules_path 存在" +else + echo "文件夹 $modules_path 不存在,执行 install 安装" + npm install --registry=https://registry.npmmirror.com +fi + +npm run dev +sleep 999999d diff --git a/frontend/jest.config.js b/frontend/jest.config.js new file mode 100644 index 0000000..143cdc8 --- /dev/null +++ b/frontend/jest.config.js @@ -0,0 +1,24 @@ +module.exports = { + moduleFileExtensions: ['js', 'jsx', 'json', 'vue'], + transform: { + '^.+\\.vue$': 'vue-jest', + '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': + 'jest-transform-stub', + '^.+\\.jsx?$': 'babel-jest' + }, + moduleNameMapper: { + '^@/(.*)$': '/src/$1' + }, + snapshotSerializers: ['jest-serializer-vue'], + testMatch: [ + '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)' + ], + collectCoverageFrom: ['src/utils/**/*.{js,vue}', '!src/utils/auth.js', '!src/utils/request.js', 'src/components/**/*.{js,vue}'], + coverageDirectory: '/tests/unit/coverage', + // 'collectCoverage': true, + 'coverageReporters': [ + 'lcov', + 'text-summary' + ], + testURL: 'http://localhost/' +} diff --git a/frontend/jsconfig.json b/frontend/jsconfig.json new file mode 100644 index 0000000..ed079e2 --- /dev/null +++ b/frontend/jsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "baseUrl": "./", + "paths": { + "@/*": ["src/*"] + } + }, + "exclude": ["node_modules", "dist"] +} diff --git a/frontend/mock/index.js b/frontend/mock/index.js new file mode 100644 index 0000000..c514c13 --- /dev/null +++ b/frontend/mock/index.js @@ -0,0 +1,57 @@ +const Mock = require('mockjs') +const { param2Obj } = require('./utils') + +const user = require('./user') +const table = require('./table') + +const mocks = [ + ...user, + ...table +] + +// for front mock +// please use it cautiously, it will redefine XMLHttpRequest, +// which will cause many of your third-party libraries to be invalidated(like progress event). +function mockXHR() { + // mock patch + // https://github.com/nuysoft/Mock/issues/300 + Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send + Mock.XHR.prototype.send = function() { + if (this.custom.xhr) { + this.custom.xhr.withCredentials = this.withCredentials || false + + if (this.responseType) { + this.custom.xhr.responseType = this.responseType + } + } + this.proxy_send(...arguments) + } + + function XHR2ExpressReqWrap(respond) { + return function(options) { + let result = null + if (respond instanceof Function) { + const { body, type, url } = options + // https://expressjs.com/en/4x/api.html#req + result = respond({ + method: type, + body: JSON.parse(body), + query: param2Obj(url) + }) + } else { + result = respond + } + return Mock.mock(result) + } + } + + for (const i of mocks) { + Mock.mock(new RegExp(i.url), i.type || 'get', XHR2ExpressReqWrap(i.response)) + } +} + +module.exports = { + mocks, + mockXHR +} + diff --git a/frontend/mock/mock-server.js b/frontend/mock/mock-server.js new file mode 100644 index 0000000..8941ec0 --- /dev/null +++ b/frontend/mock/mock-server.js @@ -0,0 +1,81 @@ +const chokidar = require('chokidar') +const bodyParser = require('body-parser') +const chalk = require('chalk') +const path = require('path') +const Mock = require('mockjs') + +const mockDir = path.join(process.cwd(), 'mock') + +function registerRoutes(app) { + let mockLastIndex + const { mocks } = require('./index.js') + const mocksForServer = mocks.map(route => { + return responseFake(route.url, route.type, route.response) + }) + for (const mock of mocksForServer) { + app[mock.type](mock.url, mock.response) + mockLastIndex = app._router.stack.length + } + const mockRoutesLength = Object.keys(mocksForServer).length + return { + mockRoutesLength: mockRoutesLength, + mockStartIndex: mockLastIndex - mockRoutesLength + } +} + +function unregisterRoutes() { + Object.keys(require.cache).forEach(i => { + if (i.includes(mockDir)) { + delete require.cache[require.resolve(i)] + } + }) +} + +// for mock server +const responseFake = (url, type, respond) => { + return { + url: new RegExp(`${process.env.VUE_APP_BASE_API}${url}`), + type: type || 'get', + response(req, res) { + console.log('request invoke:' + req.path) + res.json(Mock.mock(respond instanceof Function ? respond(req, res) : respond)) + } + } +} + +module.exports = app => { + // parse app.body + // https://expressjs.com/en/4x/api.html#req.body + app.use(bodyParser.json()) + app.use(bodyParser.urlencoded({ + extended: true + })) + + const mockRoutes = registerRoutes(app) + var mockRoutesLength = mockRoutes.mockRoutesLength + var mockStartIndex = mockRoutes.mockStartIndex + + // watch files, hot reload mock server + chokidar.watch(mockDir, { + ignored: /mock-server/, + ignoreInitial: true + }).on('all', (event, path) => { + if (event === 'change' || event === 'add') { + try { + // remove mock routes stack + app._router.stack.splice(mockStartIndex, mockRoutesLength) + + // clear routes cache + unregisterRoutes() + + const mockRoutes = registerRoutes(app) + mockRoutesLength = mockRoutes.mockRoutesLength + mockStartIndex = mockRoutes.mockStartIndex + + console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed ${path}`)) + } catch (error) { + console.log(chalk.redBright(error)) + } + } + }) +} diff --git a/frontend/mock/table.js b/frontend/mock/table.js new file mode 100644 index 0000000..bd0e013 --- /dev/null +++ b/frontend/mock/table.js @@ -0,0 +1,29 @@ +const Mock = require('mockjs') + +const data = Mock.mock({ + 'items|30': [{ + id: '@id', + title: '@sentence(10, 20)', + 'status|1': ['published', 'draft', 'deleted'], + author: 'name', + display_time: '@datetime', + pageviews: '@integer(300, 5000)' + }] +}) + +module.exports = [ + { + url: '/vue-admin-template/table/list', + type: 'get', + response: config => { + const items = data.items + return { + code: 20000, + data: { + total: items.length, + items: items + } + } + } + } +] diff --git a/frontend/mock/user.js b/frontend/mock/user.js new file mode 100644 index 0000000..7555338 --- /dev/null +++ b/frontend/mock/user.js @@ -0,0 +1,84 @@ + +const tokens = { + admin: { + token: 'admin-token' + }, + editor: { + token: 'editor-token' + } +} + +const users = { + 'admin-token': { + roles: ['admin'], + introduction: 'I am a super administrator', + avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif', + name: 'Super Admin' + }, + 'editor-token': { + roles: ['editor'], + introduction: 'I am an editor', + avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif', + name: 'Normal Editor' + } +} + +module.exports = [ + // user login + { + url: '/vue-admin-template/user/login', + type: 'post', + response: config => { + const { username } = config.body + const token = tokens[username] + + // mock error + if (!token) { + return { + code: 60204, + message: 'Account and password are incorrect.' + } + } + + return { + code: 20000, + data: token + } + } + }, + + // get user info + { + url: '/vue-admin-template/user/info\.*', + type: 'get', + response: config => { + const { token } = config.query + const info = users[token] + + // mock error + if (!info) { + return { + code: 50008, + message: 'Login failed, unable to get user details.' + } + } + + return { + code: 20000, + data: info + } + } + }, + + // user logout + { + url: '/vue-admin-template/user/logout', + type: 'post', + response: _ => { + return { + code: 20000, + data: 'success' + } + } + } +] diff --git a/frontend/mock/utils.js b/frontend/mock/utils.js new file mode 100644 index 0000000..95cc27d --- /dev/null +++ b/frontend/mock/utils.js @@ -0,0 +1,25 @@ +/** + * @param {string} url + * @returns {Object} + */ +function param2Obj(url) { + const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ') + if (!search) { + return {} + } + const obj = {} + const searchArr = search.split('&') + searchArr.forEach(v => { + const index = v.indexOf('=') + if (index !== -1) { + const name = v.substring(0, index) + const val = v.substring(index + 1, v.length) + obj[name] = val + } + }) + return obj +} + +module.exports = { + param2Obj +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..6f68b70 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,64 @@ +{ + "name": "vue-admin-template", + "version": "4.4.0", + "description": "A vue admin template with Element UI & axios & iconfont & permission control & lint", + "author": "Pan ", + "scripts": { + "dev": "./node_modules/.bin/vue-cli-service serve ", + "build": "./node_modules/.bin/vue-cli-service build", + "build:stage": "./node_modules/.bin/vue-cli-service build --mode staging", + "preview": "node build/index.js --preview", + "svgo": "./node_modules/.bin/svgo -f src/icons/svg --config=src/icons/svgo.yml", + "lint": "./node_modules/.bin/eslint --ext .js,.vue src", + "test:unit": "./node_modules/.bin/jest --clearCache && vue-cli-service test:unit", + "test:ci": "npm run lint && npm run test:unit" + }, + "dependencies": { + "axios": "0.28.0", + "core-js": "^3.26.1", + "element-ui": "2.15.14", + "file-saver": "^2.0.5", + "js-cookie": "2.2.0", + "normalize.css": "7.0.0", + "nprogress": "0.2.0", + "path-to-regexp": "2.4.0", + "vue": "2.6.10", + "vue-router": "3.0.6", + "vuex": "3.1.0", + "xlsx": "^0.18.5" + }, + "devDependencies": { + "@vue/cli-plugin-babel": "4.4.4", + "@vue/cli-plugin-eslint": "4.4.4", + "@vue/cli-plugin-unit-jest": "4.4.4", + "@vue/cli-service": "4.4.4", + "@vue/test-utils": "1.0.0-beta.29", + "autoprefixer": "9.5.1", + "babel-eslint": "10.1.0", + "babel-jest": "23.6.0", + "babel-plugin-dynamic-import-node": "2.3.3", + "chalk": "2.4.2", + "connect": "3.6.6", + "eslint": "6.7.2", + "eslint-plugin-vue": "6.2.2", + "html-webpack-plugin": "3.2.0", + "mockjs": "1.0.1-beta3", + "runjs": "4.3.2", + "sass": "1.26.8", + "sass-loader": "8.0.2", + "script-ext-html-webpack-plugin": "2.1.3", + "serve-static": "1.16.0", + "svg-sprite-loader": "4.1.3", + "svgo": "1.2.2", + "vue-template-compiler": "2.6.10" + }, + "browserslist": [ + "> 1%", + "last 2 versions" + ], + "engines": { + "node": ">=8.9", + "npm": ">= 3.0.0" + }, + "license": "MIT" +} diff --git a/frontend/postcss.config.js b/frontend/postcss.config.js new file mode 100644 index 0000000..10473ef --- /dev/null +++ b/frontend/postcss.config.js @@ -0,0 +1,8 @@ +// https://github.com/michael-ciniawsky/postcss-load-config + +module.exports = { + 'plugins': { + // to edit target browsers: use "browserslist" field in package.json + 'autoprefixer': {} + } +} diff --git a/frontend/public/40x.html b/frontend/public/40x.html new file mode 100644 index 0000000..bc433cb --- /dev/null +++ b/frontend/public/40x.html @@ -0,0 +1,8 @@ + + +404 Not Found + +

    404 Not Found

    +
    nginx/1.26.3
    + + \ No newline at end of file diff --git a/frontend/public/50x.html b/frontend/public/50x.html new file mode 100644 index 0000000..a57c2f9 --- /dev/null +++ b/frontend/public/50x.html @@ -0,0 +1,19 @@ + + + +Error + + + +

    An error occurred.

    +

    Sorry, the page you are looking for is currently unavailable.
    +Please try again later.

    +

    If you are the system administrator of this resource then you should check +the error log for details.

    +

    Faithfully yours, nginx.

    + + diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico new file mode 100644 index 0000000..34b63ac Binary files /dev/null and b/frontend/public/favicon.ico differ diff --git a/frontend/public/freewebsys-logo.jpg b/frontend/public/freewebsys-logo.jpg new file mode 100644 index 0000000..5344008 Binary files /dev/null and b/frontend/public/freewebsys-logo.jpg differ diff --git a/frontend/public/index.html b/frontend/public/index.html new file mode 100644 index 0000000..fa2be91 --- /dev/null +++ b/frontend/public/index.html @@ -0,0 +1,17 @@ + + + + + + + + <%= webpackConfig.name %> + + + +
    + + + diff --git a/frontend/public/stock-001.png b/frontend/public/stock-001.png new file mode 100644 index 0000000..417355a Binary files /dev/null and b/frontend/public/stock-001.png differ diff --git a/frontend/public/stock-002.png b/frontend/public/stock-002.png new file mode 100644 index 0000000..faf015f Binary files /dev/null and b/frontend/public/stock-002.png differ diff --git a/frontend/public/stock-003.png b/frontend/public/stock-003.png new file mode 100644 index 0000000..5a37516 Binary files /dev/null and b/frontend/public/stock-003.png differ diff --git a/frontend/src/App.vue b/frontend/src/App.vue new file mode 100644 index 0000000..ec9032c --- /dev/null +++ b/frontend/src/App.vue @@ -0,0 +1,11 @@ + + + diff --git a/frontend/src/api/article.js b/frontend/src/api/article.js new file mode 100644 index 0000000..c21f6d5 --- /dev/null +++ b/frontend/src/api/article.js @@ -0,0 +1,41 @@ +import request from '@/utils/request' + +export function fetchList(query) { + return request({ + url: '/api/v1/api_data', + method: 'get', + params: query + }) +} + +export function fetchArticle(id) { + return request({ + url: '/vue-element-admin/article/detail', + method: 'get', + params: { id } + }) +} + +export function fetchPv(pv) { + return request({ + url: '/vue-element-admin/article/pv', + method: 'get', + params: { pv } + }) +} + +export function createArticle(data) { + return request({ + url: '/vue-element-admin/article/create', + method: 'post', + data + }) +} + +export function updateArticle(data) { + return request({ + url: '/vue-element-admin/article/update', + method: 'post', + data + }) +} diff --git a/frontend/src/api/menu.js b/frontend/src/api/menu.js new file mode 100644 index 0000000..54f3fb4 --- /dev/null +++ b/frontend/src/api/menu.js @@ -0,0 +1,12 @@ +import request from '@/utils/request' + +// 同步获得菜单相关数据。 + +export function fetchMenuList(query) { + return request({ + url: '/api/v1/menu_list', + method: 'get', + params: query + }) +} + diff --git a/frontend/src/api/package.js b/frontend/src/api/package.js new file mode 100644 index 0000000..61c9754 --- /dev/null +++ b/frontend/src/api/package.js @@ -0,0 +1,10 @@ +import request from '@/utils/request' + +export function fetchPackageVersion(query) { + return request({ + url: '/api/v1/package_verison', + method: 'get', + params: query + }) +} + diff --git a/frontend/src/api/table.js b/frontend/src/api/table.js new file mode 100644 index 0000000..2752f52 --- /dev/null +++ b/frontend/src/api/table.js @@ -0,0 +1,9 @@ +import request from '@/utils/request' + +export function getList(params) { + return request({ + url: '/vue-admin-template/table/list', + method: 'get', + params + }) +} diff --git a/frontend/src/api/user.js b/frontend/src/api/user.js new file mode 100644 index 0000000..8ff4389 --- /dev/null +++ b/frontend/src/api/user.js @@ -0,0 +1,24 @@ +import request from '@/utils/request' + +export function login(data) { + return request({ + url: '/vue-admin-template/user/login', + method: 'post', + data + }) +} + +export function getInfo(token) { + return request({ + url: '/vue-admin-template/user/info', + method: 'get', + params: { token } + }) +} + +export function logout() { + return request({ + url: '/vue-admin-template/user/logout', + method: 'post' + }) +} diff --git a/frontend/src/assets/404_images/404.png b/frontend/src/assets/404_images/404.png new file mode 100644 index 0000000..3d8e230 Binary files /dev/null and b/frontend/src/assets/404_images/404.png differ diff --git a/frontend/src/assets/404_images/404_cloud.png b/frontend/src/assets/404_images/404_cloud.png new file mode 100644 index 0000000..c6281d0 Binary files /dev/null and b/frontend/src/assets/404_images/404_cloud.png differ diff --git a/frontend/src/components/Breadcrumb/index.vue b/frontend/src/components/Breadcrumb/index.vue new file mode 100644 index 0000000..29f9a04 --- /dev/null +++ b/frontend/src/components/Breadcrumb/index.vue @@ -0,0 +1,78 @@ + + + + + diff --git a/frontend/src/components/Hamburger/index.vue b/frontend/src/components/Hamburger/index.vue new file mode 100644 index 0000000..368b002 --- /dev/null +++ b/frontend/src/components/Hamburger/index.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/frontend/src/components/Pagination/index.vue b/frontend/src/components/Pagination/index.vue new file mode 100644 index 0000000..c815e13 --- /dev/null +++ b/frontend/src/components/Pagination/index.vue @@ -0,0 +1,101 @@ + + + + + diff --git a/frontend/src/components/SvgIcon/index.vue b/frontend/src/components/SvgIcon/index.vue new file mode 100644 index 0000000..b07ded2 --- /dev/null +++ b/frontend/src/components/SvgIcon/index.vue @@ -0,0 +1,62 @@ + + + + + diff --git a/frontend/src/directive/el-table/adaptive.js b/frontend/src/directive/el-table/adaptive.js new file mode 100644 index 0000000..d229e9f --- /dev/null +++ b/frontend/src/directive/el-table/adaptive.js @@ -0,0 +1,41 @@ +import { addResizeListener, removeResizeListener } from 'element-ui/src/utils/resize-event' + +/** + * How to use + * ... + * el-table height is must be set + * bottomOffset: 30(default) // The height of the table from the bottom of the page. + */ + +const doResize = (el, binding, vnode) => { + const { componentInstance: $table } = vnode + + const { value } = binding + + if (!$table.height) { + throw new Error(`el-$table must set the height. Such as height='100px'`) + } + const bottomOffset = (value && value.bottomOffset) || 30 + + if (!$table) return + + const height = window.innerHeight - el.getBoundingClientRect().top - bottomOffset + $table.layout.setHeight(height) + $table.doLayout() +} + +export default { + bind(el, binding, vnode) { + el.resizeListener = () => { + doResize(el, binding, vnode) + } + // parameter 1 is must be "Element" type + addResizeListener(window.document.body, el.resizeListener) + }, + inserted(el, binding, vnode) { + doResize(el, binding, vnode) + }, + unbind(el) { + removeResizeListener(window.document.body, el.resizeListener) + } +} diff --git a/frontend/src/directive/el-table/index.js b/frontend/src/directive/el-table/index.js new file mode 100644 index 0000000..d3d4515 --- /dev/null +++ b/frontend/src/directive/el-table/index.js @@ -0,0 +1,13 @@ +import adaptive from './adaptive' + +const install = function(Vue) { + Vue.directive('el-height-adaptive-table', adaptive) +} + +if (window.Vue) { + window['el-height-adaptive-table'] = adaptive + Vue.use(install); // eslint-disable-line +} + +adaptive.install = install +export default adaptive diff --git a/frontend/src/directive/waves/index.js b/frontend/src/directive/waves/index.js new file mode 100644 index 0000000..65f9b30 --- /dev/null +++ b/frontend/src/directive/waves/index.js @@ -0,0 +1,13 @@ +import waves from './waves' + +const install = function(Vue) { + Vue.directive('waves', waves) +} + +if (window.Vue) { + window.waves = waves + Vue.use(install); // eslint-disable-line +} + +waves.install = install +export default waves diff --git a/frontend/src/directive/waves/waves.css b/frontend/src/directive/waves/waves.css new file mode 100644 index 0000000..af7a7ef --- /dev/null +++ b/frontend/src/directive/waves/waves.css @@ -0,0 +1,26 @@ +.waves-ripple { + position: absolute; + border-radius: 100%; + background-color: rgba(0, 0, 0, 0.15); + background-clip: padding-box; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-transform: scale(0); + -ms-transform: scale(0); + transform: scale(0); + opacity: 1; +} + +.waves-ripple.z-active { + opacity: 0; + -webkit-transform: scale(2); + -ms-transform: scale(2); + transform: scale(2); + -webkit-transition: opacity 1.2s ease-out, -webkit-transform 0.6s ease-out; + transition: opacity 1.2s ease-out, -webkit-transform 0.6s ease-out; + transition: opacity 1.2s ease-out, transform 0.6s ease-out; + transition: opacity 1.2s ease-out, transform 0.6s ease-out, -webkit-transform 0.6s ease-out; +} \ No newline at end of file diff --git a/frontend/src/directive/waves/waves.js b/frontend/src/directive/waves/waves.js new file mode 100644 index 0000000..ec2ff43 --- /dev/null +++ b/frontend/src/directive/waves/waves.js @@ -0,0 +1,72 @@ +import './waves.css' + +const context = '@@wavesContext' + +function handleClick(el, binding) { + function handle(e) { + const customOpts = Object.assign({}, binding.value) + const opts = Object.assign({ + ele: el, // 波纹作用元素 + type: 'hit', // hit 点击位置扩散 center中心点扩展 + color: 'rgba(0, 0, 0, 0.15)' // 波纹颜色 + }, + customOpts + ) + const target = opts.ele + if (target) { + target.style.position = 'relative' + target.style.overflow = 'hidden' + const rect = target.getBoundingClientRect() + let ripple = target.querySelector('.waves-ripple') + if (!ripple) { + ripple = document.createElement('span') + ripple.className = 'waves-ripple' + ripple.style.height = ripple.style.width = Math.max(rect.width, rect.height) + 'px' + target.appendChild(ripple) + } else { + ripple.className = 'waves-ripple' + } + switch (opts.type) { + case 'center': + ripple.style.top = rect.height / 2 - ripple.offsetHeight / 2 + 'px' + ripple.style.left = rect.width / 2 - ripple.offsetWidth / 2 + 'px' + break + default: + ripple.style.top = + (e.pageY - rect.top - ripple.offsetHeight / 2 - document.documentElement.scrollTop || + document.body.scrollTop) + 'px' + ripple.style.left = + (e.pageX - rect.left - ripple.offsetWidth / 2 - document.documentElement.scrollLeft || + document.body.scrollLeft) + 'px' + } + ripple.style.backgroundColor = opts.color + ripple.className = 'waves-ripple z-active' + return false + } + } + + if (!el[context]) { + el[context] = { + removeHandle: handle + } + } else { + el[context].removeHandle = handle + } + + return handle +} + +export default { + bind(el, binding) { + el.addEventListener('click', handleClick(el, binding), false) + }, + update(el, binding) { + el.removeEventListener('click', el[context].removeHandle, false) + el.addEventListener('click', handleClick(el, binding), false) + }, + unbind(el) { + el.removeEventListener('click', el[context].removeHandle, false) + el[context] = null + delete el[context] + } +} diff --git a/frontend/src/icons/index.js b/frontend/src/icons/index.js new file mode 100644 index 0000000..2c6b309 --- /dev/null +++ b/frontend/src/icons/index.js @@ -0,0 +1,9 @@ +import Vue from 'vue' +import SvgIcon from '@/components/SvgIcon'// svg component + +// register globally +Vue.component('svg-icon', SvgIcon) + +const req = require.context('./svg', false, /\.svg$/) +const requireAll = requireContext => requireContext.keys().map(requireContext) +requireAll(req) diff --git a/frontend/src/icons/svg/dashboard.svg b/frontend/src/icons/svg/dashboard.svg new file mode 100644 index 0000000..5317d37 --- /dev/null +++ b/frontend/src/icons/svg/dashboard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/icons/svg/example.svg b/frontend/src/icons/svg/example.svg new file mode 100644 index 0000000..46f42b5 --- /dev/null +++ b/frontend/src/icons/svg/example.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/icons/svg/eye-open.svg b/frontend/src/icons/svg/eye-open.svg new file mode 100644 index 0000000..88dcc98 --- /dev/null +++ b/frontend/src/icons/svg/eye-open.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/icons/svg/eye.svg b/frontend/src/icons/svg/eye.svg new file mode 100644 index 0000000..16ed2d8 --- /dev/null +++ b/frontend/src/icons/svg/eye.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/icons/svg/form.svg b/frontend/src/icons/svg/form.svg new file mode 100644 index 0000000..dcbaa18 --- /dev/null +++ b/frontend/src/icons/svg/form.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/icons/svg/link.svg b/frontend/src/icons/svg/link.svg new file mode 100644 index 0000000..48197ba --- /dev/null +++ b/frontend/src/icons/svg/link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/icons/svg/nested.svg b/frontend/src/icons/svg/nested.svg new file mode 100644 index 0000000..06713a8 --- /dev/null +++ b/frontend/src/icons/svg/nested.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/icons/svg/password.svg b/frontend/src/icons/svg/password.svg new file mode 100644 index 0000000..e291d85 --- /dev/null +++ b/frontend/src/icons/svg/password.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/icons/svg/table.svg b/frontend/src/icons/svg/table.svg new file mode 100644 index 0000000..0e3dc9d --- /dev/null +++ b/frontend/src/icons/svg/table.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/icons/svg/tree.svg b/frontend/src/icons/svg/tree.svg new file mode 100644 index 0000000..dd4b7dd --- /dev/null +++ b/frontend/src/icons/svg/tree.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/icons/svg/user.svg b/frontend/src/icons/svg/user.svg new file mode 100644 index 0000000..0ba0716 --- /dev/null +++ b/frontend/src/icons/svg/user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/icons/svgo.yml b/frontend/src/icons/svgo.yml new file mode 100644 index 0000000..d11906a --- /dev/null +++ b/frontend/src/icons/svgo.yml @@ -0,0 +1,22 @@ +# replace default config + +# multipass: true +# full: true + +plugins: + + # - name + # + # or: + # - name: false + # - name: true + # + # or: + # - name: + # param1: 1 + # param2: 2 + +- removeAttrs: + attrs: + - 'fill' + - 'fill-rule' diff --git a/frontend/src/layout/components/AppMain.vue b/frontend/src/layout/components/AppMain.vue new file mode 100644 index 0000000..f6a3286 --- /dev/null +++ b/frontend/src/layout/components/AppMain.vue @@ -0,0 +1,40 @@ + + + + + + + diff --git a/frontend/src/layout/components/Navbar.vue b/frontend/src/layout/components/Navbar.vue new file mode 100644 index 0000000..1f6e40e --- /dev/null +++ b/frontend/src/layout/components/Navbar.vue @@ -0,0 +1,139 @@ + + + + + diff --git a/frontend/src/layout/components/Sidebar/FixiOSBug.js b/frontend/src/layout/components/Sidebar/FixiOSBug.js new file mode 100644 index 0000000..bc14856 --- /dev/null +++ b/frontend/src/layout/components/Sidebar/FixiOSBug.js @@ -0,0 +1,26 @@ +export default { + computed: { + device() { + return this.$store.state.app.device + } + }, + mounted() { + // In order to fix the click on menu on the ios device will trigger the mouseleave bug + // https://github.com/PanJiaChen/vue-element-admin/issues/1135 + this.fixBugIniOS() + }, + methods: { + fixBugIniOS() { + const $subMenu = this.$refs.subMenu + if ($subMenu) { + const handleMouseleave = $subMenu.handleMouseleave + $subMenu.handleMouseleave = (e) => { + if (this.device === 'mobile') { + return + } + handleMouseleave(e) + } + } + } + } +} diff --git a/frontend/src/layout/components/Sidebar/Item.vue b/frontend/src/layout/components/Sidebar/Item.vue new file mode 100644 index 0000000..aa1f5da --- /dev/null +++ b/frontend/src/layout/components/Sidebar/Item.vue @@ -0,0 +1,41 @@ + + + diff --git a/frontend/src/layout/components/Sidebar/Link.vue b/frontend/src/layout/components/Sidebar/Link.vue new file mode 100644 index 0000000..530b3d5 --- /dev/null +++ b/frontend/src/layout/components/Sidebar/Link.vue @@ -0,0 +1,43 @@ + + + diff --git a/frontend/src/layout/components/Sidebar/Logo.vue b/frontend/src/layout/components/Sidebar/Logo.vue new file mode 100644 index 0000000..040fab6 --- /dev/null +++ b/frontend/src/layout/components/Sidebar/Logo.vue @@ -0,0 +1,82 @@ + + + + + diff --git a/frontend/src/layout/components/Sidebar/SidebarItem.vue b/frontend/src/layout/components/Sidebar/SidebarItem.vue new file mode 100644 index 0000000..a418c3d --- /dev/null +++ b/frontend/src/layout/components/Sidebar/SidebarItem.vue @@ -0,0 +1,95 @@ + + + diff --git a/frontend/src/layout/components/Sidebar/index.vue b/frontend/src/layout/components/Sidebar/index.vue new file mode 100644 index 0000000..da39034 --- /dev/null +++ b/frontend/src/layout/components/Sidebar/index.vue @@ -0,0 +1,56 @@ + + + diff --git a/frontend/src/layout/components/index.js b/frontend/src/layout/components/index.js new file mode 100644 index 0000000..97ee3cd --- /dev/null +++ b/frontend/src/layout/components/index.js @@ -0,0 +1,3 @@ +export { default as Navbar } from './Navbar' +export { default as Sidebar } from './Sidebar' +export { default as AppMain } from './AppMain' diff --git a/frontend/src/layout/index.vue b/frontend/src/layout/index.vue new file mode 100644 index 0000000..db22a7b --- /dev/null +++ b/frontend/src/layout/index.vue @@ -0,0 +1,93 @@ + + + + + diff --git a/frontend/src/layout/mixin/ResizeHandler.js b/frontend/src/layout/mixin/ResizeHandler.js new file mode 100644 index 0000000..e8d0df8 --- /dev/null +++ b/frontend/src/layout/mixin/ResizeHandler.js @@ -0,0 +1,45 @@ +import store from '@/store' + +const { body } = document +const WIDTH = 992 // refer to Bootstrap's responsive design + +export default { + watch: { + $route(route) { + if (this.device === 'mobile' && this.sidebar.opened) { + store.dispatch('app/closeSideBar', { withoutAnimation: false }) + } + } + }, + beforeMount() { + window.addEventListener('resize', this.$_resizeHandler) + }, + beforeDestroy() { + window.removeEventListener('resize', this.$_resizeHandler) + }, + mounted() { + const isMobile = this.$_isMobile() + if (isMobile) { + store.dispatch('app/toggleDevice', 'mobile') + store.dispatch('app/closeSideBar', { withoutAnimation: true }) + } + }, + methods: { + // use $_ for mixins properties + // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential + $_isMobile() { + const rect = body.getBoundingClientRect() + return rect.width - 1 < WIDTH + }, + $_resizeHandler() { + if (!document.hidden) { + const isMobile = this.$_isMobile() + store.dispatch('app/toggleDevice', isMobile ? 'mobile' : 'desktop') + + if (isMobile) { + store.dispatch('app/closeSideBar', { withoutAnimation: true }) + } + } + } + } +} diff --git a/frontend/src/main.js b/frontend/src/main.js new file mode 100644 index 0000000..c57df4f --- /dev/null +++ b/frontend/src/main.js @@ -0,0 +1,44 @@ +import Vue from 'vue' + +import 'normalize.css/normalize.css' // A modern alternative to CSS resets + +import ElementUI from 'element-ui' +import 'element-ui/lib/theme-chalk/index.css' +import locale from 'element-ui/lib/locale/lang/en' // lang i18n + +import '@/styles/index.scss' // global css + +import App from './App' +import store from './store' +import router from './router' + +import '@/icons' // icon +// import '@/permission' // permission control +// 不进行登录校验。 + +/** + * If you don't want to use mock-server + * you want to use MockJs for mock api + * you can execute: mockXHR() + * + * Currently MockJs will be used in the production environment, + * please remove it before going online ! ! ! + */ +if (process.env.NODE_ENV === 'production') { + const { mockXHR } = require('../mock') + mockXHR() +} + +// set ElementUI lang to EN +Vue.use(ElementUI, { locale }) +// 如果想要中文版 element-ui,按如下方式声明 +// Vue.use(ElementUI) + +Vue.config.productionTip = false + +new Vue({ + el: '#app', + router, + store, + render: h => h(App) +}) diff --git a/frontend/src/permission.js b/frontend/src/permission.js new file mode 100644 index 0000000..fa1ea19 --- /dev/null +++ b/frontend/src/permission.js @@ -0,0 +1,64 @@ +import router from './router' +import store from './store' +import { Message } from 'element-ui' +import NProgress from 'nprogress' // progress bar +import 'nprogress/nprogress.css' // progress bar style +import { getToken } from '@/utils/auth' // get token from cookie +import getPageTitle from '@/utils/get-page-title' + +NProgress.configure({ showSpinner: false }) // NProgress Configuration + +const whiteList = ['/login'] // no redirect whitelist + +router.beforeEach(async(to, from, next) => { + // start progress bar + NProgress.start() + + // set page title + document.title = getPageTitle(to.meta.title) + + // determine whether the user has logged in + const hasToken = getToken() + + if (hasToken) { + if (to.path === '/login') { + // if is logged in, redirect to the home page + next({ path: '/' }) + NProgress.done() + } else { + const hasGetUserInfo = store.getters.name + if (hasGetUserInfo) { + next() + } else { + try { + // get user info + await store.dispatch('user/getInfo') + + next() + } catch (error) { + // remove token and go to login page to re-login + await store.dispatch('user/resetToken') + Message.error(error || 'Has Error') + next(`/login?redirect=${to.path}`) + NProgress.done() + } + } + } + } else { + /* has no token*/ + + if (whiteList.indexOf(to.path) !== -1) { + // in the free login whitelist, go directly + next() + } else { + // other pages that do not have permission to access are redirected to the login page. + next(`/login?redirect=${to.path}`) + NProgress.done() + } + } +}) + +router.afterEach(() => { + // finish progress bar + NProgress.done() +}) diff --git a/frontend/src/router/index.js b/frontend/src/router/index.js new file mode 100644 index 0000000..be7f23b --- /dev/null +++ b/frontend/src/router/index.js @@ -0,0 +1,128 @@ +import Vue from 'vue' +import Router from 'vue-router' + +//Vue全局使用Router +Vue.use(Router) + +/* Layout */ +import Layout from '@/layout' +import { fetchMenuList } from '@/api/menu' + + +/** + * Note: sub-menu only appear when route children.length >= 1 + * Detail see: https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html + * + * hidden: true if set true, item will not show in the sidebar(default is false) + * alwaysShow: true if set true, will always show the root menu + * if not set alwaysShow, when item has more than one children route, + * it will becomes nested mode, otherwise not show the root menu + * redirect: noRedirect if set noRedirect will no redirect in the breadcrumb + * name:'router-name' the name is used by (must set!!!) + * meta : { + roles: ['admin','editor'] control the page roles (you can set multiple roles) + title: 'title' the name show in sidebar and breadcrumb (recommend set) + icon: 'svg-name'/'el-icon-x' the icon show in the sidebar + breadcrumb: false if set false, the item will hidden in breadcrumb(default is true) + activeMenu: '/example/list' if set path, the sidebar will highlight the path you set + } + */ + +/** + * constantRoutes + * a base page that does not have permission requirements + * all roles can be accessed + */ +let constantRoutes = [ + { + path: '/login', + component: () => import('@/views/login/index'), + hidden: true + }, + + { + path: '/404', + component: () => import('@/views/404'), + hidden: true + }, + + { + path: '/', + component: Layout, + redirect: '/dashboard', + children: [{ + path: 'dashboard', + name: 'Dashboard', + component: () => import('@/views/dashboard/index'), + meta: { title: 'Dashboard', icon: 'dashboard' } + }] + }, + + { + path: '/stock', + component: Layout, + redirect: '#', + name: 'stock-data-table', + meta: { title: 'Example', icon: 'el-icon-s-help' }, + children: [ + { + path: 'table/:tableName', + name: 'Table', + component: () => import('@/views/table/index'), + meta: { title: 'Table', icon: 'table' } + } + ] + }, + + +] + +fetchMenuList().then(response => { + + let menu_data = response.data + for (const menu of menu_data) { + console.info(menu) + var childrenList = [] + for (const childrenMenu of menu.children) { + var tmpChildren = { + path: childrenMenu.path, + name: childrenMenu.name, + component: () => import('@/views/table/index'), + meta: { title: childrenMenu.name , icon: 'table' } + } + childrenList.push(tmpChildren) + } + var tmp_menu = { + path: '/stock'+menu.name, + alwaysShow: true, + component: Layout, + name: menu.name, + redirect: '/#'+menu.name , + meta: { title: menu.name , icon: 'el-icon-s-help' }, + children: childrenList + } + + constantRoutes.push(tmp_menu) + constantRoutes.push( { path: '*', redirect: '/404', hidden: true }) + + } +}) + +// // 404 page must be placed at the end !!! +// constantRoutes.push( { path: '*', redirect: '/404', hidden: true }) + +const createRouter = () => new Router({ + // mode: 'history', // require service support + scrollBehavior: () => ({ y: 0 }), + routes: constantRoutes +}) + +const router = createRouter() + +// Detail see: https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465 +export function resetRouter() { + const newRouter = createRouter() + router.matcher = newRouter.matcher // reset router +} + +export default router diff --git a/frontend/src/settings.js b/frontend/src/settings.js new file mode 100644 index 0000000..ae3c494 --- /dev/null +++ b/frontend/src/settings.js @@ -0,0 +1,16 @@ +module.exports = { + + title: 'Vue Admin Template', + + /** + * @type {boolean} true | false + * @description Whether fix the header + */ + fixedHeader: false, + + /** + * @type {boolean} true | false + * @description Whether show the logo in sidebar + */ + sidebarLogo: false +} diff --git a/frontend/src/store/getters.js b/frontend/src/store/getters.js new file mode 100644 index 0000000..5ab7b4c --- /dev/null +++ b/frontend/src/store/getters.js @@ -0,0 +1,8 @@ +const getters = { + sidebar: state => state.app.sidebar, + device: state => state.app.device, + token: state => state.user.token, + avatar: state => state.user.avatar, + name: state => state.user.name +} +export default getters diff --git a/frontend/src/store/index.js b/frontend/src/store/index.js new file mode 100644 index 0000000..6be466a --- /dev/null +++ b/frontend/src/store/index.js @@ -0,0 +1,19 @@ +import Vue from 'vue' +import Vuex from 'vuex' +import getters from './getters' +import app from './modules/app' +import settings from './modules/settings' +import user from './modules/user' + +Vue.use(Vuex) + +const store = new Vuex.Store({ + modules: { + app, + settings, + user + }, + getters +}) + +export default store diff --git a/frontend/src/store/modules/app.js b/frontend/src/store/modules/app.js new file mode 100644 index 0000000..7ea7e33 --- /dev/null +++ b/frontend/src/store/modules/app.js @@ -0,0 +1,48 @@ +import Cookies from 'js-cookie' + +const state = { + sidebar: { + opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true, + withoutAnimation: false + }, + device: 'desktop' +} + +const mutations = { + TOGGLE_SIDEBAR: state => { + state.sidebar.opened = !state.sidebar.opened + state.sidebar.withoutAnimation = false + if (state.sidebar.opened) { + Cookies.set('sidebarStatus', 1) + } else { + Cookies.set('sidebarStatus', 0) + } + }, + CLOSE_SIDEBAR: (state, withoutAnimation) => { + Cookies.set('sidebarStatus', 0) + state.sidebar.opened = false + state.sidebar.withoutAnimation = withoutAnimation + }, + TOGGLE_DEVICE: (state, device) => { + state.device = device + } +} + +const actions = { + toggleSideBar({ commit }) { + commit('TOGGLE_SIDEBAR') + }, + closeSideBar({ commit }, { withoutAnimation }) { + commit('CLOSE_SIDEBAR', withoutAnimation) + }, + toggleDevice({ commit }, device) { + commit('TOGGLE_DEVICE', device) + } +} + +export default { + namespaced: true, + state, + mutations, + actions +} diff --git a/frontend/src/store/modules/settings.js b/frontend/src/store/modules/settings.js new file mode 100644 index 0000000..b3f33f8 --- /dev/null +++ b/frontend/src/store/modules/settings.js @@ -0,0 +1,32 @@ +import defaultSettings from '@/settings' + +const { showSettings, fixedHeader, sidebarLogo } = defaultSettings + +const state = { + showSettings: showSettings, + fixedHeader: fixedHeader, + sidebarLogo: sidebarLogo +} + +const mutations = { + CHANGE_SETTING: (state, { key, value }) => { + // eslint-disable-next-line no-prototype-builtins + if (state.hasOwnProperty(key)) { + state[key] = value + } + } +} + +const actions = { + changeSetting({ commit }, data) { + commit('CHANGE_SETTING', data) + } +} + +export default { + namespaced: true, + state, + mutations, + actions +} + diff --git a/frontend/src/store/modules/user.js b/frontend/src/store/modules/user.js new file mode 100644 index 0000000..2f6423f --- /dev/null +++ b/frontend/src/store/modules/user.js @@ -0,0 +1,97 @@ +import { login, logout, getInfo } from '@/api/user' +import { getToken, setToken, removeToken } from '@/utils/auth' +import { resetRouter } from '@/router' + +const getDefaultState = () => { + return { + token: getToken(), + name: '', + avatar: '' + } +} + +const state = getDefaultState() + +const mutations = { + RESET_STATE: (state) => { + Object.assign(state, getDefaultState()) + }, + SET_TOKEN: (state, token) => { + state.token = token + }, + SET_NAME: (state, name) => { + state.name = name + }, + SET_AVATAR: (state, avatar) => { + state.avatar = avatar + } +} + +const actions = { + // user login + login({ commit }, userInfo) { + const { username, password } = userInfo + return new Promise((resolve, reject) => { + login({ username: username.trim(), password: password }).then(response => { + const { data } = response + commit('SET_TOKEN', data.token) + setToken(data.token) + resolve() + }).catch(error => { + reject(error) + }) + }) + }, + + // get user info + getInfo({ commit, state }) { + return new Promise((resolve, reject) => { + getInfo(state.token).then(response => { + const { data } = response + + if (!data) { + return reject('Verification failed, please Login again.') + } + + const { name, avatar } = data + + commit('SET_NAME', name) + commit('SET_AVATAR', avatar) + resolve(data) + }).catch(error => { + reject(error) + }) + }) + }, + + // user logout + logout({ commit, state }) { + return new Promise((resolve, reject) => { + logout(state.token).then(() => { + removeToken() // must remove token first + resetRouter() + commit('RESET_STATE') + resolve() + }).catch(error => { + reject(error) + }) + }) + }, + + // remove token + resetToken({ commit }) { + return new Promise(resolve => { + removeToken() // must remove token first + commit('RESET_STATE') + resolve() + }) + } +} + +export default { + namespaced: true, + state, + mutations, + actions +} + diff --git a/frontend/src/styles/element-ui.scss b/frontend/src/styles/element-ui.scss new file mode 100644 index 0000000..0062411 --- /dev/null +++ b/frontend/src/styles/element-ui.scss @@ -0,0 +1,49 @@ +// cover some element-ui styles + +.el-breadcrumb__inner, +.el-breadcrumb__inner a { + font-weight: 400 !important; +} + +.el-upload { + input[type="file"] { + display: none !important; + } +} + +.el-upload__input { + display: none; +} + + +// to fixed https://github.com/ElemeFE/element/issues/2461 +.el-dialog { + transform: none; + left: 0; + position: relative; + margin: 0 auto; +} + +// refine element ui upload +.upload-container { + .el-upload { + width: 100%; + + .el-upload-dragger { + width: 100%; + height: 200px; + } + } +} + +// dropdown +.el-dropdown-menu { + a { + display: block + } +} + +// to fix el-date-picker css style +.el-range-separator { + box-sizing: content-box; +} diff --git a/frontend/src/styles/index.scss b/frontend/src/styles/index.scss new file mode 100644 index 0000000..3b4da51 --- /dev/null +++ b/frontend/src/styles/index.scss @@ -0,0 +1,65 @@ +@import './variables.scss'; +@import './mixin.scss'; +@import './transition.scss'; +@import './element-ui.scss'; +@import './sidebar.scss'; + +body { + height: 100%; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif; +} + +label { + font-weight: 700; +} + +html { + height: 100%; + box-sizing: border-box; +} + +#app { + height: 100%; +} + +*, +*:before, +*:after { + box-sizing: inherit; +} + +a:focus, +a:active { + outline: none; +} + +a, +a:focus, +a:hover { + cursor: pointer; + color: inherit; + text-decoration: none; +} + +div:focus { + outline: none; +} + +.clearfix { + &:after { + visibility: hidden; + display: block; + font-size: 0; + content: " "; + clear: both; + height: 0; + } +} + +// main-container global css +.app-container { + padding: 20px; +} diff --git a/frontend/src/styles/mixin.scss b/frontend/src/styles/mixin.scss new file mode 100644 index 0000000..36b74bb --- /dev/null +++ b/frontend/src/styles/mixin.scss @@ -0,0 +1,28 @@ +@mixin clearfix { + &:after { + content: ""; + display: table; + clear: both; + } +} + +@mixin scrollBar { + &::-webkit-scrollbar-track-piece { + background: #d3dce6; + } + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-thumb { + background: #99a9bf; + border-radius: 20px; + } +} + +@mixin relative { + position: relative; + width: 100%; + height: 100%; +} diff --git a/frontend/src/styles/sidebar.scss b/frontend/src/styles/sidebar.scss new file mode 100644 index 0000000..94760cc --- /dev/null +++ b/frontend/src/styles/sidebar.scss @@ -0,0 +1,226 @@ +#app { + + .main-container { + min-height: 100%; + transition: margin-left .28s; + margin-left: $sideBarWidth; + position: relative; + } + + .sidebar-container { + transition: width 0.28s; + width: $sideBarWidth !important; + background-color: $menuBg; + height: 100%; + position: fixed; + font-size: 0px; + top: 0; + bottom: 0; + left: 0; + z-index: 1001; + overflow: hidden; + + // reset element-ui css + .horizontal-collapse-transition { + transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out; + } + + .scrollbar-wrapper { + overflow-x: hidden !important; + } + + .el-scrollbar__bar.is-vertical { + right: 0px; + } + + .el-scrollbar { + height: 100%; + } + + &.has-logo { + .el-scrollbar { + height: calc(100% - 50px); + } + } + + .is-horizontal { + display: none; + } + + a { + display: inline-block; + width: 100%; + overflow: hidden; + } + + .svg-icon { + margin-right: 16px; + } + + .sub-el-icon { + margin-right: 12px; + margin-left: -2px; + } + + .el-menu { + border: none; + height: 100%; + width: 100% !important; + } + + // menu hover + .submenu-title-noDropdown, + .el-submenu__title { + &:hover { + background-color: $menuHover !important; + } + } + + .is-active>.el-submenu__title { + color: $subMenuActiveText !important; + } + + & .nest-menu .el-submenu>.el-submenu__title, + & .el-submenu .el-menu-item { + min-width: $sideBarWidth !important; + background-color: $subMenuBg !important; + + &:hover { + background-color: $subMenuHover !important; + } + } + } + + .hideSidebar { + .sidebar-container { + width: 54px !important; + } + + .main-container { + margin-left: 54px; + } + + .submenu-title-noDropdown { + padding: 0 !important; + position: relative; + + .el-tooltip { + padding: 0 !important; + + .svg-icon { + margin-left: 20px; + } + + .sub-el-icon { + margin-left: 19px; + } + } + } + + .el-submenu { + overflow: hidden; + + &>.el-submenu__title { + padding: 0 !important; + + .svg-icon { + margin-left: 20px; + } + + .sub-el-icon { + margin-left: 19px; + } + + .el-submenu__icon-arrow { + display: none; + } + } + } + + .el-menu--collapse { + .el-submenu { + &>.el-submenu__title { + &>span { + height: 0; + width: 0; + overflow: hidden; + visibility: hidden; + display: inline-block; + } + } + } + } + } + + .el-menu--collapse .el-menu .el-submenu { + min-width: $sideBarWidth !important; + } + + // mobile responsive + .mobile { + .main-container { + margin-left: 0px; + } + + .sidebar-container { + transition: transform .28s; + width: $sideBarWidth !important; + } + + &.hideSidebar { + .sidebar-container { + pointer-events: none; + transition-duration: 0.3s; + transform: translate3d(-$sideBarWidth, 0, 0); + } + } + } + + .withoutAnimation { + + .main-container, + .sidebar-container { + transition: none; + } + } +} + +// when menu collapsed +.el-menu--vertical { + &>.el-menu { + .svg-icon { + margin-right: 16px; + } + .sub-el-icon { + margin-right: 12px; + margin-left: -2px; + } + } + + .nest-menu .el-submenu>.el-submenu__title, + .el-menu-item { + &:hover { + // you can use $subMenuHover + background-color: $menuHover !important; + } + } + + // the scroll bar appears when the subMenu is too long + >.el-menu--popup { + max-height: 100vh; + overflow-y: auto; + + &::-webkit-scrollbar-track-piece { + background: #d3dce6; + } + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-thumb { + background: #99a9bf; + border-radius: 20px; + } + } +} diff --git a/frontend/src/styles/transition.scss b/frontend/src/styles/transition.scss new file mode 100644 index 0000000..4cb27cc --- /dev/null +++ b/frontend/src/styles/transition.scss @@ -0,0 +1,48 @@ +// global transition css + +/* fade */ +.fade-enter-active, +.fade-leave-active { + transition: opacity 0.28s; +} + +.fade-enter, +.fade-leave-active { + opacity: 0; +} + +/* fade-transform */ +.fade-transform-leave-active, +.fade-transform-enter-active { + transition: all .5s; +} + +.fade-transform-enter { + opacity: 0; + transform: translateX(-30px); +} + +.fade-transform-leave-to { + opacity: 0; + transform: translateX(30px); +} + +/* breadcrumb transition */ +.breadcrumb-enter-active, +.breadcrumb-leave-active { + transition: all .5s; +} + +.breadcrumb-enter, +.breadcrumb-leave-active { + opacity: 0; + transform: translateX(20px); +} + +.breadcrumb-move { + transition: all .5s; +} + +.breadcrumb-leave-active { + position: absolute; +} diff --git a/frontend/src/styles/variables.scss b/frontend/src/styles/variables.scss new file mode 100644 index 0000000..be55772 --- /dev/null +++ b/frontend/src/styles/variables.scss @@ -0,0 +1,25 @@ +// sidebar +$menuText:#bfcbd9; +$menuActiveText:#409EFF; +$subMenuActiveText:#f4f4f5; //https://github.com/ElemeFE/element/issues/12951 + +$menuBg:#304156; +$menuHover:#263445; + +$subMenuBg:#1f2d3d; +$subMenuHover:#001528; + +$sideBarWidth: 210px; + +// the :export directive is the magic sauce for webpack +// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass +:export { + menuText: $menuText; + menuActiveText: $menuActiveText; + subMenuActiveText: $subMenuActiveText; + menuBg: $menuBg; + menuHover: $menuHover; + subMenuBg: $subMenuBg; + subMenuHover: $subMenuHover; + sideBarWidth: $sideBarWidth; +} diff --git a/frontend/src/utils/auth.js b/frontend/src/utils/auth.js new file mode 100644 index 0000000..059af18 --- /dev/null +++ b/frontend/src/utils/auth.js @@ -0,0 +1,15 @@ +import Cookies from 'js-cookie' + +const TokenKey = 'vue_admin_template_token' + +export function getToken() { + return Cookies.get(TokenKey) +} + +export function setToken(token) { + return Cookies.set(TokenKey, token) +} + +export function removeToken() { + return Cookies.remove(TokenKey) +} diff --git a/frontend/src/utils/get-page-title.js b/frontend/src/utils/get-page-title.js new file mode 100644 index 0000000..a6de99d --- /dev/null +++ b/frontend/src/utils/get-page-title.js @@ -0,0 +1,10 @@ +import defaultSettings from '@/settings' + +const title = defaultSettings.title || 'Vue Admin Template' + +export default function getPageTitle(pageTitle) { + if (pageTitle) { + return `${pageTitle} - ${title}` + } + return `${title}` +} diff --git a/frontend/src/utils/index.js b/frontend/src/utils/index.js new file mode 100644 index 0000000..4830c04 --- /dev/null +++ b/frontend/src/utils/index.js @@ -0,0 +1,117 @@ +/** + * Created by PanJiaChen on 16/11/18. + */ + +/** + * Parse the time to string + * @param {(Object|string|number)} time + * @param {string} cFormat + * @returns {string | null} + */ +export function parseTime(time, cFormat) { + if (arguments.length === 0 || !time) { + return null + } + const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}' + let date + if (typeof time === 'object') { + date = time + } else { + if ((typeof time === 'string')) { + if ((/^[0-9]+$/.test(time))) { + // support "1548221490638" + time = parseInt(time) + } else { + // support safari + // https://stackoverflow.com/questions/4310953/invalid-date-in-safari + time = time.replace(new RegExp(/-/gm), '/') + } + } + + if ((typeof time === 'number') && (time.toString().length === 10)) { + time = time * 1000 + } + date = new Date(time) + } + const formatObj = { + y: date.getFullYear(), + m: date.getMonth() + 1, + d: date.getDate(), + h: date.getHours(), + i: date.getMinutes(), + s: date.getSeconds(), + a: date.getDay() + } + const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => { + const value = formatObj[key] + // Note: getDay() returns 0 on Sunday + if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value ] } + return value.toString().padStart(2, '0') + }) + return time_str +} + +/** + * @param {number} time + * @param {string} option + * @returns {string} + */ +export function formatTime(time, option) { + if (('' + time).length === 10) { + time = parseInt(time) * 1000 + } else { + time = +time + } + const d = new Date(time) + const now = Date.now() + + const diff = (now - d) / 1000 + + if (diff < 30) { + return '刚刚' + } else if (diff < 3600) { + // less 1 hour + return Math.ceil(diff / 60) + '分钟前' + } else if (diff < 3600 * 24) { + return Math.ceil(diff / 3600) + '小时前' + } else if (diff < 3600 * 24 * 2) { + return '1天前' + } + if (option) { + return parseTime(time, option) + } else { + return ( + d.getMonth() + + 1 + + '月' + + d.getDate() + + '日' + + d.getHours() + + '时' + + d.getMinutes() + + '分' + ) + } +} + +/** + * @param {string} url + * @returns {Object} + */ +export function param2Obj(url) { + const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ') + if (!search) { + return {} + } + const obj = {} + const searchArr = search.split('&') + searchArr.forEach(v => { + const index = v.indexOf('=') + if (index !== -1) { + const name = v.substring(0, index) + const val = v.substring(index + 1, v.length) + obj[name] = val + } + }) + return obj +} diff --git a/frontend/src/utils/request.js b/frontend/src/utils/request.js new file mode 100644 index 0000000..bf3ef07 --- /dev/null +++ b/frontend/src/utils/request.js @@ -0,0 +1,86 @@ +import axios from 'axios' +import { MessageBox, Message } from 'element-ui' +import store from '@/store' +import { getToken } from '@/utils/auth' + +// create an axios instance +const service = axios.create({ + baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url + withCredentials: true, // send cookies when cross-domain requests + timeout: 5000 // request timeout +}) + +// request interceptor +service.interceptors.request.use( + config => { + // do something before request is sent + + if (store.getters.token) { + // let each request carry token + // ['X-Token'] is a custom headers key + // please modify it according to the actual situation + config.headers['X-Token'] = getToken() + } + return config + }, + error => { + // do something with request error + console.log(error) // for debug + return Promise.reject(error) + } +) + +// response interceptor +service.interceptors.response.use( + /** + * If you want to get http information such as headers or status + * Please return response => response + */ + + /** + * Determine the request status by custom code + * Here is just an example + * You can also judge the status by HTTP Status Code + */ + response => { + const res = response.data + console.log('res.code: ' + res.code) // for debug + + // if the custom code is not 20000, it is judged as an error. + if (res.code !== 20000) { + Message({ + message: res.message || 'Error', + type: 'error', + duration: 5 * 1000 + }) + + // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired; + if (res.code === 50008 || res.code === 50012 || res.code === 50014) { + // to re-login + MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again', 'Confirm logout', { + confirmButtonText: 'Re-Login', + cancelButtonText: 'Cancel', + type: 'warning' + }).then(() => { + store.dispatch('user/resetToken').then(() => { + location.reload() + }) + }) + } + return Promise.reject(new Error(res.message || 'Error')) + } else { + return res + } + }, + error => { + console.log('err' + error) // for debug + Message({ + message: error.message, + type: 'error', + duration: 5 * 1000 + }) + return Promise.reject(error) + } +) + +export default service diff --git a/frontend/src/utils/scroll-to.js b/frontend/src/utils/scroll-to.js new file mode 100644 index 0000000..c5d8e04 --- /dev/null +++ b/frontend/src/utils/scroll-to.js @@ -0,0 +1,58 @@ +Math.easeInOutQuad = function(t, b, c, d) { + t /= d / 2 + if (t < 1) { + return c / 2 * t * t + b + } + t-- + return -c / 2 * (t * (t - 2) - 1) + b +} + +// requestAnimationFrame for Smart Animating http://goo.gl/sx5sts +var requestAnimFrame = (function() { + return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) { window.setTimeout(callback, 1000 / 60) } +})() + +/** + * Because it's so fucking difficult to detect the scrolling element, just move them all + * @param {number} amount + */ +function move(amount) { + document.documentElement.scrollTop = amount + document.body.parentNode.scrollTop = amount + document.body.scrollTop = amount +} + +function position() { + return document.documentElement.scrollTop || document.body.parentNode.scrollTop || document.body.scrollTop +} + +/** + * @param {number} to + * @param {number} duration + * @param {Function} callback + */ +export function scrollTo(to, duration, callback) { + const start = position() + const change = to - start + const increment = 20 + let currentTime = 0 + duration = (typeof (duration) === 'undefined') ? 500 : duration + var animateScroll = function() { + // increment the time + currentTime += increment + // find the value with the quadratic in-out easing function + var val = Math.easeInOutQuad(currentTime, start, change, duration) + // move the document.body + move(val) + // do the animation unless its over + if (currentTime < duration) { + requestAnimFrame(animateScroll) + } else { + if (callback && typeof (callback) === 'function') { + // the animation is done so lets callback + callback() + } + } + } + animateScroll() +} diff --git a/frontend/src/utils/validate.js b/frontend/src/utils/validate.js new file mode 100644 index 0000000..8d962ad --- /dev/null +++ b/frontend/src/utils/validate.js @@ -0,0 +1,20 @@ +/** + * Created by PanJiaChen on 16/11/18. + */ + +/** + * @param {string} path + * @returns {Boolean} + */ +export function isExternal(path) { + return /^(https?:|mailto:|tel:)/.test(path) +} + +/** + * @param {string} str + * @returns {Boolean} + */ +export function validUsername(str) { + const valid_map = ['admin', 'editor'] + return valid_map.indexOf(str.trim()) >= 0 +} diff --git a/frontend/src/vendor/Export2Excel.js b/frontend/src/vendor/Export2Excel.js new file mode 100644 index 0000000..d8a2af3 --- /dev/null +++ b/frontend/src/vendor/Export2Excel.js @@ -0,0 +1,220 @@ +/* eslint-disable */ +import { saveAs } from 'file-saver' +import XLSX from 'xlsx' + +function generateArray(table) { + var out = []; + var rows = table.querySelectorAll('tr'); + var ranges = []; + for (var R = 0; R < rows.length; ++R) { + var outRow = []; + var row = rows[R]; + var columns = row.querySelectorAll('td'); + for (var C = 0; C < columns.length; ++C) { + var cell = columns[C]; + var colspan = cell.getAttribute('colspan'); + var rowspan = cell.getAttribute('rowspan'); + var cellValue = cell.innerText; + if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue; + + //Skip ranges + ranges.forEach(function (range) { + if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) { + for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null); + } + }); + + //Handle Row Span + if (rowspan || colspan) { + rowspan = rowspan || 1; + colspan = colspan || 1; + ranges.push({ + s: { + r: R, + c: outRow.length + }, + e: { + r: R + rowspan - 1, + c: outRow.length + colspan - 1 + } + }); + }; + + //Handle Value + outRow.push(cellValue !== "" ? cellValue : null); + + //Handle Colspan + if (colspan) + for (var k = 0; k < colspan - 1; ++k) outRow.push(null); + } + out.push(outRow); + } + return [out, ranges]; +}; + +function datenum(v, date1904) { + if (date1904) v += 1462; + var epoch = Date.parse(v); + return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000); +} + +function sheet_from_array_of_arrays(data, opts) { + var ws = {}; + var range = { + s: { + c: 10000000, + r: 10000000 + }, + e: { + c: 0, + r: 0 + } + }; + for (var R = 0; R != data.length; ++R) { + for (var C = 0; C != data[R].length; ++C) { + if (range.s.r > R) range.s.r = R; + if (range.s.c > C) range.s.c = C; + if (range.e.r < R) range.e.r = R; + if (range.e.c < C) range.e.c = C; + var cell = { + v: data[R][C] + }; + if (cell.v == null) continue; + var cell_ref = XLSX.utils.encode_cell({ + c: C, + r: R + }); + + if (typeof cell.v === 'number') cell.t = 'n'; + else if (typeof cell.v === 'boolean') cell.t = 'b'; + else if (cell.v instanceof Date) { + cell.t = 'n'; + cell.z = XLSX.SSF._table[14]; + cell.v = datenum(cell.v); + } else cell.t = 's'; + + ws[cell_ref] = cell; + } + } + if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range); + return ws; +} + +function Workbook() { + if (!(this instanceof Workbook)) return new Workbook(); + this.SheetNames = []; + this.Sheets = {}; +} + +function s2ab(s) { + var buf = new ArrayBuffer(s.length); + var view = new Uint8Array(buf); + for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF; + return buf; +} + +export function export_table_to_excel(id) { + var theTable = document.getElementById(id); + var oo = generateArray(theTable); + var ranges = oo[1]; + + /* original data */ + var data = oo[0]; + var ws_name = "SheetJS"; + + var wb = new Workbook(), + ws = sheet_from_array_of_arrays(data); + + /* add ranges to worksheet */ + // ws['!cols'] = ['apple', 'banan']; + ws['!merges'] = ranges; + + /* add worksheet to workbook */ + wb.SheetNames.push(ws_name); + wb.Sheets[ws_name] = ws; + + var wbout = XLSX.write(wb, { + bookType: 'xlsx', + bookSST: false, + type: 'binary' + }); + + saveAs(new Blob([s2ab(wbout)], { + type: "application/octet-stream" + }), "test.xlsx") +} + +export function export_json_to_excel({ + multiHeader = [], + header, + data, + filename, + merges = [], + autoWidth = true, + bookType = 'xlsx' +} = {}) { + /* original data */ + filename = filename || 'excel-list' + data = [...data] + data.unshift(header); + + for (let i = multiHeader.length - 1; i > -1; i--) { + data.unshift(multiHeader[i]) + } + + var ws_name = "SheetJS"; + var wb = new Workbook(), + ws = sheet_from_array_of_arrays(data); + + if (merges.length > 0) { + if (!ws['!merges']) ws['!merges'] = []; + merges.forEach(item => { + ws['!merges'].push(XLSX.utils.decode_range(item)) + }) + } + + if (autoWidth) { + /*设置worksheet每列的最大宽度*/ + const colWidth = data.map(row => row.map(val => { + /*先判断是否为null/undefined*/ + if (val == null) { + return { + 'wch': 10 + }; + } + /*再判断是否为中文*/ + else if (val.toString().charCodeAt(0) > 255) { + return { + 'wch': val.toString().length * 2 + }; + } else { + return { + 'wch': val.toString().length + }; + } + })) + /*以第一行为初始值*/ + let result = colWidth[0]; + for (let i = 1; i < colWidth.length; i++) { + for (let j = 0; j < colWidth[i].length; j++) { + if (result[j]['wch'] < colWidth[i][j]['wch']) { + result[j]['wch'] = colWidth[i][j]['wch']; + } + } + } + ws['!cols'] = result; + } + + /* add worksheet to workbook */ + wb.SheetNames.push(ws_name); + wb.Sheets[ws_name] = ws; + + var wbout = XLSX.write(wb, { + bookType: bookType, + bookSST: false, + type: 'binary' + }); + saveAs(new Blob([s2ab(wbout)], { + type: "application/octet-stream" + }), `${filename}.${bookType}`); +} diff --git a/frontend/src/views/404.vue b/frontend/src/views/404.vue new file mode 100644 index 0000000..1791f55 --- /dev/null +++ b/frontend/src/views/404.vue @@ -0,0 +1,228 @@ + + + + + diff --git a/frontend/src/views/dashboard/index.vue b/frontend/src/views/dashboard/index.vue new file mode 100644 index 0000000..a41c99c --- /dev/null +++ b/frontend/src/views/dashboard/index.vue @@ -0,0 +1,104 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/views/form/index.vue b/frontend/src/views/form/index.vue new file mode 100644 index 0000000..f4d66d3 --- /dev/null +++ b/frontend/src/views/form/index.vue @@ -0,0 +1,85 @@ + + + + + + diff --git a/frontend/src/views/login/index.vue b/frontend/src/views/login/index.vue new file mode 100644 index 0000000..1db2464 --- /dev/null +++ b/frontend/src/views/login/index.vue @@ -0,0 +1,237 @@ + + + + + + + diff --git a/frontend/src/views/nested/menu1/index.vue b/frontend/src/views/nested/menu1/index.vue new file mode 100644 index 0000000..30cb670 --- /dev/null +++ b/frontend/src/views/nested/menu1/index.vue @@ -0,0 +1,7 @@ + diff --git a/frontend/src/views/nested/menu1/menu1-1/index.vue b/frontend/src/views/nested/menu1/menu1-1/index.vue new file mode 100644 index 0000000..27e173a --- /dev/null +++ b/frontend/src/views/nested/menu1/menu1-1/index.vue @@ -0,0 +1,7 @@ + diff --git a/frontend/src/views/nested/menu1/menu1-2/index.vue b/frontend/src/views/nested/menu1/menu1-2/index.vue new file mode 100644 index 0000000..0c86276 --- /dev/null +++ b/frontend/src/views/nested/menu1/menu1-2/index.vue @@ -0,0 +1,7 @@ + diff --git a/frontend/src/views/nested/menu1/menu1-2/menu1-2-1/index.vue b/frontend/src/views/nested/menu1/menu1-2/menu1-2-1/index.vue new file mode 100644 index 0000000..f87d88f --- /dev/null +++ b/frontend/src/views/nested/menu1/menu1-2/menu1-2-1/index.vue @@ -0,0 +1,5 @@ + diff --git a/frontend/src/views/nested/menu1/menu1-2/menu1-2-2/index.vue b/frontend/src/views/nested/menu1/menu1-2/menu1-2-2/index.vue new file mode 100644 index 0000000..d88789f --- /dev/null +++ b/frontend/src/views/nested/menu1/menu1-2/menu1-2-2/index.vue @@ -0,0 +1,5 @@ + diff --git a/frontend/src/views/nested/menu1/menu1-3/index.vue b/frontend/src/views/nested/menu1/menu1-3/index.vue new file mode 100644 index 0000000..f7cd073 --- /dev/null +++ b/frontend/src/views/nested/menu1/menu1-3/index.vue @@ -0,0 +1,5 @@ + diff --git a/frontend/src/views/nested/menu2/index.vue b/frontend/src/views/nested/menu2/index.vue new file mode 100644 index 0000000..19dd48f --- /dev/null +++ b/frontend/src/views/nested/menu2/index.vue @@ -0,0 +1,5 @@ + diff --git a/frontend/src/views/table/complex-table.vue b/frontend/src/views/table/complex-table.vue new file mode 100644 index 0000000..295c5fc --- /dev/null +++ b/frontend/src/views/table/complex-table.vue @@ -0,0 +1,379 @@ + + + diff --git a/frontend/src/views/table/index.vue b/frontend/src/views/table/index.vue new file mode 100644 index 0000000..ebccaba --- /dev/null +++ b/frontend/src/views/table/index.vue @@ -0,0 +1,199 @@ + + + diff --git a/frontend/src/views/tree/index.vue b/frontend/src/views/tree/index.vue new file mode 100644 index 0000000..89c6b01 --- /dev/null +++ b/frontend/src/views/tree/index.vue @@ -0,0 +1,78 @@ + + + + diff --git a/frontend/tests/unit/.eslintrc.js b/frontend/tests/unit/.eslintrc.js new file mode 100644 index 0000000..958d51b --- /dev/null +++ b/frontend/tests/unit/.eslintrc.js @@ -0,0 +1,5 @@ +module.exports = { + env: { + jest: true + } +} diff --git a/frontend/tests/unit/components/Breadcrumb.spec.js b/frontend/tests/unit/components/Breadcrumb.spec.js new file mode 100644 index 0000000..1d94c8f --- /dev/null +++ b/frontend/tests/unit/components/Breadcrumb.spec.js @@ -0,0 +1,98 @@ +import { mount, createLocalVue } from '@vue/test-utils' +import VueRouter from 'vue-router' +import ElementUI from 'element-ui' +import Breadcrumb from '@/components/Breadcrumb/index.vue' + +const localVue = createLocalVue() +localVue.use(VueRouter) +localVue.use(ElementUI) + +const routes = [ + { + path: '/', + name: 'home', + children: [{ + path: 'dashboard', + name: 'dashboard' + }] + }, + { + path: '/menu', + name: 'menu', + children: [{ + path: 'menu1', + name: 'menu1', + meta: { title: 'menu1' }, + children: [{ + path: 'menu1-1', + name: 'menu1-1', + meta: { title: 'menu1-1' } + }, + { + path: 'menu1-2', + name: 'menu1-2', + redirect: 'noredirect', + meta: { title: 'menu1-2' }, + children: [{ + path: 'menu1-2-1', + name: 'menu1-2-1', + meta: { title: 'menu1-2-1' } + }, + { + path: 'menu1-2-2', + name: 'menu1-2-2' + }] + }] + }] + }] + +const router = new VueRouter({ + routes +}) + +describe('Breadcrumb.vue', () => { + const wrapper = mount(Breadcrumb, { + localVue, + router + }) + it('dashboard', () => { + router.push('/dashboard') + const len = wrapper.findAll('.el-breadcrumb__inner').length + expect(len).toBe(1) + }) + it('normal route', () => { + router.push('/menu/menu1') + const len = wrapper.findAll('.el-breadcrumb__inner').length + expect(len).toBe(2) + }) + it('nested route', () => { + router.push('/menu/menu1/menu1-2/menu1-2-1') + const len = wrapper.findAll('.el-breadcrumb__inner').length + expect(len).toBe(4) + }) + it('no meta.title', () => { + router.push('/menu/menu1/menu1-2/menu1-2-2') + const len = wrapper.findAll('.el-breadcrumb__inner').length + expect(len).toBe(3) + }) + // it('click link', () => { + // router.push('/menu/menu1/menu1-2/menu1-2-2') + // const breadcrumbArray = wrapper.findAll('.el-breadcrumb__inner') + // const second = breadcrumbArray.at(1) + // console.log(breadcrumbArray) + // const href = second.find('a').attributes().href + // expect(href).toBe('#/menu/menu1') + // }) + // it('noRedirect', () => { + // router.push('/menu/menu1/menu1-2/menu1-2-1') + // const breadcrumbArray = wrapper.findAll('.el-breadcrumb__inner') + // const redirectBreadcrumb = breadcrumbArray.at(2) + // expect(redirectBreadcrumb.contains('a')).toBe(false) + // }) + it('last breadcrumb', () => { + router.push('/menu/menu1/menu1-2/menu1-2-1') + const breadcrumbArray = wrapper.findAll('.el-breadcrumb__inner') + const redirectBreadcrumb = breadcrumbArray.at(3) + expect(redirectBreadcrumb.contains('a')).toBe(false) + }) +}) diff --git a/frontend/tests/unit/components/Hamburger.spec.js b/frontend/tests/unit/components/Hamburger.spec.js new file mode 100644 index 0000000..01ea303 --- /dev/null +++ b/frontend/tests/unit/components/Hamburger.spec.js @@ -0,0 +1,18 @@ +import { shallowMount } from '@vue/test-utils' +import Hamburger from '@/components/Hamburger/index.vue' +describe('Hamburger.vue', () => { + it('toggle click', () => { + const wrapper = shallowMount(Hamburger) + const mockFn = jest.fn() + wrapper.vm.$on('toggleClick', mockFn) + wrapper.find('.hamburger').trigger('click') + expect(mockFn).toBeCalled() + }) + it('prop isActive', () => { + const wrapper = shallowMount(Hamburger) + wrapper.setProps({ isActive: true }) + expect(wrapper.contains('.is-active')).toBe(true) + wrapper.setProps({ isActive: false }) + expect(wrapper.contains('.is-active')).toBe(false) + }) +}) diff --git a/frontend/tests/unit/components/SvgIcon.spec.js b/frontend/tests/unit/components/SvgIcon.spec.js new file mode 100644 index 0000000..31467a9 --- /dev/null +++ b/frontend/tests/unit/components/SvgIcon.spec.js @@ -0,0 +1,22 @@ +import { shallowMount } from '@vue/test-utils' +import SvgIcon from '@/components/SvgIcon/index.vue' +describe('SvgIcon.vue', () => { + it('iconClass', () => { + const wrapper = shallowMount(SvgIcon, { + propsData: { + iconClass: 'test' + } + }) + expect(wrapper.find('use').attributes().href).toBe('#icon-test') + }) + it('className', () => { + const wrapper = shallowMount(SvgIcon, { + propsData: { + iconClass: 'test' + } + }) + expect(wrapper.classes().length).toBe(1) + wrapper.setProps({ className: 'test' }) + expect(wrapper.classes().includes('test')).toBe(true) + }) +}) diff --git a/frontend/tests/unit/utils/formatTime.spec.js b/frontend/tests/unit/utils/formatTime.spec.js new file mode 100644 index 0000000..24e165b --- /dev/null +++ b/frontend/tests/unit/utils/formatTime.spec.js @@ -0,0 +1,30 @@ +import { formatTime } from '@/utils/index.js' + +describe('Utils:formatTime', () => { + const d = new Date('2018-07-13 17:54:01') // "2018-07-13 17:54:01" + const retrofit = 5 * 1000 + + it('ten digits timestamp', () => { + expect(formatTime((d / 1000).toFixed(0))).toBe('7月13日17时54分') + }) + it('test now', () => { + expect(formatTime(+new Date() - 1)).toBe('刚刚') + }) + it('less two minute', () => { + expect(formatTime(+new Date() - 60 * 2 * 1000 + retrofit)).toBe('2分钟前') + }) + it('less two hour', () => { + expect(formatTime(+new Date() - 60 * 60 * 2 * 1000 + retrofit)).toBe('2小时前') + }) + it('less one day', () => { + expect(formatTime(+new Date() - 60 * 60 * 24 * 1 * 1000)).toBe('1天前') + }) + it('more than one day', () => { + expect(formatTime(d)).toBe('7月13日17时54分') + }) + it('format', () => { + expect(formatTime(d, '{y}-{m}-{d} {h}:{i}')).toBe('2018-07-13 17:54') + expect(formatTime(d, '{y}-{m}-{d}')).toBe('2018-07-13') + expect(formatTime(d, '{y}/{m}/{d} {h}-{i}')).toBe('2018/07/13 17-54') + }) +}) diff --git a/frontend/tests/unit/utils/param2Obj.spec.js b/frontend/tests/unit/utils/param2Obj.spec.js new file mode 100644 index 0000000..e106ed8 --- /dev/null +++ b/frontend/tests/unit/utils/param2Obj.spec.js @@ -0,0 +1,14 @@ +import { param2Obj } from '@/utils/index.js' +describe('Utils:param2Obj', () => { + const url = 'https://github.com/PanJiaChen/vue-element-admin?name=bill&age=29&sex=1&field=dGVzdA==&key=%E6%B5%8B%E8%AF%95' + + it('param2Obj test', () => { + expect(param2Obj(url)).toEqual({ + name: 'bill', + age: '29', + sex: '1', + field: window.btoa('test'), + key: '测试' + }) + }) +}) diff --git a/frontend/tests/unit/utils/parseTime.spec.js b/frontend/tests/unit/utils/parseTime.spec.js new file mode 100644 index 0000000..56045af --- /dev/null +++ b/frontend/tests/unit/utils/parseTime.spec.js @@ -0,0 +1,35 @@ +import { parseTime } from '@/utils/index.js' + +describe('Utils:parseTime', () => { + const d = new Date('2018-07-13 17:54:01') // "2018-07-13 17:54:01" + it('timestamp', () => { + expect(parseTime(d)).toBe('2018-07-13 17:54:01') + }) + it('timestamp string', () => { + expect(parseTime((d + ''))).toBe('2018-07-13 17:54:01') + }) + it('ten digits timestamp', () => { + expect(parseTime((d / 1000).toFixed(0))).toBe('2018-07-13 17:54:01') + }) + it('new Date', () => { + expect(parseTime(new Date(d))).toBe('2018-07-13 17:54:01') + }) + it('format', () => { + expect(parseTime(d, '{y}-{m}-{d} {h}:{i}')).toBe('2018-07-13 17:54') + expect(parseTime(d, '{y}-{m}-{d}')).toBe('2018-07-13') + expect(parseTime(d, '{y}/{m}/{d} {h}-{i}')).toBe('2018/07/13 17-54') + }) + it('get the day of the week', () => { + expect(parseTime(d, '{a}')).toBe('五') // 星期五 + }) + it('get the day of the week', () => { + expect(parseTime(+d + 1000 * 60 * 60 * 24 * 2, '{a}')).toBe('日') // 星期日 + }) + it('empty argument', () => { + expect(parseTime()).toBeNull() + }) + + it('null', () => { + expect(parseTime(null)).toBeNull() + }) +}) diff --git a/frontend/tests/unit/utils/validate.spec.js b/frontend/tests/unit/utils/validate.spec.js new file mode 100644 index 0000000..f774905 --- /dev/null +++ b/frontend/tests/unit/utils/validate.spec.js @@ -0,0 +1,17 @@ +import { validUsername, isExternal } from '@/utils/validate.js' + +describe('Utils:validate', () => { + it('validUsername', () => { + expect(validUsername('admin')).toBe(true) + expect(validUsername('editor')).toBe(true) + expect(validUsername('xxxx')).toBe(false) + }) + it('isExternal', () => { + expect(isExternal('https://github.com/PanJiaChen/vue-element-admin')).toBe(true) + expect(isExternal('http://github.com/PanJiaChen/vue-element-admin')).toBe(true) + expect(isExternal('github.com/PanJiaChen/vue-element-admin')).toBe(false) + expect(isExternal('/dashboard')).toBe(false) + expect(isExternal('./dashboard')).toBe(false) + expect(isExternal('dashboard')).toBe(false) + }) +}) diff --git a/frontend/vue.config.js b/frontend/vue.config.js new file mode 100644 index 0000000..0fdd7a9 --- /dev/null +++ b/frontend/vue.config.js @@ -0,0 +1,127 @@ +'use strict' +const path = require('path') +const defaultSettings = require('./src/settings.js') + +function resolve(dir) { + return path.join(__dirname, dir) +} + +const name = defaultSettings.title || 'vue Admin Template' // page title + +// If your port is set to 80, +// use administrator privileges to execute the command line. +// For example, Mac: sudo npm run +// You can change the port by the following methods: +// port = 9528 npm run dev OR npm run dev --port = 9528 +const port = process.env.port || process.env.npm_config_port || 9528 // dev port + +// All configuration item explanations can be find in https://cli.vuejs.org/config/ +module.exports = { + /** + * You will need to set publicPath if you plan to deploy your site under a sub path, + * for example GitHub Pages. If you plan to deploy your site to https://foo.github.io/bar/, + * then publicPath should be set to "/bar/". + * In most cases please use '/' !!! + * Detail: https://cli.vuejs.org/config/#publicpath + */ + publicPath: '/', + outputDir: 'dist', + assetsDir: 'static', + lintOnSave: process.env.NODE_ENV === 'development', + productionSourceMap: false, + devServer: { + host: '0.0.0.0', + port: 8080, + proxy: { + '/api/v1': { + target: 'http://backend:9090/api/v1', + changeOrigin: true, + pathRewrite: { + '^/api/v1': '' + } + } + } + }, + configureWebpack: { + // provide the app's title in webpack's name field, so that + // it can be accessed in index.html to inject the correct title. + name: name, + resolve: { + alias: { + '@': resolve('src') + } + } + }, + chainWebpack(config) { + // it can improve the speed of the first screen, it is recommended to turn on preload + config.plugin('preload').tap(() => [ + { + rel: 'preload', + // to ignore runtime.js + // https://github.com/vuejs/vue-cli/blob/dev/packages/@vue/cli-service/lib/config/app.js#L171 + fileBlacklist: [/\.map$/, /hot-update\.js$/, /runtime\..*\.js$/], + include: 'initial' + } + ]) + + // when there are many pages, it will cause too many meaningless requests + config.plugins.delete('prefetch') + + // set svg-sprite-loader + config.module + .rule('svg') + .exclude.add(resolve('src/icons')) + .end() + config.module + .rule('icons') + .test(/\.svg$/) + .include.add(resolve('src/icons')) + .end() + .use('svg-sprite-loader') + .loader('svg-sprite-loader') + .options({ + symbolId: 'icon-[name]' + }) + .end() + + config + .when(process.env.NODE_ENV !== 'development', + config => { + config + .plugin('ScriptExtHtmlWebpackPlugin') + .after('html') + .use('script-ext-html-webpack-plugin', [{ + // `runtime` must same as runtimeChunk name. default is `runtime` + inline: /runtime\..*\.js$/ + }]) + .end() + config + .optimization.splitChunks({ + chunks: 'all', + cacheGroups: { + libs: { + name: 'chunk-libs', + test: /[\\/]node_modules[\\/]/, + priority: 10, + chunks: 'initial' // only package third parties that are initially dependent + }, + elementUI: { + name: 'chunk-elementUI', // split elementUI into a single package + priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app + test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm + }, + commons: { + name: 'chunk-commons', + test: resolve('src/components'), // can customize your rules + minChunks: 3, // minimum common number + priority: 5, + reuseExistingChunk: true + } + } + }) + // https:// webpack.js.org/configuration/optimization/#optimizationruntimechunk + config.optimization.runtimeChunk('single') + } + ) + } +}