[
  {
    "path": ".github/workflows/azure-container-webapp.yml",
    "content": "# 当提交推送到默认分支时，此工作流将构建 Docker 容器并将其推送到 Azure Web 应用程序。\n#\n# 此工作流假设您已创建目标 Azure 应用服务 Web 应用。\n#相关说明，请参阅 https://docs.microsoft.com/en-us/azure/app-service/quickstart-custom-container?tabs=dotnet&pivots=container-linux\n#\n# 配置此工作流程：\n#\n# 1.下载Azure Web应用程序的发布配置文件。您可以从Azure门户中Web应用程序的概述页面下载此文件。\n#相关详细信息：https://docs.microsoft.com/en-us/azure/app-service/deploy-github-actions?tabs=applevel#generate-deployment-credentials\n#\n# 2. 在存储库中创建一个名为 AZURE_WEBAPP_PUBLISH_PROFILE 的密钥，将发布配置文件内容粘贴为密钥的值。\n# 有关获取发布配置文件的说明，请参阅：https://docs.microsoft.com/azure/app-service/deploy-github-actions#configure-the-github-secret\n#\n# 3.创建具有“repo”和“read:packages”权限的GitHub个人访问令牌。\n#\n# 4.在Azure Web应用程序上创建三个应用程序设置：\n# DOCKER_REGISTRY_SERVER_URL：将其设置为“https://ghcr.io”\n# DOCKER_REGISTRY_SERVER_USERNAME：将其设置为拥有存储库的GitHub用户名或组织\n# DOCKER_REGISTRY_SERVER_PASSWORD：将其设置为上一步中PAT令牌的值\n#\n# 5.更改 AZURE_WEBAPP_NAME 的值。\n#\n#相关Azure的GitHub Actions的更多信息：https://github.com/Azure/Actions\n# 有关 Azure Web Apps 部署操作的更多信息：https://github.com/Azure/webapps-deploy\n# 有关开始使用 GitHub Action 工作流部署到 ​​Azure 的更多示例：https://github.com/Azure/actions-workflow-samples\n\n名称：名称：构建容器并将其部署到 Azure Web App\n\n环境：\n: AZURE_WEBAPP_NAME   : your-app-name # 将其设置为您的 Azure Web 应用程序的名称# 将其设置为您的 Azure Web 应用程序的名称\n\n在：\n  推：\n    分支: [    分支：[ “主” ] “master”     ]\n  工作流程_调度：\n\n权限：\n  内容： 内容： 阅读\n\n工作：\n  建造者：\n    running-on     :     运行：ubuntu-latest\n\n    脚步：\n      -使用:           - 使用：actions/checkout@v3\n\n      -姓名  :         - 名称：设置 Docker Buildx\n        使用：         使用： docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0# v3.0.0\n\n      - name :         - 名称：登录GitHubContainer\n使用： docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0# v3.0.0\n        和：\n          开花： 开花：ghcr.io\n          用户名： 用户名：$ {    { github.actor }     }      {       { github.actor }        }\n          密码： 密码：$ {       { github.token }      }     {    { github.token }   }\n\n      -姓名 :       - name：小写的存储库名称和用户名\n        run :         运行： echo \"REPO=${GITHUB_REPOSITORY,,}\" >>$ { GITHUB_ENV }  “REPO=$ { GITHUB_REPOSITORY ,  ,  } ” >>$ { GITHUB_ENV }\n\n      -名称：           -名称：建造容器将其容器容器中\n        使用： 使用： docker/build-push-action@0565240e2d4ab88bba5387d719585280857ece09 # v5.0.0# v5.0.0\n        和：\n          推：真\n          标签:           标签：ghcr.io/$ {  { env.REPO } }  : $ { { github.sha }  }   {    { env.REPO }     }    : $ {     { github.sha }  }                                  \n          文件： 文件：./Dockerfile\n\n  部署：\n    权限：\n      内容： 内容：无\n    连续运行    :     运行：ubuntu-latest\n    需求： 需求： 建设\n    环境：\n      名称：《发展》\n      url :       网址：$ {  { steps.deploy-to-webapp.outputs.webapp-url }   }    {    { steps.deploy-to-webapp.outputs.webapp-url }   }\n\n    脚步：\n      -姓名 :        - name：小写的存储库名称和用户名\n        运行：echo “REPO=$ { GITHUB_REPOSITORY ,  ,  } ” >>$ { GITHUB_ENV }\n\n      -姓名：部署到Azure Web App\n        ID ：部署到webapp\n        用途：azure/webapps-deploy@v2\n        和：\n          应用程序名称：$ {  { env.AZURE_WEBAPP_NAME }  }\n          发布配置文件：$ {  { Secrets.AZURE_WEBAPP_PUBLISH_PROFILE }  }\n          图片：'ghcr.io/${{ env.REPO }}:${{ github.sha }}'\n"
  },
  {
    "path": ".github/workflows/docker-image.yml",
    "content": "姓名：名称：Docker 镜像 CI\n\non:\n  push:\n    branches: [    分支：[“主”]\"master\" ]\n  pull_request:\n    branches: [    分支：[“主”]\"master\" ]\n\njobs:\n\n  build:\n\n    runs-on:     运行：ubuntu-latest\n\n    steps:\n    - uses:     - 使用：actions/checkout@v3\n    - name:     - 名称：构建 Docker 镜像\n      run:       运行： docker build 。--file Dockerfile --tag my-image-name:$(日期 +%s): $(日期 +%s)\n"
  },
  {
    "path": ".gitignore",
    "content": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nparts/\nsdist/\nvar/\nwheels/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\ncover/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\n.pybuilder/\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# IPython\nprofile_default/\nipython_config.py\n\n# pyenv\n#   For a library or package, you might want to ignore these files since the code is\n#   intended to run in multiple environments; otherwise, check them in:\n# .python-version\n\n# pipenv\n#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.\n#   However, in case of collaboration, if having platform-specific dependencies or dependencies\n#   having no cross-platform support, pipenv may install dependencies that don't work, or not\n#   install all needed dependencies.\n#Pipfile.lock\n\n# poetry\n#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.\n#   This is especially recommended for binary packages to ensure reproducibility, and is more\n#   commonly ignored for libraries.\n#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control\n#poetry.lock\n\n# pdm\n#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.\n#pdm.lock\n#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it\n#   in version control.\n#   https://pdm.fming.dev/#use-with-ide\n.pdm.toml\n\n# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm\n__pypackages__/\n\n# Celery stuff\ncelerybeat-schedule\ncelerybeat.pid\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n.dmypy.json\ndmypy.json\n\n# Pyre type checker\n.pyre/\n\n# pytype static type analyzer\n.pytype/\n\n# Cython debug symbols\ncython_debug/\n\n# PyCharm\n#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can\n#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore\n#  and can be added to the global gitignore or merged into this file.  For a more nuclear\n#  option (not recommended) you can uncomment the following to ignore the entire idea folder.\n.idea/\n\ncache/\nlog/\ntest/"
  },
  {
    "path": "LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"{}\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright {yyyy} {name of copyright owner}\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "README.md",
    "content": "[对应IMA知识库](https://ima.qq.com/wiki/?shareId=8b0da768c77bc863f1cad8eb9482e37a6eeb26ad7171523b687d48c1a67c8e2c)：专业量化级股票因子池，每日更新全网全域股票数据，个股信息覆盖超2200个维度栏目，为个股精选提供高维度、高质量的数据核心支撑。 https://ima.qq.com/wiki/?shareId=8b0da768c77bc863f1cad8eb9482e37a6eeb26ad7171523b687d48c1a67c8e2c 。\n\n**InStock股票系统**\n\nInStock股票系统，抓取每日股票、ETF关键数据，计算股票技术指标、筹码分布，识别K线各种形态，综合选股，内置多种选股策略，支持选股验证回测，支持自动交易，支持批量时间，运行高效，支持PC、平板、手机移动设备显示，同时提供Docker镜像方便安装，是量化投资的好帮手。\n\nThe stock system,Capture key data on daily stocks and ETFs, calculate stock technical indicators, chip distribution, Position Cost Distribution(CYQ), identify various K-line forms, comprehensive stock selection, built-in multiple stock selection strategies, support stock selection verification and backtesting, support automatic trading, and support batch time , runs efficiently, supports display on PCs, tablets, and mobile phones, and provides Docker images for easy installation, making it a good helper for quantitative investment.\n\nDocker镜像：https://hub.docker.com/r/mayanghua/instock 。\n\n# 功能介绍\n\n##  一：综合选股\n综合选股支持股票范围、基本面、技术面、消息面、人气指标、行情数据等方面共200多个信息栏目进行自由组合选股。选股条件分为以下大类：\n```\n1.股票范围\n市场、 行业、地区、 概念、 风格、指数成份、 上市时间。\n2.基本面\n估值指标、每股指标、盈利能力、成长能力、资本结构与偿债能力、股本股东。\n3.技术面\nMACD金叉、KDJ金叉、放量突破、低位资金净流入、高位资金净流出、向上突破均线、均线多头排列、均线空头排列、连涨放量、下跌无量、一根大阳线、两根大阳线、旭日东升、强势多方、炮拨云见日、七仙女下凡(七连阴)、八仙过海(八连阳)、九阳神功(九连阳)、四串阳、天量法则、放量上攻、穿头破脚、倒转锤头、射击之星、黄昏之星、曙光初现、身怀六甲、乌云盖顶、早晨之星、窄幅整理。\n4.消息面\n公告大事、机构关注情况、机构持股家数、机构持股比例。\n5.人气指标\n股吧人气排名、人气排名变化、人气排名连涨、人气排名连跌、人气排名创新高、人气排名创新低、新晋粉丝占比、铁杆粉丝占比、7日关注排名、今日浏览排名。\n6.行情数据\n股价表现、成交情况、资金流向、行情统计、沪深股通。\n```\n![](img/a3.jpg)\n![](img/a1.jpg)\n\n##  二：股票每日数据\n\n包括每日股票数据、股票资金流向、股票分红配送、股票龙虎榜、股票大宗交易、股票基本面数据、行业资金流向、概念资金流向、早盘抢筹数据、尾盘抢筹数据、涨停原因揭密、每日ETF数据。\n\n抓取A股票每日数据，主要为一些关键数据，同时封装抓取方法，方便扩展系统获取个人关注的数据。\n\n![](img/00.jpg)\n![](img/12.jpg)\n## 三：股票指标计算\n基于talib、pandas 计算指标，计算高效准确。调整个别指标公式，确保结果和同花顺、通信达结果一致。\n指标：\n\n```\n1、MACD 2、KDJ 3、BOLL 4、TRIX，TRMA 5、CR 6、SMA 7、RSI \n8、VR，MAVR 9、ROC 10、DMI，+DI，-DI，DX，ADX，ADXR 11、W&R \n12、CCI 13、TR、ATR 14、DMA、AMA 15、OBV 16、SAR 17、PSY \n18、BRAR 19、EMV 20、BIAS 21、TEMA  22、MFI 23、VWMA\n24、PPO 25、WT 26、Supertrend  27、DPO  28、VHF  29、RVI\n30、FI 31、ENE 32、STOCHRSI\n```\n\n![](img/01.jpg)\n![](img/06.jpg)\n\n## 四：判断买入卖出的股票\n\n根据指标判定可能买入卖出的股票，具体筛选条件如下：\n\n\n```\nKDJ:\n1、超买区：K值在80以上，D值在70以上，J值大于90时为超买。一般情况下，股价有可能下跌。投资者应谨慎行事，局外人不应再追涨，局内人应适时卖出。\n2、超卖区：K值在20以下，D值在30以下为超卖区。一般情况下，股价有可能上涨，反弹的可能性增大。局内人不应轻易抛出股票，局外人可寻机入场。\nRSI:\n1、当六日指标上升到达80时，表示股市已有超买现象，如果一旦继续上升，超过90以上时，则表示已到严重超买的警戒区，股价已形成头部，极可能在短期内反转回转。\n2、当六日强弱指标下降至20时，表示股市有超卖现象，如果一旦继续下降至10以下时则表示已到严重超卖区域，股价极可能有止跌回升的机会。\nCCI:\n1、当CCI＞﹢100时，表明股价已经进入非常态区间——超买区间，股价的异动现象应多加关注。\n2、当CCI＜﹣100时，表明股价已经进入另一个非常态区间——超卖区间，投资者可以逢低吸纳股票。\nCR:\n1、跌穿a、b、c、d四条线，再由低点向上爬升160时，为短线获利的一个良机，应适当卖出股票。\n2、CR跌至40以下时，是建仓良机。\nWR:\n1、当％R线达到20时，市场处于超买状况，走势可能即将见顶。\n2、当％R线达到80时，市场处于超卖状况，股价走势随时可能见底。\nVR:\n1、获利区域160－450根据情况获利了结。\n2、低价区域40－70可以买进。\n```\n\n![](img/05.jpg)\n\n## 五：K线形态识别\n\n精准识别61种K线形态，支持用户自选形态识别。\n\n识别形态:\n\n```\n1、两只乌鸦2、三只乌鸦3、三内部上涨和下跌4、三线打击5、三外部上涨和下跌6、南方三星7、三个白兵8、弃婴\n9、大敌当前10、捉腰带线11、脱离12、收盘缺影线13、藏婴吞没14、反击线15、乌云压顶16、十字17、十字星\n18、蜻蜓十字/T形十字19、吞噬模式20、十字暮星  21、暮星22、向上/下跳空并列阳线23、墓碑十字/倒T十字\n24、锤头25、上吊线26、母子线27、十字孕线28、风高浪大线29、陷阱30、修正陷阱31、家鸽32、三胞胎乌鸦\n33、颈内线34、倒锤头35、反冲形态36、由较长缺影线决定的反冲形态37、梯底38、长脚十字39、长蜡烛\n40、光头光脚/缺影线 41、相同低价42、铺垫43、十字晨星44、晨星45、颈上线46、刺透形态47、黄包车夫\n48、上升/下降三法49、分离线50、射击之星51、短蜡烛52、纺锤53、停顿形态54、条形三明治55、探水竿\n56、跳空并列阴阳线57、插入58、三星59、奇特三河床60、向上跳空的两只乌鸦61、上升/下降跳空三法 \n```\n形态识别结果：\n```\n负：出现卖出信号\n0：没有出现该形态\n正：出现买入信号\n```\n![](img/09.jpg)\n![](img/13.jpg)\n\n## 六：筹码分布\n\n筹码分布通过计算一定时间范围内股票的:最高价、最低价、成交数，输出对应价格成交数占整个流通盘比值的分布图形。计算高效准确，结果与东方财富等专业软件的一致，缺省计算210个交易日的成本，可以自行设定时间范围。\n![](img/06.jpg)\n\n## 七：策略选股\n\n内置放量上涨、停机坪、回踩年线、突破平台、放量跌停等多种选股策略，同时封装了策略模板，方便扩展实现自己的策略。\n\n\n```\n1、放量上涨\n    1）当日比前一天上涨小于2%或收盘价小于开盘价。\n    2）当日成交额不低于2亿。\n    3）当日成交量/5日平均成交量>=2。\n2、均线多头\n    MA30向上\n    1）30日前的30日均线<20日前的30日均线<10日前的30日均线<当日的30日均线。\n    2）(当日的30日均线/30日前的30日均线)>1.2。\n3、停机坪\n    1）最近15日有涨幅大于9.5%，且必须是放量上涨。\n    2）紧接的下个交易日必须高开，收盘价必须上涨，且与开盘价不能大于等于相差3%。\n    3）接下2、3个交易日必须高开，收盘价必须上涨，且与开盘价不能大于等于相差3%，且每天涨跌幅在5%间。\n4、回踩年线\n    1）分2个时间段：前段=最近60交易日最高收盘价之前交易日(长度>0)，后段=最高价当日及后面的交易日。\n    2）前段由年线(250日)以下向上突破。\n    3）后段必须在年线以上运行，且后段最低价日与最高价日相差必须在10-50日间。\n    4）回踩伴随缩量：最高价日交易量/后段最低价日交易量>2,后段最低价/最高价<0.8。\n5、突破平台\n    1）60日内某日收盘价>=60日均线>开盘价。\n    2）且【1】放量上涨。\n    3）且【1】间之前时间，任意一天收盘价与60日均线偏离在-5%~20%之间。\n6、无大幅回撤\n    1）当日收盘价比60日前的收盘价的涨幅小于0.6。\n    2）最近60日，不能有单日跌幅超7%、高开低走7%、两日累计跌幅10%、两日高开低走累计10%。\n7、海龟交易法则\n    最后一个交易日收市价为指定区间内最高价。\n    1）当日收盘价>=最近60日最高收盘价。\n8、高而窄的旗形\n    1）必须至少上市交易60日。\n    2）当日收盘价/之前24~10日的最低价>=1.9。\n    3）之前24~10日必须连续两天涨幅大于等于9.5%。\n9、放量跌停。\n    1）跌>9.5%。\n    2）成交额不低于2亿。\n    3）成交量至少是5日平均成交量的4倍。\n10、低ATR成长\n    1）必须至少上市交易250日。\n    2）最近10个交易日的最高收盘价必须比最近10个交易日的最低收盘价高1.1倍。\n11、股票基本面选股\n    1）市盈率小于等于20，且大于0。\n    2）市净率小于等于10。\n    3）净资产收益率大于等于15。\n```\n\n![](img/04.jpg)\n\n## 八：选股验证\n\n\n对指标、策略等选出的股票进行回测，验证策略的成功率，是否可用。\n\n\n![](img/05.jpg)\n\n## 九：自动交易\n\n支持自动交易，内置自动打新股的策略及示例策略，由于**涉及金钱**，规避可能存在风险，没有提供其他交易策略。\n\n具有交易日志，以及支持为每个交易策略配置交易日志。\n\n**特别提醒**：交易日10:00点会触发打新，不想打新的删除stagging.py或不要启动“交易服务”。\n\n![](img/11.jpg)\n\n## 十：关注功能\n\n支持股票关注，关注股票在各个模块(含有的)置顶、标红显示。\n\n## 十一：支持批量\n\n\n可以通过时间段、枚举时间、当前时间进行指标计算、策略选股及回测等。同时支持智能识别交易日，可以输入任意日期。\n\n具体执行设置如下：\n```\n------整体作业，支持批量作业------\n当前时间作业 python execute_daily_job.py\n单个时间作业 python execute_daily_job.py 2022-03-01\n枚举时间作业 python execute_daily_job.py 2022-01-01,2021-02-08,2022-03-12\n区间时间作业 python execute_daily_job.py 2022-01-01 2022-03-01\n\n------单功能作业，支持批量作业，回测数据自动填补到当前\n基础数据实时作业 python basic_data_daily_job.py\n基础数据非实时作业 python basic_data_other_daily_job.py\n指标数据作业 python indicators_data_daily_job.py\nK线形态作业 klinepattern_data_daily_job.py\n策略数据作业 python strategy_data_daily_job.py\n回测数据 python backtest_data_daily_job.py\n```\n## 十二：支持代理及Cookie\n\n支持多代理获取数据。由于很多网站对大量请求有防护机制，使用单一IP地址频繁访问可能导致被封禁或限制访问。代理IP能够帮助分散请求来源，避免单一IP被封锁，从而保证爬虫程序的稳定运行。\n支持注入Cookie，解决数据获取频率过高，限制数据获取。\n## 十三：存储采用数据库设计\n\n数据存储采用数据库设计，能保存历史数据，以及对数据进行扩展分析、统计、挖掘。系统实现自动创建数据库、数据表，封装了批量更新、插入数据，方便业务扩展。\n\n![](img/07.jpg)\n\n## 十四：展示采用web设计\n\n采用web设计，可视化展示结果。对展示进行封装，添加新的业务表单，只需要配置视图字典就可自动出现业务可视化界面，方便业务功能扩展。\n\n## 十五：运行高效\n\n\n采用多线程、单例共享资源有效提高运算效率。1天数据的抓取、计算指标、形态识别、策略选股、回测等全部任务运行时间大概4分钟（普通笔记本），计算天数越多效率越高。\n\n\n## 十六：方便调试\n\n系统运行的重要日志记录在stock_execute_job.log(数据抓取、处理、分析)、stock_web.log(web服务)、stock_trade.log(交易服务)，方便调试发现问题。\n\n![](img/08.jpg)\n\n\n# 安装说明\n\n本系统支持Windows、Linux、MacOS，同时本系统创建了Docker镜像，按自己需要选择安装方式。\n\n下面按分常规安装方式、docker镜像安装方式进行一一说明。\n\n## 一：常规安装方式\n\n建议windows下安装，方便操作及使用系统，同时安装也非常简单。\n\n以下安装及运行以windows为例进行介绍。\n\n### 1.安装python\n\n项目开发使用python 3.11，建议最新版。\n\n```\n（1）在官网 https://www.python.org/downloads/ 下载安装包，一键安装即可，安装切记勾选自动设置环境变量。\n（2）配置永久全局国内镜像库（因为有墙，无法正常安装库文件），执行如下dos命令：\npython pip config --global set  global.index-url https://mirrors.aliyun.com/pypi/simple/\n# 如果你只想为当前用户设置，你也可以去掉下面的\"--global\"选项\n```\n### 2.安装mysql\n\n建议最新版。\n\n```\n在官网 https://dev.mysql.com/downloads/mysql/ 下载安装包，一键安装即可。\n```\n### 3.安装 TA-Lib 共享静态库和头文件\n\n安装 TA-Lib C/C++ 共享静态库和头文件\n\n```\nhttps://ta-lib.org/install/ 下载最新 ta-lib 共享静态库和头文件，按照说明进行安装。\n安装方式按官方建议，会更简单：\nWindows Executable Installer\nmacOS Homebrew\nLinux Debian packages\n```\n\n### 4.安装依赖库\n\n依赖库都是目前最新版本。\n\na.安装依赖库：\n\n```\n#dos切换到本系统的根目录，执行下面命令：\npython -m pip install -r requirements.txt\n```\nb.若想升级项目依赖库至最新版，可以通过下面方法：\n\n先打开requirements.txt，然后修改文件中的“==”为“>=”，接着执行下面命令：\n\n```\npython -m pip install -r requirements.txt --upgrade\n```\n\nc.若扩展了本项目，可以通过下面方法生成项目依赖：\n\n```\n#使用pipreqs生成项目相关依赖的requirements.txt\n\npython -m pip install pipreqs\n# 安装pipreqs，若有安装可跳过\n\npython -m pipreqs --encoding utf-8 --force ./ \n# 本项目是utf-8编码\n```\n\n\n### 5.安装 Navicat（可选）\n\nNavicat可以方便管理数据库，以及可以手工对数据进行查看、处理、分析、挖掘。\n\nNavicat是一套可创建多个连接的数据库管理工具，用以方便管理 MySQL、Oracle、PostgreSQL、SQLite、SQL Server、MariaDB 和 MongoDB 等不同类型的数据库\n\n```\n（1）在官网 https://www.navicat.com.cn/download/navicat-premium 下载安装包，一键安装即可。\n\n（2）然后下载破解补丁: https://pan.baidu.com/s/18XpTHrm9OiLEl3u6z_uxnw 提取码: 8888 ，破解即可。\n```\n### 6.配置数据库\n\n一般可能会修改的信息是”数据库访问密码“。\n\n修改database.py相关信息:\n\n```\ndb_host = \"localhost\"  # 数据库服务主机\ndb_user = \"root\"  # 数据库访问用户\ndb_password = \"root\"  # 数据库访问密码\ndb_port = 3306  # 数据库服务端口\ndb_charset = \"utf8mb4\"  # 数据库字符集\n```\n\n### 7.配置代理\n不使用代理，跳过本步。\n\n具体设置如下：\n编辑proxy.txt，添加有效代理，格式为：ip:port，带认证代理username:password@ip:port，每个代理占一行。当不使用代理时清空该文件。\n编辑保存完代理文件，若本系统已经启动，需要重启本系统，才能生效。\n示例代理：\n```\n127.0.0.1:7860\n52.13.248.29:3128\n35.178.104.4:80\nabc:123456@65.1.244.232:3128\n13.126.79.133:80\n54.212.22.168:3128\n```\n注意：以上均为无效代理。\n\n### 8.设置东方财富网Cookie\n东方财富数据获取频率过高，会限制获取数据，可以通过注入cookie解决。\n以下是详细的操作步骤：\n```\n1、获取Cookie\n    打开浏览器，访问东方财富网行情页面：https://quote.eastmoney.com/center/gridlist.html#hs_a_board\n    登录账号（如果有东方财富网账号，建议登录以获取更稳定的Cookie）\n    打开开发者工具：\n    切换到Network（网络）选项卡\n    刷新页面（按 F5 或点击浏览器刷新按钮）\n    选择任意请求：在网络请求列表中，选择任意一个请求（建议选择URL包含 push2.eastmoney.com 的请求）\n    查看Cookie：在请求详情中，找到 Request Headers（请求头）部分，复制完整的 Cookie 值\n    保存Cookie：将复制的Cookie值保存下来，稍后使用\n2、设置Cookie的两种方式\n    方式一：通过环境变量设置（推荐）\n    Windows系统：\n    cmd命令： setx EAST_MONEY_COOKIE \"你的Cookie值\"\n    重启Python环境：设置环境变量后，需要重启Python IDE或命令提示符窗口\n    Linux/macOS系统：\n    bash命令：export EAST_MONEY_COOKIE=\"你的Cookie值\"\n    注意：这种方式只在当前终端会话有效，若要永久设置，需要编辑 ~/.bashrc 或 ~/.zshrc 文件\n    方式二：通过文件设置\n    编辑eastmoney_cookie.txt文件，替换Cookie。\n3、注意事项\n    Cookie有效期：东方财富网的Cookie通常会在一段时间后过期（一般为几天到几周），如突然无法正常工作，可能是Cookie过期了，需要重新获取并设置\n    定期更新：建议每隔一段时间（如每周）更新一次Cookie，以确保爬取的稳定性\n    多账号轮换：如果有多个东方财富网账号，可以轮换使用不同账号的Cookie，进一步降低被限制的风险\n```\n### 9.安装自动交易（可选）\n\n```\n1.安装交易软件\n    1.1 通用同花顺客户端券商的客户\n        通用同花顺客户端:\n        https://activity.ths123.com/acmake/cache/1361.html\n    1.2 专用同花顺客户端券商的客户\n        自行去券商官网找同花顺专用版\n        例如：广发的下载核新独立委托端(同花顺版):\n        http://www.gf.com.cn/softdownload/index?tab=1\n2.安装tesseract(自动识别验证码)\n    第一种方法.下载编译好的\n        在下面链接页，根据操作系统选择相应版本\n        https://digi.bib.uni-mannheim.de/tesseract/\n    第二种方法.用源码编译\n        下载源码：https://github.com/tesseract-ocr/tesseract\n    注意：\n        安装完要将安装路径设置到PATH环境变量里。\n        下面提供dos命令设置，以管理员身份运行cmd，输入:\n        setx /m PATH \"%PATH%;C:\\Program Files\\Tesseract-OCR\"\n3.设置交易配置   \n    3.1.修改trade_client.json\n        \"user\": \"888888888888\",               #交易账号\n        \"password\": \"888888\",                 #交易密码\n        \"exe_path\": \"C:/gfzqrzrq/xiadan.exe\"  #交易软件路径\n    3.2.修改trade_service.py\n        broker = 'gf_client' #这是广发\n        详情参阅usage.md，配置对应券商\n```\n\n### 10.运行说明\n\n#### 10.1.执行数据抓取、处理、分析、识别\n\n支持批量作业，具体参见run_job.bat中的注释说明。\n\n建议将其加入到任务计划中，工作日的每天17：00执行。\n\n**数据抓取、处理原则：**\n\n1).开盘即有且无历史数据的：综合选股、每日股票数据、股票资金流向、股票分红配送、龙虎榜、每日ETF数据；\n\n2).收盘即有且有历史数据的：股票指标数据、股票K线形态、股票策略数据；\n\n3).收盘后1~2小时才有且有历史数据的：大宗交易。\n\n运行run_job.bat，会依据上面原则获取各模块当前或前个交易日的数据。\n\n```\n\n运行 run_job.bat\n```\n若想看开盘后的当前实时数据，可以运行下面，很快大概1秒：\n\n```\n#基础数据作业 \npython basic_data_daily_job.py\n```\n#### 10.2.启动web服务\n\n```\n运行 run_web.bat\n```\n启动服务后，打开浏览器，输入：http://localhost:9988/ ，即可使用本系统的可视化功能。\n\n#### 10.3.启动交易服务\n\n```\n运行 run_trade.bat\n```\n\n## 二：docker镜像安装方式\n\n没有docker环境，可以参考：[VirtualBox虚拟机安装Ubuntu](https://www.ljjyy.com/archives/2019/10/100590.html)，里面也介绍了python、docker等常用软件的安装，若想在Windows下安装docker自行百度。\n\n### 1.配置代理\n不使用代理，跳过本步。\n\n系统安装完成后，可以通过编辑宿主机的代理文件，来配置代理。\n\n具体设置如下：\n编辑宿主的代理文件，添加有效代理，格式为：ip:port，带认证代理username:password@ip:port，每个代理占一行。当不使用代理时清空该文件。\n编辑完代理文件，若本系统已经启动，需要重启本系统，才能生效。\n示例创建代理：\n```\nsudo sh -c 'echo \"127.0.0.1:7860\" > /data/instockproxy.txt'\n#创建代理文件，会自动替换掉原代理文件\n\nsudo sh -c 'echo \"52.13.248.29:3128\" >> /data/instockproxy.txt'\n#追加代理\n\nsudo sh -c 'echo \"abc:123456@35.178.104.4:80\" >> /data/instockproxy.txt'\n#追加代理\n```\n注意：以上均为无效代理。\n\n### 2.配置东方财富网Cookie\n不使用Cookie，跳过本步。\n\n系统安装完成后，可以通过编辑宿主机的代理文件，来配置Cookie。\n详细请参阅：常规安装方式，设置东方财富网Cookie。\n\n```\nsudo sh -c 'echo \"你的Cookie值\" > /data/eastmoneycookie.txt'\n#创建代理文件，会自动替换掉原代理文件\n\n```\n\n### 3.安装数据库镜像\n\n如果已经有Mysql、mariadb数据库可以跳过本步。\n\n运行下面命令：\n\n**特别提醒：执行命令的用户要有root权限，其他命令也如此。例如：ubuntu系统在命令前加上sudo** ，sudo docker......\n\n```\ndocker network create InStockService\n\ndocker run -d --name InStockDbService \\\n    --network InStockService \\\n    -v /data/mariadb/data:/var/lib/instockdb \\\n    -e MYSQL_ROOT_PASSWORD=root \\\n    library/mariadb:latest\n```\n\n### 4.安装本系统镜像\n\na.若按上面【1.安装数据库镜像】装的数据库，运行下面命令：\n\n```\ndocker run -dit --name InStock --network=InStockService \\\n    -p 9988:9988 \\\n    -v /data/instockproxy.txt:/data/InStock/instock/config/proxy.txt \\\n    -v /data/eastmoneycookie.txt:/data/InStock/instock/config/eastmoney_cookie.txt \\\n    -e db_host=InStockDbService \\\n    mayanghua/instock:latest\n```\n\nb.已经有Mysql、mariadb数据库，运行下面命令：\n\n```\ndocker run -dit --name InStock \\\n    -p 9988:9988 \\\n    -v /data/instockproxy.txt:/data/InStock/instock/config/proxy.txt \\\n    -v /data/eastmoneycookie.txt:/data/InStock/instock/config/eastmoney_cookie.txt \\\n    -e db_host=localhost \\\n    -e db_user=root \\\n    -e db_password=root \\\n    -e db_database=instockdb \\\n    -e db_port=3306 \\\n    mayanghua/instock:latest\n```\n\ndocker -e 参数说明：\n```\ndb_host       # 数据库服务主机\ndb_user       # 数据库访问用户\ndb_password   # 数据库访问密码\ndb_database   # 数据库名称\ndb_port       # 数据库服务端口\n```\n按自己数据库实际情况配置参数。\n\n### 5. 系统运行\n\n启动容器后，会自动运行，首先会初始化数据、启动web服务。然后每小时执行“基础数据抓取”，每天17:30执行所有的数据抓取、处理、分析、识别、回测。\n\n打开浏览器，输入：http://localhost:9988/ ，即可使用本系统的可视化功能。\n\n### 6.历史数据\n\n历史数据抓取、处理、分析、识别、回测，运行下面命令：\n\n```\ndocker exec -it InStock bash \ncat InStock/instock/bin/run_job.sh\n#查看run_job.sh注释,自己选择作业\n------整体作业，支持批量作业------\n当前时间作业 python execute_daily_job.py\n单个时间作业 python execute_daily_job.py 2022-03-01\n枚举时间作业 python execute_daily_job.py 2022-01-01,2021-02-08,2022-03-12\n区间时间作业 python execute_daily_job.py 2022-01-01 2022-03-01\n------单功能作业，支持批量作业，回测数据自动填补到当前\n综合选股作业 python selection_data_daily_job.py\n基础数据实时作业 python basic_data_daily_job.py\n基础数据收盘2小时后作业 python backtest_data_daily_job.py\n基础数据非实时作业 python basic_data_other_daily_job.py\n指标数据作业 python indicators_data_daily_job.py\nK线形态作业 klinepattern_data_daily_job.py\n策略数据作业 python strategy_data_daily_job.py\n回测数据 python backtest_data_daily_job.py\n第一种方法：\npython execute_daily_job.py 2023-03-01,2023-03-02\n第二种方法：\n修改run_job.sh，然后运行 bash InStock/instock/bin/run_job.sh\n```\n\n### 7.查看日志\n\n运行下面命令：\n\n```\ndocker exec -it InStock bash \ncat InStock/instock/log/stock_execute_job.log\ncat InStock/instock/log/stock_web.log\n```\n\n### 8.docker常用命令\n\n```\ndocker container stop InStock InStockDbService\n#停止容器\ndocker container prune\n#回收容器\ndocker rmi mayanghua/instock:latest library/mariadb:latest\n#删除镜像\n```\n\n具体参见：[Docker基础之 二.镜像及容器的基本操作](https://www.ljjyy.com/archives/2018/06/100208.html)\n\n### 9.自动交易\n\n目前只支持windows。参考常规安装方式,只需安装python、依赖库，**不需安装mysql、talib等**。\n\n# 特别声明\n\n股市有风险投资需谨慎，本系统只能用于学习、股票分析，投资盈亏概不负责。\n\n本系统中的表格为第三方商业控件，仅使用了评估版进行学习及测试。\n"
  },
  {
    "path": "cron/cron.hourly/run_hourly",
    "content": "#!/bin/sh\n\n/usr/local/bin/python3 /data/InStock/instock/job/basic_data_daily_job.py\n#mkdir -p /data/logs\n#DATE=`date +%Y-%m-%d:%H:%M:%S`\n#echo $DATE >> /data/logs/hourly.log"
  },
  {
    "path": "cron/cron.monthly/run_monthly",
    "content": "#!/bin/sh\n\n#清除缓存数据\nrm -rf /data/InStock/instock/cache/hist/*\n#MONTH=`date -d '' +%Y%m`\n#cd /data/InStock/instock/cache/hist && rm -rf !(${MONTH})\n#DATE=`date -d '' +%Y-%m-%d`\n#DATE_1=`date -d '-1 days' +%Y-%m-%d`\n#DATE_2=`date -d '-2 days' +%Y-%m-%d`\n#cd /data/InStock/instock/cache/hist/${MONTH} && rm -rf !(${DATE}|${DATE_1}|${DATE_2})\n\n#mkdir -p /data/logs\n#DATE=`date +%Y-%m-%d:%H:%M:%S`\n#echo $DATE >> /data/logs/monthly.log\n"
  },
  {
    "path": "cron/cron.workdayly/run_workdayly",
    "content": "#!/bin/sh\n\n/usr/local/bin/python3 /data/InStock/instock/job/execute_daily_job.py\n\n#mkdir -p /data/logs\n#DATE=`date +%Y-%m-%d:%H:%M:%S`\n#echo $DATE >> /data/logs/workdayly.log"
  },
  {
    "path": "docker/.dockerignore",
    "content": ".git\n.idea\n*.bat\n*.md\nrequirements.txt"
  },
  {
    "path": "docker/.gitignore",
    "content": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nparts/\nsdist/\nvar/\nwheels/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\ncover/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\n.pybuilder/\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# IPython\nprofile_default/\nipython_config.py\n\n# pyenv\n#   For a library or package, you might want to ignore these files since the code is\n#   intended to run in multiple environments; otherwise, check them in:\n# .python-version\n\n# pipenv\n#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.\n#   However, in case of collaboration, if having platform-specific dependencies or dependencies\n#   having no cross-platform support, pipenv may install dependencies that don't work, or not\n#   install all needed dependencies.\n#Pipfile.lock\n\n# poetry\n#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.\n#   This is especially recommended for binary packages to ensure reproducibility, and is more\n#   commonly ignored for libraries.\n#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control\n#poetry.lock\n\n# pdm\n#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.\n#pdm.lock\n#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it\n#   in version control.\n#   https://pdm.fming.dev/#use-with-ide\n.pdm.toml\n\n# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm\n__pypackages__/\n\n# Celery stuff\ncelerybeat-schedule\ncelerybeat.pid\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n.dmypy.json\ndmypy.json\n\n# Pyre type checker\n.pyre/\n\n# pytype static type analyzer\n.pytype/\n\n# Cython debug symbols\ncython_debug/\n\n# PyCharm\n#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can\n#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore\n#  and can be added to the global gitignore or merged into this file.  For a more nuclear\n#  option (not recommended) you can uncomment the following to ignore the entire idea folder.\n.idea/\n\ndocker.*\n/cookie.txt\n"
  },
  {
    "path": "docker/Dockerfile",
    "content": "# 基础镜像\n# https://hub.docker.com/_/python/tags?page=1&name=3.11-slim-bullseye\nFROM docker.io/python:3.11-slim-bullseye\n\nMAINTAINER myh\n#增加语言utf-8\nENV LANG=zh_CN.UTF-8\nENV LC_CTYPE=zh_CN.UTF-8\nENV LC_ALL=C\nENV PYTHONPATH=/data/InStock\nEXPOSE 9988\n\n# 使用国内镜像地址加速。修改debian apt更新地址，pip地址，设置时区\n# https://opsx.alibaba.com/mirror\n# https://mirrors.tuna.tsinghua.edu.cn/help/pypi/\n# cat /etc/apt/sources.list 参考原始地址，再确定怎么样替换\n# 安装依赖库\n# apt-get autoremove -y 删除没有用的依赖lib\n# apt-get --purge remove 软件包名称 , 删除已安装包（不保留配置文件)\nRUN sed -i \"s@http://\\(deb\\|security\\).debian.org@https://mirrors.aliyun.com@g\" /etc/apt/sources.list && \\\n    echo  \"[global]\\n\\\nindex-url = https://mirrors.aliyun.com/pypi/simple\\n\\\ntrusted-host = mirrors.aliyun.com\" > /etc/pip.conf && \\\n    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \\\n    echo \"Asia/Shanghai\" > /etc/timezone && \\\n    apt-get update && \\\n    apt-get install -y cron gcc make python3-dev default-libmysqlclient-dev build-essential pkg-config curl && \\\n    pip install supervisor && \\\n    pip install mysqlclient && \\\n    pip install requests && \\\n    pip install arrow && \\\n    pip install numpy && \\\n    pip install SQLAlchemy && \\\n    pip install PyMySQL && \\\n    pip install Logbook && \\\n    pip install python_dateutil && \\\n    pip install py_mini_racer && \\\n    pip install tqdm && \\\n    pip install beautifulsoup4 && \\\n    pip install bokeh && \\\n    pip install pandas && \\\n    pip install urllib3 && \\\n    pip install tornado && \\\n    pip install mini-racer && \\\n    pip install easytrader && \\\n    mkdir ta-lib && \\\n    curl -SL $(curl -s https://api.github.com/repos/ta-lib/ta-lib/releases/latest | grep browser_download_url | cut -d'\"' -f4 |grep -E 'tar.gz$') | tar -xz --strip-components=1 -C ./ta-lib && \\\n    cd ta-lib/ && \\\n    ./configure && \\\n    make && \\\n    make install && \\\n    cd .. && \\\n    pip install TA-Lib && \\\n    rm -rf ta-lib* && \\\n    apt-get --purge remove -y gcc make python3-dev default-libmysqlclient-dev curl && \\\n    rm -rf /root/.cache/* && rm -rf /var/lib/apt/lists/* && apt-get clean && apt-get autoclean && apt-get autoremove -y\n\nWORKDIR /data\n#InStock软件\nCOPY stock /data/InStock\nCOPY cron/cron.hourly /etc/cron.hourly\nCOPY cron/cron.workdayly /etc/cron.workdayly\nCOPY cron/cron.monthly /etc/cron.monthly\n\n#add cron sesrvice.\n#任务调度\nRUN chmod 755 /data/InStock/instock/bin/run_*.sh && \\\n    chmod 755 /etc/cron.hourly/* && chmod 755 /etc/cron.workdayly/* && chmod 755 /etc/cron.monthly/* && \\\n    echo \"SHELL=/bin/sh \\n\\\nPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin \\n\\\n# min hour day month weekday command \\n\\\n*/30 9,10,11,13,14,15 * * 1-5 /bin/run-parts /etc/cron.hourly \\n\\\n30 17 * * 1-5 /bin/run-parts /etc/cron.workdayly \\n\\\n30 10 * * 3,6 /bin/run-parts /etc/cron.monthly \\n\" > /var/spool/cron/crontabs/root && \\\n    chmod 600 /var/spool/cron/crontabs/root\n\nENTRYPOINT [\"supervisord\",\"-n\",\"-c\",\"/data/InStock/supervisor/supervisord.conf\"]"
  },
  {
    "path": "docker/build.sh",
    "content": "#!/bin/sh\n\nrm -rf stock\nrsync -av --progress ../../stock . --exclude .git --exclude .idea --exclude *.md --exclude *.bat --exclude __pycache__ --exclude .gitignore --exclude stock/cron --exclude stock/img --exclude stock/docker --exclude instock/cache --exclude instock/log --exclude instock/test\nrm -rf cron\ncp -r ../../stock/cron .\n\nDOCKER_NAME=mayanghua/instock\nTAG1=$(date \"+%Y%m\")\nTAG2=latest\n\necho \" docker build -f Dockerfile -t ${DOCKER_NAME} .\"\ndocker build -f Dockerfile -t ${DOCKER_NAME}:${TAG1} -t ${DOCKER_NAME}:${TAG2} .\necho \"#################################################################\"\necho \" docker push ${DOCKER_NAME} \"\n\ndocker push ${DOCKER_NAME}:${TAG1}\ndocker push ${DOCKER_NAME}:${TAG2}"
  },
  {
    "path": "docker/docker-compose.yml",
    "content": "version: '4.0.0'\n\nservices:\n  instockdbservice:\n    image: library/mariadb:latest\n    container_name: InStockDbService\n    environment:\n      MYSQL_ROOT_PASSWORD: root\n    volumes:\n      - /data/mariadb/data:/var/lib/instockdb\n    networks:\n      - instock_network\n\n  instock:\n    image: mayanghua/instock:latest\n    container_name: InStock\n    ports:\n      - \"9988:9988\"\n    environment:\n      db_host: InStockDbService\n    volumes:\n      - /data/instockproxy.txt:/data/InStock/instock/config/proxy.txt\n    depends_on:\n      - instockdbservice\n    networks:\n      - instock_network\n\nnetworks:\n  instock_network:\n    driver: bridge\n\n"
  },
  {
    "path": "instock/.gitignore",
    "content": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nparts/\nsdist/\nvar/\nwheels/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\ncover/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\n.pybuilder/\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# IPython\nprofile_default/\nipython_config.py\n\n# pyenv\n#   For a library or package, you might want to ignore these files since the code is\n#   intended to run in multiple environments; otherwise, check them in:\n# .python-version\n\n# pipenv\n#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.\n#   However, in case of collaboration, if having platform-specific dependencies or dependencies\n#   having no cross-platform support, pipenv may install dependencies that don't work, or not\n#   install all needed dependencies.\n#Pipfile.lock\n\n# poetry\n#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.\n#   This is especially recommended for binary packages to ensure reproducibility, and is more\n#   commonly ignored for libraries.\n#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control\n#poetry.lock\n\n# pdm\n#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.\n#pdm.lock\n#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it\n#   in version control.\n#   https://pdm.fming.dev/#use-with-ide\n.pdm.toml\n\n# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm\n__pypackages__/\n\n# Celery stuff\ncelerybeat-schedule\ncelerybeat.pid\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n.dmypy.json\ndmypy.json\n\n# Pyre type checker\n.pyre/\n\n# pytype static type analyzer\n.pytype/\n\n# Cython debug symbols\ncython_debug/\n\n# PyCharm\n#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can\n#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore\n#  and can be added to the global gitignore or merged into this file.  For a more nuclear\n#  option (not recommended) you can uncomment the following to ignore the entire idea folder.\n.idea/\n\ncache/\ndata/\nlog/\nproxy/"
  },
  {
    "path": "instock/__init__.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\n__author__ = 'myh '\n__date__ = '2023/4/3 '\n"
  },
  {
    "path": "instock/bin/restart_web.sh",
    "content": "#!/bin/sh\n\nps -ef | grep python3 | grep '/data/InStock/instock/web/web_service.py' | awk '{print$2}' | xargs kill -9\n"
  },
  {
    "path": "instock/bin/run_cron.sh",
    "content": "#!/bin/sh\n\nexport PYTHONIOENCODING=utf-8\nexport LANG=zh_CN.UTF-8\nexport PYTHONPATH=/data/InStock\nexport LC_CTYPE=zh_CN.UTF-8\n\n# 环境变量输出\n# https://stackoverflow.com/questions/27771781/how-can-i-access-docker-set-environment-variables-from-a-cron-job\nprintenv | grep -v \"no_proxy\" >> /etc/environment\n\n#启动cron服务。在前台\n/usr/sbin/cron -f"
  },
  {
    "path": "instock/bin/run_job.bat",
    "content": "chcp 65001\n@echo off\ncd %~dp0\ncd ..\ncd job\necho ------整体作业，支持批量作业------\necho 当前时间作业 python execute_daily_job.py\necho 1个时间作业 python execute_daily_job.py 2023-03-01\necho N个时间作业 python execute_daily_job.py 2023-03-01,2023-03-02\necho 区间作业 python execute_daily_job.py 2023-03-01 2023-03-21\necho ------单功能作业，除了创建数据库，其他都支持批量作业------\necho 创建数据库作业 python init_job.py\necho 综合选股作业 python selection_data_daily_job.py\necho 基础数据实时作业 python basic_data_daily_job.py\necho 基础数据收盘2小时后作业 python backtest_data_daily_job.py\necho 基础数据非实时作业 python basic_data_other_daily_job.py\necho 指标数据作业 python indicators_data_daily_job.py\necho K线形态作业 klinepattern_data_daily_job.py\necho 策略数据作业 python strategy_data_daily_job.py\necho 回测数据 python backtest_data_daily_job.py\necho ------正在执行作业中，请等待------\n:: python execute_daily_job.py 2022-01-24,2022-02-25,2022-03-24,2022-04-18,2022-05-18,2022-06-06,2022-07-21,2022-08-26,2022-09-16,2022-10-28,2022-11-04,2022-12-16\n::python execute_daily_job.py 2022-01-10,2022-02-14,2022-03-14,2022-04-11,2022-05-10,2022-06-13,2022-07-04,2022-08-08,2022-09-05,2022-10-11,2022-11-14,2022-12-05\n:: python execute_daily_job.py 2022-05-18 2022-05-25\npython execute_daily_job.py\npause\nexit\n"
  },
  {
    "path": "instock/bin/run_job.sh",
    "content": "#!/bin/sh\n\n#export PYTHONPATH=/data/InStock\n\n#nohup  &\n/usr/local/bin/python3 /data/InStock/instock/job/execute_daily_job.py\n\necho ------整体作业 支持批量作业------\necho 当前时间作业 python execute_daily_job.py\necho 1个时间作业 python execute_daily_job.py 2023-03-01\necho N个时间作业 python execute_daily_job.py 2023-03-01,2023-03-02\necho 区间作业 python execute_daily_job.py 2023-03-01 2023-03-21\necho ------单功能作业 除了创建数据库 其他都支持批量作业------\necho 创建数据库作业 python init_job.py\necho 综合选股作业 python selection_data_daily_job.py\necho 基础数据实时作业 python basic_data_daily_job.py\necho 基础数据收盘2小时后作业 python backtest_data_daily_job.py\necho 基础数据非实时作业 python basic_data_other_daily_job.py\necho 指标数据作业 python indicators_data_daily_job.py\necho K线形态作业 klinepattern_data_daily_job.py\necho 策略数据作业 python strategy_data_daily_job.py\necho 回测数据 python backtest_data_daily_job.py\necho ------正在执行作业中 请等待------\n"
  },
  {
    "path": "instock/bin/run_trade.bat",
    "content": "chcp 65001\n@echo off\ncd %~dp0\ncd ..\ncd trade\npython trade_service.py\necho ------交易服务已启动，请不要关闭------\npause\nexit\n"
  },
  {
    "path": "instock/bin/run_web.bat",
    "content": "chcp 65001\n@echo off\ncd %~dp0\ncd ..\ncd web\npython web_service.py\necho ------Web服务已启动，请不要关闭------\necho 访问地址 : http://localhost:9988/\npause\nexit\n"
  },
  {
    "path": "instock/bin/run_web.sh",
    "content": "#!/bin/bash\n\n/usr/local/bin/python3 /data/InStock/instock/web/web_service.py\n\necho ------Web服务已启动 请不要关闭------\necho 访问地址 : http://localhost:9988/\n"
  },
  {
    "path": "instock/config/.gitignore",
    "content": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nparts/\nsdist/\nvar/\nwheels/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\ncover/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\n.pybuilder/\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# IPython\nprofile_default/\nipython_config.py\n\n# pyenv\n#   For a library or package, you might want to ignore these files since the code is\n#   intended to run in multiple environments; otherwise, check them in:\n# .python-version\n\n# pipenv\n#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.\n#   However, in case of collaboration, if having platform-specific dependencies or dependencies\n#   having no cross-platform support, pipenv may install dependencies that don't work, or not\n#   install all needed dependencies.\n#Pipfile.lock\n\n# poetry\n#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.\n#   This is especially recommended for binary packages to ensure reproducibility, and is more\n#   commonly ignored for libraries.\n#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control\n#poetry.lock\n\n# pdm\n#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.\n#pdm.lock\n#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it\n#   in version control.\n#   https://pdm.fming.dev/#use-with-ide\n.pdm.toml\n\n# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm\n__pypackages__/\n\n# Celery stuff\ncelerybeat-schedule\ncelerybeat.pid\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n.dmypy.json\ndmypy.json\n\n# Pyre type checker\n.pyre/\n\n# pytype static type analyzer\n.pytype/\n\n# Cython debug symbols\ncython_debug/\n\n# PyCharm\n#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can\n#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore\n#  and can be added to the global gitignore or merged into this file.  For a more nuclear\n#  option (not recommended) you can uncomment the following to ignore the entire idea folder.\n.idea/\n\ngf_client.json\n\n"
  },
  {
    "path": "instock/config/eastmoney_cookie.txt",
    "content": ""
  },
  {
    "path": "instock/config/proxy.txt",
    "content": ""
  },
  {
    "path": "instock/config/trade_client.json",
    "content": "{\n  \"user\": \"888888888888\",\n  \"password\": \"888888\",\n  \"exe_path\": \"C:/gfzqrzrq/xiadan.exe\"\n}"
  },
  {
    "path": "instock/core/.gitignore",
    "content": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\ncover/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\n.pybuilder/\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# IPython\nprofile_default/\nipython_config.py\n\n# pyenv\n#   For a library or package, you might want to ignore these files since the code is\n#   intended to run in multiple environments; otherwise, check them in:\n# .python-version\n\n# pipenv\n#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.\n#   However, in case of collaboration, if having platform-specific dependencies or dependencies\n#   having no cross-platform support, pipenv may install dependencies that don't work, or not\n#   install all needed dependencies.\n#Pipfile.lock\n\n# poetry\n#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.\n#   This is especially recommended for binary packages to ensure reproducibility, and is more\n#   commonly ignored for libraries.\n#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control\n#poetry.lock\n\n# pdm\n#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.\n#pdm.lock\n#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it\n#   in version control.\n#   https://pdm.fming.dev/#use-with-ide\n.pdm.toml\n\n# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm\n__pypackages__/\n\n# Celery stuff\ncelerybeat-schedule\ncelerybeat.pid\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n.dmypy.json\ndmypy.json\n\n# Pyre type checker\n.pyre/\n\n# pytype static type analyzer\n.pytype/\n\n# Cython debug symbols\ncython_debug/\n\n# PyCharm\n#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can\n#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore\n#  and can be added to the global gitignore or merged into this file.  For a more nuclear\n#  option (not recommended) you can uncomment the following to ignore the entire idea folder.\n.idea/\n\ncaptcha/\ncrawling/stock_selection_strengthen.py"
  },
  {
    "path": "instock/core/__init__.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\n__author__ = 'myh '\n__date__ = '2023/4/3 '\n"
  },
  {
    "path": "instock/core/backtest/.gitignore",
    "content": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\ncover/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\n.pybuilder/\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# IPython\nprofile_default/\nipython_config.py\n\n# pyenv\n#   For a library or package, you might want to ignore these files since the code is\n#   intended to run in multiple environments; otherwise, check them in:\n# .python-version\n\n# pipenv\n#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.\n#   However, in case of collaboration, if having platform-specific dependencies or dependencies\n#   having no cross-platform support, pipenv may install dependencies that don't work, or not\n#   install all needed dependencies.\n#Pipfile.lock\n\n# poetry\n#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.\n#   This is especially recommended for binary packages to ensure reproducibility, and is more\n#   commonly ignored for libraries.\n#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control\n#poetry.lock\n\n# pdm\n#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.\n#pdm.lock\n#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it\n#   in version control.\n#   https://pdm.fming.dev/#use-with-ide\n.pdm.toml\n\n# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm\n__pypackages__/\n\n# Celery stuff\ncelerybeat-schedule\ncelerybeat.pid\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n.dmypy.json\ndmypy.json\n\n# Pyre type checker\n.pyre/\n\n# pytype static type analyzer\n.pytype/\n\n# Cython debug symbols\ncython_debug/\n\n# PyCharm\n#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can\n#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore\n#  and can be added to the global gitignore or merged into this file.  For a more nuclear\n#  option (not recommended) you can uncomment the following to ignore the entire idea folder.\n.idea/\n"
  },
  {
    "path": "instock/core/backtest/__init__.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\n__author__ = 'myh '\n__date__ = '2023/3/13 '\n"
  },
  {
    "path": "instock/core/backtest/rate_stats.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\nimport logging\nimport numpy as np\nimport pandas as pd\n\n__author__ = 'myh '\n__date__ = '2023/3/10 '\n\n\ndef get_rates(code_name, data, stock_column, threshold=101):\n    try:\n        # 增加空判断，如果是空返回 0 数据。\n        if data is None:\n            return None\n\n        start_date = code_name[0]\n        code = code_name[1]\n        # 设置返回数组。\n        stock_data_list = [start_date, code]\n\n        mask = (data['date'] >= start_date)\n        data = data.loc[mask].copy()\n        data = data.head(n=threshold)\n\n        if len(data.index) <= 1:\n            return None\n\n        close1 = data.iloc[0]['close']\n        # data.loc[:, 'sum_pct_change'] = data['close'].apply(lambda x: round(100 * (x - close1) / close1, 2))\n        data.loc[:, 'sum_pct_change'] = np.around(100 * (data['close'].values - close1) / close1, decimals=2)\n        # 计算区间最高、最低价格\n\n        first = True\n        col_len = len(data.columns)\n        for row in data.values:\n            if first:\n                first = False\n            else:\n                stock_data_list.append(row[col_len-1])\n\n        _l = len(stock_column) - len(stock_data_list)\n        for i in range(0, _l):\n            stock_data_list.append(None)\n\n    except Exception as e:\n        logging.error(f\"rate_stats.get_rates处理异常：{code}代码{e}\")\n\n    return pd.Series(stock_data_list, index=stock_column)\n"
  },
  {
    "path": "instock/core/crawling/__init__.py",
    "content": ""
  },
  {
    "path": "instock/core/crawling/fund_etf_em.py",
    "content": "#!/usr/bin/env python\n# -*- coding:utf-8 -*-\n\"\"\"\nDate: 2023/1/4 12:18\nDesc: 东方财富-ETF 行情\nhttps://quote.eastmoney.com/sh513500.html\n\"\"\"\nimport random\nimport time\nfrom functools import lru_cache\nimport math\nimport pandas as pd\nfrom instock.core.eastmoney_fetcher import eastmoney_fetcher\n\n__author__ = 'myh '\n__date__ = '2025/12/31 '\n\n# 创建全局实例，供所有函数使用\nfetcher = eastmoney_fetcher()\n\ndef fund_etf_spot_em() -> pd.DataFrame:\n    \"\"\"\n    东方财富-ETF 实时行情\n    https://quote.eastmoney.com/center/gridlist.html#fund_etf\n    :return: ETF 实时行情\n    :rtype: pandas.DataFrame\n    \"\"\"\n    url = \"http://88.push2.eastmoney.com/api/qt/clist/get\"\n    page_size = 50\n    page_current = 1\n    params = {\n        \"pn\": page_current,\n        \"pz\": page_size,\n        \"po\": \"1\",\n        \"np\": \"1\",\n        \"ut\": \"bd1d9ddb04089700cf9c27f6f7426281\",\n        \"fltt\": \"2\",\n        \"invt\": \"2\",\n        \"wbp2u\": \"|0|0|0|web\",\n        \"fid\": \"f12\",\n        \"fs\": \"b:MK0021,b:MK0022,b:MK0023,b:MK0024\",\n        \"fields\": \"f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152\",\n        \"_\": \"1672806290972\",\n    }\n    r =  fetcher.make_request(url, params=params)\n    data_json = r.json()\n\n    data = data_json[\"data\"][\"diff\"]\n    if not data:\n        return pd.DataFrame()\n\n    data_count = data_json[\"data\"][\"total\"]\n    page_count = math.ceil(data_count/page_size)\n    while page_count > 1:\n        # 添加随机延迟，避免爬取过快\n        time.sleep(random.uniform(1, 1.5))\n        page_current = page_current + 1\n        params[\"pn\"] = page_current\n        r =  fetcher.make_request(url, params=params)\n        data_json = r.json()\n        _data = data_json[\"data\"][\"diff\"]\n        data.extend(_data)\n        page_count =page_count - 1\n\n    temp_df = pd.DataFrame(data)\n    temp_df.rename(\n        columns={\n            \"f12\": \"代码\",\n            \"f14\": \"名称\",\n            \"f2\": \"最新价\",\n            \"f3\": \"涨跌幅\",\n            \"f4\": \"涨跌额\",\n            \"f5\": \"成交量\",\n            \"f6\": \"成交额\",\n            \"f17\": \"开盘价\",\n            \"f15\": \"最高价\",\n            \"f16\": \"最低价\",\n            \"f18\": \"昨收\",\n            \"f8\": \"换手率\",\n            \"f21\": \"流通市值\",\n            \"f20\": \"总市值\",\n        },\n        inplace=True,\n    )\n    temp_df = temp_df[\n        [\n            \"代码\",\n            \"名称\",\n            \"最新价\",\n            \"涨跌幅\",\n            \"涨跌额\",\n            \"成交量\",\n            \"成交额\",\n            \"开盘价\",\n            \"最高价\",\n            \"最低价\",\n            \"昨收\",\n            \"换手率\",\n            \"流通市值\",\n            \"总市值\",\n        ]\n    ]\n    temp_df[\"最新价\"] = pd.to_numeric(temp_df[\"最新价\"], errors=\"coerce\")\n    temp_df[\"涨跌幅\"] = pd.to_numeric(temp_df[\"涨跌幅\"], errors=\"coerce\")\n    temp_df[\"涨跌额\"] = pd.to_numeric(temp_df[\"涨跌额\"], errors=\"coerce\")\n    temp_df[\"成交量\"] = pd.to_numeric(temp_df[\"成交量\"], errors=\"coerce\")\n    temp_df[\"成交额\"] = pd.to_numeric(temp_df[\"成交额\"], errors=\"coerce\")\n    temp_df[\"开盘价\"] = pd.to_numeric(temp_df[\"开盘价\"], errors=\"coerce\")\n    temp_df[\"最高价\"] = pd.to_numeric(temp_df[\"最高价\"], errors=\"coerce\")\n    temp_df[\"最低价\"] = pd.to_numeric(temp_df[\"最低价\"], errors=\"coerce\")\n    temp_df[\"昨收\"] = pd.to_numeric(temp_df[\"昨收\"], errors=\"coerce\")\n    temp_df[\"换手率\"] = pd.to_numeric(temp_df[\"换手率\"], errors=\"coerce\")\n    temp_df[\"流通市值\"] = pd.to_numeric(temp_df[\"流通市值\"], errors=\"coerce\")\n    temp_df[\"总市值\"] = pd.to_numeric(temp_df[\"总市值\"], errors=\"coerce\")\n    return temp_df\n\n\n@lru_cache()\ndef _fund_etf_code_id_map_em() -> dict:\n    \"\"\"\n    东方财富-ETF 代码和市场标识映射\n    https://quote.eastmoney.com/center/gridlist.html#fund_etf\n    :return: ETF 代码和市场标识映射\n    :rtype: pandas.DataFrame\n    \"\"\"\n    url = \"http://88.push2.eastmoney.com/api/qt/clist/get\"\n    params = {\n        \"pn\": \"1\",\n        \"pz\": \"5000\",\n        \"po\": \"1\",\n        \"np\": \"1\",\n        \"ut\": \"bd1d9ddb04089700cf9c27f6f7426281\",\n        \"fltt\": \"2\",\n        \"invt\": \"2\",\n        \"wbp2u\": \"|0|0|0|web\",\n        \"fid\": \"f3\",\n        \"fs\": \"b:MK0021,b:MK0022,b:MK0023,b:MK0024\",\n        \"fields\": \"f12,f13\",\n        \"_\": \"1672806290972\",\n    }\n    r =  fetcher.make_request(url, params=params)\n    data_json = r.json()\n    temp_df = pd.DataFrame(data_json[\"data\"][\"diff\"])\n    temp_dict = dict(zip(temp_df[\"f12\"], temp_df[\"f13\"]))\n    return temp_dict\n\ndef fund_etf_hist_em(\n    symbol: str = \"159707\",\n    period: str = \"daily\",\n    start_date: str = \"19700101\",\n    end_date: str = \"20500101\",\n    adjust: str = \"\",\n) -> pd.DataFrame:\n    \"\"\"\n    东方财富-ETF 行情\n    https://quote.eastmoney.com/sz159707.html\n    :param symbol: ETF 代码\n    :type symbol: str\n    :param period: choice of {'daily', 'weekly', 'monthly'}\n    :type period: str\n    :param start_date: 开始日期\n    :type start_date: str\n    :param end_date: 结束日期\n    :type end_date: str\n    :param adjust: choice of {\"qfq\": \"前复权\", \"hfq\": \"后复权\", \"\": \"不复权\"}\n    :type adjust: str\n    :return: 每日行情\n    :rtype: pandas.DataFrame\n    \"\"\"\n    code_id_dict = _fund_etf_code_id_map_em()\n    adjust_dict = {\"qfq\": \"1\", \"hfq\": \"2\", \"\": \"0\"}\n    period_dict = {\"daily\": \"101\", \"weekly\": \"102\", \"monthly\": \"103\"}\n    url = \"http://push2his.eastmoney.com/api/qt/stock/kline/get\"\n    params = {\n        \"fields1\": \"f1,f2,f3,f4,f5,f6\",\n        \"fields2\": \"f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61,f116\",\n        \"ut\": \"7eea3edcaed734bea9cbfc24409ed989\",\n        \"klt\": period_dict[period],\n        \"fqt\": adjust_dict[adjust],\n        \"secid\": f\"{code_id_dict[symbol]}.{symbol}\",\n        \"beg\": start_date,\n        \"end\": end_date,\n        \"_\": \"1623766962675\",\n    }\n    r =  fetcher.make_request(url, params=params)\n    data_json = r.json()\n    if not (data_json[\"data\"] and data_json[\"data\"][\"klines\"]):\n        return pd.DataFrame()\n    temp_df = pd.DataFrame([item.split(\",\") for item in data_json[\"data\"][\"klines\"]])\n    temp_df.columns = [\n        \"日期\",\n        \"开盘\",\n        \"收盘\",\n        \"最高\",\n        \"最低\",\n        \"成交量\",\n        \"成交额\",\n        \"振幅\",\n        \"涨跌幅\",\n        \"涨跌额\",\n        \"换手率\",\n    ]\n    temp_df.index = pd.to_datetime(temp_df[\"日期\"])\n    temp_df.reset_index(inplace=True, drop=True)\n\n    temp_df[\"开盘\"] = pd.to_numeric(temp_df[\"开盘\"])\n    temp_df[\"收盘\"] = pd.to_numeric(temp_df[\"收盘\"])\n    temp_df[\"最高\"] = pd.to_numeric(temp_df[\"最高\"])\n    temp_df[\"最低\"] = pd.to_numeric(temp_df[\"最低\"])\n    temp_df[\"成交量\"] = pd.to_numeric(temp_df[\"成交量\"])\n    temp_df[\"成交额\"] = pd.to_numeric(temp_df[\"成交额\"])\n    temp_df[\"振幅\"] = pd.to_numeric(temp_df[\"振幅\"])\n    temp_df[\"涨跌幅\"] = pd.to_numeric(temp_df[\"涨跌幅\"])\n    temp_df[\"涨跌额\"] = pd.to_numeric(temp_df[\"涨跌额\"])\n    temp_df[\"换手率\"] = pd.to_numeric(temp_df[\"换手率\"])\n    return temp_df\n\n\ndef fund_etf_hist_min_em(\n    symbol: str = \"159707\",\n    start_date: str = \"1979-09-01 09:32:00\",\n    end_date: str = \"2222-01-01 09:32:00\",\n    period: str = \"5\",\n    adjust: str = \"\",\n) -> pd.DataFrame:\n    \"\"\"\n    东方财富-ETF 行情\n    https://quote.eastmoney.com/sz159707.html\n    :param symbol: ETF 代码\n    :type symbol: str\n    :param start_date: 开始日期\n    :type start_date: str\n    :param end_date: 结束日期\n    :type end_date: str\n    :param period: choice of {'1', '5', '15', '30', '60'}\n    :type period: str\n    :param adjust: choice of {'', 'qfq', 'hfq'}\n    :type adjust: str\n    :return: 每日分时行情\n    :rtype: pandas.DataFrame\n    \"\"\"\n    code_id_dict = _fund_etf_code_id_map_em()\n    adjust_map = {\n        \"\": \"0\",\n        \"qfq\": \"1\",\n        \"hfq\": \"2\",\n    }\n    if period == \"1\":\n        url = \"https://push2his.eastmoney.com/api/qt/stock/trends2/get\"\n        params = {\n            \"fields1\": \"f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13\",\n            \"fields2\": \"f51,f52,f53,f54,f55,f56,f57,f58\",\n            \"ut\": \"7eea3edcaed734bea9cbfc24409ed989\",\n            \"ndays\": \"5\",\n            \"iscr\": \"0\",\n            \"secid\": f\"{code_id_dict[symbol]}.{symbol}\",\n            \"_\": \"1623766962675\",\n        }\n        r =  fetcher.make_request(url, params=params)\n        data_json = r.json()\n        temp_df = pd.DataFrame(\n            [item.split(\",\") for item in data_json[\"data\"][\"trends\"]]\n        )\n        temp_df.columns = [\n            \"时间\",\n            \"开盘\",\n            \"收盘\",\n            \"最高\",\n            \"最低\",\n            \"成交量\",\n            \"成交额\",\n            \"最新价\",\n        ]\n        temp_df.index = pd.to_datetime(temp_df[\"时间\"])\n        temp_df = temp_df[start_date:end_date]\n        temp_df.reset_index(drop=True, inplace=True)\n        temp_df[\"开盘\"] = pd.to_numeric(temp_df[\"开盘\"])\n        temp_df[\"收盘\"] = pd.to_numeric(temp_df[\"收盘\"])\n        temp_df[\"最高\"] = pd.to_numeric(temp_df[\"最高\"])\n        temp_df[\"最低\"] = pd.to_numeric(temp_df[\"最低\"])\n        temp_df[\"成交量\"] = pd.to_numeric(temp_df[\"成交量\"])\n        temp_df[\"成交额\"] = pd.to_numeric(temp_df[\"成交额\"])\n        temp_df[\"最新价\"] = pd.to_numeric(temp_df[\"最新价\"])\n        temp_df[\"时间\"] = pd.to_datetime(temp_df[\"时间\"]).astype(str)\n        return temp_df\n    else:\n        url = \"http://push2his.eastmoney.com/api/qt/stock/kline/get\"\n        params = {\n            \"fields1\": \"f1,f2,f3,f4,f5,f6\",\n            \"fields2\": \"f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61\",\n            \"ut\": \"7eea3edcaed734bea9cbfc24409ed989\",\n            \"klt\": period,\n            \"fqt\": adjust_map[adjust],\n            \"secid\": f\"{code_id_dict[symbol]}.{symbol}\",\n            \"beg\": \"0\",\n            \"end\": \"20500000\",\n            \"_\": \"1630930917857\",\n        }\n        r =  fetcher.make_request(url, params=params)\n        data_json = r.json()\n        temp_df = pd.DataFrame(\n            [item.split(\",\") for item in data_json[\"data\"][\"klines\"]]\n        )\n        temp_df.columns = [\n            \"时间\",\n            \"开盘\",\n            \"收盘\",\n            \"最高\",\n            \"最低\",\n            \"成交量\",\n            \"成交额\",\n            \"振幅\",\n            \"涨跌幅\",\n            \"涨跌额\",\n            \"换手率\",\n        ]\n        temp_df.index = pd.to_datetime(temp_df[\"时间\"])\n        temp_df = temp_df[start_date:end_date]\n        temp_df.reset_index(drop=True, inplace=True)\n        temp_df[\"开盘\"] = pd.to_numeric(temp_df[\"开盘\"])\n        temp_df[\"收盘\"] = pd.to_numeric(temp_df[\"收盘\"])\n        temp_df[\"最高\"] = pd.to_numeric(temp_df[\"最高\"])\n        temp_df[\"最低\"] = pd.to_numeric(temp_df[\"最低\"])\n        temp_df[\"成交量\"] = pd.to_numeric(temp_df[\"成交量\"])\n        temp_df[\"成交额\"] = pd.to_numeric(temp_df[\"成交额\"])\n        temp_df[\"振幅\"] = pd.to_numeric(temp_df[\"振幅\"])\n        temp_df[\"涨跌幅\"] = pd.to_numeric(temp_df[\"涨跌幅\"])\n        temp_df[\"涨跌额\"] = pd.to_numeric(temp_df[\"涨跌额\"])\n        temp_df[\"换手率\"] = pd.to_numeric(temp_df[\"换手率\"])\n        temp_df[\"时间\"] = pd.to_datetime(temp_df[\"时间\"]).astype(str)\n        temp_df = temp_df[\n            [\n                \"时间\",\n                \"开盘\",\n                \"收盘\",\n                \"最高\",\n                \"最低\",\n                \"涨跌幅\",\n                \"涨跌额\",\n                \"成交量\",\n                \"成交额\",\n                \"振幅\",\n                \"换手率\",\n            ]\n        ]\n        return temp_df\n\n\nif __name__ == \"__main__\":\n    fund_etf_spot_em_df = fund_etf_spot_em()\n    print(fund_etf_spot_em_df)\n\n    fund_etf_hist_hfq_em_df = fund_etf_hist_em(\n        symbol=\"513500\",\n        period=\"daily\",\n        start_date=\"20000101\",\n        end_date=\"20230201\",\n        adjust=\"hfq\",\n    )\n    print(fund_etf_hist_hfq_em_df)\n\n    fund_etf_hist_qfq_em_df = fund_etf_hist_em(\n        symbol=\"000001\",\n        period=\"daily\",\n        start_date=\"20000101\",\n        end_date=\"20230201\",\n        adjust=\"qfq\",\n    )\n    print(fund_etf_hist_qfq_em_df)\n\n    fund_etf_hist_em_df = fund_etf_hist_em(\n        symbol=\"513500\",\n        period=\"daily\",\n        start_date=\"20000101\",\n        end_date=\"20230201\",\n        adjust=\"\",\n    )\n    print(fund_etf_hist_em_df)\n\n    fund_etf_hist_min_em_df = fund_etf_hist_min_em(\n        symbol=\"513500\",\n        period=\"5\",\n        adjust=\"hfq\",\n        start_date=\"2023-01-01 09:32:00\",\n        end_date=\"2023-01-04 14:40:00\",\n    )\n    print(fund_etf_hist_min_em_df)\n"
  },
  {
    "path": "instock/core/crawling/stock_chip_race.py",
    "content": "#!/usr/bin/env python\n# -*- coding:utf-8 -*-\n\"\"\"\nDate: 2025/2/26 12:18\nDesc: 通达信抢筹\nhttp://excalc.icfqs.com:7616/TQLEX?Entry=HQServ.hq_nlp\n\"\"\"\n\nimport pandas as pd\nimport requests\nfrom instock.core.singleton_proxy import proxys\n\n__author__ = 'myh '\n__date__ = '2025/2/26 '\n\ndef stock_chip_race_open(date: str = \"\") -> pd.DataFrame:\n    \"\"\"\n    通达信竞价抢筹_早盘抢筹\n    http://excalc.icfqs.com:7616/TQLEX?Entry=HQServ.hq_nlp\n    :return: 早盘抢筹\n    :rtype: pandas.DataFrame\n    \"\"\"\n    url = \"http://excalc.icfqs.com:7616/TQLEX?Entry=HQServ.hq_nlp\"\n    #sort:1抢筹委托金额, 2抢筹成交金额, 3开盘金额, 4抢筹幅度, 5抢筹占比\n    if date==\"\":\n        params = [{\"funcId\": 20, \"offset\": 0, \"count\": 100, \"sort\": 1, \"period\": 0,\n                   \"Token\": \"6679f5cadca97d68245a086793fc1bfc0a50b487487c812f\", \"modname\": \"JJQC\"}]\n    else:\n        params = [{\"funcId\": 20, \"offset\": 0, \"count\": 100, \"sort\": 1, \"period\": 0,\n                   \"Token\": \"6679f5cadca97d68245a086793fc1bfc0a50b487487c812f\", \"modname\": \"JJQC\", \"date\": date}]\n    headers = {\n        \"Content-Type\": \"application/json; charset=UTF-8\",\n        \"User-Agent\": \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 TdxW\",\n    }\n\n    r = requests.post(url, proxies = proxys().get_proxies(), json=params,headers=headers)\n    data_json = r.json()\n    data = data_json[\"datas\"]\n    if not data:\n        return pd.DataFrame()\n    temp_df = pd.DataFrame(data)\n    temp_df.columns = [\n        \"代码\",\n        \"名称\",\n        \"昨收\",\n        \"今开\",\n        \"开盘金额\",\n        \"抢筹幅度\",\n        \"抢筹委托金额\",\n        \"抢筹成交金额\",\n        \"最新价\",\n        \"_\",\n        \"天\",\n        \"板\",\n    ]\n\n    temp_df[\"昨收\"] = temp_df[\"昨收\"]/10000\n    temp_df[\"今开\"] = temp_df[\"今开\"] / 10000\n    temp_df[\"抢筹幅度\"] = round(temp_df[\"抢筹幅度\"] * 100, 2)\n    temp_df[\"最新价\"] = round(temp_df[\"最新价\"], 2)\n    temp_df[\"涨跌幅\"] = round((temp_df[\"最新价\"] / temp_df[\"昨收\"]-1) * 100, 2)\n    temp_df[\"抢筹占比\"] = round((temp_df[\"抢筹成交金额\"] / temp_df[\"开盘金额\"]) * 100, 2)\n\n    temp_df = temp_df[\n        [\n            \"代码\",\n            \"名称\",\n            \"最新价\",\n            \"涨跌幅\",\n            \"昨收\",\n            \"今开\",\n            \"开盘金额\",\n            \"抢筹幅度\",\n            \"抢筹委托金额\",\n            \"抢筹成交金额\",\n            \"抢筹占比\",\n            \"天\",\n            \"板\",\n        ]\n    ]\n\n    return temp_df\n\ndef stock_chip_race_end(date: str = \"\") -> pd.DataFrame:\n    \"\"\"\n    通达信竞价抢筹_尾盘抢筹\n    http://excalc.icfqs.com:7616/TQLEX?Entry=HQServ.hq_nlp\n    :return: 尾盘抢筹\n    :rtype: pandas.DataFrame\n    \"\"\"\n    url = \"http://excalc.icfqs.com:7616/TQLEX?Entry=HQServ.hq_nlp\"\n    #sort:1抢筹委托金额, 2抢筹成交金额, 3开盘金额, 4抢筹幅度, 5抢筹占比\n    if date==\"\":\n        params = [{\"funcId\": 20, \"offset\": 0, \"count\": 100, \"sort\": 1, \"period\": 1,\n                   \"Token\": \"6679f5cadca97d68245a086793fc1bfc0a50b487487c812f\", \"modname\": \"JJQC\"}]\n    else:\n        params = [{\"funcId\": 20, \"offset\": 0, \"count\": 100, \"sort\": 1, \"period\": 1,\n                   \"Token\": \"6679f5cadca97d68245a086793fc1bfc0a50b487487c812f\", \"modname\": \"JJQC\", \"date\": date}]\n    headers = {\n        \"Content-Type\": \"application/json; charset=UTF-8\",\n        \"User-Agent\": \"TdxW\",\n    }\n\n    r = requests.post(url, proxies = proxys().get_proxies(), json=params,headers=headers)\n    data_json = r.json()\n    data = data_json[\"datas\"]\n    if not data:\n        return pd.DataFrame()\n    temp_df = pd.DataFrame(data)\n    temp_df.columns = [\n        \"代码\",\n        \"名称\",\n        \"昨收\",\n        \"今开\",\n        \"收盘金额\",\n        \"抢筹幅度\",\n        \"抢筹委托金额\",\n        \"抢筹成交金额\",\n        \"最新价\",\n        \"_\",\n        \"天\",\n        \"板\",\n    ]\n\n    temp_df[\"昨收\"] = temp_df[\"昨收\"]/10000\n    temp_df[\"今开\"] = temp_df[\"今开\"] / 10000\n    temp_df[\"抢筹幅度\"] = round(temp_df[\"抢筹幅度\"] * 100, 2)\n    temp_df[\"最新价\"] = round(temp_df[\"最新价\"], 2)\n    temp_df[\"涨跌幅\"] = round((temp_df[\"最新价\"] / temp_df[\"昨收\"]-1) * 100, 2)\n    temp_df[\"抢筹占比\"] = round((temp_df[\"抢筹成交金额\"] / temp_df[\"收盘金额\"]) * 100, 2)\n\n    temp_df = temp_df[\n        [\n            \"代码\",\n            \"名称\",\n            \"最新价\",\n            \"涨跌幅\",\n            \"昨收\",\n            \"今开\",\n            \"收盘金额\",\n            \"抢筹幅度\",\n            \"抢筹委托金额\",\n            \"抢筹成交金额\",\n            \"抢筹占比\",\n            \"天\",\n            \"板\",\n        ]\n    ]\n\n    return temp_df\n\nif __name__ == \"__main__\":\n    fund_chip_race_open_df = stock_chip_race_open()\n    print(fund_chip_race_open_df)\n\n    fund_chip_race_end_df = stock_chip_race_end()\n    print(fund_chip_race_end_df)\n"
  },
  {
    "path": "instock/core/crawling/stock_cpbd.py",
    "content": "# -*- coding:utf-8 -*-\n# !/usr/bin/env python\n\nimport pandas as pd\nimport instock.core.tablestructure as tbs\nfrom instock.core.eastmoney_fetcher import eastmoney_fetcher\n\n__author__ = 'myh '\n__date__ = '2025/12/31 '\n\n# 创建全局实例，供所有函数使用\nfetcher = eastmoney_fetcher()\n\ndef stock_cpbd_em(symbol: str = \"688041\") -> pd.DataFrame:\n    \"\"\"\n    东方财富网-个股-操盘必读\n    https://emweb.securities.eastmoney.com/PC_HSF10/OperationsRequired/Index?type=web&code=SH688041#\n    :param symbol: 带市场标识的股票代码\n    :type symbol: str\n    :return: 操盘必读\n    :rtype: pandas.DataFrame\n    \"\"\"\n    url = \"https://emweb.securities.eastmoney.com/PC_HSF10/OperationsRequired/PageAjax\"\n    if symbol.startswith(\"6\"):\n        symbol = f\"SH{symbol}\"\n    else:\n        symbol = f\"SZ{symbol}\"\n    params = {\"code\": symbol}\n\n    r =  fetcher.make_request(url, params=params)\n    data_json = r.json()\n    zxzb = data_json[\"zxzb\"]  # 主要指标\n    if len(zxzb) < 1:\n        return None\n\n    data_dict = zxzb[0]\n    zxzbOther = data_json[\"zxzbOther\"]  # 其它指标,计算出来\n    if len(zxzbOther) > 0:\n        zxzbOther = zxzbOther[0]\n        data_dict = {**data_dict, **zxzbOther}\n\n    # zxzbhq = data_json[\"zxzbhq\"]  # 其它指标,计算出来\n    # if len(zxzbhq) > 0:\n    #     data_dict = {**data_dict, **zxzbhq}\n\n    _ssbks = data_json[\"ssbk\"]  # 所属板块\n    ssbk = None\n    for s in _ssbks:\n        _v = s.get('BOARD_NAME')\n        if _v is not None:\n            if ssbk is None:\n                ssbk = f\"{_v}\"\n            else:\n                ssbk = f\"{ssbk}、{_v}\"\n    data_dict[\"BOARD_NAME\"] = ssbk\n\n    gdrs = data_json[\"gdrs\"]  # 股东分析\n    if len(gdrs) > 0:\n        gdrs = gdrs[0]\n        data_dict = {**data_dict, **gdrs}\n\n    lhbd = data_json[\"lhbd\"]  # 龙虎榜单\n    if len(lhbd) > 0:\n        lhbd = lhbd[0]\n        lhbd[\"LHBD_DATE\"] = lhbd.pop(\"TRADE_DATE\")\n        data_dict = {**data_dict, **lhbd}\n\n    dzjy = data_json[\"dzjy\"]  # 大宗交易\n    if len(dzjy) > 0:\n        dzjy = dzjy[0]\n        dzjy[\"DZJY_DATE\"] = dzjy.pop(\"TRADE_DATE\")\n        data_dict = {**data_dict, **dzjy}\n\n    rzrq = data_json[\"rzrq\"]  # 融资融券\n    if len(rzrq) > 0:\n        rzrq = rzrq[0]\n        rzrq[\"RZRQ_DATE\"] = rzrq.pop(\"TRADE_DATE\")\n        data_dict = {**data_dict, **rzrq}\n\n    tbs.CN_STOCK_CPBD\n\n\n    # temp_df[\"报告期\"] = pd.to_datetime(temp_df[\"报告期\"], errors=\"coerce\").dt.date\n    # temp_df[\"每股收益\"] = pd.to_numeric(temp_df[\"每股收益\"], errors=\"coerce\")\n    # temp_df[\"每股净资产\"] = pd.to_numeric(temp_df[\"每股净资产\"], errors=\"coerce\")\n    # temp_df[\"每股经营现金流\"] = pd.to_numeric(temp_df[\"每股经营现金流\"], errors=\"coerce\")\n    # temp_df[\"每股公积金\"] = pd.to_numeric(temp_df[\"每股公积金\"], errors=\"coerce\")\n    # temp_df[\"每股未分配利润\"] = pd.to_numeric(temp_df[\"每股未分配利润\"], errors=\"coerce\")\n    # temp_df[\"加权净资产收益率\"] = pd.to_numeric(temp_df[\"加权净资产收益率\"], errors=\"coerce\")\n    # temp_df[\"毛利率\"] = pd.to_numeric(temp_df[\"毛利率\"], errors=\"coerce\")\n    # temp_df[\"资产负债率\"] = pd.to_numeric(temp_df[\"资产负债率\"], errors=\"coerce\")\n    # temp_df[\"营业收入\"] = pd.to_numeric(temp_df[\"营业收入\"], errors=\"coerce\")\n    # temp_df[\"营业收入滚动环比增长\"] = pd.to_numeric(temp_df[\"营业收入同比增长\"], errors=\"coerce\")\n    # temp_df[\"营业收入同比增长\"] = pd.to_numeric(temp_df[\"营业收入同比增长\"], errors=\"coerce\")\n    # temp_df[\"归属净利润\"] = pd.to_numeric(temp_df[\"归属净利润\"], errors=\"coerce\")\n    # temp_df[\"归属净利润滚动环比增长\"] = pd.to_numeric(temp_df[\"归属净利润滚动环比增长\"], errors=\"coerce\")\n    # temp_df[\"归属净利润同比增长\"] = pd.to_numeric(temp_df[\"归属净利润同比增长\"], errors=\"coerce\")\n    # temp_df[\"扣非净利润\"] = pd.to_numeric(temp_df[\"归属净利润\"], errors=\"coerce\")\n    # temp_df[\"扣非净利润滚动环比增长\"] = pd.to_numeric(temp_df[\"扣非净利润滚动环比增长\"], errors=\"coerce\")\n    # temp_df[\"扣非净利润同比增长\"] = pd.to_numeric(temp_df[\"扣非净利润同比增长\"], errors=\"coerce\")\n    # temp_df[\"总股本\"] = pd.to_numeric(temp_df[\"总股本\"], errors=\"coerce\")\n    # temp_df[\"已流通股份\"] = pd.to_numeric(temp_df[\"已流通股份\"], errors=\"coerce\")\n\n\ndef stock_zjlx_em(symbol: str = \"688041\") -> pd.DataFrame:\n    \"\"\"\n    东方财富网-个股-资金流向\n    https://data.eastmoney.com/zjlx/688041.html\n    :param symbol: 带市场标识的股票代码\n    :type symbol: str\n    :return: 操盘必读\n    :rtype: pandas.DataFrame\n    \"\"\"\n    url = \"https://push2his.eastmoney.com/api/qt/stock/fflow/daykline/get\"\n    if symbol.startswith(\"6\"):\n        symbol = f\"1.{symbol}\"\n    else:\n        symbol = f\"0.{symbol}\"\n    params = {\n        \"lmt\": \"0\",\n        \"klt\": \"1\",\n        \"fields1\": \"f1,f2,f3,f7\",\n        \"fields2\": \"f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61,f62,f63,f64,f65\",\n        \"ut\": \"b2884a393a59ad64002292a3e90d46a5\",\n        \"secid\": symbol\n    }\n\n    r =  fetcher.make_request(url, params=params)\n    data_json = r.json()\n    klines = data_json[\"klines\"]  # 主要指标\n    \"日期\",\"主力净流入额\",\"小单净流入额\",\"中单净流入额\",\"大单净流入额\",\"超大单净流入额\",\"主力净流入占比\", \"小单净流入占比\", \"中单净流入占比\", \"大单净流入占比\", \"超大单净流入占比\"\n    \"收盘价\",\"涨跌幅\"\n    if len(klines) < 1:\n        return None\n\n\n\nif __name__ == \"__main__\":\n    stock_cpbd_em_df = stock_zjlx_em(symbol=\"000001\")\n    print(stock_cpbd_em_df)\n"
  },
  {
    "path": "instock/core/crawling/stock_dzjy_em.py",
    "content": "#!/usr/bin/env python\n# -*- coding:utf-8 -*-\n\"\"\"\nDate: 2022/5/16 15:31\nDesc: 东方财富网-数据中心-大宗交易-市场统计\nhttp://data.eastmoney.com/dzjy/dzjy_sctj.aspx\n\"\"\"\nimport random\nimport time\n\nimport pandas as pd\nfrom instock.core.eastmoney_fetcher import eastmoney_fetcher\n\n__author__ = 'myh '\n__date__ = '2025/12/31 '\n\n# 创建全局实例，供所有函数使用\nfetcher = eastmoney_fetcher()\n\ndef stock_dzjy_sctj() -> pd.DataFrame:\n    \"\"\"\n    东方财富网-数据中心-大宗交易-市场统计\n    http://data.eastmoney.com/dzjy/dzjy_sctj.aspx\n    :return: 市场统计表\n    :rtype: pandas.DataFrame\n    \"\"\"\n    url = \"https://datacenter-web.eastmoney.com/api/data/v1/get\"\n    params = {\n        'sortColumns': 'TRADE_DATE',\n        'sortTypes': '-1',\n        'pageSize': '500',\n        'pageNumber': '1',\n        'reportName': 'PRT_BLOCKTRADE_MARKET_STA',\n        'columns': 'TRADE_DATE,SZ_INDEX,SZ_CHANGE_RATE,BLOCKTRADE_DEAL_AMT,PREMIUM_DEAL_AMT,PREMIUM_RATIO,DISCOUNT_DEAL_AMT,DISCOUNT_RATIO',\n        'source': 'WEB',\n        'client': 'WEB',\n    }\n    r = fetcher.make_request(url, params=params)\n    data_json = r.json()\n    total_page = int(data_json['result'][\"pages\"])\n    big_df = pd.DataFrame()\n    for page in range(1, total_page+1):\n        # 添加随机延迟，避免爬取过快\n        time.sleep(random.uniform(1, 1.5))\n        params.update({'pageNumber': page})\n        r = fetcher.make_request(url, params=params)\n        data_json = r.json()\n        temp_df = pd.DataFrame(data_json['result'][\"data\"])\n        big_df = pd.concat([big_df, temp_df], ignore_index=True)\n\n    big_df.reset_index(inplace=True)\n    big_df['index'] = big_df['index'] + 1\n    big_df.columns = [\n        \"序号\",\n        \"交易日期\",\n        \"上证指数\",\n        \"上证指数涨跌幅\",\n        \"大宗交易成交总额\",\n        \"溢价成交总额\",\n        \"溢价成交总额占比\",\n        \"折价成交总额\",\n        \"折价成交总额占比\",\n    ]\n    big_df[\"交易日期\"] = pd.to_datetime(big_df[\"交易日期\"]).dt.date\n    big_df[\"上证指数\"] = pd.to_numeric(big_df[\"上证指数\"])\n    big_df[\"上证指数涨跌幅\"] = pd.to_numeric(big_df[\"上证指数涨跌幅\"])\n    big_df[\"大宗交易成交总额\"] = pd.to_numeric(big_df[\"大宗交易成交总额\"])\n    big_df[\"溢价成交总额\"] = pd.to_numeric(big_df[\"溢价成交总额\"])\n    big_df[\"溢价成交总额占比\"] = pd.to_numeric(big_df[\"溢价成交总额占比\"])\n    big_df[\"折价成交总额\"] = pd.to_numeric(big_df[\"折价成交总额\"])\n    big_df[\"折价成交总额占比\"] = pd.to_numeric(big_df[\"折价成交总额占比\"])\n    return big_df\n\n\ndef stock_dzjy_mrmx(symbol: str = '基金', start_date: str = '20220104', end_date: str = '20220104') -> pd.DataFrame:\n    \"\"\"\n    东方财富网-数据中心-大宗交易-每日明细\n    http://data.eastmoney.com/dzjy/dzjy_mrmxa.aspx\n    :param symbol: choice of {'A股', 'B股', '基金', '债券'}\n    :type symbol: str\n    :param start_date: 开始日期\n    :type start_date: str\n    :param end_date: 结束日期\n    :type end_date: str\n    :return: 每日明细\n    :rtype: pandas.DataFrame\n    \"\"\"\n    symbol_map = {\n        'A股': '1',\n        'B股': '2',\n        '基金': '3',\n        '债券': '4',\n    }\n    url = \"https://datacenter-web.eastmoney.com/api/data/v1/get\"\n    params = {\n        'sortColumns': 'SECURITY_CODE',\n        'sortTypes': '1',\n        'pageSize': '5000',\n        'pageNumber': '1',\n        'reportName': 'RPT_DATA_BLOCKTRADE',\n        'columns': 'TRADE_DATE,SECURITY_CODE,SECUCODE,SECURITY_NAME_ABBR,CHANGE_RATE,CLOSE_PRICE,DEAL_PRICE,PREMIUM_RATIO,DEAL_VOLUME,DEAL_AMT,TURNOVER_RATE,BUYER_NAME,SELLER_NAME,CHANGE_RATE_1DAYS,CHANGE_RATE_5DAYS,CHANGE_RATE_10DAYS,CHANGE_RATE_20DAYS,BUYER_CODE,SELLER_CODE',\n        'source': 'WEB',\n        'client': 'WEB',\n        'filter': f\"\"\"(SECURITY_TYPE_WEB={symbol_map[symbol]})(TRADE_DATE>='{'-'.join([start_date[:4], start_date[4:6], start_date[6:]])}')(TRADE_DATE<='{'-'.join([end_date[:4], end_date[4:6], end_date[6:]])}')\"\"\"\n    }\n    r = fetcher.make_request(url, params=params)\n    data_json = r.json()\n    if not data_json['result'][\"data\"]:\n        return pd.DataFrame()\n    temp_df = pd.DataFrame(data_json['result'][\"data\"])\n    temp_df.reset_index(inplace=True)\n    temp_df['index'] = temp_df.index + 1\n    if symbol in {'A股'}:\n        temp_df.columns = [\n            \"序号\",\n            \"交易日期\",\n            \"证券代码\",\n            \"-\",\n            \"证券简称\",\n            \"涨跌幅\",\n            \"收盘价\",\n            \"成交价\",\n            \"折溢率\",\n            \"成交量\",\n            \"成交额\",\n            \"成交额/流通市值\",\n            \"买方营业部\",\n            \"卖方营业部\",\n            \"_\",\n            \"_\",\n            \"_\",\n            \"_\",\n            \"_\",\n            \"_\",\n        ]\n        temp_df[\"交易日期\"] = pd.to_datetime(temp_df[\"交易日期\"]).dt.date\n        temp_df = temp_df[[\n            \"序号\",\n            \"交易日期\",\n            \"证券代码\",\n            \"证券简称\",\n            \"涨跌幅\",\n            \"收盘价\",\n            \"成交价\",\n            \"折溢率\",\n            \"成交量\",\n            \"成交额\",\n            \"成交额/流通市值\",\n            \"买方营业部\",\n            \"卖方营业部\",\n        ]]\n        temp_df['涨跌幅'] = pd.to_numeric(temp_df['涨跌幅'])\n        temp_df['收盘价'] = pd.to_numeric(temp_df['收盘价'])\n        temp_df['成交价'] = pd.to_numeric(temp_df['成交价'])\n        temp_df['折溢率'] = pd.to_numeric(temp_df['折溢率'])\n        temp_df['成交量'] = pd.to_numeric(temp_df['成交量'])\n        temp_df['成交额'] = pd.to_numeric(temp_df['成交额'])\n        temp_df['成交额/流通市值'] = pd.to_numeric(temp_df['成交额/流通市值'])\n    if symbol in {'B股', '基金', '债券'}:\n        temp_df.columns = [\n            \"序号\",\n            \"交易日期\",\n            \"证券代码\",\n            \"-\",\n            \"证券简称\",\n            \"-\",\n            \"-\",\n            \"成交价\",\n            \"-\",\n            \"成交量\",\n            \"成交额\",\n            \"-\",\n            \"买方营业部\",\n            \"卖方营业部\",\n            \"_\",\n            \"_\",\n            \"_\",\n            \"_\",\n            \"_\",\n            \"_\",\n        ]\n        temp_df[\"交易日期\"] = pd.to_datetime(temp_df[\"交易日期\"]).dt.date\n        temp_df = temp_df[[\n            \"序号\",\n            \"交易日期\",\n            \"证券代码\",\n            \"证券简称\",\n            \"成交价\",\n            \"成交量\",\n            \"成交额\",\n            \"买方营业部\",\n            \"卖方营业部\",\n        ]]\n        temp_df['成交价'] = pd.to_numeric(temp_df['成交价'])\n        temp_df['成交量'] = pd.to_numeric(temp_df['成交量'])\n        temp_df['成交额'] = pd.to_numeric(temp_df['成交额'])\n    return temp_df\n\n\ndef stock_dzjy_mrtj(start_date: str = '20220105', end_date: str = '20220105') -> pd.DataFrame:\n    \"\"\"\n    东方财富网-数据中心-大宗交易-每日统计\n    http://data.eastmoney.com/dzjy/dzjy_mrtj.aspx\n    :param start_date: 开始日期\n    :type start_date: str\n    :param end_date: 结束日期\n    :type end_date: str\n    :return: 每日统计\n    :rtype: pandas.DataFrame\n    \"\"\"\n    url = \"https://datacenter-web.eastmoney.com/api/data/v1/get\"\n    params = {\n        'sortColumns': 'TURNOVERRATE',\n        'sortTypes': '-1',\n        'pageSize': '5000',\n        'pageNumber': '1',\n        'reportName': 'RPT_BLOCKTRADE_STA',\n        'columns': 'TRADE_DATE,SECURITY_CODE,SECUCODE,SECURITY_NAME_ABBR,CHANGE_RATE,CLOSE_PRICE,AVERAGE_PRICE,PREMIUM_RATIO,DEAL_NUM,VOLUME,DEAL_AMT,TURNOVERRATE,D1_CLOSE_ADJCHRATE,D5_CLOSE_ADJCHRATE,D10_CLOSE_ADJCHRATE,D20_CLOSE_ADJCHRATE',\n        'source': 'WEB',\n        'client': 'WEB',\n        'filter': f\"(TRADE_DATE>='{'-'.join([start_date[:4], start_date[4:6], start_date[6:]])}')(TRADE_DATE<='{'-'.join([end_date[:4], end_date[4:6], end_date[6:]])}')\"\n    }\n    r = fetcher.make_request(url, params=params)\n    data_json = r.json()\n    temp_df = pd.DataFrame(data_json['result'][\"data\"])\n    temp_df.reset_index(inplace=True)\n    temp_df['index'] = temp_df.index + 1\n    temp_df.columns = [\n        \"序号\",\n        \"交易日期\",\n        \"证券代码\",\n        \"-\",\n        \"证券简称\",\n        \"涨跌幅\",\n        \"收盘价\",\n        \"成交价\",\n        \"折溢率\",\n        \"成交笔数\",\n        \"成交总量\",\n        \"成交总额\",\n        \"成交总额/流通市值\",\n        \"_\",\n        \"_\",\n        \"_\",\n        \"_\",\n    ]\n    temp_df[\"交易日期\"] = pd.to_datetime(temp_df[\"交易日期\"]).dt.date\n    temp_df = temp_df[[\n        \"序号\",\n        \"交易日期\",\n        \"证券代码\",\n        \"证券简称\",\n        \"收盘价\",\n        \"涨跌幅\",\n        \"成交价\",\n        \"折溢率\",\n        \"成交笔数\",\n        \"成交总量\",\n        \"成交总额\",\n        \"成交总额/流通市值\",\n    ]]\n    temp_df['涨跌幅'] = pd.to_numeric(temp_df['涨跌幅'])\n    temp_df['收盘价'] = pd.to_numeric(temp_df['收盘价'])\n    temp_df['成交价'] = pd.to_numeric(temp_df['成交价'])\n    temp_df['折溢率'] = pd.to_numeric(temp_df['折溢率'])\n    temp_df['成交笔数'] = pd.to_numeric(temp_df['成交笔数'])\n    temp_df['成交总量'] = pd.to_numeric(temp_df['成交总量'])\n    temp_df['成交总额'] = pd.to_numeric(temp_df['成交总额'])\n    temp_df['成交总额/流通市值'] = pd.to_numeric(temp_df['成交总额/流通市值'])\n    return temp_df\n\n\ndef stock_dzjy_hygtj(symbol: str = '近三月') -> pd.DataFrame:\n    \"\"\"\n    东方财富网-数据中心-大宗交易-活跃 A 股统计\n    http://data.eastmoney.com/dzjy/dzjy_hygtj.aspx\n    :param symbol: choice of {'近一月', '近三月', '近六月', '近一年'}\n    :type symbol: str\n    :return: 活跃 A 股统计\n    :rtype: pandas.DataFrame\n    \"\"\"\n    period_map = {\n        '近一月': '1',\n        '近三月': '3',\n        '近六月': '6',\n        '近一年': '12',\n    }\n    url = \"https://datacenter-web.eastmoney.com/api/data/v1/get\"\n    params = {\n        'sortColumns': 'DEAL_NUM,SECURITY_CODE',\n        'sortTypes': '-1,-1',\n        'pageSize': '5000',\n        'pageNumber': '1',\n        'reportName': 'RPT_BLOCKTRADE_ACSTA',\n        'columns': 'SECURITY_CODE,SECUCODE,SECURITY_NAME_ABBR,CLOSE_PRICE,CHANGE_RATE,TRADE_DATE,DEAL_AMT,PREMIUM_RATIO,SUM_TURNOVERRATE,DEAL_NUM,PREMIUM_TIMES,DISCOUNT_TIMES,D1_AVG_ADJCHRATE,D5_AVG_ADJCHRATE,D10_AVG_ADJCHRATE,D20_AVG_ADJCHRATE,DATE_TYPE_CODE',\n        'source': 'WEB',\n        'client': 'WEB',\n        'filter': f'(DATE_TYPE_CODE={period_map[symbol]})',\n    }\n    r = fetcher.make_request(url, params=params)\n    data_json = r.json()\n    total_page = data_json['result'][\"pages\"]\n    big_df = pd.DataFrame()\n    for page in range(1, int(total_page)+1):\n        # 添加随机延迟，避免爬取过快\n        time.sleep(random.uniform(1, 1.5))\n        params.update({\"pageNumber\": page})\n        r = fetcher.make_request(url, params=params)\n        data_json = r.json()\n        temp_df = pd.DataFrame(data_json['result'][\"data\"])\n        big_df = pd.concat([big_df, temp_df], ignore_index=True)\n\n    big_df.reset_index(inplace=True)\n    big_df['index'] = big_df.index + 1\n    big_df.columns = [\n        \"序号\",\n        \"证券代码\",\n        \"_\",\n        \"证券简称\",\n        \"最新价\",\n        \"涨跌幅\",\n        \"最近上榜日\",\n        \"总成交额\",\n        \"折溢率\",\n        \"成交总额/流通市值\",\n        \"上榜次数-总计\",\n        \"上榜次数-溢价\",\n        \"上榜次数-折价\",\n        \"上榜日后平均涨跌幅-1日\",\n        \"上榜日后平均涨跌幅-5日\",\n        \"上榜日后平均涨跌幅-10日\",\n        \"上榜日后平均涨跌幅-20日\",\n        \"_\",\n    ]\n    big_df = big_df[[\n        \"序号\",\n        \"证券代码\",\n        \"证券简称\",\n        \"最新价\",\n        \"涨跌幅\",\n        \"最近上榜日\",\n        \"上榜次数-总计\",\n        \"上榜次数-溢价\",\n        \"上榜次数-折价\",\n        \"总成交额\",\n        \"折溢率\",\n        \"成交总额/流通市值\",\n        \"上榜日后平均涨跌幅-1日\",\n        \"上榜日后平均涨跌幅-5日\",\n        \"上榜日后平均涨跌幅-10日\",\n        \"上榜日后平均涨跌幅-20日\",\n    ]]\n    big_df[\"最近上榜日\"] = pd.to_datetime(big_df[\"最近上榜日\"]).dt.date\n    big_df[\"最新价\"] = pd.to_numeric(big_df[\"最新价\"])\n    big_df[\"涨跌幅\"] = pd.to_numeric(big_df[\"涨跌幅\"])\n    big_df[\"上榜次数-总计\"] = pd.to_numeric(big_df[\"上榜次数-总计\"])\n    big_df[\"上榜次数-溢价\"] = pd.to_numeric(big_df[\"上榜次数-溢价\"])\n    big_df[\"上榜次数-折价\"] = pd.to_numeric(big_df[\"上榜次数-折价\"])\n    big_df[\"总成交额\"] = pd.to_numeric(big_df[\"总成交额\"])\n    big_df[\"折溢率\"] = pd.to_numeric(big_df[\"折溢率\"])\n    big_df[\"成交总额/流通市值\"] = pd.to_numeric(big_df[\"成交总额/流通市值\"])\n    big_df[\"上榜日后平均涨跌幅-1日\"] = pd.to_numeric(big_df[\"上榜日后平均涨跌幅-1日\"])\n    big_df[\"上榜日后平均涨跌幅-5日\"] = pd.to_numeric(big_df[\"上榜日后平均涨跌幅-5日\"])\n    big_df[\"上榜日后平均涨跌幅-10日\"] = pd.to_numeric(big_df[\"上榜日后平均涨跌幅-10日\"])\n    big_df[\"上榜日后平均涨跌幅-20日\"] = pd.to_numeric(big_df[\"上榜日后平均涨跌幅-20日\"])\n    return big_df\n\n\ndef stock_dzjy_hyyybtj(symbol: str = '近3日') -> pd.DataFrame:\n    \"\"\"\n    东方财富网-数据中心-大宗交易-活跃营业部统计\n    https://data.eastmoney.com/dzjy/dzjy_hyyybtj.html\n    :param symbol: choice of {'当前交易日', '近3日', '近5日', '近10日', '近30日'}\n    :type symbol: str\n    :return: 活跃营业部统计\n    :rtype: pandas.DataFrame\n    \"\"\"\n    period_map = {\n        '当前交易日': '1',\n        '近3日': '3',\n        '近5日': '5',\n        '近10日': '10',\n        '近30日': '30',\n    }\n    url = \"https://datacenter-web.eastmoney.com/api/data/v1/get\"\n    params = {\n        'sortColumns': 'BUYER_NUM,TOTAL_BUYAMT',\n        'sortTypes': '-1,-1',\n        'pageSize': '5000',\n        'pageNumber': '1',\n        'reportName': 'RPT_BLOCKTRADE_OPERATEDEPTSTATISTICS',\n        'columns': 'OPERATEDEPT_CODE,OPERATEDEPT_NAME,ONLIST_DATE,STOCK_DETAILS,BUYER_NUM,SELLER_NUM,TOTAL_BUYAMT,TOTAL_SELLAMT,TOTAL_NETAMT,N_DATE',\n        'source': 'WEB',\n        'client': 'WEB',\n        'filter': f'(N_DATE=-{period_map[symbol]})',\n    }\n    r = fetcher.make_request(url, params=params)\n    data_json = r.json()\n    total_page = data_json['result'][\"pages\"]\n    big_df = pd.DataFrame()\n    for page in range(1, int(total_page)+1):\n        # 添加随机延迟，避免爬取过快\n        time.sleep(random.uniform(1, 1.5))\n        params.update({\"pageNumber\": page})\n        r = fetcher.make_request(url, params=params)\n        data_json = r.json()\n        temp_df = pd.DataFrame(data_json['result'][\"data\"])\n        big_df = pd.concat([big_df, temp_df], ignore_index=True)\n\n    big_df.reset_index(inplace=True)\n    big_df['index'] = big_df.index + 1\n    big_df.columns = [\n        \"序号\",\n        \"_\",\n        \"营业部名称\",\n        \"最近上榜日\",\n        \"买入的股票\",\n        \"次数总计-买入\",\n        \"次数总计-卖出\",\n        \"成交金额统计-买入\",\n        \"成交金额统计-卖出\",\n        \"成交金额统计-净买入额\",\n        \"_\",\n    ]\n    big_df = big_df[[\n        \"序号\",\n        \"最近上榜日\",\n        \"营业部名称\",\n        \"次数总计-买入\",\n        \"次数总计-卖出\",\n        \"成交金额统计-买入\",\n        \"成交金额统计-卖出\",\n        \"成交金额统计-净买入额\",\n        \"买入的股票\",\n    ]]\n    big_df[\"最近上榜日\"] = pd.to_datetime(big_df[\"最近上榜日\"]).dt.date\n    big_df[\"次数总计-买入\"] = pd.to_numeric(big_df[\"次数总计-买入\"])\n    big_df[\"次数总计-卖出\"] = pd.to_numeric(big_df[\"次数总计-卖出\"])\n    big_df[\"成交金额统计-买入\"] = pd.to_numeric(big_df[\"成交金额统计-买入\"])\n    big_df[\"成交金额统计-卖出\"] = pd.to_numeric(big_df[\"成交金额统计-卖出\"])\n    big_df[\"成交金额统计-净买入额\"] = pd.to_numeric(big_df[\"成交金额统计-净买入额\"])\n    return big_df\n\n\ndef stock_dzjy_yybph(symbol: str = '近三月') -> pd.DataFrame:\n    \"\"\"\n    东方财富网-数据中心-大宗交易-营业部排行\n    http://data.eastmoney.com/dzjy/dzjy_yybph.aspx\n    :param symbol: choice of {'近一月', '近三月', '近六月', '近一年'}\n    :type symbol: str\n    :return: 营业部排行\n    :rtype: pandas.DataFrame\n    \"\"\"\n    period_map = {\n        '近一月': '30',\n        '近三月': '90',\n        '近六月': '120',\n        '近一年': '360',\n    }\n    url = \"https://datacenter-web.eastmoney.com/api/data/v1/get\"\n    params = {\n        'sortColumns': 'D5_BUYER_NUM,D1_AVERAGE_INCREASE',\n        'sortTypes': '-1,-1',\n        'pageSize': '5000',\n        'pageNumber': '1',\n        'reportName': 'RPT_BLOCKTRADE_OPERATEDEPT_RANK',\n        'columns': 'OPERATEDEPT_CODE,OPERATEDEPT_NAME,D1_BUYER_NUM,D1_AVERAGE_INCREASE,D1_RISE_PROBABILITY,D5_BUYER_NUM,D5_AVERAGE_INCREASE,D5_RISE_PROBABILITY,D10_BUYER_NUM,D10_AVERAGE_INCREASE,D10_RISE_PROBABILITY,D20_BUYER_NUM,D20_AVERAGE_INCREASE,D20_RISE_PROBABILITY,N_DATE,RELATED_ORG_CODE',\n        'source': 'WEB',\n        'client': 'WEB',\n        'filter': f'(N_DATE=-{period_map[symbol]})',\n    }\n    r = fetcher.make_request(url, params=params)\n    data_json = r.json()\n    total_page = data_json['result'][\"pages\"]\n    big_df = pd.DataFrame()\n    for page in range(1, int(total_page)+1):\n        # 添加随机延迟，避免爬取过快\n        time.sleep(random.uniform(1, 1.5))\n        params.update({\"pageNumber\": page})\n        r = fetcher.make_request(url, params=params)\n        data_json = r.json()\n        temp_df = pd.DataFrame(data_json['result'][\"data\"])\n        big_df = pd.concat([big_df, temp_df], ignore_index=True)\n\n    big_df.reset_index(inplace=True)\n    big_df['index'] = big_df.index + 1\n    big_df.columns = [\n        \"序号\",\n        \"_\",\n        \"营业部名称\",\n        \"上榜后1天-买入次数\",\n        \"上榜后1天-平均涨幅\",\n        \"上榜后1天-上涨概率\",\n        \"上榜后5天-买入次数\",\n        \"上榜后5天-平均涨幅\",\n        \"上榜后5天-上涨概率\",\n        \"上榜后10天-买入次数\",\n        \"上榜后10天-平均涨幅\",\n        \"上榜后10天-上涨概率\",\n        \"上榜后20天-买入次数\",\n        \"上榜后20天-平均涨幅\",\n        \"上榜后20天-上涨概率\",\n        \"_\",\n        \"_\",\n    ]\n    big_df = big_df[[\n        \"序号\",\n        \"营业部名称\",\n        \"上榜后1天-买入次数\",\n        \"上榜后1天-平均涨幅\",\n        \"上榜后1天-上涨概率\",\n        \"上榜后5天-买入次数\",\n        \"上榜后5天-平均涨幅\",\n        \"上榜后5天-上涨概率\",\n        \"上榜后10天-买入次数\",\n        \"上榜后10天-平均涨幅\",\n        \"上榜后10天-上涨概率\",\n        \"上榜后20天-买入次数\",\n        \"上榜后20天-平均涨幅\",\n        \"上榜后20天-上涨概率\",\n    ]]\n    big_df['上榜后1天-买入次数'] = pd.to_numeric(big_df['上榜后1天-买入次数'])\n    big_df['上榜后1天-平均涨幅'] = pd.to_numeric(big_df['上榜后1天-平均涨幅'])\n    big_df['上榜后1天-上涨概率'] = pd.to_numeric(big_df['上榜后1天-上涨概率'])\n    big_df['上榜后5天-买入次数'] = pd.to_numeric(big_df['上榜后5天-买入次数'])\n    big_df['上榜后5天-平均涨幅'] = pd.to_numeric(big_df['上榜后5天-平均涨幅'])\n    big_df['上榜后5天-上涨概率'] = pd.to_numeric(big_df['上榜后5天-上涨概率'])\n    big_df['上榜后10天-买入次数'] = pd.to_numeric(big_df['上榜后10天-买入次数'])\n    big_df['上榜后10天-平均涨幅'] = pd.to_numeric(big_df['上榜后10天-平均涨幅'])\n    big_df['上榜后10天-上涨概率'] = pd.to_numeric(big_df['上榜后10天-上涨概率'])\n    big_df['上榜后20天-买入次数'] = pd.to_numeric(big_df['上榜后20天-买入次数'])\n    big_df['上榜后20天-平均涨幅'] = pd.to_numeric(big_df['上榜后20天-平均涨幅'])\n    big_df['上榜后20天-上涨概率'] = pd.to_numeric(big_df['上榜后20天-上涨概率'])\n    return big_df\n\n\nif __name__ == \"__main__\":\n    stock_dzjy_sctj_df = stock_dzjy_sctj()\n    print(stock_dzjy_sctj_df)\n\n    stock_dzjy_mrmx_df = stock_dzjy_mrmx(symbol='债券', start_date='20201204', end_date='20201204')\n    print(stock_dzjy_mrmx_df)\n\n    stock_dzjy_mrtj_df = stock_dzjy_mrtj(start_date='20201204', end_date='20201204')\n    print(stock_dzjy_mrtj_df)\n\n    stock_dzjy_hygtj_df = stock_dzjy_hygtj(symbol='近三月')\n    print(stock_dzjy_hygtj_df)\n\n    stock_dzjy_hyyybtj_df = stock_dzjy_hyyybtj(symbol='近3日')\n    print(stock_dzjy_hyyybtj_df)\n\n    stock_dzjy_yybph_df = stock_dzjy_yybph(symbol='近三月')\n    print(stock_dzjy_yybph_df)\n"
  },
  {
    "path": "instock/core/crawling/stock_fhps_em.py",
    "content": "#!/usr/bin/env python\n# -*- coding:utf-8 -*-\n\"\"\"\nDate: 2023/4/7 15:22\nDesc: 东方财富网-数据中心-年报季报-分红送配\nhttps://data.eastmoney.com/yjfp/\n\"\"\"\nimport random\nimport time\n\nimport pandas as pd\nfrom tqdm import tqdm\nfrom instock.core.eastmoney_fetcher import eastmoney_fetcher\n\n__author__ = 'myh '\n__date__ = '2025/12/31 '\n\n# 创建全局实例，供所有函数使用\nfetcher = eastmoney_fetcher()\n\ndef stock_fhps_em(date: str = \"20231231\") -> pd.DataFrame:\n    \"\"\"\n    东方财富网-数据中心-年报季报-分红送配\n    https://data.eastmoney.com/yjfp/\n    :param date: 分红送配报告期\n    :type date: str\n    :return: 分红送配\n    :rtype: pandas.DataFrame\n    \"\"\"\n    import warnings\n\n    warnings.simplefilter(action=\"ignore\", category=FutureWarning)\n\n    url = \"https://datacenter-web.eastmoney.com/api/data/v1/get\"\n    params = {\n        \"sortColumns\": \"PLAN_NOTICE_DATE\",\n        \"sortTypes\": \"-1\",\n        \"pageSize\": \"500\",\n        \"pageNumber\": \"1\",\n        \"reportName\": \"RPT_SHAREBONUS_DET\",\n        \"columns\": \"ALL\",\n        \"quoteColumns\": \"\",\n        \"js\": '{\"data\":(x),\"pages\":(tp)}',\n        \"source\": \"WEB\",\n        \"client\": \"WEB\",\n        \"filter\": f\"\"\"(REPORT_DATE='{\"-\".join([date[:4], date[4:6], date[6:]])}')\"\"\",\n    }\n\n    r = fetcher.make_request(url, params=params)\n    data_json = r.json()\n    total_pages = int(data_json[\"result\"][\"pages\"])\n    big_df = pd.DataFrame()\n    for page in tqdm(range(1, total_pages + 1), leave=False):\n        # 添加随机延迟，避免爬取过快\n        time.sleep(random.uniform(1, 1.5))\n        params.update({\"pageNumber\": page})\n        r = fetcher.make_request(url, params=params)\n        data_json = r.json()\n        temp_df = pd.DataFrame(data_json[\"result\"][\"data\"])\n        if not temp_df.empty:\n            big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)\n\n    big_df.columns = [\n        \"_\",\n        \"名称\",\n        \"_\",\n        \"_\",\n        \"代码\",\n        \"送转股份-送转总比例\",\n        \"送转股份-送转比例\",\n        \"送转股份-转股比例\",\n        \"现金分红-现金分红比例\",\n        \"预案公告日\",\n        \"股权登记日\",\n        \"除权除息日\",\n        \"_\",\n        \"方案进度\",\n        \"_\",\n        \"最新公告日期\",\n        \"_\",\n        \"_\",\n        \"_\",\n        \"每股收益\",\n        \"每股净资产\",\n        \"每股公积金\",\n        \"每股未分配利润\",\n        \"净利润同比增长\",\n        \"总股本\",\n        \"_\",\n        \"现金分红-股息率\",\n        \"-\",\n        \"-\",\n        \"-\",\n    ]\n    big_df = big_df[\n        [\n            \"代码\",\n            \"名称\",\n            \"送转股份-送转总比例\",\n            \"送转股份-送转比例\",\n            \"送转股份-转股比例\",\n            \"现金分红-现金分红比例\",\n            \"现金分红-股息率\",\n            \"每股收益\",\n            \"每股净资产\",\n            \"每股公积金\",\n            \"每股未分配利润\",\n            \"净利润同比增长\",\n            \"总股本\",\n            \"预案公告日\",\n            \"股权登记日\",\n            \"除权除息日\",\n            \"方案进度\",\n            \"最新公告日期\",\n        ]\n    ]\n    big_df[\"送转股份-送转总比例\"] = pd.to_numeric(\n        big_df[\"送转股份-送转总比例\"], errors=\"coerce\"\n    )\n    big_df[\"送转股份-送转比例\"] = pd.to_numeric(\n        big_df[\"送转股份-送转比例\"], errors=\"coerce\"\n    )\n    big_df[\"送转股份-转股比例\"] = pd.to_numeric(\n        big_df[\"送转股份-转股比例\"], errors=\"coerce\"\n    )\n    big_df[\"现金分红-现金分红比例\"] = pd.to_numeric(\n        big_df[\"现金分红-现金分红比例\"], errors=\"coerce\"\n    )\n    big_df[\"现金分红-股息率\"] = pd.to_numeric(\n        big_df[\"现金分红-股息率\"], errors=\"coerce\"\n    )\n    big_df[\"每股收益\"] = pd.to_numeric(big_df[\"每股收益\"], errors=\"coerce\")\n    big_df[\"每股净资产\"] = pd.to_numeric(big_df[\"每股净资产\"], errors=\"coerce\")\n    big_df[\"每股公积金\"] = pd.to_numeric(big_df[\"每股公积金\"], errors=\"coerce\")\n    big_df[\"每股未分配利润\"] = pd.to_numeric(big_df[\"每股未分配利润\"], errors=\"coerce\")\n    big_df[\"净利润同比增长\"] = pd.to_numeric(big_df[\"净利润同比增长\"], errors=\"coerce\")\n    big_df[\"总股本\"] = pd.to_numeric(big_df[\"总股本\"], errors=\"coerce\")\n\n    big_df[\"预案公告日\"] = pd.to_datetime(big_df[\"预案公告日\"], errors=\"coerce\").dt.date\n    big_df[\"股权登记日\"] = pd.to_datetime(big_df[\"股权登记日\"], errors=\"coerce\").dt.date\n    big_df[\"除权除息日\"] = pd.to_datetime(big_df[\"除权除息日\"], errors=\"coerce\").dt.date\n    big_df[\"最新公告日期\"] = pd.to_datetime(\n        big_df[\"最新公告日期\"], errors=\"coerce\"\n    ).dt.date\n    big_df.sort_values([\"最新公告日期\"], inplace=True, ignore_index=True)\n    return big_df\n\n\nif __name__ == \"__main__\":\n    stock_fhps_em_df = stock_fhps_em(date=\"20221231\")\n    print(stock_fhps_em_df)\n"
  },
  {
    "path": "instock/core/crawling/stock_fund_em.py",
    "content": "#!/usr/bin/env python\n# -*- coding:utf-8 -*-\n\"\"\"\nDate: 2023/5/16 15:30\nDesc: 东方财富网-数据中心-资金流向\nhttps://data.eastmoney.com/zjlx/detail.html\n\"\"\"\nimport json\nimport random\nimport time\nimport math\nimport pandas as pd\nfrom instock.core.eastmoney_fetcher import eastmoney_fetcher\n\n__author__ = 'myh '\n__date__ = '2025/12/31 '\n\n# 创建全局实例，供所有函数使用\nfetcher = eastmoney_fetcher()\n\ndef stock_individual_fund_flow_rank(indicator: str = \"5日\") -> pd.DataFrame:\n    \"\"\"\n    东方财富网-数据中心-资金流向-排名\n    https://data.eastmoney.com/zjlx/detail.html\n    :param indicator: choice of {\"今日\", \"3日\", \"5日\", \"10日\"}\n    :type indicator: str\n    :return: 指定 indicator 资金流向排行\n    :rtype: pandas.DataFrame\n    \"\"\"\n    indicator_map = {\n        \"今日\": [\n            \"f62\",\n            \"f12,f14,f2,f3,f62,f184,f66,f69,f72,f75,f78,f81,f84,f87,f204,f205,f124\",\n        ],\n        \"3日\": [\n            \"f267\",\n            \"f12,f14,f2,f127,f267,f268,f269,f270,f271,f272,f273,f274,f275,f276,f257,f258,f124\",\n        ],\n        \"5日\": [\n            \"f164\",\n            \"f12,f14,f2,f109,f164,f165,f166,f167,f168,f169,f170,f171,f172,f173,f257,f258,f124\",\n        ],\n        \"10日\": [\n            \"f174\",\n            \"f12,f14,f2,f160,f174,f175,f176,f177,f178,f179,f180,f181,f182,f183,f260,f261,f124\",\n        ],\n    }\n    url = \"http://push2.eastmoney.com/api/qt/clist/get\"\n    page_size = 50\n    page_current = 1\n    params = {\n        \"fid\": indicator_map[indicator][0],\n        \"po\": \"1\",\n        \"pz\": page_size,\n        \"pn\": page_current,\n        \"np\": \"1\",\n        \"fltt\": \"2\",\n        \"invt\": \"2\",\n        \"ut\": \"b2884a393a59ad64002292a3e90d46a5\",\n        \"fs\": \"m:0+t:6+f:!2,m:0+t:13+f:!2,m:0+t:80+f:!2,m:1+t:2+f:!2,m:1+t:23+f:!2,m:0+t:7+f:!2,m:1+t:3+f:!2\",\n        \"fields\": indicator_map[indicator][1],\n    }\n    r = fetcher.make_request(url, params=params)\n    data_json = r.json()\n    data = data_json[\"data\"][\"diff\"]\n    data_count = data_json[\"data\"][\"total\"]\n    page_count = math.ceil(data_count/page_size)\n    while page_count > 1:\n        # 添加随机延迟，避免爬取过快\n        time.sleep(random.uniform(1, 1.5))\n        page_current = page_current + 1\n        params[\"pn\"] = page_current\n        r = fetcher.make_request(url, params=params)\n        data_json = r.json()\n        _data = data_json[\"data\"][\"diff\"]\n        data.extend(_data)\n        page_count =page_count - 1\n\n    temp_df = pd.DataFrame(data)\n    temp_df = temp_df[~temp_df[\"f2\"].isin([\"-\"])]\n    if indicator == \"今日\":\n        temp_df.columns = [\n            \"最新价\",\n            \"今日涨跌幅\",\n            \"代码\",\n            \"名称\",\n            \"今日主力净流入-净额\",\n            \"今日超大单净流入-净额\",\n            \"今日超大单净流入-净占比\",\n            \"今日大单净流入-净额\",\n            \"今日大单净流入-净占比\",\n            \"今日中单净流入-净额\",\n            \"今日中单净流入-净占比\",\n            \"今日小单净流入-净额\",\n            \"今日小单净流入-净占比\",\n            \"_\",\n            \"今日主力净流入-净占比\",\n            \"_\",\n            \"_\",\n            \"_\",\n        ]\n        temp_df = temp_df[\n            [\n                \"代码\",\n                \"名称\",\n                \"最新价\",\n                \"今日涨跌幅\",\n                \"今日主力净流入-净额\",\n                \"今日主力净流入-净占比\",\n                \"今日超大单净流入-净额\",\n                \"今日超大单净流入-净占比\",\n                \"今日大单净流入-净额\",\n                \"今日大单净流入-净占比\",\n                \"今日中单净流入-净额\",\n                \"今日中单净流入-净占比\",\n                \"今日小单净流入-净额\",\n                \"今日小单净流入-净占比\",\n            ]\n        ]\n    elif indicator == \"3日\":\n        temp_df.columns = [\n            \"最新价\",\n            \"代码\",\n            \"名称\",\n            \"_\",\n            \"3日涨跌幅\",\n            \"_\",\n            \"_\",\n            \"_\",\n            \"3日主力净流入-净额\",\n            \"3日主力净流入-净占比\",\n            \"3日超大单净流入-净额\",\n            \"3日超大单净流入-净占比\",\n            \"3日大单净流入-净额\",\n            \"3日大单净流入-净占比\",\n            \"3日中单净流入-净额\",\n            \"3日中单净流入-净占比\",\n            \"3日小单净流入-净额\",\n            \"3日小单净流入-净占比\",\n        ]\n        temp_df = temp_df[\n            [\n                \"代码\",\n                \"名称\",\n                \"最新价\",\n                \"3日涨跌幅\",\n                \"3日主力净流入-净额\",\n                \"3日主力净流入-净占比\",\n                \"3日超大单净流入-净额\",\n                \"3日超大单净流入-净占比\",\n                \"3日大单净流入-净额\",\n                \"3日大单净流入-净占比\",\n                \"3日中单净流入-净额\",\n                \"3日中单净流入-净占比\",\n                \"3日小单净流入-净额\",\n                \"3日小单净流入-净占比\",\n            ]\n        ]\n    elif indicator == \"5日\":\n        temp_df.columns = [\n            \"最新价\",\n            \"代码\",\n            \"名称\",\n            \"5日涨跌幅\",\n            \"_\",\n            \"5日主力净流入-净额\",\n            \"5日主力净流入-净占比\",\n            \"5日超大单净流入-净额\",\n            \"5日超大单净流入-净占比\",\n            \"5日大单净流入-净额\",\n            \"5日大单净流入-净占比\",\n            \"5日中单净流入-净额\",\n            \"5日中单净流入-净占比\",\n            \"5日小单净流入-净额\",\n            \"5日小单净流入-净占比\",\n            \"_\",\n            \"_\",\n            \"_\",\n        ]\n        temp_df = temp_df[\n            [\n                \"代码\",\n                \"名称\",\n                \"最新价\",\n                \"5日涨跌幅\",\n                \"5日主力净流入-净额\",\n                \"5日主力净流入-净占比\",\n                \"5日超大单净流入-净额\",\n                \"5日超大单净流入-净占比\",\n                \"5日大单净流入-净额\",\n                \"5日大单净流入-净占比\",\n                \"5日中单净流入-净额\",\n                \"5日中单净流入-净占比\",\n                \"5日小单净流入-净额\",\n                \"5日小单净流入-净占比\",\n            ]\n        ]\n    elif indicator == \"10日\":\n        temp_df.columns = [\n            \"最新价\",\n            \"代码\",\n            \"名称\",\n            \"_\",\n            \"10日涨跌幅\",\n            \"10日主力净流入-净额\",\n            \"10日主力净流入-净占比\",\n            \"10日超大单净流入-净额\",\n            \"10日超大单净流入-净占比\",\n            \"10日大单净流入-净额\",\n            \"10日大单净流入-净占比\",\n            \"10日中单净流入-净额\",\n            \"10日中单净流入-净占比\",\n            \"10日小单净流入-净额\",\n            \"10日小单净流入-净占比\",\n            \"_\",\n            \"_\",\n            \"_\",\n        ]\n        temp_df = temp_df[\n            [\n                \"代码\",\n                \"名称\",\n                \"最新价\",\n                \"10日涨跌幅\",\n                \"10日主力净流入-净额\",\n                \"10日主力净流入-净占比\",\n                \"10日超大单净流入-净额\",\n                \"10日超大单净流入-净占比\",\n                \"10日大单净流入-净额\",\n                \"10日大单净流入-净占比\",\n                \"10日中单净流入-净额\",\n                \"10日中单净流入-净占比\",\n                \"10日小单净流入-净额\",\n                \"10日小单净流入-净占比\",\n            ]\n        ]\n        # temp_df['最新价'] = pd.to_numeric(temp_df['最新价'], errors=\"coerce\").fillna(0)\n    return temp_df\n\n\ndef stock_sector_fund_flow_rank(\n    indicator: str = \"10日\", sector_type: str = \"行业资金流\"\n) -> pd.DataFrame:\n    \"\"\"\n    东方财富网-数据中心-资金流向-板块资金流-排名\n    https://data.eastmoney.com/bkzj/hy.html\n    :param indicator: choice of {\"今日\", \"5日\", \"10日\"}\n    :type indicator: str\n    :param sector_type: choice of {\"行业资金流\", \"概念资金流\", \"地域资金流\"}\n    :type sector_type: str\n    :return: 指定参数的资金流排名数据\n    :rtype: pandas.DataFrame\n    \"\"\"\n    sector_type_map = {\"行业资金流\": \"2\", \"概念资金流\": \"3\", \"地域资金流\": \"1\"}\n    indicator_map = {\n        \"今日\": [\n            \"f62\",\n            \"1\",\n            \"f12,f14,f2,f3,f62,f184,f66,f69,f72,f75,f78,f81,f84,f87,f204,f205,f124\",\n        ],\n        \"5日\": [\n            \"f164\",\n            \"5\",\n            \"f12,f14,f2,f109,f164,f165,f166,f167,f168,f169,f170,f171,f172,f173,f257,f258,f124\",\n        ],\n        \"10日\": [\n            \"f174\",\n            \"10\",\n            \"f12,f14,f2,f160,f174,f175,f176,f177,f178,f179,f180,f181,f182,f183,f260,f261,f124\",\n        ],\n    }\n    url = \"http://push2.eastmoney.com/api/qt/clist/get\"\n    page_size = 50\n    page_current = 1\n    params = {\n        \"pn\": page_current,\n        \"pz\": page_size,\n        \"po\": \"1\",\n        \"np\": \"1\",\n        \"ut\": \"b2884a393a59ad64002292a3e90d46a5\",\n        \"fltt\": \"2\",\n        \"invt\": \"2\",\n        \"fid0\": indicator_map[indicator][0],\n        \"fs\": f\"m:90 t:{sector_type_map[sector_type]}\",\n        \"stat\": indicator_map[indicator][1],\n        \"fields\": indicator_map[indicator][2],\n        \"rt\": \"52975239\",\n        \"cb\": \"jQuery18308357908311220152_1589256588824\",\n        \"_\": int(time.time() * 1000),\n    }\n    r = fetcher.make_request(url, params=params)\n    text_data = r.text\n    data_json = json.loads(text_data[text_data.find(\"{\") : -2])\n    data = data_json[\"data\"][\"diff\"]\n\n    data_count = data_json[\"data\"][\"total\"]\n    page_count = math.ceil(data_count/page_size)\n    while page_count > 1:\n        # 添加随机延迟，避免爬取过快\n        time.sleep(random.uniform(1, 1.5))\n        page_current = page_current + 1\n        params[\"pn\"] = page_current\n        r = fetcher.make_request(url, params=params)\n        text_data = r.text\n        json_data = json.loads(text_data[text_data.find(\"{\"): -2])\n        _data = json_data[\"data\"][\"diff\"]\n        data.extend(_data)\n        page_count =page_count - 1\n\n    temp_df = pd.DataFrame(data)\n\n\n    temp_df = temp_df[~temp_df[\"f2\"].isin([\"-\"])]\n    if indicator == \"今日\":\n        temp_df.columns = [\n            \"-\",\n            \"今日涨跌幅\",\n            \"_\",\n            \"名称\",\n            \"今日主力净流入-净额\",\n            \"今日超大单净流入-净额\",\n            \"今日超大单净流入-净占比\",\n            \"今日大单净流入-净额\",\n            \"今日大单净流入-净占比\",\n            \"今日中单净流入-净额\",\n            \"今日中单净流入-净占比\",\n            \"今日小单净流入-净额\",\n            \"今日小单净流入-净占比\",\n            \"-\",\n            \"今日主力净流入-净占比\",\n            \"今日主力净流入最大股\",\n            \"今日主力净流入最大股代码\",\n            \"是否净流入\",\n        ]\n\n        temp_df = temp_df[\n            [\n                \"名称\",\n                \"今日涨跌幅\",\n                \"今日主力净流入-净额\",\n                \"今日主力净流入-净占比\",\n                \"今日超大单净流入-净额\",\n                \"今日超大单净流入-净占比\",\n                \"今日大单净流入-净额\",\n                \"今日大单净流入-净占比\",\n                \"今日中单净流入-净额\",\n                \"今日中单净流入-净占比\",\n                \"今日小单净流入-净额\",\n                \"今日小单净流入-净占比\",\n                \"今日主力净流入最大股\",\n            ]\n        ]\n    elif indicator == \"5日\":\n        temp_df.columns = [\n            \"-\",\n            \"_\",\n            \"名称\",\n            \"5日涨跌幅\",\n            \"_\",\n            \"5日主力净流入-净额\",\n            \"5日主力净流入-净占比\",\n            \"5日超大单净流入-净额\",\n            \"5日超大单净流入-净占比\",\n            \"5日大单净流入-净额\",\n            \"5日大单净流入-净占比\",\n            \"5日中单净流入-净额\",\n            \"5日中单净流入-净占比\",\n            \"5日小单净流入-净额\",\n            \"5日小单净流入-净占比\",\n            \"5日主力净流入最大股\",\n            \"_\",\n            \"_\",\n        ]\n\n        temp_df = temp_df[\n            [\n                \"名称\",\n                \"5日涨跌幅\",\n                \"5日主力净流入-净额\",\n                \"5日主力净流入-净占比\",\n                \"5日超大单净流入-净额\",\n                \"5日超大单净流入-净占比\",\n                \"5日大单净流入-净额\",\n                \"5日大单净流入-净占比\",\n                \"5日中单净流入-净额\",\n                \"5日中单净流入-净占比\",\n                \"5日小单净流入-净额\",\n                \"5日小单净流入-净占比\",\n                \"5日主力净流入最大股\",\n            ]\n        ]\n    elif indicator == \"10日\":\n        temp_df.columns = [\n            \"-\",\n            \"_\",\n            \"名称\",\n            \"_\",\n            \"10日涨跌幅\",\n            \"10日主力净流入-净额\",\n            \"10日主力净流入-净占比\",\n            \"10日超大单净流入-净额\",\n            \"10日超大单净流入-净占比\",\n            \"10日大单净流入-净额\",\n            \"10日大单净流入-净占比\",\n            \"10日中单净流入-净额\",\n            \"10日中单净流入-净占比\",\n            \"10日小单净流入-净额\",\n            \"10日小单净流入-净占比\",\n            \"10日主力净流入最大股\",\n            \"_\",\n            \"_\",\n        ]\n\n        temp_df = temp_df[\n            [\n                \"名称\",\n                \"10日涨跌幅\",\n                \"10日主力净流入-净额\",\n                \"10日主力净流入-净占比\",\n                \"10日超大单净流入-净额\",\n                \"10日超大单净流入-净占比\",\n                \"10日大单净流入-净额\",\n                \"10日大单净流入-净占比\",\n                \"10日中单净流入-净额\",\n                \"10日中单净流入-净占比\",\n                \"10日小单净流入-净额\",\n                \"10日小单净流入-净占比\",\n                \"10日主力净流入最大股\",\n            ]\n        ]\n\n    return temp_df\n\n\nif __name__ == \"__main__\":\n    stock_individual_fund_flow_rank_df = stock_individual_fund_flow_rank(indicator=\"今日\")\n    print(stock_individual_fund_flow_rank_df)\n\n    stock_individual_fund_flow_rank_df = stock_individual_fund_flow_rank(indicator=\"3日\")\n    print(stock_individual_fund_flow_rank_df)\n\n    stock_individual_fund_flow_rank_df = stock_individual_fund_flow_rank(indicator=\"5日\")\n    print(stock_individual_fund_flow_rank_df)\n\n    stock_individual_fund_flow_rank_df = stock_individual_fund_flow_rank(\n        indicator=\"10日\"\n    )\n    print(stock_individual_fund_flow_rank_df)\n\n    stock_sector_fund_flow_rank_df = stock_sector_fund_flow_rank(\n        indicator=\"5日\", sector_type=\"概念资金流\"\n    )\n    print(stock_sector_fund_flow_rank_df)\n\n    stock_sector_fund_flow_rank_df = stock_sector_fund_flow_rank(\n        indicator=\"今日\", sector_type=\"行业资金流\"\n    )\n    print(stock_sector_fund_flow_rank_df)\n"
  },
  {
    "path": "instock/core/crawling/stock_hist_em.py",
    "content": "#!/usr/bin/env python\n# -*- coding:utf-8 -*-\n\"\"\"\nDate: 2022/6/19 15:26\nDesc: 东方财富网-行情首页-沪深京 A 股\n\"\"\"\nimport random\nimport time\n\nimport pandas as pd\nimport math\nfrom functools import lru_cache\nfrom instock.core.eastmoney_fetcher import eastmoney_fetcher\n\n__author__ = 'myh '\n__date__ = '2025/12/31 '\n\n# 创建全局实例，供所有函数使用\nfetcher = eastmoney_fetcher()\n\ndef stock_zh_a_spot_em() -> pd.DataFrame:\n    \"\"\"\n    东方财富网-沪深京 A 股-实时行情\n    https://quote.eastmoney.com/center/gridlist.html#hs_a_board\n    :return: 实时行情\n    :rtype: pandas.DataFrame\n    \"\"\"\n    url = \"http://82.push2.eastmoney.com/api/qt/clist/get\"\n    page_size = 50\n    page_current = 1\n    params = {\n        \"pn\": page_current,\n        \"pz\": page_size,\n        \"po\": \"1\",\n        \"np\": \"1\",\n        \"ut\": \"bd1d9ddb04089700cf9c27f6f7426281\",\n        \"fltt\": \"2\",\n        \"invt\": \"2\",\n        \"fid\": \"f12\",\n        \"fs\": \"m:0 t:6,m:0 t:80,m:1 t:2,m:1 t:23,m:0 t:81 s:2048\",\n        \"fields\": \"f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f14,f15,f16,f17,f18,f20,f21,f22,f23,f24,f25,f26,f37,f38,f39,f40,f41,f45,f46,f48,f49,f57,f61,f100,f112,f113,f114,f115,f221\",\n        \"_\": \"1623833739532\",\n    }\n    r =  fetcher.make_request(url, params=params)\n    data_json = r.json()\n    data = data_json[\"data\"][\"diff\"]\n    if not data:\n        return pd.DataFrame()\n\n    data_count = data_json[\"data\"][\"total\"]\n    page_count = math.ceil(data_count/page_size)\n    while page_count > 1:\n        # 添加随机延迟，避免爬取过快\n        time.sleep(random.uniform(1, 1.5))\n        page_current = page_current + 1\n        params[\"pn\"] = page_current\n        r =  fetcher.make_request(url, params=params)\n        data_json = r.json()\n        _data = data_json[\"data\"][\"diff\"]\n        data.extend(_data)\n        page_count =page_count - 1\n\n    temp_df = pd.DataFrame(data)\n    temp_df.columns = [\n        \"最新价\",\n        \"涨跌幅\",\n        \"涨跌额\",\n        \"成交量\",\n        \"成交额\",\n        \"振幅\",\n        \"换手率\",\n        \"市盈率动\",\n        \"量比\",\n        \"5分钟涨跌\",\n        \"代码\",\n        \"名称\",\n        \"最高\",\n        \"最低\",\n        \"今开\",\n        \"昨收\",\n        \"总市值\",\n        \"流通市值\",\n        \"涨速\",\n        \"市净率\",\n        \"60日涨跌幅\",\n        \"年初至今涨跌幅\",\n        \"上市时间\",\n        \"加权净资产收益率\",\n        \"总股本\",\n        \"已流通股份\",\n        \"营业收入\",\n        \"营业收入同比增长\",\n        \"归属净利润\",\n        \"归属净利润同比增长\",\n        \"每股未分配利润\",\n        \"毛利率\",\n        \"资产负债率\",\n        \"每股公积金\",\n        \"所处行业\",\n        \"每股收益\",\n        \"每股净资产\",\n        \"市盈率静\",\n        \"市盈率TTM\",\n        \"报告期\"\n    ]\n    temp_df = temp_df[\n        [\n            \"代码\",\n            \"名称\",\n            \"最新价\",\n            \"涨跌幅\",\n            \"涨跌额\",\n            \"成交量\",\n            \"成交额\",\n            \"振幅\",\n            \"换手率\",\n            \"量比\",\n            \"今开\",\n            \"最高\",\n            \"最低\",\n            \"昨收\",\n            \"涨速\",\n            \"5分钟涨跌\",\n            \"60日涨跌幅\",\n            \"年初至今涨跌幅\",\n            \"市盈率动\",\n            \"市盈率TTM\",\n            \"市盈率静\",\n            \"市净率\",\n            \"每股收益\",\n            \"每股净资产\",\n            \"每股公积金\",\n            \"每股未分配利润\",\n            \"加权净资产收益率\",\n            \"毛利率\",\n            \"资产负债率\",\n            \"营业收入\",\n            \"营业收入同比增长\",\n            \"归属净利润\",\n            \"归属净利润同比增长\",\n            \"报告期\",\n            \"总股本\",\n            \"已流通股份\",\n            \"总市值\",\n            \"流通市值\",\n            \"所处行业\",\n            \"上市时间\"\n        ]\n    ]\n    temp_df[\"最新价\"] = pd.to_numeric(temp_df[\"最新价\"], errors=\"coerce\")\n    temp_df[\"涨跌幅\"] = pd.to_numeric(temp_df[\"涨跌幅\"], errors=\"coerce\")\n    temp_df[\"涨跌额\"] = pd.to_numeric(temp_df[\"涨跌额\"], errors=\"coerce\")\n    temp_df[\"成交量\"] = pd.to_numeric(temp_df[\"成交量\"], errors=\"coerce\")\n    temp_df[\"成交额\"] = pd.to_numeric(temp_df[\"成交额\"], errors=\"coerce\")\n    temp_df[\"振幅\"] = pd.to_numeric(temp_df[\"振幅\"], errors=\"coerce\")\n    temp_df[\"量比\"] = pd.to_numeric(temp_df[\"量比\"], errors=\"coerce\")\n    temp_df[\"换手率\"] = pd.to_numeric(temp_df[\"换手率\"], errors=\"coerce\")\n    temp_df[\"最高\"] = pd.to_numeric(temp_df[\"最高\"], errors=\"coerce\")\n    temp_df[\"最低\"] = pd.to_numeric(temp_df[\"最低\"], errors=\"coerce\")\n    temp_df[\"今开\"] = pd.to_numeric(temp_df[\"今开\"], errors=\"coerce\")\n    temp_df[\"昨收\"] = pd.to_numeric(temp_df[\"昨收\"], errors=\"coerce\")\n    temp_df[\"涨速\"] = pd.to_numeric(temp_df[\"涨速\"], errors=\"coerce\")\n    temp_df[\"5分钟涨跌\"] = pd.to_numeric(temp_df[\"5分钟涨跌\"], errors=\"coerce\")\n    temp_df[\"60日涨跌幅\"] = pd.to_numeric(temp_df[\"60日涨跌幅\"], errors=\"coerce\")\n    temp_df[\"年初至今涨跌幅\"] = pd.to_numeric(temp_df[\"年初至今涨跌幅\"], errors=\"coerce\")\n    temp_df[\"市盈率动\"] = pd.to_numeric(temp_df[\"市盈率动\"], errors=\"coerce\")\n    temp_df[\"市盈率TTM\"] = pd.to_numeric(temp_df[\"市盈率TTM\"], errors=\"coerce\")\n    temp_df[\"市盈率静\"] = pd.to_numeric(temp_df[\"市盈率静\"], errors=\"coerce\")\n    temp_df[\"市净率\"] = pd.to_numeric(temp_df[\"市净率\"], errors=\"coerce\")\n    temp_df[\"每股收益\"] = pd.to_numeric(temp_df[\"每股收益\"], errors=\"coerce\")\n    temp_df[\"每股净资产\"] = pd.to_numeric(temp_df[\"每股净资产\"], errors=\"coerce\")\n    temp_df[\"每股公积金\"] = pd.to_numeric(temp_df[\"每股公积金\"], errors=\"coerce\")\n    temp_df[\"每股未分配利润\"] = pd.to_numeric(temp_df[\"每股未分配利润\"], errors=\"coerce\")\n    temp_df[\"加权净资产收益率\"] = pd.to_numeric(temp_df[\"加权净资产收益率\"], errors=\"coerce\")\n    temp_df[\"毛利率\"] = pd.to_numeric(temp_df[\"毛利率\"], errors=\"coerce\")\n    temp_df[\"资产负债率\"] = pd.to_numeric(temp_df[\"资产负债率\"], errors=\"coerce\")\n    temp_df[\"营业收入\"] = pd.to_numeric(temp_df[\"营业收入\"], errors=\"coerce\")\n    temp_df[\"营业收入同比增长\"] = pd.to_numeric(temp_df[\"营业收入同比增长\"], errors=\"coerce\")\n    temp_df[\"归属净利润\"] = pd.to_numeric(temp_df[\"归属净利润\"], errors=\"coerce\")\n    temp_df[\"归属净利润同比增长\"] = pd.to_numeric(temp_df[\"归属净利润同比增长\"], errors=\"coerce\")\n    temp_df[\"报告期\"] = pd.to_datetime(temp_df[\"报告期\"], format='%Y%m%d', errors=\"coerce\")\n    temp_df[\"总股本\"] = pd.to_numeric(temp_df[\"总股本\"], errors=\"coerce\")\n    temp_df[\"已流通股份\"] = pd.to_numeric(temp_df[\"已流通股份\"], errors=\"coerce\")\n    temp_df[\"总市值\"] = pd.to_numeric(temp_df[\"总市值\"], errors=\"coerce\")\n    temp_df[\"流通市值\"] = pd.to_numeric(temp_df[\"流通市值\"], errors=\"coerce\")\n    temp_df[\"上市时间\"] = pd.to_datetime(temp_df[\"上市时间\"], format='%Y%m%d', errors=\"coerce\")\n\n    return temp_df\n\n\n@lru_cache()\ndef code_id_map_em() -> dict:\n    \"\"\"\n    东方财富-股票和市场代码\n    http://quote.eastmoney.com/center/gridlist.html#hs_a_board\n    :return: 股票和市场代码\n    :rtype: dict\n    \"\"\"\n    url = \"http://80.push2.eastmoney.com/api/qt/clist/get\"\n    page_size = 50\n    page_current = 1\n    params = {\n        \"pn\": page_current,\n        \"pz\": page_size,\n        \"po\": \"1\",\n        \"np\": \"1\",\n        \"ut\": \"bd1d9ddb04089700cf9c27f6f7426281\",\n        \"fltt\": \"2\",\n        \"invt\": \"2\",\n        \"fid\": \"f12\",\n        \"fs\": \"m:1 t:2,m:1 t:23\",\n        \"fields\": \"f12\",\n        \"_\": \"1623833739532\",\n    }\n    r =  fetcher.make_request(url, params=params)\n    data_json = r.json()\n    data = data_json[\"data\"][\"diff\"]\n    if not data:\n        return dict()\n\n    data_count = data_json[\"data\"][\"total\"]\n    page_count = math.ceil(data_count/page_size)\n    while page_count > 1:\n        # 添加随机延迟，避免爬取过快\n        time.sleep(random.uniform(1, 1.5))\n        page_current = page_current + 1\n        params[\"pn\"] = page_current\n        r =  fetcher.make_request(url, params=params)\n        data_json = r.json()\n        _data = data_json[\"data\"][\"diff\"]\n        data.extend(_data)\n        page_count =page_count - 1\n\n    temp_df = pd.DataFrame(data)\n    temp_df[\"market_id\"] = 1\n    temp_df.columns = [\"sh_code\", \"sh_id\"]\n    code_id_dict = dict(zip(temp_df[\"sh_code\"], temp_df[\"sh_id\"]))\n    page_current = 1\n    params = {\n        \"pn\": page_current,\n        \"pz\": page_size,\n        \"po\": \"1\",\n        \"np\": \"1\",\n        \"ut\": \"bd1d9ddb04089700cf9c27f6f7426281\",\n        \"fltt\": \"2\",\n        \"invt\": \"2\",\n        \"fid\": \"f12\",\n        \"fs\": \"m:0 t:6,m:0 t:80\",\n        \"fields\": \"f12\",\n        \"_\": \"1623833739532\",\n    }\n    r =  fetcher.make_request(url, params=params)\n    data_json = r.json()\n    data = data_json[\"data\"][\"diff\"]\n    if not data:\n        return dict()\n\n    data_count = data_json[\"data\"][\"total\"]\n    page_count = math.ceil(data_count/page_size)\n    while page_count > 1:\n        # 添加随机延迟，避免爬取过快\n        time.sleep(random.uniform(1, 1.5))\n        page_current = page_current + 1\n        params[\"pn\"] = page_current\n        r =  fetcher.make_request(url, params=params)\n        data_json = r.json()\n        _data = data_json[\"data\"][\"diff\"]\n        data.extend(_data)\n        page_count =page_count - 1\n\n    temp_df_sz = pd.DataFrame(data)\n    temp_df_sz[\"sz_id\"] = 0\n    code_id_dict.update(dict(zip(temp_df_sz[\"f12\"], temp_df_sz[\"sz_id\"])))\n    page_current = 1\n    params = {\n        \"pn\": page_current,\n        \"pz\": page_size,\n        \"po\": \"1\",\n        \"np\": \"1\",\n        \"ut\": \"bd1d9ddb04089700cf9c27f6f7426281\",\n        \"fltt\": \"2\",\n        \"invt\": \"2\",\n        \"fid\": \"f12\",\n        \"fs\": \"m:0 t:81 s:2048\",\n        \"fields\": \"f12\",\n        \"_\": \"1623833739532\",\n    }\n    r =  fetcher.make_request(url, params=params)\n    data_json = r.json()\n    data = data_json[\"data\"][\"diff\"]\n    if not data:\n        return dict()\n\n    data_count = data_json[\"data\"][\"total\"]\n    page_count = math.ceil(data_count/page_size)\n    while page_count > 1:\n        # 添加随机延迟，避免爬取过快\n        time.sleep(random.uniform(1, 1.5))\n        page_current = page_current + 1\n        params[\"pn\"] = page_current\n        r =  fetcher.make_request(url, params=params)\n        data_json = r.json()\n        _data = data_json[\"data\"][\"diff\"]\n        data.extend(_data)\n        page_count =page_count - 1\n\n    temp_df_sz = pd.DataFrame(data)\n    temp_df_sz[\"bj_id\"] = 0\n    code_id_dict.update(dict(zip(temp_df_sz[\"f12\"], temp_df_sz[\"bj_id\"])))\n    return code_id_dict\n\n\ndef stock_zh_a_hist(\n    symbol: str = \"000001\",\n    period: str = \"daily\",\n    start_date: str = \"19700101\",\n    end_date: str = \"20500101\",\n    adjust: str = \"\",\n) -> pd.DataFrame:\n    \"\"\"\n    东方财富网-行情首页-沪深京 A 股-每日行情\n    https://quote.eastmoney.com/concept/sh603777.html?from=classic\n    :param symbol: 股票代码\n    :type symbol: str\n    :param period: choice of {'daily', 'weekly', 'monthly'}\n    :type period: str\n    :param start_date: 开始日期\n    :type start_date: str\n    :param end_date: 结束日期\n    :type end_date: str\n    :param adjust: choice of {\"qfq\": \"前复权\", \"hfq\": \"后复权\", \"\": \"不复权\"}\n    :type adjust: str\n    :return: 每日行情\n    :rtype: pandas.DataFrame\n    \"\"\"\n    code_id_dict = code_id_map_em()\n    adjust_dict = {\"qfq\": \"1\", \"hfq\": \"2\", \"\": \"0\"}\n    period_dict = {\"daily\": \"101\", \"weekly\": \"102\", \"monthly\": \"103\"}\n    url = \"http://push2his.eastmoney.com/api/qt/stock/kline/get\"\n    params = {\n        \"fields1\": \"f1,f2,f3,f4,f5,f6\",\n        \"fields2\": \"f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61,f116\",\n        \"ut\": \"7eea3edcaed734bea9cbfc24409ed989\",\n        \"klt\": period_dict[period],\n        \"fqt\": adjust_dict[adjust],\n        \"secid\": f\"1.{symbol}\" if symbol.startswith('6') else f\"0.{symbol}\",\n        \"beg\": start_date,\n        \"end\": end_date,\n        \"_\": \"1623766962675\",\n    }\n    r =  fetcher.make_request(url, params=params)\n    data_json = r.json()\n    if not (data_json[\"data\"] and data_json[\"data\"][\"klines\"]):\n        return pd.DataFrame()\n    temp_df = pd.DataFrame(\n        [item.split(\",\") for item in data_json[\"data\"][\"klines\"]]\n    )\n    temp_df.columns = [\n        \"日期\",\n        \"开盘\",\n        \"收盘\",\n        \"最高\",\n        \"最低\",\n        \"成交量\",\n        \"成交额\",\n        \"振幅\",\n        \"涨跌幅\",\n        \"涨跌额\",\n        \"换手率\",\n    ]\n    temp_df.index = pd.to_datetime(temp_df[\"日期\"])\n    temp_df.reset_index(inplace=True, drop=True)\n\n    temp_df[\"开盘\"] = pd.to_numeric(temp_df[\"开盘\"])\n    temp_df[\"收盘\"] = pd.to_numeric(temp_df[\"收盘\"])\n    temp_df[\"最高\"] = pd.to_numeric(temp_df[\"最高\"])\n    temp_df[\"最低\"] = pd.to_numeric(temp_df[\"最低\"])\n    temp_df[\"成交量\"] = pd.to_numeric(temp_df[\"成交量\"])\n    temp_df[\"成交额\"] = pd.to_numeric(temp_df[\"成交额\"])\n    temp_df[\"振幅\"] = pd.to_numeric(temp_df[\"振幅\"])\n    temp_df[\"涨跌幅\"] = pd.to_numeric(temp_df[\"涨跌幅\"])\n    temp_df[\"涨跌额\"] = pd.to_numeric(temp_df[\"涨跌额\"])\n    temp_df[\"换手率\"] = pd.to_numeric(temp_df[\"换手率\"])\n\n    return temp_df\n\n\ndef stock_zh_a_hist_min_em(\n    symbol: str = \"000001\",\n    start_date: str = \"1979-09-01 09:32:00\",\n    end_date: str = \"2222-01-01 09:32:00\",\n    period: str = \"5\",\n    adjust: str = \"\",\n) -> pd.DataFrame:\n    \"\"\"\n    东方财富网-行情首页-沪深京 A 股-每日分时行情\n    https://quote.eastmoney.com/concept/sh603777.html?from=classic\n    :param symbol: 股票代码\n    :type symbol: str\n    :param start_date: 开始日期\n    :type start_date: str\n    :param end_date: 结束日期\n    :type end_date: str\n    :param period: choice of {'1', '5', '15', '30', '60'}\n    :type period: str\n    :param adjust: choice of {'', 'qfq', 'hfq'}\n    :type adjust: str\n    :return: 每日分时行情\n    :rtype: pandas.DataFrame\n    \"\"\"\n    code_id_dict = code_id_map_em()\n    adjust_map = {\n        \"\": \"0\",\n        \"qfq\": \"1\",\n        \"hfq\": \"2\",\n    }\n    if period == \"1\":\n        url = \"https://push2his.eastmoney.com/api/qt/stock/trends2/get\"\n        params = {\n            \"fields1\": \"f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13\",\n            \"fields2\": \"f51,f52,f53,f54,f55,f56,f57,f58\",\n            \"ut\": \"7eea3edcaed734bea9cbfc24409ed989\",\n            \"ndays\": \"5\",\n            \"iscr\": \"0\",\n            \"secid\": f\"1.{symbol}\" if symbol.startswith('6') else f\"0.{symbol}\",\n            \"_\": \"1623766962675\",\n        }\n        r =  fetcher.make_request(url, params=params)\n        data_json = r.json()\n        temp_df = pd.DataFrame(\n            [item.split(\",\") for item in data_json[\"data\"][\"trends\"]]\n        )\n        temp_df.columns = [\n            \"时间\",\n            \"开盘\",\n            \"收盘\",\n            \"最高\",\n            \"最低\",\n            \"成交量\",\n            \"成交额\",\n            \"最新价\",\n        ]\n        temp_df.index = pd.to_datetime(temp_df[\"时间\"])\n        temp_df = temp_df[start_date:end_date]\n        temp_df.reset_index(drop=True, inplace=True)\n        temp_df[\"开盘\"] = pd.to_numeric(temp_df[\"开盘\"])\n        temp_df[\"收盘\"] = pd.to_numeric(temp_df[\"收盘\"])\n        temp_df[\"最高\"] = pd.to_numeric(temp_df[\"最高\"])\n        temp_df[\"最低\"] = pd.to_numeric(temp_df[\"最低\"])\n        temp_df[\"成交量\"] = pd.to_numeric(temp_df[\"成交量\"])\n        temp_df[\"成交额\"] = pd.to_numeric(temp_df[\"成交额\"])\n        temp_df[\"最新价\"] = pd.to_numeric(temp_df[\"最新价\"])\n        temp_df[\"时间\"] = pd.to_datetime(temp_df[\"时间\"]).astype(str)\n        return temp_df\n    else:\n        url = \"http://push2his.eastmoney.com/api/qt/stock/kline/get\"\n        params = {\n            \"fields1\": \"f1,f2,f3,f4,f5,f6\",\n            \"fields2\": \"f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61\",\n            \"ut\": \"7eea3edcaed734bea9cbfc24409ed989\",\n            \"klt\": period,\n            \"fqt\": adjust_map[adjust],\n            \"secid\": f\"1.{symbol}\" if symbol.startswith('6') else f\"0.{symbol}\",\n            \"beg\": \"0\",\n            \"end\": \"20500000\",\n            \"_\": \"1630930917857\",\n        }\n        r =  fetcher.make_request(url, params=params)\n        data_json = r.json()\n        temp_df = pd.DataFrame(\n            [item.split(\",\") for item in data_json[\"data\"][\"klines\"]]\n        )\n        temp_df.columns = [\n            \"时间\",\n            \"开盘\",\n            \"收盘\",\n            \"最高\",\n            \"最低\",\n            \"成交量\",\n            \"成交额\",\n            \"振幅\",\n            \"涨跌幅\",\n            \"涨跌额\",\n            \"换手率\",\n        ]\n        temp_df.index = pd.to_datetime(temp_df[\"时间\"])\n        temp_df = temp_df[start_date:end_date]\n        temp_df.reset_index(drop=True, inplace=True)\n        temp_df[\"开盘\"] = pd.to_numeric(temp_df[\"开盘\"])\n        temp_df[\"收盘\"] = pd.to_numeric(temp_df[\"收盘\"])\n        temp_df[\"最高\"] = pd.to_numeric(temp_df[\"最高\"])\n        temp_df[\"最低\"] = pd.to_numeric(temp_df[\"最低\"])\n        temp_df[\"成交量\"] = pd.to_numeric(temp_df[\"成交量\"])\n        temp_df[\"成交额\"] = pd.to_numeric(temp_df[\"成交额\"])\n        temp_df[\"振幅\"] = pd.to_numeric(temp_df[\"振幅\"])\n        temp_df[\"涨跌幅\"] = pd.to_numeric(temp_df[\"涨跌幅\"])\n        temp_df[\"涨跌额\"] = pd.to_numeric(temp_df[\"涨跌额\"])\n        temp_df[\"换手率\"] = pd.to_numeric(temp_df[\"换手率\"])\n        temp_df[\"时间\"] = pd.to_datetime(temp_df[\"时间\"]).astype(str)\n        temp_df = temp_df[\n            [\n                \"时间\",\n                \"开盘\",\n                \"收盘\",\n                \"最高\",\n                \"最低\",\n                \"涨跌幅\",\n                \"涨跌额\",\n                \"成交量\",\n                \"成交额\",\n                \"振幅\",\n                \"换手率\",\n            ]\n        ]\n        return temp_df\n\n\ndef stock_zh_a_hist_pre_min_em(\n    symbol: str = \"000001\",\n    start_time: str = \"09:00:00\",\n    end_time: str = \"15:50:00\",\n) -> pd.DataFrame:\n    \"\"\"\n    东方财富网-行情首页-沪深京 A 股-每日分时行情包含盘前数据\n    http://quote.eastmoney.com/concept/sh603777.html?from=classic\n    :param symbol: 股票代码\n    :type symbol: str\n    :param start_time: 开始时间\n    :type start_time: str\n    :param end_time: 结束时间\n    :type end_time: str\n    :return: 每日分时行情包含盘前数据\n    :rtype: pandas.DataFrame\n    \"\"\"\n    code_id_dict = code_id_map_em()\n    url = \"https://push2.eastmoney.com/api/qt/stock/trends2/get\"\n    params = {\n        \"fields1\": \"f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13\",\n        \"fields2\": \"f51,f52,f53,f54,f55,f56,f57,f58\",\n        \"ut\": \"fa5fd1943c7b386f172d6893dbfba10b\",\n        \"ndays\": \"1\",\n        \"iscr\": \"1\",\n        \"iscca\": \"0\",\n        \"secid\": f\"1.{symbol}\" if symbol.startswith('6') else f\"0.{symbol}\",\n        \"_\": \"1623766962675\",\n    }\n    r =  fetcher.make_request(url, params=params)\n    data_json = r.json()\n    temp_df = pd.DataFrame(\n        [item.split(\",\") for item in data_json[\"data\"][\"trends\"]]\n    )\n    temp_df.columns = [\n        \"时间\",\n        \"开盘\",\n        \"收盘\",\n        \"最高\",\n        \"最低\",\n        \"成交量\",\n        \"成交额\",\n        \"最新价\",\n    ]\n    temp_df.index = pd.to_datetime(temp_df[\"时间\"])\n    date_format = temp_df.index[0].date().isoformat()\n    temp_df = temp_df[\n        date_format + \" \" + start_time : date_format + \" \" + end_time\n    ]\n    temp_df.reset_index(drop=True, inplace=True)\n    temp_df[\"开盘\"] = pd.to_numeric(temp_df[\"开盘\"])\n    temp_df[\"收盘\"] = pd.to_numeric(temp_df[\"收盘\"])\n    temp_df[\"最高\"] = pd.to_numeric(temp_df[\"最高\"])\n    temp_df[\"最低\"] = pd.to_numeric(temp_df[\"最低\"])\n    temp_df[\"成交量\"] = pd.to_numeric(temp_df[\"成交量\"])\n    temp_df[\"成交额\"] = pd.to_numeric(temp_df[\"成交额\"])\n    temp_df[\"最新价\"] = pd.to_numeric(temp_df[\"最新价\"])\n    temp_df[\"时间\"] = pd.to_datetime(temp_df[\"时间\"]).astype(str)\n    return temp_df\n\n\nif __name__ == \"__main__\":\n    stock_zh_a_spot_em_df = stock_zh_a_spot_em()\n    print(stock_zh_a_spot_em_df)\n\n    code_id_map_em_df = code_id_map_em()\n    print(code_id_map_em_df)\n\n    stock_zh_a_hist_df = stock_zh_a_hist(\n        symbol=\"000001\",\n        period=\"daily\",\n        start_date=\"20220516\",\n        end_date=\"20220722\",\n        adjust=\"hfq\",\n    )\n    print(stock_zh_a_hist_df)\n\n    stock_zh_a_hist_min_em_df = stock_zh_a_hist_min_em(symbol=\"000001\", period=\"1\")\n    print(stock_zh_a_hist_min_em_df)\n\n    stock_zh_a_hist_pre_min_em_df = stock_zh_a_hist_pre_min_em(symbol=\"000001\")\n    print(stock_zh_a_hist_pre_min_em_df)\n\n    stock_zh_a_spot_em_df = stock_zh_a_spot_em()\n    print(stock_zh_a_spot_em_df)\n\n    stock_zh_a_hist_min_em_df = stock_zh_a_hist_min_em(\n        symbol=\"000001\", period='1'\n    )\n    print(stock_zh_a_hist_min_em_df)\n\n    stock_zh_a_hist_df = stock_zh_a_hist(\n        symbol=\"000001\",\n        period=\"daily\",\n        start_date=\"20170301\",\n        end_date=\"20211115\",\n        adjust=\"hfq\",\n    )\n    print(stock_zh_a_hist_df)\n\n"
  },
  {
    "path": "instock/core/crawling/stock_lhb_em.py",
    "content": "# -*- coding:utf-8 -*-\n# !/usr/bin/env python\n\"\"\"\nDate: 2022/3/15 17:32\nDesc: 东方财富网-数据中心-龙虎榜单\nhttps://data.eastmoney.com/stock/tradedetail.html\n\"\"\"\nimport random\nimport time\n\nimport pandas as pd\nfrom tqdm import tqdm\nfrom instock.core.eastmoney_fetcher import eastmoney_fetcher\n\n__author__ = 'myh '\n__date__ = '2025/12/31 '\n\n# 创建全局实例，供所有函数使用\nfetcher = eastmoney_fetcher()\n\ndef stock_lhb_detail_em(\n    start_date: str = \"20230403\", end_date: str = \"20230417\"\n) -> pd.DataFrame:\n    \"\"\"\n    东方财富网-数据中心-龙虎榜单-龙虎榜详情\n    https://data.eastmoney.com/stock/tradedetail.html\n    :param start_date: 开始日期\n    :type start_date: str\n    :param end_date: 结束日期\n    :type end_date: str\n    :return: 龙虎榜详情\n    :rtype: pandas.DataFrame\n    \"\"\"\n    start_date = \"-\".join([start_date[:4], start_date[4:6], start_date[6:]])\n    end_date = \"-\".join([end_date[:4], end_date[4:6], end_date[6:]])\n    url = \"https://datacenter-web.eastmoney.com/api/data/v1/get\"\n    params = {\n        \"sortColumns\": \"SECURITY_CODE,TRADE_DATE\",\n        \"sortTypes\": \"1,-1\",\n        \"pageSize\": \"5000\",\n        \"pageNumber\": \"1\",\n        \"reportName\": \"RPT_DAILYBILLBOARD_DETAILSNEW\",\n        \"columns\": \"SECURITY_CODE,SECUCODE,SECURITY_NAME_ABBR,TRADE_DATE,EXPLAIN,CLOSE_PRICE,CHANGE_RATE,BILLBOARD_NET_AMT,BILLBOARD_BUY_AMT,BILLBOARD_SELL_AMT,BILLBOARD_DEAL_AMT,ACCUM_AMOUNT,DEAL_NET_RATIO,DEAL_AMOUNT_RATIO,TURNOVERRATE,FREE_MARKET_CAP,EXPLANATION,D1_CLOSE_ADJCHRATE,D2_CLOSE_ADJCHRATE,D5_CLOSE_ADJCHRATE,D10_CLOSE_ADJCHRATE,SECURITY_TYPE_CODE\",\n        \"source\": \"WEB\",\n        \"client\": \"WEB\",\n        \"filter\": f\"(TRADE_DATE<='{end_date}')(TRADE_DATE>='{start_date}')\",\n    }\n    r = fetcher.make_request(url, params=params)\n    data_json = r.json()\n    total_page_num = data_json[\"result\"][\"pages\"]\n    big_df = pd.DataFrame()\n    for page in range(1, total_page_num + 1):\n        # 添加随机延迟，避免爬取过快\n        time.sleep(random.uniform(1, 1.5))\n        params.update(\n            {\n                \"pageNumber\": page,\n            }\n        )\n        r = fetcher.make_request(url, params=params)\n        data_json = r.json()\n        temp_df = pd.DataFrame(data_json[\"result\"][\"data\"])\n        big_df = pd.concat([big_df, temp_df], ignore_index=True)\n\n    big_df.reset_index(inplace=True)\n    big_df[\"index\"] = big_df.index + 1\n    big_df.rename(\n        columns={\n            \"index\": \"-\",\n            \"SECURITY_CODE\": \"代码\",\n            \"SECUCODE\": \"-\",\n            \"SECURITY_NAME_ABBR\": \"名称\",\n            \"TRADE_DATE\": \"上榜日\",\n            \"EXPLAIN\": \"解读\",\n            \"CLOSE_PRICE\": \"收盘价\",\n            \"CHANGE_RATE\": \"涨跌幅\",\n            \"BILLBOARD_NET_AMT\": \"龙虎榜净买额\",\n            \"BILLBOARD_BUY_AMT\": \"龙虎榜买入额\",\n            \"BILLBOARD_SELL_AMT\": \"龙虎榜卖出额\",\n            \"BILLBOARD_DEAL_AMT\": \"龙虎榜成交额\",\n            \"ACCUM_AMOUNT\": \"市场总成交额\",\n            \"DEAL_NET_RATIO\": \"净买额占总成交比\",\n            \"DEAL_AMOUNT_RATIO\": \"成交额占总成交比\",\n            \"TURNOVERRATE\": \"换手率\",\n            \"FREE_MARKET_CAP\": \"流通市值\",\n            \"EXPLANATION\": \"上榜原因\",\n            \"D1_CLOSE_ADJCHRATE\": \"上榜后1日\",\n            \"D2_CLOSE_ADJCHRATE\": \"上榜后2日\",\n            \"D5_CLOSE_ADJCHRATE\": \"上榜后5日\",\n            \"D10_CLOSE_ADJCHRATE\": \"上榜后10日\",\n        },\n        inplace=True,\n    )\n\n    big_df = big_df[\n        [\n            \"代码\",\n            \"名称\",\n            \"上榜日\",\n            \"解读\",\n            \"收盘价\",\n            \"涨跌幅\",\n            \"龙虎榜净买额\",\n            \"龙虎榜买入额\",\n            \"龙虎榜卖出额\",\n            \"龙虎榜成交额\",\n            \"市场总成交额\",\n            \"净买额占总成交比\",\n            \"成交额占总成交比\",\n            \"换手率\",\n            \"流通市值\",\n            \"上榜原因\",\n            \"上榜后1日\",\n            \"上榜后2日\",\n            \"上榜后5日\",\n            \"上榜后10日\",\n        ]\n    ]\n    big_df[\"上榜日\"] = pd.to_datetime(big_df[\"上榜日\"]).dt.date\n\n    big_df[\"收盘价\"] = pd.to_numeric(big_df[\"收盘价\"], errors=\"coerce\")\n    big_df[\"涨跌幅\"] = pd.to_numeric(big_df[\"涨跌幅\"], errors=\"coerce\")\n    big_df[\"龙虎榜净买额\"] = pd.to_numeric(big_df[\"龙虎榜净买额\"], errors=\"coerce\")\n    big_df[\"龙虎榜买入额\"] = pd.to_numeric(big_df[\"龙虎榜买入额\"], errors=\"coerce\")\n    big_df[\"龙虎榜卖出额\"] = pd.to_numeric(big_df[\"龙虎榜卖出额\"], errors=\"coerce\")\n    big_df[\"龙虎榜成交额\"] = pd.to_numeric(big_df[\"龙虎榜成交额\"], errors=\"coerce\")\n    big_df[\"市场总成交额\"] = pd.to_numeric(big_df[\"市场总成交额\"], errors=\"coerce\")\n    big_df[\"净买额占总成交比\"] = pd.to_numeric(big_df[\"净买额占总成交比\"], errors=\"coerce\")\n    big_df[\"成交额占总成交比\"] = pd.to_numeric(big_df[\"成交额占总成交比\"], errors=\"coerce\")\n    big_df[\"换手率\"] = pd.to_numeric(big_df[\"换手率\"], errors=\"coerce\")\n    big_df[\"流通市值\"] = pd.to_numeric(big_df[\"流通市值\"], errors=\"coerce\")\n    big_df[\"上榜后1日\"] = pd.to_numeric(big_df[\"上榜后1日\"], errors=\"coerce\")\n    big_df[\"上榜后2日\"] = pd.to_numeric(big_df[\"上榜后2日\"], errors=\"coerce\")\n    big_df[\"上榜后5日\"] = pd.to_numeric(big_df[\"上榜后5日\"], errors=\"coerce\")\n    big_df[\"上榜后10日\"] = pd.to_numeric(big_df[\"上榜后10日\"], errors=\"coerce\")\n    return big_df\n\n\ndef stock_lhb_stock_statistic_em(symbol: str = \"近一月\") -> pd.DataFrame:\n    \"\"\"\n    东方财富网-数据中心-龙虎榜单-个股上榜统计\n    https://data.eastmoney.com/stock/tradedetail.html\n    :param symbol: choice of {\"近一月\", \"近三月\", \"近六月\", \"近一年\"}\n    :type symbol: str\n    :return: 个股上榜统计\n    :rtype: pandas.DataFrame\n    \"\"\"\n    symbol_map = {\n        \"近一月\": \"01\",\n        \"近三月\": \"02\",\n        \"近六月\": \"03\",\n        \"近一年\": \"04\",\n    }\n    url = \"https://datacenter-web.eastmoney.com/api/data/v1/get\"\n    params = {\n        \"sortColumns\": \"BILLBOARD_TIMES,LATEST_TDATE,SECURITY_CODE\",\n        \"sortTypes\": \"-1,-1,1\",\n        \"pageSize\": \"500\",\n        \"pageNumber\": \"1\",\n        \"reportName\": \"RPT_BILLBOARD_TRADEALL\",\n        \"columns\": \"ALL\",\n        \"source\": \"WEB\",\n        \"client\": \"WEB\",\n        \"filter\": f'(STATISTICS_CYCLE=\"{symbol_map[symbol]}\")',\n    }\n    r = fetcher.make_request(url, params=params)\n    data_json = r.json()\n    temp_df = pd.DataFrame(data_json[\"result\"][\"data\"])\n    temp_df.reset_index(inplace=True)\n    temp_df[\"index\"] = temp_df.index + 1\n    temp_df.columns = [\n        \"序号\",\n        \"-\",\n        \"代码\",\n        \"最近上榜日\",\n        \"名称\",\n        \"近1个月涨跌幅\",\n        \"近3个月涨跌幅\",\n        \"近6个月涨跌幅\",\n        \"近1年涨跌幅\",\n        \"涨跌幅\",\n        \"收盘价\",\n        \"-\",\n        \"龙虎榜总成交额\",\n        \"龙虎榜净买额\",\n        \"-\",\n        \"-\",\n        \"机构买入净额\",\n        \"上榜次数\",\n        \"龙虎榜买入额\",\n        \"龙虎榜卖出额\",\n        \"机构买入总额\",\n        \"机构卖出总额\",\n        \"买方机构次数\",\n        \"卖方机构次数\",\n        \"-\",\n    ]\n    temp_df = temp_df[\n        [\n            \"序号\",\n            \"代码\",\n            \"名称\",\n            \"最近上榜日\",\n            \"收盘价\",\n            \"涨跌幅\",\n            \"上榜次数\",\n            \"龙虎榜净买额\",\n            \"龙虎榜买入额\",\n            \"龙虎榜卖出额\",\n            \"龙虎榜总成交额\",\n            \"买方机构次数\",\n            \"卖方机构次数\",\n            \"机构买入净额\",\n            \"机构买入总额\",\n            \"机构卖出总额\",\n            \"近1个月涨跌幅\",\n            \"近3个月涨跌幅\",\n            \"近6个月涨跌幅\",\n            \"近1年涨跌幅\",\n        ]\n    ]\n    temp_df[\"最近上榜日\"] = pd.to_datetime(temp_df[\"最近上榜日\"]).dt.date\n    return temp_df\n\n\ndef stock_lhb_jgmmtj_em(\n    start_date: str = \"20220906\", end_date: str = \"20220906\"\n) -> pd.DataFrame:\n    \"\"\"\n    东方财富网-数据中心-龙虎榜单-机构买卖每日统计\n    https://data.eastmoney.com/stock/jgmmtj.html\n    :param start_date: 开始日期\n    :type start_date: str\n    :param end_date: 结束日期\n    :type end_date: str\n    :return: 机构买卖每日统计\n    :rtype: pandas.DataFrame\n    \"\"\"\n    start_date = \"-\".join([start_date[:4], start_date[4:6], start_date[6:]])\n    end_date = \"-\".join([end_date[:4], end_date[4:6], end_date[6:]])\n    url = \"https://datacenter-web.eastmoney.com/api/data/v1/get\"\n    params = {\n        \"sortColumns\": \"NET_BUY_AMT,TRADE_DATE,SECURITY_CODE\",\n        \"sortTypes\": \"-1,-1,1\",\n        \"pageSize\": \"5000\",\n        \"pageNumber\": \"1\",\n        \"reportName\": \"RPT_ORGANIZATION_TRADE_DETAILS\",\n        \"columns\": \"ALL\",\n        \"source\": \"WEB\",\n        \"client\": \"WEB\",\n        \"filter\": f\"(TRADE_DATE>='{start_date}')(TRADE_DATE<='{end_date}')\",\n    }\n    r = fetcher.make_request(url, params=params)\n    data_json = r.json()\n    temp_df = pd.DataFrame(data_json[\"result\"][\"data\"])\n    temp_df.reset_index(inplace=True)\n    temp_df[\"index\"] = temp_df.index + 1\n    temp_df.columns = [\n        \"序号\",\n        \"-\",\n        \"名称\",\n        \"代码\",\n        \"上榜日期\",\n        \"收盘价\",\n        \"涨跌幅\",\n        \"买方机构数\",\n        \"卖方机构数\",\n        \"机构买入总额\",\n        \"机构卖出总额\",\n        \"机构买入净额\",\n        \"市场总成交额\",\n        \"机构净买额占总成交额比\",\n        \"换手率\",\n        \"流通市值\",\n        \"上榜原因\",\n        \"-\",\n        \"-\",\n        \"-\",\n        \"-\",\n        \"-\",\n        \"-\",\n        \"-\",\n        \"-\",\n        \"-\",\n    ]\n    temp_df = temp_df[\n        [\n            \"序号\",\n            \"代码\",\n            \"名称\",\n            \"收盘价\",\n            \"涨跌幅\",\n            \"买方机构数\",\n            \"卖方机构数\",\n            \"机构买入总额\",\n            \"机构卖出总额\",\n            \"机构买入净额\",\n            \"市场总成交额\",\n            \"机构净买额占总成交额比\",\n            \"换手率\",\n            \"流通市值\",\n            \"上榜原因\",\n            \"上榜日期\",\n        ]\n    ]\n    temp_df[\"上榜日期\"] = pd.to_datetime(temp_df[\"上榜日期\"]).dt.date\n    temp_df[\"收盘价\"] = pd.to_numeric(temp_df[\"收盘价\"], errors=\"coerce\")\n    temp_df[\"涨跌幅\"] = pd.to_numeric(temp_df[\"涨跌幅\"], errors=\"coerce\")\n    temp_df[\"买方机构数\"] = pd.to_numeric(temp_df[\"买方机构数\"], errors=\"coerce\")\n    temp_df[\"卖方机构数\"] = pd.to_numeric(temp_df[\"卖方机构数\"], errors=\"coerce\")\n    temp_df[\"机构买入总额\"] = pd.to_numeric(temp_df[\"机构买入总额\"], errors=\"coerce\")\n    temp_df[\"机构卖出总额\"] = pd.to_numeric(temp_df[\"机构卖出总额\"], errors=\"coerce\")\n    temp_df[\"机构买入净额\"] = pd.to_numeric(temp_df[\"机构买入净额\"], errors=\"coerce\")\n    temp_df[\"市场总成交额\"] = pd.to_numeric(temp_df[\"市场总成交额\"], errors=\"coerce\")\n    temp_df[\"机构净买额占总成交额比\"] = pd.to_numeric(temp_df[\"机构净买额占总成交额比\"], errors=\"coerce\")\n    temp_df[\"换手率\"] = pd.to_numeric(temp_df[\"换手率\"], errors=\"coerce\")\n    temp_df[\"流通市值\"] = pd.to_numeric(temp_df[\"流通市值\"], errors=\"coerce\")\n\n    return temp_df\n\n\ndef stock_lhb_jgstatistic_em(symbol: str = \"近一月\") -> pd.DataFrame:\n    \"\"\"\n    东方财富网-数据中心-龙虎榜单-机构席位追踪\n    https://data.eastmoney.com/stock/jgstatistic.html\n    :param symbol: choice of {\"近一月\", \"近三月\", \"近六月\", \"近一年\"}\n    :type symbol: str\n    :return: 机构席位追踪\n    :rtype: pandas.DataFrame\n    \"\"\"\n    symbol_map = {\n        \"近一月\": \"01\",\n        \"近三月\": \"02\",\n        \"近六月\": \"03\",\n        \"近一年\": \"04\",\n    }\n    url = \"https://datacenter-web.eastmoney.com/api/data/v1/get\"\n    params = {\n        \"sortColumns\": \"ONLIST_TIMES,SECURITY_CODE\",\n        \"sortTypes\": \"-1,1\",\n        \"pageSize\": \"5000\",\n        \"pageNumber\": \"1\",\n        \"reportName\": \"RPT_ORGANIZATION_SEATNEW\",\n        \"columns\": \"ALL\",\n        \"source\": \"WEB\",\n        \"client\": \"WEB\",\n        \"filter\": f'(STATISTICSCYCLE=\"{symbol_map[symbol]}\")',\n    }\n    r = fetcher.make_request(url, params=params)\n    data_json = r.json()\n    total_page = data_json[\"result\"][\"pages\"]\n    big_df = pd.DataFrame()\n    for page in tqdm(range(1, total_page + 1), leave=False):\n        # 添加随机延迟，避免爬取过快\n        time.sleep(random.uniform(1, 1.5))\n        params.update({\"pageNumber\": page})\n        r = fetcher.make_request(url, params=params)\n        data_json = r.json()\n        temp_df = pd.DataFrame(data_json[\"result\"][\"data\"])\n        big_df = pd.concat([big_df, temp_df], ignore_index=True)\n\n    big_df.reset_index(inplace=True)\n    big_df[\"index\"] = big_df.index + 1\n    big_df.rename(\n        columns={\n            \"index\": \"序号\",\n            \"SECURITY_CODE\": \"代码\",\n            \"SECURITY_NAME_ABBR\": \"名称\",\n            \"CLOSE_PRICE\": \"收盘价\",\n            \"CHANGE_RATE\": \"涨跌幅\",\n            \"AMOUNT\": \"龙虎榜成交金额\",\n            \"ONLIST_TIMES\": \"上榜次数\",\n            \"BUY_AMT\": \"机构买入额\",\n            \"BUY_TIMES\": \"机构买入次数\",\n            \"SELL_AMT\": \"机构卖出额\",\n            \"SELL_TIMES\": \"机构卖出次数\",\n            \"NET_BUY_AMT\": \"机构净买额\",\n            \"M1_CLOSE_ADJCHRATE\": \"近1个月涨跌幅\",\n            \"M3_CLOSE_ADJCHRATE\": \"近3个月涨跌幅\",\n            \"M6_CLOSE_ADJCHRATE\": \"近6个月涨跌幅\",\n            \"Y1_CLOSE_ADJCHRATE\": \"近1年涨跌幅\",\n        },\n        inplace=True,\n    )\n    big_df = big_df[\n        [\n            \"序号\",\n            \"代码\",\n            \"名称\",\n            \"收盘价\",\n            \"涨跌幅\",\n            \"龙虎榜成交金额\",\n            \"上榜次数\",\n            \"机构买入额\",\n            \"机构买入次数\",\n            \"机构卖出额\",\n            \"机构卖出次数\",\n            \"机构净买额\",\n            \"近1个月涨跌幅\",\n            \"近3个月涨跌幅\",\n            \"近6个月涨跌幅\",\n            \"近1年涨跌幅\",\n        ]\n    ]\n\n    big_df[\"收盘价\"] = pd.to_numeric(big_df[\"收盘价\"], errors=\"coerce\")\n    big_df[\"涨跌幅\"] = pd.to_numeric(big_df[\"涨跌幅\"], errors=\"coerce\")\n    big_df[\"龙虎榜成交金额\"] = pd.to_numeric(big_df[\"龙虎榜成交金额\"], errors=\"coerce\")\n    big_df[\"上榜次数\"] = pd.to_numeric(big_df[\"上榜次数\"], errors=\"coerce\")\n    big_df[\"机构买入额\"] = pd.to_numeric(big_df[\"机构买入额\"], errors=\"coerce\")\n    big_df[\"机构买入次数\"] = pd.to_numeric(big_df[\"机构买入次数\"], errors=\"coerce\")\n    big_df[\"机构卖出额\"] = pd.to_numeric(big_df[\"机构卖出额\"], errors=\"coerce\")\n    big_df[\"机构卖出次数\"] = pd.to_numeric(big_df[\"机构卖出次数\"], errors=\"coerce\")\n    big_df[\"机构净买额\"] = pd.to_numeric(big_df[\"机构净买额\"], errors=\"coerce\")\n    big_df[\"近1个月涨跌幅\"] = pd.to_numeric(big_df[\"近1个月涨跌幅\"], errors=\"coerce\")\n    big_df[\"近3个月涨跌幅\"] = pd.to_numeric(big_df[\"近3个月涨跌幅\"], errors=\"coerce\")\n    big_df[\"近6个月涨跌幅\"] = pd.to_numeric(big_df[\"近6个月涨跌幅\"], errors=\"coerce\")\n    big_df[\"近1年涨跌幅\"] = pd.to_numeric(big_df[\"近1年涨跌幅\"], errors=\"coerce\")\n    return big_df\n\n\ndef stock_lhb_hyyyb_em(\n    start_date: str = \"20220324\", end_date: str = \"20220324\"\n) -> pd.DataFrame:\n    \"\"\"\n    东方财富网-数据中心-龙虎榜单-每日活跃营业部\n    https://data.eastmoney.com/stock/jgmmtj.html\n    :param start_date: 开始日期\n    :type start_date: str\n    :param end_date: 结束日期\n    :type end_date: str\n    :return: 每日活跃营业部\n    :rtype: pandas.DataFrame\n    \"\"\"\n    start_date = \"-\".join([start_date[:4], start_date[4:6], start_date[6:]])\n    end_date = \"-\".join([end_date[:4], end_date[4:6], end_date[6:]])\n    url = \"https://datacenter-web.eastmoney.com/api/data/v1/get\"\n    params = {\n        \"sortColumns\": \"TOTAL_NETAMT,ONLIST_DATE,OPERATEDEPT_CODE\",\n        \"sortTypes\": \"-1,-1,1\",\n        \"pageSize\": \"5000\",\n        \"pageNumber\": \"1\",\n        \"reportName\": \"RPT_OPERATEDEPT_ACTIVE\",\n        \"columns\": \"ALL\",\n        \"source\": \"WEB\",\n        \"client\": \"WEB\",\n        \"filter\": f\"(ONLIST_DATE>='{start_date}')(ONLIST_DATE<='{end_date}')\",\n    }\n    r = fetcher.make_request(url, params=params)\n    data_json = r.json()\n    total_page = data_json[\"result\"][\"pages\"]\n\n    big_df = pd.DataFrame()\n    for page in tqdm(range(1, total_page + 1), leave=False):\n        # 添加随机延迟，避免爬取过快\n        time.sleep(random.uniform(1, 1.5))\n        params.update({\"pageNumber\": page})\n        r = fetcher.make_request(url, params=params)\n        data_json = r.json()\n        temp_df = pd.DataFrame(data_json[\"result\"][\"data\"])\n        big_df = pd.concat([big_df, temp_df], ignore_index=True)\n\n    big_df.reset_index(inplace=True)\n    big_df[\"index\"] = big_df.index + 1\n    big_df.columns = [\n        \"序号\",\n        \"营业部名称\",\n        \"上榜日\",\n        \"买入个股数\",\n        \"卖出个股数\",\n        \"买入总金额\",\n        \"卖出总金额\",\n        \"总买卖净额\",\n        \"-\",\n        \"-\",\n        \"买入股票\",\n        \"-\",\n        \"-\",\n    ]\n    big_df = big_df[\n        [\n            \"序号\",\n            \"营业部名称\",\n            \"上榜日\",\n            \"买入个股数\",\n            \"卖出个股数\",\n            \"买入总金额\",\n            \"卖出总金额\",\n            \"总买卖净额\",\n            \"买入股票\",\n        ]\n    ]\n\n    big_df[\"上榜日\"] = pd.to_datetime(big_df[\"上榜日\"]).dt.date\n    big_df[\"买入个股数\"] = pd.to_numeric(big_df[\"买入个股数\"])\n    big_df[\"卖出个股数\"] = pd.to_numeric(big_df[\"卖出个股数\"])\n    big_df[\"买入总金额\"] = pd.to_numeric(big_df[\"买入总金额\"])\n    big_df[\"卖出总金额\"] = pd.to_numeric(big_df[\"卖出总金额\"])\n    big_df[\"总买卖净额\"] = pd.to_numeric(big_df[\"总买卖净额\"])\n    return big_df\n\n\ndef stock_lhb_yybph_em(symbol: str = \"近一月\") -> pd.DataFrame:\n    \"\"\"\n    东方财富网-数据中心-龙虎榜单-营业部排行\n    https://data.eastmoney.com/stock/yybph.html\n    :param symbol: choice of {\"近一月\", \"近三月\", \"近六月\", \"近一年\"}\n    :type symbol: str\n    :return: 营业部排行\n    :rtype: pandas.DataFrame\n    \"\"\"\n    symbol_map = {\n        \"近一月\": \"01\",\n        \"近三月\": \"02\",\n        \"近六月\": \"03\",\n        \"近一年\": \"04\",\n    }\n    url = \"https://datacenter-web.eastmoney.com/api/data/v1/get\"\n    params = {\n        \"sortColumns\": \"TOTAL_BUYER_SALESTIMES_1DAY,OPERATEDEPT_CODE\",\n        \"sortTypes\": \"-1,1\",\n        \"pageSize\": \"5000\",\n        \"pageNumber\": \"1\",\n        \"reportName\": \"RPT_RATEDEPT_RETURNT_RANKING\",\n        \"columns\": \"ALL\",\n        \"source\": \"WEB\",\n        \"client\": \"WEB\",\n        \"filter\": f'(STATISTICSCYCLE=\"{symbol_map[symbol]}\")',\n    }\n    r = fetcher.make_request(url, params=params)\n    data_json = r.json()\n    total_page = data_json[\"result\"][\"pages\"]\n    big_df = pd.DataFrame()\n    for page in tqdm(range(1, total_page + 1), leave=False):\n        # 添加随机延迟，避免爬取过快\n        time.sleep(random.uniform(1, 1.5))\n        params.update({\"pageNumber\": page})\n        r = fetcher.make_request(url, params=params)\n        data_json = r.json()\n        temp_df = pd.DataFrame(data_json[\"result\"][\"data\"])\n        big_df = pd.concat([big_df, temp_df], ignore_index=True)\n\n    big_df.reset_index(inplace=True)\n    big_df[\"index\"] = big_df.index + 1\n    big_df.rename(\n        columns={\n            \"index\": \"序号\",\n            \"OPERATEDEPT_NAME\": \"营业部名称\",\n            \"TOTAL_BUYER_SALESTIMES_1DAY\": \"上榜后1天-买入次数\",\n            \"AVERAGE_INCREASE_1DAY\": \"上榜后1天-平均涨幅\",\n            \"RISE_PROBABILITY_1DAY\": \"上榜后1天-上涨概率\",\n            \"TOTAL_BUYER_SALESTIMES_2DAY\": \"上榜后2天-买入次数\",\n            \"AVERAGE_INCREASE_2DAY\": \"上榜后2天-平均涨幅\",\n            \"RISE_PROBABILITY_2DAY\": \"上榜后2天-上涨概率\",\n            \"TOTAL_BUYER_SALESTIMES_3DAY\": \"上榜后3天-买入次数\",\n            \"AVERAGE_INCREASE_3DAY\": \"上榜后3天-平均涨幅\",\n            \"RISE_PROBABILITY_3DAY\": \"上榜后3天-上涨概率\",\n            \"TOTAL_BUYER_SALESTIMES_5DAY\": \"上榜后5天-买入次数\",\n            \"AVERAGE_INCREASE_5DAY\": \"上榜后5天-平均涨幅\",\n            \"RISE_PROBABILITY_5DAY\": \"上榜后5天-上涨概率\",\n            \"TOTAL_BUYER_SALESTIMES_10DAY\": \"上榜后10天-买入次数\",\n            \"AVERAGE_INCREASE_10DAY\": \"上榜后10天-平均涨幅\",\n            \"RISE_PROBABILITY_10DAY\": \"上榜后10天-上涨概率\",\n        },\n        inplace=True,\n    )\n    big_df = big_df[\n        [\n            \"序号\",\n            \"营业部名称\",\n            \"上榜后1天-买入次数\",\n            \"上榜后1天-平均涨幅\",\n            \"上榜后1天-上涨概率\",\n            \"上榜后2天-买入次数\",\n            \"上榜后2天-平均涨幅\",\n            \"上榜后2天-上涨概率\",\n            \"上榜后3天-买入次数\",\n            \"上榜后3天-平均涨幅\",\n            \"上榜后3天-上涨概率\",\n            \"上榜后5天-买入次数\",\n            \"上榜后5天-平均涨幅\",\n            \"上榜后5天-上涨概率\",\n            \"上榜后10天-买入次数\",\n            \"上榜后10天-平均涨幅\",\n            \"上榜后10天-上涨概率\",\n        ]\n    ]\n\n    big_df[\"上榜后1天-买入次数\"] = pd.to_numeric(big_df[\"上榜后1天-买入次数\"], errors=\"coerce\")\n    big_df[\"上榜后1天-平均涨幅\"] = pd.to_numeric(big_df[\"上榜后1天-平均涨幅\"], errors=\"coerce\")\n    big_df[\"上榜后1天-上涨概率\"] = pd.to_numeric(big_df[\"上榜后1天-上涨概率\"], errors=\"coerce\")\n\n    big_df[\"上榜后2天-买入次数\"] = pd.to_numeric(big_df[\"上榜后2天-买入次数\"], errors=\"coerce\")\n    big_df[\"上榜后2天-平均涨幅\"] = pd.to_numeric(big_df[\"上榜后2天-平均涨幅\"], errors=\"coerce\")\n    big_df[\"上榜后2天-上涨概率\"] = pd.to_numeric(big_df[\"上榜后2天-上涨概率\"], errors=\"coerce\")\n\n    big_df[\"上榜后3天-买入次数\"] = pd.to_numeric(big_df[\"上榜后3天-买入次数\"], errors=\"coerce\")\n    big_df[\"上榜后3天-平均涨幅\"] = pd.to_numeric(big_df[\"上榜后3天-平均涨幅\"], errors=\"coerce\")\n    big_df[\"上榜后3天-上涨概率\"] = pd.to_numeric(big_df[\"上榜后3天-上涨概率\"], errors=\"coerce\")\n\n    big_df[\"上榜后5天-买入次数\"] = pd.to_numeric(big_df[\"上榜后5天-买入次数\"], errors=\"coerce\")\n    big_df[\"上榜后5天-平均涨幅\"] = pd.to_numeric(big_df[\"上榜后5天-平均涨幅\"], errors=\"coerce\")\n    big_df[\"上榜后5天-上涨概率\"] = pd.to_numeric(big_df[\"上榜后5天-上涨概率\"], errors=\"coerce\")\n\n    big_df[\"上榜后10天-买入次数\"] = pd.to_numeric(big_df[\"上榜后10天-买入次数\"], errors=\"coerce\")\n    big_df[\"上榜后10天-平均涨幅\"] = pd.to_numeric(big_df[\"上榜后10天-平均涨幅\"], errors=\"coerce\")\n    big_df[\"上榜后10天-上涨概率\"] = pd.to_numeric(big_df[\"上榜后10天-上涨概率\"], errors=\"coerce\")\n    return big_df\n\n\ndef stock_lhb_traderstatistic_em(symbol: str = \"近一月\") -> pd.DataFrame:\n    \"\"\"\n    东方财富网-数据中心-龙虎榜单-营业部统计\n    https://data.eastmoney.com/stock/traderstatistic.html\n    :param symbol: choice of {\"近一月\", \"近三月\", \"近六月\", \"近一年\"}\n    :type symbol: str\n    :return: 营业部统计\n    :rtype: pandas.DataFrame\n    \"\"\"\n    symbol_map = {\n        \"近一月\": \"01\",\n        \"近三月\": \"02\",\n        \"近六月\": \"03\",\n        \"近一年\": \"04\",\n    }\n    url = \"https://datacenter-web.eastmoney.com/api/data/v1/get\"\n    params = {\n        \"sortColumns\": \"AMOUNT,OPERATEDEPT_CODE\",\n        \"sortTypes\": \"-1,1\",\n        \"pageSize\": \"5000\",\n        \"pageNumber\": \"1\",\n        \"reportName\": \"RPT_OPERATEDEPT_LIST_STATISTICS\",\n        \"columns\": \"ALL\",\n        \"source\": \"WEB\",\n        \"client\": \"WEB\",\n        \"filter\": f'(STATISTICSCYCLE=\"{symbol_map[symbol]}\")',\n    }\n    r = fetcher.make_request(url, params=params)\n    data_json = r.json()\n    total_page = data_json[\"result\"][\"pages\"]\n    big_df = pd.DataFrame()\n    for page in tqdm(range(1, total_page + 1), leave=False):\n        # 添加随机延迟，避免爬取过快\n        time.sleep(random.uniform(1, 1.5))\n        params.update({\"pageNumber\": page})\n        r = fetcher.make_request(url, params=params)\n        data_json = r.json()\n        temp_df = pd.DataFrame(data_json[\"result\"][\"data\"])\n        big_df = pd.concat([big_df, temp_df], ignore_index=True)\n\n    big_df.reset_index(inplace=True)\n    big_df[\"index\"] = big_df.index + 1\n    big_df.rename(\n        columns={\n            \"index\": \"序号\",\n            \"OPERATEDEPT_NAME\": \"营业部名称\",\n            \"AMOUNT\": \"龙虎榜成交金额\",\n            \"SALES_ONLIST_TIMES\": \"上榜次数\",\n            \"ACT_BUY\": \"买入额\",\n            \"TOTAL_BUYER_SALESTIMES\": \"买入次数\",\n            \"ACT_SELL\": \"卖出额\",\n            \"TOTAL_SELLER_SALESTIMES\": \"卖出次数\",\n        },\n        inplace=True,\n    )\n    big_df = big_df[\n        [\n            \"序号\",\n            \"营业部名称\",\n            \"龙虎榜成交金额\",\n            \"上榜次数\",\n            \"买入额\",\n            \"买入次数\",\n            \"卖出额\",\n            \"卖出次数\",\n        ]\n    ]\n\n    big_df[\"龙虎榜成交金额\"] = pd.to_numeric(big_df[\"龙虎榜成交金额\"], errors=\"coerce\")\n    big_df[\"上榜次数\"] = pd.to_numeric(big_df[\"上榜次数\"], errors=\"coerce\")\n    big_df[\"买入额\"] = pd.to_numeric(big_df[\"买入额\"], errors=\"coerce\")\n    big_df[\"买入次数\"] = pd.to_numeric(big_df[\"买入次数\"], errors=\"coerce\")\n    big_df[\"卖出额\"] = pd.to_numeric(big_df[\"卖出额\"], errors=\"coerce\")\n    big_df[\"卖出次数\"] = pd.to_numeric(big_df[\"卖出次数\"], errors=\"coerce\")\n    return big_df\n\n\ndef stock_lhb_stock_detail_date_em(symbol: str = \"600077\") -> pd.DataFrame:\n    \"\"\"\n    东方财富网-数据中心-龙虎榜单-个股龙虎榜详情-日期\n    https://data.eastmoney.com/stock/tradedetail.html\n    :param symbol: 股票代码\n    :type symbol: str\n    :return: 个股龙虎榜详情-日期\n    :rtype: pandas.DataFrame\n    \"\"\"\n    url = \"https://datacenter-web.eastmoney.com/api/data/v1/get\"\n    params = {\n        \"reportName\": \"RPT_LHB_BOARDDATE\",\n        \"columns\": \"SECURITY_CODE,TRADE_DATE,TR_DATE\",\n        \"filter\": f'(SECURITY_CODE=\"{symbol}\")',\n        \"pageNumber\": \"1\",\n        \"pageSize\": \"1000\",\n        \"sortTypes\": \"-1\",\n        \"sortColumns\": \"TRADE_DATE\",\n        \"source\": \"WEB\",\n        \"client\": \"WEB\",\n    }\n    r = fetcher.make_request(url, params=params)\n    data_json = r.json()\n    temp_df = pd.DataFrame(data_json[\"result\"][\"data\"])\n    temp_df.reset_index(inplace=True)\n    temp_df[\"index\"] = temp_df.index + 1\n    temp_df.columns = [\n        \"序号\",\n        \"股票代码\",\n        \"交易日\",\n        \"-\",\n    ]\n    temp_df = temp_df[\n        [\n            \"序号\",\n            \"股票代码\",\n            \"交易日\",\n        ]\n    ]\n    temp_df[\"交易日\"] = pd.to_datetime(temp_df[\"交易日\"]).dt.date\n    return temp_df\n\n\ndef stock_lhb_stock_detail_em(\n    symbol: str = \"000788\", date: str = \"20220315\", flag: str = \"卖出\"\n) -> pd.DataFrame:\n    \"\"\"\n    东方财富网-数据中心-龙虎榜单-个股龙虎榜详情\n    https://data.eastmoney.com/stock/lhb/600077.html\n    :param symbol: 股票代码\n    :type symbol: str\n    :param date: 查询日期; 需要通过 ak.stock_lhb_stock_detail_date_em(symbol=\"600077\") 接口获取相应股票的有龙虎榜详情数据的日期\n    :type date: str\n    :param flag: choice of {\"买入\", \"卖出\"}\n    :type flag: str\n    :return: 个股龙虎榜详情\n    :rtype: pandas.DataFrame\n    \"\"\"\n    flag_map = {\n        \"买入\": \"BUY\",\n        \"卖出\": \"SELL\",\n    }\n    report_map = {\n        \"买入\": \"RPT_BILLBOARD_DAILYDETAILSBUY\",\n        \"卖出\": \"RPT_BILLBOARD_DAILYDETAILSSELL\",\n    }\n    url = \"https://datacenter-web.eastmoney.com/api/data/v1/get\"\n    params = {\n        \"reportName\": report_map[flag],\n        \"columns\": \"ALL\",\n        \"filter\": f\"\"\"(TRADE_DATE='{'-'.join([date[:4], date[4:6], date[6:]])}')(SECURITY_CODE=\"{symbol}\")\"\"\",\n        \"pageNumber\": \"1\",\n        \"pageSize\": \"500\",\n        \"sortTypes\": \"-1\",\n        \"sortColumns\": flag_map[flag],\n        \"source\": \"WEB\",\n        \"client\": \"WEB\",\n        \"_\": \"1647338693644\",\n    }\n    r = fetcher.make_request(url, params=params)\n    data_json = r.json()\n    temp_df = pd.DataFrame(data_json[\"result\"][\"data\"])\n    temp_df.reset_index(inplace=True)\n    temp_df[\"index\"] = temp_df.index + 1\n\n    if flag == \"买入\":\n        temp_df.columns = [\n            \"序号\",\n            \"-\",\n            \"-\",\n            \"-\",\n            \"-\",\n            \"交易营业部名称\",\n            \"类型\",\n            \"-\",\n            \"-\",\n            \"-\",\n            \"-\",\n            \"买入金额\",\n            \"卖出金额\",\n            \"净额\",\n            \"-\",\n            \"-\",\n            \"-\",\n            \"-\",\n            \"买入金额-占总成交比例\",\n            \"卖出金额-占总成交比例\",\n            \"-\",\n        ]\n        temp_df = temp_df[\n            [\n                \"序号\",\n                \"交易营业部名称\",\n                \"买入金额\",\n                \"买入金额-占总成交比例\",\n                \"卖出金额\",\n                \"卖出金额-占总成交比例\",\n                \"净额\",\n                \"类型\",\n            ]\n        ]\n        temp_df[\"买入金额\"] = pd.to_numeric(temp_df[\"买入金额\"])\n        temp_df[\"买入金额-占总成交比例\"] = pd.to_numeric(temp_df[\"买入金额-占总成交比例\"])\n        temp_df[\"卖出金额\"] = pd.to_numeric(temp_df[\"卖出金额\"])\n        temp_df[\"卖出金额-占总成交比例\"] = pd.to_numeric(temp_df[\"卖出金额-占总成交比例\"])\n        temp_df.sort_values(\"类型\", inplace=True)\n        temp_df.reset_index(inplace=True, drop=True)\n        temp_df[\"序号\"] = range(1, len(temp_df[\"序号\"]) + 1)\n    else:\n        temp_df.columns = [\n            \"序号\",\n            \"-\",\n            \"-\",\n            \"-\",\n            \"-\",\n            \"交易营业部名称\",\n            \"类型\",\n            \"-\",\n            \"-\",\n            \"-\",\n            \"-\",\n            \"买入金额\",\n            \"卖出金额\",\n            \"净额\",\n            \"-\",\n            \"-\",\n            \"-\",\n            \"-\",\n            \"买入金额-占总成交比例\",\n            \"卖出金额-占总成交比例\",\n            \"-\",\n        ]\n        temp_df = temp_df[\n            [\n                \"序号\",\n                \"交易营业部名称\",\n                \"买入金额\",\n                \"买入金额-占总成交比例\",\n                \"卖出金额\",\n                \"卖出金额-占总成交比例\",\n                \"净额\",\n                \"类型\",\n            ]\n        ]\n        temp_df[\"买入金额\"] = pd.to_numeric(temp_df[\"买入金额\"])\n        temp_df[\"买入金额-占总成交比例\"] = pd.to_numeric(temp_df[\"买入金额-占总成交比例\"])\n        temp_df[\"卖出金额\"] = pd.to_numeric(temp_df[\"卖出金额\"])\n        temp_df[\"卖出金额-占总成交比例\"] = pd.to_numeric(temp_df[\"卖出金额-占总成交比例\"])\n        temp_df.sort_values(\"类型\", inplace=True)\n        temp_df.reset_index(inplace=True, drop=True)\n        temp_df[\"序号\"] = range(1, len(temp_df[\"序号\"]) + 1)\n    return temp_df\n\n\nif __name__ == \"__main__\":\n    stock_lhb_detail_em_df = stock_lhb_detail_em(\n        start_date=\"20230403\", end_date=\"20230417\"\n    )\n    print(stock_lhb_detail_em_df)\n\n    stock_lhb_stock_statistic_em_df = stock_lhb_stock_statistic_em(symbol=\"近一月\")\n    print(stock_lhb_stock_statistic_em_df)\n\n    stock_lhb_stock_statistic_em_df = stock_lhb_stock_statistic_em(symbol=\"近三月\")\n    print(stock_lhb_stock_statistic_em_df)\n\n    stock_lhb_stock_statistic_em_df = stock_lhb_stock_statistic_em(symbol=\"近六月\")\n    print(stock_lhb_stock_statistic_em_df)\n\n    stock_lhb_stock_statistic_em_df = stock_lhb_stock_statistic_em(symbol=\"近一年\")\n    print(stock_lhb_stock_statistic_em_df)\n\n    stock_lhb_jgmmtj_em_df = stock_lhb_jgmmtj_em(\n        start_date=\"20220904\", end_date=\"20220906\"\n    )\n    print(stock_lhb_jgmmtj_em_df)\n\n    stock_lhb_jgstatistic_em_df = stock_lhb_jgstatistic_em(symbol=\"近一月\")\n    print(stock_lhb_jgstatistic_em_df)\n\n    stock_lhb_hyyyb_em_df = stock_lhb_hyyyb_em(\n        start_date=\"20220324\", end_date=\"20220324\"\n    )\n    print(stock_lhb_hyyyb_em_df)\n\n    stock_lhb_yybph_em_df = stock_lhb_yybph_em(symbol=\"近一月\")\n    print(stock_lhb_yybph_em_df)\n\n    stock_lhb_traderstatistic_em_df = stock_lhb_traderstatistic_em(symbol=\"近一月\")\n    print(stock_lhb_traderstatistic_em_df)\n\n    stock_lhb_stock_detail_date_em_df = stock_lhb_stock_detail_date_em(symbol=\"002901\")\n    print(stock_lhb_stock_detail_date_em_df)\n\n    stock_lhb_stock_detail_em_df = stock_lhb_stock_detail_em(\n        symbol=\"002901\", date=\"20221012\", flag=\"买入\"\n    )\n    print(stock_lhb_stock_detail_em_df)\n\n    stock_lhb_stock_detail_em_df = stock_lhb_stock_detail_em(\n        symbol=\"600016\", date=\"20220324\", flag=\"买入\"\n    )\n    print(stock_lhb_stock_detail_em_df)\n"
  },
  {
    "path": "instock/core/crawling/stock_lhb_sina.py",
    "content": "#!/usr/bin/env python\n# -*- coding:utf-8 -*-\n\"\"\"\nDate: 2024/5/10 00:00\nDesc: 新浪财经-龙虎榜\nhttps://vip.stock.finance.sina.com.cn/q/go.php/vInvestConsult/kind/lhb/index.phtml\n\"\"\"\n\nfrom io import StringIO\nimport pandas as pd\nimport requests\nfrom bs4 import BeautifulSoup\nfrom tqdm import tqdm\nfrom instock.core.singleton_proxy import proxys\n\n\ndef stock_lhb_detail_daily_sina(date: str = \"20240222\") -> pd.DataFrame:\n    \"\"\"\n    龙虎榜-每日详情\n    https://vip.stock.finance.sina.com.cn/q/go.php/vInvestConsult/kind/lhb/index.phtml\n    :param date: 交易日\n    :type date: str\n    :return: 龙虎榜-每日详情\n    :rtype: pandas.DataFrame\n    \"\"\"\n    date = \"-\".join([date[:4], date[4:6], date[6:]])\n    url = \"https://vip.stock.finance.sina.com.cn/q/go.php/vInvestConsult/kind/lhb/index.phtml\"\n    params = {\"tradedate\": date}\n    r = requests.get(url, proxies = proxys().get_proxies(), params=params)\n    soup = BeautifulSoup(r.text, features=\"lxml\")\n    selected_html = soup.find(name=\"div\", attrs={\"class\": \"list\"}).find_all(\n        name=\"table\", attrs={\"class\": \"list_table\"}\n    )\n    big_df = pd.DataFrame()\n    for table in selected_html:\n        temp_df = pd.read_html(StringIO(table.prettify()), header=0, skiprows=1)[0]\n        temp_symbol = pd.read_html(StringIO(table.prettify()))[0].iat[0, 0]\n        temp_df[\"指标\"] = temp_symbol\n        big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)\n    big_df[\"股票代码\"] = big_df[\"股票代码\"].astype(str).str.zfill(6)\n    del big_df[\"查看详情\"]\n    big_df.columns = [\n        \"序号\",\n        \"股票代码\",\n        \"股票名称\",\n        \"收盘价\",\n        \"对应值\",\n        \"成交量\",\n        \"成交额\",\n        \"指标\",\n    ]\n    big_df[\"收盘价\"] = pd.to_numeric(big_df[\"收盘价\"], errors=\"coerce\")\n    big_df[\"对应值\"] = pd.to_numeric(big_df[\"对应值\"], errors=\"coerce\")\n    big_df[\"成交量\"] = pd.to_numeric(big_df[\"成交量\"], errors=\"coerce\")\n    big_df[\"成交额\"] = pd.to_numeric(big_df[\"成交额\"], errors=\"coerce\")\n    return big_df\n\n\ndef _find_last_page(\n    url: str = \"https://vip.stock.finance.sina.com.cn/q/go.php/vLHBData/kind/ggtj/index.phtml\",\n    recent_day: str = \"60\",\n):\n    params = {\n        \"last\": recent_day,\n        \"p\": \"1\",\n    }\n    r = requests.get(url, proxies = proxys().get_proxies(), params=params)\n    soup = BeautifulSoup(r.text, \"lxml\")\n    try:\n        previous_page = int(soup.find_all(attrs={\"class\": \"page\"})[-2].text)\n    except:  # noqa: E722\n        previous_page = 1\n    if previous_page != 1:\n        while True:\n            params = {\n                \"last\": recent_day,\n                \"p\": previous_page,\n            }\n            r = requests.get(url, proxies = proxys().get_proxies(), params=params)\n            soup = BeautifulSoup(r.text, features=\"lxml\")\n            last_page = int(soup.find_all(attrs={\"class\": \"page\"})[-2].text)\n            if last_page != previous_page:\n                previous_page = last_page\n                continue\n            else:\n                break\n    return previous_page\n\n\ndef stock_lhb_ggtj_sina(symbol: str = \"5\") -> pd.DataFrame:\n    \"\"\"\n    龙虎榜-个股上榜统计\n    https://vip.stock.finance.sina.com.cn/q/go.php/vLHBData/kind/ggtj/index.phtml\n    :param symbol: choice of {\"5\": 最近 5 天; \"10\": 最近 10 天; \"30\": 最近 30 天; \"60\": 最近 60 天;}\n    :type symbol: str\n    :return: 龙虎榜-个股上榜统计\n    :rtype: pandas.DataFrame\n    \"\"\"\n    url = (\n        \"https://vip.stock.finance.sina.com.cn/q/go.php/vLHBData/kind/ggtj/index.phtml\"\n    )\n    last_page_num = _find_last_page(url, symbol)\n    big_df = pd.DataFrame()\n    for page in tqdm(range(1, last_page_num + 1), leave=False):\n        params = {\n            \"last\": symbol,\n            \"p\": page,\n        }\n        r = requests.get(url, proxies = proxys().get_proxies(), params=params)\n        temp_df = pd.read_html(StringIO(r.text))[0].iloc[0:, :]\n        big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)\n    big_df[\"股票代码\"] = big_df[\"股票代码\"].astype(str).str.zfill(6)\n    big_df.columns = [\n        \"股票代码\",\n        \"股票名称\",\n        \"上榜次数\",\n        \"累积购买额\",\n        \"累积卖出额\",\n        \"净额\",\n        \"买入席位数\",\n        \"卖出席位数\",\n    ]\n    return big_df\n\n\ndef stock_lhb_yytj_sina(symbol: str = \"5\") -> pd.DataFrame:\n    \"\"\"\n    龙虎榜-营业部上榜统计\n    https://vip.stock.finance.sina.com.cn/q/go.php/vLHBData/kind/yytj/index.phtml\n    :param symbol: choice of {\"5\": 最近 5 天; \"10\": 最近 10 天; \"30\": 最近 30 天; \"60\": 最近 60 天;}\n    :type symbol: str\n    :return: 龙虎榜-营业部上榜统计\n    :rtype: pandas.DataFrame\n    \"\"\"\n    url = (\n        \"https://vip.stock.finance.sina.com.cn/q/go.php/vLHBData/kind/yytj/index.phtml\"\n    )\n    last_page_num = _find_last_page(url, symbol)\n    big_df = pd.DataFrame()\n    for page in tqdm(range(1, last_page_num + 1), leave=False):\n        params = {\n            \"last\": \"5\",\n            \"p\": page,\n        }\n        r = requests.get(url, proxies = proxys().get_proxies(), params=params)\n        temp_df = pd.read_html(StringIO(r.text))[0].iloc[0:, :]\n        big_df = pd.concat([big_df, temp_df], ignore_index=True)\n    big_df.columns = [\n        \"营业部名称\",\n        \"上榜次数\",\n        \"累积购买额\",\n        \"买入席位数\",\n        \"累积卖出额\",\n        \"卖出席位数\",\n        \"买入前三股票\",\n    ]\n    big_df[\"上榜次数\"] = pd.to_numeric(big_df[\"上榜次数\"], errors=\"coerce\")\n    big_df[\"买入席位数\"] = pd.to_numeric(big_df[\"买入席位数\"], errors=\"coerce\")\n    big_df[\"卖出席位数\"] = pd.to_numeric(big_df[\"卖出席位数\"], errors=\"coerce\")\n    return big_df\n\n\ndef stock_lhb_jgzz_sina(symbol: str = \"5\") -> pd.DataFrame:\n    \"\"\"\n    龙虎榜-机构席位追踪\n    https://vip.stock.finance.sina.com.cn/q/go.php/vLHBData/kind/jgzz/index.phtml\n    :param symbol: choice of {\"5\": 最近 5 天; \"10\": 最近 10 天; \"30\": 最近 30 天; \"60\": 最近 60 天;}\n    :type symbol: str\n    :return: 龙虎榜-机构席位追踪\n    :rtype: pandas.DataFrame\n    \"\"\"\n    url = (\n        \"https://vip.stock.finance.sina.com.cn/q/go.php/vLHBData/kind/jgzz/index.phtml\"\n    )\n    last_page_num = _find_last_page(url, symbol)\n    big_df = pd.DataFrame()\n    for page in tqdm(range(1, last_page_num + 1), leave=False):\n        params = {\n            \"last\": symbol,\n            \"p\": page,\n        }\n        r = requests.get(url, proxies = proxys().get_proxies(), params=params)\n        temp_df = pd.read_html(StringIO(r.text))[0].iloc[0:, :]\n        if temp_df.empty:\n            continue\n        big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)\n    big_df[\"股票代码\"] = big_df[\"股票代码\"].astype(str).str.zfill(6)\n    del big_df[\"当前价\"]\n    del big_df[\"涨跌幅\"]\n    big_df.columns = [\n        \"股票代码\",\n        \"股票名称\",\n        \"累积买入额\",\n        \"买入次数\",\n        \"累积卖出额\",\n        \"卖出次数\",\n        \"净额\",\n    ]\n    big_df[\"买入次数\"] = pd.to_numeric(big_df[\"买入次数\"], errors=\"coerce\")\n    big_df[\"卖出次数\"] = pd.to_numeric(big_df[\"卖出次数\"], errors=\"coerce\")\n    return big_df\n\n\ndef stock_lhb_jgmx_sina() -> pd.DataFrame:\n    \"\"\"\n    龙虎榜-机构席位成交明细\n    https://vip.stock.finance.sina.com.cn/q/go.php/vLHBData/kind/jgmx/index.phtml\n    :return: 龙虎榜-机构席位成交明细\n    :rtype: pandas.DataFrame\n    \"\"\"\n    url = (\n        \"https://vip.stock.finance.sina.com.cn/q/go.php/vLHBData/kind/jgmx/index.phtml\"\n    )\n    params = {\n        \"p\": \"1\",\n    }\n    r = requests.get(url, proxies = proxys().get_proxies(), params=params)\n    soup = BeautifulSoup(r.text, features=\"lxml\")\n    try:\n        last_page_num = int(soup.find_all(attrs={\"class\": \"page\"})[-2].text)\n    except:  # noqa: E722\n        last_page_num = 1\n    big_df = pd.DataFrame()\n    for page in tqdm(range(1, last_page_num + 1), leave=False):\n        params = {\n            \"p\": page,\n        }\n        r = requests.get(url, proxies = proxys().get_proxies(), params=params)\n        temp_df = pd.read_html(StringIO(r.text))[0].iloc[0:, :]\n        big_df = pd.concat(objs=[big_df, temp_df], ignore_index=True)\n    big_df[\"股票代码\"] = big_df[\"股票代码\"].astype(str).str.zfill(6)\n    big_df[\"交易日期\"] = pd.to_datetime(big_df[\"交易日期\"], errors=\"coerce\").dt.date\n    big_df.rename(\n        columns={\n            \"机构席位买入额(万)\": \"机构席位买入额\",\n            \"机构席位卖出额(万)\": \"机构席位卖出额\",\n        },\n        inplace=True,\n    )\n    big_df[\"机构席位买入额\"] = pd.to_numeric(big_df[\"机构席位买入额\"], errors=\"coerce\")\n    big_df[\"机构席位卖出额\"] = pd.to_numeric(big_df[\"机构席位卖出额\"], errors=\"coerce\")\n    return big_df\n\n\nif __name__ == \"__main__\":\n    stock_lhb_detail_daily_sina_df = stock_lhb_detail_daily_sina(date=\"20240222\")\n    print(stock_lhb_detail_daily_sina_df)\n\n    stock_lhb_ggtj_sina_df = stock_lhb_ggtj_sina(symbol=\"5\")\n    print(stock_lhb_ggtj_sina_df)\n\n    stock_lhb_yytj_sina_df = stock_lhb_yytj_sina(symbol=\"5\")\n    print(stock_lhb_yytj_sina_df)\n\n    stock_lhb_jgzz_sina_df = stock_lhb_jgzz_sina(symbol=\"5\")\n    print(stock_lhb_jgzz_sina_df)\n\n    stock_lhb_jgmx_sina_df = stock_lhb_jgmx_sina()\n    print(stock_lhb_jgmx_sina_df)"
  },
  {
    "path": "instock/core/crawling/stock_limitup_reason.py",
    "content": "#!/usr/bin/env python\n# -*- coding:utf-8 -*-\n\"\"\"\nDate: 2025/2/26 12:18\nDesc: 同花顺涨停原因\nhttp://zx.10jqka.com.cn/event/api/getharden/date/2025-02-21/orderby/date/orderway/desc/charset/GBK/\n\"\"\"\n\nimport pandas as pd\nimport requests\nimport re\nimport numpy as np\nfrom instock.core.singleton_proxy import proxys\n\n__author__ = 'myh '\n__date__ = '2025/5/9 '\n\ndef stock_limitup_reason(date: str = \"2025-02-27\") -> pd.DataFrame:\n    \"\"\"\n    同花顺涨停原因\n    http://zx.10jqka.com.cn/event/api/getharden/date/2025-02-27/orderby/date/orderway/desc/charset/GBK/\n    :return: 涨停原因\n    :rtype: pandas.DataFrame\n    \"\"\"\n    url = f\"http://zx.10jqka.com.cn/event/api/getharden/date/{date}/orderby/date/orderway/desc/charset/GBK/\"\n    headers = {\n        \"User-Agent\": \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 Thx\"\n    }\n    r = requests.get(url, proxies = proxys().get_proxies(), headers=headers)\n    data_json = r.json()\n\n    data = data_json[\"data\"]\n    if not data:\n        return pd.DataFrame()\n\n    temp_df = pd.DataFrame(data)\n    if len(temp_df.columns)<7:\n        temp_df.columns = [\n            \"ID\",\n            \"名称\",\n            \"代码\",\n            \"原因\",\n            \"日期\",\n            \"_\",\n        ]\n        temp_df[\"最新价\"] = np.nan\n        temp_df[\"涨跌额\"] = np.nan\n        temp_df[\"涨跌幅\"] = np.nan\n        temp_df[\"换手率\"] = np.nan\n        temp_df[\"成交额\"] = np.nan\n        temp_df[\"成交量\"] = np.nan\n        temp_df[\"DDE\"] = np.nan\n    else:\n        temp_df.columns = [\n            \"ID\",\n            \"名称\",\n            \"代码\",\n            \"原因\",\n            \"日期\",\n            \"最新价\",\n            \"涨跌额\",\n            \"涨跌幅\",\n            \"换手率\",\n            \"成交额\",\n            \"成交量\",\n            \"DDE\",\n            \"_\",\n        ]\n\n    temp_df[\"详因\"] = temp_df.apply(stock_limitup_detail, axis=1)\n    temp_df[\"换手率\"] = round(temp_df[\"换手率\"], 2)\n    temp_df = temp_df[\n        [\n            \"日期\",\n            \"代码\",\n            \"名称\",\n            \"原因\",\n            \"详因\",\n            \"最新价\",\n            \"涨跌幅\",\n            \"涨跌额\",\n            \"换手率\",\n            \"成交量\",\n            \"成交额\",\n            \"DDE\",\n        ]\n    ]\n\n    return temp_df\n\n\ndef stock_limitup_detail(row):\n    \"\"\"\n    同花顺涨停详因\n    http://zx.10jqka.com.cn/event/harden/stockreason/id/70870005\n    :return: 涨停详因\n    :rtype: pandas.DataFrame\n    \"\"\"\n    url = f\"http://zx.10jqka.com.cn/event/harden/stockreason/id/{row['ID']}\"\n    headers = {\n        \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36\"\n    }\n    r = requests.get(url, proxies = proxys().get_proxies(), headers=headers)\n    data_text = r.text\n\n    # match_title = re.search(r\"var title = '(.*?)';\", data_text)\n    # _title = \"\"\n    # if match_title:\n    #     _title = match_title.group(1)\n\n    pattern_data = re.search(r\"var data = '(.*?)';\", data_text)\n    _data = \"\"\n    if pattern_data:\n        _data = pattern_data.group(1).replace(\"&lt;spanclass=&quot;hl&quot;&gt;\", \"\").replace(\"&lt;/span&gt;\", \"\").replace(\"&amp;quot;\", \"\\\"\")\n    return _data\n\n    # reason = f\"{_title}\\r\\n{_data}\"\n\n    # return reason\n\nif __name__ == \"__main__\":\n    stock_limitup_reason_df = stock_limitup_reason()\n    print(stock_limitup_reason_df)\n"
  },
  {
    "path": "instock/core/crawling/stock_selection.py",
    "content": "# -*- coding:utf-8 -*-\n# !/usr/bin/env python\n\nimport math\nimport random\nimport time\nimport pandas as pd\nimport instock.core.tablestructure as tbs\nfrom instock.core.eastmoney_fetcher import eastmoney_fetcher\n\n__author__ = 'myh '\n__date__ = '2025/12/31 '\n\n# 创建全局实例，供所有函数使用\nfetcher = eastmoney_fetcher()\n\ndef stock_selection() -> pd.DataFrame:\n    \"\"\"\n    东方财富网-个股-选股器\n    https://data.eastmoney.com/xuangu/\n    :return: 选股器\n    :rtype: pandas.DataFrame\n    \"\"\"\n    cols = tbs.TABLE_CN_STOCK_SELECTION['columns']\n    page_size = 50\n    page_current = 1\n    sty = \"\"  # 初始值 \"SECUCODE,SECURITY_CODE,SECURITY_NAME_ABBR,CHANGE_RATE\"\n    for k in cols:\n        sty = f\"{sty},{cols[k]['map']}\"\n    url = \"https://data.eastmoney.com/dataapi/xuangu/list\"\n    params = {\n        \"sty\": sty[1:],\n        \"filter\": \"(MARKET+in+(\\\"上交所主板\\\",\\\"深交所主板\\\",\\\"深交所创业板\\\"))(NEW_PRICE>0)\",\n        \"p\": page_current,\n        \"ps\": page_size,\n        \"source\": \"SELECT_SECURITIES\",\n        \"client\": \"WEB\"\n    }\n\n    r = fetcher.make_request(url, params=params)\n    data_json = r.json()\n    data = data_json[\"result\"][\"data\"]\n    if not data:\n        return pd.DataFrame()\n\n    data_count = data_json[\"result\"][\"count\"]\n    page_count = math.ceil(data_count/page_size)\n    while page_count > 1:\n        # 添加随机延迟，避免爬取过快\n        time.sleep(random.uniform(1, 1.5))\n        page_current = page_current + 1\n        params[\"p\"] = page_current\n        r = fetcher.make_request(url, params=params)\n        data_json = r.json()\n        _data = data_json[\"result\"][\"data\"]\n        data.extend(_data)\n        page_count =page_count - 1\n\n    temp_df = pd.DataFrame(data)\n\n    mask = ~temp_df['CONCEPT'].isna()\n    temp_df.loc[mask, 'CONCEPT'] = temp_df.loc[mask, 'CONCEPT'].apply(lambda x: ', '.join(x))\n    mask = ~temp_df['STYLE'].isna()\n    temp_df.loc[mask, 'STYLE'] = temp_df.loc[mask, 'STYLE'].apply(lambda x: ', '.join(x))\n\n    for k in cols:\n        t = tbs.get_field_type_name(cols[k][\"type\"])\n        if t == 'numeric':\n            temp_df[cols[k][\"map\"]] = pd.to_numeric(temp_df[cols[k][\"map\"]], errors=\"coerce\")\n        elif t == 'datetime':\n            temp_df[cols[k][\"map\"]] = pd.to_datetime(temp_df[cols[k][\"map\"]], errors=\"coerce\").dt.date\n\n    return temp_df\n\n\ndef stock_selection_params():\n    \"\"\"\n    东方财富网-个股-选股器-选股指标\n    https://data.eastmoney.com/xuangu/\n    :return: 选股器-选股指标\n    :rtype: pandas.DataFrame\n    \"\"\"\n    url = \"https://datacenter-web.eastmoney.com/wstock/selection/api/data/get\"\n    params = {\n        \"type\": \"RPTA_PCNEW_WHOLE\",\n        \"sty\": \"ALL\",\n        \"p\": 1,\n        \"ps\": 1000,\n        \"source\": \"SELECT_SECURITIES\",\n        \"client\": \"WEB\"\n    }\n\n    r = fetcher.make_request(url, params=params)\n    data_json = r.json()\n    zxzb = data_json[\"result\"][\"data\"]  # 指标\n    print(zxzb)\n\n\nif __name__ == \"__main__\":\n    stock_selection_df = stock_selection()\n    print(stock_selection)\n    # stock_selection_params()"
  },
  {
    "path": "instock/core/crawling/trade_date_hist.py",
    "content": "#!/usr/bin/env python\n# -*- coding:utf-8 -*-\n\"\"\"\nDate: 2022/10/1 19:27\nDesc: 新浪财经-交易日历\nhttps://finance.sina.com.cn/realstock/company/klc_td_sh.txt\n此处可以用来更新 calendar.json 文件，注意末尾没有 \",\" 号\n\"\"\"\nimport datetime\nimport pandas as pd\nimport requests\nfrom py_mini_racer import MiniRacer\nfrom instock.core.singleton_proxy import proxys\n\nhk_js_decode = \"\"\"\nfunction d(t) {\n    var e, i, n, r, a, o, s, l = (arguments,\n            864e5), u = 7657, c = [], h = [], d = ~(3 << 30), f = 1 << 30,\n        p = [0, 3, 5, 6, 9, 10, 12, 15, 17, 18, 20, 23, 24, 27, 29, 30], m = Math, g = function () {\n            var l, u;\n            for (l = 0; 64 > l; l++)\n                h[l] = m.pow(2, l),\n                26 > l && (c[l] = v(l + 65),\n                    c[l + 26] = v(l + 97),\n                10 > l && (c[l + 52] = v(l + 48)));\n            for (c.push(\"+\", \"/\"),\n                     c = c.join(\"\"),\n                     i = t.split(\"\"),\n                     n = i.length,\n                     l = 0; n > l; l++)\n                i[l] = c.indexOf(i[l]);\n            return r = {},\n                e = o = 0,\n                a = {},\n                u = w([12, 6]),\n                s = 63 ^ u[1],\n            {\n                _1479: T,\n                _136: _,\n                _200: S,\n                _139: k,\n                _197: _mi_run\n            }[\"_\" + u[0]] || function () {\n                return []\n            }\n        }, v = String.fromCharCode, b = function (t) {\n            return t === {}._\n        }, N = function () {\n            var t, e;\n            for (t = y(),\n                     e = 1; ;) {\n                if (!y())\n                    return e * (2 * t - 1);\n                e++\n            }\n        }, y = function () {\n            var t;\n            return e >= n ? 0 : (t = i[e] & 1 << o,\n                o++,\n            o >= 6 && (o -= 6,\n                e++),\n                !!t)\n        }, w = function (t, r, a) {\n            var s, l, u, c, d;\n            for (l = [],\n                     u = 0,\n                 r || (r = []),\n                 a || (a = []),\n                     s = 0; s < t.length; s++)\n                if (c = t[s],\n                    u = 0,\n                    c) {\n                    if (e >= n)\n                        return l;\n                    if (t[s] <= 0)\n                        u = 0;\n                    else if (t[s] <= 30) {\n                        for (; d = 6 - o,\n                                   d = c > d ? d : c,\n                                   u |= (i[e] >> o & (1 << d) - 1) << t[s] - c,\n                                   o += d,\n                               o >= 6 && (o -= 6,\n                                   e++),\n                                   c -= d,\n                                   !(0 >= c);)\n                            ;\n                        r[s] && u >= h[t[s] - 1] && (u -= h[t[s]])\n                    } else\n                        u = w([30, t[s] - 30], [0, r[s]]),\n                        a[s] || (u = u[0] + u[1] * h[30]);\n                    l[s] = u\n                } else\n                    l[s] = 0;\n            return l\n        }, x = function (t) {\n            var e, i, n;\n            for (t > 1 && (e = 0),\n                     e = 0; t > e; e++)\n                r.d++,\n                    n = r.d % 7,\n                (3 == n || 4 == n) && (r.d += 5 - n);\n            return i = new Date,\n                i.setTime((u + r.d) * l),\n                i\n        }, S = function () {\n            var t, i, a, o, l;\n            if (s >= 1)\n                return [];\n            for (r.d = w([18], [1])[0] - 1,\n                     a = w([3, 3, 30, 6]),\n                     r.p = a[0],\n                     r.ld = a[1],\n                     r.cd = a[2],\n                     r.c = a[3],\n                     r.m = m.pow(10, r.p),\n                     r.pc = r.cd / r.m,\n                     i = [],\n                     t = 0; o = {\n                d: 1\n            },\n                 y() && (a = w([3])[0],\n                     0 == a ? o.d = w([6])[0] : 1 == a ? (r.d = w([18])[0],\n                         o.d = 0) : o.d = a),\n                     l = {\n                         day: x(o.d)\n                     },\n                 y() && (r.ld += N()),\n                     a = w([3 * r.ld], [1]),\n                     r.cd += a[0],\n                     l.close = r.cd / r.m,\n                     i.push(l),\n                 !(e >= n) && (e != n - 1 || 63 & (r.c ^ t + 1)); t++)\n                ;\n            return i[0].prevclose = r.pc,\n                i\n        }, _ = function () {\n            var t, i, a, o, l, u, c, h, d, f, p;\n            if (s > 2)\n                return [];\n            for (c = [],\n                     d = {\n                         v: \"volume\",\n                         p: \"price\",\n                         a: \"avg_price\"\n                     },\n                     r.d = w([18], [1])[0] - 1,\n                     h = {\n                         day: x(1)\n                     },\n                     a = w(1 > s ? [3, 3, 4, 1, 1, 1, 5] : [4, 4, 4, 1, 1, 1, 3]),\n                     t = 0; 7 > t; t++)\n                r[[\"la\", \"lp\", \"lv\", \"tv\", \"rv\", \"zv\", \"pp\"][t]] = a[t];\n            for (r.m = m.pow(10, r.pp),\n                     s >= 1 ? (a = w([3, 3]),\n                         r.c = a[0],\n                         a = a[1]) : (a = 5,\n                         r.c = 2),\n                     r.pc = w([6 * a])[0],\n                     h.pc = r.pc / r.m,\n                     r.cp = r.pc,\n                     r.da = 0,\n                     r.sa = r.sv = 0,\n                     t = 0; !(e >= n) && (e != n - 1 || 7 & (r.c ^ t)); t++) {\n                for (l = {},\n                         o = {},\n                         f = r.tv ? y() : 1,\n                         i = 0; 3 > i; i++)\n                    if (p = [\"v\", \"p\", \"a\"][i],\n                    (f ? y() : 0) && (a = N(),\n                        r[\"l\" + p] += a),\n                        u = \"v\" == p && r.rv ? y() : 1,\n                        a = w([3 * r[\"l\" + p] + (\"v\" == p ? 7 * u : 0)], [!!i])[0] * (u ? 1 : 100),\n                        o[p] = a,\n                    \"v\" == p) {\n                        if (!(l[d[p]] = a) && (s > 1 || 241 > t) && (r.zv ? !y() : 1)) {\n                            o.p = 0;\n                            break\n                        }\n                    } else\n                        \"a\" == p && (r.da = (1 > s ? 0 : r.da) + o.a);\n                r.sv += o.v,\n                    l[d.p] = (r.cp += o.p) / r.m,\n                    r.sa += o.v * r.cp,\n                    l[d.a] = b(o.a) ? t ? c[t - 1][d.a] : l[d.p] : r.sv ? ((m.floor((r.sa * (2e3 / r.m) + r.sv) / r.sv) >> 1) + r.da) / 1e3 : l[d.p] + r.da / 1e3,\n                    c.push(l)\n            }\n            return c[0].date = h.day,\n                c[0].prevclose = h.pc,\n                c\n        }, T = function () {\n            var t, e, i, n, a, o, l;\n            if (s >= 1)\n                return [];\n            for (r.lv = 0,\n                     r.ld = 0,\n                     r.cd = 0,\n                     r.cv = [0, 0],\n                     r.p = w([6])[0],\n                     r.d = w([18], [1])[0] - 1,\n                     r.m = m.pow(10, r.p),\n                     a = w([3, 3]),\n                     r.md = a[0],\n                     r.mv = a[1],\n                     t = []; a = w([6]),\n                     a.length;) {\n                if (i = {\n                    c: a[0]\n                },\n                    n = {},\n                    i.d = 1,\n                32 & i.c)\n                    for (; ;) {\n                        if (a = w([6])[0],\n                        63 == (16 | a)) {\n                            l = 16 & a ? \"x\" : \"u\",\n                                a = w([3, 3]),\n                                i[l + \"_d\"] = a[0] + r.md,\n                                i[l + \"_v\"] = a[1] + r.mv;\n                            break\n                        }\n                        if (32 & a) {\n                            o = 8 & a ? \"d\" : \"v\",\n                                l = 16 & a ? \"x\" : \"u\",\n                                i[l + \"_\" + o] = (7 & a) + r[\"m\" + o];\n                            break\n                        }\n                        if (o = 15 & a,\n                            0 == o ? i.d = w([6])[0] : 1 == o ? (r.d = o = w([18])[0],\n                                i.d = 0) : i.d = o,\n                            !(16 & a))\n                            break\n                    }\n                n.date = x(i.d);\n                for (o in {\n                    v: 0,\n                    d: 0\n                })\n                    b(i[\"x_\" + o]) || (r[\"l\" + o] = i[\"x_\" + o]),\n                    b(i[\"u_\" + o]) && (i[\"u_\" + o] = r[\"l\" + o]);\n                for (i.l_l = [i.u_d, i.u_d, i.u_d, i.u_d, i.u_v],\n                         l = p[15 & i.c],\n                     1 & i.u_v && (l = 31 - l),\n                     16 & i.c && (i.l_l[4] += 2),\n                         e = 0; 5 > e; e++)\n                    l & 1 << 4 - e && i.l_l[e]++,\n                        i.l_l[e] *= 3;\n                i.d_v = w(i.l_l, [1, 0, 0, 1, 1], [0, 0, 0, 0, 1]),\n                    o = r.cd + i.d_v[0],\n                    n.open = o / r.m,\n                    n.high = (o + i.d_v[1]) / r.m,\n                    n.low = (o - i.d_v[2]) / r.m,\n                    n.close = (o + i.d_v[3]) / r.m,\n                    a = i.d_v[4],\n                \"number\" == typeof a && (a = [a, a >= 0 ? 0 : -1]),\n                    r.cd = o + i.d_v[3],\n                    l = r.cv[0] + a[0],\n                    r.cv = [l & d, r.cv[1] + a[1] + !!((r.cv[0] & d) + (a[0] & d) & f)],\n                    n.volume = (r.cv[0] & f - 1) + r.cv[1] * f,\n                    t.push(n)\n            }\n            return t\n        }, k = function () {\n            var t, e, i, n;\n            if (s > 1)\n                return [];\n            for (r.l = 0,\n                     n = -1,\n                     r.d = w([18])[0] - 1,\n                     i = w([18])[0]; r.d < i;)\n                e = x(1),\n                    0 >= n ? (y() && (r.l += N()),\n                        n = w([3 * r.l], [0])[0] + 1,\n                    t || (t = [e],\n                        n--)) : t.push(e),\n                    n--;\n            return t\n        };\n    return _mi_run = function () {\n        var t, i, a, o;\n        if (s >= 1)\n            return [];\n        for (r.f = w([6])[0],\n                 r.c = w([6])[0],\n                 a = [],\n                 r.dv = [],\n                 r.dl = [],\n                 t = 0; t < r.f; t++)\n            r.dv[t] = 0,\n                r.dl[t] = 0;\n        for (t = 0; !(e >= n) && (e != n - 1 || 7 & (r.c ^ t)); t++) {\n            for (o = [],\n                     i = 0; i < r.f; i++)\n                y() && (r.dl[i] += N()),\n                    r.dv[i] += w([3 * r.dl[i]], [1])[0],\n                    o[i] = r.dv[i];\n            a.push(o)\n        }\n        return a\n    }\n        ,\n        g()()\n}\n\"\"\"\n\n\ndef tool_trade_date_hist_sina() -> pd.DataFrame:\n    \"\"\"\n    交易日历-历史数据\n    https://finance.sina.com.cn/realstock/company/klc_td_sh.txt\n    :return: 交易日历\n    :rtype: pandas.DataFrame\n    \"\"\"\n    url = \"https://finance.sina.com.cn/realstock/company/klc_td_sh.txt\"\n    r = requests.get(url, proxies = proxys().get_proxies())\n    js_code = MiniRacer()\n    js_code.eval(hk_js_decode)\n    dict_list = js_code.call(\n        \"d\", r.text.split(\"=\")[1].split(\";\")[0].replace('\"', \"\")\n    )  # 执行js解密代码\n    temp_df = pd.DataFrame(dict_list)\n    temp_df.columns = [\"trade_date\"]\n    temp_df[\"trade_date\"] = pd.to_datetime(temp_df[\"trade_date\"]).dt.date\n    temp_list = temp_df[\"trade_date\"].to_list()\n    temp_list.append(datetime.date(1992, 5, 4))  # 是交易日但是交易日历缺失该日期\n    temp_list.sort()\n    temp_df = pd.DataFrame(temp_list, columns=[\"trade_date\"])\n    return temp_df\n\n\nif __name__ == \"__main__\":\n    tool_trade_date_hist_df = tool_trade_date_hist_sina()\n    print(tool_trade_date_hist_df)\n"
  },
  {
    "path": "instock/core/eastmoney_fetcher.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\nimport os\nimport requests\nfrom requests.adapters import HTTPAdapter\nfrom urllib3.util.retry import Retry\nfrom pathlib import Path\nimport time\nimport random\nfrom instock.core.singleton_proxy import proxys\n\n__author__ = 'myh '\n__date__ = '2025/12/31 '\n\nclass eastmoney_fetcher:\n    \"\"\"\n    东方财富网数据获取器\n    封装了Cookie管理、会话管理和请求发送功能\n    \"\"\"\n\n    def __init__(self):\n        \"\"\"初始化获取器\"\"\"\n        self.base_dir = os.path.dirname(os.path.dirname(__file__))\n        self.session = self._create_session()\n        self.proxies = proxys().get_proxies()\n\n    def _get_cookie(self):\n        \"\"\"\n        获取东方财富网的Cookie\n        优先级：环境变量 > 文件 > 默认Cookie\n        \"\"\"\n        # 1. 尝试从环境变量获取\n        cookie = os.environ.get('EAST_MONEY_COOKIE')\n        if cookie:\n            # print(\"环境变量中的Cookie: 已设置\")\n            return cookie\n\n        # 2. 尝试从文件获取\n        cookie_file = Path(os.path.join(self.base_dir, 'config', 'eastmoney_cookie.txt'))\n        if cookie_file.exists():\n            with open(cookie_file, 'r') as f:\n                cookie = f.read().strip()\n            if cookie:\n                # print(\"文件中的Cookie: 已设置\")\n                return cookie\n\n        # 3. 默认Cookie（可能过期，仅作为备选）\n        return 'st_si=78948464251292; st_psi=20260205091253851-119144370567-1089607836; st_pvi=07789985376191; st_sp=2026-02-05%2009%3A11%3A13; st_inirUrl=https%3A%2F%2Fxuangu.eastmoney.com%2FResult; st_sn=12; st_asi=20260205091253851-119144370567-1089607836-webznxg.dbssk.qxg-1'\n\n    def _create_session(self):\n        \"\"\"创建并配置会话\"\"\"\n        session = requests.Session()\n\n        # 配置连接池\n        retry_strategy = Retry(\n            total=3,\n            backoff_factor=0.1,\n            status_forcelist=[429, 500, 502, 503, 504],\n            allowed_methods=[\"HEAD\", \"GET\", \"POST\", \"OPTIONS\"]\n        )\n        adapter = HTTPAdapter(\n            max_retries=retry_strategy,\n            pool_connections=50,  # 增加连接池大小\n            pool_maxsize=50  # 增加连接池最大大小\n        )\n\n        # 为http和https请求添加适配器\n        session.mount(\"http://\", adapter)\n        session.mount(\"https://\", adapter)\n\n        # 设置请求头\n        headers = {\n            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',\n            'Referer': 'https://quote.eastmoney.com/',\n            'Accept': '*/*',\n            'Accept-Language': 'zh-CN,zh;q=0.9',\n            'Accept-Encoding': 'gzip, deflate, br, zstd',\n            'Connection': 'keep-alive',\n        }\n        session.headers.update(headers)\n        # 设置Cookie\n        session.cookies.update({'Cookie': self._get_cookie()})\n        return session\n\n    def make_request(self, url, params=None, retry=3, timeout=10):\n        \"\"\"\n        发送请求\n        :param url: 请求URL\n        :param params: 请求参数\n        :param retry: 重试次数\n        :param timeout: 超时时间\n        :return: 响应对象\n        \"\"\"\n        for i in range(retry):\n            try:\n                response = self.session.get(\n                    url,\n                    proxies=self.proxies,\n                    params=params,\n                    timeout=timeout\n                )\n                response.raise_for_status()  # 检查HTTP错误\n                return response\n            except requests.exceptions.RequestException as e:\n                print(f\"请求错误: {e}, 第 {i + 1}/{retry} 次重试\")\n                if i < retry - 1:\n                    # 随机延迟后重试\n                    time.sleep(random.uniform(1, 3))\n                else:\n                    raise\n\n    def make_post_request(self, url, data=None, json=None, params=None, retry=3, timeout=60):\n        \"\"\"\n        发送POST请求\n        :param url: 请求URL\n        :param data: 请求数据（表单形式）\n        :param json: 请求数据（JSON形式）\n        :param params: URL参数\n        :param retry: 重试次数\n        :param timeout: 超时时间\n        :return: 响应对象\n        \"\"\"\n        for i in range(retry):\n            try:\n                response = self.session.post(\n                    url,\n                    proxies=self.proxies,\n                    params=params,\n                    data=data,\n                    json=json,\n                    timeout=timeout\n                )\n                response.raise_for_status()  # 检查HTTP错误\n                return response\n            except requests.exceptions.RequestException as e:\n                print(f\"请求错误: {e}, 第 {i + 1}/{retry} 次重试\")\n                if i < retry - 1:\n                    # 随机延迟后重试\n                    time.sleep(random.uniform(1, 3))\n                else:\n                    raise\n\n    def update_cookie(self, new_cookie):\n        \"\"\"\n        更新Cookie\n        :param new_cookie: 新的Cookie值\n        \"\"\"\n        self.session.cookies.update({'Cookie': new_cookie})\n"
  },
  {
    "path": "instock/core/indicator/.gitignore",
    "content": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\ncover/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\n.pybuilder/\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# IPython\nprofile_default/\nipython_config.py\n\n# pyenv\n#   For a library or package, you might want to ignore these files since the code is\n#   intended to run in multiple environments; otherwise, check them in:\n# .python-version\n\n# pipenv\n#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.\n#   However, in case of collaboration, if having platform-specific dependencies or dependencies\n#   having no cross-platform support, pipenv may install dependencies that don't work, or not\n#   install all needed dependencies.\n#Pipfile.lock\n\n# poetry\n#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.\n#   This is especially recommended for binary packages to ensure reproducibility, and is more\n#   commonly ignored for libraries.\n#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control\n#poetry.lock\n\n# pdm\n#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.\n#pdm.lock\n#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it\n#   in version control.\n#   https://pdm.fming.dev/#use-with-ide\n.pdm.toml\n\n# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm\n__pypackages__/\n\n# Celery stuff\ncelerybeat-schedule\ncelerybeat.pid\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n.dmypy.json\ndmypy.json\n\n# Pyre type checker\n.pyre/\n\n# pytype static type analyzer\n.pytype/\n\n# Cython debug symbols\ncython_debug/\n\n# PyCharm\n#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can\n#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore\n#  and can be added to the global gitignore or merged into this file.  For a more nuclear\n#  option (not recommended) you can uncomment the following to ignore the entire idea folder.\n.idea/\n"
  },
  {
    "path": "instock/core/indicator/__init__.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\n__author__ = 'mmm '\n__date__ = '2023/3/10 '\n"
  },
  {
    "path": "instock/core/indicator/calculate_indicator.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\nimport logging\nimport pandas as pd\nimport numpy as np\nimport talib as tl\n\n__author__ = 'myh '\n__date__ = '2023/3/10 '\n\n\ndef get_indicators(data, end_date=None, threshold=120, calc_threshold=None):\n    try:\n        isCopy = False\n        if end_date is not None:\n            mask = (data['date'] <= end_date)\n            data = data.loc[mask]\n            isCopy = True\n        if calc_threshold is not None:\n            data = data.tail(n=calc_threshold)\n            isCopy = True\n\n        if isCopy:\n            data = data.copy()\n\n        # import stockstats\n        # test = data.copy()\n        # test = stockstats.StockDataFrame.retype(test)  # 验证计算结果\n\n        with np.errstate(divide='ignore', invalid='ignore'):\n\n            # macd\n            data.loc[:, 'macd'], data.loc[:, 'macds'], data.loc[:, 'macdh'] = tl.MACD(\n                data['close'].values, fastperiod=12, slowperiod=26, signalperiod=9)\n            data['macd'].values[np.isnan(data['macd'].values)] = 0.0\n            data['macds'].values[np.isnan(data['macds'].values)] = 0.0\n            data['macdh'].values[np.isnan(data['macdh'].values)] = 0.0\n\n            # kdjk\n            data.loc[:, 'kdjk'], data.loc[:, 'kdjd'] = tl.STOCH(\n                data['high'].values, data['low'].values, data['close'].values, fastk_period=9,\n                slowk_period=5, slowk_matype=1, slowd_period=5, slowd_matype=1)\n            data['kdjk'].values[np.isnan(data['kdjk'].values)] = 0.0\n            data['kdjd'].values[np.isnan(data['kdjd'].values)] = 0.0\n            data.loc[:, 'kdjj'] = 3 * data['kdjk'].values - 2 * data['kdjd'].values\n\n            # boll 计算结果和stockstats不同boll_ub,boll_lb\n            data.loc[:, 'boll_ub'], data.loc[:, 'boll'], data.loc[:, 'boll_lb'] = tl.BBANDS \\\n                (data['close'].values, timeperiod=20, nbdevup=2, nbdevdn=2, matype=0)\n            data['boll_ub'].values[np.isnan(data['boll_ub'].values)] = 0.0\n            data['boll'].values[np.isnan(data['boll'].values)] = 0.0\n            data['boll_lb'].values[np.isnan(data['boll_lb'].values)] = 0.0\n\n            # trix\n            data.loc[:, 'trix'] = tl.TRIX(data['close'].values, timeperiod=12)\n            data['trix'].values[np.isnan(data['trix'].values)] = 0.0\n            data.loc[:, 'trix_20_sma'] = tl.MA(data['trix'].values, timeperiod=20)\n            data['trix_20_sma'].values[np.isnan(data['trix_20_sma'].values)] = 0.0\n\n            # cr\n            data.loc[:, 'm_price'] = data['amount'].values / data['volume'].values\n            data.loc[:, 'm_price_sf1'] = data['m_price'].shift(1, fill_value=0.0).values\n            data.loc[:, 'h_m'] = data['high'].values - data[['m_price_sf1', 'high']].values.min(axis=1)\n            data.loc[:, 'm_l'] = data['m_price_sf1'].values - data[['m_price_sf1', 'low']].values.min(axis=1)\n            data.loc[:, 'h_m_sum'] = tl.SUM(data['h_m'].values, timeperiod=26)\n            data.loc[:, 'm_l_sum'] = tl.SUM(data['m_l'].values, timeperiod=26)\n            data.loc[:, 'cr'] = data['h_m_sum'].values / data['m_l_sum'].values\n            data['cr'].values[np.isnan(data['cr'].values)] = 0.0\n            data['cr'].values[np.isinf(data['cr'].values)] = 0.0\n            data['cr'] = data['cr'].values * 100\n            data.loc[:, 'cr-ma1'] = tl.MA(data['cr'].values, timeperiod=5)\n            data['cr-ma1'].values[np.isnan(data['cr-ma1'].values)] = 0.0\n            data.loc[:, 'cr-ma2'] = tl.MA(data['cr'].values, timeperiod=10)\n            data['cr-ma2'].values[np.isnan(data['cr-ma2'].values)] = 0.0\n            data.loc[:, 'cr-ma3'] = tl.MA(data['cr'].values, timeperiod=20)\n            data['cr-ma3'].values[np.isnan(data['cr-ma3'].values)] = 0.0\n\n            # rsi\n            data.loc[:, 'rsi'] = tl.RSI(data['close'].values, timeperiod=14)\n            data['rsi'].values[np.isnan(data['rsi'].values)] = 0.0\n            data.loc[:, 'rsi_6'] = tl.RSI(data['close'].values, timeperiod=6)\n            data['rsi_6'].values[np.isnan(data['rsi_6'].values)] = 0.0\n            data.loc[:, 'rsi_12'] = tl.RSI(data['close'].values, timeperiod=12)\n            data['rsi_12'].values[np.isnan(data['rsi_12'].values)] = 0.0\n            data.loc[:, 'rsi_24'] = tl.RSI(data['close'].values, timeperiod=24)\n            data['rsi_24'].values[np.isnan(data['rsi_24'].values)] = 0.0\n\n            # vr\n            data.loc[:, 'av'] = np.where(data['p_change'].values > 0, data['volume'].values, 0)\n            data.loc[:, 'avs'] = tl.SUM(data['av'].values, timeperiod=26)\n            data.loc[:, 'bv'] = np.where(data['p_change'].values < 0, data['volume'].values, 0)\n            data.loc[:, 'bvs'] = tl.SUM(data['bv'].values, timeperiod=26)\n            data.loc[:, 'cv'] = np.where(data['p_change'].values == 0, data['volume'].values, 0)\n            data.loc[:, 'cvs'] = tl.SUM(data['cv'].values, timeperiod=26)\n            data.loc[:, 'vr'] = (data['avs'].values + data['cvs'].values / 2) / (data['bvs'].values + data['cvs'].values / 2)\n            data['vr'].values[np.isnan(data['vr'].values)] = 0.0\n            data['vr'].values[np.isinf(data['vr'].values)] = 0.0\n            data['vr'] = data['vr'].values * 100\n            data.loc[:, 'vr_6_sma'] = tl.MA(data['vr'].values, timeperiod=6)\n            data['vr_6_sma'].values[np.isnan(data['vr_6_sma'].values)] = 0.0\n\n            # atr\n            data.loc[:, 'prev_close'] = data['close'].shift(1, fill_value=0.0).values\n            data.loc[:, 'h_l'] = data['high'].values - data['low'].values\n            data.loc[:, 'h_cy'] = data['high'].values - data['prev_close'].values\n            data.loc[:, 'cy_l'] = data['prev_close'].values - data['low'].values\n            data.loc[:, 'h_cy_a'] = abs(data['h_cy'].values)\n            data.loc[:, 'cy_l_a'] = abs(data['cy_l'].values)\n            data.loc[:, 'tr'] = data.loc[:, ['h_l', 'h_cy_a', 'cy_l_a']].T.max().values\n            data['tr'].values[np.isnan(data['tr'].values)] = 0.0\n            data.loc[:, 'atr'] = tl.ATR(data['high'].values, data['low'].values, data['close'].values, timeperiod=14)\n            data['atr'].values[np.isnan(data['atr'].values)] = 0.0\n\n            # DMI\n            # talib计算公式和stockstats不同\n            # talib计算公式\n            # data.loc[:, 'pdi'] = tl.PLUS_DI(data['high'].values, data['low'].values, data['close'].values, timeperiod=14)\n            # data['pdi'].values[np.isnan(data['pdi'].values)] = 0.0\n            # data.loc[:, 'mdi'] = tl.MINUS_DI(data['high'].values, data['low'].values, data['close'].values, timeperiod=14)\n            # data['mdi'].values[np.isnan(data['mdi'].values)] = 0.0\n            # data.loc[:, 'dx'] = tl.DX(data['high'].values, data['low'].values, data['close'].values, timeperiod=14)\n            # data['dx'].values[np.isnan(data['dx'].values)] = 0.0\n            # data.loc[:, 'adx'] = tl.ADX(data['high'].values, data['low'].values, data['close'].values, timeperiod=6)\n            # data['adx'].values[np.isnan(data['adx'].values)] = 0.0\n            # data.loc[:, 'adxr'] = tl.ADXR(data['high'].values, data['low'].values, data['close'].values, timeperiod=6)\n            # data['adxr'].values[np.isnan(data['adxr'].values)] = 0.0\n            # stockstats计算公式\n            data.loc[:, 'high_delta'] = np.insert(np.diff(data['high'].values), 0, 0.0)\n            data.loc[:, 'high_m'] = (data['high_delta'].values + abs(data['high_delta'].values)) / 2\n            data.loc[:, 'low_delta'] = np.insert(-np.diff(data['low'].values), 0, 0.0)\n            data.loc[:, 'low_m'] = (data['low_delta'].values + abs(data['low_delta'].values)) / 2\n            data.loc[:, 'pdm'] = tl.EMA(np.where(data['high_m'].values > data['low_m'].values, data['high_m'].values, 0), timeperiod=14)\n            data['pdm'].values[np.isnan(data['pdm'].values)] = 0.0\n            data.loc[:, 'pdi'] = data['pdm'].values / data['atr'].values\n            data['pdi'].values[np.isnan(data['pdi'].values)] = 0.0\n            data['pdi'].values[np.isinf(data['pdi'].values)] = 0.0\n            data['pdi'] = data['pdi'].values * 100\n            data.loc[:, 'mdm'] = tl.EMA(np.where(data['low_m'].values > data['high_m'].values, data['low_m'].values, 0), timeperiod=14)\n            data['mdm'].values[np.isnan(data['mdm'].values)] = 0.0\n            data.loc[:, 'mdi'] = data['mdm'].values / data['atr'].values\n            data['mdi'].values[np.isnan(data['mdi'].values)] = 0.0\n            data['mdi'].values[np.isinf(data['mdi'].values)] = 0.0\n            data['mdi'] = data['mdi'].values * 100\n            data.loc[:, 'dx'] = abs(data['pdi'].values - data['mdi'].values) / (data['pdi'].values + data['mdi'].values)\n            data['dx'].values[np.isnan(data['dx'].values)] = 0.0\n            data['dx'].values[np.isinf(data['dx'].values)] = 0.0\n            data['dx'] = data['dx'].values * 100\n            data.loc[:, 'adx'] = tl.EMA(data['dx'].values, timeperiod=6)\n            data['adx'].values[np.isnan(data['adx'].values)] = 0.0\n            data.loc[:, 'adxr'] = tl.EMA(data['adx'].values, timeperiod=6)\n            data['adxr'].values[np.isnan(data['adxr'].values)] = 0.0\n\n            # wr\n            data.loc[:, 'wr_6'] = tl.WILLR(data['high'].values, data['low'].values, data['close'].values, timeperiod=6)\n            data['wr_6'].values[np.isnan(data['wr_6'].values)] = 0.0\n            data.loc[:, 'wr_10'] = tl.WILLR(data['high'].values, data['low'].values, data['close'].values, timeperiod=10)\n            data['wr_10'].values[np.isnan(data['wr_10'].values)] = 0.0\n            data.loc[:, 'wr_14'] = tl.WILLR(data['high'].values, data['low'].values, data['close'].values, timeperiod=14)\n            data['wr_14'].values[np.isnan(data['wr_14'].values)] = 0.0\n\n            # cci 计算方法和结果和stockstats不同，stockstats典型价采用均价(总额/成交量)计算\n            data.loc[:, 'cci'] = tl.CCI(data['high'].values, data['low'].values, data['close'].values, timeperiod=14)\n            data['cci'].values[np.isnan(data['cci'].values)] = 0.0\n            data.loc[:, 'cci_84'] = tl.CCI(data['high'].values, data['low'].values, data['close'].values, timeperiod=84)\n            data['cci_84'].values[np.isnan(data['cci_84'].values)] = 0.0\n\n            # dma\n            data.loc[:, 'ma10'] = tl.MA(data['close'].values, timeperiod=10)\n            data['ma10'].values[np.isnan(data['ma10'].values)] = 0.0\n            data.loc[:, 'ma50'] = tl.MA(data['close'].values, timeperiod=50)\n            data['ma50'].values[np.isnan(data['ma50'].values)] = 0.0\n            data.loc[:, 'dma'] = data['ma10'].values - data['ma50'].values\n            data.loc[:, 'dma_10_sma'] = tl.MA(data['dma'].values, timeperiod=10)\n            data['dma_10_sma'].values[np.isnan(data['dma_10_sma'].values)] = 0.0\n\n            # tema\n            data.loc[:, 'tema'] = tl.TEMA(data['close'].values, timeperiod=14)\n            data['tema'].values[np.isnan(data['tema'].values)] = 0.0\n\n            # mfi 计算方法和结果和stockstats不同，stockstats典型价采用均价(总额/成交量)计算\n            data.loc[:, 'mfi'] = tl.MFI(data['high'].values, data['low'].values, data['close'].values, data['volume'].values, timeperiod=14)\n            data['mfi'].values[np.isnan(data['mfi'].values)] = 0.0\n            data.loc[:, 'mfisma'] = tl.MA(data['mfi'].values, timeperiod=6)\n\n            # vwma\n            data.loc[:, 'tpv_14'] = tl.SUM(data['amount'].values, timeperiod=14)\n            data.loc[:, 'vol_14'] = tl.SUM(data['volume'].values, timeperiod=14)\n            data.loc[:, 'vwma'] = data['tpv_14'].values / data['vol_14'].values\n            data['vwma'].values[np.isnan(data['vwma'].values)] = 0.0\n            data['vwma'].values[np.isinf(data['vwma'].values)] = 0.0\n            data.loc[:, 'mvwma'] = tl.MA(data['vwma'].values, timeperiod=6)\n\n            # ppo\n            data.loc[:, 'ppo'] = tl.PPO(data['close'].values, fastperiod=12, slowperiod=26, matype=1)\n            data['ppo'].values[np.isnan(data['ppo'].values)] = 0.0\n            data.loc[:, 'ppos'] = tl.EMA(data['ppo'].values, timeperiod=9)\n            data['ppos'].values[np.isnan(data['ppos'].values)] = 0.0\n            data.loc[:, 'ppoh'] = data['ppo'].values - data['ppos'].values\n\n            # stochrsi\n            # talib计算公式和stockstats不同\n            # talib计算公式\n            # data.loc[:, 'stochrsi_k'], data.loc[:, 'stochrsi_d'] = tl.STOCHRSI(data['close'].values, timeperiod=14, fastk_period=5, fastd_period=3, fastd_matype=0)\n            data.loc[:, 'rsi_min'] = tl.MIN(data['rsi'].values, timeperiod=14)\n            data.loc[:, 'rsi_max'] = tl.MAX(data['rsi'].values, timeperiod=14)\n            data.loc[:, 'stochrsi_k'] = (data['rsi'].values - data['rsi_min'].values) / (data['rsi_max'].values - data['rsi_min'].values)\n            data['stochrsi_k'].values[np.isnan(data['stochrsi_k'].values)] = 0.0\n            data['stochrsi_k'].values[np.isinf(data['stochrsi_k'].values)] = 0.0\n            data['stochrsi_k'] = data['stochrsi_k'].values * 100\n            data.loc[:, 'stochrsi_d'] = tl.MA(data['stochrsi_k'].values, timeperiod=3)\n\n            # wt\n            data.loc[:, 'esa'] = tl.EMA(data['m_price'].values, timeperiod=10)\n            data['esa'].values[np.isnan(data['esa'].values)] = 0.0\n            data.loc[:, 'esa_d'] = tl.EMA(abs(data['m_price'].values - data['esa'].values), timeperiod=10)\n            data.loc[:, 'esa_ci'] = (data['m_price'].values - data['esa'].values) / (0.015 * data['esa_d'].values)\n            data['esa_ci'].values[np.isnan(data['esa_ci'].values)] = 0.0\n            data['esa_ci'].values[np.isinf(data['esa_ci'].values)] = 0.0\n            data.loc[:, 'wt1'] = tl.EMA(data['esa_ci'].values, timeperiod=21)\n            data['wt1'].values[np.isnan(data['wt1'].values)] = 0.0\n            data.loc[:, 'wt2'] = tl.MA(data['wt1'].values, timeperiod=4)\n            data['wt2'].values[np.isnan(data['wt2'].values)] = 0.0\n\n            # Supertrend\n            data.loc[:, 'm_atr'] = data['atr'].values * 3\n            data.loc[:, 'hl_avg'] = (data['high'].values + data['low'].values) / 2.0\n            data.loc[:, 'b_ub'] = data['hl_avg'].values + data['m_atr'].values\n            data.loc[:, 'b_lb'] = data['hl_avg'].values - data['m_atr'].values\n            size = len(data.index)\n            ub = np.empty(size, dtype=np.float64)\n            lb = np.empty(size, dtype=np.float64)\n            st = np.empty(size, dtype=np.float64)\n            for i in range(size):\n                if i == 0:\n                    ub[i] = data['b_ub'].iloc[i]\n                    lb[i] = data['b_lb'].iloc[i]\n                    if data['close'].iloc[i] <= ub[i]:\n                        st[i] = ub[i]\n                    else:\n                        st[i] = lb[i]\n                    continue\n\n                last_close = data['close'].iloc[i - 1]\n                curr_close = data['close'].iloc[i]\n                last_ub = ub[i - 1]\n                last_lb = lb[i - 1]\n                last_st = st[i - 1]\n                curr_b_ub = data['b_ub'].iloc[i]\n                curr_b_lb = data['b_lb'].iloc[i]\n\n                # calculate current upper band\n                if curr_b_ub < last_ub or last_close > last_ub:\n                    ub[i] = curr_b_ub\n                else:\n                    ub[i] = last_ub\n\n                # calculate current lower band\n                if curr_b_lb > last_lb or last_close < last_lb:\n                    lb[i] = curr_b_lb\n                else:\n                    lb[i] = last_lb\n\n                # calculate supertrend\n                if last_st == last_ub:\n                    if curr_close <= ub[i]:\n                        st[i] = ub[i]\n                    else:\n                        st[i] = lb[i]\n                elif last_st == last_lb:\n                    if curr_close > lb[i]:\n                        st[i] = lb[i]\n                    else:\n                        st[i] = ub[i]\n\n            data.loc[:, 'supertrend_ub'] = ub\n            data.loc[:, 'supertrend_lb'] = lb\n            data.loc[:, 'supertrend'] = st\n            data = data.copy()\n            # ----------stockstats没有以下指标-----------------\n            # roc\n            data.loc[:, 'roc'] = tl.ROC(data['close'].values, timeperiod=12)\n            data['roc'].values[np.isnan(data['roc'].values)] = 0.0\n            data.loc[:, 'rocma'] = tl.MA(data['roc'].values, timeperiod=6)\n            data['rocma'].values[np.isnan(data['rocma'].values)] = 0.0\n            data.loc[:, 'rocema'] = tl.EMA(data['roc'].values, timeperiod=9)\n            data['rocema'].values[np.isnan(data['rocema'].values)] = 0.0\n\n            # obv\n            data.loc[:, 'obv'] = tl.OBV(data['close'].values, data['volume'].values)\n            data['obv'].values[np.isnan(data['obv'].values)] = 0.0\n\n            # sar\n            data.loc[:, 'sar'] = tl.SAR(data['high'].values, data['low'].values)\n            data['sar'].values[np.isnan(data['sar'].values)] = 0.0\n\n            # psy\n            data.loc[:, 'price_up'] = 0.0\n            data.loc[data['close'].values > data['prev_close'].values, 'price_up'] = 1.0\n            data.loc[:, 'price_up_sum'] = tl.SUM(data['price_up'].values, timeperiod=12)\n            data.loc[:, 'psy'] = data['price_up_sum'].values / 12.0\n            data['psy'].values[np.isnan(data['psy'].values)] = 0.0\n            data['psy'] = data['psy'].values * 100\n            data.loc[:, 'psyma'] = tl.MA(data['psy'].values, timeperiod=6)\n\n            # BRAR\n            data.loc[:, 'h_o'] = data['high'].values - data['open'].values\n            data.loc[:, 'o_l'] = data['open'].values - data['low'].values\n            data.loc[:, 'h_o_sum'] = tl.SUM(data['h_o'].values, timeperiod=26)\n            data.loc[:, 'o_l_sum'] = tl.SUM(data['o_l'].values, timeperiod=26)\n            data.loc[:, 'ar'] = data['h_o_sum'] .values / data['o_l_sum'].values\n            data['ar'].values[np.isnan(data['ar'].values)] = 0.0\n            data['ar'].values[np.isinf(data['ar'].values)] = 0.0\n            data['ar'] = data['ar'].values * 100\n            data.loc[:, 'h_cy_sum'] = tl.SUM(data['h_cy'].values, timeperiod=26)\n            data.loc[:, 'cy_l_sum'] = tl.SUM(data['cy_l'].values, timeperiod=26)\n            data.loc[:, 'br'] = data['h_cy_sum'].values / data['cy_l_sum'].values\n            data['br'].values[np.isnan(data['br'].values)] = 0.0\n            data['br'].values[np.isinf(data['br'].values)] = 0.0\n            data['br'] = data['br'].values * 100\n\n            # EMV\n            data.loc[:, 'prev_high'] = data['high'].shift(1, fill_value=0.0).values\n            data.loc[:, 'prev_low'] = data['low'].shift(1, fill_value=0.0).values\n            data.loc[:, 'phl_avg'] = (data['prev_high'].values + data['prev_low'].values) / 2.0\n            data.loc[:, 'emva_em'] = (data['hl_avg'].values - data['phl_avg'].values) * data['h_l'].values / data['amount'].values\n            data.loc[:, 'emv'] = tl.SUM(data['emva_em'].values, timeperiod=14)\n            data['emv'].values[np.isnan(data['emv'].values)] = 0.0\n            data.loc[:, 'emva'] = tl.MA(data['emv'].values, timeperiod=9)\n            data['emva'].values[np.isnan(data['emva'].values)] = 0.0\n\n            # BIAS\n            data.loc[:, 'ma6'] = tl.MA(data['close'].values, timeperiod=6)\n            data['ma6'].values[np.isnan(data['ma6'].values)] = 0.0\n            data.loc[:, 'ma12'] = tl.MA(data['close'].values, timeperiod=12)\n            data['ma12'].values[np.isnan(data['ma12'].values)] = 0.0\n            data.loc[:, 'ma24'] = tl.MA(data['close'].values, timeperiod=24)\n            data['ma24'].values[np.isnan(data['ma24'].values)] = 0.0\n            data.loc[:, 'bias'] = ((data['close'].values - data['ma6'].values) / data['ma6'].values)\n            data['bias'].values[np.isnan(data['bias'].values)] = 0.0\n            data['bias'].values[np.isinf(data['bias'].values)] = 0.0\n            data['bias'] = data['bias'].values * 100\n            data.loc[:, 'bias_12'] = (data['close'].values - data['ma12'].values) / data['ma12'].values\n            data['bias_12'].values[np.isnan(data['bias_12'].values)] = 0.0\n            data['bias_12'].values[np.isinf(data['bias_12'].values)] = 0.0\n            data['bias_12'] = data['bias_12'].values * 100\n            data.loc[:, 'bias_24'] = (data['close'].values - data['ma24'].values) / data['ma24'].values\n            data['bias_24'].values[np.isnan(data['bias_24'].values)] = 0.0\n            data['bias_24'].values[np.isinf(data['bias_24'].values)] = 0.0\n            data['bias_24'] = data['bias_24'].values * 100\n\n            # DPO\n            data.loc[:, 'c_m_11'] = tl.MA(data['close'].values, timeperiod=11)\n            data.loc[:, 'dpo'] = data['close'].values - data['c_m_11'].shift(1, fill_value=0.0).values\n            data['dpo'].values[np.isnan(data['dpo'].values)] = 0.0\n            data.loc[:, 'madpo'] = tl.MA(data['dpo'].values, timeperiod=6)\n            data['madpo'].values[np.isnan(data['madpo'].values)] = 0.0\n\n            # VHF\n            data.loc[:, 'hcp_lcp'] = tl.MAX(data['close'].values, timeperiod=28) - tl.MIN(data['close'].values, timeperiod=28)\n            data['hcp_lcp'].values[np.isnan(data['hcp_lcp'].values)] = 0.0\n            data.loc[:, 'vhf'] = np.divide(data['hcp_lcp'].values, tl.SUM(abs(data['close'].values - data['prev_close'].values), timeperiod=28))\n            data['vhf'].values[np.isnan(data['vhf'].values)] = 0.0\n\n            # RVI\n            data.loc[:, 'rvi_x'] = ((data['close'].values - data['open'].values) +\n                                    2 * (data['prev_close'].values - data['open'].shift(1, fill_value=0.0).values) +\n                                    2 * (data['close'].shift(2, fill_value=0.0).values - data['open'].shift(2, fill_value=0.0).values) +\n                                    (data['close'].shift(3, fill_value=0.0).values - data['open'].shift(3, fill_value=0.0).values)) / 6\n            data.loc[:, 'rvi_y'] = ((data['high'].values - data['low'].values) +\n                                    2 * (data['prev_high'].values - data['prev_low'].values) +\n                                    2 * (data['high'].shift(2, fill_value=0.0).values - data['low'].shift(2, fill_value=0.0).values) +\n                                    (data['high'].shift(3, fill_value=0.0).values - data['low'].shift(3, fill_value=0.0).values)) / 6\n            data.loc[:, 'rvi'] = tl.MA(data['rvi_x'].values, timeperiod=10) / tl.MA(data['rvi_y'].values, timeperiod=10)\n            data['rvi'].values[np.isnan(data['rvi'].values)] = 0.0\n            data['rvi'].values[np.isinf(data['rvi'].values)] = 0.0\n            data.loc[:, 'rvis'] = (data['rvi'].values +\n                                   2 * data['rvi'].shift(1, fill_value=0.0).values +\n                                   2 * data['rvi'].shift(2, fill_value=0.0).values +\n                                   data['rvi'].shift(3, fill_value=0.0).values) / 6\n\n            # FI\n            data.loc[:, 'fi'] = np.insert(np.diff(data['close'].values), 0, 0.0) * data['volume'].values\n            data.loc[:, 'force_2'] = tl.EMA(data['fi'].values, timeperiod=2)\n            data['force_2'].values[np.isnan(data['force_2'].values)] = 0.0\n            data.loc[:, 'force_13'] = tl.EMA(data['fi'].values, timeperiod=13)\n            data['force_13'].values[np.isnan(data['force_13'].values)] = 0.0\n\n            # ENE\n            data.loc[:, 'ene_ue'] = (1 + 11 / 100) * data['ma10'].values\n            data.loc[:, 'ene_le'] = (1 - 9 / 100) * data['ma10'].values\n            data.loc[:, 'ene'] = (data['ene_ue'].values + data['ene_le'].values) / 2\n\n            # VOL\n            data.loc[:, 'vol_5'] = tl.MA(data['volume'].values, timeperiod=5)\n            data['vol_5'].values[np.isnan(data['vol_5'].values)] = 0.0\n            data.loc[:, 'vol_10'] = tl.MA(data['volume'].values, timeperiod=10)\n            data['vol_10'].values[np.isnan(data['vol_10'].values)] = 0.0\n\n            # MA\n            data.loc[:, 'ma20'] = tl.MA(data['close'].values, timeperiod=20)\n            data['ma20'].values[np.isnan(data['ma20'].values)] = 0.0\n            data.loc[:, 'ma200'] = tl.MA(data['close'].values, timeperiod=200)\n            data['ma200'].values[np.isnan(data['ma200'].values)] = 0.0\n\n        if threshold is not None:\n            data = data.tail(n=threshold).copy()\n        return data\n    except Exception as e:\n        if data is None or data['code'] is None:\n            logging.error(f\"calculate_indicator.get_indicators处理异常：代码{e}\")\n        else:\n            logging.error(f\"calculate_indicator.get_indicators处理异常：{data['code']}代码{e}\")\n    return None\n\n\ndef get_indicator(code_name, data, stock_column, date=None, calc_threshold=90):\n    try:\n        if date is None:\n            end_date = code_name[0]\n        else:\n            end_date = date.strftime(\"%Y-%m-%d\")\n\n        code = code_name[1]\n        # 设置返回数组。\n        stock_data_list = [end_date, code]\n        columns_num = len(stock_column) - 2\n        # 增加空判断，如果是空返回 0 数据。\n        if len(data.index) <= 1:\n            for i in range(columns_num):\n                stock_data_list.append(0)\n            return pd.Series(stock_data_list, index=stock_column)\n\n        idr_data = get_indicators(data, end_date=end_date, threshold=1, calc_threshold=calc_threshold)\n\n        # 增加空判断，如果是空返回 0 数据。\n        if idr_data is None:\n            for i in range(columns_num):\n                stock_data_list.append(0)\n            return pd.Series(stock_data_list, index=stock_column)\n\n        # 初始化统计类\n        for i in range(columns_num):\n            # 将数据的最后一个返回。\n            tmp_val = idr_data[stock_column[i + 2]].tail(1).values[0]\n            # 解决值中存在INF NaN问题。\n            if np.isinf(tmp_val) or np.isnan(tmp_val):\n                stock_data_list.append(0)\n            else:\n                stock_data_list.append(tmp_val)\n\n        return pd.Series(stock_data_list, index=stock_column)\n    except Exception as e:\n        logging.error(f\"calculate_indicator.get_indicator处理异常：{code}代码{e}\")\n    return None\n"
  },
  {
    "path": "instock/core/kline/.gitignore",
    "content": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\ncover/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\n.pybuilder/\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# IPython\nprofile_default/\nipython_config.py\n\n# pyenv\n#   For a library or package, you might want to ignore these files since the code is\n#   intended to run in multiple environments; otherwise, check them in:\n# .python-version\n\n# pipenv\n#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.\n#   However, in case of collaboration, if having platform-specific dependencies or dependencies\n#   having no cross-platform support, pipenv may install dependencies that don't work, or not\n#   install all needed dependencies.\n#Pipfile.lock\n\n# poetry\n#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.\n#   This is especially recommended for binary packages to ensure reproducibility, and is more\n#   commonly ignored for libraries.\n#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control\n#poetry.lock\n\n# pdm\n#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.\n#pdm.lock\n#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it\n#   in version control.\n#   https://pdm.fming.dev/#use-with-ide\n.pdm.toml\n\n# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm\n__pypackages__/\n\n# Celery stuff\ncelerybeat-schedule\ncelerybeat.pid\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n.dmypy.json\ndmypy.json\n\n# Pyre type checker\n.pyre/\n\n# pytype static type analyzer\n.pytype/\n\n# Cython debug symbols\ncython_debug/\n\n# PyCharm\n#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can\n#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore\n#  and can be added to the global gitignore or merged into this file.  For a more nuclear\n#  option (not recommended) you can uncomment the following to ignore the entire idea folder.\n.idea/\n"
  },
  {
    "path": "instock/core/kline/__init__.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\n__author__ = 'myh '\n__date__ = '2023/4/6 '\n"
  },
  {
    "path": "instock/core/kline/cyq.js",
    "content": "// @ts-nocheck\n/**\n * 筹码分布算法\n * @param {Array.<Array.<string>>} kdata K图数据 [date,open,close,high,low,volume,amount,amplitude,turnover]\n * @param {number} [accuracyFactor=500] 精度因子\n * @param {number} [range] 计算范围\n * @param {number} [cyq_days] 计算交易天数\n */\nfunction CYQCalculator(kdata, accuracyFactor, range, cyq_days) {\n    /**\n     * K图数据\n     */\n    this.klinedata = kdata;\n    /**\n     * 精度因子(纵轴刻度数)\n     */\n    this.fator = accuracyFactor || 150;\n    /**\n     * 计算K线条数\n     */\n    this.range = range;\n    /**\n     * 计算筹码分布的交易天数\n     */\n    this.tradingdays = cyq_days;\n}\n/**\n * 计算分布及相关指标\n * @param {number} index 当前选中的K线的索引\n * @return {{x: Array.<number>, y: Array.<number>}}\n */\nCYQCalculator.prototype.calc = function (index) {\n    let i;\n    let maxprice = 0;\n    let minprice = 1000000;\n    /**\n     * 计算N天的交易成本\n     */\n    const factor = this.fator;\n    const end = index - this.range + 1;\n    const start = end - this.tradingdays;\n    /**\n     * K图数据[\n     */\n    let kdata = [];\n    if (end===0){\n        kdata = this.klinedata.slice(start);\n    }else{\n        kdata = this.klinedata.slice(start, end);\n    }\n    const kdata_len = kdata.length;\n    for (i = 0; i < kdata_len; i++) {\n        const elements = kdata[i];\n        maxprice = Math.max(maxprice, elements.high);\n        minprice = Math.min(minprice, elements.low);\n    }\n    // 精度不小于0.01 产品逻辑\n    const accuracy = Math.max(0.01, (maxprice - minprice) / (factor - 1));\n\n    const currentprice = kdata[kdata_len-1].close;\n    let boundary = -1;\n    /**\n     * 值域\n     * @type {Array.<number>}\n     */\n    const yrange = [];\n    for (i = 0; i < factor; i++) {\n        const _price= (minprice + accuracy * i).toFixed(2) / 1;\n        yrange.push(_price);\n        if (boundary===-1 && _price >= currentprice) boundary = i;\n    }\n    /**\n     * 横轴数据\n     */\n    const xdata = new Array(factor).fill(0);\n    for (i = 0; i < kdata.length; i++) {\n        const eles = kdata[i];\n        const open = eles.open, close = eles.close, high = eles.high, low = eles.low,\n            avg = (open + close + high + low) / 4, turnoverRate = Math.min(1, eles.turnover / 100 || 0);\n        const H = Math.floor((high - minprice) / accuracy), L = Math.ceil((low - minprice) / accuracy),\n            // G点坐标, 一字板时, X为进度因子\n            GPoint = [high === low ? factor - 1 : 2 / (high - low), Math.floor((avg - minprice) / accuracy)];\n        // 衰减\n        for (let n = 0; n < xdata.length; n++) {\n            xdata[n] *= (1 - turnoverRate);\n        }\n        if (high === low) {\n            // 一字板时，画矩形面积是三角形的2倍\n            xdata[GPoint[1]] += GPoint[0] * turnoverRate / 2;\n        }\n        else {\n            for (let j = L; j <= H; j++) {\n                const curprice = minprice + accuracy * j;\n                if (curprice <= avg) {\n                    // 上半三角叠加分布分布\n                    if (Math.abs(avg - low) < 1e-8) {\n                        xdata[j] += GPoint[0] * turnoverRate;\n                    }\n                    else {\n                        xdata[j] += (curprice - low) / (avg - low) * GPoint[0] * turnoverRate;\n                    }\n                }\n                else {\n                    // 下半三角叠加分布分布\n                    if (Math.abs(high - avg) < 1e-8) {\n                        xdata[j] += GPoint[0] * turnoverRate;\n                    }\n                    else {\n                        xdata[j] += (high - curprice) / (high - avg) * GPoint[0] * turnoverRate;\n                    }\n                }\n            }\n        }\n    }\n    let totalChips = 0;\n    for (i = 0; i < factor; i++) {\n        const x = xdata[i].toPrecision(12) / 1;\n        //if (x < 0) xdata[i] = 0;\n        totalChips += x;\n    }\n    const result = new CYQData();\n    result.x = xdata;\n    result.y = yrange;\n    result.b = boundary + 1;\n    result.d = kdata[kdata_len-1].date;\n    result.t = this.tradingdays ;\n    result.benefitPart = result.getBenefitPart(currentprice);\n    result.avgCost = getCostByChip(totalChips * 0.5).toFixed(2);\n    result.percentChips = {\n        '90': result.computePercentChips(0.9),\n        '70': result.computePercentChips(0.7)\n    };\n    return result;\n    /**\n     * 获取指定筹码处的成本\n     * @param {number} chip 堆叠筹码\n     */\n    function getCostByChip(chip) {\n        let result = 0, sum = 0;\n        for (let i = 0; i < factor; i++) {\n            const x = xdata[i].toPrecision(12) / 1;\n            if (sum + x > chip) {\n                result = minprice + i * accuracy;\n                break;\n            }\n            sum += x;\n        }\n        return result;\n    }\n    /**\n     * 筹码分布数据\n     */\n    function CYQData() {\n        /**\n         * 筹码堆叠\n         * @type {Array.<number>}\n         */\n        this.x = arguments[0];\n        /**\n         * 价格分布\n         * @type {Array.<number>}\n         */\n        this.y = arguments[1];\n        /**\n         * 获利比例\n         * @type {number}\n         */\n        this.benefitPart = arguments[2];\n        /**\n         * 平均成本\n         * @type {number}\n         */\n        this.avgCost = arguments[3];\n        /**\n         * 百分比筹码\n         * @type {{Object.<string, {{priceRange: number[], concentration: number}}>}}\n         */\n        this.percentChips = arguments[4];\n        /**\n         * 筹码堆叠亏盈分界下标\n         * @type {number}\n         */\n        this.b = arguments[5];\n        /**\n         * 交易日期\n         * @type {number}\n         */\n        this.d = arguments[6];\n        /**\n         * 交易天数\n         * @type {number}\n         */\n        this.t = arguments[7];\n        /**\n         * 计算指定百分比的筹码\n         * @param {number} percent 百分比大于0，小于1\n         */\n        this.computePercentChips = function (percent) {\n            if (percent > 1 || percent < 0)\n                throw 'argument \"percent\" out of range';\n            const ps = [(1 - percent) / 2, (1 + percent) / 2];\n            const pr = [getCostByChip(totalChips * ps[0]), getCostByChip(totalChips * ps[1])];\n            return {\n                priceRange: [pr[0].toFixed(2), pr[1].toFixed(2)],\n                concentration: pr[0] + pr[1] === 0 ? 0 : (pr[1] - pr[0]) / (pr[0] + pr[1])\n            };\n        };\n        /**\n         * 获取指定价格的获利比例\n         * @param {number} price 价格\n         */\n        this.getBenefitPart = function (price) {\n            let below = 0;\n            for (let i = 0; i < factor; i++) {\n                const x = xdata[i].toPrecision(12) / 1;\n                if (price >= minprice + i * accuracy) {\n                    below += x;\n                }\n            }\n            return totalChips === 0 ? 0 : below / totalChips;\n        };\n    }\n};\n/**\n * 画筹码分布图\n * @param {number} [index] K图数据下标\n */\nfunction CYQDraw(index) {\n    //@ts-ignore\n    const cyq_cal = new CYQCalculator(JSON.parse(kline_data), 150, k_range, cyq_days);\n    const cm_result = cyq_cal.calc(index);\n    //下半部分筹码分布\n    const down_x = cm_result.x.slice(0, cm_result.b).concat(new Array(cyq_cal.fator - cm_result.b).fill(0));\n    cyq_down_varea.data = {x: down_x, y1: cm_result.y};\n    //上半部分筹码分布\n    const up_x = new Array(cm_result.b).fill(0).concat(cm_result.x.slice(cm_result.b));\n    cyq_up_varea.data = {x: up_x, y1: cm_result.y};\n    //筹码平均成本线\n    let average_index = 0; //与平均成本最接近的序号\n    cm_result.x.forEach(function (v, index) {\n        if (Math.abs(cm_result.y[index] - cm_result.avgCost) <= Math.abs(cm_result.y[average_index] - cm_result.avgCost))\n            average_index = index;\n    });\n    cyq_avgcost_line.data = {x: [0, cm_result.x[average_index]], y: [cm_result.avgCost, cm_result.avgCost]};\n    cyq_avgcost_text.data = {x: [cm_result.x[average_index]], y: [cm_result.avgCost], text: [cm_result.avgCost]};\n    //筹码分布信息\n    div_cyq.text = `\n        <style>\n          .cyq_info_table{\n            border-collapse: collapse;\n            line-height: 1.6;\n            width: 100%;\n            margin: 0 auto;\n            td{\n              vertical-align: middle;\n            }\n            tr{\n              td:last-child{\n                text-align: right;\n              }\n            }\n            .qcyq_t{\n              font-weight: bold;\n            }\n          }\n          .cyq_info_bl_table{\n            margin: 0 auto;\n            height: 25px;\n            border-spacing: 0;\n            table-layout:fixed;\n            tr{\n              td{\n                margin: 0;\n                padding: 0;\n                text-align: center;\n              }      \n              td:last-child{\n                text-align: center;\n              }\n            }\n            .qcyq_t{\n              font-weight: bold;\n            }\n            td.bltd1{\n              border: 1px solid #FF0000;\n              border-radius: 3px 0 0 3px;\n              background-color: #FFDEDE;\n              word-break : keep-all; overflow: hidden;white-space:nowrap;text-overflow: ellipsis;\n            }\n            td.bltd2{\n              border: 1px solid #5A8DF8;\n              border-radius: 0 3px 3px 0;\n              border-left: 0;\n              background-color: #F0F5FF;\n              word-break : keep-all; overflow: hidden;white-space:nowrap;text-overflow: ellipsis;\n            }\n          }\n        </style>\n        <table class=\"cyq_info_table\">\n          <tr>\n            <td colspan=\"2\">\n              <table class=\"cyq_info_bl_table\">\n                <tr>\n                  <td class=\"qcyq_t\">筹码分布</td>\n                </tr>\n              </table>           \n            </td>\n          </tr>        \n          <tr>\n            <td>日期: </td>\n            <td class=\"qcyq_t\">${cm_result.d}</td>\n          </tr>\n          <tr>\n            <td>获利比例:</td>\n            <td class=\"qcyq_t\">${(cm_result.benefitPart * 100).toFixed(2) + '%'}</td>\n          </tr>\n          <tr>\n            <td colspan=\"2\">\n              <table class=\"cyq_info_bl_table\">\n                <tr>\n                  <td class=\"bltd1\" style=\"width:${cm_result.benefitPart * 100}%\"><span style=\"display:inline-block\">${(cm_result.benefitPart * 100).toFixed(2) + '%'}</span></td>\n                  <td class=\"bltd2\" style=\"width:${(1-cm_result.benefitPart) * 100}%\"><span style=\"display:inline-block\">${((1 - cm_result.benefitPart) * 100).toFixed(2) + '%'}</span></td>\n                </tr>\n              </table>            \n            </td>\n          </tr>\n          <tr>\n            <td>平均成本:</td>\n            <td class=\"qcyq_t\">${cm_result.avgCost}</td>\n          </tr>\n          <tr>\n            <td>90%成本:</td>\n            <td class=\"qcyq_t\">${cm_result.percentChips['90'].priceRange.join('-')}</td>\n          </tr>\n          <tr>\n            <td>集中度:</td>\n            <td class=\"qcyq_t\">${(cm_result.percentChips['90'].concentration * 100).toFixed(2) + '%'}</td>\n          </tr>\n          <tr>\n            <td>70%成本:</td>\n            <td class=\"qcyq_t\">${cm_result.percentChips['70'].priceRange.join('-')}</td>\n          </tr>\n          <tr>\n            <td>集中度:</td>\n            <td class=\"qcyq_t\">${(cm_result.percentChips['70'].concentration * 100).toFixed(2) + '%'}</td>\n          </tr>\n          <tr>\n            <td>交易日数:</td>\n            <td class=\"qcyq_t\">${cm_result.t}</td>\n          </tr>       \n        </table>\n    `;\n}\n/**\n * 触发\n */\nif (isinit){\n    CYQDraw(k_range - 1);\n}else{\n    const {indices} = cb_data.index;\n    for (const index of indices) {\n        CYQDraw(index);\n        break;\n    }\n}"
  },
  {
    "path": "instock/core/kline/cyq.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\n__author__ = 'myh '\n__date__ = '2025/1/6 '\n\n\n#  * 筹码分布算法\n#  * @param {Array.<Array.<string>>} kdata K图数据 [date,open,close,high,low,volume,amount,amplitude,turnover]\n#  * @param {number} [accuracyFactor=500] 精度因子\n#  * @param {number} [range] 计算范围\n#  * @param {number} [cyq_days] 计算交易天数\nclass CYQCalculator:\n    def __init__(self, kdata, accuracy_factor=150, crange=120, cyq_days=210):\n        # K图数据\n        self.klinedata = kdata\n        # 精度因子(纵轴刻度数)\n        self.fator = accuracy_factor\n        # 计算K线条数\n        self.range = crange\n        # 计算筹码分布的交易天数\n        self.tradingdays = cyq_days\n\n    # *计算分布及相关指标\n    # * @ param {number} index 当前选中的K线的索引\n    # * @ return {{x: Array. < number >, y: Array. < number >}}\n    def calc(self, index):\n        maxprice = 0\n        minprice = 1000000\n        factor = self.fator\n        end = index - self.range + 1\n        start = end - self.tradingdays\n\n        if end == 0:\n            kdata = self.klinedata.tail(self.tradingdays)\n        else:\n            kdata = self.klinedata[start:end]\n\n        for _high, _low in zip(kdata['high'].values, kdata['low'].values):\n            maxprice = max(maxprice, _high)\n            minprice = min(minprice, _low)\n\n        #  精度不小于0.01产品逻辑\n        accuracy = max(0.01, (maxprice - minprice) / (factor - 1))\n        currentprice = kdata.iloc[-1]['close']\n        boundary = -1\n\n        # *值域 @ type  {Array. < number >}\n        yrange = []\n\n        for i in range(factor):\n            _price = float(f\"{minprice + accuracy * i:.2f}\")\n            yrange.append(_price)\n            if boundary == -1 and _price >= currentprice:\n                boundary = i\n\n        # *横轴数据\n        xdata = [0] * factor\n\n        for open_price, close, high, low, turnover in zip(kdata['open'].values, kdata['close'].values, kdata['high'].values, kdata['low'].values, kdata['turnover'].values):\n            avg = (open_price + close + high + low) / 4\n            turnover_rate = min(1, turnover / 100)\n\n            H = int((high - minprice) / accuracy)\n            L = int((low - minprice) / accuracy + 0.99)\n            #  G点坐标, 一字板时, X为进度因子\n            GPoint = [factor - 1 if high == low else 2 / (high - low),\n                      int((avg - minprice) / accuracy)]\n\n            for n in range(len(xdata)):\n                xdata[n] *= (1 - turnover_rate)\n\n            if high == low:\n                #  一字板时，画矩形面积是三角形的2倍\n                xdata[GPoint[1]] += GPoint[0] * turnover_rate / 2\n            else:\n                for j in range(L, H + 1):\n                    curprice = minprice + accuracy * j\n                    if curprice <= avg:\n                        #  上半三角叠加分布分布\n                        if abs(avg - low) < 1e-8:\n                            xdata[j] += GPoint[0] * turnover_rate\n                        else:\n                            xdata[j] += (curprice - low) / (avg - low) * GPoint[0] * turnover_rate\n                    else:\n                        #  下半三角叠加分布分布\n                        if abs(high - avg) < 1e-8:\n                            xdata[j] += GPoint[0] * turnover_rate\n                        else:\n                            xdata[j] += (high - curprice) / (high - avg) * GPoint[0] * turnover_rate\n\n        total_chips = sum(float(f\"{x:.12g}\") for x in xdata)\n\n        # *获取指定筹码处的成本\n        # * @ param {number} chip 堆叠筹码\n        def get_cost_by_chip(chip):\n            result = 0\n            sum_chips = 0\n            for i in range(factor):\n                x = float(f\"{xdata[i]:.12g}\")\n                if sum_chips + x > chip:\n                    result = minprice + i * accuracy\n                    break\n                sum_chips += x\n            return result\n\n        # *筹码分布数据\n        class CYQData:\n            def __init__(self):\n                # 筹码堆叠\n                self.x = None\n                # 价格分布\n                self.y = None\n                # 获利比例\n                self.benefit_part = None\n                # 平均成本\n                self.avg_cost = None\n                # 百分比筹码\n                self.percent_chips = None\n                # 筹码堆叠亏盈分界下标\n                self.b = None\n                # 交易日期\n                self.d = None\n                # 交易天数\n                self.t = None\n\n            # *计算指定百分比的筹码\n            # * @ param {number} percent 百分比大于0，小于1\n            @staticmethod\n            def compute_percent_chips(percent):\n                if percent > 1 or percent < 0:\n                    raise ValueError('argument \"percent\" out of range')\n                ps = [(1 - percent) / 2, (1 + percent) / 2]\n                pr = [get_cost_by_chip(total_chips * ps[0]),\n                      get_cost_by_chip(total_chips * ps[1])]\n                return {\n                    'priceRange': [f\"{pr[0]:.2f}\", f\"{pr[1]:.2f}\"],\n                    'concentration': 0 if pr[0] + pr[1] == 0 else (pr[1] - pr[0]) / (pr[0] + pr[1])\n                }\n\n            # *获取指定价格的获利比例\n            # * @ param {number} price 价格\n            @staticmethod\n            def get_benefit_part(price):\n                below = 0\n                for i in range(factor):\n                    x = float(f\"{xdata[i]:.12g}\")\n                    if price >= minprice + i * accuracy:\n                        below += x\n                return 0 if total_chips == 0 else below / total_chips\n\n        result = CYQData()\n        result.x = xdata\n        result.y = yrange\n        result.b = boundary + 1\n        result.d = kdata.iloc[-1]['date']\n        result.t = self.tradingdays\n        result.benefit_part = result.get_benefit_part(currentprice)\n        result.avg_cost = f\"{get_cost_by_chip(total_chips * 0.5):.2f}\"\n        result.percent_chips = {\n            '90': result.compute_percent_chips(0.9),\n            '70': result.compute_percent_chips(0.7)\n        }\n\n        return result\n\n# if __name__ == \"__main__\":\n#     # import instock.core.kline.cyq as cyq\n#     # c = cyq.CYQCalculator(cyq_stock)\n#     # r = c.calc(119)"
  },
  {
    "path": "instock/core/kline/indicator_web_dic.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\n__author__ = 'myh '\n__date__ = '2023/4/6 '\n\n\n# 全部指标数据汇总\nindicators_dic = [\n    {\n        \"title\": \"MACD\",\n        \"desc\": \"\"\"\n        <a href=\"https://www.ljjyy.com/archives/2023/04/100686.html\" rel=\"nofollow\" target=\"_blank\">平滑异同移动平均指标(MACD)</a>\n    \"\"\",\n        \"dic\": (\"macd\", \"macds\", \"macdh\")\n    }, {\n        \"title\": \"PPO\",\n        \"desc\": \"\"\"\n            <a href=\"https://www.ljjyy.com/archives/2023/04/100711.html\" target=\"_blank\">价格震荡百分比指标(PPO)</a>\n        \"\"\",\n        \"dic\": (\"ppo\", \"ppos\", \"ppoh\")\n    }, {\n        \"title\": \"KDJ\",\n        \"desc\": \"\"\"\n        <a href=\"https://www.ljjyy.com/archives/2023/04/100687.html\" rel=\"nofollow\" target=\"_blank\">随机指标(KDJ)</a>\n    \"\"\",\n        \"dic\": (\"kdjk\", \"kdjd\", \"kdjj\")\n    }, {\n        \"title\": \"W&R\",\n        \"desc\": \"\"\"\n            <a href=\"https://www.ljjyy.com/archives/2023/04/100699.html\" rel=\"nofollow\" target=\"_blank\">威廉指数(W&R)</a>\n        \"\"\",\n        \"dic\": (\"wr_6\", \"wr_10\", \"wr_14\")\n    }, {\n        \"title\": \"BOLL\",\n        \"desc\": \"\"\"\n        <a href=\"https://www.ljjyy.com/archives/2023/04/100688.html\" rel=\"nofollow\" target=\"_blank\">布林线指标(BOLL)</a>\n    \"\"\",\n        \"dic\": (\"close\", \"boll_ub\", \"boll\", \"boll_lb\")\n    }, {\n        \"title\": \"ENE\",\n        \"desc\": \"\"\"\n            <a href=\"https://www.ljjyy.com/archives/2023/04/100689.html\" target=\"_blank\">轨道线(ENE)</a>\n        \"\"\",\n        \"dic\": (\"close\", \"ene_ue\", \"ene\", \"ene_le\")\n    }, {\n        \"title\": \"TRIX\",\n        \"desc\": \"\"\"\n        <a href=\"https://www.ljjyy.com/archives/2023/04/100690.html\" rel=\"nofollow\" target=\"_blank\">三重指数平滑移动平均指标(TRIX)</a>\n    \"\"\",\n        \"dic\": (\"trix\", \"trix_20_sma\")\n    }, {\n        \"title\": \"TEMA\",\n        \"desc\": \"\"\"\n            <a href=\"https://www.ljjyy.com/archives/2023/04/100691.html\" target=\"_blank\">三重指数移动平均指标(TEMA)</a>\n        \"\"\",\n        \"dic\": (\"close\", \"tema\")\n    }, {\n        \"title\": \"CR\",\n        \"desc\": \"\"\"\n        <a href=\"https://www.ljjyy.com/archives/2023/04/100692.html\" rel=\"nofollow\" target=\"_blank\">价格动量指标(CR)</a>\n    \"\"\",\n        \"dic\": (\"cr\", \"cr-ma1\", \"cr-ma2\", \"cr-ma3\")\n    }, {\n        \"title\": \"RSI\",\n        \"desc\": \"\"\"\n            <a href=\"https://www.ljjyy.com/archives/2023/04/100693.html\" rel=\"nofollow\" target=\"_blank\">相对强弱指标(RSI)</a> \n        \"\"\",\n        \"dic\": (\"rsi_6\", \"rsi_12\", \"rsi\", \"rsi_24\")\n    }, {\n        \"title\": \"STOCHRSI\",\n        \"desc\": \"\"\"\n            <a href=\"https://www.ljjyy.com/archives/2023/04/100719.html\" rel=\"nofollow\" target=\"_blank\">随机相对强弱指标(STOCHRSI)</a> \n        \"\"\",\n        \"dic\": (\"stochrsi_k\", \"stochrsi_d\")\n    }, {\n        \"title\": \"RVI\",\n        \"desc\": \"\"\"\n            <a href=\"https://www.ljjyy.com/archives/2023/04/100716.html\" target=\"_blank\">相对离散指数(RVI)</a>\n        \"\"\",\n        \"dic\": (\"rvi\", \"rvis\")\n    }, {\n        \"title\": \"WT\",\n        \"desc\": \"\"\"\n            <a href=\"https://www.ljjyy.com/archives/2023/04/100712.html\" target=\"_blank\">LazyBear's Wave Trend指标(WT)</a>\n        \"\"\",\n        \"dic\": (\"wt1\", \"wt2\")\n    }, {\n        \"title\": \"VR\",\n        \"desc\": \"\"\"\n        <a href=\"https://www.ljjyy.com/archives/2023/04/100694.html\" rel=\"nofollow\" target=\"_blank\">成交量比率(VR)</a>\n    \"\"\",\n        \"dic\": (\"vr\", \"vr_6_sma\")\n    }, {\n        \"title\": \"ROC\",\n        \"desc\": \"\"\"\n            <a href=\"https://www.ljjyy.com/archives/2023/04/100695.html\" target=\"_blank\">变动率(ROC)</a>\n        \"\"\",\n        \"dic\": (\"roc\", \"rocma\", \"rocema\")\n    }, {\n        \"title\": \"DMI\",\n        \"desc\": \"\"\"\n        <a href=\"https://www.ljjyy.com/archives/2023/04/100696.html\" rel=\"nofollow\" target=\"_blank\">动向指数(DMI)</a>\n        <a href=\"https://www.ljjyy.com/archives/2023/04/100697.html\" rel=\"nofollow\" target=\"_blank\">平均趋向指标(ADX)</a>\n        <a href=\"https://www.ljjyy.com/archives/2023/04/100698.html\" rel=\"nofollow\" target=\"_blank\">平均方向指数评估(DXR)</a>\n    \"\"\",\n        \"dic\": (\"pdi\", \"mdi\", \"dx\", \"adx\", \"adxr\")\n    }, {\n        \"title\": \"VHF\",\n        \"desc\": \"\"\"\n            <a href=\"https://www.ljjyy.com/archives/2023/04/100715.html\" target=\"_blank\">十字过滤线(VHF)</a>\n        \"\"\",\n        \"dic\": (\"vhf\",)\n    }, {\n        \"title\": \"CCI\",\n        \"desc\": \"\"\"\n            <a href=\"https://www.ljjyy.com/archives/2023/04/100700.html\" rel=\"nofollow\" target=\"_blank\">顺势指标(CCI)</a>\n        \"\"\",\n        \"dic\": (\"cci\", \"cci_84\")\n    }, {\n        \"title\": \"ATR\",\n        \"desc\": \"\"\"\n           <a href=\"https://www.ljjyy.com/archives/2023/04/100701.html\" rel=\"nofollow\" target=\"_blank\">均幅指标(ATR)</a>\n        \"\"\",\n        \"dic\": (\"tr\", \"atr\")\n    }, {\n        \"title\": \"DMA\",\n        \"desc\": \"\"\"\n            <a href=\"https://www.ljjyy.com/archives/2023/04/100702.html\" rel=\"nofollow\" target=\"_blank\">平行线差指标(DMA)</a> \n        \"\"\",\n        \"dic\": (\"dma\", \"dma_10_sma\")\n    }, {\n        \"title\": \"OBV\",\n        \"desc\": \"\"\"\n            <a href=\"https://www.ljjyy.com/archives/2023/04/100703.html\" rel=\"nofollow\" target=\"_blank\">能量潮指标(OBV)</a>\n        \"\"\",\n        \"dic\": (\"obv\",)\n    }, {\n        \"title\": \"SAR\",\n        \"desc\": \"\"\"\n            <a href=\"https://www.ljjyy.com/archives/2023/04/100704.html\" rel=\"nofollow\" target=\"_blank\">抛物线转向指标(SAR)</a>\n        \"\"\",\n        \"dic\": (\"close\", \"sar\")\n    }, {\n        \"title\": \"PSY\",\n        \"desc\": \"\"\"\n            <a href=\"https://www.ljjyy.com/archives/2023/04/100705.html\" rel=\"nofollow\" target=\"_blank\">心理线指标(PSY)</a>\n        \"\"\",\n        \"dic\": (\"psy\", \"psyma\")\n    }, {\n        \"title\": \"BRAR\",\n        \"desc\": \"\"\"\n            <a href=\"https://www.ljjyy.com/archives/2023/04/100706.html\" target=\"_blank\">人气意愿指标(BRAR)</a>\n        \"\"\",\n        \"dic\": (\"br\", \"ar\")\n    }, {\n        \"title\": \"EMV\",\n        \"desc\": \"\"\"\n            <a href=\"https://www.ljjyy.com/archives/2023/04/100707.html\" target=\"_blank\">简易波动指标(EMV)</a>\n        \"\"\",\n        \"dic\": (\"emv\", \"emva\")\n    }, {\n        \"title\": \"BIAS\",\n        \"desc\": \"\"\"\n            <a href=\"https://www.ljjyy.com/archives/2023/04/100708.html\" target=\"_blank\">乖离率指标(BIAS)</a>\n        \"\"\",\n        \"dic\": (\"bias\", \"bias_12\", \"bias_24\")\n    }, {\n        \"title\": \"MFI\",\n        \"desc\": \"\"\"\n            <a href=\"https://www.ljjyy.com/archives/2023/04/100709.html\" target=\"_blank\">资金流量指标(MFI)</a>\n        \"\"\",\n        \"dic\": (\"mfi\", \"mfisma\")\n    }, {\n        \"title\": \"VWMA\",\n        \"desc\": \"\"\"\n            <a href=\"https://www.ljjyy.com/archives/2023/04/100710.html\" target=\"_blank\">成交量加权平均指标(VWMA)</a>\n        \"\"\",\n        \"dic\": (\"close\", \"vwma\", \"mvwma\")\n    }, {\n        \"title\": \"SUPERTREND\",\n        \"desc\": \"\"\"\n            <a href=\"https://www.ljjyy.com/archives/2023/04/100713.html\" target=\"_blank\">超级趋势指标(SUPERTREND)</a>\n        \"\"\",\n        \"dic\": (\"close\", \"supertrend_ub\", \"supertrend\", \"supertrend_lb\")\n    }, {\n        \"title\": \"DPO\",\n        \"desc\": \"\"\"\n            <a href=\"https://www.ljjyy.com/archives/2023/04/100714.html\" target=\"_blank\">区间震荡线(DPO)</a>\n        \"\"\",\n        \"dic\": (\"dpo\", \"madpo\")\n    }, {\n        \"title\": \"FI\",\n        \"desc\": \"\"\"\n            <a href=\"https://www.ljjyy.com/archives/2023/04/100717.html\" target=\"_blank\">劲道指数(FI)</a>\n        \"\"\",\n        \"dic\": (\"fi\", \"force_2\", \"force_13\")\n    }\n]\n"
  },
  {
    "path": "instock/core/kline/visualization.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\n\nimport numpy as np\nimport json\nimport logging\nimport os.path\n# 首映 bokeh 画图。\nfrom bokeh import events\nfrom bokeh.io import curdoc\nfrom bokeh.transform import factor_cmap\nfrom bokeh.plotting import figure\nfrom bokeh.embed import components\nfrom bokeh.palettes import Spectral11\nfrom bokeh.layouts import column, row, layout\nfrom bokeh.models import ColumnDataSource, HoverTool, CheckboxGroup, LabelSet, Button, CustomJS, \\\n    CDSView, BooleanFilter, TabPanel, Tabs, Div, Styles, CrosshairTool, Span, BoxSelectTool, WheelZoomTool, PanTool, \\\n    BoxZoomTool, ZoomInTool, ZoomOutTool, RedoTool, ResetTool, SaveTool, UndoTool, Text\nimport instock.core.tablestructure as tbs\nimport instock.core.indicator.calculate_indicator as idr\nimport instock.core.pattern.pattern_recognitions as kpr\nimport instock.core.kline.indicator_web_dic as iwd\n\n__author__ = 'myh '\n__date__ = '2023/4/6 '\n\n\ndef get_plot_kline(code, stock, date, stock_name):\n    plot_list = []\n    try:\n\n        data = idr.get_indicators(stock, date, threshold=360)\n        if data is None:\n            return None\n\n        threshold = 120\n        stock_column = tbs.STOCK_KLINE_PATTERN_DATA['columns']\n        data = kpr.get_pattern_recognitions(data, stock_column, threshold=threshold)\n        if data is None:\n            return None\n\n        cyq_days = 210\n        cyq_stock = stock.tail(n=threshold + cyq_days).copy()\n\n        min_price = data['low'].min()*0.98\n        max_price = data['high'].max()*1.02\n        k_length = len(data.index)\n        data['index'] = list(np.arange(k_length))\n        data['is_red'] = data.apply(lambda row: \"1\" if row['close'] > row['open'] else \"0\", axis=1)\n\n        # 颜色，红盘或绿盘\n        c_cmap = factor_cmap(\"is_red\", [\"red\", \"green\"], [\"1\", \"0\"])\n        # K线图数据源\n        source = ColumnDataSource(data)\n        # 工具条\n        tools = pan, box_select, box_zoom, wheel_zoom, zoom_in, zoom_out, undo, redo, reset, save = \\\n            PanTool(description=\"平移\"), BoxSelectTool(description=\"方框选取\"), BoxZoomTool(description=\"方框缩放\"), \\\n                WheelZoomTool(description=\"滚轮缩放\"), ZoomInTool(description=\"放大\"), ZoomOutTool(description=\"缩小\"), \\\n                UndoTool(description=\"撤销\"), RedoTool(description=\"重做\"), ResetTool(description=\"重置\"), \\\n                SaveTool(description=\"保存\", filename=f\"InStock_{code}({date})\")\n\n        # K线图\n        p_kline = figure(width=1000, height=300, x_range=(0, k_length + 1), y_range=(min_price, max_price), min_border_left=80,\n                         tools=tools, toolbar_location='above')\n        # 均线\n        sam_labels = (\"close\", \"ma10\", \"ma20\", \"ma50\", \"ma200\")\n        for name, color in zip(sam_labels, Spectral11):\n            p_kline.line(x='index', y=name, source=source, legend_label=tbs.get_field_cn(name, tbs.STOCK_STATS_DATA),\n                         color=color, line_width=1.5, alpha=0.8)\n        p_kline.legend.location = \"top_left\"\n        p_kline.legend.click_policy = \"hide\"\n\n        # 股价柱\n        c_segment =p_kline.segment(x0='index', y0='high', x1='index', y1='low', color=c_cmap, source=source)\n        p_kline.vbar('index', 0.5, 'open', 'close', fill_color=c_cmap, line_color=c_cmap, source=source,\n                     hover_fill_alpha=0.5)\n\n        # 悬停\n        tooltips = [('日期', '@date'), ('开盘', '@open'),\n                    ('最高', '@high'), ('最低', '@low'),\n                    ('收盘', '@close'), ('涨跌', '@quote_change%'),\n                    ('金额', '@amount{¥0}'), ('换手', '@turnover%')]\n\n        hover = HoverTool(tooltips=tooltips, description=\"悬停\", renderers=[c_segment])\n\n        # 十字瞄准线\n        crosshair = CrosshairTool(overlay=[Span(dimension=\"width\", line_dash=\"dashed\", line_width=2),\n                                           Span(dimension=\"height\", line_dash=\"dotted\", line_width=2)],\n                                  description=\"十字瞄准线\")\n        # 筹码分布\n        div_cyq = Div()\n        p_cyq = figure(width=160, height=p_kline.height, y_range=p_kline.y_range, min_border_left=0,\n                       toolbar_location=None, y_axis_location=\"right\")\n        p_cyq.xgrid.grid_line_color = None\n        p_cyq.xaxis.visible = False\n        cyq_avgcost_line = p_cyq.line(x=\"x\", y=\"y\", color=\"red\", line_width=2, line_dash=\"dotted\")\n        cyq_avgcost_text = p_cyq.add_glyph(ColumnDataSource(dict(x=[], y=[], text=[])),glyph = Text(x=\"x\", y=\"y\", text=\"text\",text_align=\"center\"))\n        cyq_down_varea = p_cyq.varea(x=\"x\", y1=\"y1\", y2=0, fill_alpha=0.3, fill_color=\"red\")\n        cyq_up_varea = p_cyq.varea(x=\"x\", y1=\"y1\", y2=0, fill_alpha=0.3, fill_color=\"blue\")\n        json_str_stock = cyq_stock.to_json(orient=\"records\")\n        js_array_str_stock = json.dumps(json.loads(json_str_stock), indent=2)\n        cqy_callback =  CustomJS.from_file(os.path.join(os.path.dirname(__file__), \"cyq.js\"), isinit=False, div_cyq=div_cyq, cyq_avgcost_line=cyq_avgcost_line.data_source, cyq_avgcost_text=cyq_avgcost_text.data_source, cyq_down_varea=cyq_down_varea.data_source, cyq_up_varea=cyq_up_varea.data_source, kline_data=js_array_str_stock, k_range=k_length, cyq_days=cyq_days)\n        cqy_hover = HoverTool(tooltips=None, callback=cqy_callback, renderers=[c_segment])\n        cqy_callback_isinit =  CustomJS.from_file(os.path.join(os.path.dirname(__file__), \"cyq.js\"), isinit=True, div_cyq=div_cyq, cyq_avgcost_line=cyq_avgcost_line.data_source, cyq_avgcost_text=cyq_avgcost_text.data_source, cyq_down_varea=cyq_down_varea.data_source, cyq_up_varea=cyq_up_varea.data_source, kline_data=js_array_str_stock, k_range=k_length, cyq_days=cyq_days)\n        curdoc().on_event(events.DocumentReady, cqy_callback_isinit)\n\n        # K线图添加工具\n        p_kline.add_tools(hover, cqy_hover, crosshair)\n\n        # 形态信息\n        pattern_is_show = True  # 形态缺省是否显示\n        checkboxes_args = {}\n        checkboxes_code = \"\"\"let acts = cb_obj.active;\"\"\"\n        pattern_labels = []\n        i = 0\n        for k in stock_column:\n            label_cn = stock_column[k]['cn']\n            label_mask_u = (data[k] > 0)\n            label_data_u = data.loc[label_mask_u].copy()\n            isHas = False\n            if len(label_data_u.index) > 0:\n                label_data_u.loc[:, 'label_cn'] = label_cn\n                label_source_u = ColumnDataSource(label_data_u)\n                locals()[f'pattern_labels_u_{str(i)}'] = LabelSet(x='index', y='high', text=\"label_cn\",\n                                                                  source=label_source_u, x_offset=7, y_offset=5,\n                                                                  angle=90, angle_units='deg', text_color='red',\n                                                                  text_font_style='bold', text_font_size=\"9pt\",\n                                                                  visible=pattern_is_show)\n                p_kline.add_layout(locals()[f'pattern_labels_u_{str(i)}'])\n                checkboxes_args[f'lsu{str(i)}'] = locals()[f'pattern_labels_u_{str(i)}']\n                checkboxes_code = f\"{checkboxes_code}lsu{i}.visible = acts.includes({i});\"\n                pattern_labels.append(label_cn)\n                isHas = True\n\n            label_mask_d = (data[k] < 0)\n            label_data_d = data.loc[label_mask_d].copy()\n            if len(label_data_d.index) > 0:\n                label_data_d.loc[:, 'label_cn'] = label_cn\n                label_source_d = ColumnDataSource(label_data_d)\n                locals()[f'pattern_labels_d_{str(i)}'] = LabelSet(x='index', y='low', text='label_cn',\n                                                                  source=label_source_d, x_offset=-7, y_offset=-5,\n                                                                  angle=270, angle_units='deg',\n                                                                  text_color='green',\n                                                                  text_font_style='bold', text_font_size=\"9pt\",\n                                                                  visible=pattern_is_show)\n                p_kline.add_layout(locals()[f'pattern_labels_d_{str(i)}'])\n                checkboxes_args[f'lsd{str(i)}'] = locals()[f'pattern_labels_d_{str(i)}']\n                checkboxes_code = f\"{checkboxes_code}lsd{i}.visible = acts.includes({i});\"\n                if not isHas:\n                    pattern_labels.append(label_cn)\n                    isHas = True\n            if isHas:\n                i += 1\n        p_kline.xaxis.visible = False\n        p_kline.min_border_bottom = 0\n\n        # 交易量柱\n        p_volume = figure(width=p_kline.width, height=120, x_range=p_kline.x_range,\n                          min_border_left=p_kline.min_border_left, tools=tools, toolbar_location=None)\n        vol_labels = (\"vol_5\", \"vol_10\")\n        for name, color in zip(vol_labels, Spectral11):\n            p_volume.line(x=data['index'], y=data[name], legend_label=name, color=color, line_width=1.5, alpha=0.8)\n        p_volume.legend.location = \"top_left\"\n        p_volume.legend.click_policy = \"hide\"\n        p_volume.vbar('index', 0.5, 0, 'volume', color=c_cmap, source=source)\n        p_volume.add_tools(crosshair)\n        p_volume.xaxis.major_label_overrides = {i: date for i, date in enumerate(data['date'])}\n        # p_volume.xaxis.major_label_orientation = pi / 4\n\n        # 形态复选框\n        pattern_checkboxes = CheckboxGroup(labels=pattern_labels,\n                                           active=list(range(len(pattern_labels))) if pattern_is_show else [])\n        # pattern_checkboxes.inline = True\n        pattern_checkboxes.height = p_kline.height + p_volume.height\n        if checkboxes_args:\n            pattern_checkboxes.js_on_change('active', CustomJS(args=checkboxes_args, code=checkboxes_code))\n        ck = column(row(pattern_checkboxes))\n\n        # 按钮\n        select_all = Button(label=\"全选\")\n        select_none = Button(label='全弃')\n        select_all.js_on_event(\"button_click\", CustomJS(args={'pcs': pattern_checkboxes, 'pls': pattern_labels},\n                                                        code=\"pcs.active = Array.from(pls, (x, i) => i);\"))\n        select_none.js_on_event(\"button_click\", CustomJS(args={'pcs': pattern_checkboxes},\n                                                         code=\"pcs.active = [];\"))\n\n        # 指标\n        tabs = []\n        for conf in iwd.indicators_dic:\n            p_indicator = figure(width=p_kline.width, height=150, x_range=p_kline.x_range,\n                                 min_border_left=p_kline.min_border_left, tools=tools, toolbar_location=None)\n            for name, color in zip(conf[\"dic\"], Spectral11):\n                if name == 'macdh' or name == 'ppoh':\n                    up = [True if val > 0 else False for val in source.data[name]]\n                    down = [True if val < 0 else False for val in source.data[name]]\n                    view_upper = CDSView(filter=BooleanFilter(up))\n                    view_lower = CDSView(filter=BooleanFilter(down))\n                    p_indicator.vbar('index', 0.1, 0, name, legend_label=tbs.get_field_cn(name, tbs.STOCK_STATS_DATA),\n                                     color='green', source=source, view=view_lower)\n                    p_indicator.vbar('index', 0.1, name, 0, legend_label=tbs.get_field_cn(name, tbs.STOCK_STATS_DATA),\n                                     color='red', source=source, view=view_upper)\n                else:\n                    p_indicator.line(x='index', y=name, legend_label=tbs.get_field_cn(name, tbs.STOCK_STATS_DATA),\n                                     color=color, source=source, line_width=1.5, alpha=0.8)\n            p_indicator.legend.location = \"top_left\"\n            p_indicator.legend.click_policy = \"hide\"\n            p_indicator.add_tools(crosshair)\n            p_indicator.xaxis.visible = False\n            p_indicator.min_border_bottom = 0\n            div_indicator = Div(text=f\"\"\"★★★★★指标详细解读：{conf[\"desc\"]}\"\"\", width=p_kline.width)\n            tabs.append(TabPanel(child=column(p_indicator, row(div_indicator)), title=conf[\"title\"]))\n        tabs_indicators = Tabs(tabs=tabs, tabs_location='below', width=p_kline.width, stylesheets=[\n            {'.bk-tab': Styles(padding='1px 1.4px', font_size='xx-small'),\n             '.bk-tab.bk-active': Styles(background_color='yellow', color='red')}])\n\n        # 关注\n        if code.startswith(('1', '5')):\n            div_attention = Div()\n        else:\n            import instock.lib.database as mdb\n            table_name = tbs.TABLE_CN_STOCK_ATTENTION['name']\n            _sql = f\"SELECT EXISTS(SELECT 1 FROM `{table_name}` WHERE `code` = '{code}')\"\n            try:\n                rc = mdb.executeSqlCount(_sql)\n            except Exception as e:\n                rc = 0\n            if rc == 0:\n                cvalue = \"0\"\n                cname = \"关注\"\n            else:\n                cvalue = \"1\"\n                cname = \"取关\"\n            div_attention = Div(\n                text=f\"\"\"<button id=\"attentionId\" value=\"{cvalue}\" onclick=\"attention('{code}',this);return false;\">{cname}</button>\"\"\",\n                width=47)\n\n        # 东方财富股票页面\n        if code.startswith(\"6\"):\n            code_name = f\"SH{code}\"\n        else:\n            code_name = f\"SZ{code}\"\n        div_dfcf_hq = Div(\n            text=f\"\"\"<a href=\"https://quote.eastmoney.com/{code_name}.html\" target=\"_blank\">{code}{stock_name}行情</a>\"\"\",\n            width=150)\n        if code.startswith(('1', '5')):\n            div_dfcf_zl = Div()\n        else:\n            div_dfcf_zl = Div(\n                text=f\"\"\"<a href=\"https://emweb.eastmoney.com/PC_HSF10/OperationsRequired/Index?code={code_name}\" target=\"_blank\">资料</a>\"\"\",\n                width=40)\n        if code.startswith(('1', '5')):\n            div_dfcf_pj = Div()\n        else:\n            div_dfcf_pj = Div(\n                text=f\"\"\"<a href=\"http://page1.tdx.com.cn:7615/site/pcwebcall_static/bxb/bxb.html?code={code}&color=0\" target=\"_blank\">扫雷评级</a>\"\"\",\n                width=80)\n        div_dfcf_pr = Div(\n            text=f\"\"\"<a href=\"https://www.ljjyy.com/archives/2023/04/100718.html\" target=\"_blank\">形态</a>\"\"\",\n            width=40)\n\n        # 组合图\n        layouts = layout(row(\n            column(\n                row(children=[div_attention, div_dfcf_hq, div_dfcf_zl, div_dfcf_pj, div_dfcf_pr, select_all, select_none],align='end'),\n                row(children=[p_kline, p_cyq]),\n                row(children=[column(p_volume, tabs_indicators),div_cyq])),\n                ck))\n        script, div = components(layouts)\n\n        return {\"script\": script, \"div\": div}\n    except Exception as e:\n        logging.error(f\"visualization.get_plot_kline处理异常：{e}\")\n    return None\n"
  },
  {
    "path": "instock/core/pattern/.gitignore",
    "content": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\ncover/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\n.pybuilder/\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# IPython\nprofile_default/\nipython_config.py\n\n# pyenv\n#   For a library or package, you might want to ignore these files since the code is\n#   intended to run in multiple environments; otherwise, check them in:\n# .python-version\n\n# pipenv\n#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.\n#   However, in case of collaboration, if having platform-specific dependencies or dependencies\n#   having no cross-platform support, pipenv may install dependencies that don't work, or not\n#   install all needed dependencies.\n#Pipfile.lock\n\n# poetry\n#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.\n#   This is especially recommended for binary packages to ensure reproducibility, and is more\n#   commonly ignored for libraries.\n#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control\n#poetry.lock\n\n# pdm\n#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.\n#pdm.lock\n#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it\n#   in version control.\n#   https://pdm.fming.dev/#use-with-ide\n.pdm.toml\n\n# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm\n__pypackages__/\n\n# Celery stuff\ncelerybeat-schedule\ncelerybeat.pid\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n.dmypy.json\ndmypy.json\n\n# Pyre type checker\n.pyre/\n\n# pytype static type analyzer\n.pytype/\n\n# Cython debug symbols\ncython_debug/\n\n# PyCharm\n#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can\n#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore\n#  and can be added to the global gitignore or merged into this file.  For a more nuclear\n#  option (not recommended) you can uncomment the following to ignore the entire idea folder.\n.idea/\n"
  },
  {
    "path": "instock/core/pattern/__init__.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\n__author__ = 'myh '\n__date__ = '2023/3/13 '\n"
  },
  {
    "path": "instock/core/pattern/pattern_recognitions.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\nimport logging\n\n__author__ = 'myh '\n__date__ = '2023/3/24 '\n\n\ndef get_pattern_recognitions(data, stock_column, end_date=None, threshold=120, calc_threshold=None):\n    isCopy = False\n    if end_date is not None:\n        mask = (data['date'] <= end_date)\n        data = data.loc[mask]\n        isCopy = True\n    if calc_threshold is not None:\n        data = data.tail(n=calc_threshold)\n        isCopy = True\n    if isCopy:\n        data = data.copy()\n\n    for k in stock_column:\n        try:\n            data.loc[:, k] = stock_column[k]['func'](data['open'].values, data['high'].values, data['low'].values, data['close'].values)\n        except Exception as e:\n            pass\n\n    if data is None or len(data.index) == 0:\n        return None\n\n    if threshold is not None:\n        data = data.tail(n=threshold).copy()\n\n    return data\n\n\ndef get_pattern_recognition(code_name, data, stock_column, date=None, calc_threshold=12):\n    try:\n        # 增加空判断，如果是空返回 0 数据。\n        if date is None:\n            end_date = code_name[0]\n        else:\n            end_date = date.strftime(\"%Y-%m-%d\")\n\n        code = code_name[1]\n        # 设置返回数组。\n        # 增加空判断，如果是空返回 0 数据。\n        if len(data.index) <= 1:\n            return None\n\n        stockStat = get_pattern_recognitions(data, stock_column, end_date=end_date, threshold=1,\n                                             calc_threshold=calc_threshold)\n\n        if stockStat is None:\n            return None\n\n        isHas = False\n        for k in stock_column:\n            if stockStat.iloc[0][k] != 0:\n                isHas = True\n                break\n\n        if isHas:\n            stockStat.loc[:, 'code'] = code\n            return stockStat.iloc[0, -(len(stock_column) + 1):]\n\n    except Exception as e:\n        logging.error(f\"pattern_recognitions.get_pattern_recognition处理异常：{code}代码{e}\")\n\n    return None\n"
  },
  {
    "path": "instock/core/singleton_proxy.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\nimport os.path\nimport sys\nimport random\nfrom instock.lib.singleton_type import singleton_type\n\n# 在项目运行时，临时将项目路径添加到环境变量\ncpath_current = os.path.dirname(os.path.dirname(__file__))\ncpath = os.path.abspath(os.path.join(cpath_current, os.pardir))\nsys.path.append(cpath)\nproxy_filename = os.path.join(cpath_current, 'config', 'proxy.txt')\n\n__author__ = 'myh '\n__date__ = '2025/1/6 '\n\n\n# 读取代理\nclass proxys(metaclass=singleton_type):\n    def __init__(self):\n        try:\n            with open(proxy_filename, \"r\") as file:\n                self.data = list(set(line.strip() for line in file.readlines() if line.strip()))\n        except Exception:\n           pass\n\n    def get_data(self):\n        return self.data\n\n    def get_proxies(self):\n        if self.data is None or len(self.data)==0:\n            return None\n\n        proxy = random.choice(self.data)\n        return {\"http\": proxy, \"https\": proxy}\n\n\"\"\"\n    def get_proxies(self):\n        if self.data is None:\n            return None\n\n        while len(self.data) > 0:\n            proxy = random.choice(self.data)\n            if https_validator(proxy):\n                return {\"http\": proxy, \"https\": proxy}\n            self.data.remove(proxy)\n\n        return None\n\n\nfrom requests import head\ndef https_validator(proxy):\n    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0',\n               'Accept': '*/*',\n               'Connection': 'keep-alive',\n               'Accept-Language': 'zh-CN,zh;q=0.8'}\n    proxies = {\"http\": f\"{proxy}\", \"https\": f\"{proxy}\"}\n    try:\n        r = head(\"https://data.eastmoney.com\", headers=headers, proxies=proxies, timeout=3, verify=False)\n        return True if r.status_code == 200 else False\n    except Exception as e:\n        return False\n\"\"\""
  },
  {
    "path": "instock/core/singleton_stock.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\nimport logging\nimport concurrent.futures\nimport instock.core.stockfetch as stf\nimport instock.core.tablestructure as tbs\nimport instock.lib.trade_time as trd\nfrom instock.lib.singleton_type import singleton_type\n\n__author__ = 'myh '\n__date__ = '2023/3/10 '\n\n\n# 读取当天股票数据\nclass stock_data(metaclass=singleton_type):\n    def __init__(self, date):\n        try:\n            self.data = stf.fetch_stocks(date)\n        except Exception as e:\n            logging.error(f\"singleton.stock_data处理异常：{e}\")\n\n    def get_data(self):\n        return self.data\n\n\n# 读取股票历史数据\nclass stock_hist_data(metaclass=singleton_type):\n    def __init__(self, date=None, stocks=None, workers=16):\n        if stocks is None:\n            _subset = stock_data(date).get_data()[list(tbs.TABLE_CN_STOCK_FOREIGN_KEY['columns'])]\n            stocks = [tuple(x) for x in _subset.values]\n        if stocks is None:\n            self.data = None\n            return\n        date_start, is_cache = trd.get_trade_hist_interval(stocks[0][0])  # 提高运行效率，只运行一次\n        _data = {}\n        try:\n            # max_workers是None还是没有给出，将默认为机器cup个数*5\n            with concurrent.futures.ThreadPoolExecutor(max_workers=workers) as executor:\n                future_to_stock = {executor.submit(stf.fetch_stock_hist, stock, date_start, is_cache): stock for stock\n                                   in stocks}\n                for future in concurrent.futures.as_completed(future_to_stock):\n                    stock = future_to_stock[future]\n                    try:\n                        __data = future.result()\n                        if __data is not None:\n                            _data[stock] = __data\n                    except Exception as e:\n                        logging.error(f\"singleton.stock_hist_data处理异常：{stock[1]}代码{e}\")\n        except Exception as e:\n            logging.error(f\"singleton.stock_hist_data处理异常：{e}\")\n        if not _data:\n            self.data = None\n        else:\n            self.data = _data\n\n    def get_data(self):\n        return self.data\n"
  },
  {
    "path": "instock/core/singleton_stock_web_module_data.py",
    "content": "#!/usr/local/bin/python\n# -*- coding: utf-8 -*-\n\nimport instock.core.tablestructure as tbs\nfrom instock.lib.singleton_type import singleton_type\nimport instock.core.web_module_data as wmd\n\n__author__ = 'myh '\n__date__ = '2023/3/10 '\n\n\nclass stock_web_module_data(metaclass=singleton_type):\n    def __init__(self):\n        _data = {}\n        self.data_list = [wmd.web_module_data(\n            mode=\"query\",\n            type=\"综合选股\",\n            ico=\"fa fa-desktop\",\n            name=tbs.TABLE_CN_STOCK_SELECTION['cn'],\n            table_name=tbs.TABLE_CN_STOCK_SELECTION['name'],\n            columns=tuple(tbs.TABLE_CN_STOCK_SELECTION['columns']),\n            column_names=tbs.get_field_cns(tbs.TABLE_CN_STOCK_SELECTION['columns']),\n            primary_key=[],\n            is_realtime=False,\n            order_columns=f\"(SELECT `datetime` FROM `{tbs.TABLE_CN_STOCK_ATTENTION['name']}` WHERE `code`=`{tbs.TABLE_CN_STOCK_SELECTION['name']}`.`code`) AS `cdatetime`\",\n            order_by=\" `cdatetime` DESC\"\n        ), wmd.web_module_data(\n            mode=\"query\",\n            type=\"股票基本数据\",\n            ico=\"fa fa-book\",\n            name=tbs.TABLE_CN_STOCK_SPOT['cn'],\n            table_name=tbs.TABLE_CN_STOCK_SPOT['name'],\n            columns=tuple(tbs.TABLE_CN_STOCK_SPOT['columns']),\n            column_names=tbs.get_field_cns(tbs.TABLE_CN_STOCK_SPOT['columns']),\n            primary_key=[],\n            is_realtime=True,\n            order_columns=f\"(SELECT `datetime` FROM `{tbs.TABLE_CN_STOCK_ATTENTION['name']}` WHERE `code`=`{tbs.TABLE_CN_STOCK_SPOT['name']}`.`code`) AS `cdatetime`\",\n            order_by=\" `cdatetime` DESC\"\n        ), wmd.web_module_data(\n            mode=\"query\",\n            type=\"股票基本数据\",\n            ico=\"fa fa-book\",\n            name=tbs.TABLE_CN_STOCK_CHIP_RACE_OPEN['cn'],\n            table_name=tbs.TABLE_CN_STOCK_CHIP_RACE_OPEN['name'],\n            columns=tuple(tbs.TABLE_CN_STOCK_CHIP_RACE_OPEN['columns']),\n            column_names=tbs.get_field_cns(tbs.TABLE_CN_STOCK_CHIP_RACE_OPEN['columns']),\n            primary_key=[],\n            is_realtime=True,\n            order_columns=f\"(SELECT `datetime` FROM `{tbs.TABLE_CN_STOCK_ATTENTION['name']}` WHERE `code`=`{tbs.TABLE_CN_STOCK_CHIP_RACE_OPEN['name']}`.`code`) AS `cdatetime`\",\n            order_by=\" `bid_trust_amount` DESC\"\n        ), wmd.web_module_data(\n            mode=\"query\",\n            type=\"股票基本数据\",\n            ico=\"fa fa-book\",\n            name=tbs.TABLE_CN_STOCK_CHIP_RACE_END['cn'],\n            table_name=tbs.TABLE_CN_STOCK_CHIP_RACE_END['name'],\n            columns=tuple(tbs.TABLE_CN_STOCK_CHIP_RACE_END['columns']),\n            column_names=tbs.get_field_cns(tbs.TABLE_CN_STOCK_CHIP_RACE_END['columns']),\n            primary_key=[],\n            is_realtime=False,\n            order_columns=f\"(SELECT `datetime` FROM `{tbs.TABLE_CN_STOCK_ATTENTION['name']}` WHERE `code`=`{tbs.TABLE_CN_STOCK_CHIP_RACE_END['name']}`.`code`) AS `cdatetime`\",\n            order_by=\" `bid_trust_amount` DESC\"\n        ), wmd.web_module_data(\n            mode=\"query\",\n            type=\"股票基本数据\",\n            ico=\"fa fa-book\",\n            name=tbs.TABLE_CN_STOCK_LIMITUP_REASON['cn'],\n            table_name=tbs.TABLE_CN_STOCK_LIMITUP_REASON['name'],\n            columns=tuple(tbs.TABLE_CN_STOCK_LIMITUP_REASON['columns']),\n            column_names=tbs.get_field_cns(tbs.TABLE_CN_STOCK_LIMITUP_REASON['columns']),\n            primary_key=[],\n            is_realtime=True,\n            order_columns=f\"(SELECT `datetime` FROM `{tbs.TABLE_CN_STOCK_ATTENTION['name']}` WHERE `code`=`{tbs.TABLE_CN_STOCK_LIMITUP_REASON['name']}`.`code`) AS `cdatetime`\",\n            order_by=\" `cdatetime` DESC\"\n        ), wmd.web_module_data(\n            mode=\"query\",\n            type=\"股票基本数据\",\n            ico=\"fa fa-book\",\n            name=tbs.TABLE_CN_STOCK_FUND_FLOW['cn'],\n            table_name=tbs.TABLE_CN_STOCK_FUND_FLOW['name'],\n            columns=tuple(tbs.TABLE_CN_STOCK_FUND_FLOW['columns']),\n            column_names=tbs.get_field_cns(tbs.TABLE_CN_STOCK_FUND_FLOW['columns']),\n            primary_key=[],\n            is_realtime=True,\n            order_columns=f\"(SELECT `datetime` FROM `{tbs.TABLE_CN_STOCK_ATTENTION['name']}` WHERE `code`=`{tbs.TABLE_CN_STOCK_FUND_FLOW['name']}`.`code`) AS `cdatetime`\",\n            order_by=\" `cdatetime` DESC\"\n        ), wmd.web_module_data(\n            mode=\"query\",\n            type=\"股票基本数据\",\n            ico=\"fa fa-book\",\n            name=tbs.TABLE_CN_STOCK_BONUS['cn'],\n            table_name=tbs.TABLE_CN_STOCK_BONUS['name'],\n            columns=tuple(tbs.TABLE_CN_STOCK_BONUS['columns']),\n            column_names=tbs.get_field_cns(tbs.TABLE_CN_STOCK_BONUS['columns']),\n            primary_key=[],\n            is_realtime=True,\n            order_columns=f\"(SELECT `datetime` FROM `{tbs.TABLE_CN_STOCK_ATTENTION['name']}` WHERE `code`=`{tbs.TABLE_CN_STOCK_BONUS['name']}`.`code`) AS `cdatetime`\",\n            order_by=\" `cdatetime` DESC\"\n        ), wmd.web_module_data(\n            mode=\"query\",\n            type=\"股票基本数据\",\n            ico=\"fa fa-book\",\n            name=tbs.TABLE_CN_STOCK_lHB['cn'],\n            table_name=tbs.TABLE_CN_STOCK_lHB['name'],\n            columns=tuple(tbs.TABLE_CN_STOCK_lHB['columns']),\n            column_names=tbs.get_field_cns(tbs.TABLE_CN_STOCK_lHB['columns']),\n            primary_key=[],\n            is_realtime=True,\n            order_columns=f\"(SELECT `datetime` FROM `{tbs.TABLE_CN_STOCK_ATTENTION['name']}` WHERE `code`=`{tbs.TABLE_CN_STOCK_lHB['name']}`.`code`) AS `cdatetime`\",\n            order_by=\" `cdatetime`,`ranking_times` DESC\"\n        ), wmd.web_module_data(\n            mode=\"query\",\n            type=\"股票基本数据\",\n            ico=\"fa fa-book\",\n            name=tbs.TABLE_CN_STOCK_BLOCKTRADE['cn'],\n            table_name=tbs.TABLE_CN_STOCK_BLOCKTRADE['name'],\n            columns=tuple(tbs.TABLE_CN_STOCK_BLOCKTRADE['columns']),\n            column_names=tbs.get_field_cns(tbs.TABLE_CN_STOCK_BLOCKTRADE['columns']),\n            primary_key=[],\n            is_realtime=False,\n            order_columns=f\"(SELECT `datetime` FROM `{tbs.TABLE_CN_STOCK_ATTENTION['name']}` WHERE `code`=`{tbs.TABLE_CN_STOCK_BLOCKTRADE['name']}`.`code`) AS `cdatetime`\",\n            order_by=\" `cdatetime` DESC\"\n        ), wmd.web_module_data(\n            mode=\"query\",\n            type=\"股票基本数据\",\n            ico=\"fa fa-book\",\n            name=tbs.TABLE_CN_STOCK_FUND_FLOW_INDUSTRY['cn'],\n            table_name=tbs.TABLE_CN_STOCK_FUND_FLOW_INDUSTRY['name'],\n            columns=tuple(tbs.TABLE_CN_STOCK_FUND_FLOW_INDUSTRY['columns']),\n            column_names=tbs.get_field_cns(tbs.TABLE_CN_STOCK_FUND_FLOW_INDUSTRY['columns']),\n            primary_key=[],\n            is_realtime=True,\n            order_by=\" `fund_amount` DESC\"\n        ), wmd.web_module_data(\n            mode=\"query\",\n            type=\"股票基本数据\",\n            ico=\"fa fa-book\",\n            name=tbs.TABLE_CN_STOCK_FUND_FLOW_CONCEPT['cn'],\n            table_name=tbs.TABLE_CN_STOCK_FUND_FLOW_CONCEPT['name'],\n            columns=tuple(tbs.TABLE_CN_STOCK_FUND_FLOW_CONCEPT['columns']),\n            column_names=tbs.get_field_cns(tbs.TABLE_CN_STOCK_FUND_FLOW_CONCEPT['columns']),\n            primary_key=[],\n            is_realtime=True,\n            order_by=\" `fund_amount` DESC\"\n        ), wmd.web_module_data(\n            mode=\"query\",\n            type=\"股票基本数据\",\n            ico=\"fa fa-book\",\n            name=tbs.TABLE_CN_ETF_SPOT['cn'],\n            table_name=tbs.TABLE_CN_ETF_SPOT['name'],\n            columns=tuple(tbs.TABLE_CN_ETF_SPOT['columns']),\n            column_names=tbs.get_field_cns(tbs.TABLE_CN_ETF_SPOT['columns']),\n            primary_key=[],\n            is_realtime=True\n        ), wmd.web_module_data(\n            mode=\"query\",\n            type=\"股票指标数据\",\n            ico=\"fa fa-indent\",\n            name=tbs.TABLE_CN_STOCK_INDICATORS['cn'],\n            table_name=tbs.TABLE_CN_STOCK_INDICATORS['name'],\n            columns=tuple(tbs.TABLE_CN_STOCK_INDICATORS['columns']),\n            column_names=tbs.get_field_cns(tbs.TABLE_CN_STOCK_INDICATORS['columns']),\n            primary_key=[],\n            is_realtime=False,\n            order_columns=f\"(SELECT `datetime` FROM `{tbs.TABLE_CN_STOCK_ATTENTION['name']}` WHERE `code`=`{tbs.TABLE_CN_STOCK_INDICATORS['name']}`.`code`) AS `cdatetime`\",\n            order_by=\" `cdatetime` DESC\"\n        ), wmd.web_module_data(\n            mode=\"query\",\n            type=\"股票指标数据\",\n            ico=\"fa fa-indent\",\n            name=tbs.TABLE_CN_STOCK_INDICATORS_BUY['cn'],\n            table_name=tbs.TABLE_CN_STOCK_INDICATORS_BUY['name'],\n            columns=tuple(tbs.TABLE_CN_STOCK_INDICATORS_BUY['columns']),\n            column_names=tbs.get_field_cns(tbs.TABLE_CN_STOCK_INDICATORS_BUY['columns']),\n            primary_key=[],\n            is_realtime=False,\n            order_columns=f\"(SELECT `datetime` FROM `{tbs.TABLE_CN_STOCK_ATTENTION['name']}` WHERE `code`=`{tbs.TABLE_CN_STOCK_INDICATORS_BUY['name']}`.`code`) AS `cdatetime`\",\n            order_by=\" `cdatetime` DESC\"\n        ), wmd.web_module_data(\n            mode=\"query\",\n            type=\"股票指标数据\",\n            ico=\"fa fa-indent\",\n            name=tbs.TABLE_CN_STOCK_INDICATORS_SELL['cn'],\n            table_name=tbs.TABLE_CN_STOCK_INDICATORS_SELL['name'],\n            columns=tuple(tbs.TABLE_CN_STOCK_INDICATORS_SELL['columns']),\n            column_names=tbs.get_field_cns(tbs.TABLE_CN_STOCK_INDICATORS_SELL['columns']),\n            primary_key=[],\n            is_realtime=False,\n            order_columns=f\"(SELECT `datetime` FROM `{tbs.TABLE_CN_STOCK_ATTENTION['name']}` WHERE `code`=`{tbs.TABLE_CN_STOCK_INDICATORS_SELL['name']}`.`code`) AS `cdatetime`\",\n            order_by=\" `cdatetime` DESC\"\n        ), wmd.web_module_data(\n            mode=\"query\",\n            type=\"股票K线形态\",\n            ico=\"fa fa-tag\",\n            name=tbs.TABLE_CN_STOCK_KLINE_PATTERN['cn'],\n            table_name=tbs.TABLE_CN_STOCK_KLINE_PATTERN['name'],\n            columns=tuple(tbs.TABLE_CN_STOCK_KLINE_PATTERN['columns']),\n            column_names=tbs.get_field_cns(tbs.TABLE_CN_STOCK_KLINE_PATTERN['columns']),\n            primary_key=[],\n            is_realtime=False,\n            order_columns=f\"(SELECT `datetime` FROM `{tbs.TABLE_CN_STOCK_ATTENTION['name']}` WHERE `code`=`{tbs.TABLE_CN_STOCK_KLINE_PATTERN['name']}`.`code`) AS `cdatetime`\",\n            order_by=\" `cdatetime` DESC\"\n        ), wmd.web_module_data(\n            mode=\"query\",\n            type=\"股票策略数据\",\n            ico=\"fa fa-check-square-o\",\n            name=tbs.TABLE_CN_STOCK_SPOT_BUY['cn'],\n            table_name=tbs.TABLE_CN_STOCK_SPOT_BUY['name'],\n            columns=tuple(tbs.TABLE_CN_STOCK_SPOT_BUY['columns']),\n            column_names=tbs.get_field_cns(tbs.TABLE_CN_STOCK_SPOT_BUY['columns']),\n            primary_key=[],\n            is_realtime=False,\n            order_columns=f\"(SELECT `datetime` FROM `{tbs.TABLE_CN_STOCK_ATTENTION['name']}` WHERE `code`=`{tbs.TABLE_CN_STOCK_SPOT_BUY['name']}`.`code`) AS `cdatetime`\",\n            order_by=\" `cdatetime` DESC\"\n        )]\n\n        for table in tbs.TABLE_CN_STOCK_STRATEGIES:\n            self.data_list.append(\n                wmd.web_module_data(\n                    mode=\"query\",\n                    type=\"股票策略数据\",\n                    ico=\"fa fa-check-square-o\",\n                    name=table['cn'],\n                    table_name=table['name'],\n                    columns=tuple(table['columns']),\n                    column_names=tbs.get_field_cns(table['columns']),\n                    primary_key=[],\n                    is_realtime=False,\n                    order_columns=f\"(SELECT `datetime` FROM `{tbs.TABLE_CN_STOCK_ATTENTION['name']}` WHERE `code`=`{table['name']}`.`code`) AS `cdatetime`\",\n                    order_by=\" `cdatetime` DESC\"\n                )\n            )\n        for tmp in self.data_list:\n            _data[tmp.table_name] = tmp\n        self.data = _data\n\n    def get_data_list(self):\n        return self.data_list\n\n    def get_data(self, name):\n        return self.data[name]\n"
  },
  {
    "path": "instock/core/singleton_trade_date.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\nimport logging\nimport instock.core.stockfetch as stf\nfrom instock.lib.singleton_type import singleton_type\n\n__author__ = 'myh '\n__date__ = '2023/3/10 '\n\n\n# 读取股票交易日历数据\nclass stock_trade_date(metaclass=singleton_type):\n    def __init__(self):\n        try:\n            self.data = stf.fetch_stocks_trade_date()\n        except Exception as e:\n            logging.error(f\"singleton.stock_trade_date处理异常：{e}\")\n\n    def get_data(self):\n        return self.data\n"
  },
  {
    "path": "instock/core/stockfetch.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\nimport logging\nimport os.path\nimport datetime\nimport numpy as np\nimport pandas as pd\nimport talib as tl\nimport instock.core.tablestructure as tbs\nimport instock.lib.trade_time as trd\nimport instock.core.crawling.trade_date_hist as tdh\nimport instock.core.crawling.fund_etf_em as fee\nimport instock.core.crawling.stock_selection as sst\nimport instock.core.crawling.stock_lhb_em as sle\nimport instock.core.crawling.stock_lhb_sina as sls\nimport instock.core.crawling.stock_dzjy_em as sde\nimport instock.core.crawling.stock_hist_em as she\nimport instock.core.crawling.stock_fund_em as sff\nimport instock.core.crawling.stock_fhps_em as sfe\nimport instock.core.crawling.stock_chip_race as scr\nimport instock.core.crawling.stock_limitup_reason as slr\n\n__author__ = 'myh '\n__date__ = '2023/3/10 '\n\n# 设置基础目录，每次加载使用。\ncpath_current = os.path.dirname(os.path.dirname(__file__))\nstock_hist_cache_path = os.path.join(cpath_current, 'cache', 'hist')\nif not os.path.exists(stock_hist_cache_path):\n    os.makedirs(stock_hist_cache_path)  # 创建多个文件夹结构。\n\n\n# 600 601 603 605开头的股票是上证A股\n# 600开头的股票是上证A股，属于大盘股，其中6006开头的股票是最早上市的股票，\n# 6016开头的股票为大盘蓝筹股；900开头的股票是上证B股；\n# 688开头的是上证科创板股票；\n# 000开头的股票是深证A股，001、002开头的股票也都属于深证A股，\n# 其中002开头的股票是深证A股中小企业股票；\n# 200开头的股票是深证B股；\n# 300、301开头的股票是创业板股票；400开头的股票是三板市场股票。\n# 430、83、87开头的股票是北证A股\ndef is_a_stock(code):\n    # 上证A股  # 深证A股\n    return code.startswith(('600', '601', '603', '605', '000', '001', '002', '003', '300', '301'))\n\n\n# 过滤掉 st 股票。\ndef is_not_st(name):\n    return not name.startswith(('*ST', 'ST'))\n\n\n# 过滤价格，如果没有基本上是退市了。\ndef is_open(price):\n    return not np.isnan(price)\n\n\ndef is_open_with_line(price):\n    return price != '-'\n\n\n# 读取股票交易日历数据\ndef fetch_stocks_trade_date():\n    try:\n        data = tdh.tool_trade_date_hist_sina()\n        if data is None or len(data.index) == 0:\n            return None\n        data_date = set(data['trade_date'].values.tolist())\n        return data_date\n    except Exception as e:\n        logging.error(f\"stockfetch.fetch_stocks_trade_date处理异常：{e}\")\n    return None\n\n\n# 读取当天股票数据\ndef fetch_etfs(date):\n    try:\n        data = fee.fund_etf_spot_em()\n        if data is None or len(data.index) == 0:\n            return None\n        if date is None:\n            data.insert(0, 'date', datetime.datetime.now().strftime(\"%Y-%m-%d\"))\n        else:\n            data.insert(0, 'date', date.strftime(\"%Y-%m-%d\"))\n        data.columns = list(tbs.TABLE_CN_ETF_SPOT['columns'])\n        data = data.loc[data['new_price'].apply(is_open)]\n        return data\n    except Exception as e:\n        logging.error(f\"stockfetch.fetch_etfs处理异常：{e}\")\n    return None\n\n\n# 读取当天股票数据\ndef fetch_stocks(date):\n    try:\n        data = she.stock_zh_a_spot_em()\n        if data is None or len(data.index) == 0:\n            return None\n        if date is None:\n            data.insert(0, 'date', datetime.datetime.now().strftime(\"%Y-%m-%d\"))\n        else:\n            data.insert(0, 'date', date.strftime(\"%Y-%m-%d\"))\n        data.columns = list(tbs.TABLE_CN_STOCK_SPOT['columns'])\n        data = data.loc[data['code'].apply(is_a_stock)].loc[data['new_price'].apply(is_open)]\n        return data\n    except Exception as e:\n        logging.error(f\"stockfetch.fetch_stocks处理异常：{e}\")\n    return None\n\n\ndef fetch_stock_selection():\n    try:\n        data = sst.stock_selection()\n        if data is None or len(data.index) == 0:\n            return None\n        data.columns = list(tbs.TABLE_CN_STOCK_SELECTION['columns'])\n        data.drop_duplicates('code', keep='last', inplace=True)\n        return data\n    except Exception as e:\n        logging.error(f\"stockfetch.fetch_stocks_selection处理异常：{e}\")\n    return None\n\n\n# 读取股票资金流向\ndef fetch_stocks_fund_flow(index):\n    try:\n        cn_flow = tbs.CN_STOCK_FUND_FLOW[index]\n        data = sff.stock_individual_fund_flow_rank(indicator=cn_flow['cn'])\n        if data is None or len(data.index) == 0:\n            return None\n        data.columns = list(cn_flow['columns'])\n        data = data.loc[data['code'].apply(is_a_stock)].loc[data['new_price'].apply(is_open_with_line)]\n        return data\n    except Exception as e:\n        logging.error(f\"stockfetch.fetch_stocks_fund_flow处理异常：{e}\")\n    return None\n\n\n# 读取板块资金流向\ndef fetch_stocks_sector_fund_flow(index_sector, index_indicator):\n    try:\n        cn_flow = tbs.CN_STOCK_SECTOR_FUND_FLOW[1][index_indicator]\n        data = sff.stock_sector_fund_flow_rank(indicator=cn_flow['cn'], sector_type=tbs.CN_STOCK_SECTOR_FUND_FLOW[0][index_sector])\n        if data is None or len(data.index) == 0:\n            return None\n        data.columns = list(cn_flow['columns'])\n        return data\n    except Exception as e:\n        logging.error(f\"stockfetch.fetch_stocks_sector_fund_flow处理异常：{e}\")\n    return None\n\n\n# 读取股票分红配送\ndef fetch_stocks_bonus(date):\n    try:\n        data = sfe.stock_fhps_em(date=trd.get_bonus_report_date())\n        if data is None or len(data.index) == 0:\n            return None\n        if date is None:\n            data.insert(0, 'date', datetime.datetime.now().strftime(\"%Y-%m-%d\"))\n        else:\n            data.insert(0, 'date', date.strftime(\"%Y-%m-%d\"))\n        data.columns = list(tbs.TABLE_CN_STOCK_BONUS['columns'])\n        data = data.loc[data['code'].apply(is_a_stock)]\n        return data\n    except Exception as e:\n        logging.error(f\"stockfetch.fetch_stocks_bonus处理异常：{e}\")\n    return None\n\n\n# 股票近三月上龙虎榜且必须有2次以上机构参与的\ndef fetch_stock_top_entity_data(date):\n    run_date = date + datetime.timedelta(days=-90)\n    start_date = run_date.strftime(\"%Y%m%d\")\n    end_date = date.strftime(\"%Y%m%d\")\n    code_name = '代码'\n    entity_amount_name = '买方机构数'\n    try:\n        data = sle.stock_lhb_jgmmtj_em(start_date, end_date)\n        if data is None or len(data.index) == 0:\n            return None\n\n        # 机构买入次数大于1计算方法，首先：每次要有买方机构数(>0),然后：这段时间买方机构数求和大于1\n        mask = (data[entity_amount_name] > 0)  # 首先：每次要有买方机构数(>0)\n        data = data.loc[mask]\n\n        if len(data.index) == 0:\n            return None\n\n        grouped = data.groupby(by=data[code_name])\n        data_series = grouped[entity_amount_name].sum()\n        data_code = set(data_series[data_series > 1].index.values)  # 然后：这段时间买方机构数求和大于1\n\n        if not data_code:\n            return None\n\n        return data_code\n    except Exception as e:\n        logging.error(f\"stockfetch.fetch_stock_top_entity_data处理异常：{e}\")\n    return None\n\n# 描述: 获取东方财富-龙虎榜-个股上榜统计\ndef fetch_stock_lhb_data(date,count=12):\n    try:\n        start_date = trd.get_previous_trade_date(date,count).strftime(\"%Y%m%d\")\n        end_date = date.strftime(\"%Y%m%d\")\n\n        data = sle.stock_lhb_detail_em(start_date, end_date)\n        if data is None or len(data.index) == 0:\n            return None\n        _columns = list(tbs.TABLE_CN_STOCK_lHB['columns'])\n        _columns.pop(0)\n        data.columns = _columns\n        data = data.loc[data['code'].apply(is_a_stock)]\n        data.drop_duplicates('code', keep='last', inplace=True)\n        # data = data.sort_values(by='ranking_times', ascending=False)\n        if date is None:\n            data.insert(0, 'date', datetime.datetime.now().strftime(\"%Y-%m-%d\"))\n        else:\n            data.insert(0, 'date', date.strftime(\"%Y-%m-%d\"))\n        return data\n    except Exception as e:\n        logging.error(f\"stockfetch.fetch_stock_lhb_data处理异常：{e}\")\n    return None\n\n# 描述: 获取新浪财经-龙虎榜-个股上榜统计\ndef fetch_stock_top_data(date):\n    try:\n        data = sls.stock_lhb_ggtj_sina()\n        if data is None or len(data.index) == 0:\n            return None\n        _columns = list(tbs.TABLE_CN_STOCK_TOP['columns'])\n        _columns.pop(0)\n        data.columns = _columns\n        data = data.loc[data['code'].apply(is_a_stock)]\n        data.drop_duplicates('code', keep='last', inplace=True)\n        if date is None:\n            data.insert(0, 'date', datetime.datetime.now().strftime(\"%Y-%m-%d\"))\n        else:\n            data.insert(0, 'date', date.strftime(\"%Y-%m-%d\"))\n        return data\n    except Exception as e:\n        logging.error(f\"stockfetch.fetch_stock_top_data处理异常：{e}\")\n    return None\n\n\n# 描述: 获取东方财富网-数据中心-大宗交易-每日统计\ndef fetch_stock_blocktrade_data(date):\n    date_str = date.strftime(\"%Y%m%d\")\n    try:\n        data = sde.stock_dzjy_mrtj(start_date=date_str, end_date=date_str)\n        if data is None or len(data.index) == 0:\n            return None\n\n        columns = list(tbs.TABLE_CN_STOCK_BLOCKTRADE['columns'])\n        columns.insert(0, 'index')\n        data.columns = columns\n        data = data.loc[data['code'].apply(is_a_stock)]\n        data.drop('index', axis=1, inplace=True)\n        return data\n    except TypeError:\n        logging.error(\"处理异常：目前还没有大宗交易数据，请17:00点后再获取！\")\n        return None\n    except Exception as e:\n        logging.error(f\"stockfetch.fetch_stock_blocktrade_data处理异常：{e}\")\n    return None\n\n# 读取早盘抢筹\ndef fetch_stock_chip_race_open(date):\n    try:\n        date_str =\"\"\n        if date != datetime.datetime.now().date():\n            date_str = date.strftime(\"%Y%m%d\")\n        data = scr.stock_chip_race_open(date_str)\n        if data is None or len(data.index) == 0:\n            return None\n        if date is None:\n            data.insert(0, 'date', datetime.datetime.now().strftime(\"%Y-%m-%d\"))\n        else:\n            data.insert(0, 'date', date.strftime(\"%Y-%m-%d\"))\n        data.columns = list(tbs.TABLE_CN_STOCK_CHIP_RACE_OPEN['columns'])\n        return data\n    except Exception as e:\n        logging.error(f\"stockfetch.fetch_stock_chip_race_open处理异常：{e}\")\n    return None\n\n# 读取尾盘抢筹\ndef fetch_stock_chip_race_end(date):\n    try:\n        date_str =\"\"\n        if date != datetime.datetime.now().date():\n            date_str = date.strftime(\"%Y%m%d\")\n        data = scr.stock_chip_race_end(date_str)\n        if data is None or len(data.index) == 0:\n            return None\n        if date is None:\n            data.insert(0, 'date', datetime.datetime.now().strftime(\"%Y-%m-%d\"))\n        else:\n            data.insert(0, 'date', date.strftime(\"%Y-%m-%d\"))\n        data.columns = list(tbs.TABLE_CN_STOCK_CHIP_RACE_END['columns'])\n        return data\n    except Exception as e:\n        logging.error(f\"stockfetch.fetch_stock_chip_race_end处理异常：{e}\")\n    return None\n\n# 读取涨停原因\ndef fetch_stock_limitup_reason(date):\n\n    try:\n        data = slr.stock_limitup_reason(date.strftime(\"%Y-%m-%d\"))\n        if data is None or len(data.index) == 0:\n            return None\n        data.columns = list(tbs.TABLE_CN_STOCK_LIMITUP_REASON['columns'])\n        return data\n    except Exception as e:\n        logging.error(f\"stockfetch.fetch_stock_limitup_reason处理异常：{e}\")\n    return None\n\n# 读取股票历史数据\ndef fetch_etf_hist(data_base, date_start=None, date_end=None, adjust='qfq'):\n    date = data_base[0]\n    code = data_base[1]\n\n    if date_start is None:\n        date_start, is_cache = trd.get_trade_hist_interval(date)  # 提高运行效率，只运行一次\n    try:\n        if date_end is not None:\n            data = fee.fund_etf_hist_em(symbol=code, period=\"daily\", start_date=date_start, end_date=date_end,\n                                        adjust=adjust)\n        else:\n            data = fee.fund_etf_hist_em(symbol=code, period=\"daily\", start_date=date_start, adjust=adjust)\n\n        if data is None or len(data.index) == 0:\n            return None\n        data.columns = tuple(tbs.CN_STOCK_HIST_DATA['columns'])\n        data = data.sort_index()  # 将数据按照日期排序下。\n        if data is not None:\n            data.loc[:, 'p_change'] = tl.ROC(data['close'].values, 1)\n            data['p_change'].values[np.isnan(data['p_change'].values)] = 0.0\n            data[\"volume\"] = data['volume'].values.astype('double') * 100  # 成交量单位从手变成股。\n        return data\n    except Exception as e:\n        logging.error(f\"stockfetch.fetch_etf_hist处理异常：{e}\")\n    return None\n\n\n# 读取股票历史数据\ndef fetch_stock_hist(data_base, date_start=None, is_cache=True):\n    date = data_base[0]\n    code = data_base[1]\n\n    if date_start is None:\n        date_start, is_cache = trd.get_trade_hist_interval(date)  # 提高运行效率，只运行一次\n        # date_end = date_end.strftime(\"%Y%m%d\")\n    try:\n        data = stock_hist_cache(code, date_start, None, is_cache, 'qfq')\n        if data is not None:\n            data.loc[:, 'p_change'] = tl.ROC(data['close'].values, 1)\n            data['p_change'].values[np.isnan(data['p_change'].values)] = 0.0\n            data[\"volume\"] = data['volume'].values.astype('double') * 100  # 成交量单位从手变成股。\n        return data\n    except Exception as e:\n        logging.error(f\"stockfetch.fetch_stock_hist处理异常：{e}\")\n    return None\n\n\n# 增加读取股票缓存方法。加快处理速度。多线程解决效率\ndef stock_hist_cache(code, date_start, date_end=None, is_cache=True, adjust=''):\n    cache_dir = os.path.join(stock_hist_cache_path, date_start[0:6], date_start)\n    # 如果没有文件夹创建一个。月文件夹和日文件夹。方便删除。\n    try:\n        if not os.path.exists(cache_dir):\n            os.makedirs(cache_dir)\n    except Exception:\n        pass\n    cache_file = os.path.join(cache_dir, \"%s%s.gzip.pickle\" % (code, adjust))\n    # 如果缓存存在就直接返回缓存数据。压缩方式。\n    try:\n        if os.path.isfile(cache_file):\n            return pd.read_pickle(cache_file, compression=\"gzip\")\n        else:\n            if date_end is not None:\n                stock = she.stock_zh_a_hist(symbol=code, period=\"daily\", start_date=date_start, end_date=date_end,\n                                            adjust=adjust)\n            else:\n                stock = she.stock_zh_a_hist(symbol=code, period=\"daily\", start_date=date_start, adjust=adjust)\n\n            if stock is None or len(stock.index) == 0:\n                return None\n            stock.columns = tuple(tbs.CN_STOCK_HIST_DATA['columns'])\n            stock = stock.sort_index()  # 将数据按照日期排序下。\n            try:\n                if is_cache:\n                    stock.to_pickle(cache_file, compression=\"gzip\")\n            except Exception:\n                pass\n            # time.sleep(1)\n            return stock\n    except Exception as e:\n        logging.error(f\"stockfetch.stock_hist_cache处理异常：{code}代码{e}\")\n    return None\n"
  },
  {
    "path": "instock/core/strategy/.gitignore",
    "content": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\ncover/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\n.pybuilder/\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# IPython\nprofile_default/\nipython_config.py\n\n# pyenv\n#   For a library or package, you might want to ignore these files since the code is\n#   intended to run in multiple environments; otherwise, check them in:\n# .python-version\n\n# pipenv\n#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.\n#   However, in case of collaboration, if having platform-specific dependencies or dependencies\n#   having no cross-platform support, pipenv may install dependencies that don't work, or not\n#   install all needed dependencies.\n#Pipfile.lock\n\n# poetry\n#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.\n#   This is especially recommended for binary packages to ensure reproducibility, and is more\n#   commonly ignored for libraries.\n#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control\n#poetry.lock\n\n# pdm\n#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.\n#pdm.lock\n#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it\n#   in version control.\n#   https://pdm.fming.dev/#use-with-ide\n.pdm.toml\n\n# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm\n__pypackages__/\n\n# Celery stuff\ncelerybeat-schedule\ncelerybeat.pid\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n.dmypy.json\ndmypy.json\n\n# Pyre type checker\n.pyre/\n\n# pytype static type analyzer\n.pytype/\n\n# Cython debug symbols\ncython_debug/\n\n# PyCharm\n#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can\n#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore\n#  and can be added to the global gitignore or merged into this file.  For a more nuclear\n#  option (not recommended) you can uncomment the following to ignore the entire idea folder.\n.idea/\n"
  },
  {
    "path": "instock/core/strategy/__init__.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\n__author__ = 'mmm '\n__date__ = '2023/3/10 '\n"
  },
  {
    "path": "instock/core/strategy/backtrace_ma250.py",
    "content": "#!/usr/local/bin/python\n# -*- coding: utf-8 -*-\n\nimport numpy as np\nimport talib as tl\nfrom datetime import datetime, timedelta\n\n__author__ = 'myh '\n__date__ = '2023/3/10 '\n\n\n# 回踩年线\n# 1.时间段：前段=最近60交易日最高收盘价之前交易日(长度>0)，后段=最高价当日及后面的交易日\n# 2.前段由年线(250日)以下向上突破\n# 3.后段必须在年线以上运行，且后段最低价日与最高价日相差必须在10-50日间\n# 4.回踩伴随缩量：最高价日交易量/后段最低价日交易量>2,后段最低价/最高价<0.8\ndef check(code_name, data, date=None, threshold=60):\n    if date is None:\n        end_date = code_name[0]\n    else:\n        end_date = date.strftime(\"%Y-%m-%d\")\n\n    if end_date is not None:\n        mask = (data['date'] <= end_date)\n        data = data.loc[mask].copy()\n    if len(data.index) < 250:\n        return False\n\n    data.loc[:, 'ma250'] = tl.MA(data['close'].values, timeperiod=250)\n    data['ma250'].values[np.isnan(data['ma250'].values)] = 0.0\n\n    data = data.tail(n=threshold)\n\n    # 区间最低点\n    lowest_row = [1000000, 0, '']\n    # 区间最高点\n    highest_row = [0, 0, '']\n    # 近期低点\n    recent_lowest_row = [1000000, 0, '']\n\n    # 计算区间最高、最低价格\n    for _close, _volume, _date in zip(data['close'].values, data['volume'].values, data['date'].values):\n        if _close > highest_row[0]:\n            highest_row[0] = _close\n            highest_row[1] = _volume\n            highest_row[2] = _date\n        elif _close < lowest_row[0]:\n            lowest_row[0] = _close\n            lowest_row[1] = _volume\n            lowest_row[2] = _date\n\n    if lowest_row[1] == 0 or highest_row[1] == 0:\n        return False\n\n    data_front = data.loc[(data['date'] < highest_row[2])]\n    data_end = data.loc[(data['date'] >= highest_row[2])]\n\n    if data_front.empty:\n        return False\n    # 前半段由年线以下向上突破\n    if not (data_front.iloc[0]['close'] < data_front.iloc[0]['ma250'] and\n            data_front.iloc[-1]['close'] > data_front.iloc[-1]['ma250']):\n        return False\n\n    if not data_end.empty:\n        # 后半段必须在年线以上运行（回踩年线）\n        for _close, _volume, _date, _ma250 in zip(data_end['close'].values, data_end['volume'].values, data_end['date'].values, data_end['ma250'].values):\n            if _close < _ma250:\n                return False\n            if _close < recent_lowest_row[0]:\n                recent_lowest_row[0] = _close\n                recent_lowest_row[1] = _volume\n                recent_lowest_row[2] = _date\n\n    date_diff = datetime.date(datetime.strptime(recent_lowest_row[2], '%Y-%m-%d')) - \\\n                datetime.date(datetime.strptime(highest_row[2], '%Y-%m-%d'))\n\n    if not (timedelta(days=10) <= date_diff <= timedelta(days=50)):\n        return False\n    # 回踩伴随缩量\n    vol_ratio = highest_row[1] / recent_lowest_row[1]\n    back_ratio = recent_lowest_row[0] / highest_row[0]\n\n    if not (vol_ratio > 2 and back_ratio < 0.8):\n        return False\n\n    return True\n"
  },
  {
    "path": "instock/core/strategy/breakthrough_platform.py",
    "content": "#!/usr/local/bin/python\n# -*- coding: utf-8 -*-\n\nfrom datetime import datetime\nimport numpy as np\nimport talib as tl\nfrom instock.core.strategy import enter\n\n__author__ = 'myh '\n__date__ = '2023/3/10 '\n\n\n# 平台突破策略\n# 1.60日内某日收盘价>=60日均线>开盘价\n# 2.且【1】放量上涨\n# 3.且【1】间之前时间，任意一天收盘价与60日均线偏离在-5%~20%之间。\ndef check(code_name, data, date=None, threshold=60):\n    origin_data = data\n    if date is None:\n        end_date = code_name[0]\n    else:\n        end_date = date.strftime(\"%Y-%m-%d\")\n    if end_date is not None:\n        mask = (data['date'] <= end_date)\n        data = data.loc[mask].copy()\n    if len(data.index) < threshold:\n        return False\n\n    data.loc[:, 'ma60'] = tl.MA(data['close'].values, timeperiod=60)\n    data['ma60'].values[np.isnan(data['ma60'].values)] = 0.0\n\n    data = data.tail(n=threshold)\n\n    breakthrough_row = None\n    for _close, _open, _date, _ma60 in zip(data['close'].values, data['open'].values, data['date'].values, data['ma60'].values):\n        if _open < _ma60 <= _close:\n            if enter.check_volume(code_name, origin_data, date=datetime.date(datetime.strptime(_date, '%Y-%m-%d')), threshold=threshold):\n                breakthrough_row = _date\n                break\n\n    if breakthrough_row is None:\n        return False\n\n    data_front = data.loc[(data['date'] < breakthrough_row) & (data['ma60'] > 0)]\n    for _close, _ma60 in zip(data_front['close'].values, data_front['ma60'].values):\n        if not (-0.05 < ((_ma60 - _close) / _ma60) < 0.2):\n            return False\n\n    return True\n"
  },
  {
    "path": "instock/core/strategy/climax_limitdown.py",
    "content": "#!/usr/local/bin/python\n# -*- coding: utf-8 -*-\n\n\nimport numpy as np\nimport talib as tl\n\n__author__ = 'myh '\n__date__ = '2023/3/10 '\n\n# 放量跌停\n# 1.跌>9.5%\n# 2.成交额不低于2亿\n# 3.成交量至少是5日平均成交量的4倍\ndef check(code_name, data, date=None, threshold=60):\n    if date is None:\n        end_date = code_name[0]\n    else:\n        end_date = date.strftime(\"%Y-%m-%d\")\n    if end_date is not None:\n        mask = (data['date'] <= end_date)\n        data = data.loc[mask].copy()\n    if len(data.index) < threshold:\n        return False\n\n    p_change = data.iloc[-1]['p_change']\n    if p_change > -9.5:\n        return False\n\n    data.loc[:, 'vol_ma5'] = tl.MA(data['volume'].values, timeperiod=5)\n    data['vol_ma5'].values[np.isnan(data['vol_ma5'].values)] = 0.0\n\n    data = data.tail(n=threshold + 1)\n    if len(data.index) < threshold + 1:\n        return False\n\n    # 最后一天收盘价\n    last_close = data.iloc[-1]['close']\n    # 最后一天成交量\n    last_vol = data.iloc[-1]['volume']\n\n    amount = last_close * last_vol\n\n    # 成交额不低于2亿\n    if amount < 200000000:\n        return False\n\n    data = data.head(n=threshold)\n\n    mean_vol = data.iloc[-1]['vol_ma5']\n\n    vol_ratio = last_vol / mean_vol\n    if vol_ratio >= 4:\n        return True\n    else:\n        return False\n"
  },
  {
    "path": "instock/core/strategy/enter.py",
    "content": "#!/usr/local/bin/python\n# -*- coding: utf-8 -*-\n\nimport numpy as np\nimport talib as tl\n\n\n__author__ = 'myh '\n__date__ = '2023/3/10 '\n\n\n# 放量上涨\n# 1.当日比前一天上涨小于2%或收盘价小于开盘价\n# 2.当日成交额不低于2亿\n# 3.当日成交量/5日平均成交量>=2\ndef check_volume(code_name, data, date=None, threshold=60):\n    if date is None:\n        end_date = code_name[0]\n    else:\n        end_date = date.strftime(\"%Y-%m-%d\")\n    if end_date is not None:\n        mask = (data['date'] <= end_date)\n        data = data.loc[mask].copy()\n    if len(data.index) < threshold:\n        return False\n\n    p_change = data.iloc[-1]['p_change']\n    if p_change < 2 or data.iloc[-1]['close'] < data.iloc[-1]['open']:\n        return False\n\n    data.loc[:, 'vol_ma5'] = tl.MA(data['volume'].values, timeperiod=5)\n    data['vol_ma5'].values[np.isnan(data['vol_ma5'].values)] = 0.0\n\n    data = data.tail(n=threshold + 1)\n    if len(data) < threshold + 1:\n        return False\n\n    # 最后一天收盘价\n    last_close = data.iloc[-1]['close']\n    # 最后一天成交量\n    last_vol = data.iloc[-1]['volume']\n\n    amount = last_close * last_vol\n\n    # 成交额不低于2亿\n    if amount < 200000000:\n        return False\n\n    data = data.head(n=threshold)\n\n    mean_vol = data.iloc[-1]['vol_ma5']\n\n    vol_ratio = last_vol / mean_vol\n    if vol_ratio >= 2:\n        return True\n    else:\n        return False\n"
  },
  {
    "path": "instock/core/strategy/high_tight_flag.py",
    "content": "#!/usr/local/bin/python\n# -*- coding: utf-8 -*-\n\n\n__author__ = 'myh '\n__date__ = '2023/3/10 '\n\n\n# 高而窄的旗形\n# 1.必须至少上市交易60日\n# 2.当日收盘价/之前24~10日的最低价>=1.9\n# 3.之前24~10日必须连续两天涨幅大于等于9.5%\ndef check_high_tight(code_name, data, date=None, threshold=60, istop=False):\n    # 龙虎榜上必须有机构\n    if not istop:\n        return False\n    if date is None:\n        end_date = code_name[0]\n    else:\n        end_date = date.strftime(\"%Y-%m-%d\")\n    if end_date is not None:\n        mask = (data['date'] <= end_date)\n        data = data.loc[mask]\n    if len(data.index) < threshold:\n        return False\n\n    data = data.tail(n=threshold)\n\n    data = data.tail(n=24)\n    data = data.head(n=14)\n    low = data['low'].values.min()\n    ratio_increase = data.iloc[-1]['high'] / low\n    if ratio_increase < 1.9:\n        return False\n\n    # 连续两天涨幅大于等于10%\n    previous_p_change = 0.0\n    for _p_change in data['p_change'].values:\n        # 单日跌幅超7%；高开低走7%；两日累计跌幅10%；两日高开低走累计10%\n        if _p_change >= 9.5:\n            if previous_p_change >= 9.5:\n                return True\n            else:\n                previous_p_change = _p_change\n        else:\n            previous_p_change = 0.0\n\n    return False\n"
  },
  {
    "path": "instock/core/strategy/keep_increasing.py",
    "content": "#!/usr/local/bin/python\n# -*- coding: utf-8 -*-\n\nimport numpy as np\nimport talib as tl\n\n__author__ = 'myh '\n__date__ = '2023/3/10 '\n\n\n# 持续上涨（MA30向上）\n# 均线多头\n# 1.30日前的30日均线<20日前的30日均线<10日前的30日均线<当日的30日均线\n# 3.(当日的30日均线/30日前的30日均线)>1.2\ndef check(code_name, data, date=None, threshold=30):\n    if date is None:\n        end_date = code_name[0]\n    else:\n        end_date = date.strftime(\"%Y-%m-%d\")\n    if end_date is not None:\n        mask = (data['date'] <= end_date)\n        data = data.loc[mask].copy()\n    if len(data.index) < threshold:\n        return False\n\n    data.loc[:, 'ma30'] = tl.MA(data['close'].values, timeperiod=30)\n    data['ma30'].values[np.isnan(data['ma30'].values)] = 0.0\n\n    data = data.tail(n=threshold)\n\n    step1 = round(threshold / 3)\n    step2 = round(threshold * 2 / 3)\n\n    if data.iloc[0]['ma30'] < data.iloc[step1]['ma30'] < \\\n            data.iloc[step2]['ma30'] < data.iloc[-1]['ma30'] and data.iloc[-1]['ma30'] > 1.2 * data.iloc[0]['ma30']:\n        return True\n    else:\n        return False\n"
  },
  {
    "path": "instock/core/strategy/low_atr.py",
    "content": "#!/usr/local/bin/python\n# -*- coding: utf-8 -*-\n\n\n__author__ = 'myh '\n__date__ = '2023/3/10 '\n\n\n# 低ATR成长\n# 1.必须至少上市交易250日\n# 2.最近10个交易日的最高收盘价必须比最近10个交易日的最低收盘价高1.1倍\ndef check_low_increase(code_name, data, date=None, ma_short=30, ma_long=250, threshold=10):\n    if date is None:\n        end_date = code_name[0]\n    else:\n        end_date = date.strftime(\"%Y-%m-%d\")\n    if end_date is not None:\n        mask = (data['date'] <= end_date)\n        data = data.loc[mask]\n    if len(data.index) < ma_long:\n        return False\n\n    # data.loc[:, 'ma_short'] = tl.MA(data['close'].values, timeperiod=ma_short)\n    # data['ma_short'].values[np.isnan(data['ma_short'].values)] = 0.0\n    # data.loc[:, 'ma_long'] = tl.MA(data['close'].values, timeperiod=ma_long)\n    # data['ma_long'].values[np.isnan(data['ma_long'].values)] = 0.0\n\n    data = data.tail(n=threshold)\n    inc_days = 0\n    dec_days = 0\n    days_count = len(data.index)\n    if days_count < threshold:\n        return False\n\n    # 区间最低点\n    lowest_row = 1000000\n    # 区间最高点\n    highest_row = 0\n\n    total_change = 0.0\n    for _close, _p_change in zip(data['close'].values, data['p_change'].values):\n        if _p_change > 0:\n            total_change += abs(_p_change)\n            inc_days = inc_days + 1\n        elif _p_change < 0:\n            total_change += abs(_p_change)\n            dec_days = dec_days + 1\n\n        if _close > highest_row:\n            highest_row = _close\n        elif _close < lowest_row:\n            lowest_row = _close\n\n    atr = total_change / days_count\n    if atr > 10:\n        return False\n\n    ratio = (highest_row - lowest_row) / lowest_row\n\n    if ratio > 1.1:\n        return True\n\n    return False\n"
  },
  {
    "path": "instock/core/strategy/low_backtrace_increase.py",
    "content": "#!/usr/local/bin/python\n# -*- coding: utf-8 -*-\n\n\n__author__ = 'myh '\n__date__ = '2023/3/10 '\n\n\n# 无大幅回撤\n# 1.当日收盘价比60日前的收盘价的涨幅小于0.6\n# 2.最近60日，不能有单日跌幅超7%、高开低走7%、两日累计跌幅10%、两日高开低走累计10%\ndef check(code_name, data, date=None, threshold=60):\n    if date is None:\n        end_date = code_name[0]\n    else:\n        end_date = date.strftime(\"%Y-%m-%d\")\n    if end_date is not None:\n        mask = (data['date'] <= end_date)\n        data = data.loc[mask]\n    if len(data.index) < threshold:\n        return False\n\n    data = data.tail(n=threshold)\n\n    ratio_increase = (data.iloc[-1]['close'] - data.iloc[0]['close']) / data.iloc[0]['close']\n    if ratio_increase < 0.6:\n        return False\n\n    # 允许有一次“洗盘”\n    previous_p_change = 100.0\n    previous_open = -1000000.0\n    for _p_change, _close, _open in zip(data['p_change'].values, data['close'].values, data['open'].values):\n        # 单日跌幅超7%；高开低走7%；两日累计跌幅10%；两日高开低走累计10%\n        if _p_change < -7 or (_close - _open) / _open * 100 < -7 \\\n                or previous_p_change + _p_change < -10 \\\n                or (_close - previous_open)/previous_open * 100 < -10:\n            return False\n        previous_p_change = _p_change\n        previous_open = _open\n    return True\n"
  },
  {
    "path": "instock/core/strategy/parking_apron.py",
    "content": "#!/usr/local/bin/python\n# -*- coding: utf-8 -*-\n\nfrom datetime import datetime\nfrom instock.core.strategy import turtle_trade\n\n__author__ = 'myh '\n__date__ = '2023/3/10 '\n\n\n# 停机坪\n# 1.最近15日有涨幅大于9.5%，且必须是放量上涨\n# 2.紧接的下个交易日必须高开，收盘价必须上涨，且与开盘价不能大于等于相差3%\n# 3.接下2、3个交易日必须高开，收盘价必须上涨，且与开盘价不能大于等于相差3%，且每天涨跌幅在5%间\ndef check(code_name, data, date=None, threshold=15):\n    origin_data = data\n    if date is None:\n        end_date = code_name[0]\n    else:\n        end_date = date.strftime(\"%Y-%m-%d\")\n    if end_date is not None:\n        mask = (data['date'] <= end_date)\n        data = data.loc[mask]\n    if len(data.index) < threshold:\n        return False\n\n    data = data.tail(n=threshold)\n\n    limitup_row = [1000000, '']\n    # 找出涨停日\n    for _close, _p_change, _date in zip(data['close'].values, data['p_change'].values, data['date'].values):\n        if _p_change > 9.5:\n            if turtle_trade.check_enter(code_name, origin_data, date=datetime.date(datetime.strptime(_date, '%Y-%m-%d')), threshold=threshold):\n                limitup_row[0] = _close\n                limitup_row[1] = _date\n                if check_internal(data, limitup_row):\n                    return True\n    return False\n\ndef check_internal(data, limitup_row):\n    limitup_price = limitup_row[0]\n    limitup_end = data.loc[(data['date'] > limitup_row[1])]\n    limitup_end = limitup_end.head(n=3)\n    if len(limitup_end.index) < 3:\n        return False\n\n    consolidation_day1 = limitup_end.iloc[0]\n    consolidation_day23 = limitup_end.tail(n=2)\n\n    if not (consolidation_day1['close'] > limitup_price and consolidation_day1['open'] > limitup_price and\n            0.97 < consolidation_day1['close'] / consolidation_day1['open'] < 1.03):\n        return False\n\n    for _close, _p_change, _open in zip(consolidation_day23['close'].values, consolidation_day23['p_change'].values, consolidation_day23['open'].values):\n        if not (0.97 < (_close / _open) < 1.03 and -5 < _p_change < 5\n                and _close > limitup_price and _open > limitup_price):\n            return False\n\n    return True\n"
  },
  {
    "path": "instock/core/strategy/turtle_trade.py",
    "content": "#!/usr/local/bin/python\n# -*- coding: utf-8 -*-\n\n\n__author__ = 'myh '\n__date__ = '2023/3/10 '\n\n# 总市值\nBALANCE = 200000\n\n# 海龟交易法则\n# 最后一个交易日收市价为指定区间内最高价\n# 1.当日收盘价>=最近60日最高收盘价\ndef check_enter(code_name, data, date=None, threshold=60):\n    if date is None:\n        end_date = code_name[0]\n    else:\n        end_date = date.strftime(\"%Y-%m-%d\")\n    if end_date is not None:\n        mask = (data['date'] <= end_date)\n        data = data.loc[mask]\n    if len(data.index) < threshold:\n        return False\n\n    data = data.tail(n=threshold)\n\n    max_price = 0\n    for _close in data['close'].values:\n        if _close > max_price:\n            max_price = _close\n\n    last_close = data.iloc[-1]['close']\n\n    if last_close >= max_price:\n        return True\n\n    return False\n"
  },
  {
    "path": "instock/core/tablestructure.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\nfrom sqlalchemy import DATE, VARCHAR, FLOAT, BIGINT, SmallInteger, DATETIME\nfrom sqlalchemy.dialects.mysql import BIT\nimport talib as tl\nfrom instock.core.strategy import enter\nfrom instock.core.strategy import turtle_trade\nfrom instock.core.strategy import climax_limitdown\nfrom instock.core.strategy import low_atr\nfrom instock.core.strategy import backtrace_ma250\nfrom instock.core.strategy import breakthrough_platform\nfrom instock.core.strategy import parking_apron\nfrom instock.core.strategy import low_backtrace_increase\nfrom instock.core.strategy import keep_increasing\nfrom instock.core.strategy import high_tight_flag\n\n__author__ = 'myh '\n__date__ = '2023/3/10 '\n\nRATE_FIELDS_COUNT = 100  # N日收益率字段数目，即N值\n_COLLATE = \"utf8mb4_general_ci\"\n\nTABLE_CN_STOCK_ATTENTION = {'name': 'cn_stock_attention', 'cn': '我的关注',\n                            'columns': {'datetime': {'type': DATETIME, 'cn': '日期', 'size': 0},\n                                        'code': {'type': VARCHAR(6, _COLLATE), 'cn': '代码', 'size': 60}}}\n\nTABLE_CN_ETF_SPOT = {'name': 'cn_etf_spot', 'cn': '每日ETF数据',\n                     'columns': {'date': {'type': DATE, 'cn': '日期', 'size': 0},\n                                 'code': {'type': VARCHAR(6, _COLLATE), 'cn': '代码', 'size': 60},\n                                 'name': {'type': VARCHAR(20, _COLLATE), 'cn': '名称', 'size': 120},\n                                 'new_price': {'type': FLOAT, 'cn': '最新价', 'size': 70},\n                                 'change_rate': {'type': FLOAT, 'cn': '涨跌幅', 'size': 70},\n                                 'ups_downs': {'type': FLOAT, 'cn': '涨跌额', 'size': 70},\n                                 'volume': {'type': BIGINT, 'cn': '成交量', 'size': 90},\n                                 'deal_amount': {'type': BIGINT, 'cn': '成交额', 'size': 100},\n                                 'open_price': {'type': FLOAT, 'cn': '开盘价', 'size': 70},\n                                 'high_price': {'type': FLOAT, 'cn': '最高价', 'size': 70},\n                                 'low_price': {'type': FLOAT, 'cn': '最低价', 'size': 70},\n                                 'pre_close_price': {'type': FLOAT, 'cn': '昨收', 'size': 70},\n                                 'turnoverrate': {'type': FLOAT, 'cn': '换手率', 'size': 70},\n                                 'total_market_cap': {'type': BIGINT, 'cn': '总市值', 'size': 120},\n                                 'free_cap': {'type': BIGINT, 'cn': '流通市值', 'size': 120}}}\n\nTABLE_CN_STOCK_SPOT = {'name': 'cn_stock_spot', 'cn': '每日股票数据',\n                       'columns': {'date': {'type': DATE, 'cn': '日期', 'size': 0},\n                                   'code': {'type': VARCHAR(6, _COLLATE), 'cn': '代码', 'size': 60},\n                                   'name': {'type': VARCHAR(20, _COLLATE), 'cn': '名称', 'size': 70},\n                                   'new_price': {'type': FLOAT, 'cn': '最新价', 'size': 70},\n                                   'change_rate': {'type': FLOAT, 'cn': '涨跌幅', 'size': 70},\n                                   'ups_downs': {'type': FLOAT, 'cn': '涨跌额', 'size': 70},\n                                   'volume': {'type': BIGINT, 'cn': '成交量', 'size': 90},\n                                   'deal_amount': {'type': BIGINT, 'cn': '成交额', 'size': 100},\n                                   'amplitude': {'type': FLOAT, 'cn': '振幅', 'size': 70},\n                                   'turnoverrate': {'type': FLOAT, 'cn': '换手率', 'size': 70},\n                                   'volume_ratio': {'type': FLOAT, 'cn': '量比', 'size': 70},\n                                   'open_price': {'type': FLOAT, 'cn': '今开', 'size': 70},\n                                   'high_price': {'type': FLOAT, 'cn': '最高', 'size': 70},\n                                   'low_price': {'type': FLOAT, 'cn': '最低', 'size': 70},\n                                   'pre_close_price': {'type': FLOAT, 'cn': '昨收', 'size': 70},\n                                   'speed_increase': {'type': FLOAT, 'cn': '涨速', 'size': 70},\n                                   'speed_increase_5': {'type': FLOAT, 'cn': '5分钟涨跌', 'size': 70},\n                                   'speed_increase_60': {'type': FLOAT, 'cn': '60日涨跌幅', 'size': 70},\n                                   'speed_increase_all': {'type': FLOAT, 'cn': '年初至今涨跌幅', 'size': 70},\n                                   'dtsyl': {'type': FLOAT, 'cn': '市盈率动', 'size': 70},\n                                   'pe9': {'type': FLOAT, 'cn': '市盈率TTM', 'size': 70},\n                                   'pe': {'type': FLOAT, 'cn': '市盈率静', 'size': 70},\n                                   'pbnewmrq': {'type': FLOAT, 'cn': '市净率', 'size': 70},\n                                   'basic_eps': {'type': FLOAT, 'cn': '每股收益', 'size': 70},\n                                   'bvps': {'type': FLOAT, 'cn': '每股净资产', 'size': 70},\n                                   'per_capital_reserve': {'type': FLOAT, 'cn': '每股公积金', 'size': 70},\n                                   'per_unassign_profit': {'type': FLOAT, 'cn': '每股未分配利润', 'size': 70},\n                                   'roe_weight': {'type': FLOAT, 'cn': '加权净资产收益率', 'size': 70},\n                                   'sale_gpr': {'type': FLOAT, 'cn': '毛利率', 'size': 70},\n                                   'debt_asset_ratio': {'type': FLOAT, 'cn': '资产负债率', 'size': 70},\n                                   'total_operate_income': {'type': BIGINT, 'cn': '营业收入', 'size': 120},\n                                   'toi_yoy_ratio': {'type': FLOAT, 'cn': '营业收入同比增长', 'size': 70},\n                                   'parent_netprofit': {'type': BIGINT, 'cn': '归属净利润', 'size': 110},\n                                   'netprofit_yoy_ratio': {'type': FLOAT, 'cn': '归属净利润同比增长', 'size': 70},\n                                   'report_date': {'type': DATE, 'cn': '报告期', 'size': 110},\n                                   'total_shares': {'type': BIGINT, 'cn': '总股本', 'size': 120},\n                                   'free_shares': {'type': BIGINT, 'cn': '已流通股份', 'size': 120},\n                                   'total_market_cap': {'type': BIGINT, 'cn': '总市值', 'size': 120},\n                                   'free_cap': {'type': BIGINT, 'cn': '流通市值', 'size': 120},\n                                   'industry': {'type': VARCHAR(20, _COLLATE), 'cn': '所处行业', 'size': 100},\n                                   'listing_date': {'type': DATE, 'cn': '上市时间', 'size': 110}}}\n\nTABLE_CN_STOCK_SPOT_BUY = {'name': 'cn_stock_spot_buy', 'cn': '基本面选股',\n                           'columns': TABLE_CN_STOCK_SPOT['columns'].copy()}\n\nCN_STOCK_FUND_FLOW = ({'name': 'stock_individual_fund_flow_rank', 'cn': '今日',\n                       'columns': {'code': {'type': VARCHAR(6, _COLLATE), 'cn': '代码', 'size': 60},\n                                   'name': {'type': VARCHAR(20, _COLLATE), 'cn': '名称', 'size': 70},\n                                   'new_price': {'type': FLOAT, 'cn': '最新价', 'size': 70},\n                                   'change_rate': {'type': FLOAT, 'cn': '今日涨跌幅', 'size': 70},\n                                   'fund_amount': {'type': BIGINT, 'cn': '今日主力净流入-净额', 'size': 100},\n                                   'fund_rate': {'type': FLOAT, 'cn': '今日主力净流入-净占比', 'size': 70},\n                                   'fund_amount_super': {'type': BIGINT, 'cn': '今日超大单净流入-净额', 'size': 100},\n                                   'fund_rate_super': {'type': FLOAT, 'cn': '今日超大单净流入-净占比', 'size': 70},\n                                   'fund_amount_large': {'type': BIGINT, 'cn': '今日大单净流入-净额', 'size': 100},\n                                   'fund_rate_large': {'type': FLOAT, 'cn': '今日大单净流入-净占比', 'size': 70},\n                                   'fund_amount_medium': {'type': BIGINT, 'cn': '今日中单净流入-净额', 'size': 100},\n                                   'fund_rate_medium': {'type': FLOAT, 'cn': '今日中单净流入-净占比', 'size': 70},\n                                   'fund_amount_small': {'type': BIGINT, 'cn': '今日小单净流入-净额', 'size': 100},\n                                   'fund_rate_small': {'type': FLOAT, 'cn': '今日小单净流入-净占比', 'size': 70}}},\n                      {'name': 'stock_individual_fund_flow_rank', 'cn': '3日',\n                       'columns': {'code': {'type': VARCHAR(6, _COLLATE), 'cn': '代码', 'size': 60},\n                                   'name': {'type': VARCHAR(20, _COLLATE), 'cn': '名称', 'size': 70},\n                                   'new_price': {'type': FLOAT, 'cn': '最新价', 'size': 70},\n                                   'change_rate_3': {'type': FLOAT, 'cn': '3日涨跌幅', 'size': 70},\n                                   'fund_amount_3': {'type': BIGINT, 'cn': '3日主力净流入-净额', 'size': 100},\n                                   'fund_rate_3': {'type': FLOAT, 'cn': '3日主力净流入-净占比', 'size': 70},\n                                   'fund_amount_super_3': {'type': BIGINT, 'cn': '3日超大单净流入-净额', 'size': 100},\n                                   'fund_rate_super_3': {'type': FLOAT, 'cn': '3日超大单净流入-净占比', 'size': 70},\n                                   'fund_amount_large_3': {'type': BIGINT, 'cn': '3日大单净流入-净额', 'size': 100},\n                                   'fund_rate_large_3': {'type': FLOAT, 'cn': '3日大单净流入-净占比', 'size': 70},\n                                   'fund_amount_medium_3': {'type': BIGINT, 'cn': '3日中单净流入-净额', 'size': 100},\n                                   'fund_rate_medium_3': {'type': FLOAT, 'cn': '3日中单净流入-净占比', 'size': 70},\n                                   'fund_amount_small_3': {'type': BIGINT, 'cn': '3日小单净流入-净额', 'size': 100},\n                                   'fund_rate_small_3': {'type': FLOAT, 'cn': '3日小单净流入-净占比', 'size': 70}}},\n                      {'name': 'stock_individual_fund_flow_rank', 'cn': '5日',\n                       'columns': {'code': {'type': VARCHAR(6, _COLLATE), 'cn': '代码', 'size': 60},\n                                   'name': {'type': VARCHAR(20, _COLLATE), 'cn': '名称', 'size': 70},\n                                   'new_price': {'type': FLOAT, 'cn': '最新价', 'size': 70},\n                                   'change_rate_5': {'type': FLOAT, 'cn': '5日涨跌幅', 'size': 70},\n                                   'fund_amount_5': {'type': BIGINT, 'cn': '5日主力净流入-净额', 'size': 100},\n                                   'fund_rate_5': {'type': FLOAT, 'cn': '5日主力净流入-净占比', 'size': 70},\n                                   'fund_amount_super_5': {'type': BIGINT, 'cn': '5日超大单净流入-净额', 'size': 100},\n                                   'fund_rate_super_5': {'type': FLOAT, 'cn': '5日超大单净流入-净占比', 'size': 70},\n                                   'fund_amount_large_5': {'type': BIGINT, 'cn': '5日大单净流入-净额', 'size': 100},\n                                   'fund_rate_large_5': {'type': FLOAT, 'cn': '5日大单净流入-净占比', 'size': 70},\n                                   'fund_amount_medium_5': {'type': BIGINT, 'cn': '5日中单净流入-净额', 'size': 100},\n                                   'fund_rate_medium_5': {'type': FLOAT, 'cn': '5日中单净流入-净占比', 'size': 70},\n                                   'fund_amount_small_5': {'type': BIGINT, 'cn': '5日小单净流入-净额', 'size': 100},\n                                   'fund_rate_small_5': {'type': FLOAT, 'cn': '5日小单净流入-净占比', 'size': 70}}},\n                      {'name': 'stock_individual_fund_flow_rank', 'cn': '10日',\n                       'columns': {'code': {'type': VARCHAR(6, _COLLATE), 'cn': '代码', 'size': 60},\n                                   'name': {'type': VARCHAR(20, _COLLATE), 'cn': '名称', 'size': 70},\n                                   'new_price': {'type': FLOAT, 'cn': '最新价', 'size': 70},\n                                   'change_rate_10': {'type': FLOAT, 'cn': '10日涨跌幅', 'size': 70},\n                                   'fund_amount_10': {'type': BIGINT, 'cn': '10日主力净流入-净额', 'size': 100},\n                                   'fund_rate_10': {'type': FLOAT, 'cn': '10日主力净流入-净占比', 'size': 70},\n                                   'fund_amount_super_10': {'type': BIGINT, 'cn': '10日超大单净流入-净额', 'size': 100},\n                                   'fund_rate_super_10': {'type': FLOAT, 'cn': '10日超大单净流入-净占比', 'size': 70},\n                                   'fund_amount_large_10': {'type': BIGINT, 'cn': '10日大单净流入-净额', 'size': 100},\n                                   'fund_rate_large_10': {'type': FLOAT, 'cn': '10日大单净流入-净占比', 'size': 70},\n                                   'fund_amount_medium_10': {'type': BIGINT, 'cn': '10日中单净流入-净额', 'size': 100},\n                                   'fund_rate_medium_10': {'type': FLOAT, 'cn': '10日中单净流入-净占比', 'size': 70},\n                                   'fund_amount_small_10': {'type': BIGINT, 'cn': '10日小单净流入-净额', 'size': 100},\n                                   'fund_rate_small_10': {'type': FLOAT, 'cn': '10日小单净流入-净占比', 'size': 70}}})\n\nTABLE_CN_STOCK_FUND_FLOW = {'name': 'cn_stock_fund_flow', 'cn': '股票资金流向',\n                            'columns': {'date': {'type': DATE, 'cn': '日期', 'size': 0}}}\nfor cf in CN_STOCK_FUND_FLOW:\n    TABLE_CN_STOCK_FUND_FLOW['columns'].update(cf['columns'].copy())\n\nCN_STOCK_SECTOR_FUND_FLOW = (('行业资金流', '概念资金流'),\n                             ({'name': 'stock_sector_fund_flow_rank', 'cn': '今日',\n                              'columns': {'name': {'type': VARCHAR(30, _COLLATE), 'cn': '名称', 'size': 70},\n                                          'change_rate': {'type': FLOAT, 'cn': '今日涨跌幅', 'size': 70},\n                                          'fund_amount': {'type': BIGINT, 'cn': '今日主力净流入-净额', 'size': 100},\n                                          'fund_rate': {'type': FLOAT, 'cn': '今日主力净流入-净占比', 'size': 70},\n                                          'fund_amount_super': {'type': BIGINT, 'cn': '今日超大单净流入-净额', 'size': 100},\n                                          'fund_rate_super': {'type': FLOAT, 'cn': '今日超大单净流入-净占比', 'size': 70},\n                                          'fund_amount_large': {'type': BIGINT, 'cn': '今日大单净流入-净额', 'size': 100},\n                                          'fund_rate_large': {'type': FLOAT, 'cn': '今日大单净流入-净占比', 'size': 70},\n                                          'fund_amount_medium': {'type': BIGINT, 'cn': '今日中单净流入-净额', 'size': 100},\n                                          'fund_rate_medium': {'type': FLOAT, 'cn': '今日中单净流入-净占比', 'size': 70},\n                                          'fund_amount_small': {'type': BIGINT, 'cn': '今日小单净流入-净额', 'size': 100},\n                                          'fund_rate_small': {'type': FLOAT, 'cn': '今日小单净流入-净占比', 'size': 70},\n                                          'stock_name': {'type': VARCHAR(20, _COLLATE), 'cn': '今日主力净流入最大股', 'size': 70}}},\n                             {'name': 'stock_individual_fund_flow_rank', 'cn': '5日',\n                              'columns': {'name': {'type': VARCHAR(20, _COLLATE), 'cn': '名称', 'size': 70},\n                                          'change_rate_5': {'type': FLOAT, 'cn': '5日涨跌幅', 'size': 70},\n                                          'fund_amount_5': {'type': BIGINT, 'cn': '5日主力净流入-净额', 'size': 100},\n                                          'fund_rate_5': {'type': FLOAT, 'cn': '5日主力净流入-净占比', 'size': 70},\n                                          'fund_amount_super_5': {'type': BIGINT, 'cn': '5日超大单净流入-净额', 'size': 100},\n                                          'fund_rate_super_5': {'type': FLOAT, 'cn': '5日超大单净流入-净占比', 'size': 70},\n                                          'fund_amount_large_5': {'type': BIGINT, 'cn': '5日大单净流入-净额', 'size': 100},\n                                          'fund_rate_large_5': {'type': FLOAT, 'cn': '5日大单净流入-净占比', 'size': 70},\n                                          'fund_amount_medium_5': {'type': BIGINT, 'cn': '5日中单净流入-净额', 'size': 100},\n                                          'fund_rate_medium_5': {'type': FLOAT, 'cn': '5日中单净流入-净占比', 'size': 70},\n                                          'fund_amount_small_5': {'type': BIGINT, 'cn': '5日小单净流入-净额', 'size': 100},\n                                          'fund_rate_small_5': {'type': FLOAT, 'cn': '5日小单净流入-净占比', 'size': 70},\n                                          'stock_name_5': {'type': VARCHAR(20, _COLLATE), 'cn': '5日主力净流入最大股', 'size': 70}}},\n                             {'name': 'stock_individual_fund_flow_rank', 'cn': '10日',\n                              'columns': {'name': {'type': VARCHAR(20, _COLLATE), 'cn': '名称', 'size': 70},\n                                          'change_rate_10': {'type': FLOAT, 'cn': '10日涨跌幅', 'size': 70},\n                                          'fund_amount_10': {'type': BIGINT, 'cn': '10日主力净流入-净额', 'size': 100},\n                                          'fund_rate_10': {'type': FLOAT, 'cn': '10日主力净流入-净占比', 'size': 70},\n                                          'fund_amount_super_10': {'type': BIGINT, 'cn': '10日超大单净流入-净额', 'size': 100},\n                                          'fund_rate_super_10': {'type': FLOAT, 'cn': '10日超大单净流入-净占比', 'size': 70},\n                                          'fund_amount_large_10': {'type': BIGINT, 'cn': '10日大单净流入-净额', 'size': 100},\n                                          'fund_rate_large_10': {'type': FLOAT, 'cn': '10日大单净流入-净占比', 'size': 70},\n                                          'fund_amount_medium_10': {'type': BIGINT, 'cn': '10日中单净流入-净额', 'size': 100},\n                                          'fund_rate_medium_10': {'type': FLOAT, 'cn': '10日中单净流入-净占比', 'size': 70},\n                                          'fund_amount_small_10': {'type': BIGINT, 'cn': '10日小单净流入-净额', 'size': 100},\n                                          'fund_rate_small_10': {'type': FLOAT, 'cn': '10日小单净流入-净占比', 'size': 70},\n                                          'stock_name_10': {'type': VARCHAR(20, _COLLATE), 'cn': '10日主力净流入最大股', 'size': 70}}}))\n\nTABLE_CN_STOCK_FUND_FLOW_INDUSTRY = {'name': 'cn_stock_fund_flow_industry', 'cn': '行业资金流向',\n                                     'columns': {'date': {'type': DATE, 'cn': '日期', 'size': 0}}}\nfor cf in CN_STOCK_SECTOR_FUND_FLOW[1]:\n    TABLE_CN_STOCK_FUND_FLOW_INDUSTRY['columns'].update(cf['columns'].copy())\n\nTABLE_CN_STOCK_FUND_FLOW_CONCEPT = {'name': 'cn_stock_fund_flow_concept', 'cn': '概念资金流向',\n                                    'columns': {'date': {'type': DATE, 'cn': '日期', 'size': 0}}}\nfor cf in CN_STOCK_SECTOR_FUND_FLOW[1]:\n    TABLE_CN_STOCK_FUND_FLOW_CONCEPT['columns'].update(cf['columns'].copy())\n\nTABLE_CN_STOCK_BONUS = {'name': 'cn_stock_bonus', 'cn': '股票分红配送',\n                        'columns': {'date': {'type': DATE, 'cn': '日期', 'size': 0},\n                                    'code': {'type': VARCHAR(6, _COLLATE), 'cn': '代码', 'size': 60},\n                                    'name': {'type': VARCHAR(20, _COLLATE), 'cn': '名称', 'size': 70},\n                                    'convertible_total_rate': {'type': FLOAT, 'cn': '送转股份-送转总比例', 'size': 70},\n                                    'convertible_rate': {'type': FLOAT, 'cn': '送转股份-送转比例', 'size': 70},\n                                    'convertible_transfer_rate': {'type': FLOAT, 'cn': '送转股份-转股比例', 'size': 70},\n                                    'bonusaward_rate': {'type': FLOAT, 'cn': '现金分红-现金分红比例', 'size': 70},\n                                    'bonusaward_yield': {'type': FLOAT, 'cn': '现金分红-股息率', 'size': 70},\n                                    'basic_eps': {'type': FLOAT, 'cn': '每股收益', 'size': 70},\n                                    'bvps': {'type': FLOAT, 'cn': '每股净资产', 'size': 70},\n                                    'per_capital_reserve': {'type': FLOAT, 'cn': '每股公积金', 'size': 70},\n                                    'per_unassign_profit': {'type': FLOAT, 'cn': '每股未分配利润', 'size': 70},\n                                    'netprofit_yoy_ratio': {'type': FLOAT, 'cn': '净利润同比增长', 'size': 70},\n                                    'total_shares': {'type': BIGINT, 'cn': '总股本', 'size': 120},\n                                    'plan_date': {'type': DATE, 'cn': '预案公告日', 'size': 110},\n                                    'record_date': {'type': DATE, 'cn': '股权登记日', 'size': 110},\n                                    'ex_dividend_date': {'type': DATE, 'cn': '除权除息日', 'size': 110},\n                                    'progress': {'type': VARCHAR(50, _COLLATE), 'cn': '方案进度', 'size': 100},\n                                    'report_date': {'type': DATE, 'cn': '最新公告日期', 'size': 110}}}\n\nTABLE_CN_STOCK_TOP = {'name': 'cn_stock_top', 'cn': '股票龙虎榜(新浪)',\n                      'columns': {'date': {'type': DATE, 'cn': '日期', 'size': 0},\n                                  'code': {'type': VARCHAR(6, _COLLATE), 'cn': '代码', 'size': 60},\n                                  'name': {'type': VARCHAR(20, _COLLATE), 'cn': '名称', 'size': 70},\n                                  'ranking_times': {'type': FLOAT, 'cn': '上榜次数', 'size': 70},\n                                  'sum_buy': {'type': FLOAT, 'cn': '累积购买额', 'size': 100},\n                                  'sum_sell': {'type': FLOAT, 'cn': '累积卖出额', 'size': 100},\n                                  'net_amount': {'type': FLOAT, 'cn': '净额', 'size': 100},\n                                  'buy_seat': {'type': FLOAT, 'cn': '买入席位数', 'size': 100},\n                                  'sell_seat': {'type': FLOAT, 'cn': '卖出席位数', 'size': 100}}}\n\nTABLE_CN_STOCK_lHB = {'name': 'cn_stock_lhb', 'cn': '股票龙虎榜',\n                      'columns': {'date': {'type': DATE, 'cn': '日期', 'size': 0},\n                                  'code': {'type': VARCHAR(6, _COLLATE), 'cn': '代码', 'size': 60},\n                                  'name': {'type': VARCHAR(20, _COLLATE), 'cn': '名称', 'size': 70},\n                                  'ranking_times': {'type': DATE, 'cn': '上榜日', 'size': 110},\n                                  'interpret': {'type': VARCHAR(255, _COLLATE), 'cn': '解读', 'size': 150},\n                                  'new_price': {'type': FLOAT, 'cn': '收盘价', 'size': 70},\n                                  'change_rate': {'type': FLOAT, 'cn': '涨跌幅', 'size': 70},\n                                  'net_amount_buy': {'type': FLOAT, 'cn': '龙虎榜净买额', 'size': 100},\n                                  'sum_buy': {'type': FLOAT, 'cn': '龙虎榜买入额', 'size': 100},\n                                  'sum_sell': {'type': FLOAT, 'cn': '龙虎榜卖出额', 'size': 100},\n                                  'lhb_amount': {'type': FLOAT, 'cn': '龙虎榜成交额', 'size': 100},\n                                  'market_amount': {'type': FLOAT, 'cn': '市场总成交额', 'size': 100},\n                                  'net_amount_rate': {'type': FLOAT, 'cn': '净买额占总成交比', 'size': 100},\n                                  'sum_rate': {'type': FLOAT, 'cn': '成交额占总成交比', 'size': 100},\n                                  'turnoverrate': {'type': FLOAT, 'cn': '换手率', 'size': 70},\n                                  'free_cap': {'type': BIGINT, 'cn': '流通市值', 'size': 120},\n                                  'reason': {'type': VARCHAR(2000, _COLLATE), 'cn': '上榜原因', 'size': 150},\n                                  'ranking_after_1': {'type': FLOAT, 'cn': '上榜后1日', 'size': 100},\n                                  'ranking_after_2': {'type': FLOAT, 'cn': '上榜后2日', 'size': 100},\n                                  'ranking_after_5': {'type': FLOAT, 'cn': '上榜后5日', 'size': 100},\n                                  'ranking_after_10': {'type': FLOAT, 'cn': '上榜后10日', 'size': 100}}}\n\nTABLE_CN_STOCK_BLOCKTRADE = {'name': 'cn_stock_blocktrade', 'cn': '股票大宗交易',\n                             'columns': {'date': {'type': DATE, 'cn': '日期', 'size': 0},\n                                         'code': {'type': VARCHAR(6, _COLLATE), 'cn': '代码', 'size': 60},\n                                         'name': {'type': VARCHAR(20, _COLLATE), 'cn': '名称', 'size': 70},\n                                         'new_price': {'type': FLOAT, 'cn': '收盘价', 'size': 70},\n                                         'change_rate': {'type': FLOAT, 'cn': '涨跌幅', 'size': 70},\n                                         'average_price': {'type': FLOAT, 'cn': '成交均价', 'size': 70},\n                                         'overflow_rate': {'type': FLOAT, 'cn': '折溢率', 'size': 120},\n                                         'trade_number': {'type': FLOAT, 'cn': '成交笔数', 'size': 70},\n                                         'sum_volume': {'type': FLOAT, 'cn': '成交总量', 'size': 100},\n                                         'sum_turnover': {'type': FLOAT, 'cn': '成交总额', 'size': 100},\n                                         'turnover_market_rate': {'type': FLOAT, 'cn': '成交占比流通市值',\n                                                                  'size': 120}}}\n\nCN_STOCK_HIST_DATA = {'name': 'fund_etf_hist_em', 'cn': '基金某时间段的日行情数据库',\n                      'columns': {'date': {'type': DATE, 'cn': '日期'},\n                                  'open': {'type': FLOAT, 'cn': '开盘'},\n                                  'close': {'type': FLOAT, 'cn': '收盘'},\n                                  'high': {'type': FLOAT, 'cn': '最高'},\n                                  'low': {'type': FLOAT, 'cn': '最低'},\n                                  'volume': {'type': FLOAT, 'cn': '成交量'},\n                                  'amount': {'type': FLOAT, 'cn': '成交额'},\n                                  'amplitude': {'type': FLOAT, 'cn': '振幅'},\n                                  'quote_change': {'type': FLOAT, 'cn': '涨跌幅'},\n                                  'ups_downs': {'type': FLOAT, 'cn': '涨跌额'},\n                                  'turnover': {'type': FLOAT, 'cn': '换手率'}}}\n\nTABLE_CN_STOCK_FOREIGN_KEY = {'name': 'cn_stock_foreign_key', 'cn': '股票外键',\n                              'columns': {'date': {'type': DATE, 'cn': '日期', 'size': 0},\n                                          'code': {'type': VARCHAR(6, _COLLATE), 'cn': '代码', 'size': 60},\n                                          'name': {'type': VARCHAR(20, _COLLATE), 'cn': '名称', 'size': 70}}}\n\nTABLE_CN_STOCK_BACKTEST_DATA = {'name': 'cn_stock_backtest_data', 'cn': '股票回归测试数据',\n                                'columns': {'rate_%s' % i: {'type': FLOAT, 'cn': '%s日收益率' % i, 'size': 100} for i in\n                                            range(1, RATE_FIELDS_COUNT + 1, 1)}}\n\nSTOCK_STATS_DATA = {'name': 'calculate_indicator', 'cn': '股票统计/指标计算助手库',\n                    'columns': {'close': {'type': FLOAT, 'cn': '价格', 'size': 0},\n                                'macd': {'type': FLOAT, 'cn': 'dif', 'size': 70},\n                                'macds': {'type': FLOAT, 'cn': 'macd', 'size': 70},\n                                'macdh': {'type': FLOAT, 'cn': 'histogram', 'size': 70},\n                                'kdjk': {'type': FLOAT, 'cn': 'kdjk', 'size': 70},\n                                'kdjd': {'type': FLOAT, 'cn': 'kdjd', 'size': 70},\n                                'kdjj': {'type': FLOAT, 'cn': 'kdjj', 'size': 70},\n                                'boll_ub': {'type': FLOAT, 'cn': 'boll上轨', 'size': 70},\n                                'boll': {'type': FLOAT, 'cn': 'boll', 'size': 70},\n                                'boll_lb': {'type': FLOAT, 'cn': 'boll下轨', 'size': 70},\n                                'trix': {'type': FLOAT, 'cn': 'trix', 'size': 70},\n                                'trix_20_sma': {'type': FLOAT, 'cn': 'trma', 'size': 70},\n                                'tema': {'type': FLOAT, 'cn': 'tema', 'size': 70},\n                                'cr': {'type': FLOAT, 'cn': 'cr', 'size': 70},\n                                'cr-ma1': {'type': FLOAT, 'cn': 'cr-ma1', 'size': 70},\n                                'cr-ma2': {'type': FLOAT, 'cn': 'cr-ma2', 'size': 70},\n                                'cr-ma3': {'type': FLOAT, 'cn': 'cr-ma3', 'size': 70},\n                                'rsi_6': {'type': FLOAT, 'cn': 'rsi_6', 'size': 70},\n                                'rsi_12': {'type': FLOAT, 'cn': 'rsi_12', 'size': 70},\n                                'rsi': {'type': FLOAT, 'cn': 'rsi', 'size': 70},\n                                'rsi_24': {'type': FLOAT, 'cn': 'rsi_24', 'size': 70},\n                                'vr': {'type': FLOAT, 'cn': 'vr', 'size': 70},\n                                'vr_6_sma': {'type': FLOAT, 'cn': 'mavr', 'size': 70},\n                                'roc': {'type': FLOAT, 'cn': 'roc', 'size': 70},\n                                'rocma': {'type': FLOAT, 'cn': 'rocma', 'size': 70},\n                                'rocema': {'type': FLOAT, 'cn': 'rocema', 'size': 70},\n                                'pdi': {'type': FLOAT, 'cn': 'pdi', 'size': 70},\n                                'mdi': {'type': FLOAT, 'cn': 'mdi', 'size': 70},\n                                'dx': {'type': FLOAT, 'cn': 'dx', 'size': 70},\n                                'adx': {'type': FLOAT, 'cn': 'adx', 'size': 70},\n                                'adxr': {'type': FLOAT, 'cn': 'adxr', 'size': 70},\n                                'wr_6': {'type': FLOAT, 'cn': 'wr_6', 'size': 70},\n                                'wr_10': {'type': FLOAT, 'cn': 'wr_10', 'size': 70},\n                                'wr_14': {'type': FLOAT, 'cn': 'wr_14', 'size': 70},\n                                'cci': {'type': FLOAT, 'cn': 'cci', 'size': 70},\n                                'cci_84': {'type': FLOAT, 'cn': 'cci_84', 'size': 70},\n                                'tr': {'type': FLOAT, 'cn': 'tr', 'size': 70},\n                                'atr': {'type': FLOAT, 'cn': 'atr', 'size': 70},\n                                'dma': {'type': FLOAT, 'cn': 'dma', 'size': 70},\n                                'dma_10_sma': {'type': FLOAT, 'cn': 'ama', 'size': 70},\n                                'obv': {'type': FLOAT, 'cn': 'obv', 'size': 70},\n                                'sar': {'type': FLOAT, 'cn': 'sar', 'size': 70},\n                                'psy': {'type': FLOAT, 'cn': 'psy', 'size': 70},\n                                'psyma': {'type': FLOAT, 'cn': 'psyma', 'size': 70},\n                                'br': {'type': FLOAT, 'cn': 'br', 'size': 70},\n                                'ar': {'type': FLOAT, 'cn': 'ar', 'size': 70},\n                                'emv': {'type': FLOAT, 'cn': 'emv', 'size': 70},\n                                'emva': {'type': FLOAT, 'cn': 'emva', 'size': 70},\n                                'bias': {'type': FLOAT, 'cn': 'bias', 'size': 70},\n                                'mfi': {'type': FLOAT, 'cn': 'mfi', 'size': 70},\n                                'mfisma': {'type': FLOAT, 'cn': 'mfisma', 'size': 70},\n                                'vwma': {'type': FLOAT, 'cn': 'vwma', 'size': 70},\n                                'mvwma': {'type': FLOAT, 'cn': 'mvwma', 'size': 70},\n                                'ppo': {'type': FLOAT, 'cn': 'ppo', 'size': 70},\n                                'ppos': {'type': FLOAT, 'cn': 'ppos', 'size': 70},\n                                'ppoh': {'type': FLOAT, 'cn': 'ppoh', 'size': 70},\n                                'wt1': {'type': FLOAT, 'cn': 'wt1', 'size': 70},\n                                'wt2': {'type': FLOAT, 'cn': 'wt2', 'size': 70},\n                                'supertrend_ub': {'type': FLOAT, 'cn': 'supertrend_ub', 'size': 70},\n                                'supertrend': {'type': FLOAT, 'cn': 'supertrend', 'size': 70},\n                                'supertrend_lb': {'type': FLOAT, 'cn': 'supertrend_lb', 'size': 70},\n                                'dpo': {'type': FLOAT, 'cn': 'dpo', 'size': 70},\n                                'madpo': {'type': FLOAT, 'cn': 'madpo', 'size': 70},\n                                'vhf': {'type': FLOAT, 'cn': 'vhf', 'size': 70},\n                                'rvi': {'type': FLOAT, 'cn': 'rvi', 'size': 70},\n                                'rvis': {'type': FLOAT, 'cn': 'rvis', 'size': 70},\n                                'fi': {'type': FLOAT, 'cn': 'fi', 'size': 70},\n                                'force_2': {'type': FLOAT, 'cn': 'force_2', 'size': 70},\n                                'force_13': {'type': FLOAT, 'cn': 'force_13', 'size': 70},\n                                'ene_ue': {'type': FLOAT, 'cn': 'ene上轨', 'size': 70},\n                                'ene': {'type': FLOAT, 'cn': 'ene', 'size': 70},\n                                'ene_le': {'type': FLOAT, 'cn': 'ene下轨', 'size': 70},\n                                'stochrsi_k': {'type': FLOAT, 'cn': 'stochrsi_k', 'size': 70},\n                                'stochrsi_d': {'type': FLOAT, 'cn': 'stochrsi_d', 'size': 70}}}\n\nTABLE_CN_STOCK_INDICATORS = {'name': 'cn_stock_indicators', 'cn': '股票指标数据',\n                             'columns': TABLE_CN_STOCK_FOREIGN_KEY['columns'].copy()}\nTABLE_CN_STOCK_INDICATORS['columns'].update(STOCK_STATS_DATA['columns'])\n\n_tmp_columns = TABLE_CN_STOCK_FOREIGN_KEY['columns'].copy()\n_tmp_columns.update(TABLE_CN_STOCK_BACKTEST_DATA['columns'])\n\nTABLE_CN_STOCK_INDICATORS_BUY = {'name': 'cn_stock_indicators_buy', 'cn': '股票指标买入',\n                                 'columns': _tmp_columns}\n\nTABLE_CN_STOCK_INDICATORS_SELL = {'name': 'cn_stock_indicators_sell', 'cn': '股票指标卖出',\n                                  'columns': _tmp_columns}\n\nTABLE_CN_STOCK_STRATEGIES = [\n    {'name': 'cn_stock_strategy_enter', 'cn': '放量上涨', 'size': 70, 'func': enter.check_volume,\n     'columns': _tmp_columns},\n    {'name': 'cn_stock_strategy_keep_increasing', 'cn': '均线多头', 'size': 70, 'func': keep_increasing.check,\n     'columns': _tmp_columns},\n    {'name': 'cn_stock_strategy_parking_apron', 'cn': '停机坪', 'size': 70, 'func': parking_apron.check,\n     'columns': _tmp_columns},\n    {'name': 'cn_stock_strategy_backtrace_ma250', 'cn': '回踩年线', 'size': 70, 'func': backtrace_ma250.check,\n     'columns': _tmp_columns},\n    {'name': 'cn_stock_strategy_breakthrough_platform', 'cn': '突破平台', 'size': 70,\n     'func': breakthrough_platform.check,\n     'columns': _tmp_columns},\n    {'name': 'cn_stock_strategy_low_backtrace_increase', 'cn': '无大幅回撤', 'size': 70,\n     'func': low_backtrace_increase.check,\n     'columns': _tmp_columns},\n    {'name': 'cn_stock_strategy_turtle_trade', 'cn': '海龟交易法则', 'size': 70, 'func': turtle_trade.check_enter,\n     'columns': _tmp_columns},\n    {'name': 'cn_stock_strategy_high_tight_flag', 'cn': '高而窄的旗形', 'size': 70,\n     'func': high_tight_flag.check_high_tight,\n     'columns': _tmp_columns},\n    {'name': 'cn_stock_strategy_climax_limitdown', 'cn': '放量跌停', 'size': 70, 'func': climax_limitdown.check,\n     'columns': _tmp_columns},\n    {'name': 'cn_stock_strategy_low_atr', 'cn': '低ATR成长', 'size': 70, 'func': low_atr.check_low_increase,\n     'columns': _tmp_columns}\n]\n\nSTOCK_KLINE_PATTERN_DATA = {'name': 'cn_stock_pattern_recognitions', 'cn': 'K线形态',\n                            'columns': {\n                                'tow_crows': {'type': SmallInteger, 'cn': '两只乌鸦', 'size': 70, 'func': tl.CDL2CROWS},\n                                'upside_gap_two_crows': {'type': SmallInteger, 'cn': '向上跳空的两只乌鸦', 'size': 70,\n                                                         'func': tl.CDLUPSIDEGAP2CROWS},\n                                'three_black_crows': {'type': SmallInteger, 'cn': '三只乌鸦', 'size': 70,\n                                                      'func': tl.CDL3BLACKCROWS},\n                                'identical_three_crows': {'type': SmallInteger, 'cn': '三胞胎乌鸦', 'size': 70,\n                                                          'func': tl.CDLIDENTICAL3CROWS},\n                                'three_line_strike': {'type': SmallInteger, 'cn': '三线打击', 'size': 70,\n                                                      'func': tl.CDL3LINESTRIKE},\n                                'dark_cloud_cover': {'type': SmallInteger, 'cn': '乌云压顶', 'size': 70,\n                                                     'func': tl.CDLDARKCLOUDCOVER},\n                                'evening_doji_star': {'type': SmallInteger, 'cn': '十字暮星', 'size': 70,\n                                                      'func': tl.CDLEVENINGDOJISTAR},\n                                'doji_Star': {'type': SmallInteger, 'cn': '十字星', 'size': 70, 'func': tl.CDLDOJISTAR},\n                                'hanging_man': {'type': SmallInteger, 'cn': '上吊线', 'size': 70,\n                                                'func': tl.CDLHANGINGMAN},\n                                'hikkake_pattern': {'type': SmallInteger, 'cn': '陷阱', 'size': 70,\n                                                    'func': tl.CDLHIKKAKE},\n                                'modified_hikkake_pattern': {'type': SmallInteger, 'cn': '修正陷阱', 'size': 70,\n                                                             'func': tl.CDLHIKKAKEMOD},\n                                'in_neck_pattern': {'type': SmallInteger, 'cn': '颈内线', 'size': 70,\n                                                    'func': tl.CDLINNECK},\n                                'on_neck_pattern': {'type': SmallInteger, 'cn': '颈上线', 'size': 70,\n                                                    'func': tl.CDLONNECK},\n                                'thrusting_pattern': {'type': SmallInteger, 'cn': '插入', 'size': 70,\n                                                      'func': tl.CDLTHRUSTING},\n                                'shooting_star': {'type': SmallInteger, 'cn': '射击之星', 'size': 70,\n                                                  'func': tl.CDLSHOOTINGSTAR},\n                                'stalled_pattern': {'type': SmallInteger, 'cn': '停顿形态', 'size': 70,\n                                                    'func': tl.CDLSTALLEDPATTERN},\n                                'advance_block': {'type': SmallInteger, 'cn': '大敌当前', 'size': 70,\n                                                  'func': tl.CDLADVANCEBLOCK},\n                                'high_wave_candle': {'type': SmallInteger, 'cn': '风高浪大线', 'size': 70,\n                                                     'func': tl.CDLHIGHWAVE},\n                                'engulfing_pattern': {'type': SmallInteger, 'cn': '吞噬模式', 'size': 70,\n                                                      'func': tl.CDLENGULFING},\n                                'abandoned_baby': {'type': SmallInteger, 'cn': '弃婴', 'size': 70,\n                                                   'func': tl.CDLABANDONEDBABY},\n                                'closing_marubozu': {'type': SmallInteger, 'cn': '收盘缺影线', 'size': 70,\n                                                     'func': tl.CDLCLOSINGMARUBOZU},\n                                'doji': {'type': SmallInteger, 'cn': '十字', 'size': 70, 'func': tl.CDLDOJI},\n                                'up_down_gap': {'type': SmallInteger, 'cn': '向上/下跳空并列阳线', 'size': 70,\n                                                'func': tl.CDLGAPSIDESIDEWHITE},\n                                'long_legged_doji': {'type': SmallInteger, 'cn': '长脚十字', 'size': 70,\n                                                     'func': tl.CDLLONGLEGGEDDOJI},\n                                'rickshaw_man': {'type': SmallInteger, 'cn': '黄包车夫', 'size': 70,\n                                                 'func': tl.CDLRICKSHAWMAN},\n                                'marubozu': {'type': SmallInteger, 'cn': '光头光脚/缺影线', 'size': 70,\n                                             'func': tl.CDLMARUBOZU},\n                                'three_inside_up_down': {'type': SmallInteger, 'cn': '三内部上涨和下跌', 'size': 70,\n                                                         'func': tl.CDL3INSIDE},\n                                'three_outside_up_down': {'type': SmallInteger, 'cn': '三外部上涨和下跌', 'size': 70,\n                                                          'func': tl.CDL3OUTSIDE},\n                                'three_stars_in_the_south': {'type': SmallInteger, 'cn': '南方三星', 'size': 70,\n                                                             'func': tl.CDL3STARSINSOUTH},\n                                'three_white_soldiers': {'type': SmallInteger, 'cn': '三个白兵', 'size': 70,\n                                                         'func': tl.CDL3WHITESOLDIERS},\n                                'belt_hold': {'type': SmallInteger, 'cn': '捉腰带线', 'size': 70,\n                                              'func': tl.CDLBELTHOLD},\n                                'breakaway': {'type': SmallInteger, 'cn': '脱离', 'size': 70, 'func': tl.CDLBREAKAWAY},\n                                'concealing_baby_swallow': {'type': SmallInteger, 'cn': '藏婴吞没', 'size': 70,\n                                                            'func': tl.CDLCONCEALBABYSWALL},\n                                'counterattack': {'type': SmallInteger, 'cn': '反击线', 'size': 70,\n                                                  'func': tl.CDLCOUNTERATTACK},\n                                'dragonfly_doji': {'type': SmallInteger, 'cn': '蜻蜓十字/T形十字', 'size': 70,\n                                                   'func': tl.CDLDRAGONFLYDOJI},\n                                'evening_star': {'type': SmallInteger, 'cn': '暮星', 'size': 70,\n                                                 'func': tl.CDLEVENINGSTAR},\n                                'gravestone_doji': {'type': SmallInteger, 'cn': '墓碑十字/倒T十字', 'size': 70,\n                                                    'func': tl.CDLGRAVESTONEDOJI},\n                                'hammer': {'type': SmallInteger, 'cn': '锤头', 'size': 70, 'func': tl.CDLHAMMER},\n                                'harami_pattern': {'type': SmallInteger, 'cn': '母子线', 'size': 70,\n                                                   'func': tl.CDLHARAMI},\n                                'harami_cross_pattern': {'type': SmallInteger, 'cn': '十字孕线', 'size': 70,\n                                                         'func': tl.CDLHARAMICROSS},\n                                'homing_pigeon': {'type': SmallInteger, 'cn': '家鸽', 'size': 70,\n                                                  'func': tl.CDLHOMINGPIGEON},\n                                'inverted_hammer': {'type': SmallInteger, 'cn': '倒锤头', 'size': 70,\n                                                    'func': tl.CDLINVERTEDHAMMER},\n                                'kicking': {'type': SmallInteger, 'cn': '反冲形态', 'size': 70, 'func': tl.CDLKICKING},\n                                'kicking_bull_bear': {'type': SmallInteger, 'cn': '由较长缺影线决定的反冲形态',\n                                                      'size': 70,\n                                                      'func': tl.CDLKICKINGBYLENGTH},\n                                'ladder_bottom': {'type': SmallInteger, 'cn': '梯底', 'size': 70,\n                                                  'func': tl.CDLLADDERBOTTOM},\n                                'long_line_candle': {'type': SmallInteger, 'cn': '长蜡烛', 'size': 70,\n                                                     'func': tl.CDLLONGLINE},\n                                'matching_low': {'type': SmallInteger, 'cn': '相同低价', 'size': 70,\n                                                 'func': tl.CDLMATCHINGLOW},\n                                'mat_hold': {'type': SmallInteger, 'cn': '铺垫', 'size': 70, 'func': tl.CDLMATHOLD},\n                                'morning_doji_star': {'type': SmallInteger, 'cn': '十字晨星', 'size': 70,\n                                                      'func': tl.CDLMORNINGDOJISTAR},\n                                'morning_star': {'type': SmallInteger, 'cn': '晨星', 'size': 70,\n                                                 'func': tl.CDLMORNINGSTAR},\n                                'piercing_pattern': {'type': SmallInteger, 'cn': '刺透形态', 'size': 70,\n                                                     'func': tl.CDLPIERCING},\n                                'rising_falling_three': {'type': SmallInteger, 'cn': '上升/下降三法', 'size': 70,\n                                                         'func': tl.CDLRISEFALL3METHODS},\n                                'separating_lines': {'type': SmallInteger, 'cn': '分离线', 'size': 70,\n                                                     'func': tl.CDLSEPARATINGLINES},\n                                'short_line_candle': {'type': SmallInteger, 'cn': '短蜡烛', 'size': 70,\n                                                      'func': tl.CDLSHORTLINE},\n                                'spinning_top': {'type': SmallInteger, 'cn': '纺锤', 'size': 70,\n                                                 'func': tl.CDLSPINNINGTOP},\n                                'stick_sandwich': {'type': SmallInteger, 'cn': '条形三明治', 'size': 70,\n                                                   'func': tl.CDLSTICKSANDWICH},\n                                'takuri': {'type': SmallInteger, 'cn': '探水竿', 'size': 70, 'func': tl.CDLTAKURI},\n                                'tasuki_gap': {'type': SmallInteger, 'cn': '跳空并列阴阳线', 'size': 70,\n                                               'func': tl.CDLTASUKIGAP},\n                                'tristar_pattern': {'type': SmallInteger, 'cn': '三星', 'size': 70,\n                                                    'func': tl.CDLTRISTAR},\n                                'unique_3_river': {'type': SmallInteger, 'cn': '奇特三河床', 'size': 70,\n                                                   'func': tl.CDLUNIQUE3RIVER},\n                                'upside_downside_gap': {'type': SmallInteger, 'cn': '上升/下降跳空三法', 'size': 70,\n                                                        'func': tl.CDLXSIDEGAP3METHODS}}}\n\nTABLE_CN_STOCK_KLINE_PATTERN = {'name': 'cn_stock_pattern', 'cn': '股票K线形态',\n                                'columns': TABLE_CN_STOCK_FOREIGN_KEY['columns'].copy()}\nTABLE_CN_STOCK_KLINE_PATTERN['columns'].update(STOCK_KLINE_PATTERN_DATA['columns'])\n\nTABLE_CN_STOCK_SELECTION = {'name': 'cn_stock_selection', 'cn': '综合选股',\n                            'columns': {'date': {'type': DATE, 'cn': '日期', 'size': 0, 'map': 'MAX_TRADE_DATE'},\n                                        'code': {'type': VARCHAR(6, _COLLATE), 'cn': '代码', 'size': 60,\n                                                 'map': 'SECURITY_CODE'},\n                                        'name': {'type': VARCHAR(20, _COLLATE), 'cn': '名称', 'size': 70,\n                                                 'map': 'SECURITY_NAME_ABBR'},\n                                        'new_price': {'type': FLOAT, 'cn': '最新价', 'size': 70, 'map': 'NEW_PRICE'},\n                                        'change_rate': {'type': FLOAT, 'cn': '涨跌幅', 'size': 70,\n                                                        'map': 'CHANGE_RATE'},\n                                        'volume_ratio': {'type': FLOAT, 'cn': '量比', 'size': 70,\n                                                         'map': 'VOLUME_RATIO'},\n                                        'high_price': {'type': FLOAT, 'cn': '最高价', 'size': 70, 'map': 'HIGH_PRICE'},\n                                        'low_price': {'type': FLOAT, 'cn': '最低价', 'size': 70, 'map': 'LOW_PRICE'},\n                                        'pre_close_price': {'type': FLOAT, 'cn': '昨收价', 'size': 70,\n                                                            'map': 'PRE_CLOSE_PRICE'},\n                                        'volume': {'type': BIGINT, 'cn': '成交量', 'size': 90, 'map': 'VOLUME'},\n                                        'deal_amount': {'type': BIGINT, 'cn': '成交额', 'size': 100,\n                                                        'map': 'DEAL_AMOUNT'},\n                                        'turnoverrate': {'type': FLOAT, 'cn': '换手率', 'size': 70,\n                                                         'map': 'TURNOVERRATE'},\n                                        'listing_date': {'type': DATE, 'cn': '上市时间', 'size': 110,\n                                                         'map': 'LISTING_DATE'},\n                                        'industry': {'type': VARCHAR(50, _COLLATE), 'cn': '行业', 'size': 100,\n                                                     'map': 'INDUSTRY'},\n                                        'area': {'type': VARCHAR(50, _COLLATE), 'cn': '地区', 'size': 70, 'map': 'AREA'},\n                                        'concept': {'type': VARCHAR(800, _COLLATE), 'cn': '概念', 'size': 150,\n                                                    'map': 'CONCEPT'},\n                                        'style': {'type': VARCHAR(255, _COLLATE), 'cn': '板块', 'size': 150,\n                                                  'map': 'STYLE'},\n                                        'is_hs300': {'type': VARCHAR(2, _COLLATE), 'cn': '沪300', 'size': 0,\n                                                     'map': 'IS_HS300'},\n                                        'is_sz50': {'type': VARCHAR(2, _COLLATE), 'cn': '上证50', 'size': 0,\n                                                    'map': 'IS_SZ50'},\n                                        'is_zz500': {'type': VARCHAR(2, _COLLATE), 'cn': '中证500', 'size': 0,\n                                                     'map': 'IS_ZZ500'},\n                                        'is_zz1000': {'type': VARCHAR(2, _COLLATE), 'cn': '中证1000', 'size': 0,\n                                                      'map': 'IS_ZZ1000'},\n                                        'is_cy50': {'type': VARCHAR(2, _COLLATE), 'cn': '创业板50', 'size': 0,\n                                                    'map': 'IS_CY50'},\n                                        'pe9': {'type': FLOAT, 'cn': '市盈率TTM', 'size': 70, 'map': 'PE9'},\n                                        'pbnewmrq': {'type': FLOAT, 'cn': '市净率MRQ', 'size': 70, 'map': 'PBNEWMRQ'},\n                                        'pettmdeducted': {'type': FLOAT, 'cn': '市盈率TTM扣非', 'size': 70,\n                                                          'map': 'PETTMDEDUCTED'},\n                                        'ps9': {'type': FLOAT, 'cn': '市销率TTM', 'size': 70, 'map': 'PS9'},\n                                        'pcfjyxjl9': {'type': FLOAT, 'cn': '市现率TTM', 'size': 70, 'map': 'PCFJYXJL9'},\n                                        'predict_pe_syear': {'type': FLOAT, 'cn': '预测市盈率今年', 'size': 70,\n                                                             'map': 'PREDICT_PE_SYEAR'},\n                                        'predict_pe_nyear': {'type': FLOAT, 'cn': '预测市盈率明年', 'size': 70,\n                                                             'map': 'PREDICT_PE_NYEAR'},\n                                        'total_market_cap': {'type': BIGINT, 'cn': '总市值', 'size': 120,\n                                                             'map': 'TOTAL_MARKET_CAP'},\n                                        'free_cap': {'type': BIGINT, 'cn': '流通市值', 'size': 120, 'map': 'FREE_CAP'},\n                                        'dtsyl': {'type': FLOAT, 'cn': '动态市盈率', 'size': 70, 'map': 'DTSYL'},\n                                        'ycpeg': {'type': FLOAT, 'cn': '预测PEG', 'size': 70, 'map': 'YCPEG'},\n                                        'enterprise_value_multiple': {'type': FLOAT, 'cn': '企业价值倍数', 'size': 70,\n                                                                      'map': 'ENTERPRISE_VALUE_MULTIPLE'},\n                                        'basic_eps': {'type': FLOAT, 'cn': '每股收益', 'size': 70, 'map': 'BASIC_EPS'},\n                                        'bvps': {'type': FLOAT, 'cn': '每股净资产', 'size': 70, 'map': 'BVPS'},\n                                        'per_netcash_operate': {'type': FLOAT, 'cn': '每股经营现金流', 'size': 70,\n                                                                'map': 'PER_NETCASH_OPERATE'},\n                                        'per_fcfe': {'type': FLOAT, 'cn': '每股自由现金流', 'size': 70,\n                                                     'map': 'PER_FCFE'},\n                                        'per_capital_reserve': {'type': FLOAT, 'cn': '每股资本公积', 'size': 70,\n                                                                'map': 'PER_CAPITAL_RESERVE'},\n                                        'per_unassign_profit': {'type': FLOAT, 'cn': '每股未分配利润', 'size': 70,\n                                                                'map': 'PER_UNASSIGN_PROFIT'},\n                                        'per_surplus_reserve': {'type': FLOAT, 'cn': '每股盈余公积', 'size': 70,\n                                                                'map': 'PER_SURPLUS_RESERVE'},\n                                        'per_retained_earning': {'type': FLOAT, 'cn': '每股留存收益', 'size': 70,\n                                                                 'map': 'PER_RETAINED_EARNING'},\n                                        'parent_netprofit': {'type': BIGINT, 'cn': '归属净利润', 'size': 110,\n                                                             'map': 'PARENT_NETPROFIT'},\n                                        'deduct_netprofit': {'type': BIGINT, 'cn': '扣非净利润', 'size': 110,\n                                                             'map': 'DEDUCT_NETPROFIT'},\n                                        'total_operate_income': {'type': BIGINT, 'cn': '营业总收入', 'size': 120,\n                                                                 'map': 'TOTAL_OPERATE_INCOME'},\n                                        'roe_weight': {'type': FLOAT, 'cn': '净资产收益率ROE', 'size': 70,\n                                                       'map': 'ROE_WEIGHT'},\n                                        'jroa': {'type': FLOAT, 'cn': '总资产净利率ROA', 'size': 70, 'map': 'JROA'},\n                                        'roic': {'type': FLOAT, 'cn': '投入资本回报率ROIC', 'size': 70, 'map': 'ROIC'},\n                                        'zxgxl': {'type': FLOAT, 'cn': '最新股息率', 'size': 70, 'map': 'ZXGXL'},\n                                        'sale_gpr': {'type': FLOAT, 'cn': '毛利率', 'size': 70, 'map': 'SALE_GPR'},\n                                        'sale_npr': {'type': FLOAT, 'cn': '净利率', 'size': 70, 'map': 'SALE_NPR'},\n                                        'netprofit_yoy_ratio': {'type': FLOAT, 'cn': '净利润增长率', 'size': 70,\n                                                                'map': 'NETPROFIT_YOY_RATIO'},\n                                        'deduct_netprofit_growthrate': {'type': FLOAT, 'cn': '扣非净利润增长率',\n                                                                        'size': 70,\n                                                                        'map': 'DEDUCT_NETPROFIT_GROWTHRATE'},\n                                        'toi_yoy_ratio': {'type': FLOAT, 'cn': '营收增长率', 'size': 70,\n                                                          'map': 'TOI_YOY_RATIO'},\n                                        'netprofit_growthrate_3y': {'type': FLOAT, 'cn': '净利润3年复合增长率',\n                                                                    'size': 70,\n                                                                    'map': 'NETPROFIT_GROWTHRATE_3Y'},\n                                        'income_growthrate_3y': {'type': FLOAT, 'cn': '营收3年复合增长率', 'size': 70,\n                                                                 'map': 'INCOME_GROWTHRATE_3Y'},\n                                        'predict_netprofit_ratio': {'type': FLOAT, 'cn': '预测净利润同比增长',\n                                                                    'size': 70,\n                                                                    'map': 'PREDICT_NETPROFIT_RATIO'},\n                                        'predict_income_ratio': {'type': FLOAT, 'cn': '预测营收同比增长', 'size': 70,\n                                                                 'map': 'PREDICT_INCOME_RATIO'},\n                                        'basiceps_yoy_ratio': {'type': FLOAT, 'cn': '每股收益同比增长率', 'size': 70,\n                                                               'map': 'BASICEPS_YOY_RATIO'},\n                                        'total_profit_growthrate': {'type': FLOAT, 'cn': '利润总额同比增长率',\n                                                                    'size': 70,\n                                                                    'map': 'TOTAL_PROFIT_GROWTHRATE'},\n                                        'operate_profit_growthrate': {'type': FLOAT, 'cn': '营业利润同比增长率',\n                                                                      'size': 70,\n                                                                      'map': 'OPERATE_PROFIT_GROWTHRATE'},\n                                        'debt_asset_ratio': {'type': FLOAT, 'cn': '资产负债率', 'size': 70,\n                                                             'map': 'DEBT_ASSET_RATIO'},\n                                        'equity_ratio': {'type': FLOAT, 'cn': '产权比率', 'size': 70,\n                                                         'map': 'EQUITY_RATIO'},\n                                        'equity_multiplier': {'type': FLOAT, 'cn': '权益乘数', 'size': 70,\n                                                              'map': 'EQUITY_MULTIPLIER'},\n                                        'current_ratio': {'type': FLOAT, 'cn': '流动比率', 'size': 70,\n                                                          'map': 'CURRENT_RATIO'},\n                                        'speed_ratio': {'type': FLOAT, 'cn': '速动比率', 'size': 70,\n                                                        'map': 'SPEED_RATIO'},\n                                        'total_shares': {'type': BIGINT, 'cn': '总股本', 'size': 120,\n                                                         'map': 'TOTAL_SHARES'},\n                                        'free_shares': {'type': BIGINT, 'cn': '流通股本', 'size': 120,\n                                                        'map': 'FREE_SHARES'},\n                                        'holder_newest': {'type': BIGINT, 'cn': '最新股东户数', 'size': 80,\n                                                          'map': 'HOLDER_NEWEST'},\n                                        'holder_ratio': {'type': FLOAT, 'cn': '股东户数增长率', 'size': 70,\n                                                         'map': 'HOLDER_RATIO'},\n                                        'hold_amount': {'type': FLOAT, 'cn': '户均持股金额', 'size': 80,\n                                                        'map': 'HOLD_AMOUNT'},\n                                        'avg_hold_num': {'type': FLOAT, 'cn': '户均持股数量', 'size': 70,\n                                                         'map': 'AVG_HOLD_NUM'},\n                                        'holdnum_growthrate_3q': {'type': FLOAT, 'cn': '户均持股数季度增长率',\n                                                                  'size': 70,\n                                                                  'map': 'HOLDNUM_GROWTHRATE_3Q'},\n                                        'holdnum_growthrate_hy': {'type': FLOAT, 'cn': '户均持股数半年增长率',\n                                                                  'size': 70,\n                                                                  'map': 'HOLDNUM_GROWTHRATE_HY'},\n                                        'hold_ratio_count': {'type': FLOAT, 'cn': '十大股东持股比例合计', 'size': 70,\n                                                             'map': 'HOLD_RATIO_COUNT'},\n                                        'free_hold_ratio': {'type': FLOAT, 'cn': '十大流通股东比例合计', 'size': 70,\n                                                            'map': 'FREE_HOLD_RATIO'},\n                                        'macd_golden_fork': {'type': BIT, 'cn': 'MACD金叉日线', 'size': 70,\n                                                             'map': 'MACD_GOLDEN_FORK'},\n                                        'macd_golden_forkz': {'type': BIT, 'cn': 'MACD金叉周线', 'size': 70,\n                                                              'map': 'MACD_GOLDEN_FORKZ'},\n                                        'macd_golden_forky': {'type': BIT, 'cn': 'MACD金叉月线', 'size': 70,\n                                                              'map': 'MACD_GOLDEN_FORKY'},\n                                        'kdj_golden_fork': {'type': BIT, 'cn': 'KDJ金叉日线', 'size': 70,\n                                                            'map': 'KDJ_GOLDEN_FORK'},\n                                        'kdj_golden_forkz': {'type': BIT, 'cn': 'KDJ金叉周线', 'size': 70,\n                                                             'map': 'KDJ_GOLDEN_FORKZ'},\n                                        'kdj_golden_forky': {'type': BIT, 'cn': 'KDJ金叉月线', 'size': 70,\n                                                             'map': 'KDJ_GOLDEN_FORKY'},\n                                        'break_through': {'type': BIT, 'cn': '放量突破', 'size': 70,\n                                                          'map': 'BREAK_THROUGH'},\n                                        'low_funds_inflow': {'type': BIT, 'cn': '低位资金净流入', 'size': 70,\n                                                             'map': 'LOW_FUNDS_INFLOW'},\n                                        'high_funds_outflow': {'type': BIT, 'cn': '高位资金净流出', 'size': 70,\n                                                               'map': 'HIGH_FUNDS_OUTFLOW'},\n                                        'breakup_ma_5days': {'type': BIT, 'cn': '向上突破均线5日', 'size': 70,\n                                                             'map': 'BREAKUP_MA_5DAYS'},\n                                        'breakup_ma_10days': {'type': BIT, 'cn': '向上突破均线10日', 'size': 70,\n                                                              'map': 'BREAKUP_MA_10DAYS'},\n                                        'breakup_ma_20days': {'type': BIT, 'cn': '向上突破均线20日', 'size': 70,\n                                                              'map': 'BREAKUP_MA_20DAYS'},\n                                        'breakup_ma_30days': {'type': BIT, 'cn': '向上突破均线30日', 'size': 70,\n                                                              'map': 'BREAKUP_MA_30DAYS'},\n                                        'breakup_ma_60days': {'type': BIT, 'cn': '向上突破均线60日', 'size': 70,\n                                                              'map': 'BREAKUP_MA_60DAYS'},\n                                        'long_avg_array': {'type': BIT, 'cn': '均线多头排列', 'size': 70,\n                                                           'map': 'LONG_AVG_ARRAY'},\n                                        'short_avg_array': {'type': BIT, 'cn': '均线空头排列', 'size': 70,\n                                                            'map': 'SHORT_AVG_ARRAY'},\n                                        'upper_large_volume': {'type': BIT, 'cn': '连涨放量', 'size': 70,\n                                                               'map': 'UPPER_LARGE_VOLUME'},\n                                        'down_narrow_volume': {'type': BIT, 'cn': '下跌无量', 'size': 70,\n                                                               'map': 'DOWN_NARROW_VOLUME'},\n                                        'one_dayang_line': {'type': BIT, 'cn': '一根大阳线', 'size': 70,\n                                                            'map': 'ONE_DAYANG_LINE'},\n                                        'two_dayang_lines': {'type': BIT, 'cn': '两根大阳线', 'size': 70,\n                                                             'map': 'TWO_DAYANG_LINES'},\n                                        'rise_sun': {'type': BIT, 'cn': '旭日东升', 'size': 70, 'map': 'RISE_SUN'},\n                                        'power_fulgun': {'type': BIT, 'cn': '强势多方炮', 'size': 70,\n                                                         'map': 'POWER_FULGUN'},\n                                        'restore_justice': {'type': BIT, 'cn': '拨云见日', 'size': 70,\n                                                            'map': 'RESTORE_JUSTICE'},\n                                        'down_7days': {'type': BIT, 'cn': '七仙女下凡(七连阴)', 'size': 70,\n                                                       'map': 'DOWN_7DAYS'},\n                                        'upper_8days': {'type': BIT, 'cn': '八仙过海(八连阳)', 'size': 70,\n                                                        'map': 'UPPER_8DAYS'},\n                                        'upper_9days': {'type': BIT, 'cn': '九阳神功(九连阳)', 'size': 70,\n                                                        'map': 'UPPER_9DAYS'},\n                                        'upper_4days': {'type': BIT, 'cn': '四串阳', 'size': 70, 'map': 'UPPER_4DAYS'},\n                                        'heaven_rule': {'type': BIT, 'cn': '天量法则', 'size': 70,\n                                                        'map': 'HEAVEN_RULE'},\n                                        'upside_volume': {'type': BIT, 'cn': '放量上攻', 'size': 70,\n                                                          'map': 'UPSIDE_VOLUME'},\n                                        'bearish_engulfing': {'type': BIT, 'cn': '穿头破脚', 'size': 70,\n                                                              'map': 'BEARISH_ENGULFING'},\n                                        'reversing_hammer': {'type': BIT, 'cn': '倒转锤头', 'size': 70,\n                                                             'map': 'REVERSING_HAMMER'},\n                                        'shooting_star': {'type': BIT, 'cn': '射击之星', 'size': 70,\n                                                          'map': 'SHOOTING_STAR'},\n                                        'evening_star': {'type': BIT, 'cn': '黄昏之星', 'size': 70,\n                                                         'map': 'EVENING_STAR'},\n                                        'first_dawn': {'type': BIT, 'cn': '曙光初现', 'size': 70, 'map': 'FIRST_DAWN'},\n                                        'pregnant': {'type': BIT, 'cn': '身怀六甲', 'size': 70, 'map': 'PREGNANT'},\n                                        'black_cloud_tops': {'type': BIT, 'cn': '乌云盖顶', 'size': 70,\n                                                             'map': 'BLACK_CLOUD_TOPS'},\n                                        'morning_star': {'type': BIT, 'cn': '早晨之星', 'size': 70,\n                                                         'map': 'MORNING_STAR'},\n                                        'narrow_finish': {'type': BIT, 'cn': '窄幅整理', 'size': 70,\n                                                          'map': 'NARROW_FINISH'},\n                                        'limited_lift_f6m': {'type': BIT, 'cn': '限售解禁未来半年', 'size': 70,\n                                                             'map': 'LIMITED_LIFT_F6M'},\n                                        'limited_lift_f1y': {'type': BIT, 'cn': '限售解禁未来1年', 'size': 70,\n                                                             'map': 'LIMITED_LIFT_F1Y'},\n                                        'limited_lift_6m': {'type': BIT, 'cn': '限售解禁近半年', 'size': 70,\n                                                            'map': 'LIMITED_LIFT_6M'},\n                                        'limited_lift_1y': {'type': BIT, 'cn': '限售解禁近1年', 'size': 70,\n                                                            'map': 'LIMITED_LIFT_1Y'},\n                                        'directional_seo_1m': {'type': BIT, 'cn': '定向增发近1个月', 'size': 70,\n                                                               'map': 'DIRECTIONAL_SEO_1M'},\n                                        'directional_seo_3m': {'type': BIT, 'cn': '定向增发近3个月', 'size': 70,\n                                                               'map': 'DIRECTIONAL_SEO_3M'},\n                                        'directional_seo_6m': {'type': BIT, 'cn': '定向增发近6个月', 'size': 70,\n                                                               'map': 'DIRECTIONAL_SEO_6M'},\n                                        'directional_seo_1y': {'type': BIT, 'cn': '定向增发近1年', 'size': 70,\n                                                               'map': 'DIRECTIONAL_SEO_1Y'},\n                                        'recapitalize_1m': {'type': BIT, 'cn': '资产重组近1个月', 'size': 70,\n                                                            'map': 'RECAPITALIZE_1M'},\n                                        'recapitalize_3m': {'type': BIT, 'cn': '资产重组近3个月', 'size': 70,\n                                                            'map': 'RECAPITALIZE_3M'},\n                                        'recapitalize_6m': {'type': BIT, 'cn': '资产重组近6个月', 'size': 70,\n                                                            'map': 'RECAPITALIZE_6M'},\n                                        'recapitalize_1y': {'type': BIT, 'cn': '资产重组近1年', 'size': 70,\n                                                            'map': 'RECAPITALIZE_1Y'},\n                                        'equity_pledge_1m': {'type': BIT, 'cn': '股权质押近1个月', 'size': 70,\n                                                             'map': 'EQUITY_PLEDGE_1M'},\n                                        'equity_pledge_3m': {'type': BIT, 'cn': '股权质押近3个月', 'size': 70,\n                                                             'map': 'EQUITY_PLEDGE_3M'},\n                                        'equity_pledge_6m': {'type': BIT, 'cn': '股权质押近6个月', 'size': 70,\n                                                             'map': 'EQUITY_PLEDGE_6M'},\n                                        'equity_pledge_1y': {'type': BIT, 'cn': '股权质押近1年', 'size': 70,\n                                                             'map': 'EQUITY_PLEDGE_1Y'},\n                                        'pledge_ratio': {'type': FLOAT, 'cn': '质押比例', 'size': 70,\n                                                         'map': 'PLEDGE_RATIO'},\n                                        'goodwill_scale': {'type': BIGINT, 'cn': '商誉规模', 'size': 110,\n                                                           'map': 'GOODWILL_SCALE'},\n                                        'goodwill_assets_ratro': {'type': FLOAT, 'cn': '商誉占净资产比例', 'size': 70,\n                                                                  'map': 'GOODWILL_ASSETS_RATRO'},\n                                        'predict_type': {'type': VARCHAR(10, _COLLATE), 'cn': '业绩预告', 'size': 70,\n                                                         'map': 'PREDICT_TYPE'},\n                                        'par_dividend_pretax': {'type': FLOAT, 'cn': '每股股利税前', 'size': 70,\n                                                                'map': 'PAR_DIVIDEND_PRETAX'},\n                                        'par_dividend': {'type': FLOAT, 'cn': '每股红股', 'size': 70,\n                                                         'map': 'PAR_DIVIDEND'},\n                                        'par_it_equity': {'type': FLOAT, 'cn': '每股转增股本', 'size': 70,\n                                                          'map': 'PAR_IT_EQUITY'},\n                                        'holder_change_3m': {'type': FLOAT, 'cn': '近3月股东增减比例', 'size': 70,\n                                                             'map': 'HOLDER_CHANGE_3M'},\n                                        'executive_change_3m': {'type': FLOAT, 'cn': '近3月高管增减比例', 'size': 70,\n                                                                'map': 'EXECUTIVE_CHANGE_3M'},\n                                        'org_survey_3m': {'type': SmallInteger, 'cn': '近3月机构调研', 'size': 70,\n                                                          'map': 'ORG_SURVEY_3M'},\n                                        'org_rating': {'type': VARCHAR(10, _COLLATE), 'cn': '机构评级', 'size': 70,\n                                                       'map': 'ORG_RATING'},\n                                        'allcorp_num': {'type': SmallInteger, 'cn': '机构持股家数合计', 'size': 70,\n                                                        'map': 'ALLCORP_NUM'},\n                                        'allcorp_fund_num': {'type': SmallInteger, 'cn': '基金持股家数', 'size': 70,\n                                                             'map': 'ALLCORP_FUND_NUM'},\n                                        'allcorp_qs_num': {'type': SmallInteger, 'cn': '券商持股家数', 'size': 70,\n                                                           'map': 'ALLCORP_QS_NUM'},\n                                        'allcorp_qfii_num': {'type': SmallInteger, 'cn': 'QFII持股家数', 'size': 70,\n                                                             'map': 'ALLCORP_QFII_NUM'},\n                                        'allcorp_bx_num': {'type': SmallInteger, 'cn': '保险公司持股家数', 'size': 70,\n                                                           'map': 'ALLCORP_BX_NUM'},\n                                        'allcorp_sb_num': {'type': SmallInteger, 'cn': '社保持股家数', 'size': 70,\n                                                           'map': 'ALLCORP_SB_NUM'},\n                                        'allcorp_xt_num': {'type': SmallInteger, 'cn': '信托公司持股家数', 'size': 70,\n                                                           'map': 'ALLCORP_XT_NUM'},\n                                        'allcorp_ratio': {'type': FLOAT, 'cn': '机构持股比例合计', 'size': 70,\n                                                          'map': 'ALLCORP_RATIO'},\n                                        'allcorp_fund_ratio': {'type': FLOAT, 'cn': '基金持股比例', 'size': 70,\n                                                               'map': 'ALLCORP_FUND_RATIO'},\n                                        'allcorp_qs_ratio': {'type': FLOAT, 'cn': '券商持股比例', 'size': 70,\n                                                             'map': 'ALLCORP_QS_RATIO'},\n                                        'allcorp_qfii_ratio': {'type': FLOAT, 'cn': 'QFII持股比例', 'size': 70,\n                                                               'map': 'ALLCORP_QFII_RATIO'},\n                                        'allcorp_bx_ratio': {'type': FLOAT, 'cn': '保险公司持股比例', 'size': 70,\n                                                             'map': 'ALLCORP_BX_RATIO'},\n                                        'allcorp_sb_ratio': {'type': FLOAT, 'cn': '社保持股比例', 'size': 70,\n                                                             'map': 'ALLCORP_SB_RATIO'},\n                                        'allcorp_xt_ratio': {'type': FLOAT, 'cn': '信托公司持股比例', 'size': 70,\n                                                             'map': 'ALLCORP_XT_RATIO'},\n                                        'popularity_rank': {'type': SmallInteger, 'cn': '股吧人气排名', 'size': 70,\n                                                            'map': 'POPULARITY_RANK'},\n                                        'rank_change': {'type': SmallInteger, 'cn': '人气排名变化', 'size': 70,\n                                                        'map': 'RANK_CHANGE'},\n                                        'upp_days': {'type': SmallInteger, 'cn': '人气排名连涨', 'size': 70,\n                                                     'map': 'UPP_DAYS'},\n                                        'down_days': {'type': SmallInteger, 'cn': '人气排名连跌', 'size': 70,\n                                                      'map': 'DOWN_DAYS'},\n                                        'new_high': {'type': SmallInteger, 'cn': '人气排名创新高', 'size': 70,\n                                                     'map': 'NEW_HIGH'},\n                                        'new_down': {'type': SmallInteger, 'cn': '人气排名创新低', 'size': 70,\n                                                     'map': 'NEW_DOWN'},\n                                        'newfans_ratio': {'type': FLOAT, 'cn': '新晋粉丝占比', 'size': 70,\n                                                          'map': 'NEWFANS_RATIO'},\n                                        'bigfans_ratio': {'type': FLOAT, 'cn': '铁杆粉丝占比', 'size': 70,\n                                                          'map': 'BIGFANS_RATIO'},\n                                        'concern_rank_7days': {'type': SmallInteger, 'cn': '7日关注排名', 'size': 70,\n                                                               'map': 'CONCERN_RANK_7DAYS'},\n                                        'browse_rank': {'type': SmallInteger, 'cn': '今日浏览排名', 'size': 70,\n                                                        'map': 'BROWSE_RANK'},\n                                        'amplitude': {'type': FLOAT, 'cn': '振幅', 'size': 70, 'map': 'AMPLITUDE'},\n                                        'is_issue_break': {'type': BIT, 'cn': '破发股票', 'size': 70,\n                                                           'map': 'IS_ISSUE_BREAK'},\n                                        'is_bps_break': {'type': BIT, 'cn': '破净股票', 'size': 70,\n                                                         'map': 'IS_BPS_BREAK'},\n                                        'now_newhigh': {'type': BIT, 'cn': '今日创历史新高', 'size': 70,\n                                                        'map': 'NOW_NEWHIGH'},\n                                        'now_newlow': {'type': BIT, 'cn': '今日创历史新低', 'size': 70,\n                                                       'map': 'NOW_NEWLOW'},\n                                        'high_recent_3days': {'type': BIT, 'cn': '近期创历史新高近3日', 'size': 70,\n                                                              'map': 'HIGH_RECENT_3DAYS'},\n                                        'high_recent_5days': {'type': BIT, 'cn': '近期创历史新高近5日', 'size': 70,\n                                                              'map': 'HIGH_RECENT_5DAYS'},\n                                        'high_recent_10days': {'type': BIT, 'cn': '近期创历史新高近10日', 'size': 70,\n                                                               'map': 'HIGH_RECENT_10DAYS'},\n                                        'high_recent_20days': {'type': BIT, 'cn': '近期创历史新高近20日', 'size': 70,\n                                                               'map': 'HIGH_RECENT_20DAYS'},\n                                        'high_recent_30days': {'type': BIT, 'cn': '近期创历史新高近30日', 'size': 70,\n                                                               'map': 'HIGH_RECENT_30DAYS'},\n                                        'low_recent_3days': {'type': BIT, 'cn': '近期创历史新低近3日', 'size': 70,\n                                                             'map': 'LOW_RECENT_3DAYS'},\n                                        'low_recent_5days': {'type': BIT, 'cn': '近期创历史新低近5日', 'size': 70,\n                                                             'map': 'LOW_RECENT_5DAYS'},\n                                        'low_recent_10days': {'type': BIT, 'cn': '近期创历史新低近10日', 'size': 70,\n                                                              'map': 'LOW_RECENT_10DAYS'},\n                                        'low_recent_20days': {'type': BIT, 'cn': '近期创历史新低近20日', 'size': 70,\n                                                              'map': 'LOW_RECENT_20DAYS'},\n                                        'low_recent_30days': {'type': BIT, 'cn': '近期创历史新低近30日', 'size': 70,\n                                                              'map': 'LOW_RECENT_30DAYS'},\n                                        'win_market_3days': {'type': BIT, 'cn': '近期跑赢大盘近3日', 'size': 70,\n                                                             'map': 'WIN_MARKET_3DAYS'},\n                                        'win_market_5days': {'type': BIT, 'cn': '近期跑赢大盘近5日', 'size': 70,\n                                                             'map': 'WIN_MARKET_5DAYS'},\n                                        'win_market_10days': {'type': BIT, 'cn': '近期跑赢大盘近10日', 'size': 70,\n                                                              'map': 'WIN_MARKET_10DAYS'},\n                                        'win_market_20days': {'type': BIT, 'cn': '近期跑赢大盘近20日', 'size': 70,\n                                                              'map': 'WIN_MARKET_20DAYS'},\n                                        'win_market_30days': {'type': BIT, 'cn': '近期跑赢大盘近30日', 'size': 70,\n                                                              'map': 'WIN_MARKET_30DAYS'},\n                                        'net_inflow': {'type': FLOAT, 'cn': '当日净流入额', 'size': 110,\n                                                       'map': 'NET_INFLOW'},\n                                        'netinflow_3days': {'type': BIGINT, 'cn': '3日主力净流入', 'size': 110,\n                                                            'map': 'NETINFLOW_3DAYS'},\n                                        'netinflow_5days': {'type': BIGINT, 'cn': '5日主力净流入', 'size': 110,\n                                                            'map': 'NETINFLOW_5DAYS'},\n                                        'nowinterst_ratio': {'type': BIGINT, 'cn': '当日增仓占比', 'size': 70,\n                                                             'map': 'NOWINTERST_RATIO'},\n                                        'nowinterst_ratio_3d': {'type': FLOAT, 'cn': '3日增仓占比', 'size': 70,\n                                                                'map': 'NOWINTERST_RATIO_3D'},\n                                        'nowinterst_ratio_5d': {'type': FLOAT, 'cn': '5日增仓占比', 'size': 70,\n                                                                'map': 'NOWINTERST_RATIO_5D'},\n                                        'ddx': {'type': FLOAT, 'cn': '当日DDX', 'size': 70, 'map': 'DDX'},\n                                        'ddx_3d': {'type': FLOAT, 'cn': '3日DDX', 'size': 70, 'map': 'DDX_3D'},\n                                        'ddx_5d': {'type': FLOAT, 'cn': '5日DDX', 'size': 70, 'map': 'DDX_5D'},\n                                        'ddx_red_10d': {'type': SmallInteger, 'cn': '10日内DDX飘红天数', 'size': 70,\n                                                        'map': 'DDX_RED_10D'},\n                                        'changerate_3days': {'type': FLOAT, 'cn': '3日涨跌幅', 'size': 70,\n                                                             'map': 'CHANGERATE_3DAYS'},\n                                        'changerate_5days': {'type': FLOAT, 'cn': '5日涨跌幅', 'size': 70,\n                                                             'map': 'CHANGERATE_5DAYS'},\n                                        'changerate_10days': {'type': FLOAT, 'cn': '10日涨跌幅', 'size': 70,\n                                                              'map': 'CHANGERATE_10DAYS'},\n                                        'changerate_ty': {'type': FLOAT, 'cn': '今年以来涨跌幅', 'size': 70,\n                                                          'map': 'CHANGERATE_TY'},\n                                        'upnday': {'type': SmallInteger, 'cn': '连涨天数', 'size': 70, 'map': 'UPNDAY'},\n                                        'downnday': {'type': SmallInteger, 'cn': '连跌天数', 'size': 70,\n                                                     'map': 'DOWNNDAY'},\n                                        'listing_yield_year': {'type': FLOAT, 'cn': '上市以来年化收益率', 'size': 70,\n                                                               'map': 'LISTING_YIELD_YEAR'},\n                                        'listing_volatility_year': {'type': FLOAT, 'cn': '上市以来年化波动率',\n                                                                    'size': 70,\n                                                                    'map': 'LISTING_VOLATILITY_YEAR'},\n                                        'mutual_netbuy_amt': {'type': BIGINT, 'cn': '沪深股通净买入金额', 'size': 90,\n                                                              'map': 'MUTUAL_NETBUY_AMT'},\n                                        'hold_ratio': {'type': FLOAT, 'cn': '沪深股通持股比例', 'size': 70,\n                                                       'map': 'HOLD_RATIO'},\n                                        'secucode': {'type': VARCHAR(10, _COLLATE), 'cn': '全代码', 'size': 0,\n                                                     'map': 'SECUCODE'}}}\n\nCN_STOCK_CPBD = {'name': 'cn_stock_cpbd', 'cn': '操盘必读',\n                 'columns': {'SECURITY_CODE': {'type': VARCHAR(6, _COLLATE), 'cn': '代码'},\n                             'SECURITY_NAME_ABBR': {'type': VARCHAR(20, _COLLATE), 'cn': '名称'},\n                             'PE_DYNAMIC': {'type': FLOAT, 'cn': '市盈率动'},\n                             'PE_TTM': {'type': FLOAT, 'cn': '市盈率TTM'},\n                             'PE_STATIC': {'type': FLOAT, 'cn': '市盈率静'},\n                             'PB_MRQ_REALTIME': {'type': FLOAT, 'cn': '市净率'},\n                             'REPORT_DATE': {'type': DATE, 'cn': '财报期'},\n                             'EPSJB': {'type': FLOAT, 'cn': '每股收益'},\n                             'BPS': {'type': FLOAT, 'cn': '每股净资产'},\n                             'MGJYXJJE': {'type': FLOAT, 'cn': '每股经营现金流'},\n                             'MGZBGJ': {'type': FLOAT, 'cn': '每股公积金'},\n                             'MGWFPLR': {'type': FLOAT, 'cn': '每股未分配利润'},\n                             'ROEJQ': {'type': FLOAT, 'cn': '加权净资产收益率'},\n                             'XSMLL': {'type': FLOAT, 'cn': '毛利率'},\n                             'ZCFZL': {'type': FLOAT, 'cn': '资产负债率'},\n                             'TOTAL_OPERATEINCOME': {'type': FLOAT, 'cn': '营业收入'},\n                             'YYZSRGDHBZC': {'type': FLOAT, 'cn': '营业收入滚动环比增长'},\n                             'TOTALOPERATEREVETZ': {'type': FLOAT, 'cn': '营业收入同比增长'},\n                             'PARENT_NETPROFIT': {'type': FLOAT, 'cn': '归属净利润'},\n                             'NETPROFITRPHBZC': {'type': FLOAT, 'cn': '归属净利润滚动环比增长'},\n                             'PARENTNETPROFITTZ': {'type': FLOAT, 'cn': '归属净利润同比增长'},\n                             'KCFJCXSYJLR': {'type': FLOAT, 'cn': '扣非净利润'},\n                             'KFJLRGDHBZC': {'type': FLOAT, 'cn': '扣非净利润滚动环比增长'},\n                             'KCFJCXSYJLRTZ': {'type': FLOAT, 'cn': '扣非净利润同比增长'},\n                             'TOTAL_SHARE': {'type': FLOAT, 'cn': '总股本'},\n                             'FREE_SHARE': {'type': FLOAT, 'cn': '流通股本'},\n                             'BOARD_NAME': {'type': VARCHAR(20, _COLLATE), 'cn': '所属板块'},\n                             'END_DATE': {'type': DATE, 'cn': '股东日'},\n                             'HOLDER_TOTAL_NUM': {'type': FLOAT, 'cn': '股东人数'},\n                             'TOTAL_NUM_RATIO': {'type': FLOAT, 'cn': '较上期变化'},\n                             'AVG_FREE_SHARES': {'type': FLOAT, 'cn': '人均流通股'},\n                             'AVG_FREESHARES_RATIO': {'type': FLOAT, 'cn': '较上期变化'},\n                             'HOLD_FOCUS': {'type': FLOAT, 'cn': '筹码集中度'},\n                             'AVG_HOLD_AMT': {'type': FLOAT, 'cn': '人均持股金额'},\n                             'HOLD_RATIO_TOTAL': {'type': FLOAT, 'cn': '十大股东持股'},\n                             'FREEHOLD_RATIO_TOTAL': {'type': FLOAT, 'cn': '十大流通股东持股'},\n                             'LHBD_DATE': {'type': DATE, 'cn': '龙虎榜日'},\n                             'EXPLANATION': {'type': FLOAT, 'cn': '龙虎说明'},\n                             'TOTAL_BUY': {'type': FLOAT, 'cn': '买入金额'},\n                             'TOTAL_BUYRIOTOP': {'type': FLOAT, 'cn': '买入占比'},\n                             'TOTAL_SELL': {'type': FLOAT, 'cn': '卖出金额'},\n                             'TOTAL_SELLRIOTOP': {'type': FLOAT, 'cn': '卖出占比'},\n                             'DZJY_DATE': {'type': DATE, 'cn': '大宗交易日'},\n                             'DEAL_PRICE': {'type': FLOAT, 'cn': '成交价'},\n                             'PREMIUM_RATIO': {'type': FLOAT, 'cn': '折溢价率'},\n                             'DEAL_VOLUME': {'type': FLOAT, 'cn': '成交量'},\n                             'DEAL_AMT': {'type': FLOAT, 'cn': '成交额'},\n                             'BUYER_NAME': {'type': FLOAT, 'cn': '买营业部'},\n                             'SELLER_NAME': {'type': FLOAT, 'cn': '卖营业部'},\n                             'RZRQ_DATE': {'type': DATE, 'cn': '融资券日'},\n                             'FIN_BUY_AMT': {'type': FLOAT, 'cn': '融资买额'},\n                             'FIN_REPAY_AMT': {'type': FLOAT, 'cn': '融资还额'},\n                             'FIN_BALANCE': {'type': FLOAT, 'cn': '融资余额'},\n                             'LOAN_SELL_VOL': {'type': FLOAT, 'cn': '融券卖量'},\n                             'LOAN_REPAY_VOL': {'type': FLOAT, 'cn': '融券还量'},\n                             'LOAN_BALANCE': {'type': FLOAT, 'cn': '融券余额'}}}\n\n\nTABLE_CN_STOCK_CHIP_RACE_OPEN = {'name': 'cn_stock_chip_race_open', 'cn': '早盘抢筹数据',\n                     'columns': {'date': {'type': DATE, 'cn': '日期', 'size': 0},\n                                 'code': {'type': VARCHAR(6, _COLLATE), 'cn': '代码', 'size': 60},\n                                 'name': {'type': VARCHAR(20, _COLLATE), 'cn': '名称', 'size': 120},\n                                 'new_price': {'type': FLOAT, 'cn': '最新价', 'size': 70},\n                                 'change_rate': {'type': FLOAT, 'cn': '涨跌幅', 'size': 70},\n                                 'pre_close_price': {'type': FLOAT, 'cn': '昨收', 'size': 70},\n                                 'open_price': {'type': FLOAT, 'cn': '今开', 'size': 70},\n                                 'deal_amount': {'type': BIGINT, 'cn': '开盘金额', 'size': 90},\n                                 'bid_rate': {'type': FLOAT, 'cn': '抢筹幅度', 'size': 60},\n                                 'bid_trust_amount': {'type': BIGINT, 'cn': '抢筹委托金额', 'size': 100},\n                                 'bid_deal_amount': {'type': BIGINT, 'cn': '抢筹成交金额', 'size': 100},\n                                 'bid_ratio': {'type': FLOAT, 'cn': '抢筹占比', 'size': 60},\n                                 'limitup_day': {'type': SmallInteger, 'cn': '天', 'size': 40},\n                                 'limitup_board': {'type': SmallInteger, 'cn': '板', 'size': 40}}}\n\nTABLE_CN_STOCK_CHIP_RACE_END = {'name': 'cn_stock_chip_race_end', 'cn': '尾盘抢筹数据',\n                     'columns': {'date': {'type': DATE, 'cn': '日期', 'size': 0},\n                                 'code': {'type': VARCHAR(6, _COLLATE), 'cn': '代码', 'size': 60},\n                                 'name': {'type': VARCHAR(20, _COLLATE), 'cn': '名称', 'size': 120},\n                                 'new_price': {'type': FLOAT, 'cn': '最新价', 'size': 70},\n                                 'change_rate': {'type': FLOAT, 'cn': '涨跌幅', 'size': 70},\n                                 'pre_close_price': {'type': FLOAT, 'cn': '昨收', 'size': 70},\n                                 'open_price': {'type': FLOAT, 'cn': '今开', 'size': 70},\n                                 'deal_amount': {'type': BIGINT, 'cn': '收盘金额', 'size': 90},\n                                 'bid_rate': {'type': FLOAT, 'cn': '抢筹幅度', 'size': 60},\n                                 'bid_trust_amount': {'type': BIGINT, 'cn': '抢筹委托金额', 'size': 100},\n                                 'bid_deal_amount': {'type': BIGINT, 'cn': '抢筹成交金额', 'size': 100},\n                                 'bid_ratio': {'type': FLOAT, 'cn': '抢筹占比', 'size': 60},\n                                 'limitup_day': {'type': SmallInteger, 'cn': '天', 'size': 40},\n                                 'limitup_board': {'type': SmallInteger, 'cn': '板', 'size': 40}}}\n\nTABLE_CN_STOCK_LIMITUP_REASON = {'name': 'cn_stock_limitup_reason', 'cn': '涨停原因揭密',\n                     'columns': {'date': {'type': DATE, 'cn': '日期', 'size': 0},\n                                 'code': {'type': VARCHAR(6, _COLLATE), 'cn': '代码', 'size': 60},\n                                 'name': {'type': VARCHAR(20, _COLLATE), 'cn': '名称', 'size': 120},\n                                 'title': {'type': VARCHAR(255, _COLLATE), 'cn': '原因', 'size': 150},\n                                 'reason': {'type': VARCHAR(2000, _COLLATE), 'cn': '详因', 'size': 150},\n                                 'new_price': {'type': FLOAT, 'cn': '最新价', 'size': 70},\n                                 'change_rate': {'type': FLOAT, 'cn': '涨跌幅', 'size': 70},\n                                 'ups_downs': {'type': FLOAT, 'cn': '涨跌额', 'size': 70},\n                                 'turnoverrate': {'type': FLOAT, 'cn': '换手率', 'size': 70},\n                                 'volume': {'type': BIGINT, 'cn': '成交量', 'size': 90},\n                                 'deal_amount': {'type': BIGINT, 'cn': '成交额', 'size': 100},\n                                 'dde': {'type': BIGINT, 'cn': 'DDE', 'size': 90}}}\n\n\ndef get_field_cn(key, table):\n    f = table.get('columns').get(key)\n    if f is None:\n        return key\n    return f.get('cn')\n\n\ndef get_field_cns(cols):\n    data = []\n    for k in cols:\n        if k == 'code':\n            data.append({\"value\": k, \"caption\": cols[k]['cn'], \"width\": cols[k]['size'],\n                         \"headerStyle\": {\"font\": \"bold 9pt Calibri\", \"wordWrap\": \"true\"}, \"style\": \"\"})\n        elif k == 'change_rate':\n            data.append({\"value\": k, \"caption\": cols[k]['cn'], \"width\": cols[k]['size'],\n                         \"headerStyle\": {\"font\": \"bold 9pt Calibri\", \"wordWrap\": \"true\"}, \"conditionalFormats\": [\n                    {\"ruleType\": \"formulaRule\", \"formula\": \"@>0\", \"style\": {\"foreColor\": \"red\"}},\n                    {\"ruleType\": \"formulaRule\", \"formula\": \"@<0\", \"style\": {\"foreColor\": \"green\"}}]})\n        else:\n            data.append({\"value\": k, \"caption\": cols[k]['cn'], \"width\": cols[k]['size'],\n                         \"headerStyle\": {\"font\": \"bold 9pt Calibri\", \"wordWrap\": \"true\"}})\n        # data.append({\"value\": k, \"caption\": cols[k]['cn'], \"width\": cols[k]['size'], \"headerStyle\": {\"font\": \"bold 9pt Calibri\", \"wordWrap\": \"true\"}})\n        # data.append({\"name\": k, \"displayName\": cols[k]['cn'], \"size\": cols[k]['size']})\n    return data\n\n\ndef get_field_types(cols):\n    data = {}\n    for k in cols:\n        data[k] = cols[k]['type']\n    return data\n\n\ndef get_field_type_name(col_type):\n    if col_type == DATE:\n        return \"datetime\"\n    elif col_type == FLOAT or col_type == BIGINT or col_type == SmallInteger or col_type == BIT:\n        return \"numeric\"\n    else:\n        return \"string\"\n"
  },
  {
    "path": "instock/core/web_module_data.py",
    "content": "#!/usr/local/bin/python\n# -*- coding: utf-8 -*-\n\n\n__author__ = 'myh '\n__date__ = '2023/5/11 '\n\n\nclass web_module_data:\n    def __init__(self, mode, type, ico, name, table_name, columns, column_names, primary_key, is_realtime, order_columns=None, order_by=None):\n        self.mode = mode  # 模式，query，editor 查询和编辑模式\n        self.type = type\n        self.ico = ico\n        self.name = name\n        self.table_name = table_name\n        self.columns = columns\n        self.column_names = column_names\n        self.primary_key = primary_key\n        self.is_realtime = is_realtime\n        self.order_by = order_by\n        self.order_columns = order_columns\n        self.url = f\"/instock/data?table_name={self.table_name}\"\n"
  },
  {
    "path": "instock/job/.gitignore",
    "content": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\ncover/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\n.pybuilder/\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# IPython\nprofile_default/\nipython_config.py\n\n# pyenv\n#   For a library or package, you might want to ignore these files since the code is\n#   intended to run in multiple environments; otherwise, check them in:\n# .python-version\n\n# pipenv\n#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.\n#   However, in case of collaboration, if having platform-specific dependencies or dependencies\n#   having no cross-platform support, pipenv may install dependencies that don't work, or not\n#   install all needed dependencies.\n#Pipfile.lock\n\n# poetry\n#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.\n#   This is especially recommended for binary packages to ensure reproducibility, and is more\n#   commonly ignored for libraries.\n#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control\n#poetry.lock\n\n# pdm\n#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.\n#pdm.lock\n#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it\n#   in version control.\n#   https://pdm.fming.dev/#use-with-ide\n.pdm.toml\n\n# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm\n__pypackages__/\n\n# Celery stuff\ncelerybeat-schedule\ncelerybeat.pid\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n.dmypy.json\ndmypy.json\n\n# Pyre type checker\n.pyre/\n\n# pytype static type analyzer\n.pytype/\n\n# Cython debug symbols\ncython_debug/\n\n# PyCharm\n#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can\n#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore\n#  and can be added to the global gitignore or merged into this file.  For a more nuclear\n#  option (not recommended) you can uncomment the following to ignore the entire idea folder.\n.idea/\n"
  },
  {
    "path": "instock/job/__init__.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\n__author__ = 'myh '\n__date__ = '2023/4/3 '\n"
  },
  {
    "path": "instock/job/backtest_data_daily_job.py",
    "content": "#!/usr/local/bin/python3\n# -*- coding: utf-8 -*-\n\n\nimport logging\nimport concurrent.futures\nimport pandas as pd\nimport os.path\nimport sys\nimport datetime\n\ncpath_current = os.path.dirname(os.path.dirname(__file__))\ncpath = os.path.abspath(os.path.join(cpath_current, os.pardir))\nsys.path.append(cpath)\nimport instock.core.tablestructure as tbs\nimport instock.lib.database as mdb\nimport instock.core.backtest.rate_stats as rate\nfrom instock.core.singleton_stock import stock_hist_data\n\n__author__ = 'myh '\n__date__ = '2023/3/10 '\n\n\n# 股票策略回归测试。\ndef prepare():\n    tables = [tbs.TABLE_CN_STOCK_INDICATORS_BUY, tbs.TABLE_CN_STOCK_INDICATORS_SELL]\n    tables.extend(tbs.TABLE_CN_STOCK_STRATEGIES)\n    backtest_columns = list(tbs.TABLE_CN_STOCK_BACKTEST_DATA['columns'])\n    backtest_columns.insert(0, 'code')\n    backtest_columns.insert(0, 'date')\n    backtest_column = backtest_columns\n\n    stocks_data = stock_hist_data().get_data()\n    if stocks_data is None:\n        return\n    for k in stocks_data:\n        date = k[0]\n        break\n    # 回归测试表\n    with concurrent.futures.ThreadPoolExecutor() as executor:\n        for table in tables:\n            executor.submit(process, table, stocks_data, date, backtest_column)\n\n\ndef process(table, data_all, date, backtest_column):\n    table_name = table['name']\n    if not mdb.checkTableIsExist(table_name):\n        return\n\n    column_tail = tuple(table['columns'])[-1]\n    now_date = datetime.datetime.now().date()\n    sql = f\"SELECT * FROM `{table_name}` WHERE `date` < '{now_date}' AND `{column_tail}` is NULL\"\n    try:\n        data = pd.read_sql(sql=sql, con=mdb.engine())\n        if data is None or len(data.index) == 0:\n            return\n\n        subset = data[list(tbs.TABLE_CN_STOCK_FOREIGN_KEY['columns'])]\n        # subset['date'] = subset['date'].values.astype('str')\n        subset = subset.astype({'date': 'string'})\n        stocks = [tuple(x) for x in subset.values]\n\n        results = run_check(stocks, data_all, date, backtest_column)\n        if results is None:\n            return\n\n        data_new = pd.DataFrame(results.values())\n        mdb.update_db_from_df(data_new, table_name, ('date', 'code'))\n\n    except Exception as e:\n        logging.error(f\"backtest_data_daily_job.process处理异常：{table}表{e}\")\n\n\ndef run_check(stocks, data_all, date, backtest_column, workers=40):\n    data = {}\n    try:\n        with concurrent.futures.ThreadPoolExecutor(max_workers=workers) as executor:\n            future_to_data = {executor.submit(rate.get_rates, stock,\n                                              data_all.get((date, stock[1], stock[2])), backtest_column,\n                                              len(backtest_column) - 1): stock for stock in stocks}\n            for future in concurrent.futures.as_completed(future_to_data):\n                stock = future_to_data[future]\n                try:\n                    _data_ = future.result()\n                    if _data_ is not None:\n                        data[stock] = _data_\n                except Exception as e:\n                    logging.error(f\"backtest_data_daily_job.run_check处理异常：{stock[1]}代码{e}\")\n    except Exception as e:\n        logging.error(f\"backtest_data_daily_job.run_check处理异常：{e}\")\n    if not data:\n        return None\n    else:\n        return data\n\n\ndef main():\n    prepare()\n\n\n# main函数入口\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "instock/job/basic_data_after_close_daily_job.py",
    "content": "#!/usr/local/bin/python3\n# -*- coding: utf-8 -*-\n\nimport logging\nimport os.path\nimport sys\n\ncpath_current = os.path.dirname(os.path.dirname(__file__))\ncpath = os.path.abspath(os.path.join(cpath_current, os.pardir))\nsys.path.append(cpath)\nimport instock.lib.run_template as runt\nimport instock.core.tablestructure as tbs\nimport instock.lib.database as mdb\nimport instock.core.stockfetch as stf\n\n__author__ = 'myh '\n__date__ = '2023/3/10 '\n\n\n# 每日股票大宗交易\ndef save_after_close_stock_blocktrade_data(date):\n    try:\n        data = stf.fetch_stock_blocktrade_data(date)\n        if data is None or len(data.index) == 0:\n            return\n\n        table_name = tbs.TABLE_CN_STOCK_BLOCKTRADE['name']\n        # 删除老数据。\n        if mdb.checkTableIsExist(table_name):\n            del_sql = f\"DELETE FROM `{table_name}` where `date` = '{date}'\"\n            mdb.executeSql(del_sql)\n            cols_type = None\n        else:\n            cols_type = tbs.get_field_types(tbs.TABLE_CN_STOCK_BLOCKTRADE['columns'])\n\n        mdb.insert_db_from_df(data, table_name, cols_type, False, \"`date`,`code`\")\n    except Exception as e:\n        logging.error(f\"basic_data_after_close_daily_job.save_stock_blocktrade_data处理异常：{e}\")\n\n# 每日尾盘抢筹\ndef save_after_close_stock_chip_race_end_data(date):\n    try:\n        data = stf.fetch_stock_chip_race_end(date)\n        if data is None or len(data.index) == 0:\n            return\n\n        table_name = tbs.TABLE_CN_STOCK_CHIP_RACE_END['name']\n        # 删除老数据。\n        if mdb.checkTableIsExist(table_name):\n            del_sql = f\"DELETE FROM `{table_name}` where `date` = '{date}'\"\n            mdb.executeSql(del_sql)\n            cols_type = None\n        else:\n            cols_type = tbs.get_field_types(tbs.TABLE_CN_STOCK_CHIP_RACE_END['columns'])\n\n        mdb.insert_db_from_df(data, table_name, cols_type, False, \"`date`,`code`\")\n    except Exception as e:\n        logging.error(f\"basic_data_after_close_daily_job.save_after_close_stock_chip_race_end_data：{e}\")\n\ndef main():\n    runt.run_with_args(save_after_close_stock_blocktrade_data)\n    runt.run_with_args(save_after_close_stock_chip_race_end_data)\n\n\n# main函数入口\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "instock/job/basic_data_daily_job.py",
    "content": "#!/usr/local/bin/python3\n# -*- coding: utf-8 -*-\n\nimport logging\nimport os.path\nimport sys\n\ncpath_current = os.path.dirname(os.path.dirname(__file__))\ncpath = os.path.abspath(os.path.join(cpath_current, os.pardir))\nsys.path.append(cpath)\nimport instock.lib.run_template as runt\nimport instock.core.tablestructure as tbs\nimport instock.lib.database as mdb\nimport instock.core.stockfetch as stf\nfrom instock.core.singleton_stock import stock_data\n\n__author__ = 'myh '\n__date__ = '2023/3/10 '\n\n\n# 股票实时行情数据。\ndef save_nph_stock_spot_data(date, before=True):\n    if before:\n        return\n    # 股票列表\n    try:\n        data = stock_data(date).get_data()\n        if data is None or len(data.index) == 0:\n            return\n\n        table_name = tbs.TABLE_CN_STOCK_SPOT['name']\n        # 删除老数据。\n        if mdb.checkTableIsExist(table_name):\n            del_sql = f\"DELETE FROM `{table_name}` where `date` = '{date}'\"\n            mdb.executeSql(del_sql)\n            cols_type = None\n        else:\n            cols_type = tbs.get_field_types(tbs.TABLE_CN_STOCK_SPOT['columns'])\n\n        mdb.insert_db_from_df(data, table_name, cols_type, False, \"`date`,`code`\")\n\n    except Exception as e:\n        logging.error(f\"basic_data_daily_job.save_stock_spot_data处理异常：{e}\")\n\n\n# 基金实时行情数据。\ndef save_nph_etf_spot_data(date, before=True):\n    if before:\n        return\n    # 股票列表\n    try:\n        data = stf.fetch_etfs(date)\n        if data is None or len(data.index) == 0:\n            return\n\n        table_name = tbs.TABLE_CN_ETF_SPOT['name']\n        # 删除老数据。\n        if mdb.checkTableIsExist(table_name):\n            del_sql = f\"DELETE FROM `{table_name}` where `date` = '{date}'\"\n            mdb.executeSql(del_sql)\n            cols_type = None\n        else:\n            cols_type = tbs.get_field_types(tbs.TABLE_CN_ETF_SPOT['columns'])\n\n        mdb.insert_db_from_df(data, table_name, cols_type, False, \"`date`,`code`\")\n    except Exception as e:\n        logging.error(f\"basic_data_daily_job.save_nph_etf_spot_data处理异常：{e}\")\n\n\n\ndef main():\n    runt.run_with_args(save_nph_stock_spot_data)\n    runt.run_with_args(save_nph_etf_spot_data)\n\n\n# main函数入口\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "instock/job/basic_data_other_daily_job.py",
    "content": "#!/usr/local/bin/python3\n# -*- coding: utf-8 -*-\n\nimport logging\nimport concurrent.futures\nimport os.path\nimport sys\nimport pandas as pd\n\ncpath_current = os.path.dirname(os.path.dirname(__file__))\ncpath = os.path.abspath(os.path.join(cpath_current, os.pardir))\nsys.path.append(cpath)\nimport instock.lib.run_template as runt\nimport instock.core.tablestructure as tbs\nimport instock.lib.database as mdb\nimport instock.core.stockfetch as stf\n\n__author__ = 'myh '\n__date__ = '2023/3/10 '\n\n# 每日股票龙虎榜\ndef save_nph_stock_lhb_data(date, before=True):\n    if before:\n        return\n\n    try:\n        data = stf.fetch_stock_lhb_data(date)\n        if data is None or len(data.index) == 0:\n            return\n\n        table_name = tbs.TABLE_CN_STOCK_lHB['name']\n        # 删除老数据。\n        if mdb.checkTableIsExist(table_name):\n            del_sql = f\"DELETE FROM `{table_name}` where `date` = '{date}'\"\n            mdb.executeSql(del_sql)\n            cols_type = None\n        else:\n            cols_type = tbs.get_field_types(tbs.TABLE_CN_STOCK_lHB['columns'])\n        mdb.insert_db_from_df(data, table_name, cols_type, False, \"`date`,`code`\")\n    except Exception as e:\n        logging.error(f\"basic_data_other_daily_job.save_stock_lhb_data处理异常：{e}\")\n    stock_spot_buy(date)\n\n# 每日股票龙虎榜(新浪)\ndef save_nph_stock_top_data(date, before=True):\n    if before:\n        return\n\n    try:\n        data = stf.fetch_stock_top_data(date)\n        if data is None or len(data.index) == 0:\n            return\n\n        table_name = tbs.TABLE_CN_STOCK_TOP['name']\n        # 删除老数据。\n        if mdb.checkTableIsExist(table_name):\n            del_sql = f\"DELETE FROM `{table_name}` where `date` = '{date}'\"\n            mdb.executeSql(del_sql)\n            cols_type = None\n        else:\n            cols_type = tbs.get_field_types(tbs.TABLE_CN_STOCK_TOP['columns'])\n        mdb.insert_db_from_df(data, table_name, cols_type, False, \"`date`,`code`\")\n    except Exception as e:\n        logging.error(f\"basic_data_other_daily_job.save_stock_top_data处理异常：{e}\")\n    stock_spot_buy(date)\n\n\n# 每日股票资金流向\ndef save_nph_stock_fund_flow_data(date, before=True):\n    if before:\n        return\n\n    try:\n        times = tuple(range(4))\n        results = run_check_stock_fund_flow(times)\n        if results is None:\n            return\n\n        for t in times:\n            if t == 0:\n                data = results.get(t)\n            else:\n                r = results.get(t)\n                if r is not None:\n                    r.drop(columns=['name', 'new_price'], inplace=True)\n                    data = pd.merge(data, r, on=['code'], how='left')\n\n        if data is None or len(data.index) == 0:\n            return\n\n        data.insert(0, 'date', date.strftime(\"%Y-%m-%d\"))\n\n        table_name = tbs.TABLE_CN_STOCK_FUND_FLOW['name']\n        # 删除老数据。\n        if mdb.checkTableIsExist(table_name):\n            del_sql = f\"DELETE FROM `{table_name}` where `date` = '{date}'\"\n            mdb.executeSql(del_sql)\n            cols_type = None\n        else:\n            cols_type = tbs.get_field_types(tbs.TABLE_CN_STOCK_FUND_FLOW['columns'])\n\n        mdb.insert_db_from_df(data, table_name, cols_type, False, \"`date`,`code`\")\n    except Exception as e:\n        logging.error(f\"basic_data_other_daily_job.save_nph_stock_fund_flow_data处理异常：{e}\")\n\n\ndef run_check_stock_fund_flow(times):\n    data = {}\n    try:\n        for k in times :\n            _data = stf.fetch_stocks_fund_flow(k)\n            if _data is not None:\n                data[k] = _data\n    except Exception as e:\n        logging.error(f\"basic_data_other_daily_job.run_check_stock_fund_flow处理异常：{e}\")\n    # try:\n    #     with concurrent.futures.ThreadPoolExecutor(max_workers=len(times)) as executor:\n    #         future_to_data = {executor.submit(stf.fetch_stocks_fund_flow, k): k for k in times}\n    #         for future in concurrent.futures.as_completed(future_to_data):\n    #             _time = future_to_data[future]\n    #             try:\n    #                 _data_ = future.result()\n    #                 if _data_ is not None:\n    #                     data[_time] = _data_\n    #             except Exception as e:\n    #                 logging.error(f\"basic_data_other_daily_job.run_check_stock_fund_flow处理异常：代码{e}\")\n    # except Exception as e:\n    #     logging.error(f\"basic_data_other_daily_job.run_check_stock_fund_flow处理异常：{e}\")\n    if not data:\n        return None\n    else:\n        return data\n\n\n# 每日行业资金流向\ndef save_nph_stock_sector_fund_flow_data(date, before=True):\n    if before:\n        return\n\n    # times = tuple(range(2))\n    # with concurrent.futures.ThreadPoolExecutor(max_workers=len(times)) as executor:\n    #     {executor.submit(stock_sector_fund_flow_data, date, k): k for k in times}\n    stock_sector_fund_flow_data(date, 0)\n    stock_sector_fund_flow_data(date, 1)\n\ndef stock_sector_fund_flow_data(date, index_sector):\n    try:\n        times = tuple(range(3))\n        results = run_check_stock_sector_fund_flow(index_sector, times)\n        if results is None:\n            return\n\n        for t in times:\n            if t == 0:\n                data = results.get(t)\n            else:\n                r = results.get(t)\n                if r is not None:\n                    data = pd.merge(data, r, on=['name'], how='left')\n\n        if data is None or len(data.index) == 0:\n            return\n\n        data.insert(0, 'date', date.strftime(\"%Y-%m-%d\"))\n\n        if index_sector == 0:\n            tbs_table = tbs.TABLE_CN_STOCK_FUND_FLOW_INDUSTRY\n        else:\n            tbs_table = tbs.TABLE_CN_STOCK_FUND_FLOW_CONCEPT\n        table_name = tbs_table['name']\n        # 删除老数据。\n        if mdb.checkTableIsExist(table_name):\n            del_sql = f\"DELETE FROM `{table_name}` where `date` = '{date}'\"\n            mdb.executeSql(del_sql)\n            cols_type = None\n        else:\n            cols_type = tbs.get_field_types(tbs_table['columns'])\n\n        mdb.insert_db_from_df(data, table_name, cols_type, False, \"`date`,`name`\")\n    except Exception as e:\n        logging.error(f\"basic_data_other_daily_job.stock_sector_fund_flow_data处理异常：{e}\")\n\n\ndef run_check_stock_sector_fund_flow(index_sector, times):\n    data = {}\n    try:\n        with concurrent.futures.ThreadPoolExecutor(max_workers=len(times)) as executor:\n            future_to_data = {executor.submit(stf.fetch_stocks_sector_fund_flow, index_sector, k): k for k in times}\n            for future in concurrent.futures.as_completed(future_to_data):\n                _time = future_to_data[future]\n                try:\n                    _data_ = future.result()\n                    if _data_ is not None:\n                        data[_time] = _data_\n                except Exception as e:\n                    logging.error(f\"basic_data_other_daily_job.run_check_stock_sector_fund_flow处理异常：代码{e}\")\n    except Exception as e:\n        logging.error(f\"basic_data_other_daily_job.run_check_stock_sector_fund_flow处理异常：{e}\")\n    if not data:\n        return None\n    else:\n        return data\n\n\n# 每日股票分红配送\ndef save_nph_stock_bonus(date, before=True):\n    if before:\n        return\n\n    try:\n        data = stf.fetch_stocks_bonus(date)\n        if data is None or len(data.index) == 0:\n            return\n\n        table_name = tbs.TABLE_CN_STOCK_BONUS['name']\n        # 删除老数据。\n        if mdb.checkTableIsExist(table_name):\n            del_sql = f\"DELETE FROM `{table_name}` where `date` = '{date}'\"\n            mdb.executeSql(del_sql)\n            cols_type = None\n        else:\n            cols_type = tbs.get_field_types(tbs.TABLE_CN_STOCK_BONUS['columns'])\n        mdb.insert_db_from_df(data, table_name, cols_type, False, \"`date`,`code`\")\n    except Exception as e:\n        logging.error(f\"basic_data_other_daily_job.save_nph_stock_bonus处理异常：{e}\")\n\n\n# 基本面选股\ndef stock_spot_buy(date):\n    try:\n        _table_name = tbs.TABLE_CN_STOCK_SPOT['name']\n        if not mdb.checkTableIsExist(_table_name):\n            return\n\n        sql = f'''SELECT * FROM `{_table_name}` WHERE `date` = '{date}' and \n                `pe9` > 0 and `pe9` <= 20 and `pbnewmrq` <= 10 and `roe_weight` >= 15'''\n        data = pd.read_sql(sql=sql, con=mdb.engine())\n        data = data.drop_duplicates(subset=\"code\", keep=\"last\")\n        if len(data.index) == 0:\n            return\n\n        table_name = tbs.TABLE_CN_STOCK_SPOT_BUY['name']\n        # 删除老数据。\n        if mdb.checkTableIsExist(table_name):\n            del_sql = f\"DELETE FROM `{table_name}` where `date` = '{date}'\"\n            mdb.executeSql(del_sql)\n            cols_type = None\n        else:\n            cols_type = tbs.get_field_types(tbs.TABLE_CN_STOCK_SPOT_BUY['columns'])\n\n        mdb.insert_db_from_df(data, table_name, cols_type, False, \"`date`,`code`\")\n    except Exception as e:\n        logging.error(f\"basic_data_other_daily_job.stock_spot_buy处理异常：{e}\")\n\n\n# 每日早盘抢筹\ndef stock_chip_race_open_data(date):\n    try:\n        data = stf.fetch_stock_chip_race_open(date)\n        if data is None or len(data.index) == 0:\n            return\n\n        table_name = tbs.TABLE_CN_STOCK_CHIP_RACE_OPEN['name']\n        # 删除老数据。\n        if mdb.checkTableIsExist(table_name):\n            del_sql = f\"DELETE FROM `{table_name}` where `date` = '{date}'\"\n            mdb.executeSql(del_sql)\n            cols_type = None\n        else:\n            cols_type = tbs.get_field_types(tbs.TABLE_CN_STOCK_CHIP_RACE_OPEN['columns'])\n\n        mdb.insert_db_from_df(data, table_name, cols_type, False, \"`date`,`code`\")\n    except Exception as e:\n        logging.error(f\"basic_data_other_daily_job.stock_chip_race_open_data：{e}\")\n\n\n# 每日涨停原因\ndef stock_imitup_reason_data(date):\n    try:\n        data = stf.fetch_stock_limitup_reason(date)\n        if data is None or len(data.index) == 0:\n            return\n\n        table_name = tbs.TABLE_CN_STOCK_LIMITUP_REASON['name']\n        # 删除老数据。\n        if mdb.checkTableIsExist(table_name):\n            del_sql = f\"DELETE FROM `{table_name}` where `date` = '{date}'\"\n            mdb.executeSql(del_sql)\n            cols_type = None\n        else:\n            cols_type = tbs.get_field_types(tbs.TABLE_CN_STOCK_LIMITUP_REASON['columns'])\n\n        mdb.insert_db_from_df(data, table_name, cols_type, False, \"`date`,`code`\")\n    except Exception as e:\n        logging.error(f\"basic_data_other_daily_job.stock_imitup_reason_data：{e}\")\n\ndef main():\n    runt.run_with_args(save_nph_stock_lhb_data)\n    runt.run_with_args(save_nph_stock_bonus)\n    runt.run_with_args(save_nph_stock_fund_flow_data)\n    runt.run_with_args(save_nph_stock_sector_fund_flow_data)\n    runt.run_with_args(stock_chip_race_open_data)\n    runt.run_with_args(stock_imitup_reason_data)\n\n\n# main函数入口\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "instock/job/execute_daily_job.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\n\nimport time\nimport datetime\nimport concurrent.futures\nimport logging\nimport os.path\nimport sys\n\n# 在项目运行时，临时将项目路径添加到环境变量\ncpath_current = os.path.dirname(os.path.dirname(__file__))\ncpath = os.path.abspath(os.path.join(cpath_current, os.pardir))\nsys.path.append(cpath)\nlog_path = os.path.join(cpath_current, 'log')\nif not os.path.exists(log_path):\n    os.makedirs(log_path)\nlogging.basicConfig(format='%(asctime)s %(message)s', filename=os.path.join(log_path, 'stock_execute_job.log'))\nlogging.getLogger().setLevel(logging.INFO)\nimport init_job as bj\nimport basic_data_daily_job as hdj\nimport basic_data_other_daily_job as hdtj\nimport basic_data_after_close_daily_job as acdj\nimport indicators_data_daily_job as gdj\nimport strategy_data_daily_job as sdj\nimport backtest_data_daily_job as bdj\nimport klinepattern_data_daily_job as kdj\nimport selection_data_daily_job as sddj\n\n__author__ = 'myh '\n__date__ = '2023/3/10 '\n\n\ndef main():\n    start = time.time()\n    _start = datetime.datetime.now()\n    logging.info(\"######## 任务执行时间: %s #######\" % _start.strftime(\"%Y-%m-%d %H:%M:%S.%f\"))\n    # 第1步创建数据库\n    bj.main()\n    # 第2.1步创建股票基础数据表\n    hdj.main()\n    # 第2.2步创建综合股票数据表\n    sddj.main()\n    with concurrent.futures.ThreadPoolExecutor() as executor:\n        # # 第3.1步创建股票其它基础数据表\n        executor.submit(hdtj.main)\n        # # 第3.2步创建股票指标数据表\n        # executor.submit(gdj.main)\n        # # # # 第4步创建股票k线形态表\n        # executor.submit(kdj.main)\n        # # # # 第5步创建股票策略数据表\n        # executor.submit(sdj.main)\n\n    # # # # 第6步创建股票回测\n    # bdj.main()\n\n    # # # # 第7步创建股票闭盘后才有的数据\n    acdj.main()\n\n    logging.info(\"######## 完成任务, 使用时间: %s 秒 #######\" % (time.time() - start))\n\n\n# main函数入口\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "instock/job/indicators_data_daily_job.py",
    "content": "#!/usr/local/bin/python3\n# -*- coding: utf-8 -*-\n\n\nimport logging\nimport concurrent.futures\nimport pandas as pd\nimport os.path\nimport sys\n\ncpath_current = os.path.dirname(os.path.dirname(__file__))\ncpath = os.path.abspath(os.path.join(cpath_current, os.pardir))\nsys.path.append(cpath)\nimport instock.lib.run_template as runt\nimport instock.core.tablestructure as tbs\nimport instock.lib.database as mdb\nimport instock.core.indicator.calculate_indicator as idr\nfrom instock.core.singleton_stock import stock_hist_data\n\n__author__ = 'myh '\n__date__ = '2023/3/10 '\n\n\ndef prepare(date):\n    try:\n        stocks_data = stock_hist_data(date=date).get_data()\n        if stocks_data is None:\n            return\n        results = run_check(stocks_data, date=date)\n        if results is None:\n            return\n\n        table_name = tbs.TABLE_CN_STOCK_INDICATORS['name']\n        # 删除老数据。\n        if mdb.checkTableIsExist(table_name):\n            del_sql = f\"DELETE FROM `{table_name}` where `date` = '{date}'\"\n            mdb.executeSql(del_sql)\n            cols_type = None\n        else:\n            cols_type = tbs.get_field_types(tbs.TABLE_CN_STOCK_INDICATORS['columns'])\n\n        dataKey = pd.DataFrame(results.keys())\n        _columns = tuple(tbs.TABLE_CN_STOCK_FOREIGN_KEY['columns'])\n        dataKey.columns = _columns\n\n        dataVal = pd.DataFrame(results.values())\n        dataVal.drop('date', axis=1, inplace=True)  # 删除日期字段，然后和原始数据合并。\n\n        data = pd.merge(dataKey, dataVal, on=['code'], how='left')\n        # data.set_index('code', inplace=True)\n        # 单例，时间段循环必须改时间\n        date_str = date.strftime(\"%Y-%m-%d\")\n        if date.strftime(\"%Y-%m-%d\") != data.iloc[0]['date']:\n            data['date'] = date_str\n        mdb.insert_db_from_df(data, table_name, cols_type, False, \"`date`,`code`\")\n\n    except Exception as e:\n        logging.error(f\"indicators_data_daily_job.prepare处理异常：{e}\")\n\n\ndef run_check(stocks, date=None, workers=40):\n    data = {}\n    columns = list(tbs.STOCK_STATS_DATA['columns'])\n    columns.insert(0, 'code')\n    columns.insert(0, 'date')\n    data_column = columns\n    try:\n        with concurrent.futures.ThreadPoolExecutor(max_workers=workers) as executor:\n            future_to_data = {executor.submit(idr.get_indicator, k, stocks[k], data_column, date=date): k for k in stocks}\n            for future in concurrent.futures.as_completed(future_to_data):\n                stock = future_to_data[future]\n                try:\n                    _data_ = future.result()\n                    if _data_ is not None:\n                        data[stock] = _data_\n                except Exception as e:\n                    logging.error(f\"indicators_data_daily_job.run_check处理异常：{stock[1]}代码{e}\")\n    except Exception as e:\n        logging.error(f\"indicators_data_daily_job.run_check处理异常：{e}\")\n    if not data:\n        return None\n    else:\n        return data\n\n\n# 对每日指标数据，进行筛选。将符合条件的。二次筛选出来。\n# 只是做简单筛选\ndef guess_buy(date):\n    try:\n        _table_name = tbs.TABLE_CN_STOCK_INDICATORS['name']\n        if not mdb.checkTableIsExist(_table_name):\n            return\n\n        _columns = tuple(tbs.TABLE_CN_STOCK_FOREIGN_KEY['columns'])\n        _selcol = '`,`'.join(_columns)\n        sql = f'''SELECT `{_selcol}` FROM `{_table_name}` WHERE `date` = '{date}' and \n                `kdjk` >= 80 and `kdjd` >= 70 and `kdjj` >= 100 and `rsi_6` >= 80 and \n                `cci` >= 100 and `cr` >= 300 and `wr_6` >= -20 and `vr` >= 160'''\n        data = pd.read_sql(sql=sql, con=mdb.engine())\n        data = data.drop_duplicates(subset=\"code\", keep=\"last\")\n        # data.set_index('code', inplace=True)\n\n        if len(data.index) == 0:\n            return\n\n        table_name = tbs.TABLE_CN_STOCK_INDICATORS_BUY['name']\n        # 删除老数据。\n        if mdb.checkTableIsExist(table_name):\n            del_sql = f\"DELETE FROM `{table_name}` where `date` = '{date}'\"\n            mdb.executeSql(del_sql)\n            cols_type = None\n        else:\n            cols_type = tbs.get_field_types(tbs.TABLE_CN_STOCK_INDICATORS_BUY['columns'])\n\n        _columns_backtest = tuple(tbs.TABLE_CN_STOCK_BACKTEST_DATA['columns'])\n        data = pd.concat([data, pd.DataFrame(columns=_columns_backtest)])\n        mdb.insert_db_from_df(data, table_name, cols_type, False, \"`date`,`code`\")\n    except Exception as e:\n        logging.error(f\"indicators_data_daily_job.guess_buy处理异常：{e}\")\n\n\n# 设置卖出数据。\ndef guess_sell(date):\n    try:\n        _table_name = tbs.TABLE_CN_STOCK_INDICATORS['name']\n        if not mdb.checkTableIsExist(_table_name):\n            return\n\n        _columns = tuple(tbs.TABLE_CN_STOCK_FOREIGN_KEY['columns'])\n        _selcol = '`,`'.join(_columns)\n        sql = f'''SELECT `{_selcol}` FROM `{_table_name}` WHERE `date` = '{date}' and \n                `kdjk` < 20 and `kdjd` < 30 and `kdjj` < 10 and `rsi_6` < 20 and \n                `cci` < -100 and `cr` < 40 and `wr_6` < -80 and `vr` < 40'''\n        data = pd.read_sql(sql=sql, con=mdb.engine())\n        data = data.drop_duplicates(subset=\"code\", keep=\"last\")\n        # data.set_index('code', inplace=True)\n        if len(data.index) == 0:\n            return\n\n        table_name = tbs.TABLE_CN_STOCK_INDICATORS_SELL['name']\n        # 删除老数据。\n        if mdb.checkTableIsExist(table_name):\n            del_sql = f\"DELETE FROM `{table_name}` where `date` = '{date}'\"\n            mdb.executeSql(del_sql)\n            cols_type = None\n        else:\n            cols_type = tbs.get_field_types(tbs.TABLE_CN_STOCK_INDICATORS_SELL['columns'])\n\n        _columns_backtest = tuple(tbs.TABLE_CN_STOCK_BACKTEST_DATA['columns'])\n        data = pd.concat([data, pd.DataFrame(columns=_columns_backtest)])\n        mdb.insert_db_from_df(data, table_name, cols_type, False, \"`date`,`code`\")\n    except Exception as e:\n        logging.error(f\"indicators_data_daily_job.guess_sell处理异常：{e}\")\n\n\ndef main():\n    # 使用方法传递。\n    runt.run_with_args(prepare)\n    # 二次筛选数据。直接计算买卖股票数据。\n    runt.run_with_args(guess_buy)\n    runt.run_with_args(guess_sell)\n\n\n# main函数入口\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "instock/job/init_job.py",
    "content": "#!/usr/local/bin/python3\n# -*- coding: utf-8 -*-\n\n\nimport logging\nimport pymysql\nimport os.path\nimport sys\n\ncpath_current = os.path.dirname(os.path.dirname(__file__))\ncpath = os.path.abspath(os.path.join(cpath_current, os.pardir))\nsys.path.append(cpath)\nimport instock.lib.database as mdb\n\n__author__ = 'myh '\n__date__ = '2023/3/10 '\n\n\n# 创建新数据库。\ndef create_new_database():\n    _MYSQL_CONN_DBAPI = mdb.MYSQL_CONN_DBAPI.copy()\n    _MYSQL_CONN_DBAPI['database'] = \"mysql\"\n    with pymysql.connect(**_MYSQL_CONN_DBAPI) as conn:\n        with conn.cursor() as db:\n            try:\n                create_sql = f\"CREATE DATABASE IF NOT EXISTS `{mdb.db_database}` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci\"\n                db.execute(create_sql)\n                create_new_base_table()\n            except Exception as e:\n                logging.error(f\"init_job.create_new_database处理异常：{e}\")\n\n\n# 创建基础表。\ndef create_new_base_table():\n    with pymysql.connect(**mdb.MYSQL_CONN_DBAPI) as conn:\n        with conn.cursor() as db:\n            create_table_sql = \"\"\"CREATE TABLE IF NOT EXISTS `cn_stock_attention` (\n                                  `datetime` datetime(0) NULL DEFAULT NULL, \n                                  `code` varchar(6) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n                                  PRIMARY KEY (`code`) USING BTREE,\n                                  INDEX `INIX_DATETIME`(`datetime`) USING BTREE\n                                  ) CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;\"\"\"\n            db.execute(create_table_sql)\n\n\ndef check_database():\n    with pymysql.connect(**mdb.MYSQL_CONN_DBAPI) as conn:\n        with conn.cursor() as db:\n            db.execute(\" select 1 \")\n\n\ndef main():\n    # 检查，如果执行 select 1 失败，说明数据库不存在，然后创建一个新的数据库。\n    try:\n        check_database()\n    except Exception as e:\n        logging.error(\"执行信息：数据库不存在，将创建。\")\n        # 检查数据库失败，\n        create_new_database()\n    # 执行数据初始化。\n\n\n# main函数入口\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "instock/job/klinepattern_data_daily_job.py",
    "content": "#!/usr/local/bin/python3\n# -*- coding: utf-8 -*-\n\n\nimport logging\nimport concurrent.futures\nimport pandas as pd\nimport os.path\nimport sys\n\ncpath_current = os.path.dirname(os.path.dirname(__file__))\ncpath = os.path.abspath(os.path.join(cpath_current, os.pardir))\nsys.path.append(cpath)\nimport instock.lib.run_template as runt\nimport instock.core.tablestructure as tbs\nimport instock.lib.database as mdb\nfrom instock.core.singleton_stock import stock_hist_data\nimport instock.core.pattern.pattern_recognitions as kpr\n\n__author__ = 'myh '\n__date__ = '2023/3/10 '\n\n\ndef prepare(date):\n    try:\n        stocks_data = stock_hist_data(date=date).get_data()\n        if stocks_data is None:\n            return\n        results = run_check(stocks_data, date=date)\n        if results is None:\n            return\n\n        table_name = tbs.TABLE_CN_STOCK_KLINE_PATTERN['name']\n        # 删除老数据。\n        if mdb.checkTableIsExist(table_name):\n            del_sql = f\"DELETE FROM `{table_name}` where `date` = '{date}'\"\n            mdb.executeSql(del_sql)\n            cols_type = None\n        else:\n            cols_type = tbs.get_field_types(tbs.TABLE_CN_STOCK_KLINE_PATTERN['columns'])\n\n        dataKey = pd.DataFrame(results.keys())\n        _columns = tuple(tbs.TABLE_CN_STOCK_FOREIGN_KEY['columns'])\n        dataKey.columns = _columns\n\n        dataVal = pd.DataFrame(results.values())\n\n        data = pd.merge(dataKey, dataVal, on=['code'], how='left')\n        # 单例，时间段循环必须改时间\n        date_str = date.strftime(\"%Y-%m-%d\")\n        if date.strftime(\"%Y-%m-%d\") != data.iloc[0]['date']:\n            data['date'] = date_str\n        mdb.insert_db_from_df(data, table_name, cols_type, False, \"`date`,`code`\")\n\n    except Exception as e:\n        logging.error(f\"klinepattern_data_daily_job.prepare处理异常：{e}\")\n\n\ndef run_check(stocks, date=None, workers=40):\n    data = {}\n    columns = tbs.STOCK_KLINE_PATTERN_DATA['columns']\n    data_column = columns\n    try:\n        with concurrent.futures.ThreadPoolExecutor(max_workers=workers) as executor:\n            future_to_data = {executor.submit(kpr.get_pattern_recognition, k, stocks[k], data_column, date=date): k for k in stocks}\n            for future in concurrent.futures.as_completed(future_to_data):\n                stock = future_to_data[future]\n                try:\n                    _data_ = future.result()\n                    if _data_ is not None:\n                        data[stock] = _data_\n                except Exception as e:\n                    logging.error(f\"klinepattern_data_daily_job.run_check处理异常：{stock[1]}代码{e}\")\n    except Exception as e:\n        logging.error(f\"klinepattern_data_daily_job.run_check处理异常：{e}\")\n    if not data:\n        return None\n    else:\n        return data\n\n\ndef main():\n    # 使用方法传递。\n    runt.run_with_args(prepare)\n\n\n# main函数入口\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "instock/job/selection_data_daily_job.py",
    "content": "#!/usr/local/bin/python3\n# -*- coding: utf-8 -*-\n\n\nimport logging\nimport pandas as pd\nimport os.path\nimport sys\n\ncpath_current = os.path.dirname(os.path.dirname(__file__))\ncpath = os.path.abspath(os.path.join(cpath_current, os.pardir))\nsys.path.append(cpath)\nimport instock.lib.run_template as runt\nimport instock.core.tablestructure as tbs\nimport instock.lib.database as mdb\nimport instock.core.stockfetch as stf\n\n__author__ = 'myh '\n__date__ = '2023/5/5 '\n\n\ndef save_nph_stock_selection_data(date, before=True):\n    if before:\n        return\n\n    try:\n        data = stf.fetch_stock_selection()\n        if data is None:\n            return\n\n        table_name = tbs.TABLE_CN_STOCK_SELECTION['name']\n        # 删除老数据。\n        if mdb.checkTableIsExist(table_name):\n            _date = data.iloc[0]['date']\n            del_sql = f\"DELETE FROM `{table_name}` where `date` = '{_date}'\"\n            mdb.executeSql(del_sql)\n            cols_type = None\n        else:\n            cols_type = tbs.get_field_types(tbs.TABLE_CN_STOCK_SELECTION['columns'])\n\n        mdb.insert_db_from_df(data, table_name, cols_type, False, \"`date`,`code`\")\n    except Exception as e:\n        logging.error(f\"selection_data_daily_job.save_nph_stock_selection_data处理异常：{e}\")\n\n\ndef main():\n    runt.run_with_args(save_nph_stock_selection_data)\n\n\n# main函数入口\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "instock/job/strategy_data_daily_job.py",
    "content": "#!/usr/local/bin/python3\n# -*- coding: utf-8 -*-\n\nimport logging\nimport concurrent.futures\nimport pandas as pd\nimport os.path\nimport sys\n\ncpath_current = os.path.dirname(os.path.dirname(__file__))\ncpath = os.path.abspath(os.path.join(cpath_current, os.pardir))\nsys.path.append(cpath)\nimport instock.lib.run_template as runt\nimport instock.core.tablestructure as tbs\nimport instock.lib.database as mdb\nfrom instock.core.singleton_stock import stock_hist_data\nfrom instock.core.stockfetch import fetch_stock_top_entity_data\n\n__author__ = 'myh '\n__date__ = '2023/3/10 '\n\n\ndef prepare(date, strategy):\n    try:\n        stocks_data = stock_hist_data(date=date).get_data()\n        if stocks_data is None:\n            return\n        table_name = strategy['name']\n        strategy_func = strategy['func']\n        results = run_check(strategy_func, table_name, stocks_data, date)\n        if results is None:\n            return\n\n        # 删除老数据。\n        if mdb.checkTableIsExist(table_name):\n            del_sql = f\"DELETE FROM `{table_name}` where `date` = '{date}'\"\n            mdb.executeSql(del_sql)\n            cols_type = None\n        else:\n            cols_type = tbs.get_field_types(tbs.TABLE_CN_STOCK_STRATEGIES[0]['columns'])\n\n        data = pd.DataFrame(results)\n        columns = tuple(tbs.TABLE_CN_STOCK_FOREIGN_KEY['columns'])\n        data.columns = columns\n        _columns_backtest = tuple(tbs.TABLE_CN_STOCK_BACKTEST_DATA['columns'])\n        data = pd.concat([data, pd.DataFrame(columns=_columns_backtest)])\n        # 单例，时间段循环必须改时间\n        date_str = date.strftime(\"%Y-%m-%d\")\n        if date.strftime(\"%Y-%m-%d\") != data.iloc[0]['date']:\n            data['date'] = date_str\n        mdb.insert_db_from_df(data, table_name, cols_type, False, \"`date`,`code`\")\n\n    except Exception as e:\n        logging.error(f\"strategy_data_daily_job.prepare处理异常：{strategy}策略{e}\")\n\n\ndef run_check(strategy_fun, table_name, stocks, date, workers=40):\n    is_check_high_tight = False\n    if strategy_fun.__name__ == 'check_high_tight':\n        stock_tops = fetch_stock_top_entity_data(date)\n        if stock_tops is not None:\n            is_check_high_tight = True\n    data = []\n    try:\n        with concurrent.futures.ThreadPoolExecutor(max_workers=workers) as executor:\n            if is_check_high_tight:\n                future_to_data = {executor.submit(strategy_fun, k, stocks[k], date=date, istop=(k[1] in stock_tops)): k for k in stocks}\n            else:\n                future_to_data = {executor.submit(strategy_fun, k, stocks[k], date=date): k for k in stocks}\n            for future in concurrent.futures.as_completed(future_to_data):\n                stock = future_to_data[future]\n                try:\n                    if future.result():\n                        data.append(stock)\n                except Exception as e:\n                    logging.error(f\"strategy_data_daily_job.run_check处理异常：{stock[1]}代码{e}策略{table_name}\")\n    except Exception as e:\n        logging.error(f\"strategy_data_daily_job.run_check处理异常：{e}策略{table_name}\")\n    if not data:\n        return None\n    else:\n        return data\n\n\ndef main():\n    # 使用方法传递。\n    with concurrent.futures.ThreadPoolExecutor() as executor:\n        for strategy in tbs.TABLE_CN_STOCK_STRATEGIES:\n            executor.submit(runt.run_with_args, prepare, strategy)\n\n\n# main函数入口\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "instock/trade/.gitignore",
    "content": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\ncover/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\n.pybuilder/\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# IPython\nprofile_default/\nipython_config.py\n\n# pyenv\n#   For a library or package, you might want to ignore these files since the code is\n#   intended to run in multiple environments; otherwise, check them in:\n# .python-version\n\n# pipenv\n#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.\n#   However, in case of collaboration, if having platform-specific dependencies or dependencies\n#   having no cross-platform support, pipenv may install dependencies that don't work, or not\n#   install all needed dependencies.\n#Pipfile.lock\n\n# poetry\n#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.\n#   This is especially recommended for binary packages to ensure reproducibility, and is more\n#   commonly ignored for libraries.\n#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control\n#poetry.lock\n\n# pdm\n#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.\n#pdm.lock\n#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it\n#   in version control.\n#   https://pdm.fming.dev/#use-with-ide\n.pdm.toml\n\n# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm\n__pypackages__/\n\n# Celery stuff\ncelerybeat-schedule\ncelerybeat.pid\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n.dmypy.json\ndmypy.json\n\n# Pyre type checker\n.pyre/\n\n# pytype static type analyzer\n.pytype/\n\n# Cython debug symbols\ncython_debug/\n\n# PyCharm\n#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can\n#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore\n#  and can be added to the global gitignore or merged into this file.  For a more nuclear\n#  option (not recommended) you can uncomment the following to ignore the entire idea folder.\n.idea/\n"
  },
  {
    "path": "instock/trade/__init__.py",
    "content": ""
  },
  {
    "path": "instock/trade/robot/.gitignore",
    "content": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\ncover/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\n.pybuilder/\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# IPython\nprofile_default/\nipython_config.py\n\n# pyenv\n#   For a library or package, you might want to ignore these files since the code is\n#   intended to run in multiple environments; otherwise, check them in:\n# .python-version\n\n# pipenv\n#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.\n#   However, in case of collaboration, if having platform-specific dependencies or dependencies\n#   having no cross-platform support, pipenv may install dependencies that don't work, or not\n#   install all needed dependencies.\n#Pipfile.lock\n\n# poetry\n#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.\n#   This is especially recommended for binary packages to ensure reproducibility, and is more\n#   commonly ignored for libraries.\n#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control\n#poetry.lock\n\n# pdm\n#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.\n#pdm.lock\n#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it\n#   in version control.\n#   https://pdm.fming.dev/#use-with-ide\n.pdm.toml\n\n# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm\n__pypackages__/\n\n# Celery stuff\ncelerybeat-schedule\ncelerybeat.pid\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n.dmypy.json\ndmypy.json\n\n# Pyre type checker\n.pyre/\n\n# pytype static type analyzer\n.pytype/\n\n# Cython debug symbols\ncython_debug/\n\n# PyCharm\n#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can\n#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore\n#  and can be added to the global gitignore or merged into this file.  For a more nuclear\n#  option (not recommended) you can uncomment the following to ignore the entire idea folder.\n.idea/\n"
  },
  {
    "path": "instock/trade/robot/__init__.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\n__author__ = 'myh '\n__date__ = '2023/4/13 '\n"
  },
  {
    "path": "instock/trade/robot/engine/.gitignore",
    "content": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\ncover/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\n.pybuilder/\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# IPython\nprofile_default/\nipython_config.py\n\n# pyenv\n#   For a library or package, you might want to ignore these files since the code is\n#   intended to run in multiple environments; otherwise, check them in:\n# .python-version\n\n# pipenv\n#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.\n#   However, in case of collaboration, if having platform-specific dependencies or dependencies\n#   having no cross-platform support, pipenv may install dependencies that don't work, or not\n#   install all needed dependencies.\n#Pipfile.lock\n\n# poetry\n#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.\n#   This is especially recommended for binary packages to ensure reproducibility, and is more\n#   commonly ignored for libraries.\n#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control\n#poetry.lock\n\n# pdm\n#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.\n#pdm.lock\n#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it\n#   in version control.\n#   https://pdm.fming.dev/#use-with-ide\n.pdm.toml\n\n# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm\n__pypackages__/\n\n# Celery stuff\ncelerybeat-schedule\ncelerybeat.pid\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n.dmypy.json\ndmypy.json\n\n# Pyre type checker\n.pyre/\n\n# pytype static type analyzer\n.pytype/\n\n# Cython debug symbols\ncython_debug/\n\n# PyCharm\n#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can\n#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore\n#  and can be added to the global gitignore or merged into this file.  For a more nuclear\n#  option (not recommended) you can uncomment the following to ignore the entire idea folder.\n.idea/\n"
  },
  {
    "path": "instock/trade/robot/engine/__init__.py",
    "content": ""
  },
  {
    "path": "instock/trade/robot/engine/clock_engine.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\nimport datetime\nfrom collections import deque\nfrom threading import Thread\nimport arrow\nfrom dateutil import tz\nimport time\nimport instock.lib.trade_time as etime\nfrom instock.trade.robot.engine.event_engine import Event\n\n__author__ = 'myh '\n__date__ = '2023/4/10 '\n\n\nclass Clock:\n    def __init__(self, trading_time, clock_event):\n        self.trading_state = trading_time\n        self.clock_event = clock_event\n\n\nclass ClockIntervalHandler:\n    def __init__(self, clock_engine, interval, trading=True, call=None):\n        \"\"\"\n        :param interval: float(minute)\n        :param trading: 在交易阶段才触发\n        :return:\n        \"\"\"\n        self.clock_engine = clock_engine\n        self.clock_type = interval\n        self.interval = interval\n        self.second = int(interval * 60)\n        self.trading = trading\n        self.call = call or (lambda: None)\n\n    def is_active(self):\n        if self.trading:\n            if not self.clock_engine.trading_state:\n                return False\n        return int(self.clock_engine.now) % self.second == 0\n\n    def __eq__(self, other):\n        if isinstance(other, ClockIntervalHandler):\n            return self.interval == other.interval\n        else:\n            return False\n\n    def __hash__(self):\n        return self.second\n\n\nclass ClockMomentHandler:\n    def __init__(self, clock_engine, clock_type, moment=None, is_trading_date=True, makeup=False, call=None):\n        \"\"\"\n        :param clock_type:\n        :param moment: datetime.time\n        :param is_trading_date: bool(是否只有在交易日触发)\n        :param makeup: 注册时,如果已经过了触发时机,是否立即触发\n        :return:\n        \"\"\"\n        self.clock_engine = clock_engine\n        self.clock_type = clock_type\n        self.moment = moment\n        self.is_trading_date = is_trading_date\n        self.makeup = makeup\n        self.call = call or (lambda: None)\n        self.next_time = datetime.datetime.combine(\n            self.clock_engine.now_dt.date(),\n            self.moment,\n        )\n\n        if not self.makeup and self.is_active():\n            self.update_next_time()\n\n    def update_next_time(self):\n        \"\"\"\n        下次激活时间\n        :return:\n        \"\"\"\n        if self.is_active():\n            if self.is_trading_date:\n                next_date = etime.get_next_trade_date(self.clock_engine.now_dt.date())\n            else:\n                next_date = self.next_time.date() + datetime.timedelta(days=1)\n\n            self.next_time = datetime.datetime.combine(\n                next_date,\n                self.moment\n            )\n\n    def is_active(self):\n        if self.is_trading_date and not etime.is_trade_date(self.clock_engine.now_dt.date()):\n            # 仅在交易日触发时的判断\n            return False\n        return self.next_time <= self.clock_engine.now_dt\n\n\nclass ClockEngine:\n    \"\"\"\n    时间推送引擎\n    1. 提供统一的 now 时间戳.\n    \"\"\"\n    EventType = 'clock_tick'\n\n    def __init__(self, event_engine, tzinfo=None):\n        \"\"\"\n        :param event_engine:\n        :param event_engine: tzinfo\n        :return:\n        \"\"\"\n        # 默认使用当地时间的时区\n        self.tzinfo = tzinfo or tz.tzlocal()\n\n        self.event_engine = event_engine\n        self.is_active = True\n        self.clock_engine_thread = Thread(target=self.clocktick, name=\"ClockEngine.clocktick\")\n        self.sleep_time = 1\n        self.trading_state = True if (etime.is_tradetime(datetime.datetime.now()) and etime.is_trade_date(\n            datetime.datetime.now().date())) else False\n        self.clock_moment_handlers = deque()\n        self.clock_interval_handlers = set()\n\n        self._init_clock_handler()\n\n    def _init_clock_handler(self):\n        \"\"\"\n        注册默认的时钟事件\n        :return:\n        \"\"\"\n\n        # 开盘事件\n        def _open():\n            self.trading_state = True\n\n        self._register_moment('open', datetime.time(9, tzinfo=self.tzinfo), makeup=True, call=_open)\n\n        # 中午休市\n        self._register_moment('pause', datetime.time(11, 30, tzinfo=self.tzinfo), makeup=True)\n\n        # 下午开盘\n        self._register_moment('continue', datetime.time(13, tzinfo=self.tzinfo), makeup=True)\n\n        # 收盘事件\n        def close():\n            self.trading_state = False\n\n        self._register_moment('close', datetime.time(15, tzinfo=self.tzinfo), makeup=True, call=close)\n\n        # 间隔事件\n        for interval in (0.5, 1, 5, 15, 30, 60):\n            self.register_interval(interval)\n\n    @property\n    def now(self):\n        \"\"\"\n        now 时间戳统一接口\n        :return:\n        \"\"\"\n        return time.time()\n\n    @property\n    def now_dt(self):\n        \"\"\"\n        :return: datetime 类型, 带时区的时间戳.建议使用 arrow 库\n        \"\"\"\n        return arrow.get(self.now).to(self.tzinfo)\n\n    def start(self):\n        self.clock_engine_thread.start()\n\n    def clocktick(self):\n        while self.is_active:\n            self.tock()\n            time.sleep(self.sleep_time)\n\n    def tock(self):\n        if not etime.is_trade_date(self.now_dt.date()):\n            pass  # 假日暂停时钟引擎\n        else:\n            self._tock()\n\n    def _tock(self):\n        # 间隔事件\n        for handler in self.clock_interval_handlers:\n            if handler.is_active():\n                handler.call()\n                self.push_event_type(handler)\n        # 时刻事件\n        while self.clock_moment_handlers:\n            clock_handler = self.clock_moment_handlers.pop()\n            if clock_handler.is_active():\n                clock_handler.call()\n                self.push_event_type(clock_handler)\n                clock_handler.update_next_time()\n                self.clock_moment_handlers.appendleft(clock_handler)\n            else:\n                self.clock_moment_handlers.append(clock_handler)\n                break\n\n    def push_event_type(self, clock_handler):\n        event = Event(event_type=self.EventType, data=Clock(self.trading_state, clock_handler.clock_type))\n        self.event_engine.put(event)\n\n    def stop(self):\n        self.is_active = False\n\n    def is_tradetime_now(self):\n        return etime.is_tradetime(self.now_dt)\n\n    def register_moment(self, clock_type, moment, makeup=False):\n        return self._register_moment(clock_type, moment, makeup=makeup)\n\n    def _register_moment(self, clock_type, moment, is_trading_date=True, makeup=False, call=None):\n        handlers = list(self.clock_moment_handlers)\n        handler = ClockMomentHandler(self, clock_type, moment, is_trading_date, makeup, call)\n        handlers.append(handler)\n\n        # 触发事件重新排序\n        handlers.sort(key=lambda h: h.next_time, reverse=True)\n        self.clock_moment_handlers = deque(handlers)\n        return handler\n\n    def register_interval(self, interval_minute, trading=True):\n        return self._register_interval(interval_minute, trading)\n\n    def _register_interval(self, interval_minute, trading=True, call=None):\n        handler = ClockIntervalHandler(self, interval_minute, trading, call)\n        self.clock_interval_handlers.add(handler)\n        return handler\n"
  },
  {
    "path": "instock/trade/robot/engine/event_engine.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\n\nfrom collections import defaultdict\nfrom queue import Queue, Empty\nfrom threading import Thread\n\n__author__ = 'myh '\n__date__ = '2023/4/10 '\n\n\nclass Event:\n    def __init__(self, event_type, data=None):\n        self.event_type = event_type\n        self.data = data\n\n\nclass EventEngine:\n    \"\"\"事件驱动引擎\"\"\"\n\n    def __init__(self):\n        \"\"\"初始化事件引擎\"\"\"\n        # 事件队列\n        self.__queue = Queue()\n\n        # 事件引擎开关\n        self.__active = False\n\n        # 事件引擎处理线程\n        self.__thread = Thread(target=self.__run, name=\"EventEngine.__thread\")\n\n        # 事件字典，key 为时间， value 为对应监听事件函数的列表\n        self.__handlers = defaultdict(list)\n\n    def __run(self):\n        \"\"\"启动引擎\"\"\"\n        while self.__active:\n            try:\n                event = self.__queue.get(block=True, timeout=1)\n                handle_thread = Thread(target=self.__process, name=\"EventEngine.__process\", args=(event,))\n                handle_thread.start()\n            except Empty:\n                pass\n\n    def __process(self, event):\n        \"\"\"事件处理\"\"\"\n        # 检查该事件是否有对应的处理函数\n        if event.event_type in self.__handlers:\n            # 若存在,则按顺序将时间传递给处理函数执行\n            for handler in self.__handlers[event.event_type]:\n                handler(event)\n\n    def start(self):\n        \"\"\"引擎启动\"\"\"\n        self.__active = True\n        self.__thread.start()\n\n    def stop(self):\n        \"\"\"停止引擎\"\"\"\n        self.__active = False\n        self.__thread.join()\n\n    def register(self, event_type, handler):\n        \"\"\"注册事件处理函数监听\"\"\"\n        if handler not in self.__handlers[event_type]:\n            self.__handlers[event_type].append(handler)\n\n    def unregister(self, event_type, handler):\n        \"\"\"注销事件处理函数\"\"\"\n        handler_list = self.__handlers.get(event_type)\n        if handler_list is None:\n            return\n        if handler in handler_list:\n            handler_list.remove(handler)\n        if len(handler_list) == 0:\n            self.__handlers.pop(event_type)\n\n    def put(self, event):\n        self.__queue.put(event)\n\n    @property\n    def queue_size(self):\n        return self.__queue.qsize()\n"
  },
  {
    "path": "instock/trade/robot/engine/main_engine.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\nimport importlib\nimport os\nimport pathlib\nimport signal\nimport sys\nimport threading\nimport time\nfrom collections import OrderedDict\nfrom threading import Thread, Lock\nimport easytrader\nfrom instock.trade.robot.engine.event_engine import EventEngine\nfrom instock.trade.robot.engine.clock_engine import ClockEngine\nfrom instock.trade.robot.infrastructure.default_handler import DefaultLogHandler\n\n__author__ = 'myh '\n__date__ = '2023/4/10 '\n\n\nclass MainEngine:\n    \"\"\"主引擎，负责行情 / 事件驱动引擎 / 交易\"\"\"\n\n    def __init__(self, broker=None, need_data=None, log_handler=DefaultLogHandler(), tzinfo=None):\n        \"\"\"初始化事件 / 行情 引擎并启动事件引擎\n        \"\"\"\n        self.log = log_handler\n        self.broker = broker\n\n        # 登录账户\n        if (broker is not None) and (need_data is not None):\n            self.user = easytrader.use(broker)\n            need_data_file = pathlib.Path(need_data)\n            if need_data_file.exists():\n                self.user.prepare(need_data)\n            else:\n                self.log.warn(\"券商账号信息文件 %s 不存在, easytrader 将不可用\" % need_data)\n        else:\n            self.user = None\n            self.log.info('选择了无交易模式')\n\n        self.event_engine = EventEngine()\n        self.clock_engine = ClockEngine(self.event_engine, tzinfo)\n\n        # 保存读取的策略类\n        self.strategies = OrderedDict()\n        self.strategy_list = list()\n\n        # 是否要动态重载策略\n        self.is_watch_strategy = False\n        # 修改时间缓存\n        self._cache = {}\n        # # 文件进程映射\n        # self._process_map = {}\n        # 文件模块映射\n        self._modules = {}\n        self._names = None\n        # 加载锁\n        self.lock = Lock()\n        # 加载线程\n        self._watch_thread = Thread(target=self._load_strategy, name=\"MainEngine.watch_reload_strategy\")\n\n        # shutdown 函数\n        self.before_shutdown = []  # 关闭引擎前的 shutdown\n        self.main_shutdown = []  # 引擎自身要执行的 shutdown\n        self.after_shutdown = []  # 关闭引擎后的 shutdown\n        self.shutdown_signals = [\n            signal.SIGINT,  # 键盘信号\n            signal.SIGTERM,  # kill 命令\n        ]\n        if sys.platform != 'win32':\n            self.shutdown_signals.extend([signal.SIGHUP, signal.SIGQUIT])\n\n        for s in self.shutdown_signals:\n            # 捕获退出信号后的要调用的,唯一的 shutdown 接口\n            signal.signal(s, self._shutdown)\n\n        self.log.info('启动主引擎')\n\n    def start(self):\n        \"\"\"启动主引擎\"\"\"\n        self.event_engine.start()\n        self._add_main_shutdown(self.event_engine.stop)\n\n        self.log.warn(\"sleep 10s 等待账户加载\")\n        time.sleep(10)\n\n        self.clock_engine.start()\n        self._add_main_shutdown(self.clock_engine.stop)\n\n    def load(self, names, strategy_file):\n        with self.lock:\n            mtime = os.path.getmtime(os.path.join('strategies', strategy_file))\n\n            # 是否需要重新加载\n            reload = False\n\n            strategy_module_name = os.path.basename(strategy_file)[:-3]\n            new_module = lambda strategy_module_name: importlib.import_module('.' + strategy_module_name, 'strategies')\n            strategy_module = self._modules.get(\n                strategy_file,  # 从缓存中获取 module 实例\n                new_module(strategy_module_name)  # 创建新的 module 实例\n            )\n\n            if self._cache.get(strategy_file, None) == mtime:\n                # 检查最后改动时间\n                return\n            elif self._cache.get(strategy_file, None) is not None:\n                # 注销策略的监听\n                old_strategy = self.get_strategy(strategy_module.Strategy.name)\n                if old_strategy is None:\n                    for s in self.strategy_list:\n                        print(s.name)\n                self.log.warn(u'卸载策略: %s' % old_strategy.name)\n                self.strategy_listen_event(old_strategy, \"unlisten\")\n                time.sleep(2)\n                reload = True\n            # 重新加载\n            if reload:\n                strategy_module = importlib.reload(strategy_module)\n\n            self._modules[strategy_file] = strategy_module\n\n            strategy_class = getattr(strategy_module, 'Strategy')\n            if names is None or strategy_class.name in names:\n                self.strategies[strategy_module_name] = strategy_class\n                # 缓存加载信息\n                new_strategy = strategy_class(user=self.user, log_handler=self.log, main_engine=self)\n                self.strategy_list.append(new_strategy)\n                self._cache[strategy_file] = mtime\n                self.strategy_listen_event(new_strategy, \"listen\")\n                self.log.info(u'加载策略: %s' % strategy_module_name)\n\n    def strategy_listen_event(self, strategy, _type=\"listen\"):\n        \"\"\"\n        所有策略要监听的事件都绑定到这里\n        :param strategy: Strategy()\n        :param _type: \"listen\" OR \"unlisten\"\n        :return:\n        \"\"\"\n        func = {\n            \"listen\": self.event_engine.register,\n            \"unlisten\": self.event_engine.unregister,\n        }.get(_type)\n\n        # 时钟事件\n        func(ClockEngine.EventType, strategy.clock)\n\n    def load_strategy(self, names=None):\n        \"\"\"动态加载策略\n        :param names: 策略名列表，元素为策略的 name 属性\"\"\"\n        s_folder = 'strategies'\n        self._names = names\n        strategies = os.listdir(s_folder)\n        strategies = filter(lambda file: file.endswith('.py') and file != '__init__.py', strategies)\n        importlib.import_module(s_folder)\n        for strategy_file in strategies:\n            self.load(self._names, strategy_file)\n        # 如果线程没有启动，就启动策略监视线程\n        if self.is_watch_strategy and not self._watch_thread.is_alive():\n            self.log.warn(\"启用了动态加载策略功能\")\n            self._watch_thread.start()\n\n    def _load_strategy(self):\n        while True:\n            try:\n                self.load_strategy(self._names)\n                time.sleep(2)\n            except Exception as e:\n                print(e)\n\n    def get_strategy(self, name):\n        for strategy in self.strategy_list:\n            if strategy.name == name:\n                return strategy\n        return None\n\n    def add_before_shutdown(self, shutdown):\n\n        if not hasattr(shutdown, \"__call__\"):\n            n = shutdown.__name__ if hasattr(shutdown, \"__name__\") else str(shutdown)\n            raise ValueError(\"%s 不是可调用对象 \" % n)\n\n        self.before_shutdown.append(shutdown)\n\n    def add_after_shutdown(self, shutdown):\n        if not hasattr(shutdown, \"__call__\"):\n            n = shutdown.__name__ if hasattr(shutdown, \"__name__\") else str(shutdown)\n            raise ValueError(\"%s 不是可调用对象 \" % n)\n\n        self.after_shutdown.append(shutdown)\n\n    def _add_main_shutdown(self, shutdown):\n        if not hasattr(shutdown, \"__call__\"):\n            n = shutdown.__name__ if hasattr(shutdown, \"__name__\") else str(shutdown)\n            raise ValueError(\"%s 不是可调用对象 \" % n)\n\n        self.main_shutdown.append(shutdown)\n\n    def _shutdown(self, sig, frame):\n        \"\"\"\n        关闭进程前的处理\n        :return:\n        \"\"\"\n        self.log.debug(\"开始关闭进程...\")\n        # 所有 shutdown 前的触发点\n        for st in self.before_shutdown:\n            st()\n\n        # 引擎自身的 shutdown\n        for st in self.main_shutdown:\n            st()\n\n        # 等待所有线程关闭, 直到只留下主线程\n        c = threading.active_count()\n        while threading.active_count() != c:\n            time.sleep(2)\n\n        # 调用策略的 shutdown\n        self.log.debug(\"开始关闭策略...\")\n        for s in self.strategy_list:\n            s.shutdown()\n\n        # 所有 shutdown 后的触发点\n        for st in self.after_shutdown:\n            st()\n\n        # 退出\n        time.sleep(.1)\n        sys.exit(1)\n"
  },
  {
    "path": "instock/trade/robot/infrastructure/.gitignore",
    "content": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\ncover/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\n.pybuilder/\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# IPython\nprofile_default/\nipython_config.py\n\n# pyenv\n#   For a library or package, you might want to ignore these files since the code is\n#   intended to run in multiple environments; otherwise, check them in:\n# .python-version\n\n# pipenv\n#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.\n#   However, in case of collaboration, if having platform-specific dependencies or dependencies\n#   having no cross-platform support, pipenv may install dependencies that don't work, or not\n#   install all needed dependencies.\n#Pipfile.lock\n\n# poetry\n#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.\n#   This is especially recommended for binary packages to ensure reproducibility, and is more\n#   commonly ignored for libraries.\n#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control\n#poetry.lock\n\n# pdm\n#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.\n#pdm.lock\n#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it\n#   in version control.\n#   https://pdm.fming.dev/#use-with-ide\n.pdm.toml\n\n# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm\n__pypackages__/\n\n# Celery stuff\ncelerybeat-schedule\ncelerybeat.pid\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n.dmypy.json\ndmypy.json\n\n# Pyre type checker\n.pyre/\n\n# pytype static type analyzer\n.pytype/\n\n# Cython debug symbols\ncython_debug/\n\n# PyCharm\n#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can\n#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore\n#  and can be added to the global gitignore or merged into this file.  For a more nuclear\n#  option (not recommended) you can uncomment the following to ignore the entire idea folder.\n.idea/\n"
  },
  {
    "path": "instock/trade/robot/infrastructure/__init__.py",
    "content": ""
  },
  {
    "path": "instock/trade/robot/infrastructure/default_handler.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\nimport os\nimport sys\nimport logbook\nfrom logbook import Logger, StreamHandler, FileHandler\n\n__author__ = 'myh '\n__date__ = '2023/4/10 '\n\nlogbook.set_datetime_format('local')\n\n\nclass DefaultLogHandler(object):\n    \"\"\"默认的 Log 类\"\"\"\n\n    def __init__(self, name='default', log_type='stdout', filepath='default.log', loglevel='DEBUG'):\n        \"\"\"Log对象\n        :param name: log 名字\n        :param :logtype: 'stdout' 输出到屏幕, 'file' 输出到指定文件\n        :param :filename: log 文件名\n        :param :loglevel: 设定log等级 ['CRITICAL', 'ERROR', 'WARNING', 'NOTICE', 'INFO', 'DEBUG', 'TRACE', 'NOTSET']\n        :return log handler object\n        \"\"\"\n        self.log = Logger(name)\n        if log_type == 'stdout':\n            StreamHandler(sys.stdout, level=loglevel).push_application()\n        if log_type == 'file':\n            if os.path.isdir(filepath) and not os.path.exists(filepath):\n                os.makedirs(os.path.dirname(filepath))\n            file_handler = FileHandler(filepath, level=loglevel)\n            self.log.handlers.append(file_handler)\n\n    def __getattr__(self, item, *args, **kwargs):\n        return self.log.__getattribute__(item, *args, **kwargs)\n"
  },
  {
    "path": "instock/trade/robot/infrastructure/strategy_template.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\n\n__author__ = 'myh '\n__date__ = '2023/4/10 '\n\n\nclass StrategyTemplate:\n    name = 'DefaultStrategyTemplate'\n\n    def __init__(self, user, log_handler, main_engine):\n        self.user = user\n        self.main_engine = main_engine\n        self.clock_engine = main_engine.clock_engine\n        # 优先使用自定义 log 句柄, 否则使用主引擎日志句柄\n        self.log = self.log_handler() or log_handler\n        self.init()\n\n    def init(self):\n        # 进行相关的初始化操作\n        pass\n\n    def strategy(self):\n        pass\n\n    def clock(self, event):\n        pass\n\n    def log_handler(self):\n        \"\"\"\n        优先使用在此自定义 log 句柄, 否则返回None, 并使用主引擎日志句柄\n        :return: log_handler or None\n        \"\"\"\n        return None\n\n    def shutdown(self):\n        \"\"\"\n        关闭进程前调用该函数\n        :return:\n        \"\"\"\n        pass\n"
  },
  {
    "path": "instock/trade/robot/infrastructure/strategy_wrapper.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\n\nimport multiprocessing as mp\nfrom threading import Thread\n\n__author__ = 'myh '\n__date__ = '2023/4/10 '\n\n\nclass ProcessWrapper(object):\n    def __init__(self, strategy):\n        self.__strategy = strategy\n        # 时钟队列\n        self.__clock_queue = mp.Queue(10000)\n        # 包装进程\n        self.__proc = mp.Process(target=self._process)\n        self.__proc.start()\n\n    def stop(self):\n        self.__clock_queue.put(0)\n        self.__proc.join()\n\n    def on_clock(self, event):\n        self.__clock_queue.put(event)\n\n    def _process_clock(self):\n        while True:\n\n            try:\n                event = self.__clock_queue.get(block=True)\n                # 退出\n                if event == 0:\n                    break\n                self.__strategy.clock(event)\n            except:\n                pass\n\n    def _process(self):\n        clock_thread = Thread(target=self._process_clock, name=\"ProcessWrapper._process_clock\")\n        clock_thread.start()\n\n        clock_thread.join()\n"
  },
  {
    "path": "instock/trade/strategies/.gitignore",
    "content": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\ncover/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\n.pybuilder/\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# IPython\nprofile_default/\nipython_config.py\n\n# pyenv\n#   For a library or package, you might want to ignore these files since the code is\n#   intended to run in multiple environments; otherwise, check them in:\n# .python-version\n\n# pipenv\n#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.\n#   However, in case of collaboration, if having platform-specific dependencies or dependencies\n#   having no cross-platform support, pipenv may install dependencies that don't work, or not\n#   install all needed dependencies.\n#Pipfile.lock\n\n# poetry\n#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.\n#   This is especially recommended for binary packages to ensure reproducibility, and is more\n#   commonly ignored for libraries.\n#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control\n#poetry.lock\n\n# pdm\n#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.\n#pdm.lock\n#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it\n#   in version control.\n#   https://pdm.fming.dev/#use-with-ide\n.pdm.toml\n\n# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm\n__pypackages__/\n\n# Celery stuff\ncelerybeat-schedule\ncelerybeat.pid\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n.dmypy.json\ndmypy.json\n\n# Pyre type checker\n.pyre/\n\n# pytype static type analyzer\n.pytype/\n\n# Cython debug symbols\ncython_debug/\n\n# PyCharm\n#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can\n#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore\n#  and can be added to the global gitignore or merged into this file.  For a more nuclear\n#  option (not recommended) you can uncomment the following to ignore the entire idea folder.\n.idea/\n"
  },
  {
    "path": "instock/trade/strategies/__init__.py",
    "content": ""
  },
  {
    "path": "instock/trade/strategies/stagging.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\nimport os.path\nimport datetime as dt\nfrom dateutil import tz\nfrom instock.trade.robot.infrastructure.default_handler import DefaultLogHandler\nfrom instock.trade.robot.infrastructure.strategy_template import StrategyTemplate\n\n__author__ = 'myh '\n__date__ = '2023/4/10 '\n\n\nclass Strategy(StrategyTemplate):\n    name = 'stagging'\n\n    def init(self):\n        # 通过下面的方式来获取时间戳\n        # now_dt = self.clock_engine.now_dt\n        # now = self.clock_engine.now\n        # now = time.time()\n\n        # 注册时钟事件\n        clock_type = self.name\n        moment = dt.time(10, 0, 0, tzinfo=tz.tzlocal())\n        self.clock_engine.register_moment(clock_type, moment)\n\n        # 注册时钟间隔事件, 不在交易阶段也会触发, clock_type == minute_interval\n        minute_interval = 1.5\n        self.clock_engine.register_interval(minute_interval, trading=False)\n\n    def strategy(self):\n        self.log.info('打新股')\n        self.user.auto_ipo()\n\n    def clock(self, event):\n        \"\"\"在交易时间会定时推送 clock 事件\n        :param event: event.data.clock_event 为 [0.5, 1, 3, 5, 15, 30, 60] 单位为分钟,  ['open', 'close'] 为开市、收市\n            event.data.trading_state  bool 是否处于交易时间\n        \"\"\"\n        if event.data.clock_event == self.name:\n            self.strategy()\n\n    def log_handler(self):\n        \"\"\"自定义 log 记录方式\"\"\"\n        cpath_current = os.path.dirname(os.path.dirname(__file__))\n        cpath = os.path.abspath(os.path.join(cpath_current, os.pardir))\n        log_filepath = os.path.join(cpath, 'log', f'{self.name}.log')\n        return DefaultLogHandler(self.name, log_type='file', filepath=log_filepath)\n\n    def shutdown(self):\n        \"\"\"\n        关闭进程前的调用\n        :return:\n        \"\"\"\n        self.log.info(\"假装在关闭前保存了策略数据\")\n"
  },
  {
    "path": "instock/trade/strategies/stratey1.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\nimport os.path\nimport datetime as dt\nfrom dateutil import tz\nfrom instock.trade.robot.infrastructure.default_handler import DefaultLogHandler\nfrom instock.trade.robot.infrastructure.strategy_template import StrategyTemplate\n\n__author__ = 'myh '\n__date__ = '2023/4/10 '\n\n\nclass Strategy(StrategyTemplate):\n    name = 'stratey1'\n\n    def init(self):\n        # 通过下面的方式来获取时间戳\n        # now_dt = self.clock_engine.now_dt\n        # now = self.clock_engine.now\n        # now = time.time()\n\n        # 注册时钟事件\n        clock_type = self.name\n        moment = dt.time(14, 54, 30, tzinfo=tz.tzlocal())\n        self.clock_engine.register_moment(clock_type, moment)\n\n        # 注册时钟间隔事件, 不在交易阶段也会触发, clock_type == minute_interval\n        minute_interval = 1.5\n        self.clock_engine.register_interval(minute_interval, trading=False)\n\n    def strategy(self):\n        buy_stock = [('000001', 1, 100)]\n        sell_stock = [('000001', 100, 100)]\n        # --------写交易策略---------\n\n        # --------写交易策略---------\n        for buy in buy_stock:\n            self.user.buy(buy[0], price=buy[1], amount=buy[3])\n        for sell in sell_stock:\n            self.user.sell(sell[0], price=sell[1], amount=sell[3])\n\n        self.log.info('检查持仓')\n        self.log.info(self.user.balance)\n        self.log.info('\\n')\n\n    def clock(self, event):\n        \"\"\"在交易时间会定时推送 clock 事件\n        :param event: event.data.clock_event 为 [0.5, 1, 3, 5, 15, 30, 60] 单位为分钟,  ['open', 'close'] 为开市、收市\n            event.data.trading_state  bool 是否处于交易时间\n        \"\"\"\n        if event.data.clock_event == self.name:\n            self.strategy()\n\n    def log_handler(self):\n        \"\"\"自定义 log 记录方式\"\"\"\n        cpath_current = os.path.dirname(os.path.dirname(__file__))\n        cpath = os.path.abspath(os.path.join(cpath_current, os.pardir))\n        log_filepath = os.path.join(cpath, 'log', f'{self.name}.log')\n        return DefaultLogHandler(self.name, log_type='file', filepath=log_filepath)\n\n    def shutdown(self):\n        \"\"\"\n        关闭进程前的调用\n        :return:\n        \"\"\"\n        self.log.info(\"假装在关闭前保存了策略数据\")\n"
  },
  {
    "path": "instock/trade/trade_service.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\nimport os.path\nimport sys\n# 在项目运行时，临时将项目路径添加到环境变量\ncpath_current = os.path.dirname(os.path.dirname(__file__))\ncpath = os.path.abspath(os.path.join(cpath_current, os.pardir))\nsys.path.append(cpath)\nneed_data = os.path.join(cpath_current, 'config', 'trade_client.json')\nlog_filepath = os.path.join(cpath_current, 'log', 'stock_trade.log')\nfrom instock.trade.robot.engine.main_engine import MainEngine\nfrom instock.trade.robot.infrastructure.default_handler import DefaultLogHandler\n\n__author__ = 'myh '\n__date__ = '2023/4/10 '\n\n\ndef main():\n    broker = 'gf_client'\n    log_handler = DefaultLogHandler(name='交易服务', log_type='file', filepath=log_filepath)\n    m = MainEngine(broker, need_data, log_handler)\n    m.is_watch_strategy = True  # 策略文件出现改动时,自动重载,不建议在生产环境下使用\n    m.load_strategy()\n    m.start()\n\n\n# main函数入口\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "instock/trade/usage.md",
    "content": "## 一、引入\n\n```python\nimport easytrader\n```\n\n## 二、设置交易客户端类型\n\n**海通客户端**\n\n```python\nuser = easytrader.use('htzq_client')\n```\n\n**华泰客户端**\n\n```python\nuser = easytrader.use('ht_client')\n```\n\n**国金客户端**\n\n```python\nuser = easytrader.use('gj_client') \n```\n\n**通用同花顺客户端**\n\n```python\nuser = easytrader.use('universal_client') \n```\n\n注: 通用同花顺客户端是指同花顺官网提供的客户端软件内的下单程序，内含对多个券商的交易支持，适用于券商不直接提供同花顺客户端时的后备方案。\n\n**其他券商专用同花顺客户端**\n\n```python\nuser = easytrader.use('ths')\n```\n\n注: 其他券商专用同花顺客户端是指对应券商官网提供的基于同花顺修改的软件版本，类似银河的双子星(同花顺版本)，国金证券网上交易独立下单程序（核新PC版）等。\n\n\n\n**雪球**\n\n```python\nuser = easytrader.use('xq')\n```\n\n\n## 三、启动并连接客户端\n\n### （一）其他券商专用同花顺客户端\n\n其他券商专用同花顺客户端不支持自动登录，需要先手动登录。\n\n请手动打开并登录客户端后，运用connect函数连接客户端。\n\n```python\nuser.connect(r'客户端xiadan.exe路径') # 类似 r'C:\\htzqzyb2\\xiadan.exe'\n```\n\n### （二）通用同花顺客户端\n\n需要先手动登录一次：添加券商，填入账户号、密码、验证码，勾选“保存密码”\n\n第一次登录后，上述信息被缓存，可以调用prepare函数自动登录（仅需账户号、客户端路径，密码随意输入）。\n\n### （三）其它\n\n非同花顺的客户端，可以调用prepare函数自动登录。\n\n调用prepare时所需的参数，可以通过`函数参数` 或 `配置文件` 赋予。\n\n**1. 函数参数(推荐)**\n\n```\nuser.prepare(user='用户名', password='雪球、银河客户端为明文密码', comm_password='华泰通讯密码，其他券商不用')\n```\n\n注: 雪球比较特殊，见下列配置文件格式\n\n**2. 配置文件**\n\n```python\nuser.prepare('/path/to/your/yh_client.json')  # 配置文件路径\n```\n\n注: 配置文件需自己用编辑器编辑生成, **请勿使用记事本**, 推荐使用 [notepad++](https://notepad-plus-plus.org/zh/) 或者 [sublime text](http://www.sublimetext.com/) 。\n\n**配置文件格式如下：**\n\n银河/国金客户端\n\n```\n{\n  \"user\": \"用户名\",\n  \"password\": \"明文密码\"\n}\n\n```\n\n华泰客户端\n\n```\n{\n  \"user\": \"华泰用户名\",\n  \"password\": \"华泰明文密码\",\n  \"comm_password\": \"华泰通讯密码\"\n}\n\n```\n\n雪球\n\n```\n{\n  \"cookies\": \"雪球 cookies，登陆后获取，获取方式见 https://smalltool.github.io/2016/08/02/cookie/\",\n  \"portfolio_code\": \"组合代码(例:ZH818559)\",\n  \"portfolio_market\": \"交易市场(例:us 或者 cn 或者 hk)\"\n}\n```\n\n## 四、交易相关\n\n### 1. 获取资金状况\n\n```python\nuser.balance\n```\n\n**return**\n```python\n[{'参考市值': 21642.0,\n  '可用资金': 28494.21,\n  '币种': '0',\n  '总资产': 50136.21,\n  '股份参考盈亏': -90.21,\n  '资金余额': 28494.21,\n  '资金帐号': 'xxx'}]\n```\n\n### 2. 获取持仓\n\n```python\nuser.position\n```\n\n**return**\n```python\n[{'买入冻结': 0,\n  '交易市场': '沪A',\n  '卖出冻结': '0',\n  '参考市价': 4.71,\n  '参考市值': 10362.0,\n  '参考成本价': 4.672,\n  '参考盈亏': 82.79,\n  '当前持仓': 2200,\n  '盈亏比例(%)': '0.81%',\n  '股东代码': 'xxx',\n  '股份余额': 2200,\n  '股份可用': 2200,\n  '证券代码': '601398',\n  '证券名称': '工商银行'}]\n```\n\n### 3. 买入\n\n```python\nuser.buy('162411', price=0.55, amount=100)\n```\n\n**return**\n\n```python\n{'entrust_no': 'xxxxxxxx'}\n```\n\n注: 系统可以配置是否返回成交回报。如果没配的话默认返回 `{\"message\": \"success\"}`\n\n### 4. 卖出\n\n```python\nuser.sell('162411', price=0.55, amount=100)\n```\n\n**return**\n\n```python\n{'entrust_no': 'xxxxxxxx'}\n```\n\n### 5. 一键打新\n\n```python\nuser.auto_ipo()\n```\n\n### 6. 撤单\n\n```python\nuser.cancel_entrust('buy/sell 获取的 entrust_no')\n```\n\n**return**\n\n```\n{'message': '撤单申报成功'}\n```\n\n\n### 7. 查询当日成交\n\n```python\nuser.today_trades\n```\n\n**return**\n\n```\n[{'买卖标志': '买入',\n  '交易市场': '深A',\n  '委托序号': '12345',\n  '成交价格': 0.626,\n  '成交数量': 100,\n  '成交日期': '20170313',\n  '成交时间': '09:50:30',\n  '成交金额': 62.60,\n  '股东代码': 'xxx',\n  '证券代码': '162411',\n  '证券名称': '华宝油气'}]\n```\n\n### 8. 查询当日委托\n\n```python\nuser.today_entrusts\n```\n\n**return**\n\n```\n[{'买卖标志': '买入',\n  '交易市场': '深A',\n  '委托价格': 0.627,\n  '委托序号': '111111',\n  '委托数量': 100,\n  '委托日期': '20170313',\n  '委托时间': '09:50:30',\n  '成交数量': 100,\n  '撤单数量': 0,\n  '状态说明': '已成',\n  '股东代码': 'xxxxx',\n  '证券代码': '162411',\n  '证券名称': '华宝油气'},\n {'买卖标志': '买入',\n  '交易市场': '深A',\n  '委托价格': 0.6,\n  '委托序号': '1111',\n  '委托数量': 100,\n  '委托日期': '20170313',\n  '委托时间': '09:40:30',\n  '成交数量': 0,\n  '撤单数量': 100,\n  '状态说明': '已撤',\n  '股东代码': 'xxx',\n  '证券代码': '162411',\n  '证券名称': '华宝油气'}]\n```\n\n\n### 9. 查询今日可申购新股\n\n```python\nfrom easytrader.utils.stock import get_today_ipo_data\nipo_data = get_today_ipo_data()\nprint(ipo_data)\n```\n\n**return**\n\n```python\n[{'stock_code': '股票代码',\n  'stock_name': '股票名称',\n  'price': 发行价,\n  'apply_code': '申购代码'}]\n```\n\n### 10. 刷新数据\n\n```\nuser.refresh()\n```\n\n### 11. 雪球组合比例调仓 ###\n\n```python\nuser.adjust_weight('股票代码', 目标比例)\n```\n\n例如，`user.adjust_weight('000001', 10)`是将平安银行在组合中的持仓比例调整到10%。\n\n## 五、退出客户端软件\n\n```python\nuser.exit()\n```\n\n## 六、远端服务器模式\n\n远端服务器模式是交易服务端和量化策略端分离的模式。\n\n**交易服务端**通常是有固定`IP`地址的云服务器，该服务器上运行着`easytrader`交易服务。而**量化策略端**可能是`JoinQuant、RiceQuant、Vn.Py`，物理上与交易服务端不在同一台电脑上。交易服务端被动或主动获取交易信号，并驱动**交易软件**（交易软件包括运行在同一服务器上的下单软件，比如同花顺`xiadan.exe`，或者运行在另一台服务器上的雪球`xq`）。\n\n远端模式下，`easytrader`交易服务通过以下两种方式获得交易信号并驱动交易软件：\n\n### (一) 被动接收远端量化策略发送的交易相关指令\n\n#### 交易服务端——启动服务\n\n```python\nfrom easytrader import server\n\nserver.run(port=1430) # 默认端口为 1430\n```\n\n#### 量化策略端——调用服务\n\n```python\nfrom easytrader import remoteclient\n\nuser = remoteclient.use('使用客户端类型，可选 yh_client, ht_client, ths, xq等', host='服务器ip', port='服务器端口，默认为1430')\n\nuser.buy(......)\n\nuser.sell(......)\n\n# 交易函数用法同上，见“四、交易相关”\n```\n\n### (二) 主动监控远端量化策略的成交记录或仓位变化 \n\n\n#### 1. 跟踪 `joinquant` / `ricequant`  的模拟交易\n\n##### 1) 初始化跟踪的 trader\n\n这里以雪球为例, 也可以使用银河之类 `easytrader` 支持的券商\n\n```\nxq_user = easytrader.use('xq')\nxq_user.prepare('xq.json')\n```\n\n##### 2) 初始化跟踪 `joinquant` / `ricequant` 的 follower\n\n```\ntarget = 'jq'  # joinquant\ntarget = 'rq'  # ricequant\nfollower = easytrader.follower(target)\nfollower.login(user='rq/jq用户名', password='rq/jq密码')\n```\n\n##### 3) 连接 follower 和 trader\n\n##### joinquant\n```\nfollower.follow(xq_user, 'jq的模拟交易url')\n```\n\n注: jq的模拟交易url指的是对应模拟交易对应的可以查看持仓, 交易记录的页面, 类似 `https://www.joinquant.com/algorithm/live/index?backtestId=xxx`\n\n正常会输出\n\n![enjoy it](https://raw.githubusercontent.com/shidenggui/assets/master/easytrader/joinquant.jpg)\n\n注: 启动后发现跟踪策略无输出，那是因为今天模拟交易没有调仓或者接收到的调仓信号过期了，默认只处理120s内的信号，想要测试的可以用下面的命令：\n\n```python\njq_follower.follow(user, '模拟交易url',\n          trade_cmd_expire_seconds=100000000000, cmd_cache=False)\n```\n\n- trade_cmd_expire_seconds 默认处理多少秒内的信号\n\n- cmd_cache 是否读取已经执行过的命令缓存，以防止重复执行\n\n目录下产生的 cmd_cache.pk，是用来存储历史执行过的交易指令，防止在重启程序时重复执行交易过的指令，可以通过 `follower.follow(xxx, cmd_cache=False)` 来关闭。\n\n##### ricequant\n\n```\nfollower.follow(xq_user, run_id)\n```\n注：ricequant的run_id即PT列表中的ID。\n\n\n#### 2. 跟踪雪球的组合\n\n##### 1) 初始化跟踪的 trader\n\n同上\n\n##### 2) 初始化跟踪 雪球组合 的 follower\n\n```\nxq_follower = easytrader.follower('xq')\nxq_follower.login(cookies='雪球 cookies，登陆后获取，获取方式见 https://smalltool.github.io/2016/08/02/cookie/')\n```\n\n##### 3) 连接 follower 和 trader\n\n```\nxq_follower.follow(xq_user, 'xq组合ID，类似ZH123456', total_assets=100000)\n```\n\n\n注: 雪球组合是以百分比调仓的， 所以需要额外设置组合对应的资金额度\n\n* 这里可以设置 total_assets, 为当前组合的净值对应的总资金额度, 具体可以参考参数说明\n* 或者设置 initial_assets, 这时候总资金额度为 initial_assets * 组合净值\n\n* 雪球额外支持 adjust_sell 参数，决定是否根据用户的实际持仓数调整卖出股票数量，解决雪球根据百分比调仓时计算出的股数有偏差的问题。当卖出股票数大于实际持仓数时，调整为实际持仓数。目前仅在银河客户端测试通过。 当 users 为多个时，根据第一个 user 的持仓数决定\n\n\n#### 3. 多用户跟踪多策略\n\n```\nfollower.follow(users=[xq_user, yh_user], strategies=['组合1', '组合2'], total_assets=[10000, 10000])\n```\n\n#### 4. 其它与跟踪有关的问题\n\n使用市价单跟踪模式，目前仅支持银河\n\n```\nfollower.follow(***, entrust_prop='market')\n```\n\n调整下单间隔, 默认为0s。调大可防止卖出买入时卖出单没有及时成交导致的买入金额不足\n\n```\nfollower.follow(***, send_interval=30) # 设置下单间隔为 30 s\n```\n设置买卖时的滑点\n\n```\nfollower.follow(***, slippage=0.05) # 设置滑点为 5%\n```\n\n## 七、命令行模式\n\n#### 登录\n\n```\n python cli.py --use yh --prepare gf.json\n```\n\n注: 此时会生成 `account.session` 文件保存生成的 `user` 对象\n\n#### 获取余额 / 持仓 / 以及其他变量\n\n```\n python cli.py --get balance\n```\n\n#### 买卖 / 撤单\n\n```\n python cli.py --do buy 162411 0.450 100\n```\n#### 查看帮助\n\n```\n python cli.py --help\n```\n\n\n"
  },
  {
    "path": "instock/web/.gitignore",
    "content": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\ncover/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\n.pybuilder/\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# IPython\nprofile_default/\nipython_config.py\n\n# pyenv\n#   For a library or package, you might want to ignore these files since the code is\n#   intended to run in multiple environments; otherwise, check them in:\n# .python-version\n\n# pipenv\n#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.\n#   However, in case of collaboration, if having platform-specific dependencies or dependencies\n#   having no cross-platform support, pipenv may install dependencies that don't work, or not\n#   install all needed dependencies.\n#Pipfile.lock\n\n# poetry\n#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.\n#   This is especially recommended for binary packages to ensure reproducibility, and is more\n#   commonly ignored for libraries.\n#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control\n#poetry.lock\n\n# pdm\n#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.\n#pdm.lock\n#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it\n#   in version control.\n#   https://pdm.fming.dev/#use-with-ide\n.pdm.toml\n\n# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm\n__pypackages__/\n\n# Celery stuff\ncelerybeat-schedule\ncelerybeat.pid\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n.dmypy.json\ndmypy.json\n\n# Pyre type checker\n.pyre/\n\n# pytype static type analyzer\n.pytype/\n\n# Cython debug symbols\ncython_debug/\n\n# PyCharm\n#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can\n#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore\n#  and can be added to the global gitignore or merged into this file.  For a more nuclear\n#  option (not recommended) you can uncomment the following to ignore the entire idea folder.\n.idea/\n"
  },
  {
    "path": "instock/web/__init__.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\n__author__ = 'myh '\n__date__ = '2023/4/3 '\n"
  },
  {
    "path": "instock/web/base.py",
    "content": "#!/usr/local/bin/python3\n# -*- coding: utf-8 -*-\n\nfrom abc import ABC\nimport tornado.web\nimport instock.core.singleton_stock_web_module_data as sswmd\n\n__author__ = 'myh '\n__date__ = '2023/3/10 '\n\n\n# 基础handler，主要负责检查mysql的数据库链接。\nclass BaseHandler(tornado.web.RequestHandler, ABC):\n    @property\n    def db(self):\n        try:\n            # check every time。\n            self.application.db.query(\"SELECT 1 \")\n        except Exception as e:\n            print(e)\n            self.application.db.reconnect()\n        return self.application.db\n\n\nclass LeftMenu:\n    def __init__(self, url):\n        self.leftMenuList = sswmd.stock_web_module_data().get_data_list()\n        self.current_url = url\n\n\n# 获得左菜单。\ndef GetLeftMenu(url):\n    return LeftMenu(url)\n"
  },
  {
    "path": "instock/web/dataIndicatorsHandler.py",
    "content": "#!/usr/local/bin/python3\n# -*- coding: utf-8 -*-\n\nfrom abc import ABC\nfrom tornado import gen\nimport logging\nimport instock.core.stockfetch as stf\nimport instock.core.kline.visualization as vis\nimport instock.web.base as webBase\n\n__author__ = 'myh '\n__date__ = '2023/3/10 '\n\n\n# 获得页面数据。\nclass GetDataIndicatorsHandler(webBase.BaseHandler, ABC):\n    @gen.coroutine\n    def get(self):\n        code = self.get_argument(\"code\", default=None, strip=False)\n        date = self.get_argument(\"date\", default=None, strip=False)\n        name = self.get_argument(\"name\", default=None, strip=False)\n        comp_list = []\n        try:\n            if code.startswith(('1', '5')):\n                stock = stf.fetch_etf_hist((date, code))\n            else:\n                stock = stf.fetch_stock_hist((date, code))\n            if stock is None:\n                return\n\n            pk = vis.get_plot_kline(code, stock, date, name)\n            if pk is None:\n                return\n\n            comp_list.append(pk)\n        except Exception as e:\n            logging.error(f\"dataIndicatorsHandler.GetDataIndicatorsHandler处理异常：{e}\")\n\n        self.render(\"stock_indicators.html\", comp_list=comp_list,\n                    leftMenu=webBase.GetLeftMenu(self.request.uri))\n\n\n# 关注股票。\nclass SaveCollectHandler(webBase.BaseHandler, ABC):\n    @gen.coroutine\n    def get(self):\n        import datetime\n        import instock.core.tablestructure as tbs\n        code = self.get_argument(\"code\", default=None, strip=False)\n        otype = self.get_argument(\"otype\", default=None, strip=False)\n        try:\n            table_name = tbs.TABLE_CN_STOCK_ATTENTION['name']\n            if otype == '1':\n                # sql = f\"DELETE FROM `{table_name}` WHERE `code` = '{code}'\"\n                sql = f\"DELETE FROM `{table_name}` WHERE `code` = %s\"\n                self.db.query(sql,code)\n            else:\n                # sql = f\"INSERT INTO `{table_name}`(`datetime`, `code`) VALUE('{datetime.datetime.now()}','{code}')\"\n                sql = f\"INSERT INTO `{table_name}`(`datetime`, `code`) VALUE(%s, %s)\"\n                self.db.query(sql,datetime.datetime.now().strftime(\"%Y-%m-%d %H:%M:%S.%f\"),code)\n        except Exception as e:\n            err = {\"error\": str(e)}\n            # logging.info(err)\n            # self.write(err)\n            # return\n        self.write(\"{\\\"data\\\":[{}]}\")"
  },
  {
    "path": "instock/web/dataTableHandler.py",
    "content": "#!/usr/local/bin/python3\n# -*- coding: utf-8 -*-\n\n\nimport json\nfrom abc import ABC\nfrom tornado import gen\n# import logging\nimport datetime\nimport instock.lib.trade_time as trd\nimport instock.core.singleton_stock_web_module_data as sswmd\nimport instock.web.base as webBase\n\n__author__ = 'myh '\n__date__ = '2023/3/10 '\n\n\nclass MyEncoder(json.JSONEncoder):\n\n    def default(self, obj):\n        if isinstance(obj, bytes):\n            return \"是\" if ord(obj) == 1 else \"否\"\n        elif isinstance(obj, datetime.date):\n            delta = datetime.datetime.combine(obj, datetime.time.min) - datetime.datetime(1899, 12, 30)\n            return f'/OADate({float(delta.days) + (float(delta.seconds) / 86400)})/'  # 86,400 seconds in day\n            # return obj.isoformat()\n        else:\n            return json.JSONEncoder.default(self, obj)\n\n\n# 获得页面数据。\nclass GetStockHtmlHandler(webBase.BaseHandler, ABC):\n    @gen.coroutine\n    def get(self):\n        name = self.get_argument(\"table_name\", default=None, strip=False)\n        web_module_data = sswmd.stock_web_module_data().get_data(name)\n        run_date, run_date_nph = trd.get_trade_date_last()\n        if web_module_data.is_realtime:\n            date_now_str = run_date_nph.strftime(\"%Y-%m-%d\")\n        else:\n            date_now_str = run_date.strftime(\"%Y-%m-%d\")\n        self.render(\"stock_web.html\", web_module_data=web_module_data, date_now=date_now_str,\n                    leftMenu=webBase.GetLeftMenu(self.request.uri))\n\n\n# 获得股票数据内容。\nclass GetStockDataHandler(webBase.BaseHandler, ABC):\n    def get(self):\n        name = self.get_argument(\"name\", default=None, strip=False)\n        date = self.get_argument(\"date\", default=None, strip=False)\n        web_module_data = sswmd.stock_web_module_data().get_data(name)\n        self.set_header('Content-Type', 'application/json;charset=UTF-8')\n\n        if date is None:\n            where = \"\"\n        else:\n            # where = f\" WHERE `date` = '{date}'\"\n            where = f\" WHERE `date` = %s\"\n\n        order_by = \"\"\n        if web_module_data.order_by is not None:\n            order_by = f\" ORDER BY {web_module_data.order_by}\"\n\n        order_columns = \"\"\n        if web_module_data.order_columns is not None:\n            order_columns = f\",{web_module_data.order_columns}\"\n\n        sql = f\" SELECT *{order_columns} FROM `{web_module_data.table_name}`{where}{order_by}\"\n        data = self.db.query(sql,date)\n\n        self.write(json.dumps(data, cls=MyEncoder))\n"
  },
  {
    "path": "instock/web/static/css/bootstrap.min-3.4.1.css",
    "content": "/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}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}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}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{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;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-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}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{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:\" (\" attr(href) \")\"}abbr[title]:after{content:\" (\" attr(title) \")\"}a[href^=\"#\"]:after,a[href^=\"javascript:\"]:after{content:\"\"}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}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}}@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-style:normal;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{content:\"\\e227\"}.glyphicon-btc:before{content:\"\\e227\"}.glyphicon-xbt:before{content:\"\\e227\"}.glyphicon-yen:before{content:\"\\00a5\"}.glyphicon-jpy:before{content:\"\\00a5\"}.glyphicon-ruble:before{content:\"\\20bd\"}.glyphicon-rub: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\"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}: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;background-color:#fff}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:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.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;background-color:#fff;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:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;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}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.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}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.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}.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%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:\"\\2014 \\00A0\"}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.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\"}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,\"Courier New\",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.row-no-gutters{margin-right:0;margin-left:0}.row-no-gutters [class*=col-]{padding-right:0;padding-left:0}.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-right:15px;padding-left:15px}.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.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.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.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.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.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.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.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.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{border:1px solid #ddd}.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{background-color:#f5f5f5}.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-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{min-height:.01%;overflow-x:auto}@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{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none;-moz-appearance:none;appearance:none}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\\9;line-height:normal}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}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;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;-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;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,-webkit-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}.form-control::-ms-expand{background-color:transparent;border:0}.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=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],.input-group-sm input[type=time],input[type=date].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm,input[type=time].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],.input-group-lg input[type=time],input[type=date].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg,input[type=time].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.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-top:4px\\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.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;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.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}.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 .checkbox,.has-success .checkbox-inline,.has-success .control-label,.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}.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;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.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;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.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;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.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-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.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 .control-label{margin-bottom:0;vertical-align:middle}.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 .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.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;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;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:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;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;filter:alpha(opacity=65);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:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;background-image:none;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:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;background-image:none;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:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;background-image:none;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.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:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;background-image:none;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:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;background-image:none;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:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;background-image:none;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{font-weight:400;color:#337ab7;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{position:relative;height:0;overflow:hidden;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;-o-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,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.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;font-size:14px;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;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)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.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;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:\"\";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.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{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.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-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left: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 .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width: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-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius: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-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;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-right:0;padding-left: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}.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}.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-top-right-radius:0;border-bottom-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-top-left-radius:0;border-bottom-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{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;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;cursor:not-allowed;background-color:transparent}.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;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{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>a{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-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{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.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-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-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;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-right:0;padding-left:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-right:15px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;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}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;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}}@media (min-width:768px){.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 15px;margin-right:-15px;margin-left:-15px;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-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.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 .control-label{margin-bottom:0;vertical-align:middle}.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}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius: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}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.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-text{color:#777}.navbar-default .navbar-nav>li>a{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-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.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-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-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-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{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-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.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-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-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{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:\"/\\00a0\"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.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>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.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;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.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-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.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;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.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;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.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;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;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-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.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}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.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}}@-o-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;overflow:hidden;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:-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);-webkit-background-size:40px 40px;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:-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)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{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)}.progress-bar-warning{background-color:#f0ad4e}.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);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{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.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{padding-left:0;margin-bottom:20px}.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-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.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}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{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.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}.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-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.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,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius: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-left-radius:3px;border-top-right-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-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.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>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.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-right-radius:3px;border-bottom-left-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: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>.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{margin-bottom:0;border: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{border-bottom:0}.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;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height: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;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-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;-o-transition:-o-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out,-o-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;background-clip:padding-box;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;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.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-bottom:0;margin-left:5px}.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}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.42857143;line-break:auto;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;font-size:12px;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.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;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.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{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.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}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.42857143;line-break:auto;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;font-size:14px;background-color:#fff;background-clip:padding-box;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)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover>.arrow{border-width:11px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow:after{content:\"\";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:\" \";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:\" \";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:\" \";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;bottom:-10px;content:\" \";border-right-width:0;border-left-color:#fff}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-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;-o-transition:-o-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out,-o-transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-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;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.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:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;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:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;outline:0;filter:alpha(opacity=90);opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.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;font-family:serif;line-height:1}.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%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{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{right:20%;left: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{display:table;content:\" \"}.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-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@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}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.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}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.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}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.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}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!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}}@media (min-width:1200px){.hidden-lg{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}}@media print{.hidden-print{display:none!important}}\n/*# sourceMappingURL=bootstrap.min.css.map */"
  },
  {
    "path": "instock/web/static/css/font-awesome.min-4.5.0.css",
    "content": "/*!\n *  Font Awesome 4.5.0 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */@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\"}\n"
  },
  {
    "path": "instock/web/static/css/gc.spread.sheets.excel2013white.css",
    "content": "@charset \"UTF-8\";\n/*----- css variables -----*/\n:root {\n  --sjs-theme-font-family: \"Segoe UI\", Calibri, Thonburi, Arial, Verdana, sans-serif, \"Mongolian Baiti\", \"Microsoft Yi Baiti\", \"Javanese Text\";\n  --sjs-theme-font-size: 12px;\n  --sjs-theme-accent: #217346;\n  --sjs-theme-accent-color: white;\n  --sjs-theme-background: white;\n  --sjs-theme-color: #333;\n  --sjs-theme-light-gray-bg: rgba(51,51,51,0.05);\n  --sjs-theme-gray-bg: rgba(51,51,51,.1);\n  --sjs-theme-border-color: #DAE2ED;\n  --sjs-theme-error-color: #BE1F1F;\n  --sjs-theme-border-radius: 0;\n}\n\n/*-----common css start-----*/\n/*-----common css start-----*/\n.gc-clear-float:after {\n  content: \"\";\n  display: block;\n  height: 0;\n  clear: both;\n  visibility: hidden;\n}\n\n[gcuielement=gcSpread]:after {\n  content: \"\";\n  display: block;\n  height: 0;\n  clear: both;\n  visibility: hidden;\n}\n\n.gc-theme-version {\n  position: absolute;\n  z-index: 2013;\n}\n\n.gc-footer-corner {\n  background-color: #f6f6f6;\n}\n\n.gc-grayArea {\n  background-color: white;\n}\n\n.gc-corner-hover {\n  background-color: white;\n}\n\n.gc-corner-selected {\n  background-color: white;\n}\n\n.gc-corner-normal {\n  background-color: white;\n}\n\n.gc-rowHeaderFill {\n  background-color: #e4ecf7;\n}\n\n.gc-colHeaderFill {\n  background-image: -webkit-linear-gradient(top, #f6fafb 12.5%, #d2dbeb);\n  /* For Chrome and Safari */\n  background-image: -moz-linear-gradient(top, #f6fafb 12.5%, #d2dbeb);\n  /* For old Fx (3.6 to 15) */\n  background-image: -ms-linear-gradient(top, #f6fafb 12.5%, #d2dbeb);\n  /* For pre-releases of IE 10*/\n  background-image: -o-linear-gradient(top, #f6fafb 12.5%, #d2dbeb);\n  /* For old Opera (11.1 to 12.0) */\n  background-image: linear-gradient(to bottom, #f6fafb 12.5%, #d2dbeb);\n  /* Standard syntax; must be last */\n  background-color: #d2dbeb;\n}\n\n.gc-selection {\n  background-color: rgba(20, 20, 20, 0.2);\n  border-color: #217346;\n  color: rgba(240, 240, 240, 0.7);\n}\n\n.gc-drag-header-mask {\n  background-color: rgba(20, 20, 20, 0.2);\n}\n\n.gc-drag-header-indicator {\n  border-color: #217346;\n}\n\n.gc-drag-indicator {\n  border-color: #217346;\n}\n\n.gc-gridlineColor {\n  border-color: #d4d4d4;\n}\n\n.gc-group {\n  background-color: white;\n  color: #ababab;\n}\n\n.gc-group-box {\n  background-color: white;\n  color: #666666;\n  border-color: #828790;\n}\n\n.gc-group-line {\n  border-width: 2px;\n  border-style: solid;\n  border-color: #ababab;\n}\n\n.fillSmartTag {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAFJJREFUeNrclEEKACAIBOfp/Xy7i4WSRnRYBIVRVhFJVIhyEAxllQa5E/wBSnsU6Rza2nugqNmASi57C/KKNg/Iqn+iVWzx6M4bOdUEAAD//wMAAYRMfiNaiqEAAAAASUVORK5CYII=);\n  width: 18px;\n  height: 18px;\n}\n\n.fillSmartTagDown {\n  height: 18px;\n  width: 10px;\n  background-repeat: no-repeat;\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAASCAYAAACXScT7AAAACXBIWXMAAA7DAAAOwwHHb6hkAAAKTWlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVN3WJP3Fj7f92UPVkLY8LGXbIEAIiOsCMgQWaIQkgBhhBASQMWFiApWFBURnEhVxILVCkidiOKgKLhnQYqIWotVXDjuH9yntX167+3t+9f7vOec5/zOec8PgBESJpHmomoAOVKFPDrYH49PSMTJvYACFUjgBCAQ5svCZwXFAADwA3l4fnSwP/wBr28AAgBw1S4kEsfh/4O6UCZXACCRAOAiEucLAZBSAMguVMgUAMgYALBTs2QKAJQAAGx5fEIiAKoNAOz0ST4FANipk9wXANiiHKkIAI0BAJkoRyQCQLsAYFWBUiwCwMIAoKxAIi4EwK4BgFm2MkcCgL0FAHaOWJAPQGAAgJlCLMwAIDgCAEMeE80DIEwDoDDSv+CpX3CFuEgBAMDLlc2XS9IzFLiV0Bp38vDg4iHiwmyxQmEXKRBmCeQinJebIxNI5wNMzgwAABr50cH+OD+Q5+bk4eZm52zv9MWi/mvwbyI+IfHf/ryMAgQAEE7P79pf5eXWA3DHAbB1v2upWwDaVgBo3/ldM9sJoFoK0Hr5i3k4/EAenqFQyDwdHAoLC+0lYqG9MOOLPv8z4W/gi372/EAe/tt68ABxmkCZrcCjg/1xYW52rlKO58sEQjFu9+cj/seFf/2OKdHiNLFcLBWK8ViJuFAiTcd5uVKRRCHJleIS6X8y8R+W/QmTdw0ArIZPwE62B7XLbMB+7gECiw5Y0nYAQH7zLYwaC5EAEGc0Mnn3AACTv/mPQCsBAM2XpOMAALzoGFyolBdMxggAAESggSqwQQcMwRSswA6cwR28wBcCYQZEQAwkwDwQQgbkgBwKoRiWQRlUwDrYBLWwAxqgEZrhELTBMTgN5+ASXIHrcBcGYBiewhi8hgkEQcgIE2EhOogRYo7YIs4IF5mOBCJhSDSSgKQg6YgUUSLFyHKkAqlCapFdSCPyLXIUOY1cQPqQ28ggMor8irxHMZSBslED1AJ1QLmoHxqKxqBz0XQ0D12AlqJr0Rq0Hj2AtqKn0UvodXQAfYqOY4DRMQ5mjNlhXIyHRWCJWBomxxZj5Vg1Vo81Yx1YN3YVG8CeYe8IJAKLgBPsCF6EEMJsgpCQR1hMWEOoJewjtBK6CFcJg4Qxwicik6hPtCV6EvnEeGI6sZBYRqwm7iEeIZ4lXicOE1+TSCQOyZLkTgohJZAySQtJa0jbSC2kU6Q+0hBpnEwm65Btyd7kCLKArCCXkbeQD5BPkvvJw+S3FDrFiOJMCaIkUqSUEko1ZT/lBKWfMkKZoKpRzame1AiqiDqfWkltoHZQL1OHqRM0dZolzZsWQ8ukLaPV0JppZ2n3aC/pdLoJ3YMeRZfQl9Jr6Afp5+mD9HcMDYYNg8dIYigZaxl7GacYtxkvmUymBdOXmchUMNcyG5lnmA+Yb1VYKvYqfBWRyhKVOpVWlX6V56pUVXNVP9V5qgtUq1UPq15WfaZGVbNQ46kJ1Bar1akdVbupNq7OUndSj1DPUV+jvl/9gvpjDbKGhUaghkijVGO3xhmNIRbGMmXxWELWclYD6yxrmE1iW7L57Ex2Bfsbdi97TFNDc6pmrGaRZp3mcc0BDsax4PA52ZxKziHODc57LQMtPy2x1mqtZq1+rTfaetq+2mLtcu0W7eva73VwnUCdLJ31Om0693UJuja6UbqFutt1z+o+02PreekJ9cr1Dund0Uf1bfSj9Rfq79bv0R83MDQINpAZbDE4Y/DMkGPoa5hpuNHwhOGoEctoupHEaKPRSaMnuCbuh2fjNXgXPmasbxxirDTeZdxrPGFiaTLbpMSkxeS+Kc2Ua5pmutG003TMzMgs3KzYrMnsjjnVnGueYb7ZvNv8jYWlRZzFSos2i8eW2pZ8ywWWTZb3rJhWPlZ5VvVW16xJ1lzrLOtt1ldsUBtXmwybOpvLtqitm63Edptt3xTiFI8p0in1U27aMez87ArsmuwG7Tn2YfYl9m32zx3MHBId1jt0O3xydHXMdmxwvOuk4TTDqcSpw+lXZxtnoXOd8zUXpkuQyxKXdpcXU22niqdun3rLleUa7rrStdP1o5u7m9yt2W3U3cw9xX2r+00umxvJXcM970H08PdY4nHM452nm6fC85DnL152Xlle+70eT7OcJp7WMG3I28Rb4L3Le2A6Pj1l+s7pAz7GPgKfep+Hvqa+It89viN+1n6Zfgf8nvs7+sv9j/i/4XnyFvFOBWABwQHlAb2BGoGzA2sDHwSZBKUHNQWNBbsGLww+FUIMCQ1ZH3KTb8AX8hv5YzPcZyya0RXKCJ0VWhv6MMwmTB7WEY6GzwjfEH5vpvlM6cy2CIjgR2yIuB9pGZkX+X0UKSoyqi7qUbRTdHF09yzWrORZ+2e9jvGPqYy5O9tqtnJ2Z6xqbFJsY+ybuIC4qriBeIf4RfGXEnQTJAntieTE2MQ9ieNzAudsmjOc5JpUlnRjruXcorkX5unOy553PFk1WZB8OIWYEpeyP+WDIEJQLxhP5aduTR0T8oSbhU9FvqKNolGxt7hKPJLmnVaV9jjdO31D+miGT0Z1xjMJT1IreZEZkrkj801WRNberM/ZcdktOZSclJyjUg1plrQr1zC3KLdPZisrkw3keeZtyhuTh8r35CP5c/PbFWyFTNGjtFKuUA4WTC+oK3hbGFt4uEi9SFrUM99m/ur5IwuCFny9kLBQuLCz2Lh4WfHgIr9FuxYji1MXdy4xXVK6ZHhp8NJ9y2jLspb9UOJYUlXyannc8o5Sg9KlpUMrglc0lamUycturvRauWMVYZVkVe9ql9VbVn8qF5VfrHCsqK74sEa45uJXTl/VfPV5bdra3kq3yu3rSOuk626s91m/r0q9akHV0IbwDa0b8Y3lG19tSt50oXpq9Y7NtM3KzQM1YTXtW8y2rNvyoTaj9nqdf13LVv2tq7e+2Sba1r/dd3vzDoMdFTve75TsvLUreFdrvUV99W7S7oLdjxpiG7q/5n7duEd3T8Wej3ulewf2Re/ranRvbNyvv7+yCW1SNo0eSDpw5ZuAb9qb7Zp3tXBaKg7CQeXBJ9+mfHvjUOihzsPcw83fmX+39QjrSHkr0jq/dawto22gPaG97+iMo50dXh1Hvrf/fu8x42N1xzWPV56gnSg98fnkgpPjp2Snnp1OPz3Umdx590z8mWtdUV29Z0PPnj8XdO5Mt1/3yfPe549d8Lxw9CL3Ytslt0utPa49R35w/eFIr1tv62X3y+1XPK509E3rO9Hv03/6asDVc9f41y5dn3m978bsG7duJt0cuCW69fh29u0XdwruTNxdeo94r/y+2v3qB/oP6n+0/rFlwG3g+GDAYM/DWQ/vDgmHnv6U/9OH4dJHzEfVI0YjjY+dHx8bDRq98mTOk+GnsqcTz8p+Vv9563Or59/94vtLz1j82PAL+YvPv655qfNy76uprzrHI8cfvM55PfGm/K3O233vuO+638e9H5ko/ED+UPPR+mPHp9BP9z7nfP78L/eE8/sl0p8zAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAGCSURBVHjafNFPKKRxHAbw5/v7GYdBYUQjLm5SkoNykCQHtcx431/KgdKumJvSrAO7Nwc3RQ5kd3OkHJC/hUJREluonVcToqRh3sRFPA6M1Mbhc3z6Pj1fkMRHQNJL0uPeul731lU37o1y49cqHr8GvvgWQRLBsmpM/P0j4XAXiooKcXl1CZDEzl4EJBEwAZBUwWAQsVgsFSRR11gmM8trimSa3WypzZ31l5v2/vfk/4oAcv9aSGyUSz4gg/AIAOET0YQswIQWaNrnH+2OeSaY0BJN2+wDTi/OpCrwkxX1vW8q63p5cnaaB+Z/09u7x0nFJTVMiEajPsNCQaC6Ryb8THKcw/Tikho6zj//0RGUNV6gMZ1H8fmpH5iTHDlwsiOhO7FrN5RdP6aBIUj/pvJ2bkFbkxAzBzELELNCQQqgrJ5ST1/jqmYOJcHa7dYYGV5TrQ3d+vfUU+b7IfrOIRCGBYD0o1VGmaHaB6DZkqvMD2hUfF1UAISkvE/+yqbCZ89+HgBtwgFOrBUzJgAAAABJRU5ErkJggg==);\n}\n\n.gc-group-dot {\n  color: #ababab;\n}\n\n.gc-group-box-expand,\n.gc-group-box-collapsed {\n  border-color: transparent;\n  background-color: transparent;\n}\n\n.gc-tabStripBackground {\n  background-image: -webkit-linear-gradient(top, #f6f6f6, #f6f6f6);\n  /* For Chrome and Safari */\n  background-image: -moz-linear-gradient(top, #f6f6f6, #f6f6f6);\n  /* For old Fx (3.6 to 15) */\n  background-image: -ms-linear-gradient(top, #f6f6f6, #f6f6f6);\n  /* For pre-releases of IE 10*/\n  background-image: -o-linear-gradient(top, #f6f6f6, #f6f6f6);\n  /* For old Opera (11.1 to 12.0) */\n  background-image: linear-gradient(to bottom, #f6f6f6, #f6f6f6);\n  /* Standard syntax; must be last */\n  background-color: #f6f6f6;\n  border-color: #ababab;\n}\n\n.gc-tabStripResizeBarInner {\n  color: #b3b3b3;\n}\n\n.gc-navButton-hover {\n  border-color: #439467;\n}\n\n.gc-all-sheets-button-hover {\n  border-color: #439467;\n}\n\n.gc-tab-indicator-bottom {\n  width: 0;\n  position: absolute;\n  border-style: solid;\n  border-color: black;\n  border-width: 4px;\n  display: none;\n  border-bottom: 0;\n  border-left-color: transparent;\n  border-right-color: transparent;\n}\n\n.gc-tab-indicator-top {\n  width: 0;\n  position: absolute;\n  border-style: solid;\n  border-color: black;\n  border-width: 4px;\n  display: none;\n  border-top: 0;\n  border-left-color: transparent;\n  border-right-color: transparent;\n}\n\n.gc-tab-indicator-left {\n  width: 0;\n  position: absolute;\n  border-style: solid;\n  border-color: black;\n  border-width: 4px;\n  display: none;\n  border-left: 0;\n  border-top-color: transparent;\n  border-bottom-color: transparent;\n}\n\n.gc-tab-indicator-right {\n  width: 0;\n  position: absolute;\n  border-style: solid;\n  border-color: black;\n  border-width: 4px;\n  display: none;\n  border-right: 0;\n  border-top-color: transparent;\n  border-bottom-color: transparent;\n}\n\n.gc-navButton-highlight {\n  border-color: #0a6332;\n}\n\n.gc-navButton-normal {\n  border-color: #c6c6c6;\n}\n\n.gc-all-sheets-button-highlight {\n  border-color: #0a6332;\n}\n\n.gc-all-sheets-button-normal {\n  border-color: #c6c6c6;\n}\n\n.gc-tabStripNewTab-highlight {\n  border-color: #777777;\n}\n\n.gc-tabStripNewTab-hover {\n  border-color: #439467;\n}\n\n.gc-navMoreButton-highlight {\n  border-color: #0a6332;\n}\n\n.gc-navMoreButton-hover {\n  border-color: #439467;\n}\n\n.gc-tab-strip-all-sheets-highlight {\n  border-color: #0a6332;\n}\n\n.gc-tab-strip-all-sheets-hover {\n  border-color: #439467;\n}\n\n.gc-columnHeader-hover, .gc-add-column-button-hover {\n  color: #444444;\n  background-image: none;\n  background-color: #9fd5b7;\n  border-style: solid;\n  border-left-color: #efefef !important;\n  border-right-color: #d5ded5 !important;\n  border-bottom-color: #ababab !important;\n}\n\n.gc-columnHeader-selected, .gc-add-column-button-selected {\n  color: #217346;\n  background-color: #d3f0e0;\n  background-image: none;\n  border-style: solid;\n  border-left-color: #efefef !important;\n  border-right-color: #d5ded5 !important;\n  border-bottom-color: #ababab !important;\n}\n\n.gc-columnHeader-highlight, .gc-add-column-button-highlight {\n  color: #217346;\n  background-image: none;\n  background-color: #e1e1e1;\n  border-style: solid;\n  border-left-color: #efefef !important;\n  border-right-color: #d5ded5 !important;\n  border-bottom-color: #ababab !important;\n}\n\n.gc-columnHeader-normal, .gc-add-column-button-normal {\n  color: #444444;\n  background-image: none;\n  background-color: white;\n  border-style: solid;\n  border-left-color: #efefef !important;\n  border-right-color: #d5ded5 !important;\n  border-bottom-color: #ababab !important;\n}\n\n.gc-rowHeader-hover, .gc-add-row-button-hover {\n  color: #444444;\n  background-color: #9fd5b7;\n  background-image: none;\n  border-style: solid;\n  border-top-color: #efefef !important;\n  border-right-color: #ababab !important;\n  border-bottom-color: #d5ded5 !important;\n}\n\n.gc-rowHeader-selected, .gc-add-row-button-selected {\n  color: #217346;\n  background-color: #d3f0e0;\n  background-image: none;\n  border-style: solid;\n  border-top-color: #efefef !important;\n  border-right-color: #ababab !important;\n  border-bottom-color: #d5ded5 !important;\n}\n\n.gc-rowHeader-highlight, .gc-add-row-button-highlight {\n  color: #217346;\n  background-color: #e1e1e1;\n  background-image: none;\n  border-style: solid;\n  border-top-color: #efefef !important;\n  border-right-color: #ababab !important;\n  border-bottom-color: #d5ded5 !important;\n}\n\n.gc-rowHeader-normal, .gc-add-row-button-normal {\n  color: #444444;\n  background-color: white;\n  background-image: none;\n  border-style: solid;\n  border-top-color: #efefef !important;\n  border-right-color: #ababab !important;\n  border-bottom-color: #d5ded5 !important;\n}\n\n.gc-corner-triangle-normal {\n  background-image: -webkit-linear-gradient(top, #dfdfdf, #dfdfdf);\n  /* For Chrome and Safari */\n  background-image: -moz-linear-gradient(top, #dfdfdf, #dfdfdf);\n  /* For old Fx (3.6 to 15) */\n  background-image: -ms-linear-gradient(top, #dfdfdf, #dfdfdf);\n  /* For pre-releases of IE 10*/\n  background-image: -o-linear-gradient(top, #dfdfdf, #dfdfdf);\n  /* For old Opera (11.1 to 12.0) */\n  background-image: linear-gradient(to bottom, #dfdfdf, #dfdfdf);\n  /* Standard syntax; must be last */\n  background-color: #dfdfdf;\n  border-style: solid;\n  border-left-color: #efefef !important;\n  border-right-color: #d5ded5 !important;\n  border-top-color: #efefef !important;\n  border-bottom-color: #d5ded5 !important;\n}\n\n#gc-search-tr .ui-widget-header {\n  background: #fcfdfd;\n  background-color: #fcfdfd;\n  border: 0;\n}\n\n.gc-corner-triangle-hover {\n  background-image: -webkit-linear-gradient(top, #9e9e9e, #9e9e9e);\n  /* For Chrome and Safari */\n  background-image: -moz-linear-gradient(top, #9e9e9e, #9e9e9e);\n  /* For old Fx (3.6 to 15) */\n  background-image: -ms-linear-gradient(top, #9e9e9e, #9e9e9e);\n  /* For pre-releases of IE 10*/\n  background-image: -o-linear-gradient(top, #9e9e9e, #9e9e9e);\n  /* For old Opera (11.1 to 12.0) */\n  background-image: linear-gradient(to bottom, #9e9e9e, #9e9e9e);\n  /* Standard syntax; must be last */\n  background-color: #9e9e9e;\n  border-style: solid;\n  border-left-color: #efefef !important;\n  border-right-color: #d5ded5 !important;\n  border-top-color: #efefef !important;\n  border-bottom-color: #d5ded5 !important;\n}\n\n.gc-corner-triangle-selected {\n  background-image: -webkit-linear-gradient(top, #217346, #217346);\n  /* For Chrome and Safari */\n  background-image: -moz-linear-gradient(top, #217346, #217346);\n  /* For old Fx (3.6 to 15) */\n  background-image: -ms-linear-gradient(top, #217346, #217346);\n  /* For pre-releases of IE 10*/\n  background-image: -o-linear-gradient(top, #217346, #217346);\n  /* For old Opera (11.1 to 12.0) */\n  background-image: linear-gradient(to bottom, #217346, #217346);\n  /* Standard syntax; must be last */\n  background-color: #217346;\n  border-style: solid;\n  border-left-color: #efefef !important;\n  border-right-color: #d5ded5 !important;\n  border-top-color: #efefef !important;\n  border-bottom-color: #d5ded5 !important;\n}\n\n.gc-tab-normal {\n  color: #444444;\n  background-image: none;\n  background-color: transparent;\n  border-style: solid;\n  border-left-color: #ababab;\n  border-bottom-color: #217346;\n}\n\n.gc-tab-hover {\n  color: #252627;\n  background-image: none;\n  background-color: transparent;\n  border-style: solid;\n  border-left-color: #ababab;\n  border-bottom-color: #217346;\n}\n\n.gc-tab-selected {\n  color: black;\n  background-image: none;\n  background-color: white;\n  border-style: solid;\n  border-left-color: #999999;\n  border-bottom-color: #217346;\n}\n\n.gc-tab-activeNotSelected {\n  color: #217346;\n  background-image: none;\n  background-color: transparent;\n  border-style: solid;\n  border-left-color: #ababab;\n}\n\n.gc-tab-active {\n  color: #217346;\n  background-image: none;\n  background-color: white;\n  border-style: solid;\n  border-left-color: #ababab;\n  border-bottom-color: #217346;\n}\n\n.gc-gradientButton {\n  background-image: -webkit-linear-gradient(top, #f6fafb, #d2dbeb);\n  /* For Chrome and Safari */\n  background-image: -moz-linear-gradient(top, #f6fafb, #d2dbeb);\n  /* For old Fx (3.6 to 15) */\n  background-image: -ms-linear-gradient(top, #f6fafb, #d2dbeb);\n  /* For pre-releases of IE 10*/\n  background-image: -o-linear-gradient(top, #f6fafb, #d2dbeb);\n  /* For old Opera (11.1 to 12.0) */\n  background-image: linear-gradient(to bottom, #f6fafb, #d2dbeb);\n  /* Standard syntax; must be last */\n  background-color: #dddddd;\n}\n\n.gc-sheetTabEditor::-ms-clear {\n  display: none;\n}\n\n.gc-layout-table {\n  font-size: 12px;\n  width: 100%;\n  height: 100%;\n  font-family: \"Segoe UI\", Calibri, Thonburi, Arial, Verdana, sans-serif, \"Mongolian Baiti\", \"Microsoft Yi Baiti\", \"Javanese Text\";\n}\n\n.gc-layout-table-first-column {\n  width: 21px;\n  border-right: 1px solid #ccc;\n  text-align: right;\n  padding-top: 7px;\n}\n\n.gc-layout-table-last-column {\n  width: 18px;\n}\n\n.gc-filter-sort-desc-container {\n  border-bottom: 1px solid #ccc;\n}\n\n.gc-filter-top10-rank {\n  outline: none;\n}\n\n.gc-filter-top10-rank-illegal:focus {\n  outline: 1px solid red;\n}\n\n.gc-filter-checked {\n  border: 1px solid #999;\n  background-color: rgba(140, 140, 140, 0.2);\n}\n\n.gc-filterDialog-rightArrow {\n  display: inline-block;\n  height: 10px;\n  background-repeat: no-repeat;\n  background-position: center center;\n  width: 100%;\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAAXNSR0IArs4c6QAAAGBJREFUGBljYCAHzJo1a8L///+ZsOlFEQQqygcqXr1q1SpOdMUoCqGSQe/fv987c+ZMEWTF2BSC5C0ZGRkXEaPwONAZccgKWZA5UPY6QUHBmLCwsO9Y5CBC+HyNUxPZEgCPEyCkHm49GwAAAABJRU5ErkJggg==);\n}\n\n.gc-filter-disable-item .gc-filterDialog-rightArrow {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAAXNSR0IArs4c6QAAAGVJREFUGBljYCAH3L17d8L///+ZCOoFKvwPxGsfP37Mia4Ym+6g379/73327JkIsmJsChmA1lt+//59EbJCFmQOjM3IyHicg4MjDsYH0dhMXMfKyuosJSX1BlkhCptoX6PoIpcDAIoHJuArInm+AAAAAElFTkSuQmCC);\n}\n\n.gc-filter-dialog-style {\n  text-align: initial;\n  background: #fcfdfd;\n  font-family: \"Segoe UI\", Calibri, Thonburi, Arial, Verdana, sans-serif, \"Mongolian Baiti\", \"Microsoft Yi Baiti\", \"Javanese Text\";\n  font-size: 12px;\n  border: thin solid #a7abb0;\n  cursor: default;\n}\n.gc-filter-dialog-style select {\n  color: black;\n  font-weight: normal;\n  font-style: normal;\n  background-color: rgb(255, 255, 255);\n  border: 1px solid rgb(118, 118, 118);\n  -webkit-appearance: auto;\n  -moz-appearance: auto;\n}\n.gc-filter-dialog-style input {\n  color: black;\n  font-weight: normal;\n  font-style: normal;\n}\n\n.gc-filter-dialog-style.gc-filter-dialog-resizable {\n  resize: both;\n  overflow: hidden;\n}\n\n.gc-filter-dialog-style #gc-search-tr {\n  height: 62px;\n}\n\n#first-condition-expected > input,\n#sec-condition-expected > input {\n  background-color: #fff;\n}\n\n.gc-filter-disable-item i {\n  color: #c4bec2;\n}\n.gc-filter-disable-item i:hover {\n  color: #c4bec2;\n}\n.gc-filter-disable-item input {\n  background-color: lightgray;\n  opacity: 0.3;\n}\n\n.gc-search-outer-div {\n  border: none;\n  background-image: none;\n  background-color: white;\n  margin: 4px 0px 0px 4px;\n  color: #1e395b;\n  font-weight: normal;\n}\n\ndiv.gc-search-outer-div input::-ms-clear {\n  display: none;\n}\n\n#gc-filterSearch {\n  width: calc(100% - 15px);\n  height: 21px;\n  border: 1px solid #ababab;\n  margin-left: 7px;\n  margin-top: 4px;\n  margin-bottom: 0px;\n  padding: 0;\n  font-size: 1em;\n  background-color: white;\n  color: black;\n  float: none;\n}\n#gc-filterSearch:hover, #gc-filterSearch:active {\n  background-color: white;\n}\n\n.gc-filter-button-active {\n  border: 1px solid #569de5;\n  border-radius: 0;\n  background-image: -webkit-linear-gradient(top, #daecfc, #c4e0fc);\n  /* For Chrome and Safari */\n  background-image: -moz-linear-gradient(top, #daecfc, #c4e0fc);\n  /* For old Fx (3.6 to 15) */\n  background-image: -ms-linear-gradient(top, #daecfc, #c4e0fc);\n  /* For pre-releases of IE 10*/\n  background-image: -o-linear-gradient(top, #daecfc, #c4e0fc);\n  /* For old Opera (11.1 to 12.0) */\n  background-image: linear-gradient(to bottom, #daecfc, #c4e0fc);\n  /* Standard syntax; must be last */\n  background-color: #ffe475;\n  font-weight: normal;\n  color: black;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n\n.gc-check-uncheck-all {\n  float: left;\n  width: 16px;\n  height: 16px;\n  display: inline-block;\n}\n\n.gc-filter-check-outerDiv .gc-check-image,\n.gc-fill-type-item .gc-check-image {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAAGxJREFUOE+ljsENgDAMAzsaQ3QMxP4/wAhXwTKhEY9TlZOdtK1b/4WVFaysYGUFKxMWdY/hA5T3+x0+BjJYJmOJBoF+87UMYhAwzFBaBnFwYZ1j/kKFltIycHLqMrHyhEvSMrCygpUVrJyntwPdKU02VXQw7gAAAABJRU5ErkJggg==);\n}\n\n.gc-filter-check-outerDiv .gc-uncheck-image,\n.gc-fill-type-item .gc-uncheck-image {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAAIJJREFUOE+lkssNgDAMQzsCw3UMxEocGKWDQSLVUj5GJeLwhPyI0x7a9qP/gsoKVFagskIUm3ALp3GKZvX63/q0QIcAlqAMXMcFIQ6z7DouTGLptawkMVmeDJi8BFsGQ0jzUcRyvEla4oLAhvVrveu4IOAdxJOwZPkOylBZgcrv9PYAV9tkcyJlS4sAAAAASUVORK5CYII=);\n}\n\n.gc-check-image,\n.gc-uncheck-image {\n  background-position: center;\n}\n\n.gc-filter-check-outerDiv {\n  height: 18px;\n  margin-top: 4px;\n}\n\n[gcuielement=gcSpread] i {\n  font-style: normal;\n}\n[gcuielement=gcSpread] i.gc-filter-check-style {\n  cursor: pointer;\n  color: #1e395b;\n  text-shadow: none;\n}\n[gcuielement=gcSpread] i.gc-filter-check {\n  text-decoration: none;\n}\n[gcuielement=gcSpread] i.gc-filter-check:hover {\n  text-decoration: underline;\n}\n\n.gc-filter-function-tr i:active {\n  border-color: #e3e3e3;\n  outline: none;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n\n.gc-filter-sort {\n  /*border: 1px solid transparent;*/\n  font-weight: normal;\n  color: #222222;\n  white-space: nowrap;\n  word-break: break-all;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n\n.gc-filter-item-link #gc-majorFilter {\n  width: 181px;\n  color: #222222;\n}\n.gc-filter-item-link #gc-majorFilter:hover {\n  width: 181px;\n  color: #222222;\n}\n\n.gc-filter-hover {\n  border-radius: 0px;\n  outline: none;\n}\n\n.gc-filter-item {\n  position: relative;\n  cursor: default;\n  font-weight: normal;\n  border-style: solid;\n  border-color: transparent;\n}\n\n.gc-filter-item-container {\n  border: 1px solid #a7abb0;\n  border-radius: 3px;\n  margin: 4px 0px 4px 4px;\n  overflow: hidden;\n}\n\n.gc-filter-item-input {\n  float: left;\n  clear: left;\n  margin: 3px !important;\n}\n\n.gc-filter-item-text {\n  font-family: Lucida Grande, Lucida Sans, Arial, sans-serif;\n  font-size: 12px;\n  margin: 2px;\n  white-space: nowrap;\n  word-wrap: normal;\n  float: left;\n  clear: right;\n}\n\n.gc-filter-button-container {\n  display: flex;\n  justify-content: flex-end;\n}\n\n.gc-filter-button {\n  width: 90px;\n  height: 27px;\n  margin: 2px 1px 5px;\n}\n\n.gc-filter-button-disable {\n  opacity: 0.35;\n  background-image: none;\n}\n\n#gc-filterOK {\n  box-sizing: border-box;\n  margin-left: 13px;\n  margin-bottom: 5px;\n  float: left;\n}\n\n#gc-filterCancel {\n  box-sizing: border-box;\n  margin-bottom: 5px;\n  float: left;\n}\n\n.gc-smartMenu-item-default {\n  border: 1px solid transparent;\n  background-color: white;\n  background-image: none;\n  font-weight: normal;\n  color: #1e395b;\n  border-radius: 0;\n}\n\n.gc-filter-button-default {\n  border: 1px solid #acacac;\n  background-image: -webkit-linear-gradient(top, #f0f0f0, #e5e5e5);\n  /* For Chrome and Safari */\n  background-image: -moz-linear-gradient(top, #f0f0f0, #e5e5e5);\n  /* For old Fx (3.6 to 15) */\n  background-image: -ms-linear-gradient(top, #f0f0f0, #e5e5e5);\n  /* For pre-releases of IE 10*/\n  background-image: -o-linear-gradient(top, #f0f0f0, #e5e5e5);\n  /* For old Opera (11.1 to 12.0) */\n  background-image: linear-gradient(to bottom, #f0f0f0, #e5e5e5);\n  font-weight: normal;\n  color: black;\n  border-radius: 0;\n}\n\n.gc-filter-button-hover {\n  border: 1px solid #7eb4ea;\n  background-image: -webkit-linear-gradient(top, #ecf4fc, #dcecfc);\n  /* For Chrome and Safari */\n  background-image: -moz-linear-gradient(top, #ecf4fc, #dcecfc);\n  /* For old Fx (3.6 to 15) */\n  background-image: -ms-linear-gradient(top, #ecf4fc, #dcecfc);\n  /* For pre-releases of IE 10*/\n  background-image: -o-linear-gradient(top, #ecf4fc, #dcecfc);\n  /* For old Opera (11.1 to 12.0) */\n  background-image: linear-gradient(to bottom, #ecf4fc, #dcecfc);\n  /* Standard syntax; must be last */\n  background-color: #d3f0e0;\n  border-radius: 0;\n  cursor: pointer;\n  color: black;\n  font-weight: normal;\n  text-shadow: none;\n}\n\n.gc-smart-tag-default {\n  border: 1px solid #ababab;\n  background: white;\n  color: #1e395b;\n  font-weight: normal;\n  border-radius: 0;\n}\n\n.gc-filter-item-hover, .gc-smart-tag-hover, .gc-smartMenu-item-hover {\n  font-weight: normal;\n  text-shadow: none;\n  color: #1d5987;\n}\n\n.gc-smartMenu-item-hover {\n  border: 1px solid #86bfa0;\n  background-image: none;\n  background-color: #d3f0e0;\n}\n\n.gc-smart-tag-hover {\n  border: 1px solid #9fd5b7;\n  background-image: none;\n  background-color: white;\n}\n\n.gc-filter-item-hover {\n  border: 1px solid transparent;\n  background-image: none;\n  background-color: #d3f0e0;\n}\n\n.gc-smart-tag-active {\n  border: 1px solid #9fd5b7;\n  background-image: none;\n  background-color: #9fd5b7;\n  font-weight: normal;\n  color: #262626;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n\n.gc-menu-item-input {\n  width: 16px;\n  height: 16px;\n  margin: 1px;\n  float: left;\n  display: inline-block;\n}\n\n.gc-menu-item-text {\n  font-size: 12px;\n  font-weight: normal;\n  display: inline-block;\n  float: left;\n  padding-top: 2px;\n  font-family: Arial;\n}\n\n.gc-fill-menu-container {\n  box-shadow: rgba(0, 0, 0, 0.4) 1px 2px 5px;\n  cursor: default;\n}\n\n.gc-toolstrip-default {\n  background: white;\n  border: 1px solid #c6c6c6;\n}\n\n.gc-toolstrip-button-style {\n  color: black;\n  background: white;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.gc-toolstrip-button-style:active {\n  color: black;\n  background: white;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n\n.gc-tab-tip-span {\n  background: #d6e6f9;\n  color: black;\n  border: 1px solid #d6e6f9;\n  font-weight: normal;\n}\n\n.gc-spread-toolTip {\n  border: 1px solid #bebebe;\n  border-radius: 0px;\n  background-image: none;\n  background-color: white;\n  font-weight: normal;\n  color: #217346;\n  pointer-events: none;\n}\n\n.gc-spread-pivot-toolTip {\n  border: 1px solid #bebebe;\n  border-radius: 0px;\n  background-color: white;\n  font-weight: normal;\n  color: black;\n}\n\n.gc-spread-template-sheet-toolTip {\n  border: 1px solid #bebebe;\n  border-radius: 0px;\n  background-color: white;\n  font-weight: normal;\n  color: #212121;\n  padding: 10px;\n}\n\n.gc-no-user-select {\n  -webkit-user-select: none;\n  -khtml-user-select: none;\n  -moz-user-select: none;\n  -o-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n/*-----common css end-----*/\n/*-----formula textbox start-----*/\n/* function autocomplete */\n.gcsj-func-ac-popup {\n  margin: 0;\n  padding: 0;\n  background: #fff;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  font-family: arial, sans-serif;\n  font-size: 12px;\n  line-height: 22px;\n  position: absolute;\n  min-width: 300px;\n  z-index: 2001;\n  -webkit-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n  -moz-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n}\n\n.gcsj-func-ac-row {\n  margin: 0;\n  cursor: default;\n  padding: 2px 10px;\n  color: #666666;\n}\n\n.gcsj-func-ac-row-name {\n  color: #222;\n  font-size: 13px;\n  font-family: inconsolata, monospace, arial, sans, sans-serif;\n  margin: -2px 0;\n}\n\n.gcsj-func-ac-row-description {\n  width: 280px;\n  color: #666;\n  display: none;\n  font-size: 11px;\n  margin: -2px 0;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.gcsj-ac-row-active {\n  background-color: #f5f5f5;\n  color: #000;\n  border-top: 1px solid #ebebeb;\n  border-bottom: 1px solid #ebebeb;\n  padding: 1px 10px;\n}\n.gcsj-ac-row-active .gcsj-func-ac-row-description {\n  display: block;\n}\n\n/*  function help */\n.gcsj-func-help-popup {\n  background-color: #fff;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  color: #222;\n  font-size: 11px;\n  word-wrap: break-word;\n  position: absolute;\n  width: 320px;\n  z-index: 2001;\n  -webkit-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n  -moz-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n}\n\n.gcsj-func-help-title {\n  background-color: #f5f5f5;\n  color: #222;\n  font-size: 13px;\n  padding: 1px 0 1px 10px;\n}\n\n.gcsj-func-help-body {\n  border-top: 1px solid #ebebeb;\n  font-family: arial, sans-serif;\n  overflow: hidden;\n}\n\n.gcsj-func-help-content {\n  padding-bottom: 2px;\n}\n\n.gcsj-func-help-section {\n  padding: 5px 10px;\n}\n\n.gcsj-func-help-section-title {\n  font-size: 11px;\n  color: #666;\n}\n\n.gcsj-func-help-section-content {\n  font-size: 11px;\n}\n\n.gcsj-func-help-formula {\n  font-family: inconsolata, monospace, arial, sans, sans-serif;\n  padding: 1px 0;\n}\n\n.gcsj-func-help-paramter {\n  padding-left: 1px;\n}\n\n.gcsj-func-help-paramter-active {\n  background-color: #feb;\n}\n\n.gcsj-func-gray-formula {\n  color: gray;\n}\n\n/* color text */\n.gcsj-func-color-content {\n  white-space: pre-wrap;\n}\n\n/*-----formula textbox end-----*/\n/*-----floatingobject start-----*/\n.gc-floatingobject-selected {\n  border: 1px solid #939393;\n}\n\n.gc-floatingobject-unselected {\n  background-color: transparent;\n  border: 1px solid transparent;\n}\n\n.gc-floatingobject-container {\n  position: absolute;\n  overflow: hidden;\n  box-sizing: content-box;\n}\n\n.gc-floatingobject-background-cover {\n  -webkit-background-size: cover;\n  /* For WebKit*/\n  -moz-background-size: cover;\n  /* Mozilla*/\n  -o-background-size: cover;\n  /* Opera*/\n  background-size: cover;\n  /* Generic*/\n}\n\n.gc-floatingobject-moving-container {\n  position: absolute;\n  overflow: hidden;\n}\n\n.gc-floatingobject-moving-div {\n  position: absolute;\n  border: 1px solid black;\n}\n\n.gc-floatingobject-resize-indicator {\n  box-sizing: content-box;\n}\n\n.gc-floatingobject-resize-indicator-select {\n  background-color: white;\n  border-radius: 2px;\n  -moz-border-radius: 1px;\n  border: 1px solid #939393;\n  z-index: 100;\n}\n\n.gc-floatingobject-resize-indicator-unSelect {\n  display: none;\n}\n\n.gc-floatingobject-absolute {\n  position: absolute;\n}\n\n.gc-floatingobject-content-container {\n  box-sizing: content-box;\n}\n\n/*-----floatingobject end-----*/\n/*-----scrollbar start-----*/\n/*scrollbar*/\n/*scrollbar*/\n.gc-scroll-container {\n  background-color: #eaeaea;\n  -moz-box-shadow: none;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n\n.gc-scroll-corner-all {\n  border-radius: 2px;\n}\n\n.gc-scroll-arrow {\n  background-color: white;\n  border-style: solid;\n  border-color: #ababab;\n  background-image: none;\n  border-radius: 0;\n}\n.gc-scroll-arrow .gc-scroll-arrowUp {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAAClJREFUKFNjGEmgvLz8P5RJHABpgGGoEH6ArIEojdg0wDBUyShAAAYGAHSXJkH1wN/VAAAAAElFTkSuQmCC);\n  background-repeat: no-repeat;\n}\n\n.gc-scroll-arrowUp {\n  background-position: center;\n}\n\n.gc-scroll-arrow .gc-scroll-arrowDown {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAACRJREFUKFNjGAVYQHl5+X9cGKoEOyBZAwyQrAEGSNYwpAEDAwBvhSZBmzrLGgAAAABJRU5ErkJggg==);\n  background-repeat: no-repeat;\n}\n\n.gc-scroll-arrowDown {\n  background-position: center;\n}\n\n.gc-scroll-arrow .gc-scroll-arrowLeft {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAADBJREFUKFNjGMKgvLz8P5RJHABpIEkTTAPRmpA1EK0JBMjSBAJkaQIBsjQNNGBgAABe7iZBxoz5vwAAAABJRU5ErkJggg==);\n  background-repeat: no-repeat;\n}\n\n.gc-scroll-arrowLeft {\n  background-position: center;\n}\n\n.gc-scroll-arrow .gc-scroll-arrowRight {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAAC5JREFUKFNjGIKgvLz8P5RJPABpIlkjTBNJGpE1Ea2RZA0gQLIGECBZw2ACDAwAhS4mQZAuqGcAAAAASUVORK5CYII=);\n  background-repeat: no-repeat;\n}\n\n.gc-scroll-arrowRight {\n  background-position: center;\n}\n\n.gc-scroll-bar .gc-scrollbar-vertical {\n  background-image: none;\n  background-repeat: no-repeat;\n}\n\n.gc-scrollbar-vertical {\n  background-position: center;\n}\n\n.gc-scroll-bar .gc-scrollbar-horizontal {\n  text-indent: 0;\n  background-image: none;\n  background-repeat: no-repeat;\n}\n\n.gc-horizontal-scrollbar {\n  background-color: #f6f6f6;\n  border-top-color: #ababab;\n}\n\n.gc-vertical-scrollbar {\n  background-color: #f6f6f6;\n  border-left-color: #ababab;\n}\n\n.gc-scrollbar-horizontal {\n  background-position: center;\n}\n\n.gc-scrollbar-wrapper {\n  background-color: transparent;\n}\n\n.gc-scroll-bar {\n  border-style: solid;\n  border-color: #ababab;\n  background: white;\n  -moz-border-radius: 0px;\n  -webkit-border-radius: 0px;\n  border-radius: 0px;\n}\n\n.gc-scroll-arrow-hover {\n  border-style: solid;\n  border-color: #777777;\n  background: white;\n}\n\n.gc-scrollbar-stateHover {\n  border-style: solid;\n  border-color: #ababab;\n  background: #f0f0f0;\n}\n\n.gc-scroll-arrow:active,\n.gc-scroll-bar:active,\n.gc-scrollbar-stateActive {\n  border-style: solid;\n  border-color: #777777;\n  background-color: #f0f0f0;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n\n.gc-scroll-mobile-container {\n  padding: 2px;\n  opacity: 1;\n  transition-duration: 0.3s;\n  transition-property: width, height, background-color, transform, opacity;\n  overflow: hidden;\n  box-sizing: border-box;\n}\n\n.gc-scroll-mobile-state-hide {\n  opacity: 0;\n}\n\n.gc-scroll-mobile-container-vertical {\n  width: 10px;\n}\n\n.gc-scroll-mobile-container-horizontal {\n  height: 10px;\n}\n\n.gc-scroll-mobile-state-hover.gc-scroll-mobile-container-vertical {\n  width: 14px;\n}\n\n.gc-scroll-mobile-state-hover.gc-scroll-mobile-container-horizontal {\n  height: 14px;\n}\n\n.gc-scroll-mobile-track {\n  box-sizing: border-box;\n  transition-duration: 0.3s;\n  transition-property: background-color, transform, opacity;\n  background-color: transparent; /* clear internal style */\n  box-shadow: none; /* clear internal style */\n  margin-right: 3px; /* the distance between hScrollbar and hDockScrollbar: padding * 1.5 */\n}\n\n.gc-scroll-mobile-container > .gc-scroll-mobile-track:nth-last-child(1) {\n  margin-right: 0;\n}\n\n.gc-scroll-mobile-thumb {\n  box-sizing: border-box;\n  border-width: 1px;\n  transition-duration: 0.3s;\n  transition-property: background-color, transform, opacity;\n}\n\n.gc-scroll-mobile-thumb.ui-button {\n  margin: 0; /* clear external themes style */\n  padding: 0; /* clear external themes style */\n}\n\n/*-----scrollbar end-----*/\n/*-----contextmenu start-----*/\n.gc-ui-contextmenu-container {\n  box-shadow: rgba(0, 0, 0, 0.4) 1px 2px 5px;\n  font-family: \"Segoe UI\", Calibri, Thonburi, Arial, Verdana, sans-serif, \"Mongolian Baiti\", \"Microsoft Yi Baiti\", \"Javanese Text\";\n  font-size: 9pt;\n  background: white;\n  border: 1px solid #c6c6c6;\n  color: #444444;\n  cursor: default;\n  min-width: 188px;\n}\n\n.gc-ui-contextmenu-separator {\n  height: 1px;\n  margin-left: 20px;\n  margin-right: 5px;\n  background-color: #e3e3e3;\n  overflow: hidden;\n}\n\n.gc-ui-contextmenu-menuitem,\n.gc-ui-contextmenu-nonselective-menuitem {\n  border: 1px solid transparent;\n  background-image: none;\n  font-weight: normal;\n  border-radius: 0;\n  text-decoration: none;\n  white-space: nowrap;\n  overflow: hidden;\n}\n\n.gc-ui-contextmenu-menuitem-content {\n  padding: 3px;\n  margin: 1px;\n  overflow: hidden;\n  display: flex;\n}\n\n.gc-ui-contextmenu-icon {\n  width: 16px;\n  height: 16px;\n  margin-left: 0;\n  display: inline-block;\n  margin-right: 12px;\n}\n\n.gc-ui-contextmenu-text {\n  display: inline-block;\n  padding-right: 23px;\n  padding-left: 0;\n  white-space: pre;\n}\n\n.gc-ui-contextmenu-sheet-tab-text {\n  display: inline-block;\n  box-sizing: border-box;\n  width: 164px;\n  padding-left: 0;\n  padding-right: 2px;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n\n.gc-ui-contextmenu-disable {\n  color: #b1b1b1 !important;\n}\n\n.gc-ui-contextmenu-group-header {\n  border: 1px solid transparent;\n  border-radius: 0;\n  padding: 5px;\n  font-weight: bold;\n  background-color: #dddddd;\n  overflow: hidden;\n}\n\n.gc-ui-contextmenu-groupitems-container {\n  border: 1px solid transparent;\n  background-image: none;\n  font-weight: normal;\n  color: #222222;\n  border-radius: 0;\n  padding: 5px;\n  overflow: hidden;\n  margin-left: 28px;\n}\n\n.gc-ui-contextmenu-groupitem {\n  display: inline-block;\n  float: left;\n  min-width: 24px;\n}\n.gc-ui-contextmenu-groupitem .gc-ui-contextmenu-icon {\n  width: 24px;\n  height: 24px;\n  margin: 0px;\n}\n\n.gc-ui-contextmenu-hover {\n  background: #d3f0e0;\n  background-image: none;\n  font-weight: normal;\n  text-shadow: none;\n}\n\n.gc-ui-contextmenu-menuitem-content .gc-ui-contextmenu-sup-indicator {\n  width: 16px;\n  height: 16px;\n  display: inline-block;\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAgCAYAAABU1PscAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkFEODY1RjVGQzhGMjExRTdBMDNDRDU1NEFCMEVGRTIxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkFEODY1RjYwQzhGMjExRTdBMDNDRDU1NEFCMEVGRTIxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QUQ4NjVGNURDOEYyMTFFN0EwM0NENTU0QUIwRUZFMjEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QUQ4NjVGNUVDOEYyMTFFN0EwM0NENTU0QUIwRUZFMjEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6xjVcxAAAAg0lEQVR42uzYMQ6AIAyF4RaFwXgT738PV+PMBVxRqx4A3RTM/yYGhn60hAQ1M6k5TioPAAAAAAAAAAAAAAAAAAAA8EdA33emqjLOccjt0ZJ/Jc7izftWUlqzdRYPeKq1mjtwdsLowBdpGnd70EUDQvCybbte6ykuvroR4iED8EIOAQYApagr3uYsgU4AAAAASUVORK5CYII=);\n  background-position: -32px -16px;\n  background-repeat: no-repeat;\n  margin-left: auto;\n}\n\n.gc-ui-contextmenu-splitMenu-container {\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n}\n\n.gc-ui-contextmenu-splitMenu-content {\n  flex-grow: 1;\n}\n\n.gc-ui-contextmenu-splitMenu-icon {\n  margin-right: 3px;\n}\n\n.gc-ui-contextmenu-split-sub-menu .gc-ui-contextmenu-groupitems-container {\n  margin: 0;\n}\n.gc-ui-contextmenu-split-sub-menu .gc-ui-contextmenu-group-header .gc-ui-contextmenu-icon {\n  width: 0;\n  height: 0;\n}\n\n.gc-ui-contextmenu-subitems-container {\n  position: absolute;\n  left: 98%;\n  display: none;\n  margin-top: -3px;\n}\n\n.gc-ui-contextmenu-scroll-wrapper {\n  overflow-y: auto;\n  -ms-overflow-style: none; /* IE and Edge */\n  scrollbar-width: none; /* Firefox */\n}\n\n.gc-ui-contextmenu-scroll-wrapper::-webkit-scrollbar {\n  display: none;\n}\n\n.gc-ui-contextmenu-scroll-indicator {\n  width: 100%;\n  height: 12px;\n  border-style: solid;\n  box-sizing: border-box;\n  border-width: 1px;\n  border-color: #979593;\n  background: white;\n  text-align: center;\n  position: absolute;\n  color: #444444;\n  font-family: \"Segoe UI\", Calibri, Thonburi, Arial, Verdana, sans-serif, \"Mongolian Baiti\", \"Microsoft Yi Baiti\", \"Javanese Text\";\n  font-size: 12px;\n  line-height: 9px;\n  cursor: default;\n}\n\n.gc-ui-search-contextmenu-container {\n  box-shadow: rgba(0, 0, 0, 0.4) 1px 2px 5px;\n  font-family: \"Segoe UI\", Calibri, Thonburi, Arial, Verdana, sans-serif, \"Mongolian Baiti\", \"Microsoft Yi Baiti\", \"Javanese Text\";\n  font-size: 9pt;\n  background: white;\n  border: 1px solid #c6c6c6;\n  color: #444444;\n  cursor: default;\n  min-width: 200px;\n  padding: 5px 0;\n  border-radius: var(--sjs-theme-border-radius);\n}\n\n.gc-ui-search-contextmenu-items-container {\n  border: none;\n  box-shadow: none;\n  scrollbar-width: thin;\n}\n\n.gc-ui-none-icon-contextmenu-container .gc-ui-contextmenu-icon {\n  margin-right: 0;\n}\n\n.gc-ui-contextmenu-search-label {\n  margin: 2px auto;\n  width: 170px;\n  display: block;\n  box-sizing: border-box;\n  font-size: 12px;\n}\n\n.gc-ui-contextmenu-search-box {\n  margin: 5px auto;\n  width: 170px;\n  height: 26px;\n  display: block;\n  padding: 1px 8px;\n  box-sizing: border-box;\n  border: 1px solid #c6c6c6;\n  font-size: 12px;\n  border-radius: var(--sjs-theme-border-radius);\n}\n\n.gc-ui-contextmenu-search-box:focus {\n  border: 1px solid #c6c6c6;\n  outline: none;\n}\n\n.gc-ui-contextmenu-menuitem-all-sheets-select-sheets-background-color {\n  background: #dddddd;\n}\n\n.gc-spread-pivot-selected {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAO5JREFUOBFjYBgFRIfAjRs3eI8dO7bz+PHjRsiaWJA5uNhnzpxhffny5dr///+7MjExgfQ4w9QywRggev/+/Rx79+6NRBYDamJ8//79/J8/f7r+/v373q9fv6KQ5VEM+Pbt24rv378v27ZtWwFMEZDdCdQUDdT8+u/fv+4uLi4vYXIgmhGZs3HjRr9///6tBYoxA3EqEPMAXTCBkZHxKzMzs6Ofn99pZPUgNooBIIGVK1eCvLAEqJEB6F9GIP0XSPuFhoZuB8mjAwwDQAoWL16cAtQ4G6o4MS4ubgGUTTw1b968wrlz51YRr2PkqgQA82JlH8nI1QYAAAAASUVORK5CYII=);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-pivotRefresh {\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTRwdCIgaGVpZ2h0PSIxNHB0IiB2aWV3Qm94PSIwIDAgMTQgMTQiIHZlcnNpb249IjEuMSI+CjxnIGlkPSJzdXJmYWNlMSI+CjxwYXRoIHN0eWxlPSIgc3Ryb2tlOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7ZmlsbDpyZ2IoMTAwJSwxMDAlLDEwMCUpO2ZpbGwtb3BhY2l0eToxOyIgZD0iTSA3LjA0Njg3NSAyLjEwMTU2MiBMIDkuMTAxNTYyIDQuMjUgTCA5LjEwMTU2MiA3IEMgNy41NTQ2ODggNyA2LjMwMDc4MSA4LjI1MzkwNiA2LjMwMDc4MSA5LjgwMDc4MSBDIDYuMzAwNzgxIDEwLjMwODU5NCA2LjQzNzUgMTAuNzg5MDYyIDYuNjc1NzgxIDExLjE5OTIxOSBMIDIuNDQ5MjE5IDExLjE5OTIxOSBMIDIuNDQ5MjE5IDIuMTAxNTYyIFogTSA3LjA0Njg3NSAyLjEwMTU2MiAiLz4KPHBhdGggc3R5bGU9IiBzdHJva2U6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtmaWxsOnJnYig0MCUsNDAlLDQwJSk7ZmlsbC1vcGFjaXR5OjE7IiBkPSJNIDYuODcxMDk0IDEuNzUgTCA5LjQ0OTIxOSA0LjM3NSBMIDkuNDQ5MjE5IDcuMDIzNDM4IEMgOS4zMzU5MzggNy4wMDc4MTIgOS4yMTg3NSA3IDkuMTAxNTYyIDcgTCA5LjEwMTU2MiA0Ljg5ODQzOCBMIDYuMzAwNzgxIDQuODk4NDM4IEwgNi4zMDA3ODEgMi4xMDE1NjIgTCAyLjQ0OTIxOSAyLjEwMTU2MiBMIDIuNDQ5MjE5IDExLjE5OTIxOSBMIDYuNjc1NzgxIDExLjE5OTIxOSBDIDYuNzQ2MDk0IDExLjMyNDIxOSA2LjgyNDIxOSAxMS40NDE0MDYgNi45MTQwNjIgMTEuNTUwNzgxIEwgMi4xMDE1NjIgMTEuNTUwNzgxIEwgMi4xMDE1NjIgMS43NSBaIE0gNi42NjAxNTYgMi4xMDE1NjIgTCA2LjY0ODQzOCAyLjEwMTU2MiBMIDYuNjQ4NDM4IDQuNTUwNzgxIEwgOS4xMDE1NjIgNC41NTA3ODEgTCA5LjEwMTU2MiA0LjU0Mjk2OSBaIE0gNi42NjAxNTYgMi4xMDE1NjIgIi8+CjxwYXRoIHN0eWxlPSIgc3Ryb2tlOm5vbmU7ZmlsbC1ydWxlOm5vbnplcm87ZmlsbDpyZ2IoMjcuMDU4ODI0JSw3Mi45NDExNzYlLDQzLjUyOTQxMiUpO2ZpbGwtb3BhY2l0eToxOyIgZD0iTSA2LjkwNjI1IDguNTU0Njg4IEwgNy43MDMxMjUgOS40NDkyMTkgTCA3LjE4NzUgOS40NDkyMTkgQyA3LjE4NzUgOS44NjcxODggNy4zMzIwMzEgMTAuNDg0Mzc1IDcuNTc0MjE5IDEwLjc4OTA2MiBDIDcuNTgyMDMxIDEwLjc5Njg3NSA3LjU4OTg0NCAxMC44MDQ2ODggNy41OTc2NTYgMTAuODEyNSBDIDcuNjI4OTA2IDEwLjg1NTQ2OSA3LjY2NDA2MiAxMC44OTQ1MzEgNy43MDMxMjUgMTAuOTI5Njg4IEMgNy43MDMxMjUgMTAuOTMzNTk0IDcuNzA3MDMxIDEwLjkzMzU5NCA3LjcwNzAzMSAxMC45Mzc1IEMgNy44MjgxMjUgMTEuMDU0Njg4IDcuOTY0ODQ0IDExLjE1NjI1IDguMTA5Mzc1IDExLjIzODI4MSBDIDguMTEzMjgxIDExLjIzODI4MSA4LjExMzI4MSAxMS4yNDIxODggOC4xMTcxODggMTEuMjQyMTg4IEMgOC4xNjAxNTYgMTEuMjY1NjI1IDguMjA3MDMxIDExLjI4NTE1NiA4LjI1MzkwNiAxMS4zMDg1OTQgQyA4LjI2MTcxOSAxMS4zMTI1IDguMjY5NTMxIDExLjMxNjQwNiA4LjI3NzM0NCAxMS4zMjAzMTIgQyA4LjMxNjQwNiAxMS4zMzU5MzggOC4zNTkzNzUgMTEuMzUxNTYyIDguMzk4NDM4IDExLjM2MzI4MSBMIDguNDQ5MjE5IDExLjM3ODkwNiBDIDguNDg0Mzc1IDExLjM5MDYyNSA4LjUxOTUzMSAxMS4zOTg0MzggOC41NTQ2ODggMTEuNDA2MjUgQyA4LjU3ODEyNSAxMS40MTQwNjIgOC42MDE1NjIgMTEuNDE3OTY5IDguNjIxMDk0IDExLjQyMTg3NSBDIDguNjYwMTU2IDExLjQyOTY4OCA4LjY5NTMxMiAxMS40MzM1OTQgOC43MzQzNzUgMTEuNDQxNDA2IEMgOC43NTM5MDYgMTEuNDQxNDA2IDguNzczNDM4IDExLjQ0NTMxMiA4Ljc5Mjk2OSAxMS40NDkyMTkgQyA4LjgzOTg0NCAxMS40NTMxMjUgOC44OTA2MjUgMTEuNDUzMTI1IDguOTM3NSAxMS40NTMxMjUgQyA5LjMwODU5NCAxMS40NjA5MzggOS42Njc5NjkgMTEuMzUxNTYyIDkuOTc2NTYyIDExLjEzNjcxOSBDIDEwLjEwNTQ2OSAxMS4wNDY4NzUgMTAuMjc3MzQ0IDExLjA3ODEyNSAxMC4zNjcxODggMTEuMjAzMTI1IEMgMTAuNDU3MDMxIDExLjMzMjAzMSAxMC40MjU3ODEgMTEuNTAzOTA2IDEwLjI5Njg3NSAxMS41OTM3NSBDIDkuOTAyMzQ0IDExLjg3MTA5NCA5LjQzNzUgMTIuMDE1NjI1IDguOTY0ODQ0IDEyLjAxNTYyNSBDIDguODg2NzE5IDEyLjAxNTYyNSA4LjgwODU5NCAxMi4wMTE3MTkgOC43MzA0NjkgMTIuMDAzOTA2IEMgOC43MTQ4NDQgMTIuMDAzOTA2IDguNjk5MjE5IDEyIDguNjgzNTk0IDExLjk5NjA5NCBDIDguNjQwNjI1IDExLjk5MjE4OCA4LjU5NzY1NiAxMS45ODgyODEgOC41NTQ2ODggMTEuOTgwNDY5IEMgOC41NDI5NjkgMTEuOTgwNDY5IDguNTMxMjUgMTEuOTc2NTYyIDguNTE1NjI1IDExLjk3MjY1NiBDIDguNDg0Mzc1IDExLjk2NDg0NCA4LjQ1NzAzMSAxMS45NTcwMzEgOC40MjU3ODEgMTEuOTUzMTI1IEMgOC4zNzg5MDYgMTEuOTQxNDA2IDguMzMyMDMxIDExLjkyOTY4OCA4LjI4OTA2MiAxMS45MTc5NjkgQyA4LjI2NTYyNSAxMS45MTAxNTYgOC4yNDIxODggMTEuOTAyMzQ0IDguMjE0ODQ0IDExLjg5MDYyNSBDIDguMTY0MDYyIDExLjg3NSA4LjExMzI4MSAxMS44NTU0NjkgOC4wNjY0MDYgMTEuODM1OTM4IEMgOC4wNTA3ODEgMTEuODMyMDMxIDguMDM5MDYyIDExLjgyNDIxOSA4LjAyMzQzOCAxMS44MTY0MDYgQyA3Ljk2NDg0NCAxMS43OTI5NjkgNy45MTAxNTYgMTEuNzY1NjI1IDcuODUxNTYyIDExLjczNDM3NSBDIDcuODQ3NjU2IDExLjczNDM3NSA3Ljg0Mzc1IDExLjczMDQ2OSA3LjgzNTkzOCAxMS43MjY1NjIgQyA3LjY0NDUzMSAxMS42MjEwOTQgNy40Njg3NSAxMS40ODgyODEgNy4zMTI1IDExLjMzMjAzMSBMIDcuMzAwNzgxIDExLjMyMDMxMiBDIDcuMjUzOTA2IDExLjI3MzQzOCA3LjIwNzAzMSAxMS4yMjI2NTYgNy4xNjQwNjIgMTEuMTcxODc1IEwgNy4xMzI4MTIgMTEuMTMyODEyIEMgNy4xMDU0NjkgMTEuMDkzNzUgNy4wNzQyMTkgMTEuMDU4NTk0IDcuMDQ2ODc1IDExLjAxOTUzMSBDIDcuMDQ2ODc1IDExLjAxNTYyNSA3LjA0Mjk2OSAxMS4wMTE3MTkgNy4wMzkwNjIgMTEuMDAzOTA2IEMgNi43ODEyNSAxMC42Mjg5MDYgNi42MjUgOS45NDE0MDYgNi42MjUgOS40NDkyMTkgTCA2LjE0MDYyNSA5LjQ0OTIxOSBaIE0gOC45NjA5MzggNy4zNTE1NjIgQyA4Ljk3MjY1NiA3LjM1MTU2MiA4Ljk4MDQ2OSA3LjM1MTU2MiA4Ljk5MjE4OCA3LjM1MTU2MiBDIDkuMDU0Njg4IDcuMzUxNTYyIDkuMTE3MTg4IDcuMzU1NDY5IDkuMTc5Njg4IDcuMzU5Mzc1IEMgOS4yMDMxMjUgNy4zNjMyODEgOS4yMzA0NjkgNy4zNjcxODggOS4yNTM5MDYgNy4zNzEwOTQgQyA5LjI5Mjk2OSA3LjM3NSA5LjMyODEyNSA3LjM3ODkwNiA5LjM2NzE4OCA3LjM4MjgxMiBDIDkuMzc4OTA2IDcuMzg2NzE5IDkuMzkwNjI1IDcuMzkwNjI1IDkuNDA2MjUgNy4zOTQ1MzEgQyA5LjQzMzU5NCA3LjM5ODQzOCA5LjQ2MDkzOCA3LjQwNjI1IDkuNDg4MjgxIDcuNDE0MDYyIEMgOS41MzkwNjIgNy40MjE4NzUgOS41ODU5MzggNy40Mzc1IDkuNjMyODEyIDcuNDQ5MjE5IEMgOS42NTYyNSA3LjQ1NzAzMSA5LjY3NTc4MSA3LjQ2NDg0NCA5LjY5NTMxMiA3LjQ2ODc1IEMgOS43NSA3LjQ4ODI4MSA5LjgwNDY4OCA3LjUwNzgxMiA5Ljg1OTM3NSA3LjUzMTI1IEwgOS44ODY3MTkgNy41NDI5NjkgQyAxMC4yMjI2NTYgNy42ODc1IDEwLjUxOTUzMSA3LjkxMDE1NiAxMC43NTc4MTIgOC4xOTUzMTIgQyAxMC43NjE3MTkgOC4yMDMxMjUgMTAuNzY1NjI1IDguMjA3MDMxIDEwLjc2OTUzMSA4LjIxNDg0NCBDIDEwLjgwNDY4OCA4LjI1NzgxMiAxMC44Mzk4NDQgOC4yOTY4NzUgMTAuODcxMDk0IDguMzQzNzUgQyAxMC44NzUgOC4zNTE1NjIgMTAuODc4OTA2IDguMzU1NDY5IDEwLjg4MjgxMiA4LjM2MzI4MSBDIDExLjE0MDYyNSA4LjczODI4MSAxMS4yOTI5NjkgOS4zMDg1OTQgMTEuMjkyOTY5IDkuODAwNzgxIEwgMTEuNzYxNzE5IDkuODAwNzgxIEwgMTEuMDExNzE5IDEwLjgxMjUgTCAxMC4xNjc5NjkgOS44MDA3ODEgTCAxMC43MzQzNzUgOS44MDA3ODEgQyAxMC43MzQzNzUgOS4zNzUgMTAuNTgyMDMxIDguODY3MTg4IDEwLjMzMjAzMSA4LjU1ODU5NCBDIDEwLjMyODEyNSA4LjU1ODU5NCAxMC4zMjgxMjUgOC41NTQ2ODggMTAuMzI4MTI1IDguNTU0Njg4IEMgMTAuMTQ4NDM4IDguMzM5ODQ0IDkuOTE3OTY5IDguMTY0MDYyIDkuNjYwMTU2IDguMDU0Njg4IEMgOS42NTYyNSA4LjA1MDc4MSA5LjY0ODQzOCA4LjA1MDc4MSA5LjY0NDUzMSA4LjA0Njg3NSBDIDkuNjAxNTYyIDguMDMxMjUgOS41NTg1OTQgOC4wMTU2MjUgOS41MTE3MTkgOCBDIDkuNSA3Ljk5NjA5NCA5LjQ4ODI4MSA3Ljk5MjE4OCA5LjQ3NjU2MiA3Ljk4ODI4MSBDIDkuNDM3NSA3Ljk3NjU2MiA5LjM5NDUzMSA3Ljk2NDg0NCA5LjM1NTQ2OSA3Ljk1NzAzMSBDIDkuMzM1OTM4IDcuOTUzMTI1IDkuMzIwMzEyIDcuOTQ1MzEyIDkuMzAwNzgxIDcuOTQ1MzEyIEMgOS4yNjE3MTkgNy45MzM1OTQgOS4yMTg3NSA3LjkyOTY4OCA5LjE3NTc4MSA3LjkyNTc4MSBDIDkuMTYwMTU2IDcuOTIxODc1IDkuMTQ0NTMxIDcuOTIxODc1IDkuMTI4OTA2IDcuOTE3OTY5IEMgOS4wNzgxMjUgNy45MTQwNjIgOS4wMjczNDQgNy45MTAxNTYgOC45NzI2NTYgNy45MTAxNTYgQyA4LjYwNTQ2OSA3LjkwNjI1IDguMjUgOC4wMTU2MjUgNy45NDE0MDYgOC4yMzA0NjkgQyA3LjgxNjQwNiA4LjMyMDMxMiA3LjY0MDYyNSA4LjI4OTA2MiA3LjU1NDY4OCA4LjE2MDE1NiBDIDcuNDY0ODQ0IDguMDM1MTU2IDcuNDk2MDk0IDcuODU5Mzc1IDcuNjIxMDk0IDcuNzczNDM4IEMgOC4wMTk1MzEgNy40OTIxODggOC40ODA0NjkgNy4zNTE1NjIgOC45NjA5MzggNy4zNTE1NjIgWiBNIDguOTYwOTM4IDcuMzUxNTYyICIvPgo8L2c+Cjwvc3ZnPgo=);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-removeField {\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTZwdCIgaGVpZ2h0PSIxNnB0IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHZlcnNpb249IjEuMSI+CjxnIGlkPSJzdXJmYWNlMSI+CjxwYXRoIHN0eWxlPSIgc3Ryb2tlOm5vbmU7ZmlsbC1ydWxlOm5vbnplcm87ZmlsbDpyZ2IoOTguMDM5MjE2JSw0NS44ODIzNTMlLDI1LjQ5MDE5NiUpO2ZpbGwtb3BhY2l0eToxOyIgZD0iTSAxMS44Mzk4NDQgNC45MjE4NzUgQyAxMi4wNTQ2ODggNC43MTA5MzggMTIuMDU0Njg4IDQuMzY3MTg4IDExLjgzOTg0NCA0LjE1NjI1IEMgMTEuNjMyODEyIDMuOTQ5MjE5IDExLjI4OTA2MiAzLjk0OTIxOSAxMS4wNzgxMjUgNC4xNTYyNSBMIDggNy4yMzgyODEgTCA0LjkyMTg3NSA0LjE1NjI1IEMgNC43MTA5MzggMy45NDkyMTkgNC4zNjcxODggMy45NDkyMTkgNC4xNTYyNSA0LjE1NjI1IEMgMy45NDkyMTkgNC4zNjcxODggMy45NDkyMTkgNC43MTA5MzggNC4xNTYyNSA0LjkyMTg3NSBMIDcuMjM4MjgxIDggTCA0LjE1NjI1IDExLjA3ODEyNSBDIDMuOTQ5MjE5IDExLjI4OTA2MiAzLjk0OTIxOSAxMS42MzI4MTIgNC4xNTYyNSAxMS44NDM3NSBDIDQuMzY3MTg4IDEyLjA1NDY4OCA0LjcxMDkzOCAxMi4wNTQ2ODggNC45MjE4NzUgMTEuODQzNzUgTCA4IDguNzYxNzE5IEwgMTEuMDc4MTI1IDExLjg0Mzc1IEMgMTEuMjg5MDYyIDEyLjA1NDY4OCAxMS42MzI4MTIgMTIuMDU0Njg4IDExLjgzOTg0NCAxMS44NDM3NSBDIDEyLjA1NDY4OCAxMS42MzI4MTIgMTIuMDU0Njg4IDExLjI4OTA2MiAxMS44Mzk4NDQgMTEuMDc4MTI1IEwgOC43NjE3MTkgOCBaIE0gMTEuODM5ODQ0IDQuOTIxODc1ICIvPgo8L2c+Cjwvc3ZnPgo=);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-pivotShowSubtotal {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAO5JREFUOBFjYBgFRIfAjRs3eI8dO7bz+PHjRsiaWJA5uNhnzpxhffny5dr///+7MjExgfQ4w9QywRggev/+/Rx79+6NRBYDamJ8//79/J8/f7r+/v373q9fv6KQ5VEM+Pbt24rv378v27ZtWwFMEZDdCdQUDdT8+u/fv+4uLi4vYXIgmhGZs3HjRr9///6tBYoxA3EqEPMAXTCBkZHxKzMzs6Ofn99pZPUgNooBIIGVK1eCvLAEqJEB6F9GIP0XSPuFhoZuB8mjAwwDQAoWL16cAtQ4G6o4MS4ubgGUTTw1b968wrlz51YRr2PkqgQA82JlH8nI1QYAAAAASUVORK5CYII=);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-pivotShowDetails {\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTZwdCIgaGVpZ2h0PSIxNnB0IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHZlcnNpb249IjEuMSI+CjxnIGlkPSJzdXJmYWNlMSI+CjxwYXRoIHN0eWxlPSIgc3Ryb2tlOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7ZmlsbDpyZ2IoNDAlLDQwJSw0MCUpO2ZpbGwtb3BhY2l0eToxOyIgZD0iTSAxMi42Njc5NjkgMTAuNjY3OTY5IEwgMTIuNjY3OTY5IDExLjMzMjAzMSBMIDEwIDExLjMzMjAzMSBMIDEwIDEwLjY2Nzk2OSBaIE0gMTIuNjY3OTY5IDguNjY3OTY5IEwgMTIuNjY3OTY5IDkuMzMyMDMxIEwgNy4zMzIwMzEgOS4zMzIwMzEgTCA3LjMzMjAzMSA4LjY2Nzk2OSBaIE0gMTIuNjY3OTY5IDYuNjY3OTY5IEwgMTIuNjY3OTY5IDcuMzMyMDMxIEwgMTAgNy4zMzIwMzEgTCAxMCA2LjY2Nzk2OSBaIE0gMTIuNjY3OTY5IDQuNjY3OTY5IEwgMTIuNjY3OTY5IDUuMzMyMDMxIEwgNy4zMzIwMzEgNS4zMzIwMzEgTCA3LjMzMjAzMSA0LjY2Nzk2OSBaIE0gMTIuNjY3OTY5IDQuNjY3OTY5ICIvPgo8cGF0aCBzdHlsZT0iIHN0cm9rZTpub25lO2ZpbGwtcnVsZTpldmVub2RkO2ZpbGw6cmdiKDI3LjA1ODgyNCUsNzIuOTQxMTc2JSw0My41Mjk0MTIlKTtmaWxsLW9wYWNpdHk6MTsiIGQ9Ik0gNS4zMzIwMzEgNS4zMzIwMzEgTCA1LjMzMjAzMSA2LjY2Nzk2OSBMIDYuNjY3OTY5IDYuNjY3OTY5IEwgNi42Njc5NjkgNy4zMzIwMzEgTCA1LjMzMjAzMSA3LjMzMjAzMSBMIDUuMzMyMDMxIDguNjY3OTY5IEwgNC42Njc5NjkgOC42Njc5NjkgTCA0LjY2Nzk2OSA3LjMzMjAzMSBMIDMuMzMyMDMxIDcuMzMyMDMxIEwgMy4zMzIwMzEgNi42Njc5NjkgTCA0LjY2Nzk2OSA2LjY2Nzk2OSBMIDQuNjY3OTY5IDUuMzMyMDMxIFogTSA1LjMzMjAzMSA1LjMzMjAzMSAiLz4KPC9nPgo8L3N2Zz4K);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-openValueFieldSettingDialogCmd {\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTZwdCIgaGVpZ2h0PSIxNnB0IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHZlcnNpb249IjEuMSI+CjxnIGlkPSJzdXJmYWNlMSI+CjxwYXRoIHN0eWxlPSIgc3Ryb2tlOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7ZmlsbDpyZ2IoMTAwJSwxMDAlLDEwMCUpO2ZpbGwtb3BhY2l0eToxOyIgZD0iTSAzLjMzMjAzMSAzLjMzMjAzMSBMIDEzLjMzMjAzMSAzLjMzMjAzMSBMIDEzLjMzMjAzMSAxMy4zMzIwMzEgTCAzLjMzMjAzMSAxMy4zMzIwMzEgWiBNIDMuMzMyMDMxIDMuMzMyMDMxICIvPgo8cGF0aCBzdHlsZT0iIHN0cm9rZTpub25lO2ZpbGwtcnVsZTpldmVub2RkO2ZpbGw6cmdiKDQwJSw0MCUsNDAlKTtmaWxsLW9wYWNpdHk6MTsiIGQ9Ik0gMTMuMzMyMDMxIDcuMzMyMDMxIEwgMTIuNjY3OTY5IDcuMzMyMDMxIEwgMTIuNjY3OTY5IDMuMzMyMDMxIEwgMy4zMzIwMzEgMy4zMzIwMzEgTCAzLjMzMjAzMSAxMi42Njc5NjkgTCA3LjMzMjAzMSAxMi42Njc5NjkgTCA3LjMzMjAzMSAxMy4zMzIwMzEgTCAyLjY2Nzk2OSAxMy4zMzIwMzEgTCAyLjY2Nzk2OSAyLjY2Nzk2OSBMIDEzLjMzMjAzMSAyLjY2Nzk2OSBaIE0gMTMuMzMyMDMxIDcuMzMyMDMxICIvPgo8cGF0aCBzdHlsZT0iIHN0cm9rZTpub25lO2ZpbGwtcnVsZTpldmVub2RkO2ZpbGw6cmdiKDUxLjM3MjU0OSUsNTEuMzcyNTQ5JSw1MS4zNzI1NDklKTtmaWxsLW9wYWNpdHk6MTsiIGQ9Ik0gNi42Njc5NjkgNCBMIDEyIDQgTCAxMiA2IEwgNi42Njc5NjkgNiBaIE0gNi42Njc5NjkgNCAiLz4KPHBhdGggc3R5bGU9IiBzdHJva2U6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtmaWxsOnJnYig1MS4zNzI1NDklLDUxLjM3MjU0OSUsNTEuMzcyNTQ5JSk7ZmlsbC1vcGFjaXR5OjE7IiBkPSJNIDQgNCBMIDYgNCBMIDYgNiBMIDQgNiBaIE0gNCA0ICIvPgo8cGF0aCBzdHlsZT0iIHN0cm9rZTpub25lO2ZpbGwtcnVsZTpldmVub2RkO2ZpbGw6cmdiKDUxLjM3MjU0OSUsNTEuMzcyNTQ5JSw1MS4zNzI1NDklKTtmaWxsLW9wYWNpdHk6MTsiIGQ9Ik0gNiA2LjY2Nzk2OSBMIDYgMTIgTCA0IDEyIEwgNCA2LjY2Nzk2OSBaIE0gNiA2LjY2Nzk2OSAiLz4KPHBhdGggc3R5bGU9IiBzdHJva2U6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtmaWxsOnJnYig3OC44MjM1MjklLDc4LjgyMzUyOSUsNzguODIzNTI5JSk7ZmlsbC1vcGFjaXR5OjE7IiBkPSJNIDcuMzMyMDMxIDQuNjY3OTY5IEwgMTEuMzMyMDMxIDQuNjY3OTY5IEwgMTEuMzMyMDMxIDUuMzMyMDMxIEwgNy4zMzIwMzEgNS4zMzIwMzEgWiBNIDcuMzMyMDMxIDQuNjY3OTY5ICIvPgo8cGF0aCBzdHlsZT0iIHN0cm9rZTpub25lO2ZpbGwtcnVsZTpldmVub2RkO2ZpbGw6cmdiKDc4LjgyMzUyOSUsNzguODIzNTI5JSw3OC44MjM1MjklKTtmaWxsLW9wYWNpdHk6MTsiIGQ9Ik0gNC42Njc5NjkgNC42Njc5NjkgTCA1LjMzMjAzMSA0LjY2Nzk2OSBMIDUuMzMyMDMxIDUuMzMyMDMxIEwgNC42Njc5NjkgNS4zMzIwMzEgWiBNIDQuNjY3OTY5IDQuNjY3OTY5ICIvPgo8cGF0aCBzdHlsZT0iIHN0cm9rZTpub25lO2ZpbGwtcnVsZTpldmVub2RkO2ZpbGw6cmdiKDc4LjgyMzUyOSUsNzguODIzNTI5JSw3OC44MjM1MjklKTtmaWxsLW9wYWNpdHk6MTsiIGQ9Ik0gNS4zMzIwMzEgNy4zMzIwMzEgTCA1LjMzMjAzMSAxMS4zMzIwMzEgTCA0LjY2Nzk2OSAxMS4zMzIwMzEgTCA0LjY2Nzk2OSA3LjMzMjAzMSBaIE0gNS4zMzIwMzEgNy4zMzIwMzEgIi8+CjxwYXRoIHN0eWxlPSIgc3Ryb2tlOm5vbmU7ZmlsbC1ydWxlOm5vbnplcm87ZmlsbDpyZ2IoMjEuMTc2NDcxJSw0OS44MDM5MjIlLDc4LjgyMzUyOSUpO2ZpbGwtb3BhY2l0eToxOyIgZD0iTSAxMy4zMzIwMzEgMTAuNjQ4NDM4IEwgMTIuNDkyMTg4IDEwLjkxMDE1NiBMIDEyLjI2OTUzMSAxMS40Mzc1IEwgMTIuNjkxNDA2IDEyLjIxODc1IEwgMTIuMjg5MDYyIDEyLjcxNDg0NCBMIDExLjU3MDMxMiAxMi4yNjk1MzEgTCAxMC45MjE4NzUgMTIuNTQyOTY5IEwgMTAuNjg3NSAxMy4zMjQyMTkgQyAxMC42ODc1IDEzLjMyNDIxOSAxMC4wODIwMzEgMTMuMzQzNzUgMTAuMDMxMjUgMTMuMzI0MjE5IEMgOS45ODA0NjkgMTMuMzA4NTk0IDkuODEyNSAxMi42NjAxNTYgOS44MTI1IDEyLjY2MDE1NiBMIDkuMTM2NzE5IDEyLjMzOTg0NCBMIDguMzk0NTMxIDEyLjY2MDE1NiBDIDguMzk0NTMxIDEyLjY2MDE1NiA3LjkyMTg3NSAxMi4yODkwNjIgNy45MDYyNSAxMi4yMDMxMjUgQyA3Ljg5MDYyNSAxMi4xMTcxODggOC4zMTI1IDExLjQ2ODc1IDguMzc4OTA2IDExLjQ2ODc1IEMgOC40NDUzMTIgMTEuNDY4NzUgOC4xMjUgMTAuOTI1NzgxIDguMTI1IDEwLjkyNTc4MSBMIDcuMzMyMDMxIDEwLjU4NTkzOCBMIDcuMzk4NDM4IDkuOTUzMTI1IEwgOC4xNDA2MjUgOS43NSBMIDguMzI4MTI1IDkuMjA3MDMxIEMgOC4zMjgxMjUgOS4yMDcwMzEgOC4wMjM0MzggOC4zNTU0NjkgOC4wMjM0MzggOC4zMzU5MzggQyA4LjAyMzQzOCA4LjMyMDMxMiA4LjUxMTcxOSA3Ljk2NDg0NCA4LjUxMTcxOSA3Ljk2NDg0NCBMIDkuMTM2NzE5IDguMzM1OTM4IEwgOS43OTI5NjkgOC4wOTc2NTYgTCA5Ljk5NjA5NCA3LjMzMjAzMSBMIDEwLjcyMjY1NiA3LjMzMjAzMSBMIDEwLjkwNjI1IDguMTE3MTg4IEwgMTEuNDYwOTM4IDguMzU1NDY5IEwgMTIuMTIxMDk0IDcuOTY0ODQ0IEwgMTIuNzQyMTg4IDguNDA2MjUgTCAxMi4yODkwNjIgOS4xNzE4NzUgTCAxMi41NzQyMTkgOS44MjAzMTIgTCAxMy4zMzIwMzEgOS45ODgyODEgWiBNIDEwLjM1MTU2MiAxMS41NjI1IEMgMTEuMDI3MzQ0IDExLjU2MjUgMTEuNTcwMzEyIDExLjAxMTcxOSAxMS41NzAzMTIgMTAuMzMyMDMxIEMgMTEuNTcwMzEyIDkuNjUyMzQ0IDExLjAyNzM0NCA5LjEwMTU2MiAxMC4zNTE1NjIgOS4xMDE1NjIgQyA5LjY3OTY4OCA5LjEwMTU2MiA5LjEzNjcxOSA5LjY1MjM0NCA5LjEzNjcxOSAxMC4zMzIwMzEgQyA5LjEzNjcxOSAxMS4wMTE3MTkgOS42Nzk2ODggMTEuNTYyNSAxMC4zNTE1NjIgMTEuNTYyNSBaIE0gMTAuMzUxNTYyIDExLjU2MjUgIi8+CjwvZz4KPC9zdmc+Cg==);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-pivotTableUnGroup {\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTVwdCIgaGVpZ2h0PSIxNXB0IiB2aWV3Qm94PSIwIDAgMTUgMTUiIHZlcnNpb249IjEuMSI+CjxnIGlkPSJzdXJmYWNlMSI+CjxwYXRoIHN0eWxlPSIgc3Ryb2tlOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7ZmlsbDpyZ2IoOTYuODYyNzQ1JSw5Ny42NDcwNTklLDk4LjQzMTM3MyUpO2ZpbGwtb3BhY2l0eToxOyIgZD0iTSA4Ljc1IDQuMzc1IEwgMTIuNSA0LjM3NSBMIDEyLjUgMTEuMjUgTCA4Ljc1IDExLjI1IFogTSA4Ljc1IDQuMzc1ICIvPgo8cGF0aCBzdHlsZT0iIHN0cm9rZTpub25lO2ZpbGwtcnVsZTpldmVub2RkO2ZpbGw6cmdiKDk2Ljg2Mjc0NSUsOTcuNjQ3MDU5JSw5OC40MzEzNzMlKTtmaWxsLW9wYWNpdHk6MTsiIGQ9Ik0gMy4xMjUgNi4yNSBMIDYuMjUgNi4yNSBMIDYuMjUgOS4zNzUgTCAzLjEyNSA5LjM3NSBaIE0gMy4xMjUgNi4yNSAiLz4KPHBhdGggc3R5bGU9IiBzdHJva2U6bm9uZTtmaWxsLXJ1bGU6bm9uemVybztmaWxsOnJnYig1MS4zNzI1NDklLDUxLjM3MjU0OSUsNTEuMzcyNTQ5JSk7ZmlsbC1vcGFjaXR5OjE7IiBkPSJNIDUgMTEuODc1IEwgNSAxMC42MjUgTCA1LjYyNSAxMC42MjUgTCA1LjYyNSAxMS4yNSBMIDcuNSAxMS4yNSBMIDcuNSAxMS44NzUgWiBNIDcuNSAzLjc1IEwgNy41IDQuMzc1IEwgNS42MjUgNC4zNzUgTCA1LjYyNSA1IEwgNSA1IEwgNSAzLjc1IFogTSA3LjUgMy43NSAiLz4KPHBhdGggc3R5bGU9IiBzdHJva2U6bm9uZTtmaWxsLXJ1bGU6bm9uemVybztmaWxsOnJnYig5OC4wMzkyMTYlLDQ1Ljg4MjM1MyUsMjUuNDkwMTk2JSk7ZmlsbC1vcGFjaXR5OjE7IiBkPSJNIDYuODc1IDUuNjI1IEwgNi44NzUgMTAgTCAyLjUgMTAgTCAyLjUgNS42MjUgWiBNIDYuMjUgNi42OTE0MDYgTCAzLjU2NjQwNiA5LjM3NSBMIDYuMjUgOS4zNzUgWiBNIDUuODA4NTk0IDYuMjUgTCAzLjEyNSA2LjI1IEwgMy4xMjUgOC45MzM1OTQgWiBNIDUuODA4NTk0IDYuMjUgIi8+CjxwYXRoIHN0eWxlPSIgc3Ryb2tlOm5vbmU7ZmlsbC1ydWxlOm5vbnplcm87ZmlsbDpyZ2IoNDAlLDQwJSw0MCUpO2ZpbGwtb3BhY2l0eToxOyIgZD0iTSAxMi41IDExLjg3NSBMIDguMTI1IDExLjg3NSBMIDguMTI1IDMuNzUgTCAxMi41IDMuNzUgWiBNIDExLjg3NSA5LjM3NSBMIDguNzUgOS4zNzUgTCA4Ljc1IDExLjI1IEwgMTEuODc1IDExLjI1IFogTSAxMS44NzUgNi44NzUgTCA4Ljc1IDYuODc1IEwgOC43NSA4Ljc1IEwgMTEuODc1IDguNzUgWiBNIDExLjg3NSA0LjM3NSBMIDguNzUgNC4zNzUgTCA4Ljc1IDYuMjUgTCAxMS44NzUgNi4yNSBaIE0gMTEuODc1IDQuMzc1ICIvPgo8L2c+Cjwvc3ZnPgo=);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-pivotTableGroup {\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTJwdCIgaGVpZ2h0PSIxMnB0IiB2aWV3Qm94PSIwIDAgMTIgMTIiIHZlcnNpb249IjEuMSI+CjxnIGlkPSJzdXJmYWNlMSI+CjxwYXRoIHN0eWxlPSIgc3Ryb2tlOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7ZmlsbDpyZ2IoOTYuODYyNzQ1JSw5Ny42NDcwNTklLDk4LjQzMTM3MyUpO2ZpbGwtb3BhY2l0eToxOyIgZD0iTSA2LjY2Nzk2OSAyLjY2Nzk2OSBMIDEwLjY2Nzk2OSAyLjY2Nzk2OSBMIDEwLjY2Nzk2OSAxMCBMIDYuNjY3OTY5IDEwIFogTSA2LjY2Nzk2OSAyLjY2Nzk2OSAiLz4KPHBhdGggc3R5bGU9IiBzdHJva2U6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtmaWxsOnJnYig5Ni44NjI3NDUlLDk3LjY0NzA1OSUsOTguNDMxMzczJSk7ZmlsbC1vcGFjaXR5OjE7IiBkPSJNIDEuMzMyMDMxIDQuNjY3OTY5IEwgNC42Njc5NjkgNC42Njc5NjkgTCA0LjY2Nzk2OSA4IEwgMS4zMzIwMzEgOCBaIE0gMS4zMzIwMzEgNC42Njc5NjkgIi8+CjxwYXRoIHN0eWxlPSIgc3Ryb2tlOm5vbmU7ZmlsbC1ydWxlOm5vbnplcm87ZmlsbDpyZ2IoNTEuMzcyNTQ5JSw1MS4zNzI1NDklLDUxLjM3MjU0OSUpO2ZpbGwtb3BhY2l0eToxOyIgZD0iTSAzLjMzMjAzMSA5LjMzMjAzMSBMIDMuMzMyMDMxIDEwIEwgNS4zMzIwMzEgMTAgTCA1LjMzMjAzMSAxMC42Njc5NjkgTCAyLjY2Nzk2OSAxMC42Njc5NjkgTCAyLjY2Nzk2OSA5LjMzMjAzMSBaIE0gNS4zMzIwMzEgNCBMIDUuMzMyMDMxIDguNjY3OTY5IEwgMC42Njc5NjkgOC42Njc5NjkgTCAwLjY2Nzk2OSA0IFogTSA0LjY2Nzk2OSA0LjY2Nzk2OSBMIDEuMzMyMDMxIDQuNjY3OTY5IEwgMS4zMzIwMzEgOCBMIDQuNjY3OTY5IDggWiBNIDUuMzMyMDMxIDIgTCA1LjMzMjAzMSAyLjY2Nzk2OSBMIDMuMzMyMDMxIDIuNjY3OTY5IEwgMy4zMzIwMzEgMy4zMzIwMzEgTCAyLjY2Nzk2OSAzLjMzMjAzMSBMIDIuNjY3OTY5IDIgWiBNIDUuMzMyMDMxIDIgIi8+CjxwYXRoIHN0eWxlPSIgc3Ryb2tlOm5vbmU7ZmlsbC1ydWxlOm5vbnplcm87ZmlsbDpyZ2IoNDAlLDQwJSw0MCUpO2ZpbGwtb3BhY2l0eToxOyIgZD0iTSAxMS4zMzIwMzEgMTAuNjY3OTY5IEwgNiAxMC42Njc5NjkgTCA2IDIgTCAxMS4zMzIwMzEgMiBaIE0gMTAuNjY3OTY5IDggTCA2LjY2Nzk2OSA4IEwgNi42Njc5NjkgMTAgTCAxMC42Njc5NjkgMTAgWiBNIDEwLjY2Nzk2OSA1LjMzMjAzMSBMIDYuNjY3OTY5IDUuMzMyMDMxIEwgNi42Njc5NjkgNy4zMzIwMzEgTCAxMC42Njc5NjkgNy4zMzIwMzEgWiBNIDEwLjY2Nzk2OSAyLjY2Nzk2OSBMIDYuNjY3OTY5IDIuNjY3OTY5IEwgNi42Njc5NjkgNC42Njc5NjkgTCAxMC42Njc5NjkgNC42Njc5NjkgWiBNIDEwLjY2Nzk2OSAyLjY2Nzk2OSAiLz4KPHBhdGggc3R5bGU9IiBzdHJva2U6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtmaWxsOnJnYigyMS4xNzY0NzElLDQ5LjgwMzkyMiUsNzguODIzNTI5JSk7ZmlsbC1vcGFjaXR5OjE7IiBkPSJNIDEwIDguNjY3OTY5IEwgMTAgOS4zMzIwMzEgTCA3LjMzMjAzMSA5LjMzMjAzMSBMIDcuMzMyMDMxIDguNjY3OTY5IFogTSAxMCA2IEwgMTAgNi42Njc5NjkgTCA3LjMzMjAzMSA2LjY2Nzk2OSBMIDcuMzMyMDMxIDYgWiBNIDEwIDMuMzMyMDMxIEwgMTAgNCBMIDcuMzMyMDMxIDQgTCA3LjMzMjAzMSAzLjMzMjAzMSBaIE0gMTAgMy4zMzIwMzEgIi8+CjxwYXRoIHN0eWxlPSIgc3Ryb2tlOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7ZmlsbDpyZ2IoNDAlLDQwJSw0MCUpO2ZpbGwtb3BhY2l0eToxOyIgZD0iTSAzLjMzMjAzMSA1LjMzMjAzMSBMIDMuMzMyMDMxIDYgTCA0IDYgTCA0IDYuNjY3OTY5IEwgMy4zMzIwMzEgNi42Njc5NjkgTCAzLjMzMjAzMSA3LjMzMjAzMSBMIDIuNjY3OTY5IDcuMzMyMDMxIEwgMi42Njc5NjkgNi42Njc5NjkgTCAyIDYuNjY3OTY5IEwgMiA2IEwgMi42Njc5NjkgNiBMIDIuNjY3OTY5IDUuMzMyMDMxIFogTSAzLjMzMjAzMSA1LjMzMjAzMSAiLz4KPC9nPgo8L3N2Zz4K);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-pivotExpand {\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTZwdCIgaGVpZ2h0PSIxNnB0IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHZlcnNpb249IjEuMSI+CjxnIGlkPSJzdXJmYWNlMSI+CjxwYXRoIHN0eWxlPSIgc3Ryb2tlOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7ZmlsbDpyZ2IoNDAlLDQwJSw0MCUpO2ZpbGwtb3BhY2l0eToxOyIgZD0iTSAxMi42Njc5NjkgMTAuNjY3OTY5IEwgMTIuNjY3OTY5IDExLjMzMjAzMSBMIDEwIDExLjMzMjAzMSBMIDEwIDEwLjY2Nzk2OSBaIE0gMTIuNjY3OTY5IDguNjY3OTY5IEwgMTIuNjY3OTY5IDkuMzMyMDMxIEwgNy4zMzIwMzEgOS4zMzIwMzEgTCA3LjMzMjAzMSA4LjY2Nzk2OSBaIE0gMTIuNjY3OTY5IDYuNjY3OTY5IEwgMTIuNjY3OTY5IDcuMzMyMDMxIEwgMTAgNy4zMzIwMzEgTCAxMCA2LjY2Nzk2OSBaIE0gMTIuNjY3OTY5IDQuNjY3OTY5IEwgMTIuNjY3OTY5IDUuMzMyMDMxIEwgNy4zMzIwMzEgNS4zMzIwMzEgTCA3LjMzMjAzMSA0LjY2Nzk2OSBaIE0gMTIuNjY3OTY5IDQuNjY3OTY5ICIvPgo8cGF0aCBzdHlsZT0iIHN0cm9rZTpub25lO2ZpbGwtcnVsZTpldmVub2RkO2ZpbGw6cmdiKDI3LjA1ODgyNCUsNzIuOTQxMTc2JSw0My41Mjk0MTIlKTtmaWxsLW9wYWNpdHk6MTsiIGQ9Ik0gNS4zMzIwMzEgNS4zMzIwMzEgTCA1LjMzMjAzMSA2LjY2Nzk2OSBMIDYuNjY3OTY5IDYuNjY3OTY5IEwgNi42Njc5NjkgNy4zMzIwMzEgTCA1LjMzMjAzMSA3LjMzMjAzMSBMIDUuMzMyMDMxIDguNjY3OTY5IEwgNC42Njc5NjkgOC42Njc5NjkgTCA0LjY2Nzk2OSA3LjMzMjAzMSBMIDMuMzMyMDMxIDcuMzMyMDMxIEwgMy4zMzIwMzEgNi42Njc5NjkgTCA0LjY2Nzk2OSA2LjY2Nzk2OSBMIDQuNjY3OTY5IDUuMzMyMDMxIFogTSA1LjMzMjAzMSA1LjMzMjAzMSAiLz4KPC9nPgo8L3N2Zz4K);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-pivotCollapse {\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTZwdCIgaGVpZ2h0PSIxNnB0IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHZlcnNpb249IjEuMSI+CjxnIGlkPSJzdXJmYWNlMSI+CjxwYXRoIHN0eWxlPSIgc3Ryb2tlOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7ZmlsbDpyZ2IoNDAlLDQwJSw0MCUpO2ZpbGwtb3BhY2l0eToxOyIgZD0iTSAxMi42Njc5NjkgMTAuNjY3OTY5IEwgMTIuNjY3OTY5IDExLjMzMjAzMSBMIDEwIDExLjMzMjAzMSBMIDEwIDEwLjY2Nzk2OSBaIE0gMTIuNjY3OTY5IDguNjY3OTY5IEwgMTIuNjY3OTY5IDkuMzMyMDMxIEwgNy4zMzIwMzEgOS4zMzIwMzEgTCA3LjMzMjAzMSA4LjY2Nzk2OSBaIE0gMTIuNjY3OTY5IDYuNjY3OTY5IEwgMTIuNjY3OTY5IDcuMzMyMDMxIEwgMTAgNy4zMzIwMzEgTCAxMCA2LjY2Nzk2OSBaIE0gMTIuNjY3OTY5IDQuNjY3OTY5IEwgMTIuNjY3OTY5IDUuMzMyMDMxIEwgNy4zMzIwMzEgNS4zMzIwMzEgTCA3LjMzMjAzMSA0LjY2Nzk2OSBaIE0gMTIuNjY3OTY5IDQuNjY3OTY5ICIvPgo8cGF0aCBzdHlsZT0iIHN0cm9rZTpub25lO2ZpbGwtcnVsZTpldmVub2RkO2ZpbGw6cmdiKDk4LjAzOTIxNiUsNDUuODgyMzUzJSwyNS40OTAxOTYlKTtmaWxsLW9wYWNpdHk6MTsiIGQ9Ik0gMy4zMzIwMzEgNi42Njc5NjkgTCA2IDYuNjY3OTY5IEwgNiA3LjMzMjAzMSBMIDMuMzMyMDMxIDcuMzMyMDMxIFogTSAzLjMzMjAzMSA2LjY2Nzk2OSAiLz4KPC9nPgo8L3N2Zz4K);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-pivotExpandEntireField {\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTZwdCIgaGVpZ2h0PSIxNnB0IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHZlcnNpb249IjEuMSI+CjxnIGlkPSJzdXJmYWNlMSI+CjxwYXRoIHN0eWxlPSIgc3Ryb2tlOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7ZmlsbDpyZ2IoNDAlLDQwJSw0MCUpO2ZpbGwtb3BhY2l0eToxOyIgZD0iTSAxMi42Njc5NjkgMTAuNjY3OTY5IEwgMTIuNjY3OTY5IDExLjMzMjAzMSBMIDEwIDExLjMzMjAzMSBMIDEwIDEwLjY2Nzk2OSBaIE0gMTIuNjY3OTY5IDguNjY3OTY5IEwgMTIuNjY3OTY5IDkuMzMyMDMxIEwgNy4zMzIwMzEgOS4zMzIwMzEgTCA3LjMzMjAzMSA4LjY2Nzk2OSBaIE0gMTIuNjY3OTY5IDYuNjY3OTY5IEwgMTIuNjY3OTY5IDcuMzMyMDMxIEwgMTAgNy4zMzIwMzEgTCAxMCA2LjY2Nzk2OSBaIE0gMTIuNjY3OTY5IDQuNjY3OTY5IEwgMTIuNjY3OTY5IDUuMzMyMDMxIEwgNy4zMzIwMzEgNS4zMzIwMzEgTCA3LjMzMjAzMSA0LjY2Nzk2OSBaIE0gMTIuNjY3OTY5IDQuNjY3OTY5ICIvPgo8cGF0aCBzdHlsZT0iIHN0cm9rZTpub25lO2ZpbGwtcnVsZTpldmVub2RkO2ZpbGw6cmdiKDI3LjA1ODgyNCUsNzIuOTQxMTc2JSw0My41Mjk0MTIlKTtmaWxsLW9wYWNpdHk6MTsiIGQ9Ik0gNS4zMzIwMzEgNS4zMzIwMzEgTCA1LjMzMjAzMSA2LjY2Nzk2OSBMIDYuNjY3OTY5IDYuNjY3OTY5IEwgNi42Njc5NjkgNy4zMzIwMzEgTCA1LjMzMjAzMSA3LjMzMjAzMSBMIDUuMzMyMDMxIDguNjY3OTY5IEwgNC42Njc5NjkgOC42Njc5NjkgTCA0LjY2Nzk2OSA3LjMzMjAzMSBMIDMuMzMyMDMxIDcuMzMyMDMxIEwgMy4zMzIwMzEgNi42Njc5NjkgTCA0LjY2Nzk2OSA2LjY2Nzk2OSBMIDQuNjY3OTY5IDUuMzMyMDMxIFogTSA1LjMzMjAzMSA1LjMzMjAzMSAiLz4KPC9nPgo8L3N2Zz4K);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-pivotCollapseEntireField {\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTZwdCIgaGVpZ2h0PSIxNnB0IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHZlcnNpb249IjEuMSI+CjxnIGlkPSJzdXJmYWNlMSI+CjxwYXRoIHN0eWxlPSIgc3Ryb2tlOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7ZmlsbDpyZ2IoNDAlLDQwJSw0MCUpO2ZpbGwtb3BhY2l0eToxOyIgZD0iTSAxMi42Njc5NjkgMTAuNjY3OTY5IEwgMTIuNjY3OTY5IDExLjMzMjAzMSBMIDEwIDExLjMzMjAzMSBMIDEwIDEwLjY2Nzk2OSBaIE0gMTIuNjY3OTY5IDguNjY3OTY5IEwgMTIuNjY3OTY5IDkuMzMyMDMxIEwgNy4zMzIwMzEgOS4zMzIwMzEgTCA3LjMzMjAzMSA4LjY2Nzk2OSBaIE0gMTIuNjY3OTY5IDYuNjY3OTY5IEwgMTIuNjY3OTY5IDcuMzMyMDMxIEwgMTAgNy4zMzIwMzEgTCAxMCA2LjY2Nzk2OSBaIE0gMTIuNjY3OTY5IDQuNjY3OTY5IEwgMTIuNjY3OTY5IDUuMzMyMDMxIEwgNy4zMzIwMzEgNS4zMzIwMzEgTCA3LjMzMjAzMSA0LjY2Nzk2OSBaIE0gMTIuNjY3OTY5IDQuNjY3OTY5ICIvPgo8cGF0aCBzdHlsZT0iIHN0cm9rZTpub25lO2ZpbGwtcnVsZTpldmVub2RkO2ZpbGw6cmdiKDk4LjAzOTIxNiUsNDUuODgyMzUzJSwyNS40OTAxOTYlKTtmaWxsLW9wYWNpdHk6MTsiIGQ9Ik0gMy4zMzIwMzEgNi42Njc5NjkgTCA2IDYuNjY3OTY5IEwgNiA3LjMzMjAzMSBMIDMuMzMyMDMxIDcuMzMyMDMxIFogTSAzLjMzMjAzMSA2LjY2Nzk2OSAiLz4KPC9nPgo8L3N2Zz4K);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-pivotClearFilterFrom {\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjYgKDY3NDkxKSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5jbGVhcjwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxnIGlkPSJjbGVhciIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9IkNsZWFyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxLjAwMDAwMCwgMS4wMDAwMDApIiBmaWxsPSIjNjY2NjY2Ij4KICAgICAgICAgICAgPHBhdGggZD0iTTcuMTkyNjE2MTIsNS4xNTIwMTY3NiBDNi41MjA5OTE3MSw0LjkzNzA3MzIgNS45MzEzOTk1Niw1LjAyOTE5MTc0IDUuNTYzOTg4NDksNS40OTI0NzM1OSBDNS4zMzQ4NDUsNS43ODQxMjAzMSA1LjE0MDIxNzM2LDYuMjI0Njc1MTggNS4xMDM0NTM5Niw2LjYzOTYyMDIyIEM1LjA0NTk1NDY5LDcuMjg4NjA4OTYgNS4zNjQ4MDg0OCw3LjgzOTU4NDM4IDYuMDU0OTg5NTcsOC4wODYxNjg3NSBDNi4xNzI4MjMzMyw4LjEyODI2Nzc5IDYuMjg3NTE0LDguMTcyMjcyNTYgNi4zOTk4NjY2Nyw4LjIxODYxNDE1IEw2LjM5OTg2NjY3LDkuNjAwMjY2NjcgTDQuODAwMTMzMzMsMTEuMiBMNC44MDAxMzMzMyw2LjE3MTIgTDAsMCBMMTEuMiwwIEw3LjE5MjYxNjEyLDUuMTUyMDE2NzYgWiIgaWQ9IkNvbWJpbmVkLVNoYXBlIiBmaWxsLXJ1bGU9Im5vbnplcm8iPjwvcGF0aD4KICAgICAgICAgICAgPHBhdGggZD0iTTEzLjk4MjcyNjgsNi45MDA3Mjk4MiBDMTMuNzI1MTY1NSw3LjU2Mjg1OTg4IDEyLjMzNDU5OTIsOC4yMDAyNDkzOSAxMS4wNTgzODczLDkuMTQ4MzYxMzQgQzExLjY5MzU5NDcsMTAuMTU5MzE2NCAxMi4zOTYxNjIxLDExLjUxNTQxODQgMTMuNTYzODgzNSwxNCBDMTIuMDk5Njc2NywxMi4yODY4NDA5IDExLjAyNDQzMjMsMTEuMjUwNDE5MyA5LjkzODY5OTgsMTAuMTA4MzEzMyBDOC43ODM0MDA5MSwxMS4xNjQ4MDY5IDguMjM1MDk1NTMsMTEuNzI1MTEwNiA3LjgzMjMxMzkxLDEyLjQ3MzkwMDggQzcuMzczOTgxMDIsMTMuMzI1OTYzNCA3LjExMDQ5NDk5LDE0LjI4MzI4NDcgNi4yNDMzOTk3LDEzLjg2Nzk3MzQgQzUuNjY1MzM2MTcsMTMuNTkwMTg4NCA1LjE0NDQxNjQ1LDEyLjU1MDk5OTQgNi4yNDMzOTk3LDExLjQ3MzU1ODEgQzcuMzQyMzgyOTQsMTAuMzk2MTE2NyA4LjE5OTU0MDE4LDkuNTkwOTk1NzQgOC44MTU2OTk1OSw5LjA1OTEwNTg1IEM3Ljk3NTkzMzk1LDguMzc3ODQ5NjEgNy4yMjIyOTgxMSw3LjkwODU1MTE2IDYuMjQzMzk5Nyw3LjU1ODgxNTM0IEM1LjI2NDUwMTI4LDcuMjA5MDc5NTIgNS43NTAxNjM4OCw2LjE2MTk0NTMyIDYuMDAyNzU2MTEsNS44NDA0NDMzOCBDNi4yNTcwMDQ2OCw1LjUxOTg1MjIxIDYuNzgwODgyODQsNS41MTk4NTIyMSA3LjQwNTMyMzk2LDUuODQwNDQzMzggQzguNjI3NzA0NzIsNi42MTczMzA1IDkuNTcwOTkxNzcsNy4zNjE0Mjk4OSAxMC4yMzc2Njk2LDguMDcyNzQxNTQgQzExLjY3MzcxODYsNy4zMTMxNTkwNiAxNC4yMzQ0OTA4LDYuMjUyMjYxMzIgMTMuOTgyNzI2OCw2LjkwMDcyOTgyIFoiIGlkPSJGaWxsLTkiPjwvcGF0aD4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-copy {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAOCAYAAADwikbvAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkMwNEYxQjlFNDJCMzExRTc4OTZBRDU3QzgwMEM3QTQ3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkMwNEYxQjlGNDJCMzExRTc4OTZBRDU3QzgwMEM3QTQ3Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QzA0RjFCOUM0MkIzMTFFNzg5NkFENTdDODAwQzdBNDciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QzA0RjFCOUQ0MkIzMTFFNzg5NkFENTdDODAwQzdBNDciLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6TXfPoAAABdUlEQVR42oSSPUsDQRCGJ+EI2CWCiKKYSrtgYyOCYCUBSSVYCBZiKhXxfyiCjYgSG0FIoSiIhUVSaJ2fYGNnYUhyH7s7u85s7i7mPMnAMLu389777EfmofFhtNaAiKAU2sq5UyllYFSwOBkXdw1Tu2+ZUVpHa4wnmtqzoV9hqgj1t28jBIAvAbhKaj2s5GMiB1HZAZISNUDOyYCUPRDUubkyPuR0/tiG5eqTeb/csD/IIkq7IJWxybG/XQYvGCbiaLsSnk/XYXGrZr84SoViNKAo3Tb2qy//EH11BBxdfUIhX4CF8okhsbBNQvbFNknQ9QZEkfhsbzpkmYPVg1fecyhWeiAm4q6bTsRrsxM5QDKNsYPfzpQdL52IK4cKfHaWYRM5Ex4vImXknCSKxDJwB1c1PzM2dC3RnpNEGB699HvgXN/WgTMZxaVqKlEsZufWy03qG54s7Zo0oijsnv97t/zC1o6bgFKQi2cxhde1led82j8CDAAflFKLtUvyvAAAAABJRU5ErkJggg==);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-cut {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAAQCAYAAADNo/U5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjk4M0YzQkU2NDJCMzExRTdBQzFCQzM2MzQ3Q0NEMUVDIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjk4M0YzQkU3NDJCMzExRTdBQzFCQzM2MzQ3Q0NEMUVDIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6OTgzRjNCRTQ0MkIzMTFFN0FDMUJDMzYzNDdDQ0QxRUMiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6OTgzRjNCRTU0MkIzMTFFN0FDMUJDMzYzNDdDQ0QxRUMiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6vHhfyAAABpklEQVR42mJgwAI6lxz427xgrzIDDsCETZBPgI/p8cNHx3BqKp24fkHZhPVlyILMjEwM//8z8uDU9PLJEyEGRsZOdI3////jxKlpUXeu3+MHD75hamRkxOsneVUVmUf3H/zCZiNOTR1ZPu9lFOW0Ht6//x+kkShNINCTH3RXRl7R8uH9Bwzv375l4ONmY4iqmCaITROGu0HO+/Lxdef/f/8Y/nDpHj15g62YT1zsFrsgpzUHL9vRrVkC7zE0KbrN8nFx0NjMJST048DBd2z/2TgZOAR4Gdj4eX6x8rGzMf3978+CafX/tHN3/zL8v/9f5x8j47u/v/7c+/XlmwDbr19SvxmFrBn+/l8Nt0nVdYb5f2aOHazcwgJcgmIMZ+eYg+V0ow4L/v3Hco+JmWnOlaXmpcZZl//DA+I/I8sxVl65w8ysQtd+//wHt/nyMtv3zEx/lP78/BWhFXHs/8/3XxCSqt5L/sPY2hFH/mMLNVW/feYqAXuV4X769/vLD42g7d2MbNxrcMXP7U1OJ1Hiiek/g8Pf76+LGP58P/H/P8NmfJELEGAAG6Sldb/nz3cAAAAASUVORK5CYII=);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-pasteOptions {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkRDMUFEQ0I5NDJCMzExRTdBMjQ1QkFFQURDMUU0MzZBIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkRDMUFEQ0JBNDJCMzExRTdBMjQ1QkFFQURDMUU0MzZBIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6REMxQURDQjc0MkIzMTFFN0EyNDVCQUVBREMxRTQzNkEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6REMxQURDQjg0MkIzMTFFN0EyNDVCQUVBREMxRTQzNkEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6s+LeRAAACA0lEQVR42nxTz0tUURT+rmgTjiJEEhlEiBEEgS1yIoJqIUMi6Eb/AFfSTvqxi1rVpsSFC4kYaF2IUhS4mmhTK0MxHISiFLFFOoPz4737zr23c+97z5lxRs/jvnvuved95/vOeVfgkD19MWfq1g8mBY4xUVocNqaw4Rb3Vydw9/YtjAyl3Hrx4zd8yn7GyyuZMLjrIpIjH+oAW+zHycHnSF7NuY3r11L4swU3rG/NntmYOFGttbq3/OumtfVN3Ein6wLO9vShNqY5gCm46cuz2SYhS1Hk3jEAeg9aOZX8GNgqvvfyULwXaICICeyw330PTzL/zMpyFrmdzsSPt+MyYpCHJq6NiBpgBPxAYfzmqYaMMwsS58/1oOxt+Rib7WyJJSjOogIRDvY9Sc3bJjSmH6aR6u/DmY4T+5GEPNO09GMznKERwPJ7/WYerzLEkvlcaxxIUNKis2vCWhQrgTsKSMe5oTTh+7tJ7BaK+PV7E48y2zhgoAMRZTEhQCkE8KWOasMMuTZECu2JkxjovwySP6sMiOI8wkHsl6Vbe1LVCKiKTLYzO78SAXCPT/e2VcW2SRRzIYOyT64rImIXe0CCAcpotf936WtjteMaVCoUZrYyHAkRzrY+HgMcvhyxjT4mF3bpQteRN9FKOPKq3pnKOgBFAXfIc8GWss1K7BPvWWb/BRgAxiv0G+KDFYkAAAAASUVORK5CYII=);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-pasteAll {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAXCAYAAADk3wSdAAAAuUlEQVR42u3VsQrDIBAGYF/ZSTdfoI/j4pBdFPe+QrsUuoWCV064ogkmplpooQc/ITH3JSTGMFYp5xwIIYBzniKlhBACsJ4iLMaYQvvNwPX+SCcbY17NNZSitYa8t6jzZYbTdIP87lqDPdiLRoHiwV6U+lfoaqChqr35QE++A2U9z2UL3Xtp3nt4C6U5uwyOKaUAv8KhKG4RttbCMLSYvyPQ5QX+6K+gtJ4ORXHl3oMPo0f+WR9BW/ME6gakYAjbY+4AAAAASUVORK5CYII=);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-pasteFormula {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAXCAYAAADk3wSdAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkUzMjQ5N0Y2N0U0QzExRTdCOTEyQ0NDNzNENjU1NjFDIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkUzMjQ5N0Y3N0U0QzExRTdCOTEyQ0NDNzNENjU1NjFDIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6RTMyNDk3RjQ3RTRDMTFFN0I5MTJDQ0M3M0Q2NTU2MUMiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RTMyNDk3RjU3RTRDMTFFN0I5MTJDQ0M3M0Q2NTU2MUMiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6KOVrPAAABtklEQVR42qxVPY8BURQ9IxKFZisSSjUKFYlmhdhEQqPWCVExWws6kdH5B0JDojMU2xASnVbiB1Bto9G83Xs3M7GyY+fDSSbvK/fcOee9d58EA+x2OzGdTnG9Xnns8XhQLBYRi8Uk/AO30cJ4POZWURRuZVnGcDiEGbiFENyRJAmLxUKoqvowoF6vc0AqlUIul5Nu4zXwpPLxKeTXFzQaDVhBv9+nWHzHSrekLiKEQ9xzuG8WOLNFMmsbZQZkmYb3Z5F2u11st1uk0+lf8y67hJPJBKfTCZVKhdunkC6XSyQSCWSzWXQ6HeekdJbP5zNCodBzNqpQKOj9drvNftZqNWeks9kMg8GAfbyX7Uj+fr+H3+83XLdF+shPW/K1ghMMBnV/e70eDoeDaLVanMwy6fF4hM/nQzgcZn+bzSY2mw3Pj0YjyZZ88jMajerjSCTCZ7Zarb7Z9vTeT0pwuVwQCATUPz01qjpa4Viv19zSLdJA0r1eL1arlUgmkz/yqcBakR6Px/WxloQsIE9ps3T5j4jpL8vlMhMQaSaT0W8WeVkqldgC6tNnGvQu5fN5MZ/PTb0SXwIMAAHPvw+5QntsAAAAAElFTkSuQmCC);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-pasteValues {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAXCAYAAADk3wSdAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkFCQzg0RDc3N0U0QzExRTc4MzcyRDdEMjUyQjJDODFCIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkFCQzg0RDc4N0U0QzExRTc4MzcyRDdEMjUyQjJDODFCIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QUJDODRENzU3RTRDMTFFNzgzNzJEN0QyNTJCMkM4MUIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QUJDODRENzY3RTRDMTFFNzgzNzJEN0QyNTJCMkM4MUIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7cAGVnAAABf0lEQVR42mL8//9/DgN2MKWiouL/r1+/wBx2dnaG9vZ2RiATl3o4YMIlUVRUBDawt7cXjH/+/AkWQ7cYCcMBC0zg379/rUxMTNVYNKJbNhlE9/X1MeJSwwj0PkPvvg//i50EQBoYSAFAg0F6GYB6UYKFCWQgA4UA3QwWJAmwzSQaRlpEUQJGDR01dCgYykKJZlB5QbSh169fZ9i0aRPDmTNnGFavXg0XT0pKYrh16xaYfeTIETBdU1PDcODAARBzsrGxMcPEiRNzsRoKMuzmzZsMz58/h4tt2LCBwdHRkWHevHlgvo2NDdjglpYWMP/UqVOwUm4KVkNjY2PBGKQRBgICAlDU8PDwoPA/f/6M3fvIpQ6u8AKB0NBQhujoaHQXMvj6+kJiH1rAEgWePHkCNtDPzw/sExAwMzMDB8Ps2bMZ9u/fj0hS6AbjcmVhYSGKgciAl5cXpTrBqB0XL148eebMmXC+pKQkOBUghzEsBXh4eDB8+fIFzIfGPiNAgAEAG66hf3H3yXAAAAAASUVORK5CYII=);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-pasteFormatting {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAXCAYAAADk3wSdAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkRFMkIzNDMzNzY3RDExRTc5ODIyQjBCNDM5MUZGMzNBIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkRFMkIzNDM0NzY3RDExRTc5ODIyQjBCNDM5MUZGMzNBIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6REUyQjM0MzE3NjdEMTFFNzk4MjJCMEI0MzkxRkYzM0EiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6REUyQjM0MzI3NjdEMTFFNzk4MjJCMEI0MzkxRkYzM0EiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6glf7eAAAC1ElEQVR42rRVX0hTYRT/XV3KfKhUUAe+yIaDcqisp0kjnA+CPSi6erKQooe96aAQlOGDPplBkCQalBuMHsagWQxpjh4mZsNN8WELh1QPY1quEVs0YjfPF/dyt907hOgH9373nO/7fpxz7vnDQQHb29u8x+NBPp9ncm1tLaxWK4xGI4cK4HkeKnpxXPk5t9vN1oWFBbZOTEzA5XIpEkk5VPSKpX7x+qYarK+vw+/3VzIE4+PjPK0WiwUDAwOIHzFPiqxSnSr5tf0c9L01soRkoRwCgQAjpbvoAC8lrmLKf0Qph0r4eLjxXYzfWUF35FCF/4AyUofDgcHBQdjtdlFHqUV6JVzvqKMM4FdXV/ky0lAohEQiAafTKZIRvF4vhoaGFAkpc3w+HyKRyNncX1xchMlkQldXl+w+EQaDQfbIut/T0wOtVovR0VEmd3Z2sty12WyyhPbeiwiHw8xKKbj5QJqXHiq1kpBKpbC7u4vm5mYsLS2J+/F4DMvLKygUCqLuNIM4Rfej0Sg2NzeZ5UKcW1paxDgTjo+/FhGq1erKMRV+DpGW1jlhenoauVwOIyMjTG5sbMTc3BynSEpWknXDw8PQ6XRinJPJJLq7uzE7O4tsNsvKOp1OY2xsDFNTU1xZRUlBf1rakWZmZsRvcpcsFJDJZGAwGOTLtBLcwTjefDhE/ncBpksa3L5zD67nz2A2m9HX1yd0qrOTPvLuoPq0Vzrv9zN5xb8Pb/gIk5OT+PyjWrb+Kyb/09d7yGTzMBtaRd3d/g68j6XYJFDqcKrSriOU3ct3cbzaOvw7WuIp6DQX8Nh2DR+/nEDTUIdv2YJyQyGS0jr2hg7w4m2s6OBBMgPfVgJP1vZw82obTn4Wiu4VVRTlHXV/EhrUVdjYSZQRCqhRcbhl0eNye5voOhHSvabz5zhxXkmHViDyiZ/3RMrINPV1aG+tx4MbVzi5IVlaHH8EGAC5Ozy0Q9eoOwAAAABJRU5ErkJggg==);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-pasteValuesFormatting {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAzNJREFUSA2llU1oE1EQx3fTxASxqRaLCFEsCoqgN7XixX6AaBHsSVsPUpUiVYr58iBYUrTUmqTBIgiiIIKCl4JQKwj98OAXikXtURGkaK2oNWikaZP1N9tsWJtkE/DB7MybmfefefPmvVWVIsPn893XNG2f4aaq6lBfX1+jMf9v7vV6NTPI4rnZlk+251P6/f696XT6GjZPPnsmyKTNZmuLRqMP8vkYumyA/uGZ9UlFuRCoX968GLxA1p6M35royMwdh6ac66hf/t4ANrhNBAGfU5WniqIdyhjyZm4sMnHdjzNqlvWCY7Lpor4DjN04VRnGWCymGnKpXNbPqWo3/kaS+lJ9B0h1pQIV8cvB0Xdgzt4AoO7HkEO05YzT6azr6en5iq6T+UratMPwM/N8ONlDNjtm5F673b4jlUr5k8lkE/fhOQDtdM7WPL4FVUaJchzI9CNdsgVDNZSGbgAejEQi0znOFoqCAQDzEeA4a9+Q+SpoGt2TYDC4C7nkJihYIjIdA3yMum9gN4+h9vn5+RF0r7mIv+AtUNFRcAeyUjJlXId3MZVAAy6XqxU5+zaJn9WwDECmbYDb6JqrgEv2+2dnZ3vhz6xAzbaCJRKnsrKyDwC3QPLgvSDgUQKudbvdA2YQK1k/rMjwj+yLGahfUfIBGsBW6y13YAAU41ZJFQ1AWc5Tlm2QkzeqVoIFAoEGWvgyunWU7yWlPBgOh6fk54R5J/oJdJ3SiZaHLGA4e6BliJUyl8HcDYCXe7GH6XaCndQNinITXkNQN7qzotMDqKryWSYyYiM///kd0kGtLHi1YF348pMZIOOH5eXl0k1/CPhJLAR8hG81oiQzquvkoyjqmM74pLT0oBya+eAM22Iej8evCDhddVtsvFtHyPwe4m9oSHT6DhzqkjOqon4XRSkDUJV69+PbQNaNoVAoLus4o3BFRYUbcRyfu6LLtmT/aMIzpyUvUeHdmqasFqN0B4d8gKza2PpmVH6yHSbzLuQTUCf0Bdtbh8PxjUtYQ8BJ/C+iq6K8G7Nd1FG7dBLnnPeFTE6jd8Gn4MFEIjEBr2Q+Dm+C5NBvQYOAHoZvgr+jCU6J7S9Up17d6QSfRQAAAABJRU5ErkJggg==);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-pasteFormulaFormatting {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAA2JJREFUSA2llV1IVEEUx++srhvhRxZRgZUSPSSIPfUmlIJ9CD0UUYZvURDU0uoaIhWCiYK7GotG+hQIBRsFhR9EKRKC+JAvPVYYYVQvm5q0m+vu7XfuOnbTva7QwNw5c85//mfOzDlzlZGh1dfXD5mmeUrDlFLDXV1dNXr+36PP5zPtJGvndls6OTudsqGh4WQymezHVpTOvuJk1uVyXQkGgyPpMFq36iA0OndgyTDu+qu21a4ld9h10Qpub3Bs7pHbNG57q7Z91MR6dIkg5HFlTBqGeWHFkHbnepFttHDcUa2sFx6bzRKtCDC2Adqpjd3d3UrLmx1lfVypNvB6k9ZSKwKkys0SZcCt47EisO9eCPx+f00ikXiA6MnKyroWCATCLS0trvn5+RHS9CVp2pXO0Voewaxesn0B5D1kyC103GOygzG8sLDgZSzJz8+/b8dmktM6YJc7IP6EkxwIsomoBKetzGuIJJaJ1G5P6wCA7PIJIctlt0Lej9MBcv6NffFmZCtbAqM/VqvVX1Vo6RobGw9CGl1eXq6GqAW5Doet9Fw5vkwFpp07RWB0dna+x8lugAF6HUcWxMkg8iJO+hj30a0GroIorzPZT1fFxcUVXq/3txh1moq8rrH7XpTyuA1DXow8QVZN4KAA2Wo8hqfBvULfgf4M/a0mF4BjBCw8C7jC4/EcSlEZT5n3EkkCZw9Fx1zxboUQp4l4WnS0q6kh9XW8A96fMiBRqvqDQIWMo6hiXJLLbmpqKozH4zdweAeHL+jP8vLyBsiyZIo69XWMAOJ3diAEkgivtQ7yLJzpt6cP+ctacsE6RqCJNho5xmmIt7CZUifchpfstEj0zc3NuyA/LMezEc46IqWMr6Zp7BFg99h8ja+yYGijRWKLxWLHGRQ18VxjQ6GQJxKJeJgvLS4ulvOGTa3cgRrnGmsFmDCTgxSeiP80XYA25Ql2/y03N3dKdGRT6czMjFT8LNMo/Sd9yjoit8q5qQwVQbGpFg6H5YKrIevXF0sGfaYWQujPQxKiduRxTBWa99jWWbcrp5wFj+W4nLyQukfk7CcnJ8+B/e52u+/ZsDHItzP/xbEVEJFU9d9CEyfML4rSqbHQF41GyyAfpwCPtre3W2dJFPn8KwaJoAdbmNq4zLN+SXj+AJhsfWw7R2FgAAAAAElFTkSuQmCC);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-pasteFormulaAndNumberFormat {\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjRweCIgaGVpZ2h0PSIyNHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+UGFzdGUgRm9ybXVsYSBBbmQgTnVtYmVyRm9ybWF05aSH5Lu9PC90aXRsZT4KICAgIDxnIGlkPSJQYXN0ZS1Gb3JtdWxhLUFuZC1OdW1iZXJGb3JtYXTlpIfku70iIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxwYXRoIGQ9Ik02LDIgTDYsNCBDNiw1LjEwNDU2OTUgNi44OTU0MzA1LDYgOCw2IEwxNiw2IEMxNy4xMDQ1Njk1LDYgMTgsNS4xMDQ1Njk1IDE4LDQgTDE4LDIgTDIwLDIgQzIwLjU1MjI4NDcsMiAyMSwyLjQ0NzcxNTI1IDIxLDMgTDIxLDExIEwxMSwxMSBMMTEsMjEgTDQsMjEgQzMuNDQ3NzE1MjUsMjEgMywyMC41NTIyODQ3IDMsMjAgTDMsMyBDMywyLjQ0NzcxNTI1IDMuNDQ3NzE1MjUsMiA0LDIgTDYsMiBaIiBpZD0iUGF0aCIgZmlsbD0iIzc1QkVGNCIgZmlsbC1ydWxlPSJub256ZXJvIj48L3BhdGg+CiAgICAgICAgPHBvbHlnb24gaWQ9IkNvbWJpbmVkLVNoYXBlIiBmaWxsPSIjRkZGRkZGIiBmaWxsLXJ1bGU9Im5vbnplcm8iIHBvaW50cz0iMTggMTEgMTEgMTEgMTEgMTggNiAxOCA2IDQgMTggNCI+PC9wb2x5Z29uPgogICAgICAgIDxwYXRoIGQ9Ik04LDcuNzU0MjM3MjkgQzgsNy4yMTc1MTE0NCA4LjE0MzM2MDE1LDYuNzkwOTYyMDMgOC40MzAwODQ3NSw2LjQ3NDU3NjI3IEM4LjcxNjgwOTM0LDYuMTU4MTkwNTEgOS4xMDMxMDQ5Miw2IDkuNTg4OTgzMDUsNiBDMTAuMDU1MDg3MSw2IDEwLjQxODc4NCw2LjE0NTQ3ODc3IDEwLjY4MDA4NDgsNi40MzY0NDA2OCBDMTAuOTQxMzg1NSw2LjcyNzQwMjU4IDExLjA3MjAzMzksNy4xMzI3NjU3NiAxMS4wNzIwMzM5LDcuNjUyNTQyMzcgQzExLjA3MjAzMzksOC4xNjk0OTE1MyAxMC45Mjc5Njc1LDguNTg4OTgxNDQgMTAuNjM5ODMwNSw4LjkxMTAxNjk1IEMxMC4zNTE2OTM1LDkuMjMzMDUyNDYgOS45Njg5Mjg5NCw5LjM5NDA2NzggOS40OTE1MjU0Miw5LjM5NDA2NzggQzkuMDM5NTQ1NzYsOS4zOTQwNjc4IDguNjc3OTY3NDYsOS4yNDQzNTE3OCA4LjQwNjc3OTY2LDguOTQ0OTE1MjUgQzguMTM1NTkxODYsOC42NDU0Nzg3MyA4LDguMjQ4NTkwMDQgOCw3Ljc1NDIzNzI5IFogTTguNjUyNTQyMzcsNy43MTE4NjQ0MSBDOC42NTI1NDIzNyw4LjA3NjI3MzAxIDguNzMxNjM3NjMsOC4zNTczNDM2NCA4Ljg4OTgzMDUxLDguNTU1MDg0NzUgQzkuMDQ4MDIzMzksOC43NTI4MjU4NSA5LjI2NDEyMjkyLDguODUxNjk0OTIgOS41MzgxMzU1OSw4Ljg1MTY5NDkyIEM5LjgyMDYyMjg4LDguODUxNjk0OTIgMTAuMDM4ODQxLDguNzQ5Mjk0ODEgMTAuMTkyNzk2Niw4LjU0NDQ5MTUzIEMxMC4zNDY3NTIyLDguMzM5Njg4MjQgMTAuNDIzNzI4OCw4LjA1MDg0OTMyIDEwLjQyMzcyODgsNy42Nzc5NjYxIEMxMC40MjM3Mjg4LDcuMzEzNTU3NSAxMC4zNDgxNjQ2LDcuMDMxNzgwNjYgMTAuMTk3MDMzOSw2LjgzMjYyNzEyIEMxMC4wNDU5MDMyLDYuNjMzNDczNTggOS44MzMzMzQ3LDYuNTMzODk4MzEgOS41NTkzMjIwMyw2LjUzMzg5ODMxIEM5LjI3OTY1OTYyLDYuNTMzODk4MzEgOS4wNTg2MTY2Myw2LjYzNzcxMDgzIDguODk2MTg2NDQsNi44NDUzMzg5OCBDOC43MzM3NTYyNSw3LjA1Mjk2NzE0IDguNjUyNTQyMzcsNy4zNDE4MDYwNiA4LjY1MjU0MjM3LDcuNzExODY0NDEgWiBNMTMuOTMyMjAzNCw2LjA5NzQ1NzYzIEw5LjcxNjEwMTY5LDEyLjcwMzM4OTggTDkuMDA4NDc0NTgsMTIuNzAzMzg5OCBMMTMuMjI0NTc2Myw2LjA5NzQ1NzYzIEwxMy45MzIyMDM0LDYuMDk3NDU3NjMgWiBNMTEuOTMyMjAzNCwxMS4xMjI4ODE0IEMxMS45MzIyMDM0LDEwLjU4NjE1NTUgMTIuMDc1NTYzNSwxMC4xNTc0ODc1IDEyLjM2MjI4ODEsOS44MzY4NjQ0MSBDMTIuNjQ5MDEyNyw5LjUxNjI0MTMzIDEzLjAzMzg5NTksOS4zNTU5MzIyIDEzLjUxNjk0OTIsOS4zNTU5MzIyIEMxMy45ODAyMjgzLDkuMzU1OTMyMiAxNC4zNDMyMTksOS41MDIxMTcxOCAxNC42MDU5MzIyLDkuNzk0NDkxNTMgQzE0Ljg2ODY0NTQsMTAuMDg2ODY1OSAxNSwxMC40OTg1ODQ5IDE1LDExLjAyOTY2MSBDMTUsMTEuNTQzNzg3OSAxNC44NTQ1MjEyLDExLjk2MTE1NjYgMTQuNTYzNTU5MywxMi4yODE3Nzk3IEMxNC4yNzI1OTc0LDEyLjYwMjQwMjcgMTMuODkyNjU3NywxMi43NjI3MTE5IDEzLjQyMzcyODgsMTIuNzYyNzExOSBDMTIuOTY4OTI0MywxMi43NjI3MTE5IDEyLjYwNjYzOTgsMTIuNjEwODc3MiAxMi4zMzY4NjQ0LDEyLjMwNzIwMzQgQzEyLjA2NzA4OTEsMTIuMDAzNTI5NiAxMS45MzIyMDM0LDExLjYwODc1OTUgMTEuOTMyMjAzNCwxMS4xMjI4ODE0IFogTTEyLjU4MDUwODUsMTEuMDg0NzQ1OCBDMTIuNTgwNTA4NSwxMS40NDA2Nzk3IDEyLjY1OTYwMzcsMTEuNzE4MjE5MyAxMi44MTc3OTY2LDExLjkxNzM3MjkgQzEyLjk3NTk4OTUsMTIuMTE2NTI2NCAxMy4xOTIwODksMTIuMjE2MTAxNyAxMy40NjYxMDE3LDEyLjIxNjEwMTcgQzEzLjc0ODU4OSwxMi4yMTYxMDE3IDEzLjk2NjgwNzEsMTIuMTEyOTk1NCAxNC4xMjA3NjI3LDExLjkwNjc3OTcgQzE0LjI3NDcxODMsMTEuNzAwNTYzOSAxNC4zNTE2OTQ5LDExLjQxMjQzMTIgMTQuMzUxNjk0OSwxMS4wNDIzNzI5IEMxNC4zNTE2OTQ5LDEwLjY3NTEzOTQgMTQuMjc0NzE4MywxMC4zOTQwNjg4IDE0LjEyMDc2MjcsMTAuMTk5MTUyNSBDMTMuOTY2ODA3MSwxMC4wMDQyMzYzIDEzLjc1NTY1MTEsOS45MDY3Nzk2NiAxMy40ODcyODgxLDkuOTA2Nzc5NjYgQzEzLjE5OTE1MTEsOS45MDY3Nzk2NiAxMi45NzU5ODk1LDEwLjAxMDU5MjIgMTIuODE3Nzk2NiwxMC4yMTgyMjAzIEMxMi42NTk2MDM3LDEwLjQyNTg0ODUgMTIuNTgwNTA4NSwxMC43MTQ2ODc0IDEyLjU4MDUwODUsMTEuMDg0NzQ1OCBaIiBpZD0iJSIgZmlsbD0iIzY2NjY2NiIgZmlsbC1ydWxlPSJub256ZXJvIj48L3BhdGg+CiAgICAgICAgPHBhdGggZD0iTTEwLDIgTDEwLDAuODMzMzMzMzMzIEMxMCwwLjM3MzA5NjA0MiAxMC4yOTg0NzY4LDAgMTAuNjY2NjY2NywwIEwxMy4zMzMzMzMzLDAgQzEzLjcwMTUyMzIsMCAxNCwwLjM3MzA5NjA0MiAxNCwwLjgzMzMzMzMzMyBMMTQsMiBMMTYuMzMzMzMzMywyIEMxNi43MDE1MjMyLDIgMTcsMi4zNzMwOTYwNCAxNywyLjgzMzMzMzMzIEwxNyw0LjE2NjY2NjY3IEMxNyw0LjYyNjkwMzk2IDE2LjcwMTUyMzIsNSAxNi4zMzMzMzMzLDUgTDcuNjY2NjY2NjcsNSBDNy4yOTg0NzY4Myw1IDcsNC42MjY5MDM5NiA3LDQuMTY2NjY2NjcgTDcsMi44MzMzMzMzMyBDNywyLjM3MzA5NjA0IDcuMjk4NDc2ODMsMiA3LjY2NjY2NjY3LDIgTDEwLDIgWiBNMTEsMSBMMTEsMyBMMTMsMyBMMTMsMSBMMTEsMSBaIiBpZD0iU2hhcGUiIGZpbGw9IiM2NjY2NjYiIGZpbGwtcnVsZT0ibm9uemVybyI+PC9wYXRoPgogICAgICAgIDxwYXRoIGQ9Ik0xNS41MzkyMjM0LDE1LjM4MzkxMTIgTDE2LjQwMDYyMDgsMTUuMzgzOTExMiBMMTYuNTcxMzI1MywxNS41NjE3ODc5IEwxNi41NjE4ODM0LDE1LjYxNjM0MDkgTDE2LjQyMTk0MzUsMTYuMDI4NDQ0NyBMMTYuMjYwNjc1NywxNi4xNDU4MjY3IEwxNS4yOTY0MDcxLDE2LjE0NTgyNjcgTDE0LjUwNDkwNjYsMTguNzU0MTgyIEMxNC4xMzUwMjk3LDE5Ljk2NTc1MDMgMTMuNzY0MTk2MywyMC45MDgyNzk2IDEzLjM4OTcwNTEsMjEuNTg1MjE5NyBDMTIuODQ2Nzk3MSwyMi41MzczNDM0IDEyLjI2MjAwMDQsMjMuMTk4NDgwNCAxMS42MzI2MTczLDIzLjU2Mzk5NTggQzExLjE0ODQzNTUsMjMuODUzODA5OCAxMC42NTkxNDI2LDI0IDEwLjE2NzU2MDMsMjQgQzkuODI4OTM0OTgsMjQgOS41MzkzMDg0MywyMy45MTQzNTUgOS4zMTA5NjQ4OCwyMy43NDU5MjUyIEM5LjEwODcyNjY0LDIzLjYxMTM1OTUgOSwyMy40MjM4NjU0IDksMjMuMTk2NjI0NiBDOSwyMy4wMDQ5MjY1IDkuMDkwNzAzOTMsMjIuODM4NzcyOSA5LjI1OTI4MDczLDIyLjcwNjg1OTYgQzkuNDE3MzYxODQsMjIuNTg1MzY2NiA5LjYwNjc3MjcyLDIyLjUyNTA2MTIgOS44MjMxMzQzNywyMi41MjUwNjEyIEM5Ljk5MzU4NjI4LDIyLjUyNTA2MTIgMTAuMTQzODU1MywyMi41NzEyNTk0IDEwLjI2ODA4NTksMjIuNjY0MDU1MiBDMTAuNDAyOTcxNiwyMi43NjQ3NTA2IDEwLjQ3ODE1MjcsMjIuODk1OTcyMSAxMC40NzgxNTI3LDIzLjA0OTkzMjMgQzEwLjQ3ODE1MjcsMjMuMTgwMDgyOSAxMC40MjAyNjQ5LDIzLjI5NDUzNjIgMTAuMzEyNzA0NSwyMy4zOTQzMzQ1IEMxMC40OTcxODA3LDIzLjM5MDMxNjIgMTAuNjkxMjE2MiwyMy4zMzk1OTE2IDEwLjg5NjQ1ODgsMjMuMjM5NzMwNyBDMTEuMTA4MzQ0NSwyMy4xMzg0MTIzIDExLjMwMDQ4NDksMjIuOTg1MTgwMSAxMS40NzI5NTg0LDIyLjc3OTkzNTcgQzExLjY0NDc0MTUsMjIuNTc0NjUzNyAxMS44MTMzMDU1LDIyLjI2OTA3ODkgMTEuOTc0NzQ3NywyMS44Njc4NjM0IEMxMi4wNDIzMjAzLDIxLjY5MjM4NCAxMi4yMzMzMjQ4LDIxLjEwMTM1NTUgMTIuNTI5OTA3MSwyMC4xNDc3MTcyIEwxMy43NjM5MDM0LDE2LjE0NTgyNzQgTDEyLjQ3MzI5MTIsMTYuMTQ1ODI3NCBMMTIuNjI5NTYzLDE1LjUxNTk1MjMgTDEyLjc5NTA0MjEsMTUuMzg0MjA5MiBDMTMuMTk1OTIwNywxNS4zODQyMDkyIDEzLjQ3MzU1MDMsMTUuMzYwODAzOSAxMy42MTg0NjA1LDE1LjMxNzY5NiBDMTMuNzU1NjY5MSwxNS4yNzcwNzE2IDEzLjg4MTg1OTksMTUuMTk5ODI4NSAxNC4wMDAyNDgxLDE1LjA4MjY0NTggQzE0LjEyMjY2MjEsMTQuOTYyNjMyNiAxNC4yOTUxMjEzLDE0LjcxOTU0MTUgMTQuNTExODcyMywxNC4zNTgzODM4IEMxNC44MDg4NTkxLDEzLjg1MjY4MzUgMTUuMTAwMTc2NywxMy40NTYwMzM0IDE1LjM4NTgwOTMsMTMuMTY4NzQyOSBDMTUuNzY3NjY1NSwxMi43ODA1OTc0IDE2LjE3Mjc5MTIsMTIuNDg4NDU2MiAxNi42MDE2MTc0LDEyLjI5MzY3NTYgQzE3LjAzMDg0MywxMi4wOTgzNDIzIDE3LjQzOTMyMSwxMiAxNy44MjYyNDI3LDEyIEMxOC4yMzYzMDAyLDEyIDE4LjU3MzU3NjgsMTIuMDg5MjcwNSAxOC44MzQyMTQ1LDEyLjI3MDkyODYgQzE5LjEwNzI0NzUsMTIuNDYwMDAyNyAxOS4yNTQ0MDM4LDEyLjY4MTkzNjQgMTkuMjU0NDAzOCwxMi45MzUwOTA3IEMxOS4yNTQ0MDM4LDEzLjEzNzMzNTkgMTkuMTc0MzAyNywxMy4zMTA2Nzk0IDE5LjAyMDczNjksMTMuNDQyMjg5NCBDMTguODcyODQwNSwxMy41Njc3MTM0IDE4LjY4NzQxNTQsMTMuNjI5MjY2NSAxOC40Njg5NjcxLDEzLjYyOTI2NjUgQzE4LjI3NzU0NzIsMTMuNjI5MjY2NSAxOC4xMTUzMDIyLDEzLjU4MjQ5MDggMTcuOTg1MTYyOCwxMy40ODM4MDgzIEMxNy44NDQ3MTE1LDEzLjM3NzIyMzIgMTcuNzY2NDk1NCwxMy4yMzY2NDEgMTcuNzY2NDk1NCwxMy4wNzQyNDI3IEMxNy43NjY0OTU0LDEyLjk2NjMwMzggMTcuODExNjc0NCwxMi44NTI3NjkyIDE3Ljg5NTMzNjgsMTIuNzI3MzgyMiBDMTcuOTIzNDgxMSwxMi42ODUxMDYxIDE3Ljk0MzQ4NTEsMTIuNjUwMzc5OCAxNy45NTQyNTk5LDEyLjYzNTYwMTQgQzE3LjkxOTc3NDEsMTIuNjIxNzQ3NiAxNy44NjQ2MTY0LDEyLjYxMjg0MjggMTcuNzg5MDkyOCwxMi42MTI4NDI4IEMxNy41MDQ1NzM3LDEyLjYxMjg0MjggMTcuMjU0MTQ2OCwxMi42ODYyMDM1IDE3LjAzMzg5OTksMTIuODMzMjc5MiBDMTYuNzI0MDA0NiwxMy4wMzg0MzE3IDE2LjQ0MDE1NDMsMTMuMzY1NDk0MyAxNi4xODUwMzY3LDEzLjgxNDQxMzMgQzE2LjA2NTE0NjYsMTQuMDI4MDI1NSAxNS44NDY2NzA0LDE0LjU1Nzg0NDYgMTUuNTM5MjIzNCwxNS4zODM5MTEyIFogTTE4LjI4NTA3ODIsMTYuNzI0MzU0MiBDMTguMTc5MDcwMywxNi40ODUxODgyIDE4LjA0OTc0NjcsMTYuMzIyODUxNSAxNy44OTg1MzU2LDE2LjIzMjkyMDIgQzE3Ljc0MjcxMjEsMTYuMTQwMTYzMyAxNy41MDExNzQzLDE2LjA5MDk3NDMgMTcuMTczNDQ5MSwxNi4wOTA5NzQzIEMxNy4wNDQ0NTEzLDE2LjA5MDk3NDMgMTYuOTE0ODg5MywxNi4wOTMyNjA3IDE2Ljc3OTEzMDIsMTYuMDk4MzkzMSBMMTYuNjAyMDk2OSwxNS45MjM3NTQ5IEwxNi42MDIwOTY5LDE1LjY5NzkxNjkgTDE2Ljc0ODY1ODgsMTUuNTI0OTE5NiBMMTguNzUyOTM0OCwxNS4yMzE1MzY3IEwxOC44ODk1OTU3LDE1LjI3MzA4IEMxOS4xNDMwODcyLDE1LjUwMDM2NTcgMTkuMzM4ODk3NCwxNS43MzI2NDA4IDE5LjQ3MDcwOTIsMTUuOTYyMTI5MyBDMTkuNTU3MDI1NiwxNi4xMDEzNTE0IDE5LjY3NTgzMTIsMTYuNDAwODk5NyAxOS44MzczNjM2LDE2Ljg4MTYxMDcgTDIwLjMwNjI1NjksMTYuMjk3ODkxOCBDMjAuNDg5NDIyMSwxNi4wODQ3NzU3IDIwLjcwOTMyOCwxNS44ODU3MjYxIDIwLjk2ODc5MTMsMTUuNjk3MjI0NiBDMjEuMjI4NDgyNSwxNS41MDY2NDk2IDIxLjQ2NTE2MTIsMTUuMzc2NDYwOSAyMS42Njc5NjE5LDE1LjMxMTM5MSBDMjEuODA0NjE3NiwxNS4yNTY0Nzc2IDIxLjk1OTk0NzQsMTUuMjI5Njc4NCAyMi4xMzAxOTI0LDE1LjIyOTY3ODQgQzIyLjM3NjM0ODcsMTUuMjI5Njc4NCAyMi41ODEwNTgsMTUuMjg4ODk0NiAyMi43NDA2NzkxLDE1LjQxMTQ0NTkgQzIyLjkwODcwMiwxNS41NDA1MDA2IDIzLDE1LjcwNzE1MzEgMjMsMTUuODk5NDU1NyBDMjMsMTYuMTA5NTIgMjIuOTQ2MDIzMSwxNi4yNjc5NTcgMjIuODE5MjYyNSwxNi4zNjc4MTIgQzIyLjY1MjIyNTEsMTYuNDkzMzY5OCAyMi40NTgzOTIyLDE2LjU1NjE0MDQgMjIuMjQyNzM5LDE2LjU1NjE0MDQgQzIyLjExNjY0MzYsMTYuNTU2MTQwNCAyMS45ODYyMDIzLDE2LjUzNTc5NjggMjEuODUxNTMxMywxNi40OTUwMDUzIEMyMS42MzM3NjIyLDE2LjQzMjUyNDggMjEuNDkwMzg5OSwxNi40MDE3MTMxIDIxLjQzMTA0MDksMTYuNDAxNzEzMSBDMjEuMzQ2OTQyMywxNi40MDE3MTMxIDIxLjIzNDM3NzIsMTYuNDQ2MTg1NyAyMS4wOTk1OTYxLDE2LjU0MDQ3NTUgQzIwLjgyMTM2NDMsMTYuNzM1ODEwNyAyMC40ODEwOTksMTcuMTE3MjkwNCAyMC4wODA5NDM3LDE3LjY4NjE0NDYgTDIwLjY3Mzk3MzksMTkuNzU2NDgxOCBDMjAuNzU4MzY1OCwyMC4wNTYyMjggMjAuODMxMDA1OSwyMC4yMzgyOTE3IDIwLjg2NjgyMTQsMjAuMjczNTI2MyBDMjAuOTAyMDQ3NCwyMC4zMDkxMjM5IDIwLjkyNTIwNTQsMjAuMzIwOTI0MyAyMC45Mzc4NTQ0LDIwLjMyMDkyNDMgQzIxLjAwNDE5NDksMjAuMzIwOTI0MyAyMS4wOTgzNTMsMjAuMjgzODkyMSAyMS4yMTQ2NzkyLDIwLjIwNDY1NiBDMjEuNDY3MDI1OSwyMC4wMjc5NTM0IDIxLjY5MTg0NzcsMTkuNzkxMjYgMjEuODc2OTMyOSwxOS41MDY2ODk3IEwyMi4wODI3NTg2LDE5LjQ0MTM5ODggTDIyLjUzNzQ0MTYsMTkuNjI4NTgwNyBMMjIuNDIyMTg4MywxOS44MDcxNzA4IEMyMi4wOTE3ODczLDIwLjMxOTE0MiAyMS42NzM1NzM5LDIwLjc0NjA3NDcgMjEuMTY5OTMyNiwyMS4wODQ1OTYyIEMyMC44NzIzMTM5LDIxLjI4MTk5IDIwLjYxMDM5MzcsMjEuMzgzNzYgMjAuMzc5NDk4MSwyMS4zODM3NiBDMjAuMDQwMTQyNSwyMS4zODM3NiAxOS43NjM5MzM2LDIxLjIyNDUxODggMTkuNTY1OTUwOCwyMC45MTc0NDM1IEMxOS40NTY1ODQsMjAuNzQ3NTMwOSAxOS4yNzE3OTE0LDIwLjE2OTE3MDkgMTguOTg1OTQ0MiwxOS4xMTcyNjI5IEMxOC4yOTUzOTk2LDIwLjA5MTc3MzcgMTcuNzI4MzU5OSwyMC43MzI5ODQgMTcuMjc3ODEzMSwyMS4wNDM4ODU3IEMxNi45NDczMDUzLDIxLjI2ODgwOSAxNi42MTk2OTc4LDIxLjM4Mzc2IDE2LjI5ODM3ODIsMjEuMzgzNzYgQzE2LjA2Mjg3MjIsMjEuMzgzNzYgMTUuODQ2MDUyMSwyMS4zMTM1ODc1IDE1LjY0NDI3NzgsMjEuMTY4ODcxNiBDMTUuNDgzOTUxMywyMS4wNDMwODY5IDE1LjQwMDM5NTYsMjAuODY3NDAzMiAxNS40MDAzOTU2LDIwLjY1NzQ0MTcgQzE1LjQwMDM5NTYsMjAuNDcwNzAyNyAxNS40Nzg1MTYxLDIwLjMwNzI0OTMgMTUuNjI1MTUyNCwyMC4xODIxMjM2IEMxNS43NjYwNzk4LDIwLjA2MjczMDcgMTUuOTQwNDA1NiwyMC4wMDI3Mzk4IDE2LjEzOTc4NCwyMC4wMDI3Mzk4IEMxNi4zNDE4MjcxLDIwLjAwMjczOTggMTYuNTQ2MjcyNCwyMC4wODI3NDAxIDE2Ljc1MzI0ODgsMjAuMjM3OTQxMyBDMTYuODU2MzE4LDIwLjMxNTM1MjUgMTYuOTI4MzUyNiwyMC4zNTA4NzA4IDE2Ljk0OTkyMTEsMjAuMzUwODcwOCBDMTYuOTY5ODU0NywyMC4zNTA4NzA4IDE3LjAxNzkwNjgsMjAuMzMwMjA5NSAxNy4wODg5MjY5LDIwLjI4MDEwMTYgQzE3LjMwMzkyNDQsMjAuMTM0NTExOSAxNy42MTE0MDgyLDE5LjgwNDE2NzEgMTguMDA4NjAyMywxOS4yODg0MDcxIEMxOC4zNzU1MjksMTguODEwMTA1MSAxOC42MjEwNzU4LDE4LjQ2MjU3OTcgMTguNzUwMjU3OCwxOC4yMzg4NzU3IEMxOC40NjI2MjE3LDE3LjI4ODE1NzQgMTguMzAzODIxNSwxNi43NzI0MTMyIDE4LjI4NTA3ODIsMTYuNzI0MzU0MiBaIiBpZD0iZnVuY3Rpb24iIGZpbGw9IiM2NjY2NjYiIGZpbGwtcnVsZT0ibm9uemVybyI+PC9wYXRoPgogICAgPC9nPgo8L3N2Zz4=);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-pasteKeepSourceFormat {\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjRweCIgaGVpZ2h0PSIyNHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+UGFzdGUgS2VlcFNvdXJjZSBGb3JtYXTlpIfku708L3RpdGxlPgogICAgPGcgaWQ9IlBhc3RlLUtlZXBTb3VyY2UtRm9ybWF05aSH5Lu9IiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8cGF0aCBkPSJNMjEsMTEuMTM4MjMzNSBDMjAuNDA3MjkxNiwxMS40OTMwMjYxIDE5LjcxMDQxMywxMi4wMTUwMDEgMTguODUxOTY0OCwxMi42OTExNTE4IEMxNy41NjE4MDU1LDEzLjcwNzMzNyAxNi4wMDcyNDU1LDE1LjA5MTQ0NiAxNC45NDk2MjA3LDE2LjEzMTY5OTkgQzE0LjM3ODk2ODQsMTYuNjkzMTM2MiAxMy44MTczOTQ1LDE3LjI2ODU1MyAxMy40MTI1OTg5LDE3LjcwNTkxODcgQzEyLjg2Mjc2NzMsMTcuODUxNjIxMiAxMi4zNTYyMzY0LDE4LjEyODAzNzQgMTEuOTM4NzQ3NywxOC40OTA2OTAyIEMxMS41NTgzODIyLDE4LjgyMDI3MTEgMTEuMjk4MTEzOSwxOS4xNzMzODY4IDEwLjk5Mjg2NTksMTkuNjkwNTQzMyBDMTAuOTUyODUzMiwxOS43NTgzMzM2IDEwLjgzMDk5MjgsMTkuOTY4Nzg2MSAxMC44MTc0ODYyLDE5Ljk5MTg2MjcgQzEwLjcyMDE3MjEsMjAuMTU4MTI4NCAxMC42NTg5NDQ3LDIwLjI1MjIxODUgMTAuNjMwMzMyMSwyMC4yODk5MjY4IEMxMC42ODM2NTM4LDIwLjIyOTY2NTcgMTAuNjg2NjMzNSwyMC4yMjcwNTM3IDEwLjY1NjY3NjIsMjAuMjQxMDA4MiBDMTAuNTQ5NzY4LDIwLjI5MDgwNzQgMTAuNDA5NTc1MSwyMC4zNDQ4OTg0IDEwLjE1NjMxODQsMjAuNDM1MjYxNiBDMTAuMDMxOTU2MSwyMC40Nzk0ODQzIDEwLjAzMTk1NjEsMjAuNDc5NDg0MyA5LjkwMDAzMjQsMjAuNTI2NzQ2OCBDOS40MjY4MzkyNSwyMC42OTc0NzM1IDkuMTIyMDk3MSwyMC44MjM5MyA4Ljg2MjkyMjUsMjEgTDQsMjEgQzMuNDQ3NzE1MjUsMjEgMywyMC41NTIyODQ3IDMsMjAgTDMsMyBDMywyLjQ0NzcxNTI1IDMuNDQ3NzE1MjUsMiA0LDIgTDYsMiBMNiw0IEM2LDUuMTA0NTY5NSA2Ljg5NTQzMDUsNiA4LDYgTDE2LDYgQzE3LjEwNDU2OTUsNiAxOCw1LjEwNDU2OTUgMTgsNCBMMTgsMiBMMjAsMiBDMjAuNTUyMjg0NywyIDIxLDIuNDQ3NzE1MjUgMjEsMyBMMjEsMTEuMTM4MjMzNSBaIiBpZD0iQ29tYmluZWQtU2hhcGUiIGZpbGw9IiM3NUJFRjQiIGZpbGwtcnVsZT0ibm9uemVybyI+PC9wYXRoPgogICAgICAgIDxwYXRoIGQ9Ik0xOCwxMy4zODI3OTU0IEMxNi45MjI4NjgzLDE0LjI4MDY3OTQgMTUuNzgyMjQ4OCwxNS4zMTI3NDczIDE0Ljk0OTYyMDcsMTYuMTMxNjk5OSBDMTQuMzc4OTY4NCwxNi42OTMxMzYyIDEzLjgxNzM5NDUsMTcuMjY4NTUzIDEzLjQxMjU5ODksMTcuNzA1OTE4NyBDMTMuMTQ5NDk1NSwxNy43NzU2Mzk3IDEyLjg5NjMwNzEsMTcuODc1MjkxMyAxMi42NTgwNDU0LDE4IEw2LDE4IEw2LDQgTDE4LDQgTDE4LDEzLjM4Mjc5NTQgWiIgaWQ9IkNvbWJpbmVkLVNoYXBlIiBmaWxsPSIjRkZGRkZGIiBmaWxsLXJ1bGU9Im5vbnplcm8iPjwvcGF0aD4KICAgICAgICA8cGF0aCBkPSJNMTAsMiBMMTAsMC44MzMzMzMzMzMgQzEwLDAuMzczMDk2MDQyIDEwLjI5ODQ3NjgsLTIuNDg2ODk5NThlLTE0IDEwLjY2NjY2NjcsLTIuNDg2ODk5NThlLTE0IEwxMy4zMzMzMzMzLC0yLjQ4Njg5OTU4ZS0xNCBDMTMuNzAxNTIzMiwtMi40ODY4OTk1OGUtMTQgMTQsMC4zNzMwOTYwNDIgMTQsMC44MzMzMzMzMzMgTDE0LDIgTDE2LjMzMzMzMzMsMiBDMTYuNzAxNTIzMiwyIDE3LDIuMzczMDk2MDQgMTcsMi44MzMzMzMzMyBMMTcsNC4xNjY2NjY2NyBDMTcsNC42MjY5MDM5NiAxNi43MDE1MjMyLDUgMTYuMzMzMzMzMyw1IEw3LjY2NjY2NjY3LDUgQzcuMjk4NDc2ODMsNSA3LDQuNjI2OTAzOTYgNyw0LjE2NjY2NjY3IEw3LDIuODMzMzMzMzMgQzcsMi4zNzMwOTYwNCA3LjI5ODQ3NjgzLDIgNy42NjY2NjY2NywyIEwxMCwyIFogTTExLDEgTDExLDMgTDEzLDMgTDEzLDEgTDExLDEgWiIgaWQ9IlNoYXBlIiBmaWxsPSIjNjY2NjY2IiBmaWxsLXJ1bGU9Im5vbnplcm8iPjwvcGF0aD4KICAgICAgICA8ZyBpZD0iR3JvdXAtOCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOS4wMDAwMDAsIDEyLjAwMDAwMCkiIGZpbGwtcnVsZT0ibm9uemVybyI+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMy44MDI4NDQyLDAuMjcyNzI3MjczIEMxMy4xMjE3NDg4LC0wLjM3OTEwMDkwMSA4LjY5MDQyMDQ5LDMuNTM5ODg3OTggNy4wMDE0NjIyOSw1LjIwMTEwNTkgQzYuMTYyOTIwOTMsNi4wMjYxMDQ4NyA1LjMyMjU2NDg0LDYuOTA0NzI0NDYgNS4wNjU5MjIzNyw3LjIzNDcyNDA1IEM0Ljk1Mzc2NDk5LDcuMzc5MjYzODcgNS4xMDIyMDg1OCw3LjQyMjgyMzgyIDUuMTY3NTIzNzYsNy40NTY0ODM3NyBDNS41MDAwMzc0LDcuNjI2NzYzNTYgNS43MzIyNjkxNiw3Ljc4Mzg0MzM2IDYuMDMyNDU1MDksOC4wNzg4NjI5OSBDNi4zMzMzMDA3Nyw4LjM3Mzg4MjYyIDYuNDkzNjE5ODUsOC42MDIyNDIzNCA2LjY2NTE1NDY3LDguOTI5NjAxOTMgQzYuNzAwMTIxMzgsOC45OTQyODE4NSA2Ljc0NDk4NDMzLDkuMTM5NDgxNjcgNi44OTA3ODg5Myw5LjAyOTkyMTggQzcuMjI3MjYxMDcsOC43NzcxNDIxMiA4LjAxMDIxNzIxLDcuOTI3NzQ4NDEgOC44NDg3NTg1Niw3LjEwNDA2OTQ1IEMxMC41MzgzNzY1LDUuNDQzNTExNTIgMTQuNDgzOTM5NiwwLjkyNDU1NTQ0NiAxMy44MDI4NDQyLDAuMjcyNzI3MjczIFoiIGlkPSJQYXRoIiBmaWxsPSIjQkJCQkJCIj48L3BhdGg+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMy44Nzg4OTcyLDAuMTE2ODU5NDQ1IEMxNC42NTA3MDk1LDAuODU3NzcxODUyIDExLjU5MDMyNjcsNC43NTE4MjYxNSA4Ljc1ODYzMzIsNy41NDMzNTI1IEM4LjcwNzI0ODk3LDcuNTk0MDQ4ODQgOC43MDcyNDg5Nyw3LjU5NDA0ODg0IDguNjU2MDUwMTYsNy42NDQ4MTgyMiBDOC40ODEyNzc5Miw3LjgxODMzMDA2IDguMzA0NjU1MjksNy45OTY2NTk3MSA4LjA3ODk2MjQ4LDguMjI2NzA1MDYgQzguMTA5MDIyMzYsOC4xOTYwNjU0NyA3LjY2NTkwMDczLDguNjQ4NTI3ODcgNy41NTU2NDg1Niw4Ljc2MDI3NTMgQzcuMTYzMjcxNTYsOS4xNTc5NzM3NSA2LjkzODE1MzE5LDkuMzczMDgxODEgNi43Nzk0NTk4Myw5LjQ5MjY2ODIxIEM2LjUyOTk0NzY3LDkuNjgwNzMwNjEgNi4yOTc2MzA1MSw5LjU3OTc5OTMgNi4xNzk3NjA4OCw5LjM1ODkxMzc3IEM2LjE3MDcwNzk3LDkuMzQxOTQ4NzggNi4xNTI1NjQwNiw5LjMwNDY2ODkyIDYuMTUwNTYxNDQsOS4zMDA5MDUxMiBDNS45ODMyMjM0Nyw4Ljk4MDU3NTM4IDUuODM2MTkxMDYsOC43Nzk4ODc2NSA1LjU3MDA0NjE1LDguNTE4MDk2MDkgQzUuMzA1MzkxNDcsOC4yNTcxOTg0NSA1LjEwMTgwMTUxLDguMTEyMTE4MTYgNC43NzM3NjQxNCw3Ljk0MzYxNDQzIEM0Ljc3MzI1MjM1LDcuOTQzMzQ5ODcgNC43MzQ5MTQ3Nyw3LjkyNTQ2NjcyIDQuNzE3Mzc1MTYsNy45MTY0NTA0NyBDNC40OTIyNjgzOSw3LjgwMDczNDIzIDQuMzg3NDA3MzUsNy41NjQwMzUwNCA0LjU4MjQyNjM3LDcuMzExOTM4OTUgQzQuODQxODcxNzUsNi45NzczMTIxIDUuNjY4MzA2NjksNi4xMDc2MjY1IDYuNTM2MDEyOTYsNS4yNTEzMTUyOSBDOS42ODI5MzA5MiwyLjE0NjU5MDU1IDEzLjEyNDYzNTMsLTAuNjA3MjA1MjE2IDEzLjg3ODg5NzIsMC4xMTY4NTk0NDUgWiBNNy4xNjkzNTYxNCw4LjM3NjUxOTc0IEM3LjI3ODc3NzQ4LDguMjY1NjE0NDIgNy43MjA5NjU5OSw3LjgxNDEwNDggNy42OTE1OTUsNy44NDQwNDIyMiBDNy45MTg4MTg2Miw3LjYxMjQzNjU0IDguMDk2OTgwMzEsNy40MzI1NTI5NSA4LjI3MzczODIsNy4yNTcwNjk3NyBDOC4zMjU2Mzk1NCw3LjIwNTYwMzc1IDguMzI1NjM5NTQsNy4yMDU2MDM3NSA4LjM3NzczNzEyLDcuMTU0MjAzNTMgQzkuMzI0MDE3MjcsNi4yMjEzNDYyMiAxMC43NTQ5NjA2LDQuNjE3MDgyNzkgMTEuODAyNDk5OSwzLjI4NDE4NTg5IEMxMi45ODAzOTYsMS43ODU0MjE4OSAxMy42MzEzODY0LDAuNjM0MTE4NzYzIDEzLjUwMzEzMiwwLjUxMDk5OTE1NCBDMTMuMzY5MDYyNCwwLjM4MjI5NzA0MiAxMi4yNDI1MDQyLDEuMDM1NTM1NzUgMTAuNzU1MDI3OSwyLjIyNTcwMzYyIEM5LjQ5MDAyNzY3LDMuMjM3ODYyNjcgNy45NDU4Mzc4Niw0LjYyNTMzMTIyIDYuOTE3MTQwNTgsNS42NDAyMzU5MyBDNi4xNjk3MTQwOSw2LjM3Nzg0NjkyIDUuNDQ4OTE1MjIsNy4xMzA0NDkyMiA1LjEyMjg1ODgzLDcuNTExNDY0NjcgQzUuNDQzNzQ2Nyw3LjY4NDkyNzAyIDUuNjc0MTU3NzYsNy44NTYwOTE5IDUuOTUwNzc4OTIsOC4xMjg3ODYzNCBDNi4yMzEwMDA1Niw4LjQwNDQyNDE1IDYuNDA2MDY3NDEsOC42MzQwMDg4OCA2LjU4MDEwOTM4LDguOTUwNzA2ODUgQzYuNzEyMTQxODcsOC44MzMzMTY2NCA2LjkwMDAzMzYsOC42NDk0OTQ4NiA3LjE2OTM1NjE0LDguMzc2NTE5NzQgWiIgaWQ9IlBhdGgiIGZpbGw9IiM2NjY2NjYiPjwvcGF0aD4KICAgICAgICAgICAgPHBhdGggZD0iTTMuOTIyNDI3MjQsNy42MjMxMDk5NCBDMy4zNzk2MjQ3NCw4LjA5MzQ0MjIzIDMuMTM0MjQyNTksOC44NDk5NzA2OSAyLjczMTM2NDQsOS4zMDkyNjcyMyBDMi4zNTE2MjA2NCw5Ljc0MjE4OTYxIDAuOTY0MjcwNjk4LDkuOTcxNTUwNzcgMC41ODc2Njg4OSwxMC4zMzk1OTk3IEMwLjE2NTc0MDA4NCwxMC43NTE5NDYyIDQuNjg2NjY5MDUsMTIuMjc1MDk2MyA2LjE1MDk1MzE1LDEwLjg3NDM0NzMgQzcuNTc0MTc2ODEsOS41MTI4NzcwNSA3LjU3NDE3NjgxLDguNTA4NjY1MjEgNi41ODUwNzMwMSw3LjYyMzEwOTk0IEM1LjU5NTk2OTIxLDYuNzM3NTU0NjcgNC41MDg1MDczNCw3LjExNDAwOTgyIDMuOTIyNDI3MjQsNy42MjMxMDk5NCBaIiBpZD0iU2hhcGUiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD4KICAgICAgICAgICAgPHBhdGggZD0iTTMuMzQyNzM4Nyw4LjU0NzQyMzk2IEM0LjM5NDQxNTIsOC43OTA2MDIyNiA1LjAxMTI3MzUzLDkuMDQ2MjIzMzUgNS4xOTMzMTM3LDkuMzE0Mjg3MjQgQzUuMzc4NDI1MTQsOS41ODY4NzM3NCA1LjU4MTQzOTcxLDEwLjE0MjQ0MzUgNS44MDIzNTc0MSwxMC45ODA5OTY2IEM1LjgzODMxMjU5LDEwLjk1MDkwNDIgNS44NzIyOTEyNiwxMC45MTkzMzgyIDUuOTA0MjE1MjgsMTAuODg2Mjg4IEM3LjIyNzA2MzIxLDkuNTE2NzcxIDcuMzE5MDY3NzEsOC41NDA3MzE2NSA2LjM2MTMwNTQ5LDcuNjEyNzE4NzcgQzUuNTkzNTEwNjUsNi44Njg3NzI2MyA0LjY3NzIwNTMsNi45NjgzMjA1NiAzLjk4ODY3ODk5LDcuNjE1NTk2MjIgTDMuOTg4NDI4MzEsNy42MTU4MzE1OCBDMy43NzYwMzUyOCw3LjgxNTAwMjQxIDMuNjA0NTQ2NDIsOC4wNjY4MDE1NCAzLjM3OTI4OTM1LDguNDc5ODIwNjQgQzMuMzcwODc5NzEsOC40OTUyNDAxIDMuMzU3OTI5ODYsOC41MTkyMTMzNCAzLjM0MjczODcsOC41NDc0MjM5NiBaIE02Ljc1NTY5ODY4LDcuMjI3Mjc5OTEgQzcuOTQ4ODkyOTMsOC4zODM0MTIwMiA3LjgyNTYwODI1LDkuNjkxMjkwNTEgNi4zMTE0OTc4NiwxMS4yNTg4MTc1IEM1LjU0OTM5MTk2LDEyLjA0NzgwOTkgNC4wODg5NzU0MSwxMi4xNjg4OTggMi40MjQyMTMzMSwxMS44MDEyMjk1IEMxLjc3NjI4NTQsMTEuNjU4MTMyNCAxLjE1Mzk4NDY3LDExLjQ0Njc0MTcgMC43MDg5MzQ1NDUsMTEuMjI0MzE0IEMwLjExOTIwODk4MSwxMC45Mjk1ODAxIC0wLjE5MDkyNzYwMiwxMC42MjQwNDc1IDAuMTI3MTIzNTM1LDEwLjI4NzY1NzkgQzAuMzAzNjUyMTcsMTAuMTAwOTUwOCAwLjU2ODAwMjY1Myw5Ljk2ODM4NTQ5IDEuMDgxNDI1MzgsOS43Njc5MTAzIEMxLjE0Mjc4MTQ0LDkuNzQzOTUyNzIgMS4yMTIzNjU4Nyw5LjcxNzE0Mjg3IDEuMzQzMjc4MDcsOS42NjY3NTkzOSBDMS45MzY5ODI3Niw5LjQzNzUwMTcgMi4yMTY0ODU0Nyw5LjI5NjU5ODY5IDIuMzM4NjU1MDUsOS4xNDU4NjY4NSBDMi40NTEzMzQ3Miw5LjAwNjg0MzU5IDIuNTU0Njk4NSw4LjgzODUwODYyIDIuNzA1OTUwNDEsOC41NTg4MzU4MSBDMi43MjI2MDQwOSw4LjUyODA0MjI4IDIuODQ3NDE4ODYsOC4yOTQ3NjA5NiAyLjg4NTU1Nzc2LDguMjI0ODMxNTUgQzMuMTM2MzYyODYsNy43NjQ5Njg5NyAzLjMzNTExMTMzLDcuNDczMTI5OCAzLjYwMDQ0MDg4LDcuMjI0Mjg0NzEgQzQuNDg5ODQ1MTIsNi4zODgyNjQzIDUuNzQ4NjkzMTYsNi4yNTE1NTMyOSA2Ljc1NTY5ODY4LDcuMjI3Mjc5OTEgWiIgaWQ9IkNvbWJpbmVkLVNoYXBlIiBmaWxsPSIjMzY3RkM5Ij48L3BhdGg+CiAgICAgICAgPC9nPgogICAgICAgIDxyZWN0IGlkPSLnn6nlvaIiIGZpbGw9IiMzNjdGQzkiIHg9IjciIHk9IjciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxIj48L3JlY3Q+CiAgICAgICAgPHJlY3QgaWQ9IuefqeW9ouWkh+S7vSIgZmlsbD0iI0ZBNzU0MSIgeD0iNyIgeT0iMTAiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxIj48L3JlY3Q+CiAgICAgICAgPHJlY3QgaWQ9IuefqeW9ouWkh+S7vS0yIiBmaWxsPSIjRkE3NTQxIiB4PSI3IiB5PSIxMyIgd2lkdGg9IjgiIGhlaWdodD0iMSI+PC9yZWN0PgogICAgPC9nPgo8L3N2Zz4=);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-pasteNoBorders {\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjRweCIgaGVpZ2h0PSIyNHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+UGFzdGUgTm8gQm9yZGVyc+Wkh+S7vTwvdGl0bGU+CiAgICA8ZyBpZD0iUGFzdGUtTm8tQm9yZGVyc+Wkh+S7vSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPHBhdGggZD0iTTYsMiBMNiw0IEM2LDUuMTA0NTY5NSA2Ljg5NTQzMDUsNiA4LDYgTDE2LDYgQzE3LjEwNDU2OTUsNiAxOCw1LjEwNDU2OTUgMTgsNCBMMTgsMiBMMjAsMiBDMjAuNTUyMjg0NywyIDIxLDIuNDQ3NzE1MjUgMjEsMyBMMjEsMTEgTDExLDExIEwxMSwyMSBMNCwyMSBDMy40NDc3MTUyNSwyMSAzLDIwLjU1MjI4NDcgMywyMCBMMywzIEMzLDIuNDQ3NzE1MjUgMy40NDc3MTUyNSwyIDQsMiBMNiwyIFoiIGlkPSJQYXRoIiBmaWxsPSIjNzVCRUY0IiBmaWxsLXJ1bGU9Im5vbnplcm8iPjwvcGF0aD4KICAgICAgICA8cG9seWdvbiBpZD0iQ29tYmluZWQtU2hhcGUiIGZpbGw9IiNGRkZGRkYiIGZpbGwtcnVsZT0ibm9uemVybyIgcG9pbnRzPSIxOCAxMSAxMSAxMSAxMSAxOCA2IDE4IDYgNCAxOCA0Ij48L3BvbHlnb24+CiAgICAgICAgPHBhdGggZD0iTTEwLDIgTDEwLDAuODMzMzMzMzMzIEMxMCwwLjM3MzA5NjA0MiAxMC4yOTg0NzY4LDAgMTAuNjY2NjY2NywwIEwxMy4zMzMzMzMzLDAgQzEzLjcwMTUyMzIsMCAxNCwwLjM3MzA5NjA0MiAxNCwwLjgzMzMzMzMzMyBMMTQsMiBMMTYuMzMzMzMzMywyIEMxNi43MDE1MjMyLDIgMTcsMi4zNzMwOTYwNCAxNywyLjgzMzMzMzMzIEwxNyw0LjE2NjY2NjY3IEMxNyw0LjYyNjkwMzk2IDE2LjcwMTUyMzIsNSAxNi4zMzMzMzMzLDUgTDcuNjY2NjY2NjcsNSBDNy4yOTg0NzY4Myw1IDcsNC42MjY5MDM5NiA3LDQuMTY2NjY2NjcgTDcsMi44MzMzMzMzMyBDNywyLjM3MzA5NjA0IDcuMjk4NDc2ODMsMiA3LjY2NjY2NjY3LDIgTDEwLDIgWiBNMTEsMSBMMTEsMyBMMTMsMyBMMTMsMSBMMTEsMSBaIiBpZD0iU2hhcGUiIGZpbGw9IiM2NjY2NjYiIGZpbGwtcnVsZT0ibm9uemVybyI+PC9wYXRoPgogICAgICAgIDxwb2x5Z29uIGlkPSLlvaLnirbnu5PlkIgtcGF0aOWkh+S7vSIgZmlsbD0iIzg5ODk4OSIgZmlsbC1ydWxlPSJub256ZXJvIiBwb2ludHM9IjIzIDEyIDIzIDIzIDEyIDIzIDEyIDEyIj48L3BvbHlnb24+CiAgICAgICAgPHBvbHlnb24gaWQ9IuefqeW9ouWkh+S7vSIgZmlsbD0iI0ZGRkZGRiIgZmlsbC1ydWxlPSJub256ZXJvIiBwb2ludHM9IjE4IDEzIDIyIDEzIDIyIDE3IDE4IDE3Ij48L3BvbHlnb24+CiAgICAgICAgPHBvbHlnb24gaWQ9IuefqeW9ouWkh+S7vS0zIiBmaWxsPSIjRkZGRkZGIiBmaWxsLXJ1bGU9Im5vbnplcm8iIHBvaW50cz0iMTMgMTMgMTcgMTMgMTcgMTcgMTMgMTciPjwvcG9seWdvbj4KICAgICAgICA8cG9seWdvbiBpZD0i55+p5b2i5aSH5Lu9LTIiIGZpbGw9IiNGRkZGRkYiIGZpbGwtcnVsZT0ibm9uemVybyIgcG9pbnRzPSIxOCAxOCAyMiAxOCAyMiAyMiAxOCAyMiI+PC9wb2x5Z29uPgogICAgICAgIDxwb2x5Z29uIGlkPSLnn6nlvaLlpIfku70tNCIgZmlsbD0iI0ZGRkZGRiIgZmlsbC1ydWxlPSJub256ZXJvIiBwb2ludHM9IjEzIDE4IDE3IDE4IDE3IDIyIDEzIDIyIj48L3BvbHlnb24+CiAgICA8L2c+Cjwvc3ZnPg==);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-pasteColumnWidth {\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjRweCIgaGVpZ2h0PSIyNHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+UGFzdGUgQ29sdW1uIFdpZHRo5aSH5Lu9PC90aXRsZT4KICAgIDxnIGlkPSJQYXN0ZS1Db2x1bW4tV2lkdGjlpIfku70iIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxwYXRoIGQ9Ik02LDIgTDYsNCBDNiw1LjEwNDU2OTUgNi44OTU0MzA1LDYgOCw2IEwxNiw2IEMxNy4xMDQ1Njk1LDYgMTgsNS4xMDQ1Njk1IDE4LDQgTDE4LDIgTDIwLDIgQzIwLjU1MjI4NDcsMiAyMSwyLjQ0NzcxNTI1IDIxLDMgTDIxLDExIEwxMSwxMSBMMTEsMjEgTDQsMjEgQzMuNDQ3NzE1MjUsMjEgMywyMC41NTIyODQ3IDMsMjAgTDMsMyBDMywyLjQ0NzcxNTI1IDMuNDQ3NzE1MjUsMiA0LDIgTDYsMiBaIiBpZD0iUGF0aCIgZmlsbD0iIzc1QkVGNCIgZmlsbC1ydWxlPSJub256ZXJvIj48L3BhdGg+CiAgICAgICAgPHBvbHlnb24gaWQ9IkNvbWJpbmVkLVNoYXBlIiBmaWxsPSIjRkZGRkZGIiBmaWxsLXJ1bGU9Im5vbnplcm8iIHBvaW50cz0iMTggMTEgMTEgMTEgMTEgMTggNiAxOCA2IDQgMTggNCI+PC9wb2x5Z29uPgogICAgICAgIDxwYXRoIGQ9Ik0xMCwyIEwxMCwwLjgzMzMzMzMzMyBDMTAsMC4zNzMwOTYwNDIgMTAuMjk4NDc2OCwwIDEwLjY2NjY2NjcsMCBMMTMuMzMzMzMzMywwIEMxMy43MDE1MjMyLDAgMTQsMC4zNzMwOTYwNDIgMTQsMC44MzMzMzMzMzMgTDE0LDIgTDE2LjMzMzMzMzMsMiBDMTYuNzAxNTIzMiwyIDE3LDIuMzczMDk2MDQgMTcsMi44MzMzMzMzMyBMMTcsNC4xNjY2NjY2NyBDMTcsNC42MjY5MDM5NiAxNi43MDE1MjMyLDUgMTYuMzMzMzMzMyw1IEw3LjY2NjY2NjY3LDUgQzcuMjk4NDc2ODMsNSA3LDQuNjI2OTAzOTYgNyw0LjE2NjY2NjY3IEw3LDIuODMzMzMzMzMgQzcsMi4zNzMwOTYwNCA3LjI5ODQ3NjgzLDIgNy42NjY2NjY2NywyIEwxMCwyIFogTTExLDEgTDExLDMgTDEzLDMgTDEzLDEgTDExLDEgWiIgaWQ9IlNoYXBlIiBmaWxsPSIjNjY2NjY2IiBmaWxsLXJ1bGU9Im5vbnplcm8iPjwvcGF0aD4KICAgICAgICA8cG9seWdvbiBpZD0i5b2i54q257uT5ZCILXBhdGjlpIfku70iIGZpbGw9IiM2NjY2NjYiIGZpbGwtcnVsZT0ibm9uemVybyIgcG9pbnRzPSIyMyAxNSAyMyAyMyAxMiAyMyAxMiAxNSI+PC9wb2x5Z29uPgogICAgICAgIDxwb2x5Z29uIGlkPSLnn6nlvaLlpIfku70tNCIgZmlsbD0iI0ZGRkZGRiIgZmlsbC1ydWxlPSJub256ZXJvIiBwb2ludHM9IjEzIDE2IDIyIDE2IDIyIDIzIDEzIDIzIj48L3BvbHlnb24+CiAgICAgICAgPHJlY3QgaWQ9IuefqeW9ouWkh+S7vS0zIiBmaWxsPSIjMzY3RkM5IiB4PSIxMiIgeT0iMTIiIHdpZHRoPSIxMSIgaGVpZ2h0PSIxIj48L3JlY3Q+CiAgICAgICAgPHJlY3QgaWQ9IuefqeW9ouWkh+S7vS01IiBmaWxsPSIjMzY3RkM5IiB4PSIxMiIgeT0iMTEiIHdpZHRoPSIxIiBoZWlnaHQ9IjMiPjwvcmVjdD4KICAgICAgICA8cmVjdCBpZD0i55+p5b2i5aSH5Lu9LTYiIGZpbGw9IiMzNjdGQzkiIHg9IjIyIiB5PSIxMSIgd2lkdGg9IjEiIGhlaWdodD0iMyI+PC9yZWN0PgogICAgPC9nPgo8L3N2Zz4=);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-pasteTranspose {\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjRweCIgaGVpZ2h0PSIyNHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+UGFzdGUgVHJhbnNwb3Nl5aSH5Lu9PC90aXRsZT4KICAgIDxnIGlkPSJQYXN0ZS1UcmFuc3Bvc2XlpIfku70iIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxwYXRoIGQ9Ik02LDIgTDYsNCBDNiw1LjEwNDU2OTUgNi44OTU0MzA1LDYgOCw2IEwxNiw2IEMxNy4xMDQ1Njk1LDYgMTgsNS4xMDQ1Njk1IDE4LDQgTDE4LDIgTDIwLDIgQzIwLjU1MjI4NDcsMiAyMSwyLjQ0NzcxNTI1IDIxLDMgTDIxLDkgTDE4Ljk5NDM4NDgsMTEuMjYzOTY2MiBMMTguOTk0Mzg0OCwxMyBMMTMsMTMgTDEzLDE5LjAyNDA0NzkgTDExLjA3ODEwNSwxOS4wMjQwNDc5IEw5LDIxIEw0LDIxIEMzLjQ0NzcxNTI1LDIxIDMsMjAuNTUyMjg0NyAzLDIwIEwzLDMgQzMsMi40NDc3MTUyNSAzLjQ0NzcxNTI1LDIgNCwyIEw2LDIgWiIgaWQ9IlBhdGgiIGZpbGw9IiM3NUJFRjQiIGZpbGwtcnVsZT0ibm9uemVybyI+PC9wYXRoPgogICAgICAgIDxwb2x5Z29uIGlkPSJDb21iaW5lZC1TaGFwZSIgZmlsbD0iI0ZGRkZGRiIgZmlsbC1ydWxlPSJub256ZXJvIiBwb2ludHM9IjE4IDEzIDEzIDEzIDEzIDE4IDYgMTggNiA0IDE4IDQiPjwvcG9seWdvbj4KICAgICAgICA8cGF0aCBkPSJNMTAsMiBMMTAsMC44MzMzMzMzMzMgQzEwLDAuMzczMDk2MDQyIDEwLjI5ODQ3NjgsMCAxMC42NjY2NjY3LDAgTDEzLjMzMzMzMzMsMCBDMTMuNzAxNTIzMiwwIDE0LDAuMzczMDk2MDQyIDE0LDAuODMzMzMzMzMzIEwxNCwyIEwxNi4zMzMzMzMzLDIgQzE2LjcwMTUyMzIsMiAxNywyLjM3MzA5NjA0IDE3LDIuODMzMzMzMzMgTDE3LDQuMTY2NjY2NjcgQzE3LDQuNjI2OTAzOTYgMTYuNzAxNTIzMiw1IDE2LjMzMzMzMzMsNSBMNy42NjY2NjY2Nyw1IEM3LjI5ODQ3NjgzLDUgNyw0LjYyNjkwMzk2IDcsNC4xNjY2NjY2NyBMNywyLjgzMzMzMzMzIEM3LDIuMzczMDk2MDQgNy4yOTg0NzY4MywyIDcuNjY2NjY2NjcsMiBMMTAsMiBaIE0xMSwxIEwxMSwzIEwxMywzIEwxMywxIEwxMSwxIFoiIGlkPSJTaGFwZSIgZmlsbD0iIzY2NjY2NiIgZmlsbC1ydWxlPSJub256ZXJvIj48L3BhdGg+CiAgICAgICAgPHBhdGggZD0iTTIwLjUzOTg2MzcsMTEuMDUwNTU4MyBMMjMuOTg5MzA1NCwxNC41IEwyMC40NzI3ODAzLDE4LjAxNjUyNTEgTDE5Ljc2MTcxNTksMTcuMzI3OTA4MiBMMjIuMDg5MTA1LDE0Ljk5OTU1ODMgTDE1LDE1IEwxNC45OTkxMDUsMjIuMTQ2NTU4MyBMMTcuMjM1NDE4NSwxOS45MTExNjM5IEwxNy45MTEyNzY1LDIwLjYxNjYyMjEgTDE0LjQ5MDgxNzQsMjQuMDM3MDgxMSBMMTEuMDc4MTA1LDIwLjYyNDM2ODggTDExLjc4NDUwMzYsMTkuOTMxMDg2IEwxMy45OTkxMDUsMjIuMTQ2NTU4MyBMMTQsMTQgTDIyLjEwNzEwNSwxMy45OTk1NTgzIEwxOS44NDUxNjIxLDExLjczNzE3MjcgTDIwLjUzOTg2MzcsMTEuMDUwNTU4MyBaIiBpZD0i5b2i54q257uT5ZCIIiBmaWxsPSIjMzY3RkM5IiBmaWxsLXJ1bGU9Im5vbnplcm8iPjwvcGF0aD4KICAgIDwvZz4KPC9zdmc+);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-pasteValueAndNumberFormats {\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjRweCIgaGVpZ2h0PSIyNHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+UGFzdGUgVmFsdWUgQW5kIE51bWJlciBGb3JtYXRz5aSH5Lu9PC90aXRsZT4KICAgIDxnIGlkPSJQYXN0ZS1WYWx1ZS1BbmQtTnVtYmVyLUZvcm1hdHPlpIfku70iIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxwYXRoIGQ9Ik02LDIgTDYsNCBDNiw1LjEwNDU2OTUgNi44OTU0MzA1LDYgOCw2IEwxNiw2IEMxNy4xMDQ1Njk1LDYgMTgsNS4xMDQ1Njk1IDE4LDQgTDE4LDIgTDIwLDIgQzIwLjU1MjI4NDcsMiAyMSwyLjQ0NzcxNTI1IDIxLDMgTDIxLDE2IEw4LDE2IEw4LDIxIEw0LDIxIEMzLjQ0NzcxNTI1LDIxIDMsMjAuNTUyMjg0NyAzLDIwIEwzLDMgQzMsMi40NDc3MTUyNSAzLjQ0NzcxNTI1LDIgNCwyIEw2LDIgWiIgaWQ9IlBhdGgiIGZpbGw9IiM3NUJFRjQiIGZpbGwtcnVsZT0ibm9uemVybyI+PC9wYXRoPgogICAgICAgIDxwb2x5Z29uIGlkPSJDb21iaW5lZC1TaGFwZSIgZmlsbD0iI0ZGRkZGRiIgZmlsbC1ydWxlPSJub256ZXJvIiBwb2ludHM9IjE4IDE2IDggMTYgOCAxOCA2IDE4IDYgNCAxOCA0Ij48L3BvbHlnb24+CiAgICAgICAgPHBhdGggZD0iTTgsNy43NTQyMzcyOSBDOCw3LjIxNzUxMTQ0IDguMTQzMzYwMTUsNi43OTA5NjIwMyA4LjQzMDA4NDc1LDYuNDc0NTc2MjcgQzguNzE2ODA5MzQsNi4xNTgxOTA1MSA5LjEwMzEwNDkyLDYgOS41ODg5ODMwNSw2IEMxMC4wNTUwODcxLDYgMTAuNDE4Nzg0LDYuMTQ1NDc4NzcgMTAuNjgwMDg0OCw2LjQzNjQ0MDY4IEMxMC45NDEzODU1LDYuNzI3NDAyNTggMTEuMDcyMDMzOSw3LjEzMjc2NTc2IDExLjA3MjAzMzksNy42NTI1NDIzNyBDMTEuMDcyMDMzOSw4LjE2OTQ5MTUzIDEwLjkyNzk2NzUsOC41ODg5ODE0NCAxMC42Mzk4MzA1LDguOTExMDE2OTUgQzEwLjM1MTY5MzUsOS4yMzMwNTI0NiA5Ljk2ODkyODk0LDkuMzk0MDY3OCA5LjQ5MTUyNTQyLDkuMzk0MDY3OCBDOS4wMzk1NDU3Niw5LjM5NDA2NzggOC42Nzc5Njc0Niw5LjI0NDM1MTc4IDguNDA2Nzc5NjYsOC45NDQ5MTUyNSBDOC4xMzU1OTE4Niw4LjY0NTQ3ODczIDgsOC4yNDg1OTAwNCA4LDcuNzU0MjM3MjkgWiBNOC42NTI1NDIzNyw3LjcxMTg2NDQxIEM4LjY1MjU0MjM3LDguMDc2MjczMDEgOC43MzE2Mzc2Myw4LjM1NzM0MzY0IDguODg5ODMwNTEsOC41NTUwODQ3NSBDOS4wNDgwMjMzOSw4Ljc1MjgyNTg1IDkuMjY0MTIyOTIsOC44NTE2OTQ5MiA5LjUzODEzNTU5LDguODUxNjk0OTIgQzkuODIwNjIyODgsOC44NTE2OTQ5MiAxMC4wMzg4NDEsOC43NDkyOTQ4MSAxMC4xOTI3OTY2LDguNTQ0NDkxNTMgQzEwLjM0Njc1MjIsOC4zMzk2ODgyNCAxMC40MjM3Mjg4LDguMDUwODQ5MzIgMTAuNDIzNzI4OCw3LjY3Nzk2NjEgQzEwLjQyMzcyODgsNy4zMTM1NTc1IDEwLjM0ODE2NDYsNy4wMzE3ODA2NiAxMC4xOTcwMzM5LDYuODMyNjI3MTIgQzEwLjA0NTkwMzIsNi42MzM0NzM1OCA5LjgzMzMzNDcsNi41MzM4OTgzMSA5LjU1OTMyMjAzLDYuNTMzODk4MzEgQzkuMjc5NjU5NjIsNi41MzM4OTgzMSA5LjA1ODYxNjYzLDYuNjM3NzEwODMgOC44OTYxODY0NCw2Ljg0NTMzODk4IEM4LjczMzc1NjI1LDcuMDUyOTY3MTQgOC42NTI1NDIzNyw3LjM0MTgwNjA2IDguNjUyNTQyMzcsNy43MTE4NjQ0MSBaIE0xMy45MzIyMDM0LDYuMDk3NDU3NjMgTDkuNzE2MTAxNjksMTIuNzAzMzg5OCBMOS4wMDg0NzQ1OCwxMi43MDMzODk4IEwxMy4yMjQ1NzYzLDYuMDk3NDU3NjMgTDEzLjkzMjIwMzQsNi4wOTc0NTc2MyBaIE0xMS45MzIyMDM0LDExLjEyMjg4MTQgQzExLjkzMjIwMzQsMTAuNTg2MTU1NSAxMi4wNzU1NjM1LDEwLjE1NzQ4NzUgMTIuMzYyMjg4MSw5LjgzNjg2NDQxIEMxMi42NDkwMTI3LDkuNTE2MjQxMzMgMTMuMDMzODk1OSw5LjM1NTkzMjIgMTMuNTE2OTQ5Miw5LjM1NTkzMjIgQzEzLjk4MDIyODMsOS4zNTU5MzIyIDE0LjM0MzIxOSw5LjUwMjExNzE4IDE0LjYwNTkzMjIsOS43OTQ0OTE1MyBDMTQuODY4NjQ1NCwxMC4wODY4NjU5IDE1LDEwLjQ5ODU4NDkgMTUsMTEuMDI5NjYxIEMxNSwxMS41NDM3ODc5IDE0Ljg1NDUyMTIsMTEuOTYxMTU2NiAxNC41NjM1NTkzLDEyLjI4MTc3OTcgQzE0LjI3MjU5NzQsMTIuNjAyNDAyNyAxMy44OTI2NTc3LDEyLjc2MjcxMTkgMTMuNDIzNzI4OCwxMi43NjI3MTE5IEMxMi45Njg5MjQzLDEyLjc2MjcxMTkgMTIuNjA2NjM5OCwxMi42MTA4NzcyIDEyLjMzNjg2NDQsMTIuMzA3MjAzNCBDMTIuMDY3MDg5MSwxMi4wMDM1Mjk2IDExLjkzMjIwMzQsMTEuNjA4NzU5NSAxMS45MzIyMDM0LDExLjEyMjg4MTQgWiBNMTIuNTgwNTA4NSwxMS4wODQ3NDU4IEMxMi41ODA1MDg1LDExLjQ0MDY3OTcgMTIuNjU5NjAzNywxMS43MTgyMTkzIDEyLjgxNzc5NjYsMTEuOTE3MzcyOSBDMTIuOTc1OTg5NSwxMi4xMTY1MjY0IDEzLjE5MjA4OSwxMi4yMTYxMDE3IDEzLjQ2NjEwMTcsMTIuMjE2MTAxNyBDMTMuNzQ4NTg5LDEyLjIxNjEwMTcgMTMuOTY2ODA3MSwxMi4xMTI5OTU0IDE0LjEyMDc2MjcsMTEuOTA2Nzc5NyBDMTQuMjc0NzE4MywxMS43MDA1NjM5IDE0LjM1MTY5NDksMTEuNDEyNDMxMiAxNC4zNTE2OTQ5LDExLjA0MjM3MjkgQzE0LjM1MTY5NDksMTAuNjc1MTM5NCAxNC4yNzQ3MTgzLDEwLjM5NDA2ODggMTQuMTIwNzYyNywxMC4xOTkxNTI1IEMxMy45NjY4MDcxLDEwLjAwNDIzNjMgMTMuNzU1NjUxMSw5LjkwNjc3OTY2IDEzLjQ4NzI4ODEsOS45MDY3Nzk2NiBDMTMuMTk5MTUxMSw5LjkwNjc3OTY2IDEyLjk3NTk4OTUsMTAuMDEwNTkyMiAxMi44MTc3OTY2LDEwLjIxODIyMDMgQzEyLjY1OTYwMzcsMTAuNDI1ODQ4NSAxMi41ODA1MDg1LDEwLjcxNDY4NzQgMTIuNTgwNTA4NSwxMS4wODQ3NDU4IFoiIGlkPSIlIiBmaWxsPSIjNjY2NjY2IiBmaWxsLXJ1bGU9Im5vbnplcm8iPjwvcGF0aD4KICAgICAgICA8cGF0aCBkPSJNMTAsMiBMMTAsMC44MzMzMzMzMzMgQzEwLDAuMzczMDk2MDQyIDEwLjI5ODQ3NjgsMCAxMC42NjY2NjY3LDAgTDEzLjMzMzMzMzMsMCBDMTMuNzAxNTIzMiwwIDE0LDAuMzczMDk2MDQyIDE0LDAuODMzMzMzMzMzIEwxNCwyIEwxNi4zMzMzMzMzLDIgQzE2LjcwMTUyMzIsMiAxNywyLjM3MzA5NjA0IDE3LDIuODMzMzMzMzMgTDE3LDQuMTY2NjY2NjcgQzE3LDQuNjI2OTAzOTYgMTYuNzAxNTIzMiw1IDE2LjMzMzMzMzMsNSBMNy42NjY2NjY2Nyw1IEM3LjI5ODQ3NjgzLDUgNyw0LjYyNjkwMzk2IDcsNC4xNjY2NjY2NyBMNywyLjgzMzMzMzMzIEM3LDIuMzczMDk2MDQgNy4yOTg0NzY4MywyIDcuNjY2NjY2NjcsMiBMMTAsMiBaIE0xMSwxIEwxMSwzIEwxMywzIEwxMywxIEwxMSwxIFoiIGlkPSJTaGFwZSIgZmlsbD0iIzY2NjY2NiIgZmlsbC1ydWxlPSJub256ZXJvIj48L3BhdGg+CiAgICAgICAgPHBhdGggZD0iTTEwLjc1NTcxNTIsMTcuMTMyMDc1NSBMMTEuNTYwNDE4LDE3LjEzMjA3NTUgTDExLjU2MDQxOCwyMy44Njc5MjQ1IEwxMC40OTA1MjkxLDIzLjg2NzkyNDUgTDEwLjQ5MDUyOTEsMTguNDYyMjY0MiBDMTAuMDk3MzIyLDE4LjgzMDE4ODcgOS42MDM1MjcxMSwxOS4xMDM3NzM2IDksMTkuMjgzMDE4OSBMOSwxOC4xODg2NzkyIEM5LjI5MjYxOTIsMTguMTEzMjA3NSA5LjYwMzUyNzExLDE3Ljk4MTEzMjEgOS45MzI3MjM3MSwxNy43OTI0NTI4IEMxMC4yNjE5MjAzLDE3LjU4NDkwNTcgMTAuNTM2MjUwOCwxNy4zNjc5MjQ1IDEwLjc1NTcxNTIsMTcuMTMyMDc1NSBaIE0xNS4yMjczMDI0LDE3IEMxNS44NTgyNjI2LDE3IDE2LjM3OTQ5MDUsMTcuMTg4Njc5MiAxNi43OTA5ODYzLDE3LjU2NjAzNzcgQzE3LjE5MzMzNzcsMTcuOTQzMzk2MiAxNy4zOTQ1MTM0LDE4LjQyNDUyODMgMTcuMzk0NTEzNCwxOS4wMjgzMDE5IEMxNy4zOTQ1MTM0LDE5LjYxMzIwNzUgMTcuMTc1MDQ5LDIwLjE0MTUwOTQgMTYuNzU0NDA4OSwyMC42MjI2NDE1IEMxNi40OTgzNjcxLDIwLjkwNTY2MDQgMTYuMDQxMTQ5NiwyMS4yNjQxNTA5IDE1LjQwMTA0NTEsMjEuNzA3NTQ3MiBDMTQuNzMzNTA3NSwyMi4xNjAzNzc0IDE0LjMzMTE1NjEsMjIuNTU2NjAzOCAxNC4xODQ4NDY1LDIyLjg5NjIyNjQgTDE3LjQwMzY1NzcsMjIuODk2MjI2NCBMMTcuNDAzNjU3NywyMy44Njc5MjQ1IEwxMi44NDk3NzE0LDIzLjg2NzkyNDUgQzEyLjg0OTc3MTQsMjMuMTc5MjQ1MyAxMy4wNjAwOTE0LDIyLjU4NDkwNTcgMTMuNDk5MDIwMiwyMi4wNzU0NzE3IEMxMy43MzY3NzM0LDIxLjc5MjQ1MjggMTQuMjM5NzEyNiwyMS4zNzczNTg1IDE0Ljk5ODY5MzcsMjAuODM5NjIyNiBDMTUuNDE5MzMzOCwyMC41Mzc3MzU4IDE1LjcxMTk1MywyMC4yODMwMTg5IDE1Ljg5NDg0LDIwLjA4NDkwNTcgQzE2LjE3ODMxNDgsMTkuNzU0NzE3IDE2LjMyNDYyNDQsMTkuMzk2MjI2NCAxNi4zMjQ2MjQ0LDE5LjAxODg2NzkgQzE2LjMyNDYyNDQsMTguNjUwOTQzNCAxNi4yMjQwMzY2LDE4LjM3NzM1ODUgMTYuMDQxMTQ5NiwxOC4xOTgxMTMyIEMxNS44NDkxMTgyLDE4LjAxODg2NzkgMTUuNTY1NjQzNCwxNy45MzM5NjIzIDE1LjE5MDcyNSwxNy45MzM5NjIzIEMxNC43ODgzNzM2LDE3LjkzMzk2MjMgMTQuNDg2NjEwMSwxOC4wNzU0NzE3IDE0LjI4NTQzNDQsMTguMzU4NDkwNiBDMTQuMDg0MjU4NywxOC42MjI2NDE1IDEzLjk3NDUyNjUsMTkuMDI4MzAxOSAxMy45NTYyMzc4LDE5LjU1NjYwMzggTDEyLjg4NjM0ODgsMTkuNTU2NjAzOCBDMTIuODk1NDkzMSwxOC44MDE4ODY4IDEzLjEwNTgxMzIsMTguMTk4MTEzMiAxMy41MjY0NTMzLDE3LjczNTg0OTEgQzEzLjk1NjIzNzgsMTcuMjQ1MjgzIDE0LjUyMzE4NzUsMTcgMTUuMjI3MzAyNCwxNyBaIE0yMC42NzczMzUxLDE3IEMyMS4zMzU3MjgzLDE3IDIxLjg3NTI0NDksMTcuMTYwMzc3NCAyMi4yNzc1OTYzLDE3LjQ5MDU2NiBDMjIuNjcwODAzNCwxNy44MjA3NTQ3IDIyLjg3MTk3OTEsMTguMjczNTg0OSAyMi44NzE5NzkxLDE4Ljg1ODQ5MDYgQzIyLjg3MTk3OTEsMTkuNTk0MzM5NiAyMi41MDYyMDUxLDIwLjA4NDkwNTcgMjEuNzgzODAxNCwyMC4zMzAxODg3IEMyMi4xNjc4NjQxLDIwLjQ1MjgzMDIgMjIuNDY5NjI3NywyMC42MzIwNzU1IDIyLjY3MDgwMzQsMjAuODc3MzU4NSBDMjIuODkwMjY3OCwyMS4xMzIwNzU1IDIzLDIxLjQ2MjI2NDIgMjMsMjEuODU4NDkwNiBDMjMsMjIuNDgxMTMyMSAyMi43ODk2Nzk5LDIyLjk5MDU2NiAyMi4zNjkwMzk4LDIzLjM4Njc5MjUgQzIxLjkzMDExMSwyMy43OTI0NTI4IDIxLjM1NDAxNywyNCAyMC42NDA3NTc3LDI0IEMxOS45NjQwNzU4LDI0IDE5LjQxNTQxNDgsMjMuODIwNzU0NyAxOS4wMDM5MTksMjMuNDYyMjY0MiBDMTguNTQ2NzAxNSwyMy4wNjYwMzc3IDE4LjI5MDY1OTcsMjIuNDgxMTMyMSAxOC4yMzU3OTM2LDIxLjcyNjQxNTEgTDE5LjMyMzk3MTMsMjEuNzI2NDE1MSBDMTkuMzQyMjYsMjIuMTYwMzc3NCAxOS40NzAyODA5LDIyLjUgMTkuNzI2MzIyNywyMi43MzU4NDkxIEMxOS45NTQ5MzE0LDIyLjk1MjgzMDIgMjAuMjU2Njk1LDIzLjA2NjAzNzcgMjAuNjMxNjEzMywyMy4wNjYwMzc3IEMyMS4wNDMxMDkxLDIzLjA2NjAzNzcgMjEuMzcyMzA1NywyMi45NDMzOTYyIDIxLjYxMDA1ODgsMjIuNzA3NTQ3MiBDMjEuODIwMzc4OCwyMi40OTA1NjYgMjEuOTMwMTExLDIyLjIyNjQxNTEgMjEuOTMwMTExLDIxLjkwNTY2MDQgQzIxLjkzMDExMSwyMS41MTg4Njc5IDIxLjgxMTIzNDUsMjEuMjM1ODQ5MSAyMS41OTE3NzAxLDIxLjA1NjYwMzggQzIxLjM3MjMwNTcsMjAuODY3OTI0NSAyMS4wNTIyNTM0LDIwLjc4MzAxODkgMjAuNjMxNjEzMywyMC43ODMwMTg5IEwyMC4xNzQzOTU4LDIwLjc4MzAxODkgTDIwLjE3NDM5NTgsMTkuOTUyODMwMiBMMjAuNjMxNjEzMywxOS45NTI4MzAyIEMyMS4wMTU2NzYsMTkuOTUyODMwMiAyMS4zMDgyOTUyLDE5Ljg2NzkyNDUgMjEuNTA5NDcwOSwxOS42OTgxMTMyIEMyMS43MDE1MDIzLDE5LjUyODMwMTkgMjEuODAyMDkwMSwxOS4yNzM1ODQ5IDIxLjgwMjA5MDEsMTguOTQzMzk2MiBDMjEuODAyMDkwMSwxOC42MTMyMDc1IDIxLjcxMDY0NjYsMTguMzY3OTI0NSAyMS41MzY5MDQsMTguMTk4MTEzMiBDMjEuMzQ0ODcyNiwxOC4wMjgzMDE5IDIxLjA2MTM5NzgsMTcuOTQzMzk2MiAyMC42ODY0Nzk0LDE3Ljk0MzM5NjIgQzIwLjMwMjQxNjcsMTcuOTQzMzk2MiAyMC4wMDk3OTc1LDE4LjAzNzczNTggMTkuNzk5NDc3NSwxOC4yMzU4NDkxIEMxOS41ODAwMTMxLDE4LjQzMzk2MjMgMTkuNDUxOTkyMiwxOC43MzU4NDkxIDE5LjQxNTQxNDgsMTkuMTQxNTA5NCBMMTguMzYzODE0NSwxOS4xNDE1MDk0IEMxOC40MTg2ODA2LDE4LjQ2MjI2NDIgMTguNjU2NDMzNywxNy45MzM5NjIzIDE5LjA5NTM2MjUsMTcuNTU2NjAzOCBDMTkuNTA2ODU4MywxNy4xNzkyNDUzIDIwLjAzNzIzMDYsMTcgMjAuNjc3MzM1MSwxNyBaIiBpZD0iMTIzIiBmaWxsPSIjNjY2NjY2IiBmaWxsLXJ1bGU9Im5vbnplcm8iPjwvcGF0aD4KICAgIDwvZz4KPC9zdmc+);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-valueAndSourceFormats {\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjRweCIgaGVpZ2h0PSIyNHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+UGFzdGUgdmFsdWUgQW5kIFNvdXJjZSBGb3JtYXRz5aSH5Lu9PC90aXRsZT4KICAgIDxnIGlkPSJQYXN0ZS12YWx1ZS1BbmQtU291cmNlLUZvcm1hdHPlpIfku70iIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxwYXRoIGQ9Ik0yMSwxMS4xMzgyMzM1IEMyMC40MDcyOTE2LDExLjQ5MzAyNjEgMTkuNzEwNDEzLDEyLjAxNTAwMSAxOC44NTE5NjQ4LDEyLjY5MTE1MTggQzE3LjU2MTgwNTUsMTMuNzA3MzM3IDE2LjAwNzI0NTUsMTUuMDkxNDQ2IDE0Ljk0OTYyMDcsMTYuMTMxNjk5OSBDMTQuMzc4OTY4NCwxNi42OTMxMzYyIDEzLjgxNzM5NDUsMTcuMjY4NTUzIDEzLjQxMjU5ODksMTcuNzA1OTE4NyBDMTIuODYyNzY3MywxNy44NTE2MjEyIDEyLjM1NjIzNjQsMTguMTI4MDM3NCAxMS45Mzg3NDc3LDE4LjQ5MDY5MDIgQzExLjU1ODM4MjIsMTguODIwMjcxMSAxMS4yOTgxMTM5LDE5LjE3MzM4NjggMTAuOTkyODY1OSwxOS42OTA1NDMzIEMxMC45NTI4NTMyLDE5Ljc1ODMzMzYgMTAuODMwOTkyOCwxOS45Njg3ODYxIDEwLjgxNzQ4NjIsMTkuOTkxODYyNyBDMTAuNzIwMTcyMSwyMC4xNTgxMjg0IDEwLjY1ODk0NDcsMjAuMjUyMjE4NSAxMC42MzAzMzIxLDIwLjI4OTkyNjggQzEwLjY4MzY1MzgsMjAuMjI5NjY1NyAxMC42ODY2MzM1LDIwLjIyNzA1MzcgMTAuNjU2Njc2MiwyMC4yNDEwMDgyIEMxMC41NDk3NjgsMjAuMjkwODA3NCAxMC40MDk1NzUxLDIwLjM0NDg5ODQgMTAuMTU2MzE4NCwyMC40MzUyNjE2IEMxMC4wMzE5NTYxLDIwLjQ3OTQ4NDMgMTAuMDMxOTU2MSwyMC40Nzk0ODQzIDkuOTAwMDMyNCwyMC41MjY3NDY4IEM5LjQyNjgzOTI1LDIwLjY5NzQ3MzUgOS4xMjIwOTcxLDIwLjgyMzkzIDguODYyOTIyNSwyMSBMNCwyMSBDMy40NDc3MTUyNSwyMSAzLDIwLjU1MjI4NDcgMywyMCBMMywzIEMzLDIuNDQ3NzE1MjUgMy40NDc3MTUyNSwyIDQsMiBMNiwyIEw2LDQgQzYsNS4xMDQ1Njk1IDYuODk1NDMwNSw2IDgsNiBMMTYsNiBDMTcuMTA0NTY5NSw2IDE4LDUuMTA0NTY5NSAxOCw0IEwxOCwyIEwyMCwyIEMyMC41NTIyODQ3LDIgMjEsMi40NDc3MTUyNSAyMSwzIEwyMSwxMS4xMzgyMzM1IFoiIGlkPSJDb21iaW5lZC1TaGFwZSIgZmlsbD0iIzc1QkVGNCIgZmlsbC1ydWxlPSJub256ZXJvIj48L3BhdGg+CiAgICAgICAgPHBhdGggZD0iTTE4LDEzLjM4Mjc5NTQgQzE2LjkyMjg2ODMsMTQuMjgwNjc5NCAxNS43ODIyNDg4LDE1LjMxMjc0NzMgMTQuOTQ5NjIwNywxNi4xMzE2OTk5IEMxNC4zNzg5Njg0LDE2LjY5MzEzNjIgMTMuODE3Mzk0NSwxNy4yNjg1NTMgMTMuNDEyNTk4OSwxNy43MDU5MTg3IEMxMy4xNDk0OTU1LDE3Ljc3NTYzOTcgMTIuODk2MzA3MSwxNy44NzUyOTEzIDEyLjY1ODA0NTQsMTggTDYsMTggTDYsNCBMMTgsNCBMMTgsMTMuMzgyNzk1NCBaIiBpZD0iQ29tYmluZWQtU2hhcGUiIGZpbGw9IiNGRkZGRkYiIGZpbGwtcnVsZT0ibm9uemVybyI+PC9wYXRoPgogICAgICAgIDxwYXRoIGQ9Ik0xMCwyIEwxMCwwLjgzMzMzMzMzMyBDMTAsMC4zNzMwOTYwNDIgMTAuMjk4NDc2OCw1LjMyOTA3MDUyZS0xNSAxMC42NjY2NjY3LDUuMzI5MDcwNTJlLTE1IEwxMy4zMzMzMzMzLDUuMzI5MDcwNTJlLTE1IEMxMy43MDE1MjMyLDUuMzI5MDcwNTJlLTE1IDE0LDAuMzczMDk2MDQyIDE0LDAuODMzMzMzMzMzIEwxNCwyIEwxNi4zMzMzMzMzLDIgQzE2LjcwMTUyMzIsMiAxNywyLjM3MzA5NjA0IDE3LDIuODMzMzMzMzMgTDE3LDQuMTY2NjY2NjcgQzE3LDQuNjI2OTAzOTYgMTYuNzAxNTIzMiw1IDE2LjMzMzMzMzMsNSBMNy42NjY2NjY2Nyw1IEM3LjI5ODQ3NjgzLDUgNyw0LjYyNjkwMzk2IDcsNC4xNjY2NjY2NyBMNywyLjgzMzMzMzMzIEM3LDIuMzczMDk2MDQgNy4yOTg0NzY4MywyIDcuNjY2NjY2NjcsMiBMMTAsMiBaIE0xMSwxIEwxMSwzIEwxMywzIEwxMywxIEwxMSwxIFoiIGlkPSJTaGFwZSIgZmlsbD0iIzY2NjY2NiIgZmlsbC1ydWxlPSJub256ZXJvIj48L3BhdGg+CiAgICAgICAgPGcgaWQ9Ikdyb3VwLTgiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDkuMDAwMDAwLCAxMi4wMDAwMDApIiBmaWxsLXJ1bGU9Im5vbnplcm8iPgogICAgICAgICAgICA8cGF0aCBkPSJNMTMuODAyODQ0MiwwLjI3MjcyNzI3MyBDMTMuMTIxNzQ4OCwtMC4zNzkxMDA5MDEgOC42OTA0MjA0OSwzLjUzOTg4Nzk4IDcuMDAxNDYyMjksNS4yMDExMDU5IEM2LjE2MjkyMDkzLDYuMDI2MTA0ODcgNS4zMjI1NjQ4NCw2LjkwNDcyNDQ2IDUuMDY1OTIyMzcsNy4yMzQ3MjQwNSBDNC45NTM3NjQ5OSw3LjM3OTI2Mzg3IDUuMTAyMjA4NTgsNy40MjI4MjM4MiA1LjE2NzUyMzc2LDcuNDU2NDgzNzcgQzUuNTAwMDM3NCw3LjYyNjc2MzU2IDUuNzMyMjY5MTYsNy43ODM4NDMzNiA2LjAzMjQ1NTA5LDguMDc4ODYyOTkgQzYuMzMzMzAwNzcsOC4zNzM4ODI2MiA2LjQ5MzYxOTg1LDguNjAyMjQyMzQgNi42NjUxNTQ2Nyw4LjkyOTYwMTkzIEM2LjcwMDEyMTM4LDguOTk0MjgxODUgNi43NDQ5ODQzMyw5LjEzOTQ4MTY3IDYuODkwNzg4OTMsOS4wMjk5MjE4IEM3LjIyNzI2MTA3LDguNzc3MTQyMTIgOC4wMTAyMTcyMSw3LjkyNzc0ODQxIDguODQ4NzU4NTYsNy4xMDQwNjk0NSBDMTAuNTM4Mzc2NSw1LjQ0MzUxMTUyIDE0LjQ4MzkzOTYsMC45MjQ1NTU0NDYgMTMuODAyODQ0MiwwLjI3MjcyNzI3MyBaIiBpZD0iUGF0aCIgZmlsbD0iI0JCQkJCQiI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBkPSJNMTMuODc4ODk3MiwwLjExNjg1OTQ0NSBDMTQuNjUwNzA5NSwwLjg1Nzc3MTg1MiAxMS41OTAzMjY3LDQuNzUxODI2MTUgOC43NTg2MzMyLDcuNTQzMzUyNSBDOC43MDcyNDg5Nyw3LjU5NDA0ODg0IDguNzA3MjQ4OTcsNy41OTQwNDg4NCA4LjY1NjA1MDE2LDcuNjQ0ODE4MjIgQzguNDgxMjc3OTIsNy44MTgzMzAwNiA4LjMwNDY1NTI5LDcuOTk2NjU5NzEgOC4wNzg5NjI0OCw4LjIyNjcwNTA2IEM4LjEwOTAyMjM2LDguMTk2MDY1NDcgNy42NjU5MDA3Myw4LjY0ODUyNzg3IDcuNTU1NjQ4NTYsOC43NjAyNzUzIEM3LjE2MzI3MTU2LDkuMTU3OTczNzUgNi45MzgxNTMxOSw5LjM3MzA4MTgxIDYuNzc5NDU5ODMsOS40OTI2NjgyMSBDNi41Mjk5NDc2Nyw5LjY4MDczMDYxIDYuMjk3NjMwNTEsOS41Nzk3OTkzIDYuMTc5NzYwODgsOS4zNTg5MTM3NyBDNi4xNzA3MDc5Nyw5LjM0MTk0ODc4IDYuMTUyNTY0MDYsOS4zMDQ2Njg5MiA2LjE1MDU2MTQ0LDkuMzAwOTA1MTIgQzUuOTgzMjIzNDcsOC45ODA1NzUzOCA1LjgzNjE5MTA2LDguNzc5ODg3NjUgNS41NzAwNDYxNSw4LjUxODA5NjA5IEM1LjMwNTM5MTQ3LDguMjU3MTk4NDUgNS4xMDE4MDE1MSw4LjExMjExODE2IDQuNzczNzY0MTQsNy45NDM2MTQ0MyBDNC43NzMyNTIzNSw3Ljk0MzM0OTg3IDQuNzM0OTE0NzcsNy45MjU0NjY3MiA0LjcxNzM3NTE2LDcuOTE2NDUwNDcgQzQuNDkyMjY4MzksNy44MDA3MzQyMyA0LjM4NzQwNzM1LDcuNTY0MDM1MDQgNC41ODI0MjYzNyw3LjMxMTkzODk1IEM0Ljg0MTg3MTc1LDYuOTc3MzEyMSA1LjY2ODMwNjY5LDYuMTA3NjI2NSA2LjUzNjAxMjk2LDUuMjUxMzE1MjkgQzkuNjgyOTMwOTIsMi4xNDY1OTA1NSAxMy4xMjQ2MzUzLC0wLjYwNzIwNTIxNiAxMy44Nzg4OTcyLDAuMTE2ODU5NDQ1IFogTTcuMTY5MzU2MTQsOC4zNzY1MTk3NCBDNy4yNzg3Nzc0OCw4LjI2NTYxNDQyIDcuNzIwOTY1OTksNy44MTQxMDQ4IDcuNjkxNTk1LDcuODQ0MDQyMjIgQzcuOTE4ODE4NjIsNy42MTI0MzY1NCA4LjA5Njk4MDMxLDcuNDMyNTUyOTUgOC4yNzM3MzgyLDcuMjU3MDY5NzcgQzguMzI1NjM5NTQsNy4yMDU2MDM3NSA4LjMyNTYzOTU0LDcuMjA1NjAzNzUgOC4zNzc3MzcxMiw3LjE1NDIwMzUzIEM5LjMyNDAxNzI3LDYuMjIxMzQ2MjIgMTAuNzU0OTYwNiw0LjYxNzA4Mjc5IDExLjgwMjQ5OTksMy4yODQxODU4OSBDMTIuOTgwMzk2LDEuNzg1NDIxODkgMTMuNjMxMzg2NCwwLjYzNDExODc2MyAxMy41MDMxMzIsMC41MTA5OTkxNTQgQzEzLjM2OTA2MjQsMC4zODIyOTcwNDIgMTIuMjQyNTA0MiwxLjAzNTUzNTc1IDEwLjc1NTAyNzksMi4yMjU3MDM2MiBDOS40OTAwMjc2NywzLjIzNzg2MjY3IDcuOTQ1ODM3ODYsNC42MjUzMzEyMiA2LjkxNzE0MDU4LDUuNjQwMjM1OTMgQzYuMTY5NzE0MDksNi4zNzc4NDY5MiA1LjQ0ODkxNTIyLDcuMTMwNDQ5MjIgNS4xMjI4NTg4Myw3LjUxMTQ2NDY3IEM1LjQ0Mzc0NjcsNy42ODQ5MjcwMiA1LjY3NDE1Nzc2LDcuODU2MDkxOSA1Ljk1MDc3ODkyLDguMTI4Nzg2MzQgQzYuMjMxMDAwNTYsOC40MDQ0MjQxNSA2LjQwNjA2NzQxLDguNjM0MDA4ODggNi41ODAxMDkzOCw4Ljk1MDcwNjg1IEM2LjcxMjE0MTg3LDguODMzMzE2NjQgNi45MDAwMzM2LDguNjQ5NDk0ODYgNy4xNjkzNTYxNCw4LjM3NjUxOTc0IFoiIGlkPSJQYXRoIiBmaWxsPSIjNjY2NjY2Ij48L3BhdGg+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0zLjkyMjQyNzI0LDcuNjIzMTA5OTQgQzMuMzc5NjI0NzQsOC4wOTM0NDIyMyAzLjEzNDI0MjU5LDguODQ5OTcwNjkgMi43MzEzNjQ0LDkuMzA5MjY3MjMgQzIuMzUxNjIwNjQsOS43NDIxODk2MSAwLjk2NDI3MDY5OCw5Ljk3MTU1MDc3IDAuNTg3NjY4ODksMTAuMzM5NTk5NyBDMC4xNjU3NDAwODQsMTAuNzUxOTQ2MiA0LjY4NjY2OTA1LDEyLjI3NTA5NjMgNi4xNTA5NTMxNSwxMC44NzQzNDczIEM3LjU3NDE3NjgxLDkuNTEyODc3MDUgNy41NzQxNzY4MSw4LjUwODY2NTIxIDYuNTg1MDczMDEsNy42MjMxMDk5NCBDNS41OTU5NjkyMSw2LjczNzU1NDY3IDQuNTA4NTA3MzQsNy4xMTQwMDk4MiAzLjkyMjQyNzI0LDcuNjIzMTA5OTQgWiIgaWQ9IlNoYXBlIiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0zLjM0MjczODcsOC41NDc0MjM5NiBDNC4zOTQ0MTUyLDguNzkwNjAyMjYgNS4wMTEyNzM1Myw5LjA0NjIyMzM1IDUuMTkzMzEzNyw5LjMxNDI4NzI0IEM1LjM3ODQyNTE0LDkuNTg2ODczNzQgNS41ODE0Mzk3MSwxMC4xNDI0NDM1IDUuODAyMzU3NDEsMTAuOTgwOTk2NiBDNS44MzgzMTI1OSwxMC45NTA5MDQyIDUuODcyMjkxMjYsMTAuOTE5MzM4MiA1LjkwNDIxNTI4LDEwLjg4NjI4OCBDNy4yMjcwNjMyMSw5LjUxNjc3MSA3LjMxOTA2NzcxLDguNTQwNzMxNjUgNi4zNjEzMDU0OSw3LjYxMjcxODc3IEM1LjU5MzUxMDY1LDYuODY4NzcyNjMgNC42NzcyMDUzLDYuOTY4MzIwNTYgMy45ODg2Nzg5OSw3LjYxNTU5NjIyIEwzLjk4ODQyODMxLDcuNjE1ODMxNTggQzMuNzc2MDM1MjgsNy44MTUwMDI0MSAzLjYwNDU0NjQyLDguMDY2ODAxNTQgMy4zNzkyODkzNSw4LjQ3OTgyMDY0IEMzLjM3MDg3OTcxLDguNDk1MjQwMSAzLjM1NzkyOTg2LDguNTE5MjEzMzQgMy4zNDI3Mzg3LDguNTQ3NDIzOTYgWiBNNi43NTU2OTg2OCw3LjIyNzI3OTkxIEM3Ljk0ODg5MjkzLDguMzgzNDEyMDIgNy44MjU2MDgyNSw5LjY5MTI5MDUxIDYuMzExNDk3ODYsMTEuMjU4ODE3NSBDNS41NDkzOTE5NiwxMi4wNDc4MDk5IDQuMDg4OTc1NDEsMTIuMTY4ODk4IDIuNDI0MjEzMzEsMTEuODAxMjI5NSBDMS43NzYyODU0LDExLjY1ODEzMjQgMS4xNTM5ODQ2NywxMS40NDY3NDE3IDAuNzA4OTM0NTQ1LDExLjIyNDMxNCBDMC4xMTkyMDg5ODEsMTAuOTI5NTgwMSAtMC4xOTA5Mjc2MDIsMTAuNjI0MDQ3NSAwLjEyNzEyMzUzNSwxMC4yODc2NTc5IEMwLjMwMzY1MjE3LDEwLjEwMDk1MDggMC41NjgwMDI2NTMsOS45NjgzODU0OSAxLjA4MTQyNTM4LDkuNzY3OTEwMyBDMS4xNDI3ODE0NCw5Ljc0Mzk1MjcyIDEuMjEyMzY1ODcsOS43MTcxNDI4NyAxLjM0MzI3ODA3LDkuNjY2NzU5MzkgQzEuOTM2OTgyNzYsOS40Mzc1MDE3IDIuMjE2NDg1NDcsOS4yOTY1OTg2OSAyLjMzODY1NTA1LDkuMTQ1ODY2ODUgQzIuNDUxMzM0NzIsOS4wMDY4NDM1OSAyLjU1NDY5ODUsOC44Mzg1MDg2MiAyLjcwNTk1MDQxLDguNTU4ODM1ODEgQzIuNzIyNjA0MDksOC41MjgwNDIyOCAyLjg0NzQxODg2LDguMjk0NzYwOTYgMi44ODU1NTc3Niw4LjIyNDgzMTU1IEMzLjEzNjM2Mjg2LDcuNzY0OTY4OTcgMy4zMzUxMTEzMyw3LjQ3MzEyOTggMy42MDA0NDA4OCw3LjIyNDI4NDcxIEM0LjQ4OTg0NTEyLDYuMzg4MjY0MyA1Ljc0ODY5MzE2LDYuMjUxNTUzMjkgNi43NTU2OTg2OCw3LjIyNzI3OTkxIFoiIGlkPSJDb21iaW5lZC1TaGFwZSIgZmlsbD0iIzM2N0ZDOSI+PC9wYXRoPgogICAgICAgIDwvZz4KICAgICAgICA8cGF0aCBkPSJNOC4yNTQwODIzLDcuMDk0MzM5NjQgTDguODI4ODcwMDIsNy4wOTQzMzk2NCBMOC44Mjg4NzAwMiwxMS45MDU2NjA0IEw4LjA2NDY2MzYyLDExLjkwNTY2MDQgTDguMDY0NjYzNjIsOC4wNDQ0NzQ0MyBDNy43ODM4MDE0NCw4LjMwNzI3NzY0IDcuNDMxMDkwNzksOC41MDI2OTU0MyA3LDguNjMwNzI3NzkgTDcsNy44NDkwNTY1NyBDNy4yMDkwMTM3MSw3Ljc5NTE0ODIxIDcuNDMxMDkwNzksNy43MDA4MDg2NCA3LjY2NjIzMTIyLDcuNTY2MDM3NzEgQzcuOTAxMzcxNjUsNy40MTc3ODk3OSA4LjA5NzMyMjAxLDcuMjYyODAzMjEgOC4yNTQwODIzLDcuMDk0MzM5NjQgWiBNMTEuNDQ4MDczMSw3IEMxMS44OTg3NTksNyAxMi4yNzEwNjQ2LDcuMTM0NzcwODYgMTIuNTY0OTkwMiw3LjQwNDMxMjY0IEMxMi44NTIzODQxLDcuNjczODU0NDMgMTIuOTk2MDgxLDguMDE3NTIwMjEgMTIuOTk2MDgxLDguNDQ4Nzg3MDcgQzEyLjk5NjA4MSw4Ljg2NjU3Njc5IDEyLjgzOTMyMDcsOS4yNDM5MzUyOSAxMi41Mzg4NjM1LDkuNTg3NjAxMDcgQzEyLjM1NTk3NjUsOS43ODk3NTc0MyAxMi4wMjkzOTI2LDEwLjA0NTgyMjEgMTEuNTcyMTc1MSwxMC4zNjI1MzM3IEMxMS4wOTUzNjI1LDEwLjY4NTk4MzkgMTAuODA3OTY4NiwxMC45NjkwMDI3IDEwLjcwMzQ2MTgsMTEuMjExNTkwMyBMMTMuMDAyNjEyNiwxMS4yMTE1OTAzIEwxMy4wMDI2MTI2LDExLjkwNTY2MDQgTDkuNzQ5ODM2NzEsMTEuOTA1NjYwNCBDOS43NDk4MzY3MSwxMS40MTM3NDY2IDkuOTAwMDY1MjksMTAuOTg5MjE4NCAxMC4yMTM1ODU5LDEwLjYyNTMzNjkgQzEwLjM4MzQwOTYsMTAuNDIzMTgwNiAxMC43NDI2NTE5LDEwLjEyNjY4NDYgMTEuMjg0NzgxMiw5Ljc0MjU4NzU3IEMxMS41ODUyMzg0LDkuNTI2OTU0MTQgMTEuNzk0MjUyMSw5LjM0NTAxMzUgMTEuOTI0ODg1Nyw5LjIwMzUwNDA3IEMxMi4xMjczNjc3LDguOTY3NjU1IDEyLjIzMTg3NDYsOC43MTE1OTAyOSAxMi4yMzE4NzQ2LDguNDQyMDQ4NSBDMTIuMjMxODc0Niw4LjE3OTI0NTI5IDEyLjE2MDAyNjEsNy45ODM4Mjc1IDEyLjAyOTM5MjYsNy44NTU3OTUxNCBDMTEuODkyMjI3Myw3LjcyNzc2Mjc5IDExLjY4OTc0NTMsNy42NjcxMTU5MyAxMS40MjE5NDY0LDcuNjY3MTE1OTMgQzExLjEzNDU1MjYsNy42NjcxMTU5MyAxMC45MTkwMDcyLDcuNzY4MTk0MDcgMTAuNzc1MzEwMyw3Ljk3MDM1MDQzIEMxMC42MzE2MTM0LDguMTU5MDI5NjQgMTAuNTUzMjMzMiw4LjQ0ODc4NzA3IDEwLjU0MDE2OTksOC44MjYxNDU1NyBMOS43NzU5NjM0Miw4LjgyNjE0NTU3IEM5Ljc4MjQ5NTEsOC4yODcwNjIgOS45MzI3MjM3MSw3Ljg1NTc5NTE0IDEwLjIzMzE4MDksNy41MjU2MDY1IEMxMC41NDAxNjk5LDcuMTc1MjAyMTQgMTAuOTQ1MTMzOSw3IDExLjQ0ODA3MzEsNyBaIE0xNS4zNDA5NTM2LDcgQzE1LjgxMTIzNDUsNyAxNi4xOTY2MDM1LDcuMTE0NTU1MjkgMTYuNDgzOTk3NCw3LjM1MDQwNDI5IEMxNi43NjQ4NTk2LDcuNTg2MjUzMzYgMTYuOTA4NTU2NSw3LjkwOTcwMzUgMTYuOTA4NTU2NSw4LjMyNzQ5MzI5IEMxNi45MDg1NTY1LDguODUzMDk5NzEgMTYuNjQ3Mjg5NCw5LjIwMzUwNDA3IDE2LjEzMTI4NjcsOS4zNzg3MDYyMSBDMTYuNDA1NjE3Miw5LjQ2NjMwNzI5IDE2LjYyMTE2MjYsOS41OTQzMzk2NCAxNi43NjQ4NTk2LDkuNzY5NTQxNzkgQzE2LjkyMTYxOTksOS45NTE0ODI1IDE3LDEwLjE4NzMzMTYgMTcsMTAuNDcwMzUwNCBDMTcsMTAuOTE1MDk0NCAxNi44NDk3NzE0LDExLjI3ODk3NTcgMTYuNTQ5MzE0MSwxMS41NjE5OTQ2IEMxNi4yMzU3OTM2LDExLjg1MTc1MiAxNS44MjQyOTc5LDEyIDE1LjMxNDgyNjksMTIgQzE0LjgzMTQ4MjcsMTIgMTQuNDM5NTgyLDExLjg3MTk2NzYgMTQuMTQ1NjU2NCwxMS42MTU5MDMgQzEzLjgxOTA3MjUsMTEuMzMyODg0MSAxMy42MzYxODU1LDEwLjkxNTA5NDQgMTMuNTk2OTk1NCwxMC4zNzYwMTA4IEwxNC4zNzQyNjUyLDEwLjM3NjAxMDggQzE0LjM4NzMyODYsMTAuNjg1OTgzOSAxNC40Nzg3NzIxLDEwLjkyODU3MTQgMTQuNjYxNjU5MSwxMS4wOTcwMzUxIEMxNC44MjQ5NTEsMTEuMjUyMDIxNiAxNS4wNDA0OTY0LDExLjMzMjg4NDEgMTUuMzA4Mjk1MiwxMS4zMzI4ODQxIEMxNS42MDIyMjA4LDExLjMzMjg4NDEgMTUuODM3MzYxMiwxMS4yNDUyODMgMTYuMDA3MTg0OSwxMS4wNzY4MTk0IEMxNi4xNTc0MTM0LDEwLjkyMTgzMjkgMTYuMjM1NzkzNiwxMC43MzMxNTM2IDE2LjIzNTc5MzYsMTAuNTA0MDQzMSBDMTYuMjM1NzkzNiwxMC4yMjc3NjI4IDE2LjE1MDg4MTgsMTAuMDI1NjA2NSAxNS45OTQxMjE1LDkuODk3NTc0MTQgQzE1LjgzNzM2MTIsOS43NjI4MDMyMSAxNS42MDg3NTI0LDkuNzAyMTU2MzYgMTUuMzA4Mjk1Miw5LjcwMjE1NjM2IEwxNC45ODE3MTEzLDkuNzAyMTU2MzYgTDE0Ljk4MTcxMTMsOS4xMDkxNjQ0MyBMMTUuMzA4Mjk1Miw5LjEwOTE2NDQzIEMxNS41ODI2MjU3LDkuMTA5MTY0NDMgMTUuNzkxNjM5NCw5LjA0ODUxNzUgMTUuOTM1MzM2NCw4LjkyNzIyMzcxIEMxNi4wNzI1MDE2LDguODA1OTI5OTMgMTYuMTQ0MzUwMSw4LjYyMzk4OTIxIDE2LjE0NDM1MDEsOC4zODgxNDAxNCBDMTYuMTQ0MzUwMSw4LjE1MjI5MTA3IDE2LjA3OTAzMzMsNy45NzcwODg5MyAxNS45NTQ5MzE0LDcuODU1Nzk1MTQgQzE1LjgxNzc2NjEsNy43MzQ1MDEzNiAxNS42MTUyODQxLDcuNjczODU0NDMgMTUuMzQ3NDg1Myw3LjY3Mzg1NDQzIEMxNS4wNzMxNTQ4LDcuNjczODU0NDMgMTQuODY0MTQxMSw3Ljc0MTIzOTg2IDE0LjcxMzkxMjUsNy44ODI3NDkzNiBDMTQuNTU3MTUyMiw4LjAyNDI1ODc5IDE0LjQ2NTcwODcsOC4yMzk4OTIyMSAxNC40Mzk1ODIsOC41Mjk2NDk1NyBMMTMuNjg4NDM4OSw4LjUyOTY0OTU3IEMxMy43Mjc2MjksOC4wNDQ0NzQ0MyAxMy44OTc0NTI2LDcuNjY3MTE1OTMgMTQuMjEwOTczMiw3LjM5NzU3NDE0IEMxNC41MDQ4OTg4LDcuMTI4MDMyMzYgMTQuODgzNzM2MSw3IDE1LjM0MDk1MzYsNyBaIiBpZD0iMTIzIiBmaWxsPSIjNjY2NjY2IiBmaWxsLXJ1bGU9Im5vbnplcm8iPjwvcGF0aD4KICAgIDwvZz4KPC9zdmc+);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-pasteLink {\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjRweCIgaGVpZ2h0PSIyNHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+UGFzdGUgTGlua+Wkh+S7vTwvdGl0bGU+CiAgICA8ZyBpZD0iUGFzdGUtTGlua+Wkh+S7vSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPHBhdGggZD0iTTYsMiBMNiw0IEM2LDUuMTA0NTY5NSA2Ljg5NTQzMDUsNiA4LDYgTDE2LDYgQzE3LjEwNDU2OTUsNiAxOCw1LjEwNDU2OTUgMTgsNCBMMTgsMiBMMjAsMiBDMjAuNTUyMjg0NywyIDIxLDIuNDQ3NzE1MjUgMjEsMyBMMjEuMDAxMTY3LDE2LjU2MTU2NjMgQzIwLjg1NDM1NzYsMTYuNTQ0Njg2IDIwLjcwNTA1MTcsMTYuNTM2MDEwNyAyMC41NTM3MTk3LDE2LjUzNjAxMDcgTDIwLjI0NDIyNDUsMTYuNTM2MjcxNCBDMTkuNjU5OTk1MSwxNS4wNTExNzE0IDE4LjIxMzAwODYsMTQgMTYuNTIwNTA3OCwxNCBMMTMsMTQgQzEwLjc5MDg2MSwxNCA5LDE1Ljc5MDg2MSA5LDE4IEM5LDE5LjIwOTQ2MzcgOS41MzY3ODYzNywyMC4yOTM1NTQyIDEwLjM4NDk0NTUsMjEuMDI2OTY5NiBMNCwyMSBDMy40NDc3MTUyNSwyMSAzLDIwLjU1MjI4NDcgMywyMCBMMywzIEMzLDIuNDQ3NzE1MjUgMy40NDc3MTUyNSwyIDQsMiBMNiwyIFoiIGlkPSLlvaLnirbnu5PlkIgiIGZpbGw9IiM3NUJFRjQiIGZpbGwtcnVsZT0ibm9uemVybyI+PC9wYXRoPgogICAgICAgIDxwYXRoIGQ9Ik0xOCw0IEwxOC4wMDA5NTkzLDE0LjI4MjkwNTggQzE3LjU0MzA2MDUsMTQuMTAwMzcyOCAxNy4wNDM1MDU4LDE0IDE2LjUyMDUwNzgsMTQgTDEzLDE0IEMxMC43OTA4NjEsMTQgOSwxNS43OTA4NjEgOSwxOCBMNiwxOCBMNiw0IEwxOCw0IFoiIGlkPSLlvaLnirbnu5PlkIgiIGZpbGw9IiNGRkZGRkYiIGZpbGwtcnVsZT0ibm9uemVybyI+PC9wYXRoPgogICAgICAgIDxwYXRoIGQ9Ik0xMCwyIEwxMCwwLjgzMzMzMzMzMyBDMTAsMC4zNzMwOTYwNDIgMTAuMjk4NDc2OCwwIDEwLjY2NjY2NjcsMCBMMTMuMzMzMzMzMywwIEMxMy43MDE1MjMyLDAgMTQsMC4zNzMwOTYwNDIgMTQsMC44MzMzMzMzMzMgTDE0LDIgTDE2LjMzMzMzMzMsMiBDMTYuNzAxNTIzMiwyIDE3LDIuMzczMDk2MDQgMTcsMi44MzMzMzMzMyBMMTcsNC4xNjY2NjY2NyBDMTcsNC42MjY5MDM5NiAxNi43MDE1MjMyLDUgMTYuMzMzMzMzMyw1IEw3LjY2NjY2NjY3LDUgQzcuMjk4NDc2ODMsNSA3LDQuNjI2OTAzOTYgNyw0LjE2NjY2NjY3IEw3LDIuODMzMzMzMzMgQzcsMi4zNzMwOTYwNCA3LjI5ODQ3NjgzLDIgNy42NjY2NjY2NywyIEwxMCwyIFogTTExLDEgTDExLDMgTDEzLDMgTDEzLDEgTDExLDEgWiIgaWQ9IlNoYXBlIiBmaWxsPSIjNjY2NjY2IiBmaWxsLXJ1bGU9Im5vbnplcm8iPjwvcGF0aD4KICAgICAgICA8cGF0aCBkPSJNMTcuMDkwOTA5MSwxNy4zNjM2MzY0IEwxNy4wOTA5MDkxLDE4LjMyOTM3NjYgTDE2LjUsMTguMzI5Mzc2NiBDMTUuNTIwOTQ5OCwxOC4zMjkzNzY2IDE0LjU0NTA0MzksMTkuMzM5MTMxNiAxNC41NDUwNDM5LDIwLjMxODE4MTggQzE0LjU0NTA0MzksMjEuMjM5NjQwOSAxNS40MzAzMjIzLDIyLjE0MTU4MDUgMTYuMzI5Mjc0NSwyMi4yMjc0ODA3IEwxNi41LDIyLjIzNTU5NTcgTDIwLjA0NTQ1NDUsMjIuMjM1NTk1NyBDMjEuMDI0NTA0OCwyMi4yMzU1OTU3IDIyLDIxLjI5NzIzMjEgMjIsMjAuMzE4MTgxOCBDMjIsMTkuNTQ2NjM1NyAyMS4zMjUyODMyLDE4LjY3NDEzNDMgMjAuNjM3MTk0NCwxOC40MzA1NDIgTDIwLjYzNjg3NzEsMTcuNDIyODQyMyBDMjEuOTg1MjE3OCwxNy42OTY3OTEzIDIzLDE4Ljg4ODk3OSAyMywyMC4zMTgxODE4IEMyMywyMS45NDk5MzIyIDIxLjY3NzIwNDksMjMuMjcyNzI3MyAyMC4wNDU0NTQ1LDIzLjI3MjcyNzMgTDE2LjUsMjMuMjcyNzI3MyBDMTQuODY4MjQ5NiwyMy4yNzI3MjczIDEzLjU0NTQ1NDUsMjEuOTQ5OTMyMiAxMy41NDU0NTQ1LDIwLjMxODE4MTggQzEzLjU0NTQ1NDUsMTguNjg2NDMxNCAxNC44NjgyNDk2LDE3LjM2MzYzNjQgMTYuNSwxNy4zNjM2MzY0IEwxNy4wOTA5MDkxLDE3LjM2MzYzNjQgWiBNMTYuNSwxNSBDMTguMTMxNzUwNCwxNSAxOS40NTQ1NDU1LDE2LjMyMjc5NTEgMTkuNDU0NTQ1NSwxNy45NTQ1NDU1IEMxOS40NTQ1NDU1LDE5LjU4NjI5NTkgMTguMTMxNzUwNCwyMC45MDkwOTA5IDE2LjUsMjAuOTA5MDkwOSBMMTUuOTA5MDkwOSwyMC45MDkwOTA5IEwxNS45MDkwOTA5LDE5Ljk2ODAxNzYgTDE2LjUsMTkuOTY4MDE3NiBDMTcuNDc5MDUwMiwxOS45NjgwMTc2IDE4LjQ4NTQ3MzYsMTguOTMzNTk1NyAxOC40ODU0NzM2LDE3Ljk1NDU0NTUgQzE4LjQ4NTQ3MzYsMTcuMDMzMDg2NCAxNy41Njk2Nzc3LDE2LjExNzA4NjUgMTYuNjcwNzI1NSwxNi4wMzExODYzIEwxNi41LDE2LjAyMzA3MTMgTDEyLjk1NDU0NTUsMTYuMDIzMDcxMyBDMTEuOTc1NDk1MiwxNi4wMjMwNzEzIDExLDE2Ljk3NTQ5NTIgMTEsMTcuOTU0NTQ1NSBDMTEsMTguNzI2MDkxNiAxMS42NzQ3MTY4LDE5LjcyNDQyNTMgMTIuMzYyODA1NiwxOS45NjgwMTc2IEwxMi4zNjMxMjI5LDIwLjg0OTg4NSBDMTEuMDE0NzgyMiwyMC41NzU5MzYgMTAsMTkuMzgzNzQ4MyAxMCwxNy45NTQ1NDU1IEMxMCwxNi4zMjI3OTUxIDExLjMyMjc5NTEsMTUgMTIuOTU0NTQ1NSwxNSBMMTYuNSwxNSBaIiBpZD0i5b2i54q257uT5ZCI5aSH5Lu9LTEzIiBmaWxsPSIjMzY3RkM5IiBmaWxsLXJ1bGU9Im5vbnplcm8iPjwvcGF0aD4KICAgIDwvZz4KPC9zdmc+);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-insertComment {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAYAAAAmL5yKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjA2MDkwNTRFNDJCNDExRTc5MkIxQTM0NTZCOUEwNEFBIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjA2MDkwNTRGNDJCNDExRTc5MkIxQTM0NTZCOUEwNEFBIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDYwOTA1NEM0MkI0MTFFNzkyQjFBMzQ1NkI5QTA0QUEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDYwOTA1NEQ0MkI0MTFFNzkyQjFBMzQ1NkI5QTA0QUEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz60jjNKAAAB2UlEQVR42oxSPUscURQ9b7MK+Q+CoD9hq2DnL0iVyiZItEi1wQ0Ykd0mlUhASKGB/IA0qawkayVEZEu7ZINESUbcVXHn433nvvtmdjE2DhzOm5l3zr33cOF3G965bjvg/zMe80yE39x97rYfoxfhohDooLcINOhLj9DoYphc4uLsN/JcMrKMOCuICWmBNC/wZuOLEONWV3oT270Gk335Ad4qeKeYnZPEkt93dvYxGN6g7l9tdR50sLJFF5/AG0MzGhJoeK/pHNgwS0UoDGqxYovb5srMLbroQA5R4CuTyI5MtVKQmgzEp1YnffGOLj1lL++m4Ja3Ufu8FkWMWDWcAwdDKTUMdVETqz1xezUg92kSfoSzoWsHs/SehQEuZDAexXInSpEJoR6qGhPbZNybOYwwEaM0DKy0JthooLThmSv3yqiqHNu2+NHPkFxeI0mGmJ+bwd/kNIaoVQzL21jB2xCULsObdPXz1x8sPJvF9+NTLD2fhhl3oKoRyqDKsyurO3636PfP8Xb9BJvNOdTon7GlgaZ5jrqHyPKi3LgcablxvIX0Pc8ULCW82ZxnsaORNYUtquU7+Praj+4k7shgNJIsHqUSaarIRCErFIpco5CKFyjkFsL/J8AAobbYzZKR99AAAAAASUVORK5CYII=);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-sortAscend {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAPCAYAAADUFP50AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjMxOTlCRUM2NDJCNDExRTc5RTE1RTkxNEMyMTAwMjYzIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjMxOTlCRUM3NDJCNDExRTc5RTE1RTkxNEMyMTAwMjYzIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MzE5OUJFQzQ0MkI0MTFFNzlFMTVFOTE0QzIxMDAyNjMiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MzE5OUJFQzU0MkI0MTFFNzlFMTVFOTE0QzIxMDAyNjMiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4BcqYtAAABGElEQVR42qyRsW7CMBCG/7No5wYJHgCpKgtT+gjZvMLUPWysmC4VA5S5G9lZSFam8gj0Abr0AZqBrhVSrmerkUANwUNPsnw++ff/+Q74ja7O4judcVevQ5yJh9ETl7kqE6lEYP5gqAE8wgl7ehUw817EiXvAV/jN1zETpYp4S0B4q7OOlxBEA0leBXPnjswXcZW8HonL9n3TJ7sE2ZAHrrJOso/LgohiIYhsh/FfcTyORv7o3BbHF5iRtJ8xrEWVS8FVgWZrbilhZL1dEjlHYqQ3C+xzg1A4xkWBex9s64Ivg+CgsGOCac+Q1v3tZI4HwlKQ0yqRjdXLlP6cbXPyCdZl0SJ/Tk6bVeVMIqya11CaldT98UeAAQC1jWR89hnvdgAAAABJRU5ErkJggg==);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-sortDescend {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAPCAYAAADUFP50AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjQzRDlFNTlBNDJCNDExRTc5M0U1RTRCOTU1NkNDNDRGIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjQzRDlFNTlCNDJCNDExRTc5M0U1RTRCOTU1NkNDNDRGIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NDNEOUU1OTg0MkI0MTFFNzkzRTVFNEI5NTU2Q0M0NEYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NDNEOUU1OTk0MkI0MTFFNzkzRTVFNEI5NTU2Q0M0NEYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7esVRmAAABKUlEQVR42pRSsU7DMBB9NmEnSK2YQVAWJvoJnZq1ZWGnG2sCS9WleGZr9y44a6b+AtlBiHwAHcqO5ONsNVVSBdU8KdbdKe/u3bPF6hExAIUKiDBvP2GEHdzej2nxPBE2lvxTeGhw3JrCFhL+8ibSLgJB0EcK61WCawJiY9CFB2RLIf9OEELihWeOThQKH2Jgjx+BGUvW7Sk0PCE35oD3svvBSv56qJv110RlbeEGVBY53W/Oxs1/IyiDyyi945EzAdN9y27yvTtuLx3o8c0XBDn0MsceV9EiJKI1k+eugQfcfhd9HZMQ+QEMk+WrAc4+skFRfWrNUoUYcrC0JJcS1eSW77OWn0dprxOl23uz0zt9vWySV50smOSS92zgujLpkxWcVmtN+BVgAGcAaQc1+ebbAAAAAElFTkSuQmCC);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-editComment {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjgxRDBDRTYzNDJCNDExRTc4OEM4QkU2MjcxNTlCOTFGIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjgxRDBDRTY0NDJCNDExRTc4OEM4QkU2MjcxNTlCOTFGIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6ODFEMENFNjE0MkI0MTFFNzg4QzhCRTYyNzE1OUI5MUYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6ODFEMENFNjI0MkI0MTFFNzg4QzhCRTYyNzE1OUI5MUYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz54ygF9AAACB0lEQVR42pSSP2gUURDGvz1DwNIyggiXRjshWEiukq3UQgs767VIFQ2CRUAQBMukkVsR4xUWphC8UkgagwlGBCEI6p6g8ZYTchHu9s/778zbVREtzLFz77Hsb76ZbwY44K/dbjsXRY7vjYOCYRji1tQUEkrw33DyBCQYotPpoNVq4S69C4a7K1RCAOcspNJQUkMIhaIUKIoqjo1uo3k5AfpLQLqMq3GEOI6DYPh1xR05eqpK7xw9Bs4qOimMxOdu+Ae4ukpVTF7C3vA79xz8Ks3B0p/x4az+J3j+2j0IqSBKjYY1tiYtPRXkwWdn/wLPXW/DWm5NQlCLDcNwXW7AijA49OgxmrPbeLE0/Vtx4T5A7cBVnmhSb2htvFkMW1ep9tMUeP8arcORBy8sPKh94G81JJtKMaG19tm62yfwrreHrTcpvqz1EXVjzMyQ4p2HsEaQapWYT6kUBVX64e2ya548TRmld9fZ6rSmrO/Cq35MRhh828dgMKTYx8bLHTR4rlyKM1VmZxSZUvX2U4nh5FOK2TPHsbm1gysXJ6FJeYLr5w/Bc60hvlsPKu8Dj67X28WNm6+wON+kEWloQ7Ci+jfW1pEXJfKcNiovkOV0z0q/Xfy+yCUMjXFxftqDlgxW2lYb8vzpnBuPBEYEj8fCg+NMIMskJZDIS4myUCiF9MvBa8xG/xBgAKOSrgO6at9SAAAAAElFTkSuQmCC);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-Totals {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAa0lEQVQ4T2NkoBAwUqifAdmABQwMDPFEGghSmwhSi2xAAQMDwwUkAwyQ+MhskBIQfwK6AQ4MDAwHkAxA5uOUQ3YBxQYMAy+MsDAIYGBg2ICekBIYGBjuE5kSFRkYGEDJGSUpE5kNUJVRnBsBMEouEYfPNZcAAAAASUVORK5CYII=);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-editCellType {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAj9JREFUOBFjrOxa+Z/hPwMYgBiMQAgXALIZwJJAmpHhNxMTo3dbSdhuiGooWdyyBKodRRgrx7zxVKJZw+npyJJMv379RubjZFs2nnRn+P9/FlDBVWRFTL9//UHmY2VbNZwy+PefYTVQsv9Ug+kUZEVMv39DXOA56Tb7////QZ5GATYNZ+SAVmwDBsI2g+/nl6JIAjlwL7x7926dRePpLmQFDg3nBX4z/N0OFLstJCQY//3HLxAbBQBdAPECEyPDJGCIFwADKQekAuSibwy/N4DYbOwcAdvzVH/++vlLEsRHBiywQDxeb74TGMppjP//zQYG2NN3796HARWqMbOwWh6p1HsP0vQLGl4N//8zSa84WP3586cIYCAiYuFkvdn8/4xMzX//M64FusaHGRjvx2qMHsJsBLr2acPMzVwK6w6vtzdVqv3x7dtxpl/QQIQpOlVv2ggMydlAL4UcrzM9DxMH0eJCPF5qEkI7PW00/bbtO3Pr+LUbeQxOgVVEJaS2KeuE12w/dfzNm7f/l63d/Swxu9scZCgLKBBtvEvBhjAyApPxf2ByBtIgAGIzMTIdk9TSKFZRlOpxMFWyOHPhxodDR6/XzJ9aehKsiBAx5eKbzA1XXz7bdufN3z2Hz3zJLJlYSUgPXL7syFP1KWdfvnnx9ff/r7///qtfchgjHbDAVaMxGg88mff2y8/Yyx9+sDx6/4MhREP4xS8JuWI0ZQw4DXj87tthFiYGi19//sm++/Xv96rLr2p7PJWuoRsAABsE/6rSSX85AAAAAElFTkSuQmCC);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-editCellDropdowns {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAa5JREFUOBFjnLpk9/+///4y/P37l+Hfv38Mf4EYRP8D8kFskBxYHCrfXprAyIAEWEAKcmPdkYRwM8u75mNIMoFsJhaAXIIOmLAJoiuC8f/+/QNjwmmSDMBmGQuyF7Zs2cKwefNmuOkghq+vL4OPjw9Y7O9fbF74jxAEKQRpgAFkzSCxf8AARwcoLgBJwmxDZ4P4MC80/P/PJL3iYPXnz58igNGIcAFIEQggGwIRgZA8PFx/G2Zu5lJYd3i5lamS55otxxaxgBIMkeChqY5G1t9/LDudLdRslm88fPX4tRt5WF2AxcAn56/e92dm4ZzhbKpssevguecXL95N3jyr4RsLyF/lnfMY/v3/D0zOf4D+BNGg5AtJytLiwp/klJWKuRhYpjqZq1icuXDjw6Gj12vmTy09icUiTKEpF99kbrj68tm2O2/+7jl85ktmycRKTFU4RMqOPFWfcvblmxdff///+vvvv/olh7ejK2VBF4DxGw88mff2y8/Yyx9+sDx6/4MhREP4xS8JuWKYPIzGacDjd98OszAxWPz680/23a9/v1ddflXb46l0DaYRRgMA06fsoLnNar4AAAAASUVORK5CYII=);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-deleteComment {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAYAAADtc08vAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjZCODVGRUQxNDJCNDExRTc4NzFDQTlCRDg2QzUzRTlEIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjZCODVGRUQyNDJCNDExRTc4NzFDQTlCRDg2QzUzRTlEIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NkI4NUZFQ0Y0MkI0MTFFNzg3MUNBOUJEODZDNTNFOUQiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NkI4NUZFRDA0MkI0MTFFNzg3MUNBOUJEODZDNTNFOUQiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7t98J5AAACbUlEQVR42pRTTUhUURg988bGJiUoxVL8CQ0kEkSSoIwgyKIIKgiCkFYtCjeaYUxRFERRuHE2LQoKpE1ULqIWRbXJSNoUZFDUlGHoFI6G8967f+/evnffG90JPfg49++c79zvfi8RXD2hDcyU4qJv5eWRR/jPz6G4HnDZIDz2MH9q/5ABEqVN3X9krT57bOeyAslztzPcZye56wnh+gOfD3beCUXkwNF9JlV2I5GTY8sJ2GyFqbtG//iD+ZuP4c7MIt24DnUNdZjc04aiUvB9Ds/j8D1GSOEyuD7D6fP3E2UlmaqubqRX1ODL4DVMj39E5e4daN26HSYQMFpY1JoTcjvPZp/gTO8u45SMsGevwS5lUV9RgfL11fhwMQv/1zQVQhFBwhhJ4xCVRS4omLJFhLj3AnOZIai/C0gf7kbHg2GsbtuIicxwRDAlkQg1iUohwCUJTDas2SxuPUXAOJzGWqzqOYBkZTk6R67ASacw++Y9kaKsITnEUJBzCUUuHJNI0Dopk2Jl33HopLEEJwm0D/dBFOYpo7BrkYvAOhGCRCjKNvwsfJoczaC6qgmpLa1UJLl0Zzpcs7cD2hZSxvVQFoWUFAHsK4iWWpRvaieSWLxzeKiUObId4GvOQ/73HPL5Alqa6zGTn4iKKMmKLVAQZQhd6PiupYyhg2/fp9G1rQlvxyfQcygFtehAxFlNXKh4rOPs2s4D5HJTGMy8w4X+Zji0p4JYQNJ9xl6+guezuON8uHHH2S6kdd8TCHRA5BZL1kZDKr304zwf7TXFBY4FEigWuSUXXQ7XFSQi4DEB5kswLmwDCXo5RW3+T4ABABxKzef1hlR0AAAAAElFTkSuQmCC);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-tableInsertColumnsLeft {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAPJJREFUOBFjYKAQMML022fu+e/qqw/m7t58keHgdBe4HEwNNpoFWfDjlz8M/5EFiGCjGHBq/1UitKAqIehMkNeQtYRa/gZz////z5Ab78XIhCz5qlkBRTFMzjPAgAGEQSA71gOMf//5A+ajeAEsgoX4/RfT3F+/f5FgwO9/GMb++U2CC379wTQA5gJwGKD7HZ3/5y8DAwiDQFX3fDD+9RsSmOAwEKt9wAjTBKJBfIhyCInsgrbSRLBgSdssMA2PBZgmGI1swO/f/xlAGBn8xhaI2DSDNGGLhd+kBOJvPIFIVDp4cP423PXxxW1gNiglUgUAAHOkbVTsKQH5AAAAAElFTkSuQmCC);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-tableInsertColumnsRight {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAPVJREFUOBFjYKAQMJKi3z5zz39XX32wlt2bLzIcnO7CyEKKASC1H7/8YfiPpIlkA07tv4qknYEB7AWQ05BFQy1/g7n///9nyI33wutNJphGzwADBhAGgexYDzD+/ecPTBpOv2pWQLEM7oXff1HEwRp+/f4F14iLgTDg9z8MNX9+Y7oAXRHcgF9/MA0gxgXwMPjzl4EBhEGgqns+GP/6DQlMkBi632F8rC5oK00E6WEoaZsFpkGEWO0DRpgmEA3ig8ThLvj9+z8DCCOD32iBCNMEo0Fq4S7AFgu/sQQismZUA8gMRLgLHpy/DXd9fHEbhA1MiTQHAK/6bFU/afyPAAAAAElFTkSuQmCC);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-tableInsertRowsAbove {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAPpJREFUOBFjYKAQMIL022fu+Q8z5+B0F7AYjA+iXzUr/BerfYAhDpJjAhGuvvoMZo7aICZWANIMMgSbJAtYECiFLItLMTaXgA3YveUiiuHYnItNM4omfBxcLsKnh35yGFEzZdH2/79+/2b49esXw+8/fxh+/4bQv0D07z8MEBooD1SzuL8GQz/DZKAB6KCicy660P+4olZwxIHTAYqH/yNHKESGkRHTIgaoOgwZ5FSJYjAWDijVQhISmqRngAHQ//8Zfv8F4j//gP79B+eD2H+A4g/O3wbrwvQCUBjiLFDy/A9E/xnAXgAKgsRBbGRPYnXBtg0X0NxEQy4A0oaWOlQyq2QAAAAASUVORK5CYII=);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-tableDeleteColumns {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAXBJREFUOBFjYKAQME5dvON/dqwHI7o59pl7/iOLHZzugqEmtrDlPxOyInS2u78Bg7u/Prowgg+0guX/fxSLEJJA1q/f/4Akbvn/QDkWBkZGhokLtvz/8+cvw5+/fxj+Aumq7DCwc38CDQBKw0F23cT/f/8C1f0BqgPRQMySg8X/MB0gFzAimTC1KR/JOIgqFphibPSvP0Dn/wd5AzfAbwCaC7AZgzMWmJiYLH7/ZTj+8xd+F2D4CWTLh4Kgk79//3nwgUk4J/VvdBArC+u++W/rv8ssPfAE3RVYXQCMiRl/fv+x4Pj89OSCT21/Z7ysnfP1209/dM0gPlYXgCSeJ3qK/vz18wbQIP6/v/8Zq68/chEkjg6wuuBtriffz98/1v398+cqEC/7/eubI7pGGB+rAZ/e/1zz59dvUd5/TF5qem4J3758V73opscN04RMYzXg7+8/HH9+/8sSW33gC2NDwz9uMabCl0/fqiJrpBobAEm1oy4uYR9PAAAAAElFTkSuQmCC);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-tableDeleteRows {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAVBJREFUOBFjZACCyYu2//8PYoAAkJUX78UI4ZBB9s/bDDeLGO1M6Ir+/P2LLoSXj2HAX0oN+PP3D14byZL8UBB08nW238pP2YHCMAOeRDvIgNjg0LbP3IMz4JgYmHzWME8U+/Xrd8OfX8AQ+vOn7e/vP7F/fv1epb7++FS4Ae5+Bgw///xj+PXrH8Pvv/8Zfv0Gsv/8Z/j9+9/7u+fvxi3/1nXy56+fN/78/sP/9/c/Y/X1Ry6CXMACIkDgPxCC0gDETRAxEP8/4//zWUzrTv78/WPd3z9/rwJd8OD3rx+OQBWoBuzaBOZDdSIoVmbWAtMPV5cCnSzK95/FRFTP7dvp/SsnX3TT49bfdekrQiUe1p1wu0M3Aq2cYEquhmqz7dKWNoDxUeic+kk4AxRFIZSDkZD+/CEtHWAYQHlK/ENaXgBHY1xRKzgWQd76+480AwAVyp7Zznx5LAAAAABJRU5ErkJggg==);\n  background-repeat: no-repeat;\n}\n\n.gc-spread-tableInsertRowsBelow {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAPlJREFUOBFjYKAQMKLrn7Jo+/9fv38z/Pr1i+H3nz8Mv39DaJDYb5A4iP/7D5he3F+DoZ9hMtAAdFDRORdd6H9cUet/kOVM6C5g+A8WRxFmZMS0CKYOQ8Y+cw+mCSjGITgHp7swsiC4CJZngAHQ//8Zfv8F4j//gP79B+eD2H+A4g/O3wZrwPQCUBjiLKBDgN4Bep4B7AWgIEgcxEZ2IlYXbNtwAeGcQc8Cexc55EEhi+7qV80K/8VqH2CIg9SBA9HVV5/BzFEbXR+cD9IMMgQugMSABCIowJEEcSnG5hKwAbu3XETSzsCAzbnYNKNowsfB5SJ8eoiWAwD2VZY6VOVQLwAAAABJRU5ErkJggg==);\n  background-repeat: no-repeat;\n}\n\n.gc-ui-contextmenu-disable .gc-spread-tableInsertColumnsLeft {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAIdJREFUOBHNUkEOgCAMQ+P74K3wBf7DF9AulgCKQPTgkqXbaJesQamvwlobQwiSqEf3rqPEFm/LH7z3eTtULz3W0znGmFJ/R669iWeQ+9qDnyzgPTS07jkHOuckOZMT4CZFwIu7ZB+otZbkKHlAEZGEHqYFIM6KoSkWYDAbxVduifMvDhM/jR15Eks6nBv2awAAAABJRU5ErkJggg==);\n  background-repeat: no-repeat;\n}\n\n.gc-ui-contextmenu-disable .gc-spread-tableInsertColumnsRight {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAIdJREFUOBHNUkEOgCAMm8b3wVvhC/yHL6g1dhkEDogxNlnYGO02QORLhBD2nPNl8FF7nW1gGxVIKRWUBRHbKTJ34L2/zrRyugcBojWnHjydutj0HfxIIMYosB7q2RnrCM45gfWA1yAJK19HBXpEu08SV+SGBECw5EcCIFnoV7YXWH9XS3jdPwD670s6Akl6lAAAAABJRU5ErkJggg==);\n  background-repeat: no-repeat;\n}\n\n.gc-ui-contextmenu-disable .gc-spread-tableInsertRowsAbove {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAIVJREFUOBG9UYkJwCAMTEvXcgZnNSu4jytYrqD4JIaWtoGA3l3OJBK9ESGEXFLyAyfhFUspZeRKqHFHdWkOmhi4935rpHQZxBhbjEYRSKm4K1pdtI5WNf9x3ULw7J12sSvxF5xz5ghl8bupNARiB8XdqJVp7GAMDYPDNyMw89SehE2iJ8AJ2XZh/l3z/VsAAAAASUVORK5CYII=);\n  background-repeat: no-repeat;\n}\n\n.gc-ui-contextmenu-disable .gc-spread-tableDeleteColumns {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAP9JREFUOBFjYKAQMG7cuPG/v78/I7o5IHFkMVxqmJAVobNtbW0ZQBgfwGsAPo0wORYQgxjnYlMHEmPB5jeQBDaATS3FXqCdASwsLBZAbxzH5hVkMYz4B0lu2rTpJJB6ICAgkPPhw4cgRkbGfczMzN+9vLyeIGsGsbF6AahhBlDOAqj5JJD999+/f3P+/v3rj64ZxMfqApDEtm3bRP/8+XPj/////ExMTMa+vr4XQeLoAJwO0AWBmvmAmtcBNV8FuuABkHYEqsFqAFYvADWvAWoS5ePj8wLanADUrLpz505udItAfKwGADVzAG3OcnR0/AKk/ykrKxcCDVXFZgDFYgBvWFxcHU+rmAAAAABJRU5ErkJggg==);\n  background-repeat: no-repeat;\n}\n\n.gc-ui-contextmenu-disable .gc-spread-tableDeleteRows {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAPNJREFUOBFjZACCjRs3/gfRMODv788IY5NMoxtGyAAmQgoIyQ+8AYRcCJbftGnTSSBeuWfPHmGYhm3btsmA2ODQxhdwzMzMPv///xcD4gag+r+MjIxt//79i2ViYlrl6+s7lQVkCgjY2tpCGGgkUMPiw4cPx7GwsJj8+fPnBlDzDKBmY6DmiyClcAPQ9CFzzwM1nwRqXgd0xVWggQ+AtCNQAdgAgl4Aatb7+/dvL1CTHB8fn4mDg8O3zZs3T2ZnZy9zd3f/imwTTjYwjA4BA9EJpuDq1atsW7duNYDxUWh8AYqiEMoZ+IREsQvA0Uiqv5HDAgCeaV8TkwuKRgAAAABJRU5ErkJggg==);\n  background-repeat: no-repeat;\n}\n\n.gc-ui-contextmenu-disable .gc-spread-tableInsertRowsBelow {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAINJREFUOBHNkt0JwCAMhG3pWs7grLqC+7iC5QR9OC9VKIUKgvlyOeOPcy/HwfUxxsrMikMIU72DAQ+Lwfi03Hf5pYQppQkrBpE08N5PBgxyzg19c4Tuzrv+OMY796naRE7xwUopFfNJaOXkM1picP6+zYBvnUVoVRWPI6wWVkeruq38DTljYf5lkhHeAAAAAElFTkSuQmCC);\n  background-repeat: no-repeat;\n}\n\n/*-----contextmenu end-----*/\n/*-----chart start-----*/\n.gcdv-control {\n  outline: none;\n  -moz-user-select: none;\n  -webkit-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n.gc-filter-dialog-color-title {\n  background-color: rgb(235, 235, 235);\n  color: rgb(106, 106, 106);\n}\n\n.gcdv-state-disabled {\n  opacity: 0.5;\n  cursor: default;\n  pointer-events: none;\n}\n\n.gcdv-tooltip {\n  position: absolute;\n  z-index: 1000;\n  top: 0;\n  left: 0;\n  pointer-events: none;\n  max-width: 400px;\n  padding: 6px;\n  background-color: #ffffe5;\n  border: 1px solid rgba(0, 0, 0, 0.1);\n  border-radius: 6px;\n  box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  box-sizing: border-box;\n}\n\n.gcdv-popup {\n  background-color: #fff;\n  box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  z-index: 1500;\n  margin: 2px 0;\n}\n\n.gcdv-popup-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  top: 0;\n  bottom: 0;\n  z-index: 1500;\n  background-color: rgba(0, 0, 0, 0.5);\n}\n\n/*-----custom chart start-----*/\n.gcdv-tooltip {\n  border-radius: 0;\n  box-shadow: 3px 3px 3px #8e8e8e;\n}\n\n/*-----custom chart end-----*/\n/*-----chart end-----*/\n/* status bar start */\n.gc-statusbar {\n  width: 100%;\n  height: 100%;\n  background: #217346;\n  font-size: 8pt;\n  color: #eef5f1;\n  font-family: \"Segoe UI\", Calibri, Thonburi, Arial, Verdana, sans-serif, \"Mongolian Baiti\", \"Microsoft Yi Baiti\", \"Javanese Text\";\n  position: relative;\n  user-select: none;\n  cursor: default;\n  overflow: hidden;\n}\n\n.gc-statusbar-menu-host {\n  position: relative;\n}\n\n.gc-statusbar-statusitem-container {\n  width: auto;\n  height: 100%;\n}\n\n.gc-statusbar-zoom-panel {\n  width: 30px;\n  height: 100%;\n  cursor: default;\n  font-size: 8pt;\n  color: #eef5f1;\n  display: inline-block;\n}\n\n.gc-statusbar-slider-btn-container {\n  display: inline-block;\n  vertical-align: middle;\n  margin-right: 3px;\n}\n\n.gc-statusbar-slider-btn-container:hover {\n  background-color: #1d5838;\n}\n\n.gc-statusbar-slider-btn-container:active {\n  background-color: #0f331f;\n}\n\n.gc-statusbar-slider-btn {\n  width: 16px;\n  height: 25px;\n  background-image: url(data:image/svg+xml;base64,PHN2ZyBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiPjxkZWZzPjxzdHlsZS8+PC9kZWZzPjxwYXRoIGQ9Ik04NjMuNzQ1IDU0NGgtNzAwLjMyYy0xNy42NjYgMC0zMi4wMDItMTQuMzM1LTMyLjAwMi0zMnMxNC4zMzYtMzIgMzIuMDAxLTMyaDcwMC4zMmMxNy42OTYgMCAzMiAxNC4zMzUgMzIgMzJzLTE0LjMwNCAzMi0zMiAzMnoiIGZpbGw9IiNlZWY1ZjEiLz48L3N2Zz4=);\n  background-size: 16px 16px;\n  background-repeat: no-repeat;\n  background-position: center;\n}\n\n.gc-statusbar-slider-add-btn-container {\n  display: inline-block;\n  vertical-align: top;\n}\n\n.gc-statusbar-slider-add-btn-container:hover {\n  background-color: #1d5838;\n}\n\n.gc-statusbar-slider-add-btn-container:active {\n  background-color: #0f331f;\n}\n\n.gc-statusbar-slider-add-btn {\n  width: 16px;\n  height: 25px;\n  background-image: url(data:image/svg+xml;base64,PHN2ZyBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiPjxkZWZzPjxzdHlsZS8+PC9kZWZzPjxwYXRoIGQ9Ik04NjMuMzI4IDQ4MS4zNGwtMzE3LjM0NC4xVjE2Mi44MThjMC0xNy42NjUtMTQuMzM2LTMyLjAwMS0zMi0zMi4wMDFzLTMyIDE0LjMzNi0zMiAzMnYzMTguNDAxbC0zMjIuMzY4LS4xNzdoLS4wOTdjLTE3LjYzMiAwLTMxLjkzNSAxNC4yNC0zMiAzMS45MDQtLjA5NyAxNy42NjUgMTQuMjA4IDMyLjAzMiAzMS44NzEgMzIuMDk2bDMyMi41OTMuMTc3djMxOS4xNjdjMCAxNy42OTYgMTQuMzM2IDMyLjAwMSAzMS45OTkgMzIuMDAxczMyLTE0LjMwMyAzMi0zMlY1NDUuNDRsMzE3LjA4OC0uMWguMTI4YzE3LjYzMiAwIDMxLjkzNS0xNC4yNCAzMi0zMS45MDVzLTE0LjIzOC0zMi4wMzEtMzEuODctMzIuMDk1eiIgZmlsbD0iI2VlZjVmMSIvPjwvc3ZnPg==);\n  background-size: 16px 16px;\n  background-repeat: no-repeat;\n  background-position: center;\n}\n\n.gc-statusbar-slider-back-progress {\n  width: 120px;\n  height: 1px;\n  background: #eef5f1;\n  display: inline-block;\n  vertical-align: top;\n}\n\n.gc-statusbar-slider-back {\n  display: inline-block;\n}\n\n.gc-statusbar-slider-middle-line {\n  width: 1px;\n  height: 8px;\n  background: #eef5f1;\n  display: inline-block;\n  position: relative;\n  vertical-align: top;\n  top: 9px;\n}\n\n.gc-statusbar-slider-drag-bar {\n  width: 4px;\n  height: 10px;\n  background: #eef5f1;\n  display: inline-block;\n  position: relative;\n  vertical-align: top;\n  top: 8px;\n}\n\n.gc-statusbar-progress-item-item-container {\n  height: 100%;\n  display: flex;\n  align-items: center;\n}\n\n.gc-statusbar-progress-item-wrapper {\n  height: 50%;\n  background-color: #217346;\n  border: 1px solid #eef5f1;\n  box-sizing: border-box;\n}\n\n.gc-statusbar-progress-item-bar {\n  width: 0;\n  height: 100%;\n  background-color: #eef5f1;\n}\n\n.gc-statusbar-progress-item-status {\n  margin-left: 4px;\n}\n\n.gc-statusbar-progress-item-sheet-name {\n  margin-left: 4px;\n  overflow: visible;\n  height: 100%;\n}\n\n.gc-statusbar-contextmenu-check {\n  width: 6px;\n  height: 10px;\n  margin: 0 0 0 5px;\n  border-style: solid;\n  border-color: #222222;\n  border-width: 0 2px 2px 0;\n  transform: rotateZ(45deg);\n  content: \"\";\n}\n\n.gc-statusbar-contextmenu-check-container {\n  width: 12px;\n  height: 12px;\n  display: inline-block;\n  padding-top: 1px;\n}\n\n.gc-statusbar-contextmenu-content {\n  display: inline-block;\n  color: #444444;\n  margin: 0 5px 0 15px;\n}\n\n.gc-statusbar-contextmenu-status {\n  float: right;\n  color: #444444;\n  vertical-align: middle;\n  margin-left: auto;\n}\n\ninput.gc-checkbox-cell-type-input[type=checkbox]:before {\n  position: static;\n  display: inline-block;\n  border: none;\n  content: \"\";\n  background: none;\n}\ninput.gc-checkbox-cell-type-input[type=checkbox]:after {\n  position: static;\n  display: inline-block;\n  border: none;\n  content: \"\";\n  background-image: none;\n  background-repeat: no-repeat;\n}\n\n.gc-chart-unsuppoprtedChart-fartherDiv {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  background-color: rgb(210, 210, 210);\n  height: 100%;\n  width: 100%;\n}\n\n.gc-chart-unsuppoprtedChart-childDiv {\n  text-align: center;\n}\n\n.gc-sjs-dialog-button {\n  padding: 5px 20px 5px 20px;\n  border: 1px solid #b4b4b4;\n  display: inline-block;\n  background-color: #fdfdfd;\n  font-size: 12px;\n  line-height: 14px;\n  min-width: 40px;\n  text-align: center;\n}\n\n.gc-sjs-dialog-button.disable {\n  color: #838383;\n  pointer-events: none;\n  touch-action: none;\n}\n\n.gc-sjs-dialog-button:hover:not(.disable) {\n  border: 1px solid #3296c8;\n  background-color: rgb(191, 216, 231);\n}\n\n.gc-sjs-paste-special-dialog-container {\n  background-color: #f0f0f0;\n  border: 1px solid #707070;\n  box-shadow: 2px 2px 10px #707070;\n  font-family: \"Segoe UI\", Helvetica, Verdana, sans-serif;\n  font-size: 12px;\n}\n.gc-sjs-paste-special-dialog-container label, .gc-sjs-paste-special-dialog-container span {\n  user-select: none;\n}\n.gc-sjs-paste-special-dialog-container label {\n  margin-left: 3px;\n  font-size: 12px;\n}\n.gc-sjs-paste-special-dialog-container .gc-sjs-horzation-container {\n  display: flex;\n  flex-direction: row;\n}\n.gc-sjs-paste-special-dialog-container .gc-sjs-column-container {\n  min-width: 150px;\n  margin: 5px 20px 5px 5px;\n}\n.gc-sjs-paste-special-dialog-container .gc-sjs-vertical-container {\n  display: flex;\n  flex-direction: column;\n}\n.gc-sjs-paste-special-dialog-container .gc-sjs-paste-special-dialog-title {\n  display: flex;\n  justify-content: space-between;\n  background-color: white;\n  align-items: center;\n  height: 30px;\n}\n.gc-sjs-paste-special-dialog-container .gc-sjs-paste-special-dialog-title-text {\n  font-size: 14px;\n  margin-left: 5px;\n}\n.gc-sjs-paste-special-dialog-container .gc-sjs-paste-special-dialog-content {\n  padding: 7px 7px 0 7px;\n}\n.gc-sjs-paste-special-dialog-container .gc-sjs-paste-special-dialog-content span {\n  display: inline-block;\n  font-size: 12px;\n}\n.gc-sjs-paste-special-dialog-container .gc-sjs-paste-special-dialog-content .gc-sjs-paste-special-dialog-transform-formula-label {\n  width: 60px;\n}\n.gc-sjs-paste-special-dialog-container .gc-sjs-paste-special-dialog-content .gc-sjs-paste-special-dialog-transform-formula-suffix {\n  width: 20px;\n}\n.gc-sjs-paste-special-dialog-container .gc-sjs-paste-special-dialog-content .gc-sjs-transform-formula-editor-input {\n  width: 180px;\n  font-size: 12px;\n  padding: 1px 4px;\n  border: 1px solid #000;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n.gc-sjs-paste-special-dialog-container .gc-sjs-paste-special-dialog-content .gc-sjs-transform-formula-editor-input:focus-visible {\n  border-width: 1px;\n  outline: none;\n}\n.gc-sjs-paste-special-dialog-container .gc-sjs-paste-special-dialog-content .gc-sjs-transform-scope-select {\n  font-size: 12px;\n}\n.gc-sjs-paste-special-dialog-container .gc-sjs-paste-special-dialog-content .gc-sjs-paste-special-dialog-transform-scope-label {\n  width: 60px;\n}\n.gc-sjs-paste-special-dialog-container .gc-sjs-paste-special-dialog-content .gc-sjs-transform-formula-editor-host {\n  display: inline-block;\n}\n.gc-sjs-paste-special-dialog-container .gc-sjs-paste-special-dialog-content #gc-sjs-transform-formula-container.disable,\n.gc-sjs-paste-special-dialog-container .gc-sjs-paste-special-dialog-content #gc-sjs-transform-scope-container.disable {\n  opacity: 0.3;\n  pointer-events: none;\n}\n.gc-sjs-paste-special-dialog-container .gc-sjs-paste-special-dialog-footer {\n  padding: 7px;\n  justify-content: space-between;\n}\n\n.gc-sjs-separator {\n  flex: 1;\n  height: 1px;\n  background-color: #dcdcdc;\n  align-self: center;\n  margin-left: 10px;\n}\n\n.gc-validation-select option:hover {\n  background-color: #1967d2;\n  color: #fff;\n}\n\n/* status bar end */\ndiv[gcUIElement=gcSpread] .gc-month-picker-container {\n  font-size: 12px;\n  display: block;\n  background-color: #fff;\n  border: solid 1px #a7abb0;\n  font-family: \"Segoe UI\", Calibri, Thonburi, Arial, Verdana, sans-serif, \"Mongolian Baiti\", \"Microsoft Yi Baiti\", \"Javanese Text\";\n  overflow-y: auto;\n  width: 320px;\n  outline: none;\n}\ndiv[gcUIElement=gcSpread] .gc-month-picker-container .gc-month-picker-year-container {\n  display: inline-block;\n  line-height: 126px;\n  vertical-align: bottom;\n}\ndiv[gcUIElement=gcSpread] .gc-month-picker-container .gc-month-picker-month-container {\n  display: inline-block;\n}\ndiv[gcUIElement=gcSpread] .gc-month-picker-container .gc-month-picker-separator {\n  height: 1px;\n  border-top: 1px solid lightgray;\n  pointer-events: none;\n  width: 100%;\n}\ndiv[gcUIElement=gcSpread] .gc-month-picker-container .gc-month-picker-year-item {\n  font-size: 18px;\n  color: #838383;\n  width: 60px;\n  text-align: center;\n}\ndiv[gcUIElement=gcSpread] .gc-month-picker-container .gc-month-picker-month-item,\ndiv[gcUIElement=gcSpread] .gc-month-picker-container .gc-month-picker-qtr-item {\n  height: 30px;\n  width: 60px;\n  display: inline-block;\n  text-align: center;\n  line-height: 30px;\n}\ndiv[gcUIElement=gcSpread] .gc-month-picker-container .gc-month-picker-month-item.selected, div[gcUIElement=gcSpread] .gc-month-picker-container .gc-month-picker-month-item.selected:hover,\ndiv[gcUIElement=gcSpread] .gc-month-picker-container .gc-month-picker-qtr-item.selected,\ndiv[gcUIElement=gcSpread] .gc-month-picker-container .gc-month-picker-qtr-item.selected:hover {\n  background: #3498db;\n  color: #fff;\n}\ndiv[gcUIElement=gcSpread] .gc-month-picker-container .gc-month-picker-month-item {\n  cursor: pointer;\n}\ndiv[gcUIElement=gcSpread] .gc-month-picker-container .gc-month-picker-month-item:hover {\n  background: #e2f2ff;\n}\ndiv[gcUIElement=gcSpread] .gc-month-picker-container .gc-month-picker-qtr-item {\n  color: #a3a3a3;\n}\n\ndiv[gcUIElement=gcSpread] .gc-calendar-container {\n  border: solid 1px #a7abb0;\n  background-color: #fff;\n  outline: none;\n  font-family: \"Segoe UI\", Calibri, Thonburi, Arial, Verdana, sans-serif, \"Mongolian Baiti\", \"Microsoft Yi Baiti\", \"Javanese Text\";\n  font-size: 12px;\n  line-height: 1;\n  color: #222;\n  -webkit-tap-highlight-color: transparent;\n  border-collapse: separate;\n  border-spacing: 2px;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container td {\n  padding: 0px;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container input,\ndiv[gcUIElement=gcSpread] .gc-calendar-container textarea {\n  outline: none;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-date-part-container {\n  position: static !important;\n  transform: none !important;\n  overflow: hidden;\n  max-width: 30rem;\n  height: auto;\n  outline: none;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-date-part-container .gc-header-container .gc-header-title {\n  width: 75px;\n  height: 22px;\n  display: inline-block;\n  line-height: 22px;\n  text-align: center;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-date-part-container .gc-year-page .gc-content-container,\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-date-part-container .gc-month-page .gc-content-container {\n  margin-top: 2px;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-date-part-container .gc-year-page .gc-content-container td,\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-date-part-container .gc-month-page .gc-content-container td {\n  padding: 19px 7px;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-date-part-container .gc-year-page .gc-content-container td .gc-cl-day,\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-date-part-container .gc-month-page .gc-content-container td .gc-cl-day {\n  width: 40px;\n  height: 40px;\n  line-height: 40px;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-date-part-container .gc-year-page .gc-content-container td .gc-japan-cl-day,\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-date-part-container .gc-month-page .gc-content-container td .gc-japan-cl-day {\n  width: 54px !important;\n  height: 54px !important;\n  padding-top: 14px !important;\n  line-height: 16px !important;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-date-part-container .gc-day-page .gc-header-container .gc-year-select-div {\n  display: inline-flex;\n  padding: 0px 5px;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-date-part-container .gc-day-page .gc-header-container .gc-year-select-div .gc-cl-select-container {\n  margin-left: 0px;\n  width: 68px;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-date-part-container .gc-day-page .gc-header-container .gc-year-select-div .gc-cl-select-container .gc-cl-select {\n  height: 22px;\n  min-width: 68px !important;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-date-part-container .gc-day-page .gc-today-container tr {\n  height: 20px;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-date-part-container .gc-day-page .gc-today-container i {\n  padding-bottom: 0;\n  color: #3498db;\n  text-decoration: none;\n  cursor: pointer;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-date-part-container .gc-cl-button {\n  cursor: pointer;\n  border: 0px;\n  outline: none;\n  box-shadow: none;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-date-part-container .gc-cl-button .gc-left-arrow {\n  position: absolute;\n  top: 5px;\n  left: 7px;\n  border-top: 5px solid transparent;\n  border-bottom: 5px solid transparent;\n  border-right: 8px solid #3498db;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-date-part-container .gc-cl-button .gc-right-arrow {\n  position: absolute;\n  top: 5px;\n  left: 7px;\n  border-top: 5px solid transparent;\n  border-bottom: 5px solid transparent;\n  border-left: 8px solid #3498db;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-date-part-container .gc-cl-disabled-text .gc-cl-day {\n  cursor: pointer;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-date-part-container .gc-is-focused {\n  background: #e2f2ff;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-date-time-vertical-partline {\n  width: 1px;\n  height: auto;\n  margin: -1px 3px -3px;\n  background: #d8dde6;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-time-part-container {\n  position: static !important;\n  transform: none !important;\n  overflow: hidden;\n  width: 75px;\n  max-height: 265px;\n  overflow-y: auto;\n  outline: none;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-time-part-container .gc-list-control {\n  border: none;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-time-part-container .gc-time-picker-li {\n  text-align: center !important;\n  cursor: pointer;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-date-time-horizontal-partline {\n  width: 100%;\n  height: 1px;\n  margin: 0 0px;\n  background: #d8dde6;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-ok-button-container {\n  position: static !important;\n  transform: none !important;\n  overflow: hidden;\n  padding: 1px;\n  border: none !important;\n  background: #fff;\n  text-align: center;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-ok-button-container button {\n  width: 115px;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-content-td-date {\n  display: inline-flex;\n  background: #fff;\n  padding: 1px 3px 3px 3px;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container * {\n  box-sizing: border-box;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container *:before {\n  box-sizing: border-box;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container *:after {\n  box-sizing: border-box;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container table {\n  width: 100%;\n  border-collapse: separate;\n  border-spacing: 2px;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container table td {\n  text-align: left;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container table th {\n  text-align: left;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-cl-datepicker {\n  padding: 0;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-cl-datepicker td {\n  padding: 0px;\n  text-align: center;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-cl-datepicker td:hover:not(.gc-cl-disabled-text) > .gc-cl-day {\n  background: #e2f2ff;\n  cursor: pointer;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-cl-datepicker td > .gc-cl-day {\n  width: 30px;\n  height: 28px;\n  display: block;\n  position: relative;\n  line-height: 28px;\n  margin: 0;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-cl-datepicker td.gc-cl-is-selected:not(.gc-cl-disabled-text) > .gc-cl-day {\n  background: #3498db;\n  color: #fff;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-cl-datepicker th {\n  text-align: center;\n  padding: 3px 0px;\n  font-weight: 400;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-cl-datepicker th > .gc-cl-week {\n  width: 30px;\n  height: 28px;\n  display: block;\n  position: relative;\n  line-height: 28px;\n  margin: 0;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-cl-dateRangepicker {\n  padding: 0;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-cl-dateRangepicker td {\n  padding: 0px;\n  text-align: center;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-cl-dateRangepicker td > .gc-cl-day {\n  width: 30px;\n  height: 28px;\n  display: block;\n  position: relative;\n  line-height: 28px;\n  margin: 0;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-cl-dateRangepicker td.gc-cl-is-selected:not(.gc-cl-disabled-text) > .gc-cl-day {\n  background: #3498db;\n  color: #fff;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-cl-dateRangepicker th {\n  text-align: center;\n  padding: 3px 0px;\n  font-weight: 400;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-cl-dateRangepicker th > .gc-cl-week {\n  width: 30px;\n  height: 28px;\n  display: block;\n  position: relative;\n  line-height: 28px;\n  margin: 0;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-cl-datepicker-filter {\n  padding: 0;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-cl-datepicker-filter-month {\n  padding: 0 0.25rem 0 0;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-cl-dropdown {\n  position: absolute;\n  z-index: 7000;\n  left: 50%;\n  float: left;\n  margin-top: 0.125rem;\n  background: #fff;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-cl-grid {\n  display: flex;\n  align-items: center;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-cl-grid-align-spread {\n  justify-content: space-between;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-cl-grow {\n  flex-grow: 1;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-cl-button {\n  position: relative;\n  display: inline-block;\n  padding: 0;\n  background: transparent;\n  border: 1px solid transparent;\n  line-height: 22px;\n  text-decoration: none;\n  color: #fff;\n  -webkit-appearance: none;\n  white-space: normal;\n  user-select: none;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-cl-button-brand {\n  text-align: center;\n  vertical-align: middle;\n  color: #fff;\n  background-color: #3498db;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-cl-button-icon-container {\n  line-height: 1;\n  vertical-align: middle;\n  width: 22px;\n  height: 22px;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-arrow-disable {\n  opacity: 0.5;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-cl-align-middle {\n  vertical-align: middle;\n  align-self: center;\n  cursor: pointer;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-cl-shrink-none {\n  flex-shrink: 0;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-cl-select {\n  background-color: #fff;\n  border: 1px solid #d8dde6;\n  border-radius: 0.25rem;\n  width: 100%;\n  transition: border 0.1s linear, background-color 0.1s linear;\n  height: 1.75rem;\n  cursor: pointer;\n  font-family: \"Segoe UI\", Calibri, Thonburi, Arial, Verdana, sans-serif, \"Mongolian Baiti\", \"Microsoft Yi Baiti\", \"Javanese Text\";\n  font-size: 12px;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-cl-select > option {\n  cursor: pointer;\n  font-family: \"Segoe UI\", Calibri, Thonburi, Arial, Verdana, sans-serif, \"Mongolian Baiti\", \"Microsoft Yi Baiti\", \"Javanese Text\";\n  font-size: 12px;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-cl-select-container {\n  position: relative;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-cl-select-container:after {\n  position: absolute;\n  content: \"\";\n  display: block;\n  right: 6px;\n  width: 0;\n  height: 0;\n  border-left: 3px solid transparent;\n  border-right: 3px solid transparent;\n  bottom: 10px;\n  border-left-width: 4px;\n  border-right-width: 4px;\n  pointer-events: none;\n  border-top: 5px solid #3498db;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-cl-select-container .gc-cl-select {\n  overflow: hidden;\n  -moz-appearance: none;\n  -webkit-appearance: none;\n  padding: 0 10%;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-cl-select-container .gc-cl-select::-ms-expand {\n  display: none;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-cl-disabled-text {\n  color: #d8dde6;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-cl-show-inline-block {\n  display: inline-block;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-cl-p-bottom-x-small {\n  padding-bottom: 0.5rem;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-date-container {\n  z-index: 9999;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-date-time-container {\n  z-index: 9999;\n}\ndiv[gcUIElement=gcSpread] .gc-calendar-container .gc-date-range-container {\n  border: none;\n}\ndiv[gcUIElement=gcSpread] .gc-builtIn-date-Range-child-div {\n  margin: 5px 2px;\n  height: 22px;\n  text-align: center;\n  line-height: 22px;\n}\ndiv[gcUIElement=gcSpread] .gc-builtIn-date-Range-child-div:not(.gc-builtIn-date-range-childDiv-select):hover {\n  background-color: #e2f2ff;\n}\ndiv[gcUIElement=gcSpread] .gc-builtIn-date-Range-child-div.gc-cl-disabled-text:hover {\n  background-color: #fff;\n}\ndiv[gcUIElement=gcSpread] .gc-builtIn-DateRangeChildDiv {\n  margin: 5px 2px;\n  height: 22px;\n  text-align: center;\n  line-height: 22px;\n}\ndiv[gcUIElement=gcSpread] .gc-builtIn-DateRangeChildDiv:hover {\n  background-color: #e2f2ff;\n  color: #222;\n}\ndiv[gcUIElement=gcSpread] .gc-builtIn-date-range-childDiv-select {\n  background-color: #3498db;\n  color: #fff;\n}\ndiv[gcUIElement=gcSpread] .gc-builtIn-date-ranges-div {\n  float: left;\n  height: 253px;\n  width: 80px;\n  text-align: center;\n  border-top: none;\n  border-bottom: none;\n  border-right: solid 1px #a7abb0;\n  border-left: none;\n}\ndiv[gcUIElement=gcSpread] .gc-builtIn-date-ranges-div:hover:not(.gc-cl-disabled-text) > .gc-cl-day {\n  background: #e2f2ff;\n  cursor: pointer;\n}\ndiv[gcUIElement=gcSpread] .gc-date-ranges-result-div {\n  height: 30px;\n  display: flex;\n  justify-content: flex-end;\n  align-items: center;\n  white-space: nowrap;\n  text-align: center;\n  border: solid 1px #a7abb0;\n  background-color: #fff;\n}\ndiv[gcUIElement=gcSpread] .gc-date-ranges-result-div > * {\n  display: inline-block;\n  vertical-align: middle;\n}\ndiv[gcUIElement=gcSpread] .gc-date-ranges-result-div .gc-arrow-disable {\n  opacity: 0.5;\n}\ndiv[gcUIElement=gcSpread] .gc-date-ranges-result-buttonDiv {\n  position: static !important;\n  transform: none !important;\n  overflow: hidden;\n  padding: 1px;\n  border: none !important;\n  background: #fff;\n  text-align: center;\n  margin: 0 8px;\n}\ndiv[gcUIElement=gcSpread] .gc-date-ranges-result-buttonDiv button {\n  width: 80px;\n}\ndiv[gcUIElement=gcSpread] .gc-date-ranges-result-button {\n  position: relative;\n  display: inline-block;\n  padding: 0;\n  background: transparent;\n  border: 1px solid transparent;\n  line-height: 22px;\n  text-decoration: none;\n  -webkit-appearance: none;\n  white-space: nowrap;\n  user-select: none;\n  text-align: center;\n  vertical-align: middle;\n  color: #fff;\n  background-color: #3498db;\n}\ndiv[gcUIElement=gcSpread] .gc-date-ranges-result-input {\n  margin-right: 10px;\n  display: inline-block;\n  width: 60%;\n  height: 22px;\n  font-size: 12px;\n  white-space: normal;\n  line-height: 20px;\n}\ndiv[gcUIElement=gcSpread] .gc-date-ranges-calendar {\n  display: inline-block;\n}\ndiv[gcUIElement=gcSpread] .gc-range-calendar-container {\n  display: flex;\n  border-bottom: none;\n}\n\ndiv[gcUIElement=gcSpread] .gc-calculator-container {\n  font-family: \"Segoe UI\", Calibri, Thonburi, Arial, Verdana, sans-serif, \"Mongolian Baiti\", \"Microsoft Yi Baiti\", \"Javanese Text\";\n  font-size: 15px;\n}\ndiv[gcUIElement=gcSpread] .gc-calculator-container sub,\ndiv[gcUIElement=gcSpread] .gc-calculator-container sup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\ndiv[gcUIElement=gcSpread] .gc-calculator-container sup {\n  top: -0.25em;\n}\ndiv[gcUIElement=gcSpread] .gc-calculator-container sub {\n  bottom: -0.25em;\n  font-size: 90%;\n}\ndiv[gcUIElement=gcSpread] .gc-calculator-container .gc-calculator {\n  width: 250px;\n  border: 1px solid gray;\n  box-shadow: 0 0 15px 2px rgba(255, 255, 255, 0.2);\n  background: #f2f2f2;\n}\ndiv[gcUIElement=gcSpread] .gc-calculator-container .gc-calculator .gc-screen {\n  height: 50px;\n}\ndiv[gcUIElement=gcSpread] .gc-calculator-container .gc-calculator .gc-screen input {\n  width: 100%;\n  height: 100%;\n  border: 0;\n  box-sizing: border-box;\n  background: transparent;\n  text-align: right;\n}\ndiv[gcUIElement=gcSpread] .gc-calculator-container .gc-calculator .gc-screen .gc-main-screen {\n  height: 100%;\n}\ndiv[gcUIElement=gcSpread] .gc-calculator-container .gc-calculator .gc-screen .gc-main-screen .gc-main {\n  font-size: 2rem;\n  color: #000;\n  font-weight: 600;\n  padding: 10px 18px 0 10px;\n}\ndiv[gcUIElement=gcSpread] .gc-calculator-container .gc-calculator .gc-sub-menu .gc-row,\ndiv[gcUIElement=gcSpread] .gc-calculator-container .gc-calculator .gc-main-menu .gc-row {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: center;\n}\ndiv[gcUIElement=gcSpread] .gc-calculator-container .gc-calculator .gc-sub-menu .gc-row .button,\ndiv[gcUIElement=gcSpread] .gc-calculator-container .gc-calculator .gc-main-menu .gc-row .button {\n  width: calc(25% - 2px);\n  line-height: 40px;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  box-sizing: border-box;\n  margin: 1px;\n}\ndiv[gcUIElement=gcSpread] .gc-calculator-container .gc-calculator .gc-sub-menu .gc-row .button:hover,\ndiv[gcUIElement=gcSpread] .gc-calculator-container .gc-calculator .gc-main-menu .gc-row .button:hover {\n  background: #cfcfcf;\n  cursor: pointer;\n}\ndiv[gcUIElement=gcSpread] .gc-calculator-container .gc-calculator .gc-sub-menu .gc-row .button:active,\ndiv[gcUIElement=gcSpread] .gc-calculator-container .gc-calculator .gc-main-menu .gc-row .button:active {\n  background: #b8b8b8;\n}\ndiv[gcUIElement=gcSpread] .gc-calculator-container .gc-calculator .gc-sub-menu .gc-row .button.disabled,\ndiv[gcUIElement=gcSpread] .gc-calculator-container .gc-calculator .gc-main-menu .gc-row .button.disabled {\n  pointer-events: none;\n  opacity: 0.3;\n}\ndiv[gcUIElement=gcSpread] .gc-calculator-container .gc-calculator .gc-sub-menu .gc-row .number,\ndiv[gcUIElement=gcSpread] .gc-calculator-container .gc-calculator .gc-main-menu .gc-row .number {\n  font-size: 18px;\n  font-weight: 600;\n}\ndiv[gcUIElement=gcSpread] .gc-calculator-container .gc-calculator .gc-sub-menu .gc-row .gc-operation:hover,\ndiv[gcUIElement=gcSpread] .gc-calculator-container .gc-calculator .gc-main-menu .gc-row .gc-operation:hover {\n  background: #3498db;\n}\ndiv[gcUIElement=gcSpread] .gc-calculator-container .gc-calculator .gc-sub-menu .gc-row .gc-operation:active,\ndiv[gcUIElement=gcSpread] .gc-calculator-container .gc-calculator .gc-main-menu .gc-row .gc-operation:active {\n  background: rgba(52, 152, 219, 0.79);\n}\ndiv[gcUIElement=gcSpread] .gc-calculator-container .gc-calculator .gc-sub-menu .gc-row .gc-number,\ndiv[gcUIElement=gcSpread] .gc-calculator-container .gc-calculator .gc-main-menu .gc-row .gc-number {\n  font-size: 1.2rem;\n}\ndiv[gcUIElement=gcSpread] .gc-calculator-container .gc-calculator .gc-sub-menu .gc-row .icon,\ndiv[gcUIElement=gcSpread] .gc-calculator-container .gc-calculator .gc-main-menu .gc-row .icon {\n  width: 16px;\n  height: 16px;\n}\ndiv[gcUIElement=gcSpread] .gc-calculator-container .gc-calculator .gc-sub-menu .gc-row .image:active img,\ndiv[gcUIElement=gcSpread] .gc-calculator-container .gc-calculator .gc-main-menu .gc-row .image:active img {\n  width: 24px;\n  height: 24px;\n}\ndiv[gcUIElement=gcSpread] .gc-calculator-container .gc-calculator .gc-sub-menu .gc-row .dot,\ndiv[gcUIElement=gcSpread] .gc-calculator-container .gc-calculator .gc-main-menu .gc-row .dot {\n  font-size: 1.5rem;\n}\ndiv[gcUIElement=gcSpread] .gc-calculator-container .gc-calculator .gc-sub-menu .gc-row .icon-group1,\ndiv[gcUIElement=gcSpread] .gc-calculator-container .gc-calculator .gc-main-menu .gc-row .icon-group1 {\n  background: #e6e6e6;\n}\ndiv[gcUIElement=gcSpread] .gc-calculator-container .gc-calculator .gc-sub-menu .gc-row .icon-group2,\ndiv[gcUIElement=gcSpread] .gc-calculator-container .gc-calculator .gc-main-menu .gc-row .icon-group2 {\n  background: #fdfdfd;\n}\ndiv[gcUIElement=gcSpread] .gc-calculator-container .gc-calculator .gc-sub-menu .button {\n  line-height: 3rem;\n}\n\ndiv[gcUIElement=gcSpread] .gc-list-control {\n  user-select: none;\n  border: 1px solid #a7abb0;\n  background-color: #fff;\n  font-family: \"Segoe UI\", Calibri, Thonburi, Arial, Verdana, sans-serif, \"Mongolian Baiti\", \"Microsoft Yi Baiti\", \"Javanese Text\";\n  font-size: 12px;\n}\ndiv[gcUIElement=gcSpread] .gc-list-control .gc-list-alignment-vertical {\n  display: flex;\n  flex-direction: column;\n}\ndiv[gcUIElement=gcSpread] .gc-list-control .gc-list-alignment-horizontal {\n  display: flex;\n  flex-direction: row;\n}\ndiv[gcUIElement=gcSpread] .gc-list-control .gc-list-control-item-wrap {\n  flex-wrap: wrap;\n}\ndiv[gcUIElement=gcSpread] .gc-list-control .gc-list-control-container {\n  margin: 0;\n  padding: 0;\n  border: 0;\n  line-height: 1.3;\n  text-decoration: none;\n}\ndiv[gcUIElement=gcSpread] .gc-list-control .gc-list-control-container .gc-list-control-group .gc-list-control-group-text {\n  display: block;\n  background: #f0f2f5;\n  font-weight: bold;\n  color: #444;\n  padding: 3px 4px;\n  cursor: default;\n}\ndiv[gcUIElement=gcSpread] .gc-list-control .gc-list-control-container .gc-list-control-group .gc-list-control-group-text.hide-children {\n  display: none;\n}\ndiv[gcUIElement=gcSpread] .gc-list-control .gc-list-control-container .gc-list-control-item {\n  position: relative;\n  cursor: pointer;\n}\ndiv[gcUIElement=gcSpread] .gc-list-control .gc-list-control-container .gc-list-control-item.gc-list-control-hassubitem {\n  display: flex;\n  align-items: center;\n}\ndiv[gcUIElement=gcSpread] .gc-list-control .gc-list-control-container .gc-list-control-item.gc-list-control-selected-item {\n  background: #3498db;\n  color: #fff;\n}\ndiv[gcUIElement=gcSpread] .gc-list-control .gc-list-control-container .gc-list-control-item.gc-list-control-selected-item:hover {\n  background: #3498db;\n  color: #fff;\n}\ndiv[gcUIElement=gcSpread] .gc-list-control .gc-list-control-container .gc-list-control-item.gc-list-control-noitem {\n  pointer-events: none;\n}\ndiv[gcUIElement=gcSpread] .gc-list-control .gc-list-control-container .gc-list-control-item .gc-list-control-listseparator {\n  height: 1px;\n  border-top: 1px solid lightgray;\n  margin: 0 0 0 12px;\n  pointer-events: none;\n}\ndiv[gcUIElement=gcSpread] .gc-list-control .gc-list-control-container .gc-list-control-item .gc-list-control-subitem {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQyIDc5LjE2MDkyNCwgMjAxNy8wNy8xMy0wMTowNjozOSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjRFNUM4M0M4NjcyMzExRTlCM0Y0Q0IyQjZEQTUwQzlCIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjRFNUM4M0M5NjcyMzExRTlCM0Y0Q0IyQjZEQTUwQzlCIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NEU1QzgzQzY2NzIzMTFFOUIzRjRDQjJCNkRBNTBDOUIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NEU1QzgzQzc2NzIzMTFFOUIzRjRDQjJCNkRBNTBDOUIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7Sk1otAAAAM0lEQVR42mJgGAU4QXl5+X9i1DFRaggTpS5hotQ7RBnQ2dnJSLYB+DRTJRZGARUAQIABAHK7DzeBU6NxAAAAAElFTkSuQmCC);\n  width: 16px;\n  height: 16px;\n  display: block;\n  justify-self: flex-end;\n  margin-left: auto;\n}\ndiv[gcUIElement=gcSpread] .gc-list-control .gc-list-control-container .gc-list-control-item .gc-list-control-item-text {\n  letter-spacing: 0;\n  text-align: left;\n  padding: 0.4em 1em;\n  display: block;\n  line-height: normal;\n  white-space: pre;\n}\ndiv[gcUIElement=gcSpread] .gc-list-control .gc-list-control-container .gc-list-control-item .gc-list-control-item-text.gc-list-control-item-bigtext {\n  line-height: 32px;\n  white-space: nowrap;\n}\ndiv[gcUIElement=gcSpread] .gc-list-control .gc-list-control-container .gc-list-control-item .gc-list-control-item-text-ellipsis {\n  overflow-x: hidden;\n  text-overflow: ellipsis;\n}\ndiv[gcUIElement=gcSpread] .gc-list-control .gc-list-control-container .gc-list-control-item:hover {\n  background: #e2f2ff;\n}\ndiv[gcUIElement=gcSpread] .gc-list-control .gc-list-control-container .gc-list-control-item .gc-list-control-item-icon {\n  left: 0.5em;\n  position: absolute;\n  top: 50%;\n  margin-top: -8px;\n  width: 16px;\n  height: 16px;\n  overflow: hidden;\n  background-repeat: no-repeat;\n  background-size: contain;\n}\ndiv[gcUIElement=gcSpread] .gc-list-control .gc-list-control-container .gc-list-control-item .gc-list-control-item-icon.gc-list-control-emptyicon {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQyIDc5LjE2MDkyNCwgMjAxNy8wNy8xMy0wMTowNjozOSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkFFNTRFMjUxNjcyMzExRTlBOUQxRTQ3MjgyQjgwNkZGIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkFFNTRFMjUyNjcyMzExRTlBOUQxRTQ3MjgyQjgwNkZGIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QUU1NEUyNEY2NzIzMTFFOUE5RDFFNDcyODJCODA2RkYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QUU1NEUyNTA2NzIzMTFFOUE5RDFFNDcyODJCODA2RkYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7Dh39gAAAAH0lEQVR42mL8//8/AyWAiYFCMGrAqAGjBgwWAwACDABjmgMdW2LjxgAAAABJRU5ErkJggg==);\n}\ndiv[gcUIElement=gcSpread] .gc-list-control .gc-list-control-container .gc-list-control-item .gc-list-control-item-icon + .gc-list-control-item-text {\n  padding-left: 25px;\n}\ndiv[gcUIElement=gcSpread] .gc-list-control .gc-list-control-container .gc-list-control-item .gc-list-control-item-icon.gc-list-control-item-bigicon {\n  top: 0.5em;\n  margin-top: 0;\n  width: 32px;\n  height: 32px;\n}\ndiv[gcUIElement=gcSpread] .gc-list-control .gc-list-control-container .gc-list-control-item .gc-list-control-item-icon.gc-list-control-item-bigicon + .gc-list-control-item-bigtext {\n  padding-left: 42px;\n}\ndiv[gcUIElement=gcSpread] .gc-list-control .gc-list-control-container .gc-list-control-tree .gc-list-control-tree-text {\n  display: block;\n  font-weight: bold;\n  color: #444;\n  padding: 3px 4px;\n  cursor: pointer;\n}\ndiv[gcUIElement=gcSpread] .gc-list-control .gc-list-control-container .gc-list-control-tree .gc-list-control-tree-content {\n  margin-left: 0.4em;\n}\ndiv[gcUIElement=gcSpread] .gc-list-control .gc-list-control-container .gc-list-control-tree .gc-list-control-tree-content .gc-list-control-item .gc-list-control-item-text {\n  padding: 3px 4px;\n}\ndiv[gcUIElement=gcSpread] .gc-list-control .gc-list-control-container .gc-list-control-tree .gc-list-control-tree-content .gc-list-control-item .gc-list-control-item-icon + .gc-list-control-item-text {\n  padding-left: 25px;\n}\ndiv[gcUIElement=gcSpread] .gc-list-control .gc-list-control-container .gc-list-control-tree .gc-list-control-subitem {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQyIDc5LjE2MDkyNCwgMjAxNy8wNy8xMy0wMTowNjozOSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjRFNUM4M0M4NjcyMzExRTlCM0Y0Q0IyQjZEQTUwQzlCIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjRFNUM4M0M5NjcyMzExRTlCM0Y0Q0IyQjZEQTUwQzlCIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NEU1QzgzQzY2NzIzMTFFOUIzRjRDQjJCNkRBNTBDOUIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NEU1QzgzQzc2NzIzMTFFOUIzRjRDQjJCNkRBNTBDOUIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7Sk1otAAAAM0lEQVR42mJgGAU4QXl5+X9i1DFRaggTpS5hotQ7RBnQ2dnJSLYB+DRTJRZGARUAQIABAHK7DzeBU6NxAAAAAElFTkSuQmCC);\n  transform: rotate(90deg);\n  width: 16px;\n  height: 16px;\n  display: block;\n  justify-self: flex-end;\n  margin-left: auto;\n}\ndiv[gcUIElement=gcSpread] .gc-list-control .gc-list-control-container .gc-list-control-tree.hide-children .gc-list-control-tree-content {\n  display: none;\n}\ndiv[gcUIElement=gcSpread] .gc-list-control .gc-list-control-container .gc-list-control-tree.hide-children .gc-list-control-subitem {\n  transform: rotate(0deg);\n}\ndiv[gcUIElement=gcSpread] .gc-list-control .gc-list-control-container .gc-list-control-item-ellipsis {\n  width: 100%;\n  white-space: nowrap;\n  overflow-x: hidden;\n  text-overflow: ellipsis;\n}\n\n.gc-slider {\n  font-family: \"Segoe UI\", Calibri, Thonburi, Arial, Verdana, sans-serif, \"Mongolian Baiti\", \"Microsoft Yi Baiti\", \"Javanese Text\";\n  -webkit-box-sizing: border-box;\n  box-sizing: border-box;\n  color: rgba(0, 0, 0, 0.65);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5;\n  list-style: none;\n  -webkit-font-feature-settings: \"tnum\";\n  font-feature-settings: \"tnum\";\n  position: relative;\n  height: 12px;\n  margin: 0 20px;\n  padding: 20px 0;\n  cursor: pointer;\n  -ms-touch-action: none;\n  touch-action: none;\n}\n.gc-slider.gc-slider-vertical {\n  width: 12px;\n  height: 100%;\n  padding: 0 4px;\n}\n.gc-slider.gc-slider-vertical .gc-slider-rail {\n  width: 4px;\n  height: 100%;\n}\n.gc-slider.gc-slider-vertical .gc-slider-track {\n  width: 4px;\n}\n.gc-slider.gc-slider-vertical .gc-slider-step {\n  width: 4px;\n  height: 100%;\n}\n.gc-slider.gc-slider-vertical .gc-slider-step .gc-slider-dot {\n  top: auto;\n  left: 0px;\n  margin-bottom: -4px;\n  box-sizing: content-box;\n}\n.gc-slider.gc-slider-vertical .gc-slider-handle {\n  margin-bottom: -7px;\n  margin-left: -7px;\n}\n.gc-slider.gc-slider-vertical .gc-slider-mark {\n  top: 0;\n  left: 12px;\n  width: 18px;\n  height: 100%;\n}\n.gc-slider.gc-slider-vertical .gc-slider-mark .gc-slider-mark-text {\n  left: 4px;\n  white-space: nowrap;\n}\n.gc-slider.gc-slider-with-marks {\n  padding-bottom: 32px;\n}\n.gc-slider.gc-slider-disabled {\n  cursor: not-allowed;\n}\n.gc-slider.gc-slider-disabled .gc-slider-track {\n  background-color: rgba(0, 0, 0, 0.25);\n}\n.gc-slider.gc-slider-disabled .gc-slider-handle {\n  background-color: #fff;\n  border-color: rgba(0, 0, 0, 0.25);\n  -webkit-box-shadow: none;\n  box-shadow: none;\n  cursor: not-allowed;\n}\n.gc-slider.gc-slider-disabled .gc-slider-step .gc-slider-dot {\n  background-color: #fff;\n  border-color: rgba(0, 0, 0, 0.25);\n  -webkit-box-shadow: none;\n  box-shadow: none;\n  cursor: not-allowed;\n  cursor: not-allowed;\n}\n.gc-slider.gc-slider-disabled .gc-slider-mark .gc-slider-mark-text {\n  cursor: not-allowed;\n}\n.gc-slider .gc-slider-rail {\n  position: absolute;\n  width: 100%;\n  height: 4px;\n  background-color: #e8e8e8;\n  border-radius: 2px;\n  -webkit-transition: background-color 0.3s;\n  transition: background-color 0.3s;\n}\n.gc-slider .gc-slider-track {\n  position: absolute;\n  height: 4px;\n  background-color: #91d5ff;\n  border-radius: 4px;\n  -webkit-transition: background-color 0.3s ease;\n  transition: background-color 0.3s ease;\n}\n.gc-slider .gc-slider-step {\n  position: absolute;\n  width: 100%;\n  height: 4px;\n  background: transparent;\n}\n.gc-slider .gc-slider-step .gc-slider-dot {\n  position: absolute;\n  top: -4px;\n  width: 8px;\n  height: 8px;\n  margin-left: -4px;\n  background-color: #fff;\n  border: 2px solid #e8e8e8;\n  border-radius: 50%;\n  cursor: pointer;\n}\n.gc-slider .gc-slider-step .gc-slider-dot:first-child {\n  margin-left: -4px;\n}\n.gc-slider .gc-slider-step .gc-slider-dot-active {\n  border-color: #91d5ff;\n}\n.gc-slider .gc-slider-handle {\n  position: absolute;\n  width: 14px;\n  height: 14px;\n  margin-top: -7px;\n  margin-left: -7px;\n  background-color: #fff;\n  border: solid 2px #91d5ff;\n  border-radius: 50%;\n  -webkit-box-shadow: 0;\n  box-shadow: 0;\n  box-sizing: content-box;\n  cursor: pointer;\n  z-index: 2;\n  -webkit-transition: border-color 0.3s, -webkit-box-shadow 0.6s, -webkit-transform 0.3s cubic-bezier(0.18, 0.89, 0.32, 1.28);\n  transition: border-color 0.3s, -webkit-box-shadow 0.6s, -webkit-transform 0.3s cubic-bezier(0.18, 0.89, 0.32, 1.28);\n  transition: border-color 0.3s, box-shadow 0.6s, transform 0.3s cubic-bezier(0.18, 0.89, 0.32, 1.28);\n  transition: border-color 0.3s, box-shadow 0.6s, transform 0.3s cubic-bezier(0.18, 0.89, 0.32, 1.28), -webkit-box-shadow 0.6s, -webkit-transform 0.3s cubic-bezier(0.18, 0.89, 0.32, 1.28);\n}\n.gc-slider .gc-slider-handle:focus {\n  border-color: #3498db;\n  outline: none;\n  -webkit-box-shadow: 0 0 0 5px rgba(24, 144, 255, 0.2);\n  box-shadow: 0 0 0 5px rgba(24, 144, 255, 0.2);\n}\n.gc-slider .gc-slider-mark {\n  position: absolute;\n  top: 30px;\n  left: 0;\n  width: 100%;\n  font-size: 14px;\n}\n.gc-slider .gc-slider-mark .gc-slider-mark-text {\n  position: absolute;\n  display: inline-block;\n  color: rgba(0, 0, 0, 0.45);\n  text-align: center;\n  cursor: pointer;\n}\n.gc-slider .gc-slider-mark .gc-slider-mark-text-active {\n  color: rgba(0, 0, 0, 0.65);\n}\n.gc-slider .gc-slider-tooltip {\n  -webkit-box-sizing: border-box;\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(0, 0, 0, 0.65);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5;\n  list-style: none;\n  -webkit-font-feature-settings: \"tnum\";\n  font-feature-settings: \"tnum\";\n  position: absolute;\n  z-index: 1060;\n  display: block;\n  max-width: 250px;\n  visibility: visible;\n}\n.gc-slider .gc-slider-tooltip.gc-slider-tooltip-placement-top {\n  padding-bottom: 8px;\n}\n.gc-slider .gc-slider-tooltip .gc-slider-tooltip-arrow {\n  left: 50%;\n  margin-left: -5px;\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n  bottom: 3px;\n  border-width: 5px 5px 0;\n  border-top-color: rgba(0, 0, 0, 0.75);\n}\n.gc-slider .gc-slider-tooltip .gc-slider-tooltip-inner {\n  min-width: 10px;\n  min-height: 12px;\n  padding: 6px 8px;\n  color: #fff;\n  text-align: left;\n  text-decoration: none;\n  word-wrap: break-word;\n  background-color: rgba(0, 0, 0, 0.75);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n}\n\n.gc-slider-container {\n  background-color: white;\n  box-sizing: content-box;\n}\n.gc-slider-container.gc-slider-vertical {\n  padding: 20px 0;\n  padding-right: 10px;\n}\n\ndiv[gcUIElement=gcSpread] .gc-color-picker-outer-div {\n  width: 100%;\n  height: auto;\n  overflow: hidden;\n  background-color: white;\n  font-family: \"Segoe UI\", Calibri, Thonburi, Arial, Verdana, sans-serif, \"Mongolian Baiti\", \"Microsoft Yi Baiti\", \"Javanese Text\";\n  font-size: 12px;\n  box-sizing: border-box;\n}\ndiv[gcUIElement=gcSpread] .gc-color-picker-outer-div .gc-list-control-item {\n  line-height: 0.5;\n}\ndiv[gcUIElement=gcSpread] .gc-color-picker-outer-div .gc-list-control-item:hover {\n  background-color: transparent !important;\n}\ndiv[gcUIElement=gcSpread] .gc-color-picker-outer-div .gc-color-picker-group-row {\n  display: inline-block;\n  margin: 3px 0;\n}\ndiv[gcUIElement=gcSpread] .gc-color-picker-outer-div .gc-color-picker-group-row .gc-color-picker-color-cell {\n  width: 12px;\n  height: 12px;\n  border: 1.5px solid transparent;\n  display: inline-block;\n  margin: 0 2px;\n  box-sizing: content-box;\n}\ndiv[gcUIElement=gcSpread] .gc-color-picker-outer-div .gc-color-picker-group-row .gc-color-picker-color-cell:hover {\n  border: 1.5px solid #f5ab5d;\n}\ndiv[gcUIElement=gcSpread] .gc-color-picker-outer-div .gc-color-picker-group-row .gc-color-picker-color-cell.selected {\n  border: 1.5px solid #f58447;\n}\n\ndiv[gcUIElement=gcSpread] .gc-time-picker-outer-div {\n  width: 100%;\n  height: 100%;\n  overflow: hidden;\n  background-color: white;\n  font-size: 12px;\n  font-family: \"Segoe UI\", Calibri, Thonburi, Arial, Verdana, sans-serif, \"Mongolian Baiti\", \"Microsoft Yi Baiti\", \"Javanese Text\";\n}\ndiv[gcUIElement=gcSpread] .gc-time-picker-outer-div .gc-list-control-item {\n  line-height: 0.5;\n}\ndiv[gcUIElement=gcSpread] .gc-time-picker-outer-div .gc-list-control-item:hover {\n  background-color: transparent !important;\n}\ndiv[gcUIElement=gcSpread] .gc-time-picker-outer-div .gc-list-control {\n  height: 100%;\n}\ndiv[gcUIElement=gcSpread] .gc-time-picker-outer-div .gc-list-control .gc-list-control-container {\n  height: 100%;\n}\ndiv[gcUIElement=gcSpread] .gc-time-picker-outer-div .gc-list-control .gc-list-control-container .gc-list-control-item {\n  height: 100%;\n}\ndiv[gcUIElement=gcSpread] .gc-time-picker-outer-div .gc-time-picker-container {\n  width: 100%;\n  height: 100%;\n  overflow-y: auto;\n  overflow-x: hidden;\n}\ndiv[gcUIElement=gcSpread] .gc-time-picker-outer-div .gc-time-picker-container .gc-time-picker-ul {\n  margin: 0;\n  padding: 0;\n  width: 100%;\n  list-style: none;\n}\ndiv[gcUIElement=gcSpread] .gc-time-picker-outer-div .gc-time-picker-container .gc-time-picker-ul .gc-time-picker-li {\n  width: 100%;\n  height: 24px;\n  line-height: 24px;\n  padding: 0 12px;\n  text-overflow: ellipsis;\n  overflow: hidden;\n  white-space: nowrap;\n  cursor: pointer;\n}\ndiv[gcUIElement=gcSpread] .gc-time-picker-outer-div .gc-time-picker-container .gc-time-picker-ul .gc-time-picker-li:hover {\n  background-color: #e2f2ff !important;\n}\ndiv[gcUIElement=gcSpread] .gc-time-picker-outer-div .gc-time-picker-container .gc-time-picker-ul .gc-time-picker-li.selected {\n  color: #fff;\n  background-color: #3498db !important;\n}\n\ndiv[gcUIElement=gcSpread] .gc-base-spread-div {\n  width: 100%;\n  height: 100%;\n  border: solid;\n}\n\n.gc-sjs-file-preview-dialog-container {\n  background-color: #f0f0f0;\n  border: 1px solid #707070;\n  box-shadow: 2px 2px 10px #707070;\n  font-family: \"Segoe UI\", Helvetica, Verdana, sans-serif;\n  font-size: 12px;\n  width: 600px;\n  display: flex;\n  flex-direction: column;\n  user-select: none;\n}\n.gc-sjs-file-preview-dialog-container .gc-sjs-file-preview-dialog-title {\n  display: flex;\n  justify-content: space-between;\n  background-color: white;\n  align-items: center;\n  flex: 0 0 30px;\n}\n.gc-sjs-file-preview-dialog-container .gc-sjs-file-preview-dialog-title .gc-sjs-file-preview-dialog-title-text {\n  font-size: 14px;\n  margin-left: 5px;\n  overflow: hidden;\n  text-wrap: nowrap;\n  flex: 1;\n}\n.gc-sjs-file-preview-dialog-container .gc-sjs-file-preview-dialog-title .sjs-cancel-icon {\n  flex: 0 0 50px;\n}\n.gc-sjs-file-preview-dialog-container .gc-sjs-file-preview-dialog-content {\n  padding: 7px;\n  flex: 1;\n  overflow: auto;\n}\n\n.gc-panel-all {\n  width: 100%;\n  height: 100%;\n  min-width: 300px;\n  font-size: 12px;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  position: relative;\n  overflow: hidden;\n  background-color: white;\n  box-sizing: border-box;\n}\n.gc-panel-all.gc-panel-show-right .gc-panel-left {\n  transform: translateX(-100%);\n  transition: transform 0.5s ease;\n}\n.gc-panel-all.gc-panel-show-right .gc-panel-right {\n  transform: translateX(0);\n  transition: transform 0.5s ease;\n}\n\n.gc-panel-left {\n  width: 100%;\n  height: 100%;\n  display: flex;\n  flex-direction: column;\n  transition: transform 0.5s ease;\n  overflow: hidden;\n}\n\n.gc-panel-right {\n  position: absolute;\n  top: 0;\n  right: 0;\n  width: 100%;\n  height: 100%;\n  display: flex;\n  overflow: hidden;\n  /* 初始状态下将右侧面板平移出视口 */\n  transform: translateX(100%);\n  transition: transform 0.5s ease;\n}\n\n.gc-panel-base {\n  flex: 1 1 0;\n  display: flex;\n  min-height: 0;\n  transition: height 0.5s ease;\n}\n\n.gc-panel-addon {\n  height: 0;\n  overflow: hidden;\n  transition: height 0.5s ease;\n}\n\n.gc-panel {\n  position: relative;\n  padding: 15px 5px 5px 15px;\n  background-color: white;\n  box-sizing: border-box;\n  width: 100%;\n  min-width: 300px;\n  height: 100%;\n  overflow-x: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n.gc-panel .gc-panel-all-field-item,\n.gc-panel .gc-panel-area-item {\n  list-style-type: none;\n  cursor: move;\n}\n.gc-panel .gc-panel-header {\n  height: 27px;\n}\n.gc-panel .gc-panel-header h2 {\n  margin: 0;\n  color: #2c7a50;\n  font-weight: 600;\n  font-size: 20px;\n}\n.gc-panel .gc-panel-header p {\n  margin: 0;\n  color: black;\n  font-size: 14px;\n}\n\n.gc-panel-checkbox {\n  appearance: none;\n  outline: none;\n  display: inline-block;\n  line-height: 22px;\n  width: 14px;\n  height: 14px;\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTRweCIgaGVpZ2h0PSIxNHB4IiB2aWV3Qm94PSIwIDAgMTQgMTQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+Y2hlY2tfZGFyazwvdGl0bGU+CiAgICA8ZyBpZD0iY2hlY2tfZGFyayIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPHBhdGggZD0iTTEzLDEgTDEzLDEzIEwxLDEzIEwxLDEgTDEzLDEgWiBNMTIsMiBMMiwyIEwyLDEyIEwxMiwxMiBMMTIsMiBaIiBpZD0i5b2i54q257uT5ZCIIiBmaWxsPSIjNjk2OTY5Ij48L3BhdGg+CiAgICA8L2c+Cjwvc3ZnPg==);\n  cursor: default;\n}\n.gc-panel-checkbox:checked {\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTRweCIgaGVpZ2h0PSIxNHB4IiB2aWV3Qm94PSIwIDAgMTQgMTQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+Y2hlY2tfZGFyazwvdGl0bGU+CiAgICA8ZyBpZD0iY2hlY2tfZGFyayIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPHBvbHlnb24gaWQ9IlBhdGgtNCIgZmlsbD0iIzY5Njk2OSIgZmlsbC1ydWxlPSJub256ZXJvIiBwb2ludHM9IjExLjA2MDIyNjkgMyAxMiAzLjc1MDMxMDI5IDUuODIxNDMxODEgMTEgMiA3LjE0MDcwNzQzIDIuOTM5NzczMTQgNi4zOTAzOTcxMyA1LjgyMTQzMTgxIDkuMzAwNjA1OCI+PC9wb2x5Z29uPgogICAgICAgIDxwYXRoIGQ9Ik0xMywxIEwxMywxMyBMMSwxMyBMMSwxIEwxMywxIFogTTEyLDIgTDIsMiBMMiwxMiBMMTIsMTIgTDEyLDIgWiIgaWQ9IuW9oueKtue7k+WQiCIgZmlsbD0iIzY5Njk2OSI+PC9wYXRoPgogICAgPC9nPgo8L3N2Zz4=);\n}\n\n.gc-panel-collapse {\n  appearance: none;\n  outline: none;\n  margin: 2px 3px 0px 4px;\n  display: inline-block;\n  line-height: 22px;\n  width: 14px;\n  height: 14px;\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+dHJpYW5nbGVfbGlnaHQ8L3RpdGxlPgogICAgPGcgaWQ9InRyaWFuZ2xlX2xpZ2h0IiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8cG9seWdvbiBpZD0i6Lev5b6ELTQiIGZpbGw9IiM2OTY5NjkiIHBvaW50cz0iNCA2IDEyIDYgOCAxMCI+PC9wb2x5Z29uPgogICAgPC9nPgo8L3N2Zz4=);\n}\n\n.gc-panel-button {\n  border: none;\n  background-color: transparent;\n  cursor: pointer;\n  float: right;\n  margin-right: 2px;\n  outline: none;\n  font-size: 14px;\n}\n\n.gc-panel-button:focus {\n  outline: none;\n}\n\n/*for IE*/\n.gc-panel-button::-moz-focus-inner {\n  border-color: transparent;\n}\n\n/*for mozilla*/\n.gc-panel-views {\n  width: 100%;\n  color: black;\n}\n.gc-panel-views > div > input {\n  color: black;\n}\n.gc-panel-views .gc-panel-views-content {\n  width: calc(100% - 50px);\n  display: inline-block;\n  border: 1px solid #CBCBCB;\n  white-space: nowrap;\n}\n\n.gc-panel-viewList {\n  position: absolute;\n  bottom: 10px;\n  background-color: #FDFDFD;\n  color: black;\n  border: 1px solid #CBCBCB;\n  border-radius: 5px;\n  font-size: 14px;\n  min-height: 21px;\n  max-height: 210px;\n  overflow-y: scroll;\n}\n\n.gc-panel-viewList > ul {\n  width: calc(100% - 35px);\n  padding-left: 15px;\n  margin-top: 1px;\n  margin-bottom: 1px;\n}\n\n.gc-panel-viewList > ul > li {\n  margin-top: 1px;\n  display: inline-block;\n  width: 100%;\n  line-height: 14px;\n}\n\n.gc-panel-viewList > ul > li > span:hover {\n  background-color: rgb(159, 213, 183);\n  cursor: default;\n}\n\n.gc-panel-button-delete {\n  padding: 0;\n}\n\n.gc-panel-withoutViewList {\n  height: 100%;\n}\n\n.gc-panel-withoutViewList[containViewList=true] {\n  height: calc(100% - 30px);\n}\n\n.gc-panel-stack {\n  width: 100%;\n}\n.gc-panel-stack .gc-panel-fields-section {\n  width: 100%;\n  height: calc(52% - 60px);\n  color: black;\n}\n.gc-panel-stack .gc-panel-fields-section[containArea=false] {\n  height: calc(100% - 30px);\n}\n.gc-panel-stack > span {\n  color: black;\n}\n.gc-panel-stack .gc-panel-areas-section {\n  width: 100%;\n  height: 48%;\n  color: black;\n}\n.gc-panel-stack .gc-panel-areas-section > span:first-child {\n  display: inline-block;\n  margin-bottom: 5px;\n}\n.gc-panel-stack .gc-panel-areas-section[containFields=false] {\n  width: 100%;\n  height: calc(100% - 40px);\n}\n.gc-panel-stack .gc-panel-areas-section span {\n  white-space: normal;\n}\n.gc-panel-stack .gc-panel-field-area {\n  height: calc(100% - 40px);\n}\n.gc-panel-stack .gc-panel-field-area > section:nth-of-type(1) {\n  border-right: 1px solid #ababab;\n  border-bottom: 1px solid #ababab;\n}\n.gc-panel-stack .gc-panel-field-area > section:nth-of-type(2) {\n  border-bottom: 1px solid #ababab;\n}\n.gc-panel-stack .gc-panel-field-area > section:nth-of-type(2) .gc-panel-area-item-title,\n.gc-panel-stack .gc-panel-field-area > section:nth-of-type(2) .gc-panel-area-item-content {\n  margin-left: 3%;\n}\n.gc-panel-stack .gc-panel-field-area > section:nth-of-type(3) {\n  border-right: 1px solid #ababab;\n}\n.gc-panel-stack .gc-panel-field-area > section:nth-of-type(4) .gc-panel-area-item-title,\n.gc-panel-stack .gc-panel-field-area > section:nth-of-type(4) .gc-panel-area-item-content {\n  margin-left: 3%;\n}\n.gc-panel-stack .gc-panel-area-section {\n  width: 50%;\n  height: 50%;\n  box-sizing: border-box;\n}\n.gc-panel-stack .gc-panel-area-section-Filters {\n  border-bottom-color: #CBCBCB;\n  border-right-color: #CBCBCB;\n}\n.gc-panel-stack .gc-panel-area-section-Columns {\n  border-bottom-color: #CBCBCB;\n}\n.gc-panel-stack .gc-panel-area-section-Rows {\n  border-right-color: #CBCBCB;\n}\n.gc-panel-stack .gc-panel-defer-layout-update {\n  width: 100%;\n  height: 20px;\n  line-height: 20px;\n  display: inline-block;\n  margin: 5px 0;\n}\n.gc-panel-stack .gc-panel-field-area-text {\n  display: inline-block;\n  height: 20px;\n  line-height: 20px;\n  margin: 5px 0;\n}\n.gc-panel-stack .gc-panel-area-section:nth-child(odd) {\n  float: left;\n}\n.gc-panel-stack .gc-panel-area-section:nth-child(even) {\n  float: right;\n}\n\n.gc-panel-flow {\n  width: 100%;\n}\n.gc-panel-flow .gc-panel-fields-section {\n  width: 49%;\n  height: calc(100% - 50px);\n  color: black;\n  float: left;\n  overflow-y: scroll;\n}\n.gc-panel-flow .gc-panel-fields-section[containArea=false] {\n  width: 100%;\n  height: calc(100% - 30px);\n}\n.gc-panel-flow .gc-panel-fields-section span {\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n.gc-panel-flow > span {\n  color: black;\n}\n.gc-panel-flow .gc-panel-areas-section {\n  width: 49%;\n  height: calc(100% - 50px);\n  float: right;\n  overflow-y: scroll;\n  color: black;\n}\n.gc-panel-flow .gc-panel-areas-section[containFields=false] {\n  width: 100%;\n  height: calc(100% - 40px);\n}\n.gc-panel-flow .gc-panel-field-area {\n  height: calc(100% - 40px);\n}\n.gc-panel-flow .gc-panel-area-section {\n  width: 100%;\n  height: 25%;\n}\n.gc-panel-flow .gc-panel-area-section-Filters {\n  border-bottom-color: #CBCBCB;\n  border-right-color: #CBCBCB;\n}\n.gc-panel-flow .gc-panel-area-section-Columns {\n  border-bottom-color: #CBCBCB;\n}\n.gc-panel-flow .gc-panel-area-section-Rows {\n  border-right-color: #CBCBCB;\n}\n.gc-panel-flow .gc-panel-defer-layout-update {\n  width: 100%;\n  height: 20px;\n  line-height: 20px;\n  display: inline-block;\n  margin: 5px 0;\n}\n.gc-panel-flow .gc-panel-field-area-text {\n  display: inline-block;\n  height: 20px;\n  line-height: 20px;\n  margin: 5px 0;\n}\n\n.gc-panel-all-field {\n  background-color: #FDFDFD;\n  height: calc(100% - 30px);\n  overflow-y: auto;\n  border-bottom: 1px solid #CBCBCB;\n  border-top: 1px solid #CBCBCB;\n  box-sizing: border-box;\n}\n.gc-panel-all-field ul {\n  margin: 0;\n  padding: 0;\n}\n.gc-panel-all-field .gc-panel-all-field-item {\n  height: 22px;\n  line-height: 19px;\n  font-size: 12px;\n  color: black;\n}\n.gc-panel-all-field .gc-panel-all-field-item:hover {\n  background-color: rgb(159, 213, 183);\n}\n.gc-panel-all-field .gc-panel-area-item-icon {\n  width: 20px;\n  height: 13px;\n  display: inline-block;\n  margin-top: 3px;\n  float: right;\n  cursor: auto;\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+dHJpYW5nbGVfbGlnaHQ8L3RpdGxlPgogICAgPGcgaWQ9InRyaWFuZ2xlX2xpZ2h0IiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8cG9seWdvbiBpZD0i6Lev5b6ELTQiIGZpbGw9IiM2OTY5NjkiIHBvaW50cz0iNCA2IDEyIDYgOCAxMCI+PC9wb2x5Z29uPgogICAgPC9nPgo8L3N2Zz4=);\n}\n\n.gc-panel-all-field-checked {\n  font-weight: 600;\n}\n\n.gc-panel-all-field-unchecked,\n.gc-panel-all-field-checked {\n  vertical-align: top;\n  display: inline-block;\n  width: calc(100% - 45px);\n  overflow: hidden;\n}\n\n.gc-panel-all-field-item-filtered .gc-panel-all-field-unchecked,\n.gc-panel-all-field-item-filtered .gc-panel-all-field-checked {\n  width: calc(100% - 64px);\n}\n\n.gc-panel-area-item-title {\n  height: 26px;\n  line-height: 26px;\n  font-size: 12px;\n  color: black;\n  width: 97%;\n}\n\n.gc-panel-area-item {\n  height: 23px;\n  line-height: 23px;\n  text-indent: 3px;\n  box-sizing: border-box;\n  text-overflow: ellipsis;\n  overflow: hidden;\n  word-break: break-all;\n  white-space: nowrap;\n  margin-bottom: 1px;\n  font-size: 12px;\n  border: 1px solid #CBCBCB;\n  outline: none;\n}\n.gc-panel-area-item:hover {\n  border: 1px solid #217346;\n}\n.gc-panel-area-item .gc-panel-area-item-label {\n  display: inline-block;\n  width: 75%;\n  height: 100%;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  color: black;\n}\n.gc-panel-area-item .gc-panel-area-item-icon {\n  width: 20px;\n  height: 13px;\n  display: inline-block;\n  margin-top: 3px;\n  float: right;\n  cursor: default;\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+dHJpYW5nbGVfbGlnaHQ8L3RpdGxlPgogICAgPGcgaWQ9InRyaWFuZ2xlX2xpZ2h0IiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8cG9seWdvbiBpZD0i6Lev5b6ELTQiIGZpbGw9IiM2OTY5NjkiIHBvaW50cz0iNCA2IDEyIDYgOCAxMCI+PC9wb2x5Z29uPgogICAgPC9nPgo8L3N2Zz4=);\n}\n\n.gc-panel-area-item-content {\n  margin: 0;\n  padding: 1px;\n  height: calc(100% - 30px);\n  width: 97%;\n  background-color: #FDFDFD;\n  overflow-y: auto;\n  box-sizing: border-box;\n}\n\n.gc-panel-defer-layout-left-div {\n  float: left;\n  width: calc(100% - 60px);\n}\n.gc-panel-defer-layout-left-div label {\n  display: inline-block;\n  max-width: calc(100% - 20px);\n  color: black;\n  overflow-x: hidden;\n  text-overflow: ellipsis;\n  vertical-align: middle;\n}\n.gc-panel-defer-layout-left-div input {\n  vertical-align: middle;\n}\n\n.gc-panel-defer-layout-right-button {\n  float: right;\n  border: 1px solid #CBCBCB;\n  background-color: white;\n  color: black;\n  width: 60px;\n  padding: 1px 0px;\n  text-align: center;\n}\n.gc-panel-defer-layout-right-button:disabled {\n  color: #c6bfbe;\n}\n\n.gc-panel-bottomBorderStyle {\n  border-bottom: 2px solid green;\n}\n\n.gc-panel-topBorderStyle {\n  border-top: 2px solid green;\n}\n\n.gc-panel-all-field-filter {\n  width: 18px;\n  height: 13px;\n  margin-top: 3px;\n  display: inline-block;\n  float: right;\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+ZmlsdGVyX2xpZ2h0PC90aXRsZT4KICAgIDxnIGlkPSJmaWx0ZXJfbGlnaHQiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxwYXRoIGQ9Ik0xMi45MzI0NzkyLDMgQzEzLjIwODYyMTYsMyAxMy40MzI0NzkyLDMuMjIzODU3NjMgMTMuNDMyNDc5MiwzLjUgQzEzLjQzMjQ3OTIsMy42MTY5NjgyNSAxMy4zOTE0NzExLDMuNzMwMjM0NyAxMy4zMTY1ODk4LDMuODIwMDkyMiBMOS4yLDguNzYgTDkuMiwxMi44IEw2LjgsMTQgTDYuOCw4Ljc2IEwyLjY4MzQxMDE3LDMuODIwMDkyMiBDMi41MDY2MjgxMywzLjYwNzk1Mzc1IDIuNTM1MjkwMTYsMy4yOTI2NzE0IDIuNzQ3NDI4NjEsMy4xMTU4ODkzNiBDMi44MzcyODYxMSwzLjA0MTAwODExIDIuOTUwNTUyNTUsMyAzLjA2NzUyMDgxLDMgTDEyLjkzMjQ3OTIsMyBaIiBpZD0iQ29tYmluZWQtU2hhcGUiIGZpbGw9IiM2OTY5NjkiPjwvcGF0aD4KICAgIDwvZz4KPC9zdmc+);\n  background-repeat: no-repeat;\n}\n\n.gc-panel-area-item-Filters {\n  width: 15px;\n  height: 14px;\n  display: inline-block;\n  background-repeat: no-repeat;\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+ZmlsdGVyX2xpZ2h0PC90aXRsZT4KICAgIDxnIGlkPSJmaWx0ZXJfbGlnaHQiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxwYXRoIGQ9Ik0xMi45MzI0NzkyLDMgQzEzLjIwODYyMTYsMyAxMy40MzI0NzkyLDMuMjIzODU3NjMgMTMuNDMyNDc5MiwzLjUgQzEzLjQzMjQ3OTIsMy42MTY5NjgyNSAxMy4zOTE0NzExLDMuNzMwMjM0NyAxMy4zMTY1ODk4LDMuODIwMDkyMiBMOS4yLDguNzYgTDkuMiwxMi44IEw2LjgsMTQgTDYuOCw4Ljc2IEwyLjY4MzQxMDE3LDMuODIwMDkyMiBDMi41MDY2MjgxMywzLjYwNzk1Mzc1IDIuNTM1MjkwMTYsMy4yOTI2NzE0IDIuNzQ3NDI4NjEsMy4xMTU4ODkzNiBDMi44MzcyODYxMSwzLjA0MTAwODExIDIuOTUwNTUyNTUsMyAzLjA2NzUyMDgxLDMgTDEyLjkzMjQ3OTIsMyBaIiBpZD0iQ29tYmluZWQtU2hhcGUiIGZpbGw9IiM2OTY5NjkiPjwvcGF0aD4KICAgIDwvZz4KPC9zdmc+);\n}\n\n.gc-panel-area-item-Rows {\n  width: 15px;\n  height: 14px;\n  display: inline-block;\n  background-repeat: no-repeat;\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+Y2F0ZWdvcnlfbGlnaHQ8L3RpdGxlPgogICAgPGcgaWQ9ImNhdGVnb3J5X2xpZ2h0IiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8cGF0aCBkPSJNMTMsMTIgTDEzLDEzIEwzLDEzIEwzLDEyIEwxMywxMiBaIE0xMywxMCBMMTMsMTEgTDMsMTEgTDMsMTAgTDEzLDEwIFogTTEzLDggTDEzLDkgTDMsOSBMMyw4IEwxMyw4IFogTTEzLDQgTDEzLDcgTDMsNyBMMyw0IEwxMyw0IFoiIGlkPSLlvaLnirbnu5PlkIgiIGZpbGw9IiM2OTY5NjkiPjwvcGF0aD4KICAgIDwvZz4KPC9zdmc+);\n}\n\n.gc-panel-area-item-Columns {\n  width: 15px;\n  height: 14px;\n  display: inline-block;\n  background-repeat: no-repeat;\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+c2VyaWVzX2xpZ2h0PC90aXRsZT4KICAgIDxnIGlkPSJzZXJpZXNfbGlnaHQiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxwYXRoIGQ9Ik02LDMgTDYsMTMgTDMsMTMgTDMsMyBMNiwzIFogTTgsMyBMOCwxMyBMNywxMyBMNywzIEw4LDMgWiBNMTAsMyBMMTAsMTMgTDksMTMgTDksMyBMMTAsMyBaIE0xMiwzIEwxMiwxMyBMMTEsMTMgTDExLDMgTDEyLDMgWiIgaWQ9IuW9oueKtue7k+WQiCIgZmlsbD0iIzY5Njk2OSI+PC9wYXRoPgogICAgPC9nPgo8L3N2Zz4=);\n}\n\n.gc-panel-area-item-Values {\n  width: 15px;\n  height: 14px;\n  display: inline-block;\n  background-repeat: no-repeat;\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+dmFsdWVfbGlnaHQ8L3RpdGxlPgogICAgPGcgaWQ9InZhbHVlX2xpZ2h0IiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8cGF0aCBkPSJNMy40MzYyOTYyMiwzIEwxMywzIEwxMywzIEwxMyw2LjEyNSBMMTIuMjMwNzY5Miw2LjEyNSBMMTEuNDYxNTM4NSw0LjAxODQ3MzMxIEw1LjkwMzIzODkzLDQuMDE4NDczMzEgTDguOTY2Nzk2ODgsNy42ODMwMjQwOSBMNS42MjEwNTMwNiwxMS43MjI3Mzc2IEwxMS40NjE1Mzg1LDExLjcyMjczNzYgTDEyLjIzMDc2OTIsOS44NzUgTDEzLDkuODc1IEwxMywxMyBMMy40MzYyOTYyMiwxMyBDMy4zMjU4MzkyNywxMyAzLjIzNjI5NjIyLDEyLjkxMDQ1NjkgMy4yMzYyOTYyMiwxMi44IEMzLjIzNjI5NjIyLDEyLjc1MjA4MzggMy4yNTM0OTkxMiwxMi43MDU3NiAzLjI4NDc3NDQ4LDEyLjY2OTQ1ODIgTDcuMzA3NjkyMzIsOCBMNy4zMDc2OTIzMiw4IEwzLjI4NDc3NDQ4LDMuMzMwNTQxODEgQzMuMjEyNjc4MjMsMy4yNDY4NTg2NiAzLjIyMjA3MTI3LDMuMTIwNTc0NTEgMy4zMDU3NTQ0MSwzLjA0ODQ3ODI2IEMzLjM0MjA1NjE3LDMuMDE3MjAyOSAzLjM4ODM3OTk4LDMgMy40MzYyOTYyMiwzIFoiIGlkPSJTaGFwZSIgZmlsbD0iIzY5Njk2OSIgZmlsbC1ydWxlPSJub256ZXJvIj48L3BhdGg+CiAgICA8L2c+Cjwvc3ZnPg==);\n}\n\n.gc-panel-all-field-filter:hover {\n  cursor: auto;\n}\n\n.gc-panel-views #gc-panel-selected-view {\n  background-color: #FDFDFD;\n}\n\n.gc-ai-icon {\n  width: 16px;\n  height: 16px;\n  cursor: pointer;\n  background-position: center;\n  background-repeat: no-repeat;\n  background-size: contain;\n  mask-position: center;\n  mask-repeat: no-repeat;\n  mask-size: contain;\n  transition: transform 0.2s ease;\n}\n.gc-ai-icon:hover {\n  transform: scale(1.1);\n}\n.gc-ai-icon.gc-ai-ai {\n  background-image: url(data:image/svg+xml;charset=utf-8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+QUkgSWNvbjwvdGl0bGU+CiAgICA8ZGVmcz4KICAgICAgICA8bGluZWFyR3JhZGllbnQgeDE9IjU5Ljk4NDg4MDglIiB5MT0iMzYuOTYyNDI2NCUiIHgyPSIxNTAuNjgwMTM2JSIgeTI9IjkzLjU5NzcwOTUlIiBpZD0ibGluZWFyR3JhZGllbnQtMSI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNCMzI2RkYiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzI3MjNGRiIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9saW5lYXJHcmFkaWVudD4KICAgICAgICA8bGluZWFyR3JhZGllbnQgeDE9IjQyLjg3NjYyNiUiIHkxPSI0LjcxNjk0NDY5JSIgeDI9IjYwLjY3OTI2MzIlIiB5Mj0iMTAwJSIgaWQ9ImxpbmVhckdyYWRpZW50LTIiPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjQjgyNkZFIiBvZmZzZXQ9IjAlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMyNTIyRkUiIG9mZnNldD0iMTAwJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMUMyMkZFIiBvZmZzZXQ9IjEwMCUiPjwvc3RvcD4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iNTAlIiB5MT0iMCUiIHgyPSI1MCUiIHkyPSIxMDAlIiBpZD0ibGluZWFyR3JhZGllbnQtMyI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNCNzI2RkYiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzFGMjNGRiIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9saW5lYXJHcmFkaWVudD4KICAgICAgICA8bGluZWFyR3JhZGllbnQgeDE9IjQzLjI2NDM4MzMlIiB5MT0iMTIuOTk3MTk4MSUiIHgyPSI2Ni4yMjQxNzAzJSIgeTI9IjEwMCUiIGlkPSJsaW5lYXJHcmFkaWVudC00Ij4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0I2MjZGRiIgb2Zmc2V0PSIwJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMjUyM0ZGIiBvZmZzZXQ9IjEwMCUiPjwvc3RvcD4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPC9kZWZzPgogICAgPGcgaWQ9IkFJLUljb24iIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSLnvJbnu4QtMTAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAuMDAwMDAwLCAzLjAwMDAwMCkiPgogICAgICAgICAgICA8ZyBpZD0i57yW57uELTnlpIfku70iPgogICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9Iui3r+W+hC01IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTEpIiBwb2ludHM9IjUuNDMzOTYyMjYgNS43MzU4NDkwNiAzLjcyMzI3MDQ0IDguMTUwOTQzNCA4LjQ1MjgzMDE5IDguMTUwOTQzNCA4LjE1MDk0MzQgNS43MzU4NDkwNiI+PC9wb2x5Z29uPgogICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9Iui3r+W+hC00IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTIpIiBwb2ludHM9IjguNTUzNDU5MTIgOS44NjE2MzUyMiAxMS43NzM1ODQ5IDkuODYxNjM1MjIgMTAuNjE1ODk2MyAxLjEzNDQ0NDM4IDEwLjU3OTAxNjggMC44NTY0Mjk1MDMgNy45NjkyMDQ3NSA0LjQzNjQxNjExIDcuOTkwNDY2ODcgNC42MzM4NTAwOSI+PC9wb2x5Z29uPgogICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9Iui3r+W+hC0yIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTMpIiBwb2ludHM9IjAgOS44NjE2MzUyMiAzLjQyMTM4MzY1IDkuODYxNjM1MjIgMTAuNDY1NDA4OCAwIDcuMTQ0NjU0MDkgMCI+PC9wb2x5Z29uPgogICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDxwb2x5Z29uIGlkPSLot6/lvoQtM+Wkh+S7vSIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudC00KSIgcG9pbnRzPSI5Ljg2MTYzNTIyIDkuODYxNjM1MjIgMTMuMTgyMzg5OSA5Ljg2MTYzNTIyIDE2IDAgMTIuNjc5MjQ1MyAwIj48L3BvbHlnb24+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=);\n  cursor: default;\n}\n.gc-ai-icon.gc-ai-close {\n  mask-image: url(data:image/svg+xml;charset=utf-8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTJweCIgaGVpZ2h0PSIxMnB4IiB2aWV3Qm94PSIwIDAgMTIgMTIiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+Y2xvc2U8L3RpdGxlPgogICAgPGcgaWQ9ImNsb3NlIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8cG9seWdvbiBpZD0i6Lev5b6EIiBmaWxsPSIjMDAwMDAwIiBmaWxsLXJ1bGU9Im5vbnplcm8iIHBvaW50cz0iMTAgMi44MDU3MTQyOSA5LjE5NDI4NTcxIDIgNiA1LjE5NDI4NTcxIDIuODA1NzE0MjkgMiAyIDIuODA1NzE0MjkgNS4xOTQyODU3MSA2IDIgOS4xOTQyODU3MSAyLjgwNTcxNDI5IDEwIDYgNi44MDU3MTQyOSA5LjE5NDI4NTcxIDEwIDEwIDkuMTk0Mjg1NzEgNi44MDU3MTQyOSA2Ij48L3BvbHlnb24+CiAgICA8L2c+Cjwvc3ZnPg==);\n  background-color: black;\n  margin-right: 10px;\n  width: 12px;\n  height: 12px;\n}\n.gc-ai-icon.gc-ai-reset {\n  mask-image: url(data:image/svg+xml;charset=utf-8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+cmVzZXQ8L3RpdGxlPgogICAgPGcgaWQ9InJlc2V0IiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyLjAwMDAwMCwgMS4wMDAwMDApIiBmaWxsPSIjMDAwMDAwIiBmaWxsLXJ1bGU9Im5vbnplcm8iIGlkPSLot6/lvoQiPgogICAgICAgICAgICA8cGF0aCBkPSJNMS41NTU1NTU1NSw3Ljc3Nzc3Nzc4IEwwLDcuNzc3Nzc3NzggQzAsMTEuMTUwMjIyMiAyLjg0OSwxNCA2LjIyMjIyMjIyLDE0IEM5LjU5NTQ0NDQzLDE0IDEyLjQ0NDQ0NDQsMTEuMTUwMjIyMiAxMi40NDQ0NDQ0LDcuNzc3Nzc3NzggQzEyLjQ0NDQ0NDQsNC40MDUzMzMzNSA5LjU5NTQ0NDQzLDEuNTU1NTU1NTcgNi4yMjIyMjIyMiwxLjU1NTU1NTU3IEw2LjIyMjIyMjIyLDAgTDMuMTMwNTU1NTUsMi4zMzMzMzMzMyBMNi4yMjIyMjIyMiw0LjY2NjY2NjY3IEw2LjIyMjIyMjIyLDMuMTExMTExMTIgQzguNzUxNTU1NTUsMy4xMTExMTExMiAxMC44ODg4ODg5LDUuMjQ4NDQ0NDUgMTAuODg4ODg4OSw3Ljc3Nzc3Nzc4IEMxMC44ODg4ODg5LDEwLjMwNzExMTEgOC43NTE1NTU1NSwxMi40NDQ0NDQ1IDYuMjIyMjIyMjIsMTIuNDQ0NDQ0NSBDMy42OTI4ODg4OCwxMi40NDQ0NDQ1IDEuNTU1NTU1NTUsMTAuMzA3MTExMSAxLjU1NTU1NTU1LDcuNzc3Nzc3NzggWiI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBkPSJNOCw4IEM4LDYuODg3MzMzMzMgNy4xMTQsNiA2LDYgQzQuODg2LDYgNCw2Ljg4NzMzMzMzIDQsOCBDNCw5LjExMjY2NjY3IDQuODg2LDEwIDYsMTAgQzcuMTE0LDEwIDgsOS4xMTI2NjY2NyA4LDggWiI+PC9wYXRoPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+);\n  background-color: grey;\n  width: 20px;\n  height: 20px;\n}\n.gc-ai-icon.gc-ai-reset.gc-ai-icon-disabled {\n  background-color: lightgrey;\n  cursor: default;\n}\n.gc-ai-icon.gc-ai-send {\n  mask-image: url(data:image/svg+xml;charset=utf-8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTJweCIgaGVpZ2h0PSIxMnB4IiB2aWV3Qm94PSIwIDAgMTIgMTIiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+c2VuZDwvdGl0bGU+CiAgICA8ZyBpZD0ic2VuZCIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPHBhdGggZD0iTTYuNDE5MTgyNjQsNi4xMDE3MTQwNCBMMi41NTcyMDQ1Miw2Ljc0NTcxODkgQzIuNDY2ODM2MzUsNi43NjA4MDA2OSAyLjM5MTM4NDkyLDYuODIyOTYwMTYgMi4zNTkyODU4Myw2LjkwODc3MTA4IEwxLjAyNzE4MDI3LDEwLjQ3NTkyMjEgQzAuOTAwMDIwMDc3LDEwLjgwNDA3NzUgMS4yNDMwNDQ5NSwxMS4xMTY4NTA1IDEuNTU3ODY4OTcsMTAuOTU5NDM4NSBMMTAuNzg3MjM3OCw2LjM0NDc1NDA5IEMxMC45MTc2MjA5LDYuMjc5NjQ5ODUgMTEsNi4xNDY0Mzc0MSAxMSw2LjAwMDcwMzczIEMxMSw1Ljg1NDk3MDA1IDEwLjkxNzYyMDksNS43MjE3NTc2MiAxMC43ODcyMzc4LDUuNjU2NjUzMzggTDEuNTU3ODY4OTcsMS4wNDE5Njg5NiBDMS4yNDMwNDQ5NSwwLjg4NDU1Njk0NyAwLjkwMDAyMDA3NywxLjE5NzMzMDAxIDEuMDI3MTgwMjcsMS41MjU0ODUzMyBMMi4zNTk3OTg1OCw1LjA5MjYzNjM5IEMyLjM5MTc0OTE0LDUuMTc4NjQ2NDEgMi40NjcyMjg0Niw1LjI0MTAyNDM5IDIuNTU3NzE3MjYsNS4yNTYyMDEzMSBMNi40MTk2OTUzNyw1Ljg5OTY5MzQyIEM2LjQ2ODc1NzM4LDUuOTA4Mjg4MjEgNi41MDQ1NDg3MSw1Ljk1MDg5NDU4IDYuNTA0NTQ4NzEsNi4wMDA3MDM3MyBDNi41MDQ1NDg3MSw2LjA1MDUxMjg4IDYuNDY4NzU3MzgsNi4wOTMxMTkyNiA2LjQxOTY5NTM3LDYuMTAxNzE0MDQgTDYuNDE5MTgyNjQsNi4xMDE3MTQwNCBaIiBpZD0i6Lev5b6EIiBmaWxsPSIjMDAwMDAwIiBmaWxsLXJ1bGU9Im5vbnplcm8iPjwvcGF0aD4KICAgIDwvZz4KPC9zdmc+);\n  background-color: white;\n  width: 14px;\n  height: 14px;\n}\n.gc-ai-icon.gc-ai-stop {\n  mask-image: url(data:image/svg+xml;charset=utf-8;base64,PHN2ZyB0PSIxNzQ0MDk3NDg5MTMwIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE2NTciIHdpZHRoPSIyMDAiIGhlaWdodD0iMjAwIj48cGF0aCBkPSJNODUuMzMzMzMzIDg1LjMzMzMzM201My4zMzMzMzQgMGw3NDYuNjY2NjY2IDBxNTMuMzMzMzMzIDAgNTMuMzMzMzM0IDUzLjMzMzMzNGwwIDc0Ni42NjY2NjZxMCA1My4zMzMzMzMtNTMuMzMzMzM0IDUzLjMzMzMzNGwtNzQ2LjY2NjY2NiAwcS01My4zMzMzMzMgMC01My4zMzMzMzQtNTMuMzMzMzM0bDAtNzQ2LjY2NjY2NnEwLTUzLjMzMzMzMyA1My4zMzMzMzQtNTMuMzMzMzM0WiIgZmlsbD0iIzVDNUM2NiIgcC1pZD0iMTY1OCI+PC9wYXRoPjwvc3ZnPg==);\n  background-color: white;\n  width: 10px;\n  height: 10px;\n}\n.gc-ai-icon.gc-ai-generate {\n  background-image: url(data:image/svg+xml;charset=utf-8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjVweCIgaGVpZ2h0PSIyNXB4IiB2aWV3Qm94PSIwIDAgMjUgMjUiIHZlcnNpb249IjEuMSI+CjxkZWZzPgo8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhcjAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMC41OTk4NDkiIHkxPSIwLjM2OTYyNCIgeDI9IjEuNTA2ODAxIiB5Mj0iMC45MzU5NzciIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoOS44NTE1NjMsMCwwLDUuMDM1MTU2LDcuNzU3ODEyLDE0LjAzMTI1KSI+CjxzdG9wIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6cmdiKDcwLjE5NjA3OCUsMTQuOTAxOTYxJSwxMDAlKTtzdG9wLW9wYWNpdHk6MTsiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjpyZ2IoMTUuMjk0MTE4JSwxMy43MjU0OSUsMTAwJSk7c3RvcC1vcGFjaXR5OjE7Ii8+CjwvbGluZWFyR3JhZGllbnQ+CjxsaW5lYXJHcmFkaWVudCBpZD0ibGluZWFyMSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIwLjQyODc2NiIgeTE9IjAuMDQ3MTY5NCIgeDI9IjAuNjA2NzkzIiB5Mj0iMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg3LjkyNTc4MSwwLDAsMTguNzYxNzE5LDE2LjYwMTU2MiwzLjg2NzE4OCkiPgo8c3RvcCBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOnJnYig3Mi4xNTY4NjMlLDE0LjkwMTk2MSUsOTkuNjA3ODQzJSk7c3RvcC1vcGFjaXR5OjE7Ii8+CjxzdG9wIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6cmdiKDE0LjUwOTgwNCUsMTMuMzMzMzMzJSw5OS42MDc4NDMlKTtzdG9wLW9wYWNpdHk6MTsiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjpyZ2IoMTAuOTgwMzkyJSwxMy4zMzMzMzMlLDk5LjYwNzg0MyUpO3N0b3Atb3BhY2l0eToxOyIvPgo8L2xpbmVhckdyYWRpZW50Pgo8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhcjIiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMC41IiB5MT0iMCIgeDI9IjAuNSIgeTI9IjEiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMjEuODA0Njg4LDAsMCwyMC41NDY4NzUsMCwyLjA4MjAzMSkiPgo8c3RvcCBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOnJnYig3MS43NjQ3MDYlLDE0LjkwMTk2MSUsMTAwJSk7c3RvcC1vcGFjaXR5OjE7Ii8+CjxzdG9wIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6cmdiKDEyLjE1Njg2MyUsMTMuNzI1NDklLDEwMCUpO3N0b3Atb3BhY2l0eToxOyIvPgo8L2xpbmVhckdyYWRpZW50Pgo8L2RlZnM+CjxnIGlkPSJzdXJmYWNlMSI+CjxwYXRoIHN0eWxlPSIgc3Ryb2tlOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7ZmlsbDp1cmwoI2xpbmVhcjApOyIgZD0iTSAxMS4zMjAzMTIgMTQuMDMxMjUgTCA3Ljc1NzgxMiAxOS4wNjY0MDYgTCAxNy42MDkzNzUgMTkuMDY2NDA2IEwgMTYuOTgwNDY5IDE0LjAzMTI1IFogTSAxMS4zMjAzMTIgMTQuMDMxMjUgIi8+CjxwYXRoIHN0eWxlPSIgc3Ryb2tlOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7ZmlsbDp1cmwoI2xpbmVhcjEpOyIgZD0iTSAxNy44MjAzMTIgMjIuNjI4OTA2IEwgMjQuNTI3MzQ0IDIyLjYyODkwNiBMIDIyLjExNzE4OCA0LjQ0NTMxMiBMIDIyLjAzOTA2MiAzLjg2NzE4OCBMIDE2LjYwMTU2MiAxMS4zMjQyMTkgTCAxNi42NDg0MzggMTEuNzM4MjgxIFogTSAxNy44MjAzMTIgMjIuNjI4OTA2ICIvPgo8cGF0aCBzdHlsZT0iIHN0cm9rZTpub25lO2ZpbGwtcnVsZTpldmVub2RkO2ZpbGw6dXJsKCNsaW5lYXIyKTsiIGQ9Ik0gMCAyMi42Mjg5MDYgTCA3LjEyODkwNiAyMi42Mjg5MDYgTCAyMS44MDQ2ODggMi4wODIwMzEgTCAxNC44ODI4MTIgMi4wODIwMzEgWiBNIDAgMjIuNjI4OTA2ICIvPgo8L2c+Cjwvc3ZnPgo=);\n}\n.gc-ai-icon.gc-ai-analyze {\n  background-image: url(data:image/svg+xml;charset=utf-8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjVweCIgaGVpZ2h0PSIyNXB4IiB2aWV3Qm94PSIwIDAgMjUgMjUiIHZlcnNpb249IjEuMSI+CjxkZWZzPgo8bGluZWFyR3JhZGllbnQgaWQ9ImxpbmVhcjAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMC40MzI2NDQiIHkxPSIwLjEyOTk3MiIgeDI9IjAuNjYyMjQyIiB5Mj0iMSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxMi43ODkwNjIsMCwwLDIwLjU0Njg3NSw2LjI1LDIuMDgyMDMxKSI+CjxzdG9wIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6cmdiKDcxLjM3MjU0OSUsMTQuOTAxOTYxJSwxMDAlKTtzdG9wLW9wYWNpdHk6MTsiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjpyZ2IoMTQuNTA5ODA0JSwxMy43MjU0OSUsMTAwJSk7c3RvcC1vcGFjaXR5OjE7Ii8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPGcgaWQ9InN1cmZhY2UxIj4KPHBhdGggc3R5bGU9IiBzdHJva2U6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtmaWxsOnVybCgjbGluZWFyMCk7IiBkPSJNIDYuMjUgMjIuNjI4OTA2IEwgMTMuMTY3OTY5IDIyLjYyODkwNiBMIDE5LjAzOTA2MiAyLjA4MjAzMSBMIDEyLjEyMTA5NCAyLjA4MjAzMSBaIE0gNi4yNSAyMi42Mjg5MDYgIi8+CjwvZz4KPC9zdmc+Cg==);\n}\n.gc-ai-icon.gc-ai-refresh {\n  mask-image: url(data:image/svg+xml;charset=utf-8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+cmVmcmVzaDwvdGl0bGU+CiAgICA8ZyBpZD0icmVmcmVzaCIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPHBhdGggZD0iTTIuMTMxODI0NDYsNC40NjQzMjU4MSBMNC4yNjQ4NTUwNyw3LjY2MzUxOTQzIEwyLjkzMjQ5ODA4LDcuNjYzNTE5NDMgQzIuOTMyNDk4MDgsOC44NTc1MDI0OCAzLjM1MDM0Nzc1LDkuOTUzOTI0OTUgNC4wNDIxNjg5OSwxMC44MjE0MTE4IEM0LjA2MzQ1NzAxLDEwLjg0NzA4MjMgNC4wODIxOTE3MSwxMC44NzI3MzcxIDQuMTAyMjEwOSwxMC44OTY0ODExIEM0LjE5ODU3ODcsMTEuMDEzNDMxNCA0LjI5OTg4MDgyLDExLjEyMzQ5MDMgNC40MDQ5NzM3MywxMS4yMjk4NTI4IEM0LjQxMTI1NTE4LDExLjIzNjA1NSA0LjQxNjI1MjE1LDExLjI0MzAwOTEgNC40MjEyNjQ3OCwxMS4yNDc5ODk3IEM0Ljc2MzcwNzI4LDExLjU4Nzk3NzEgNS4xNTE5NDk1NiwxMS44Nzg0OTIyIDUuNTc0NzQ5MTIsMTIuMTExMTIxIEw1LjU5MDk5MzE4LDEyLjExOTg0NDggQzUuNzE3Mzg5NzcsMTIuMTg4MDIyNyA1Ljg0NjIxNDM2LDEyLjI0ODA3MiA1Ljk3NzYwNzkyLDEyLjMwNTYxNTIgQzYuMDAyNjI0MDgsMTIuMzE3NDcxNCA2LjAyNjM3MTQxLDEyLjMyOTk4NTcgNi4wNTI2NzIwNCwxMi4zMzk5OTM5IEM2LjE2NTI2ODI1LDEyLjM4NjMwNzIgNi4yODAzNTUwOSwxMi40Mjc1MzAzIDYuMzk1NDU3NiwxMi40NjU3MTUgQzYuNDQyOTk5MjYsMTIuNDgxMzc3MyA2LjQ5MDU0MDkxLDEyLjQ5ODg3MiA2LjUzOTMwNDQyLDEyLjUxMzI1MDEgQzYuNjM5Mzg0NywxMi41NDM5MDExIDYuNzQxOTcxMywxMi41NjgyNzE2IDYuODQ0NTU3OSwxMi41OTE0MzYyIEM2LjkwODQwNjI3LDEyLjYwNjQ1NjQgNi45NzA5NTQ1LDEyLjYyMzMwOSA3LjAzNjAwOTAzLDEyLjYzNjQ2NTEgQzcuMTQxMTAxOTQsMTIuNjU2NDY1OSA3LjI0ODY4NTUsMTIuNjcwODQ0IDcuMzU2Mjg0NzQsMTIuNjg1MjIxOSBDNy40MTI1NTE1LDEyLjY5MTQ4NjkgNy40Njg4ODA5MywxMi43MDE1MjYzIDcuNTI1MTQ3NzEsMTIuNzA2NTA3IEM3LjY2MTU1MzksMTIuNzE4MzYzMiA3LjgwMDM4ODA4LDEyLjcyNDYxMjYgNy45MzkyODQ5MSwxMi43MjcxNDk5IEM4Ljk5MzkxMDg2LDEyLjc0MTUyNzggMTAuMDI0NzczOSwxMi40MzEzMDUgMTAuOTA2ODA4LDExLjgxMzkyOTcgQzExLjI2ODM0NCwxMS41NjAwMjg0IDExLjc2NzU3MDUsMTEuNjQ3NjEyIDEyLjAyMTU2OTksMTIuMDA5NzU1MiBDMTIuMjczMDAwMiwxMi4zNzI1MjUxIDEyLjE4NjcwNDgsMTIuODcwMzgyMSAxMS44MjUxMjE3LDEzLjEyNDM0NjEgQzEwLjY5MDM3MiwxMy45MTg2MTE4IDkuMzY4MDI0NTcsMTQuMzMzMzMzMyA4LjAxMzA3OTQ5LDE0LjMzMzMzMzMgQzcuNzkxNjc3OSwxNC4zMzMzMzMzIDcuNTY4OTc2MTUsMTQuMzE5NTY2MSA3LjM0NjI5MDA4LDE0LjI5NzY3MDMgQzcuMzAxMjU0NzQsMTQuMjkyNjg5NyA3LjI1ODcxMDA0LDE0LjI4NTE4NzQgNy4yMTM2NzQ3LDE0LjI3OTUzMzMgQzcuMDg5Nzg0NDIsMTQuMjY0NTEzMyA2Ljk2NTk3MjQ2LDE0LjI1MjY1NyA2Ljg0MjA4MjE5LDE0LjIzMDEzNDUgQzYuODA1ODE4OTMsMTQuMjI0NDk2MiA2Ljc3MDc5MzIsMTQuMjEzMjY2MyA2LjczNDQ4Mjk1LDE0LjIwNTEwNjMgQzYuNjQ1Njk2NzQsMTQuMTg4ODMzMSA2LjU1ODExNjcsMTQuMTY2OTUzIDYuNDcxNzU4NSwxNC4xNDYzMTAxIEM2LjM0MDQyNzYsMTQuMTE1NjkwMyA2LjIxMDMwMjg2LDE0LjA4MzczOTIgNi4wODM5MjE5MiwxNC4wNDYyMTI0IEM2LjAxMzg3MDQ0LDE0LjAyNDk3NDMgNS45NDUwODc3NSwxNC4wMDE4MjU1IDUuODc2MjQyNDIsMTMuOTc3NDM5MiBDNS43MzExMjY3OCwxMy45Mjg2MDQyIDUuNTg1OTk1NDksMTMuODc3MzczIDUuNDQ1ODc2ODIsMTMuODE5ODI5NyBDNS40MDQ2MTY2MSwxMy44MDE2NjE1IDUuMzYzMzA5NDEsMTMuNzgyOTI5MyA1LjMyMjA0OTIsMTMuNzY0NzkyNCBDNS4xNTgxMzYyMSwxMy42OTE1ODY5IDQuOTk1NDkyMDQsMTMuNjE0Njg1MSA0LjgzNzg2MDUsMTMuNTMwMjQ5NyBDNC44MjI4NTM5MiwxMy41MjI3MTYyIDQuODA5MTMxODUsMTMuNTEzMzAzMiA0Ljc5MjgyNTE0LDEzLjUwNTgwMSBDNC4yNDQ4NTA3MiwxMy4yMDUwMDY5IDMuNzQxOTI3MzEsMTIuODI4NDY5NyAzLjI5NTMxNzY2LDEyLjM4MjQ4NjMgTDMuMjU5MDA3NDMsMTIuMzQ0MzMzIEMzLjEyNTA3MzA5LDEyLjIwODQ5NTYgMi45OTY1MzAxNSwxMi4wNjc0NDcyIDIuODczNjc4LDExLjkyMTUxNDkgTDIuNzgzNjA3MywxMS44MDMzNDMgQzIuNzAxMDI0MjMsMTEuNjk5NDg2NSAyLjYxNTk2NjE3LDExLjU5NzU1NjIgMi41MzgzOTU3MSwxMS40ODc0OTczIEMyLjUyODM3MDQ2LDExLjQ3MzExOTQgMi41MjIxNTE2OCwxMS40NTgwOTkyIDIuNTEzMzYzOSwxMS40NDI0Njg0IEMxLjc3MDI1NzIsMTAuMzY3OTEwMyAxLjMzMTEzNTE2LDkuMDY3NjEyIDEuMzMxMTM1MTYsNy42NjM0NzI1NyBMMCw3LjY2MzQ3MjU3IEwyLjEzMTgyNDQ2LDQuNDY0MzI1ODEgWiBNOC4wMDA1NzkyNiwxIEM4LjAzMzExNDM0LDEgOC4wNjMxNDMxNCwxLjAwNDk5NjI3IDguMDk1NjYyNTcsMS4wMDQ5OTYyNyBDOC4yNzA4MDY5OSwxLjAwNzQ4NjU3IDguNDQ1OTUxNDMsMS4wMTM3MjAxNSA4LjYyNDg4NjY3LDEuMDMwNjUxMDkgTDguODQyNTc1ODEsMS4wNTg3NDkyMiBDOC45NDc2Njg1NywxLjA3MjU0NzcgOS4wNTM5Njc4MSwxLjA4MDY5MjA4IDkuMTU5MDYwNTcsMS4wOTgyMDI1MSBDOS4xOTY2MDgzOCwxLjEwNTcwNDc0IDkuMjM0MTI0NzYsMS4xMTc1NzY3NiA5LjI3Mjk0MTMzLDEuMTI1MDc4OTkgQzkuMzUxNzQ5MzMsMS4xNDA3MjU2MiA5LjQzMDU4ODU3LDEuMTYwMDk5ODcgOS41MDgxNTkwNSwxLjE3NzYxMDMgQzkuNjQ5NDk5NDMsMS4yMTA3ODMwMSA5Ljc4OTYxODEsMS4yNDQ1MzUyNCA5LjkyNzIzMDQ4LDEuMjg3MDU4MzQgQzkuOTg0NzY2MSwxLjMwMzM0NzEgMTAuMDQxMDk1NCwxLjMyMzk0MzAxIDEwLjA5ODY0NjksMS4zNDMzNzk5IEMxMC4yNTYyNzgzLDEuMzk1OTI2ODYgMTAuNDEzOTI1NSwxLjQ1MjE4NTc5IDEwLjU2Nzc2NjMsMS41MTQ3MjUzIEwxMC42NDc4Mjc0LDEuNTUwMzg4MyBDMTEuNjA5OTIzMiwxLjk2NTY3Mzc1IDEyLjQ2MDY2MDYsMi41OTkyNjAxMSAxMy4xMzYyMzc3LDMuNDIwNDMzNjQgQzEzLjE0ODczODEsMy40MzQ4NTg2MSAxMy4xNTk5Njk1LDMuNDQ5ODYzMDcgMTMuMTcxMjYzNCwzLjQ2NTQ2MjcgQzEzLjI3MTMyODIsMy41ODg2OTM1NiAxMy4zNzE0MjQsMy43MTAwNjA1OSAxMy40NjI3NzkyLDMuODQyMDE1MzMgQzEzLjQ3NTIzMjYsMy44NTg4OTkyOCAxMy40ODI3OTg1LDMuODc2NDA5NyAxMy40OTI4MDgsMy44OTU3ODM5NCBDMTQuMjMyMTU1Miw0Ljk2NzgyMDI3IDE0LjY2NzUzMzUsNi4yNjU2MTI3NCAxNC42Njc1MzMzLDcuNjY0MTI5MzMgTDE2LDcuNjY0MTI5MzMgTDEzLjg2Njg5MSwxMC44NjM5MzM5IEwxMS43MzM3ODIxLDcuNjY0MTI5MzMgTDEzLjA2NzQ4NjMsNy42NjQxMjkzMyBDMTMuMDY3NDg2Myw2LjQ0NzYyNDEgMTIuNjM0NTY3NCw1LjMyOTMyMTM5IDExLjkxNTIyMzYsNC40NTU2MTY1NyBDMTEuOTEyNzAxNyw0LjQ1MTgyNjI5IDExLjkxMDIxMSw0LjQ0NjgzMDAyIDExLjkwNjQ4MjksNC40NDMxMDI0IEMxMS4zOTcyNzgxLDMuODI1MTYyNjcgMTAuNzQxNzIsMy4zMzEwMzMyOCA5Ljk5NjA3NTYyLDMuMDEwODAyMjMgQzkuOTg0NzgxNTIsMy4wMDU4MDU5NiA5Ljk3MTA0MzgxLDIuOTk5NTcyMzYgOS45NTg1NDM2MiwyLjk5MzkzMzk0IEM5LjgzMzY3NTgxLDIuOTQzNDYyODYgOS43MDcyNDE5LDIuODk2OTUzODcgOS41Nzk0MzIzOCwyLjg1NDQ3NzAzIEM5LjU0MzE4NDc2LDIuODQzMjAwMTcgOS41MDgxNTkwNSwyLjgzMDA0Mzg3IDkuNDczMTMzMTQsMi44MTg4MTQgQzkuMzYwNTIxMzMsMi43ODU2NTY5NSA5LjI0NDE1MDEsMi43NTY5MTY2NyA5LjEyOTA0NzYyLDIuNzMxODg4MzIgTDguOTczOTIyMjksMi42OTU1ODMxNiBDOC44NTc1OTc5LDIuNjcyNDM0MyA4LjczNzQ5ODQ4LDIuNjU2MjA4MTcgOC42MTczOTkwNSwyLjY0MDU0NTg5IEM4LjU3MjM0OCwyLjYzNTU0OTYyIDguNTI4NTM0NDgsMi42MjkzMTYwNCA4LjQ4MjI3NzMzLDIuNjI0MzE5NzcgQzguMzM1ODkyODYsMi42MDk4NzkxNCA4LjE4ODI1NTI0LDIuNjAyMzc2OTEgOC4wMzgxMjY5NywyLjYwMTE1NTI2IEM2Ljk5MTAxOTk0LDIuNTkxNzg5MiA1Ljk2ODg2NjQyLDIuOTAyMDEyMDYgNS4wOTQzOTc0OSwzLjUxNDMxMzM3IEM0LjczMjc5ODksMy43Njg4NTY4IDQuMjMyMzY2MTMsMy42ODA2NDY4MiAzLjk4MDkzNTc3LDMuMzE4NTM0ODIgQzMuNzI2OTM2NDIsMi45NTcwMzM2NiAzLjgxNDUxNjQ2LDIuNDU3MjY1ODUgNC4xNzYwOTkzNywyLjIwNTIyODM4IEM1LjMxMDc4NjQ0LDEuNDEwOTMxMzMgNi42Mjk0MDU3LDEuMDAyNTA1OTYgOC4wMDA1NzkyNiwxIFoiIGlkPSLlvaLnirbnu5PlkIgiIGZpbGw9IiMwMDAwMDAiIGZpbGwtcnVsZT0ibm9uemVybyI+PC9wYXRoPgogICAgPC9nPgo8L3N2Zz4=);\n  background-color: black;\n}\n.gc-ai-icon.gc-ai-refresh.gc-ai-loading {\n  animation: spin 1s linear infinite;\n}\n.gc-ai-icon.gc-ai-arrow-up {\n  mask-image: url(data:image/svg+xml;charset=utf-8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iOHB4IiBoZWlnaHQ9IjhweCIgdmlld0JveD0iMCAwIDggOCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgIDx0aXRsZT5hcnJvdy11cDwvdGl0bGU+CiAgICA8ZyBpZD0iYXJyb3ctdXAiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxwb2x5Z29uIGlkPSLot6/lvoTlpIfku70tNSIgZmlsbD0iIzAwMDAwMCIgcG9pbnRzPSIwIDYgOCA2IDQgMiI+PC9wb2x5Z29uPgogICAgPC9nPgo8L3N2Zz4=);\n  background-color: black;\n  width: 8px;\n  height: 8px;\n}\n.gc-ai-icon.gc-ai-back {\n  mask-image: url(data:image/svg+xml;charset=utf-8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+YmFjazwvdGl0bGU+CiAgICA8ZyBpZD0iYmFjayIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9ImZvcm11bGFFZGl0b3JQYW5lbEJhY2siIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAuMDAwMDAwLCAyLjAwMDAwMCkiIGZpbGw9IiMwMDgwMDAiIGZpbGwtcnVsZT0ibm9uemVybyI+CiAgICAgICAgICAgIDxwb2x5Z29uIGlkPSLlvaLnirbnu5PlkIgiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDguMDAwMDAwLCA1LjcxNDI4Nikgc2NhbGUoLTEsIDEpIHRyYW5zbGF0ZSgtOC4wMDAwMDAsIC01LjcxNDI4NikgIiBwb2ludHM9IjEwLjE4NTAwOTEgMCAxNiA1LjcxNDI4NTcxIDEwLjE4NTAwOTEgMTEuNDI4NTcxNCA4LjcwNTg4MjM0IDExLjQyODU3MTQgMTQuMDczNjEzNCA2LjIyNzU0NDkxIDAgNi4yMjc1NDQ5MSAwIDUuMjAxMDI2NTEgMTQuMDczNjEzNCA1LjIwMTAyNjUxIDguNzA1ODgyMzQgMCI+PC9wb2x5Z29uPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+);\n  background-color: #2c7a50;\n  width: 20px;\n  height: 20px;\n}\n.gc-ai-icon.gc-ai-copy {\n  mask-image: url(data:image/svg+xml;charset=utf-8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+Y29weTwvdGl0bGU+CiAgICA8ZyBpZD0iY29weSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPHBhdGggZD0iTTEwLjc3NzU4ODYsNC41IEwxNC4yNSw4LjA2Nzk2OTQxIEwxNC4yNSwxNSBMNS41LDE1IEw1LjUsNC41IEwxMC43Nzc1ODg2LDQuNSBaIE05Ljg3NSw1LjM3NSBMNi4zNzUsNS4zNzUgTDYuMzc1LDE0LjEyNSBMMTMuMzc1LDE0LjEyNSBMMTMuMzc1LDguODc1IEw5Ljg3NSw4Ljg3NSBMOS44NzUsNS4zNzUgWiBNNy4yNzc1ODg1NiwxIEw5LjgzMjI4NTM2LDMuNjI1IEw4LjYxMTMwNjY3LDMuNjI1IEw3LjI1LDIuMjI2MjMxMjcgTDcuMjUsMy42MjUgTDYuMzc1LDMuNjI1IEw2LjM3NSwxLjg3NSBMMi44NzUsMS44NzUgTDIuODc1LDEwLjYyNSBMNC42MjUsMTAuNjI1IEw0LjYyNSwxMS41IEwyLDExLjUgTDIsMSBMNy4yNzc1ODg1NiwxIFogTTEyLjUsMTAuNjI1IEwxMi41LDExLjUgTDcuMjUsMTEuNSBMNy4yNSwxMC42MjUgTDEyLjUsMTAuNjI1IFogTTksOCBMOSw4Ljg3NSBMNy4yNSw4Ljg3NSBMNy4yNSw4IEw5LDggWiBNNC42MjUsNy4xMjUgTDQuNjI1LDggTDMuNzUsOCBMMy43NSw3LjEyNSBMNC42MjUsNy4xMjUgWiBNMTAuNzUsNS43MjYyMzEyNyBMMTAuNzUsOCBMMTIuOTYyODcyMyw4IEwxMC43NSw1LjcyNjIzMTI3IFogTTQuNjI1LDQuNSBMNC42MjUsNS4zNzUgTDMuNzUsNS4zNzUgTDMuNzUsNC41IEw0LjYyNSw0LjUgWiIgaWQ9IuW9oueKtue7k+WQiCIgZmlsbD0iIzAwMDAwMCIgZmlsbC1ydWxlPSJub256ZXJvIj48L3BhdGg+CiAgICA8L2c+Cjwvc3ZnPg==);\n  background-color: grey;\n  width: 17px;\n  height: 17px;\n}\n.gc-ai-icon.gc-ai-copied {\n  mask-image: url(data:image/svg+xml;charset=utf-8;base64,PHN2ZyB0PSIxNzQzMDY1MDA2MTU0IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE0NTEiIHdpZHRoPSIyMDAiIGhlaWdodD0iMjAwIj48cGF0aCBkPSJNMzgwLjM0Mjg1NyA4MDEuNjQ1NzE0YTUzLjM5NDI4NiA1My4zOTQyODYgMCAwIDEtMzYuNTcxNDI4LTE2LjA5MTQyOGwtMjE4LjMzMTQyOS0yMTcuMjM0Mjg2YTU1LjU4ODU3MSA1NS41ODg1NzEgMCAwIDEgMC03Ny4xNjU3MTQgNTQuMTI1NzE0IDU0LjEyNTcxNCAwIDAgMSA3Ni44IDBsMTc4LjEwMjg1NyAxNzkuMkw4MzUuMjkxNDI5IDI3Mi4wOTE0MjlhNTMuMzk0Mjg2IDUzLjM5NDI4NiAwIDAgMSA3Ni40MzQyODUgMCA1NC4xMjU3MTQgNTQuMTI1NzE0IDAgMCAxIDAgNzYuOEw0MTguNzQyODU3IDc4NS41NTQyODZhNTQuNDkxNDI5IDU0LjQ5MTQyOSAwIDAgMS0zOC40IDE2LjA5MTQyOHoiIHAtaWQ9IjE0NTIiPjwvcGF0aD48L3N2Zz4=);\n  background-color: grey;\n  width: 17px;\n  height: 17px;\n  cursor: default;\n}\n.gc-ai-icon.gc-ai-explain {\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjAiIGhlaWdodD0iMjAuMDAwMDAwNDc2ODM3MTU4IiB2aWV3Qm94PSIwIDAgMjAgMjAuMDAwMDAwNDc2ODM3MTU4IiBmaWxsPSJub25lIj4KPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjAiIGhlaWdodD0iMCIgZmlsbD0icmdiYSgyNDksIDI0OSwgMjQ5LCAxKSIgLz4KPHBhdGggZD0iTTAgMTBDMCA0LjQ4MTQ4IDQuNDgxNDggMCAxMCAwQzE1LjUxODUgMCAyMCA0LjQ2OTE0IDIwIDEwQzIwIDE1LjUxODUgMTUuNTE4NSAyMCAxMCAyMEM0LjQ4MTQ4IDIwIDAgMTUuNTE4NSAwIDEwWk0xMC4wMjQ3IDE4LjU1NTZDMTQuNzQwNyAxOC41NTU2IDE4LjU1NTYgMTQuNzQwNyAxOC41NTU2IDEwLjAyNDdDMTguNTU1NiA1LjUxODUyIDE0LjYxNzMgMS41MDYxNyAxMC4wMjQ3IDEuNTA2MTdDNS40ODE0OCAxLjUwNjE3IDEuNDkzODMgNS40OTM4MyAxLjQ5MzgzIDEwLjAyNDdDMS40OTM4MyAxNC43NDA3IDUuMzA4NjQgMTguNTU1NiAxMC4wMjQ3IDE4LjU1NTZaIiAgIGZpbGw9IiMyQzdBNTAiID4KPC9wYXRoPgo8cGF0aCBkPSJNMTIuNzY1NSA5LjUxODUzQzEzLjE4NTIgOC45NzUzMiAxMy4zMjEgOC40MTk3NiAxMy4zMjEgNy43NjU0NEMxMy4zMjEgNi44NzY1NSAxMy4wMTI0IDYuMDg2NDMgMTIuNDY5MiA1LjU5MjZDMTEuOTAxMyA1LjAxMjM2IDExLjA2MTggNC42NTQzMyAxMC4xMzU5IDQuNjU0MzNDOS4wOTg4MiA0LjY1NDMzIDguMjM0NjIgNS4wODY0MyA3LjYxNzMzIDUuODE0ODJDNy4wNjE3OCA2LjQ0NDQ1IDYuNzc3ODMgNy4zMjEgNi43Nzc4MyA4LjMzMzM0TDguMDYxNzggOC4zNDU2OUM4LjA2MTc4IDcuNjQxOTkgOC4yNTkzMSA3LjA3NDA4IDguNTgwMyA2LjY2NjY4QzguOTI1OTggNi4xODUyIDkuNDA3NDYgNS45MzgyOCAxMC4xMzU5IDUuOTM4MjhDMTAuNzQwOCA1LjkzODI4IDExLjIyMjMgNi4wOTg3OCAxMS41NTU2IDYuNDQ0NDVDMTEuODc2NiA2Ljc2NTQ0IDEyLjA0OTQgNy4yMDk4OSAxMi4wNDk0IDcuNzkwMTNDMTIuMDQ5NCA4LjE5NzU0IDExLjkwMTMgOC41Njc5MSAxMS42MTczIDguOTM4MjhDMTEuNTMwOSA5LjA0OTM5IDExLjM4MjggOS4xNzI4NSAxMS4xMjM1IDkuNDU2OEMxMC4zNDU3IDEwLjE3MjggOS44NjQyNSAxMC43MDM3IDkuNjY2NzIgMTEuMTM1OEM5LjQ5Mzg4IDExLjQ5MzggOS4zOTUxMSAxMS44NjQyIDkuMzk1MTEgMTIuNDA3NEw5LjM5NTExIDEyLjc0MDdMMTAuNjQyIDEyLjc0MDdMMTAuNjQyIDEyLjQwNzRDMTAuNjY2NyAxMiAxMC43MTYxIDExLjY3OSAxMC45MDEzIDExLjM1OEMxMS4wNzQxIDExLjExMTEgMTEuMjg0IDEwLjg3NjUgMTEuNjA1IDEwLjYwNDlDMTIuMjQ3IDEwLjAzNyAxMi42MTczIDkuNjkxMzcgMTIuNzY1NSA5LjUxODUzWk0xMC43NTMxIDE0LjAxMjNDMTAuNTU1NiAxMy44MTQ4IDEwLjMyMSAxMy43NDA3IDEwLjA2MTggMTMuNzQwN0M5Ljc5MDE3IDEzLjc0MDcgOS41Njc5NSAxMy44MTQ4IDkuMzgyNzcgMTQuMDEyM0M5LjE5NzU4IDE0LjE4NTIgOS4xMTExNiAxNC40MDc0IDkuMTExMTYgMTQuNjc5QzkuMTExMTYgMTQuOTUwNiA5LjE4NTI0IDE1LjE3MjggOS4zODI3NyAxNS4zNThDOS41Njc5NSAxNS41MzA5IDkuNzkwMTcgMTUuNjI5NiAxMC4wNjE4IDE1LjYyOTZDMTAuMzMzNCAxNS42Mjk2IDEwLjU1NTYgMTUuNTMwOSAxMC43NDA4IDE1LjM1OEMxMC45MjYgMTUuMTg1MiAxMS4wMjQ3IDE0Ljk2MyAxMS4wMjQ3IDE0LjY3OUMxMS4wMjQ3IDE0LjQwNzQgMTAuOTI2IDE0LjE4NTIgMTAuNzUzMSAxNC4wMTIzWiIgICBmaWxsPSIjMkM3QTUwIiA+CjwvcGF0aD4KPC9zdmc+Cg==);\n}\n\n.gc-ai-icon-disabled:hover {\n  transform: scale(1);\n}\n.gc-ai-icon-disabled .gc-ai-icon:hover {\n  transform: scale(1);\n}\n\n/* 定义旋转动画 */\n@keyframes spin {\n  from {\n    transform: rotate(0deg);\n  }\n  to {\n    transform: rotate(360deg);\n  }\n}\n.gc-ai-icon-background {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  width: 20px;\n  height: 20px;\n  border-radius: 50%;\n  background-color: #2c7a50;\n}\n.gc-ai-icon-background.gc-ai-icon-disabled {\n  background-color: lightgrey;\n  cursor: default;\n}\n.gc-ai-icon-background.gc-ai-icon-disabled .gc-ai-icon {\n  background-color: white;\n  cursor: default;\n}\n\n.gc-ai-text-container {\n  position: relative;\n  min-height: 64px;\n  border: 1px solid #ddd;\n  padding: 5px;\n  box-sizing: border-box;\n  font-size: 12px;\n  cursor: text;\n  background-color: #FDFDFD;\n  color: black;\n  width: 100%;\n}\n\n.gc-ai-text {\n  user-select: none;\n  outline: none;\n  overflow-y: auto;\n  overflow-x: hidden;\n  min-height: 48px;\n  max-height: 120px;\n  white-space: normal;\n  word-wrap: break-word;\n  word-break: break-word;\n  overflow-wrap: break-word;\n}\n.gc-ai-text::-webkit-scrollbar {\n  width: 4px;\n  height: 6px;\n  cursor: pointer;\n}\n.gc-ai-text::-webkit-scrollbar-thumb {\n  border-radius: 10px;\n  background-color: rgb(203, 203, 203);\n  cursor: pointer;\n}\n.gc-ai-text::-webkit-scrollbar-thumb:hover {\n  background-color: rgb(153, 153, 153);\n}\n\n.gc-ai-text:empty::before {\n  content: attr(placeholder);\n  color: grey;\n}\n\n.gc-ai-text-container-icons {\n  display: flex;\n  align-items: center;\n  justify-content: flex-end;\n  margin-top: 5px;\n  padding: 5px 10px;\n}\n\n.gc-ai-separator {\n  width: 1px;\n  height: 24px;\n  background: #ddd;\n  margin: 0 7px;\n}\n\n.gc-ai-loading-mask {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background-color: rgba(241, 241, 241, 0.5);\n  pointer-events: auto;\n  z-index: 9999;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n.gc-ai-loading-mask .gc-ai-spinner {\n  width: 40px;\n  height: 40px;\n  border: 4px solid #fff;\n  border-top-color: transparent;\n  border-radius: 50%;\n  animation: spin 1s linear infinite;\n}\n\n.gc-ai-error-overlay {\n  position: fixed;\n  top: 0px;\n  left: 0px;\n  width: 100%;\n  height: 100%;\n  z-index: 9999;\n}\n\n.gc-ai-error-dialog {\n  position: absolute;\n  background-color: rgb(255, 255, 255);\n  padding: 12px;\n  border-radius: 8px;\n  box-shadow: rgba(0, 0, 0, 0.2) 0px 4px 8px;\n  max-width: 400px;\n  overflow-wrap: break-word;\n  text-align: center;\n  font-size: 14.6667px;\n  font-family: Consolas, Menlo, Monaco, \"Courier New\", monospace;\n}\n\n.gc-ai-text-header {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  height: 44px;\n  white-space: nowrap;\n  overflow: hidden;\n}\n\n.gc-ai-text-header-left {\n  display: flex;\n  align-items: center;\n  margin-left: 5px;\n  gap: 5px;\n}\n\n.gc-ai-text-header-left img {\n  width: 24px;\n  height: 24px;\n  margin-right: 8px;\n}\n\n.gc-ai-text-header-title {\n  font-size: 13px;\n  font-weight: bold;\n  font-family: \"PingFangSC-Semibold\", \"PingFang SC Semibold\", \"PingFang SC\", sans-serif;\n}\n\n.gc-ai-text-header-right img {\n  width: 20px;\n  height: 20px;\n  cursor: pointer;\n}\n\n.gc-ai-hide {\n  display: none;\n}\n\n.gc-ai-pt-capsule {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  width: 65px;\n  height: 25px;\n  border-radius: 25px;\n  background-color: white;\n  position: absolute;\n  top: 16px;\n  right: 10px;\n  overflow: hidden;\n}\n\n.gc-ai-pt-capsule::before {\n  content: \"\";\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  border-radius: 25px;\n  padding: 2px;\n  /* 边框宽度 */\n  background: linear-gradient(to right, #bc34fe, #272dfe);\n  mask: linear-gradient(white 0 0) content-box, linear-gradient(white 0 0);\n  -webkit-mask: linear-gradient(white 0 0) content-box, linear-gradient(white 0 0);\n  -webkit-mask-composite: destination-out;\n  mask-composite: exclude;\n}\n\n.gc-ai-pt-button {\n  flex: 1;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  font-family: sans-serif;\n  font-size: 18px;\n  font-weight: bold;\n  color: #333;\n  cursor: pointer;\n  z-index: 1;\n  /* 确保按钮在伪元素之上 */\n  position: relative;\n  /* 为倾斜分隔线定位 */\n}\n\n.gc-ai-pt-button:not(:last-child)::after {\n  content: \"\";\n  position: absolute;\n  right: -2px;\n  top: 1px;\n  bottom: 1px;\n  width: 1px;\n  background-color: #6535fe;\n  /* 分隔线颜色 */\n  transform: skewX(-15deg);\n  /* 倾斜分隔线 */\n  transform-origin: center;\n  /* 确保倾斜以中心为基准 */\n}\n\n.gc-ai-pt-gen {\n  padding: 5px 10px;\n  color: black;\n}\n\n.gc-ai-pt-gen-spinner-line {\n  width: 100%;\n  height: 1px;\n  background: #CBCBCB;\n}\n\n.gc-ai-pt-sug-container {\n  position: relative;\n  margin-top: 7px;\n  border: 1px solid #ddd;\n  padding: 5px;\n  cursor: pointer;\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  user-select: none;\n  background-color: #FDFDFD;\n  border-radius: 5px;\n  color: black;\n}\n\n.gc-ai-pt-sug-dropdown {\n  display: none;\n  position: absolute;\n  bottom: 35px;\n  width: 96%;\n  left: 2%;\n  border: 1px solid #ddd;\n  background: #fff;\n  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);\n  z-index: 9999;\n  border-radius: 5px;\n  background-color: #FDFDFD;\n}\n\n.gc-ai-pt-sug-dropdown-header {\n  display: flex;\n  justify-content: flex-end;\n  padding: 5px;\n}\n\n.gc-ai-pt-sug-dropdown-header img {\n  width: 16px;\n  height: 16px;\n  cursor: pointer;\n}\n\n.gc-ai-pt-sug-item-container {\n  color: black;\n}\n\n.gc-ai-pt-sug-item {\n  padding: 6px 3px;\n  border: 1px solid #ababab;\n  cursor: pointer;\n  transition: background 0.3s;\n  margin: 6px 4px;\n  border-radius: 5px;\n  background-color: #FDFDFD;\n}\n\n.gc-ai-pt-sug-item:hover {\n  background: white;\n}\n\n.gc-ai-pt-ana {\n  width: 100%;\n  margin: 10px;\n  display: flex;\n  flex-direction: column;\n  color: black;\n}\n.gc-ai-pt-ana .gc-ai-text-container {\n  color: black;\n  min-height: 110px;\n}\n.gc-ai-pt-ana .gc-ai-text-container .gc-ai-text-container-icons {\n  margin-top: 4px;\n  padding: 0px 10px;\n}\n.gc-ai-pt-ana .gc-ai-text-container .gc-ai-text {\n  min-height: 75px;\n  max-height: 75px;\n}\n\n.gc-ai-pt-analyze-container {\n  display: flex;\n  flex-grow: 1;\n  flex-direction: column;\n  position: relative;\n  border: 1px solid #ddd;\n  padding: 5px;\n  box-sizing: border-box;\n  font-size: 12px;\n  cursor: text;\n  background-color: #FDFDFD;\n  color: black;\n  border-radius: 10px;\n  margin-top: 10px;\n  overflow-y: auto;\n}\n.gc-ai-pt-analyze-container .gc-ai-text {\n  min-height: 200px;\n  max-height: none;\n  height: calc(100% - 40px);\n  user-select: auto;\n}\n.gc-ai-pt-analyze-container .gc-ai-icon-background {\n  width: 20px;\n  height: 20px;\n  background-color: #FDFDFD;\n  border: 1px solid grey;\n}\n\n.gc-ai-pt-analyze-buttons {\n  margin: 10px 5px;\n  width: calc(100% - 18px);\n}\n\n.gc-ai-formula-editor-container {\n  height: 100%;\n  transition: height 0.3s ease;\n  position: relative;\n}\n\n.gc-ai-open-button {\n  cursor: pointer;\n  width: 45px;\n  height: 45px;\n  position: absolute;\n  bottom: 32px;\n  right: 32px;\n  z-index: 1000;\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNDVweCIgaGVpZ2h0PSI0NXB4IiB2aWV3Qm94PSIwIDAgNDUgNDUiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+QUkgSWNvbjwvdGl0bGU+CiAgICA8ZGVmcz4KICAgICAgICA8bGluZWFyR3JhZGllbnQgeDE9IjI3LjYwMjY3MjYlIiB5MT0iMCUiIHgyPSI3NC4wMDMzMTUlIiB5Mj0iOTAuNTgxNzAzMiUiIGlkPSJsaW5lYXJHcmFkaWVudC0xIj4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0I1MjZGRiIgb2Zmc2V0PSIwJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMjIyM0ZGIiBvZmZzZXQ9IjEwMCUiPjwvc3RvcD4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iNTkuOTg0ODgwOCUiIHkxPSIzNi45NjI0MjY0JSIgeDI9IjE1MC42ODAxMzYlIiB5Mj0iOTMuNTk3NzA5NSUiIGlkPSJsaW5lYXJHcmFkaWVudC0yIj4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0IzMjZGRiIgb2Zmc2V0PSIwJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMjcyM0ZGIiBvZmZzZXQ9IjEwMCUiPjwvc3RvcD4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iNDIuODc2NjI2JSIgeTE9IjQuNzE2OTQ0NjklIiB4Mj0iNjAuNjc5MjYzMiUiIHkyPSIxMDAlIiBpZD0ibGluZWFyR3JhZGllbnQtMyI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNCODI2RkUiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzI1MjJGRSIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMxQzIyRkUiIG9mZnNldD0iMTAwJSI+PC9zdG9wPgogICAgICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICAgICAgPGxpbmVhckdyYWRpZW50IHgxPSI1MCUiIHkxPSIwJSIgeDI9IjUwJSIgeTI9IjEwMCUiIGlkPSJsaW5lYXJHcmFkaWVudC00Ij4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0I3MjZGRiIgb2Zmc2V0PSIwJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMUYyM0ZGIiBvZmZzZXQ9IjEwMCUiPjwvc3RvcD4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iNDMuMjY0MzgzMyUiIHkxPSIxMi45OTcxOTgxJSIgeDI9IjY2LjIyNDE3MDMlIiB5Mj0iMTAwJSIgaWQ9ImxpbmVhckdyYWRpZW50LTUiPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjQjYyNkZGIiBvZmZzZXQ9IjAlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMyNTIzRkYiIG9mZnNldD0iMTAwJSI+PC9zdG9wPgogICAgICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8L2RlZnM+CiAgICA8ZyBpZD0iQUktSWNvbiIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9Iue8lue7hCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMy4wMDAwMDAsIDIuMDAwMDAwKSI+CiAgICAgICAgICAgIDxjaXJjbGUgaWQ9IuakreWchuW9oiIgc3Ryb2tlPSJ1cmwoI2xpbmVhckdyYWRpZW50LTEpIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9IiNGRkZGRkYiIGN4PSIyMCIgY3k9IjIwIiByPSIxOSI+PC9jaXJjbGU+CiAgICAgICAgICAgIDxnIGlkPSLnvJbnu4QtOeWkh+S7vSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNi4wMDAwMDAsIDEzLjAwMDAwMCkiPgogICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9Iui3r+W+hC01IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTIpIiBwb2ludHM9IjguMTUwOTQzNCA4LjYwMzc3MzU4IDUuNTg0OTA1NjYgMTIuMjI2NDE1MSAxMi42NzkyNDUzIDEyLjIyNjQxNTEgMTIuMjI2NDE1MSA4LjYwMzc3MzU4Ij48L3BvbHlnb24+CiAgICAgICAgICAgICAgICA8cG9seWdvbiBpZD0i6Lev5b6ELTQiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQtMykiIHBvaW50cz0iMTIuODMwMTg4NyAxNC43OTI0NTI4IDE3LjY2MDM3NzQgMTQuNzkyNDUyOCAxNS45MjM4NDQ1IDEuNzAxNjY2NTcgMTUuODY4NTI1MiAxLjI4NDY0NDI1IDExLjk1MzgwNzEgNi42NTQ2MjQxNyAxMS45ODU3MDAzIDYuOTUwNzc1MTMiPjwvcG9seWdvbj4KICAgICAgICAgICAgICAgIDxwb2x5Z29uIGlkPSLot6/lvoQtMiIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudC00KSIgcG9pbnRzPSIwIDE0Ljc5MjQ1MjggNS4xMzIwNzU0NyAxNC43OTI0NTI4IDE1LjY5ODExMzIgMCAxMC43MTY5ODExIDAiPjwvcG9seWdvbj4KICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8cG9seWdvbiBpZD0i6Lev5b6ELTPlpIfku70iIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQtNSkiIHBvaW50cz0iMjQuNzkyNDUyOCAyNy43OTI0NTI4IDI5Ljc3MzU4NDkgMjcuNzkyNDUyOCAzNCAxMyAyOS4wMTg4Njc5IDEzIj48L3BvbHlnb24+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=);\n  background-position: center;\n  background-repeat: no-repeat;\n  background-size: contain;\n  display: none;\n}\n\n.gc-ai-assistant-area {\n  height: 0;\n  position: relative;\n  overflow: hidden;\n  padding: 2px;\n  bottom: 0px;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  border-top: 1px solid rgb(203, 203, 203);\n  transition: height 0.3s ease;\n  background-clip: content-box;\n  -webkit-font-smoothing: antialiased;\n  text-rendering: optimizeLegibility;\n}\n.gc-ai-assistant-area .gc-ai-text-container {\n  background-clip: content-box;\n  -webkit-font-smoothing: antialiased;\n  text-rendering: optimizeLegibility;\n  color: inherit;\n  font-size: inherit;\n  background-color: inherit;\n}\n.gc-ai-assistant-area .gc-ai-text {\n  height: 100px;\n  min-height: 100px;\n  max-height: 100px;\n}\n\n.gc-ai-resize-handle {\n  cursor: grab;\n  width: 12px;\n  height: 6px;\n  flex-shrink: 0;\n  background-image: url(data:image/svg+xml;base64,77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjxzdmcgdmVyc2lvbj0iMS4xIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjEwcHgiIGhlaWdodD0iNXB4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPg0KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAxIC0yNTcgLTQgKSI+DQogICAgPHBhdGggZD0iTSAxIDAgIEMgMC40NDc3MTUyNTAxOTk5OTEwMyAwICAwIDAuNDQ3NzE1MjUwMjAwMDA1MjQgIDAgMSAgQyAwIDEuNTUyMjg0NzQ5Nzk5OTk0OCAgMC40NDc3MTUyNTAxOTk5OTEwMyAyICAxIDIgIEMgMS41NTIyODQ3NDk4MDAwMDkgMiAgMiAxLjU1MjI4NDc0OTc5OTk5NDggIDIgMSAgQyAyIDAuNDQ3NzE1MjUwMjAwMDA1MjQgIDEuNTUyMjg0NzQ5ODAwMDA5IDAgIDEgMCAgWiBNIDEgMyAgQyAwLjQ0NzcxNTI1MDE5OTk5MTAzIDMgIDAgMy40NDc3MTUyNTAyMDAwMDUyICAwIDQgIEMgMCA0LjU1MjI4NDc0OTc5OTk5NSAgMC40NDc3MTUyNTAxOTk5OTEwMyA1ICAxIDUgIEMgMS41NTIyODQ3NDk4MDAwMDkgNSAgMiA0LjU1MjI4NDc0OTc5OTk5NSAgMiA0ICBDIDIgMy40NDc3MTUyNTAyMDAwMDUyICAxLjU1MjI4NDc0OTgwMDAwOSAzICAxIDMgIFogTSA0IDEgIEMgNCAxLjU1MjI4NDc0OTc5OTk5NDggIDQuNDQ3NzE1MjUwMTk5OTkxIDIgIDUgMiAgQyA1LjU1MjI4NDc0OTgwMDAwOSAyICA2IDEuNTUyMjg0NzQ5Nzk5OTk0OCAgNiAxICBDIDYgMC40NDc3MTUyNTAyMDAwMDUyNCAgNS41NTIyODQ3NDk4MDAwMDkgMCAgNSAwICBDIDQuNDQ3NzE1MjUwMTk5OTkxIDAgIDQgMC40NDc3MTUyNTAyMDAwMDUyNCAgNCAxICBaIE0gNSA1ICBDIDUuNTUyMjg0NzQ5ODAwMDA5IDUgIDYgNC41NTIyODQ3NDk3OTk5OTUgIDYgNCAgQyA2IDMuNDQ3NzE1MjUwMjAwMDA1MiAgNS41NTIyODQ3NDk4MDAwMDkgMyAgNSAzICBDIDQuNDQ3NzE1MjUwMTk5OTkxIDMgIDQgMy40NDc3MTUyNTAyMDAwMDUyICA0IDQgIEMgNCA0LjU1MjI4NDc0OTc5OTk5NSAgNC40NDc3MTUyNTAxOTk5OTEgNSAgNSA1ICBaIE0gMTAgMSAgQyAxMCAwLjQ0NzcxNTI1MDIwMDAwNTI0ICA5LjU1MjI4NDc0OTgwMDAwOSAwICA5IDAgIEMgOC40NDc3MTUyNTAxOTk5OTEgMCAgOCAwLjQ0NzcxNTI1MDIwMDAwNTI0ICA4IDEgIEMgOCAxLjU1MjI4NDc0OTc5OTk5NDggIDguNDQ3NzE1MjUwMTk5OTkxIDIgIDkgMiAgQyA5LjU1MjI4NDc0OTgwMDAwOSAyICAxMCAxLjU1MjI4NDc0OTc5OTk5NDggIDEwIDEgIFogTSA5IDMgIEMgOC40NDc3MTUyNTAxOTk5OTEgMyAgOCAzLjQ0NzcxNTI1MDIwMDAwNTIgIDggNCAgQyA4IDQuNTUyMjg0NzQ5Nzk5OTk1ICA4LjQ0NzcxNTI1MDE5OTk5MSA1ICA5IDUgIEMgOS41NTIyODQ3NDk4MDAwMDkgNSAgMTAgNC41NTIyODQ3NDk3OTk5OTUgIDEwIDQgIEMgMTAgMy40NDc3MTUyNTAyMDAwMDUyICA5LjU1MjI4NDc0OTgwMDAwOSAzICA5IDMgIFogIiBmaWxsLXJ1bGU9Im5vbnplcm8iIGZpbGw9IiM5Njk2OTYiIHN0cm9rZT0ibm9uZSIgdHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgMSAyNTcgNCApIiAvPg0KICA8L2c+DQo8L3N2Zz4=);\n  background-position: center;\n  background-repeat: no-repeat;\n  background-size: contain;\n}\n\n.gc-ai-formula-generator-container {\n  width: 100%;\n  height: 100%;\n}\n.gc-ai-formula-generator-container .gc-ai-formula-generator-button-container {\n  width: 20px;\n  height: 20px;\n}\n.gc-ai-formula-generator-container .gc-ai-refresh {\n  width: 20px;\n  height: 20px;\n  background-color: rgb(44, 122, 80);\n  position: absolute;\n}\n.gc-ai-formula-generator-container .gc-ai-icon-background {\n  width: 20px;\n  height: 20px;\n  position: absolute;\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCAyMCAyMCIgZmlsbD0ibm9uZSI+CjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIwIiBoZWlnaHQ9IjAiIGZpbGw9InJnYmEoMjQ5LCAyNDksIDI0OSwgMSkiIC8+CjxwYXRoIGQ9Ik0wIDEwQzAgMTUuNTIyOCA0LjQ3NzE1IDIwIDEwIDIwQzE1LjUyMjggMjAgMjAgMTUuNTIyOCAyMCAxMEMyMCA0LjQ3NzE1IDE1LjUyMjggMCAxMCAwQzQuNDc3MTUgMCAwIDQuNDc3MTUgMCAxMFoiICAgZmlsbD0iIzJDN0E1MCIgPgo8L3BhdGg+CjxwYXRoIGQ9Ik0xMC40MTkyIDEwLjEwMUw2LjU1NzIgMTAuNzQ0OUM2LjQ2Njg0IDEwLjc2IDYuMzkxMzggMTAuODIyMSA2LjM1OTI5IDEwLjkwNzlMNS4wMjcxOCAxNC40NzQ2QzQuOTAwMDIgMTQuODAyNyA1LjI0MzA0IDE1LjExNTQgNS41NTc4NyAxNC45NThMMTQuNzg3MiAxMC4zNDRDMTQuOTE3NiAxMC4yNzg5IDE1IDEwLjE0NTcgMTUgMTBDMTUgOS44NTQyOSAxNC45MTc2IDkuNzIxMDkgMTQuNzg3MiA5LjY1Nkw1LjU1Nzg3IDUuMDQxOTZDNS4yNDMwNCA0Ljg4NDU3IDQuOTAwMDIgNS4xOTczIDUuMDI3MTggNS41MjU0MUw2LjM1OTggOS4wOTIwNkM2LjM5MTc1IDkuMTc4MDYgNi40NjcyMyA5LjI0MDQzIDYuNTU3NzIgOS4yNTU2TDEwLjQxOTcgOS44OTlDMTAuNDY4OCA5LjkwNzYgMTAuNTA0NSA5Ljk1MDIgMTAuNTA0NSAxMEMxMC41MDQ1IDEwLjA0OTggMTAuNDY4OCAxMC4wOTI0IDEwLjQxOTcgMTAuMTAxTDEwLjQxOTIgMTAuMTAxWiIgICBmaWxsPSIjRkZGRkZGIiA+CjwvcGF0aD4KPC9zdmc+Cg==);\n}\n.gc-ai-formula-generator-container .gc-ai-icon-background,\n.gc-ai-formula-generator-container .gc-ai-refresh {\n  transition: opacity 0.3s ease, transform 0.3s ease;\n  opacity: 0;\n  transform: scale(0.9);\n  pointer-events: none;\n}\n.gc-ai-formula-generator-container .gc-ai-icon-background.show,\n.gc-ai-formula-generator-container .gc-ai-refresh.show {\n  opacity: 1;\n  transform: scale(1);\n  pointer-events: auto;\n}\n.gc-ai-formula-generator-container .gc-ai-icon-background.show:hover,\n.gc-ai-formula-generator-container .gc-ai-refresh.show:hover {\n  transform: scale(1.1);\n}\n\n.gc-ai-formula-explain-container {\n  width: 100%;\n  height: 100%;\n}\n\n.gc-ai-formula-explain-content {\n  padding: 4px;\n  height: calc(100% - 56px);\n  max-height: calc(100% - 56px);\n  width: calc(100% - 36px);\n  margin: auto;\n  overflow-y: scroll;\n}\n.gc-ai-formula-explain-content::-webkit-scrollbar {\n  width: 4px;\n  height: 6px;\n  cursor: pointer;\n}\n.gc-ai-formula-explain-content::-webkit-scrollbar-thumb {\n  border-radius: 10px;\n  background-color: rgb(203, 203, 203);\n  cursor: pointer;\n}\n.gc-ai-formula-explain-content::-webkit-scrollbar-thumb:hover {\n  background-color: rgb(153, 153, 153);\n}\n\n.gc-ai-formula-explain-button-container {\n  position: absolute;\n  bottom: 24px;\n  right: 24px;\n  border: none;\n  cursor: pointer;\n  z-index: 1000;\n  width: 30px;\n  height: 30px;\n}\n.gc-ai-formula-explain-button-container .gc-ai-formula-explain-button {\n  width: 30px;\n  height: 30px;\n  position: absolute;\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjAiIGhlaWdodD0iMjAuMDAwMDAwNDc2ODM3MTU4IiB2aWV3Qm94PSIwIDAgMjAgMjAuMDAwMDAwNDc2ODM3MTU4IiBmaWxsPSJub25lIj4KPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjAiIGhlaWdodD0iMCIgZmlsbD0icmdiYSgyNDksIDI0OSwgMjQ5LCAxKSIgLz4KPHBhdGggZD0iTTAgMTBDMCA0LjQ4MTQ4IDQuNDgxNDggMCAxMCAwQzE1LjUxODUgMCAyMCA0LjQ2OTE0IDIwIDEwQzIwIDE1LjUxODUgMTUuNTE4NSAyMCAxMCAyMEM0LjQ4MTQ4IDIwIDAgMTUuNTE4NSAwIDEwWk0xMC4wMjQ3IDE4LjU1NTZDMTQuNzQwNyAxOC41NTU2IDE4LjU1NTYgMTQuNzQwNyAxOC41NTU2IDEwLjAyNDdDMTguNTU1NiA1LjUxODUyIDE0LjYxNzMgMS41MDYxNyAxMC4wMjQ3IDEuNTA2MTdDNS40ODE0OCAxLjUwNjE3IDEuNDkzODMgNS40OTM4MyAxLjQ5MzgzIDEwLjAyNDdDMS40OTM4MyAxNC43NDA3IDUuMzA4NjQgMTguNTU1NiAxMC4wMjQ3IDE4LjU1NTZaIiAgIGZpbGw9IiMyQzdBNTAiID4KPC9wYXRoPgo8cGF0aCBkPSJNMTIuNzY1NSA5LjUxODUzQzEzLjE4NTIgOC45NzUzMiAxMy4zMjEgOC40MTk3NiAxMy4zMjEgNy43NjU0NEMxMy4zMjEgNi44NzY1NSAxMy4wMTI0IDYuMDg2NDMgMTIuNDY5MiA1LjU5MjZDMTEuOTAxMyA1LjAxMjM2IDExLjA2MTggNC42NTQzMyAxMC4xMzU5IDQuNjU0MzNDOS4wOTg4MiA0LjY1NDMzIDguMjM0NjIgNS4wODY0MyA3LjYxNzMzIDUuODE0ODJDNy4wNjE3OCA2LjQ0NDQ1IDYuNzc3ODMgNy4zMjEgNi43Nzc4MyA4LjMzMzM0TDguMDYxNzggOC4zNDU2OUM4LjA2MTc4IDcuNjQxOTkgOC4yNTkzMSA3LjA3NDA4IDguNTgwMyA2LjY2NjY4QzguOTI1OTggNi4xODUyIDkuNDA3NDYgNS45MzgyOCAxMC4xMzU5IDUuOTM4MjhDMTAuNzQwOCA1LjkzODI4IDExLjIyMjMgNi4wOTg3OCAxMS41NTU2IDYuNDQ0NDVDMTEuODc2NiA2Ljc2NTQ0IDEyLjA0OTQgNy4yMDk4OSAxMi4wNDk0IDcuNzkwMTNDMTIuMDQ5NCA4LjE5NzU0IDExLjkwMTMgOC41Njc5MSAxMS42MTczIDguOTM4MjhDMTEuNTMwOSA5LjA0OTM5IDExLjM4MjggOS4xNzI4NSAxMS4xMjM1IDkuNDU2OEMxMC4zNDU3IDEwLjE3MjggOS44NjQyNSAxMC43MDM3IDkuNjY2NzIgMTEuMTM1OEM5LjQ5Mzg4IDExLjQ5MzggOS4zOTUxMSAxMS44NjQyIDkuMzk1MTEgMTIuNDA3NEw5LjM5NTExIDEyLjc0MDdMMTAuNjQyIDEyLjc0MDdMMTAuNjQyIDEyLjQwNzRDMTAuNjY2NyAxMiAxMC43MTYxIDExLjY3OSAxMC45MDEzIDExLjM1OEMxMS4wNzQxIDExLjExMTEgMTEuMjg0IDEwLjg3NjUgMTEuNjA1IDEwLjYwNDlDMTIuMjQ3IDEwLjAzNyAxMi42MTczIDkuNjkxMzcgMTIuNzY1NSA5LjUxODUzWk0xMC43NTMxIDE0LjAxMjNDMTAuNTU1NiAxMy44MTQ4IDEwLjMyMSAxMy43NDA3IDEwLjA2MTggMTMuNzQwN0M5Ljc5MDE3IDEzLjc0MDcgOS41Njc5NSAxMy44MTQ4IDkuMzgyNzcgMTQuMDEyM0M5LjE5NzU4IDE0LjE4NTIgOS4xMTExNiAxNC40MDc0IDkuMTExMTYgMTQuNjc5QzkuMTExMTYgMTQuOTUwNiA5LjE4NTI0IDE1LjE3MjggOS4zODI3NyAxNS4zNThDOS41Njc5NSAxNS41MzA5IDkuNzkwMTcgMTUuNjI5NiAxMC4wNjE4IDE1LjYyOTZDMTAuMzMzNCAxNS42Mjk2IDEwLjU1NTYgMTUuNTMwOSAxMC43NDA4IDE1LjM1OEMxMC45MjYgMTUuMTg1MiAxMS4wMjQ3IDE0Ljk2MyAxMS4wMjQ3IDE0LjY3OUMxMS4wMjQ3IDE0LjQwNzQgMTAuOTI2IDE0LjE4NTIgMTAuNzUzMSAxNC4wMTIzWiIgICBmaWxsPSIjMkM3QTUwIiA+CjwvcGF0aD4KPC9zdmc+Cg==);\n  background-position: center;\n  background-repeat: no-repeat;\n  background-size: contain;\n}\n.gc-ai-formula-explain-button-container .gc-ai-refresh {\n  width: 30px;\n  height: 30px;\n  background-color: rgb(44, 122, 80);\n  position: absolute;\n}\n.gc-ai-formula-explain-button-container .gc-ai-formula-explain-button,\n.gc-ai-formula-explain-button-container .gc-ai-refresh {\n  transition: opacity 0.3s ease, transform 0.3s ease;\n  opacity: 0;\n  transform: scale(0.9);\n  pointer-events: none;\n}\n.gc-ai-formula-explain-button-container .gc-ai-formula-explain-button.show,\n.gc-ai-formula-explain-button-container .gc-ai-refresh.show {\n  opacity: 1;\n  transform: scale(1);\n  pointer-events: auto;\n}\n.gc-ai-formula-explain-button-container .gc-ai-formula-explain-button.show:hover,\n.gc-ai-formula-explain-button-container .gc-ai-refresh.show:hover {\n  transform: scale(1.1);\n}\n\n/* Base Style */\n/* Tools */\n/* Component */\n/* Layout */\n.gc-drop-down-list {\n  box-shadow: rgba(0, 0, 0, 0.4) 1px 2px 5px;\n  background: #fcfdfd;\n  -ms-overflow-style: none;\n  scrollbar-width: none;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n}\n\n.gc-drop-down-list::-webkit-scrollbar {\n  display: none; /* Chrome Safari */\n}\n\n.gc-drop-down-list-span {\n  display: block;\n  margin: 1px 0px 0px 30px;\n  border-bottom: 1px solid #e1dfdd;\n}\n\n.gc-drop-down-list-block {\n  background: #fcfdfd;\n  color: #444444;\n}\n\n.gc-drop-down-list-item {\n  height: 21px;\n  margin-bottom: 1px;\n  border: 1px solid rgba(0, 0, 0, 0);\n  white-space: nowrap;\n  line-height: 21px;\n}\n\n.gc-drop-down-list-icon {\n  width: 16px;\n  height: 16px;\n  display: inline-block;\n  margin: 3px 0px 0px 3px;\n}\n\n.gc-drop-down-list-link {\n  padding: 0 15px 0 0;\n  display: inline-block;\n  letter-spacing: 0.2px;\n  font-size: 12px;\n  vertical-align: top;\n  margin-left: 3px;\n  white-space: nowrap;\n}\n\n.gc-drop-down-list-link-hover:hover {\n  background-image: none;\n  background-color: #d3f0e0;\n}\n\n.selectable-item:focus {\n  background-image: none;\n  background-color: #d3f0e0;\n  outline: none;\n}\n\n.filter-dialog-container .selectable-item:focus,\n.filter-value-dialog-container .selectable-item:focus,\n.filter-top-ten-container .selectable-item:focus,\n.filter-date-dialog-container .selectable-item:focus,\n.gc-pivot-sort-dialog-container .selectable-item:focus {\n  background-color: transparent;\n  outline: 1px solid rgb(82, 146, 247);\n}\n\n.gc-pivot-filter-selectable-item {\n  background-image: none;\n  background-color: #d3f0e0;\n}\n\n.gc-drop-down-list-item-noHover,\n.gc-Filter-list-noHover {\n  color: #b1b1b1;\n}\n\n.icon-Move-Report {\n  background-repeat: round;\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+ZmlsdGVyX2xpZ2h0PC90aXRsZT4KICAgIDxnIGlkPSJmaWx0ZXJfbGlnaHQiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxwYXRoIGQ9Ik0xMi45MzI0NzkyLDMgQzEzLjIwODYyMTYsMyAxMy40MzI0NzkyLDMuMjIzODU3NjMgMTMuNDMyNDc5MiwzLjUgQzEzLjQzMjQ3OTIsMy42MTY5NjgyNSAxMy4zOTE0NzExLDMuNzMwMjM0NyAxMy4zMTY1ODk4LDMuODIwMDkyMiBMOS4yLDguNzYgTDkuMiwxMi44IEw2LjgsMTQgTDYuOCw4Ljc2IEwyLjY4MzQxMDE3LDMuODIwMDkyMiBDMi41MDY2MjgxMywzLjYwNzk1Mzc1IDIuNTM1MjkwMTYsMy4yOTI2NzE0IDIuNzQ3NDI4NjEsMy4xMTU4ODkzNiBDMi44MzcyODYxMSwzLjA0MTAwODExIDIuOTUwNTUyNTUsMyAzLjA2NzUyMDgxLDMgTDEyLjkzMjQ3OTIsMyBaIiBpZD0iQ29tYmluZWQtU2hhcGUiIGZpbGw9IiM2OTY5NjkiPjwvcGF0aD4KICAgIDwvZz4KPC9zdmc+);\n}\n\n.icon-Move-Row {\n  background-repeat: round;\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+c2VyaWVzX2xpZ2h0PC90aXRsZT4KICAgIDxnIGlkPSJzZXJpZXNfbGlnaHQiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxwYXRoIGQ9Ik02LDMgTDYsMTMgTDMsMTMgTDMsMyBMNiwzIFogTTgsMyBMOCwxMyBMNywxMyBMNywzIEw4LDMgWiBNMTAsMyBMMTAsMTMgTDksMTMgTDksMyBMMTAsMyBaIE0xMiwzIEwxMiwxMyBMMTEsMTMgTDExLDMgTDEyLDMgWiIgaWQ9IuW9oueKtue7k+WQiCIgZmlsbD0iIzY5Njk2OSI+PC9wYXRoPgogICAgPC9nPgo8L3N2Zz4=);\n}\n\n.icon-Move-Col {\n  background-repeat: round;\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+Y2F0ZWdvcnlfbGlnaHQ8L3RpdGxlPgogICAgPGcgaWQ9ImNhdGVnb3J5X2xpZ2h0IiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8cGF0aCBkPSJNMTMsMTIgTDEzLDEzIEwzLDEzIEwzLDEyIEwxMywxMiBaIE0xMywxMCBMMTMsMTEgTDMsMTEgTDMsMTAgTDEzLDEwIFogTTEzLDggTDEzLDkgTDMsOSBMMyw4IEwxMyw4IFogTTEzLDQgTDEzLDcgTDMsNyBMMyw0IEwxMyw0IFoiIGlkPSLlvaLnirbnu5PlkIgiIGZpbGw9IiM2OTY5NjkiPjwvcGF0aD4KICAgIDwvZz4KPC9zdmc+);\n}\n\n.icon-Move-Value {\n  background-repeat: round;\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+dmFsdWVfbGlnaHQ8L3RpdGxlPgogICAgPGcgaWQ9InZhbHVlX2xpZ2h0IiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8cGF0aCBkPSJNMy40MzYyOTYyMiwzIEwxMywzIEwxMywzIEwxMyw2LjEyNSBMMTIuMjMwNzY5Miw2LjEyNSBMMTEuNDYxNTM4NSw0LjAxODQ3MzMxIEw1LjkwMzIzODkzLDQuMDE4NDczMzEgTDguOTY2Nzk2ODgsNy42ODMwMjQwOSBMNS42MjEwNTMwNiwxMS43MjI3Mzc2IEwxMS40NjE1Mzg1LDExLjcyMjczNzYgTDEyLjIzMDc2OTIsOS44NzUgTDEzLDkuODc1IEwxMywxMyBMMy40MzYyOTYyMiwxMyBDMy4zMjU4MzkyNywxMyAzLjIzNjI5NjIyLDEyLjkxMDQ1NjkgMy4yMzYyOTYyMiwxMi44IEMzLjIzNjI5NjIyLDEyLjc1MjA4MzggMy4yNTM0OTkxMiwxMi43MDU3NiAzLjI4NDc3NDQ4LDEyLjY2OTQ1ODIgTDcuMzA3NjkyMzIsOCBMNy4zMDc2OTIzMiw4IEwzLjI4NDc3NDQ4LDMuMzMwNTQxODEgQzMuMjEyNjc4MjMsMy4yNDY4NTg2NiAzLjIyMjA3MTI3LDMuMTIwNTc0NTEgMy4zMDU3NTQ0MSwzLjA0ODQ3ODI2IEMzLjM0MjA1NjE3LDMuMDE3MjAyOSAzLjM4ODM3OTk4LDMgMy40MzYyOTYyMiwzIFoiIGlkPSJTaGFwZSIgZmlsbD0iIzY5Njk2OSIgZmlsbC1ydWxlPSJub256ZXJvIj48L3BhdGg+CiAgICA8L2c+Cjwvc3ZnPg==);\n}\n\n.icon-Move-Remove {\n  background-repeat: round;\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+ZGVsZXRlX2xpZ2h0PC90aXRsZT4KICAgIDxnIGlkPSJkZWxldGVfbGlnaHQiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxwYXRoIGQ9Ik0xMy45NzczODAzLDQuNzAzMzM2NjcgQzEzLjY0MDA5NzcsNS41NzA0MTE3NCAxMS44MTkxMTgsNi40MDUwODg0OSAxMC4xNDc4ODgyLDcuNjQ2NjYzNjYgQzEwLjk3OTcwNzMsOC45NzA1MzM0NCAxMS44OTk3MzYsMTAuNzQ2MzgxMyAxMy40Mjg4OTUxLDE0IEMxMS41MTE0ODE1LDExLjc1NjU3NzQgMTAuMTAzNDIzMywxMC4zOTkzNTg3IDguNjgxNjMwNyw4LjkwMzc0MzYyIEM3LjE2ODczOTI5LDEwLjI4NzI0NzIgNi40NTA3MjAzMywxMS4wMjA5NzgxIDUuOTIzMjY4MjIsMTIuMDAxNTM2NyBDNS4zMjMwNzAzOSwxMy4xMTczMzMgNC45NzgwMjkxNiwxNC4zNzA5NjggMy44NDI1NDcyMiwxMy44MjcxMDggQzMuMDg1NTU5MjcsMTMuNDYzMzQyIDIuNDAzNDAyNSwxMi4xMDI0OTkzIDMuODQyNTQ3MjIsMTAuNjkxNTY0MiBDNS4yODE2OTE5NSw5LjI4MDYyOTA3IDYuNDA0MTU5NzYsOC4yMjYzMDM5NSA3LjIxMTAzNTE4LDcuNTI5NzgxNDcgQzYuMTExMzQyMDcsNi42Mzc2NjAyMSA1LjEyNDQzOCw2LjAyMzEwMjcxIDMuODQyNTQ3MjIsNS41NjUxMTUzMiBDMi41NjA2NTY0NCw1LjEwNzEyNzk0IDMuMTk2NjQzMTcsMy43MzU4ODA3NyAzLjUyNzQxODcxLDMuMzE0ODY2MzMgQzMuODYwMzYzMjcsMi44OTUwNDQ1NiA0LjU0NjM5NDE5LDIuODk1MDQ0NTYgNS4zNjQxMTQ3MSwzLjMxNDg2NjMzIEM2Ljk2NDg1MTQyLDQuMzMyMjE4NTEgOC4yMDAxMDgyNyw1LjMwNjYzNDM4IDkuMDczMTM4NzksNi4yMzgxMTM5MiBDMTAuOTUzNjc5MSw1LjI0MzQyMjU3IDE0LjMwNzA3MTQsMy44NTQxNTE3MyAxMy45NzczODAzLDQuNzAzMzM2NjcgWiIgaWQ9IkZpbGwtOSIgZmlsbD0iIzY5Njk2OSI+PC9wYXRoPgogICAgPC9nPgo8L3N2Zz4=);\n}\n\n.icon-Move-Setting {\n  background-repeat: round;\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+aW5mb3JfbGlnaHQ8L3RpdGxlPgogICAgPGcgaWQ9ImluZm9yX2xpZ2h0IiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0i57yW57uELTMiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEuMDAwMDAwLCAxLjAwMDAwMCkiPgogICAgICAgICAgICA8cGF0aCBkPSJNMTMsMCBMMTMuMDAxMTk5NSw2LjAwMDUzNTA2IEMxMi42OTMyOTQ2LDUuNzY5MTE0NzEgMTIuMzU3OCw1LjU3MjQyMjkzIDEyLjAwMDUzMjQsNS40MTYyNzYzNCBMMTIsMSBMMSwxIEwxLDEyIEw1LjQxNjI3NjM0LDEyLjAwMDUzMjQgQzUuNTcyNDIyOTMsMTIuMzU3OCA1Ljc2OTExNDcxLDEyLjY5MzI5NDYgNi4wMDA1MzUwNiwxMy4wMDExOTk1IEwwLDEzIEwwLDAgTDEzLDAgWiIgaWQ9IuW9oueKtue7k+WQiCIgZmlsbD0iIzY5Njk2OSI+PC9wYXRoPgogICAgICAgICAgICA8cmVjdCBpZD0i55+p5b2iIiBmaWxsPSIjQjNCM0IzIiB4PSIyIiB5PSIyIiB3aWR0aD0iMyIgaGVpZ2h0PSIzIj48L3JlY3Q+CiAgICAgICAgICAgIDxyZWN0IGlkPSLnn6nlvaLlpIfku70tOSIgZmlsbD0iI0IzQjNCMyIgeD0iMiIgeT0iNiIgd2lkdGg9IjMiIGhlaWdodD0iNSI+PC9yZWN0PgogICAgICAgICAgICA8cmVjdCBpZD0i55+p5b2i5aSH5Lu9LTgiIGZpbGw9IiNCM0IzQjMiIHg9IjYiIHk9IjIiIHdpZHRoPSI1IiBoZWlnaHQ9IjMiPjwvcmVjdD4KICAgICAgICAgICAgPHBhdGggZD0iTTEwLDYgQzEyLjIwOTEzOSw2IDE0LDcuNzkwODYxIDE0LDEwIEMxNCwxMi4yMDkxMzkgMTIuMjA5MTM5LDE0IDEwLDE0IEM3Ljc5MDg2MSwxNCA2LDEyLjIwOTEzOSA2LDEwIEM2LDcuNzkwODYxIDcuNzkwODYxLDYgMTAsNiBaIE0xMC42MjIyMjIyLDguOTMzMzMzMzMgTDkuMiw4LjkzMzMzMzMzIEw5LjIsMTMuMiBMMTAuNjIyMjIyMiwxMy4yIEwxMC42MjIyMjIyLDguOTMzMzMzMzMgWiBNOS45MTExMTExMSw2LjggQzkuNTE4Mzc1MjksNi44IDkuMiw3LjExODM3NTI5IDkuMiw3LjUxMTExMTExIEM5LjIsNy45MDM4NDY5MyA5LjUxODM3NTI5LDguMjIyMjIyMjIgOS45MTExMTExMSw4LjIyMjIyMjIyIEMxMC4zMDM4NDY5LDguMjIyMjIyMjIgMTAuNjIyMjIyMiw3LjkwMzg0NjkzIDEwLjYyMjIyMjIsNy41MTExMTExMSBDMTAuNjIyMjIyMiw3LjExODM3NTI5IDEwLjMwMzg0NjksNi44IDkuOTExMTExMTEsNi44IFoiIGlkPSLlvaLnirbnu5PlkIgiIGZpbGw9IiMzNjdGQzkiPjwvcGF0aD4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==);\n}\n\n.icon-Be-Used {\n  background-repeat: round;\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAAGxJREFUOE+ljsENgDAMAzsaQ3QMxP4/wAhXwTKhEY9TlZOdtK1b/4WVFaysYGUFKxMWdY/hA5T3+x0+BjJYJmOJBoF+87UMYhAwzFBaBnFwYZ1j/kKFltIycHLqMrHyhEvSMrCygpUVrJyntwPdKU02VXQw7gAAAABJRU5ErkJggg==);\n}\n\n.icon-clear-filter {\n  background-repeat: round;\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAgRJREFUOBFjYKAQMIL0nzx5cs6/f/+SCZnFyMh4kpeX105bW/sXTC0TiCEmJpbz58+fc0DMgAe/YWJiCkXWDNILNkBRUfEHUGPw379/3/3+/RtsCIhGwv+A8pFmZmaPQZqQAdgAkICjo+MDoAExQPwPpBFIgzHIRUDv1QLl9yBrhLHBYQDjgOjt27fXAzU0AP0LFgbSmzw8PAKA9H9kdTA2hgH///9n2gIEQEO+mpzfvp2FmfWgeO3kuzAN6DTcCzAJoE0g/zZoXj+8h+Pti7lMLx5deJHpmwKTB9H/09JY74XamoHYGAaABIFh8PemhAb//3//1wBN4/r769fsRwmu0x8luUrdjXRov/v++sM/f/5a4DOA4RMrZ+dOq7C1QC8Z/P/7/8K/P38z/nz/+fjfn98+QDf4qq0/NgmvAaCYAHrlpziDzI0/f//e+AuMjb9//jH9+8dQrrL6yFmQZhDA6gWQBDAaG+Pu79/+8OudjX9//4kAeqcLKLbm7+9fHf8bGuD64AyQJhj4+fPnpaTHj5se3Xm08d/fv57AGJmgsupwubqIbtSP778enNm/IhymFqsB6enpvx/fO+IL9ILbn39/L6oIaJaBNDDOmvVb8Ldg2I9vv2yAYQNOAlgNACn+zfD/+r+//+4x/mMoAGkEiYGA4oEDP1iZmCp3a4mpQEQoJAFYGTPePuR04gAAAABJRU5ErkJggg==);\n}\n\n.gc-Filter-list-select-block {\n  width: 100%;\n  padding-bottom: 5px;\n  background-color: rgb(240, 240, 240);\n}\n\n.gc-Filter-list {\n  font-family: \"Segoe UI\", Calibri, Thonburi, Arial, Verdana, sans-serif, \"Mongolian Baiti\", \"Microsoft Yi Baiti\", \"Javanese Text\";\n  width: 239px;\n  border: 1px solid #c8c6c4;\n  background: #fcfdfd;\n  color: #222222;\n  position: absolute;\n  flex-direction: column;\n}\n\n.gc-Filter-list.gc-Filter-list-resizable {\n  overflow: hidden;\n  resize: both;\n}\n\n.gc-Filter-list-item {\n  padding: 4px 5px 4px 5px;\n  font-weight: 500;\n  font-size: 12px;\n  color: #222222;\n}\n.gc-Filter-list-item select {\n  font-size: 12px;\n}\n\n.gc-Filter-list-sort-item {\n  padding-left: 3px;\n  border: 1px solid rgba(0, 0, 0, 0);\n  display: flex;\n}\n\n.gc-Filter-list-sort-item.gc-Filter-list-button-container {\n  display: flex;\n  justify-content: flex-end;\n}\n\n.gc-Filter-list-link {\n  display: inline-block;\n  width: 182px;\n  height: 23px;\n  font-size: 9pt;\n  vertical-align: top;\n  margin: 4px 0px 0px 5px;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  flex-grow: 1;\n}\n\n.gc-Filter-list-link-arrow {\n  display: inline-block;\n  font-size: 10px;\n  margin-top: 7px;\n  height: 13px;\n  width: 13px;\n  vertical-align: top;\n  background-repeat: round;\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAAXNSR0IArs4c6QAAAGBJREFUGBljYCAHzJo1a8L///+ZsOlFEQQqygcqXr1q1SpOdMUoCqGSQe/fv987c+ZMEWTF2BSC5C0ZGRkXEaPwONAZccgKWZA5UPY6QUHBmLCwsO9Y5CBC+HyNUxPZEgCPEyCkHm49GwAAAABJRU5ErkJggg==);\n}\n\n.gc-Filter-list-icon {\n  width: 18px;\n  height: 18px;\n  display: inline-block;\n  margin: 3px 0px 0px 3px;\n}\n\n.gc-Filter-list-icon-selected {\n  background-repeat: round;\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMThweCIgaGVpZ2h0PSIxOHB4IiB2aWV3Qm94PSIwIDAgMTggMTgiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+Y2hlY2tfbGlnaHQ8L3RpdGxlPgogICAgPGcgaWQ9ImNoZWNrX2xpZ2h0IiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8cG9seWdvbiBpZD0iUGF0aC00IiBmaWxsPSIjMzY3RkM5IiBmaWxsLXJ1bGU9Im5vbnplcm8iIHBvaW50cz0iMTQuMDYwMjI2OSA1IDE1IDUuNzUwMzEwMjkgNy44MjE0MzE4MSAxMyA0IDkuMTQwNzA3NDMgNC45Mzk3NzMxNCA4LjM5MDM5NzEzIDcuODIxNDMxODEgMTEuMzAwNjA1OCI+PC9wb2x5Z29uPgogICAgICAgIDxwYXRoIGQ9Ik0xNywxIEwxNywxNyBMMSwxNyBMMSwxIEwxNywxIFogTTE2LDIgTDIsMiBMMiwxNiBMMTYsMTYgTDE2LDIgWiIgaWQ9IuW9oueKtue7k+WQiCIgZmlsbD0iIzY5Njk2OSI+PC9wYXRoPgogICAgPC9nPgo8L3N2Zz4=);\n}\n\n.item-hover:hover {\n  background-image: none;\n  background-color: #d3f0e0;\n}\n\n.item-noHover {\n  color: #b1b1b1;\n}\n\n.clear-filter-icon {\n  background-repeat: round;\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMThweCIgaGVpZ2h0PSIxOHB4IiB2aWV3Qm94PSIwIDAgMTggMTgiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+ZmlsdGVyIGNsZWFyX2xpZ2h0PC90aXRsZT4KICAgIDxnIGlkPSJmaWx0ZXItY2xlYXJfbGlnaHQiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSLnvJbnu4QiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAuNzQwMjkwLCAxLjAwMDAwMCkiPgogICAgICAgICAgICA8cGF0aCBkPSJNMTYuMDE5NDI3NywxLjU5ODcyMTE2ZS0xNCBDMTYuMjk1NTcwMSwxLjQxMDQ2MTdlLTE0IDE2LjUxOTQyNzcsMC4yMjM4NTc2MjUgMTYuNTE5NDI3NywwLjUgQzE2LjUxOTQyNzcsMC42MTgwMTMyMzkgMTYuNDc3Njg0OSwwLjczMjIyMjg3OCAxNi40MDE1ODQ3LDAuODIyNDIyMDYyIEwxMC4zMzA0MTk0LDguMDE1MTMwNDggQzkuODc3MzExNDksNy45NTA4NzUxNyA5LjQ0ODI5OTgsOC4wMzIzODI1OCA5LjA5ODk2ODE0LDguMjk2NDM2NTUgTDkuMDk5MTYyMzYsNy41OTM2NTYyNSBMMTQuMjIyODM1OCwxLjcxOTgzNTMzIEMxNC4yNzA0ODUyLDEuNjY1MTk3MzkgMTQuMjk2NzM3NSwxLjU5NTE1Mjk5IDE0LjI5NjczNzUsMS41MjI2NTYyNSBDMTQuMjk2NzM3NSwxLjM1Njk3MDgzIDE0LjE2MjQyMywxLjIyMjY1NjI1IDEzLjk5NjczNzUsMS4yMjI2NTYyNSBMMi42NTk0NzExNywxLjIyMjY1NjI1IEMyLjU4ODE1ODc1LDEuMjIyNjU2MjUgMi41MTkxNzg0NiwxLjI0ODA1OTQzIDIuNDY0ODk4OSwxLjI5NDMxMDgzIEMyLjM1NjgwMzE3LDEuMzg2NDE4OCAyLjMzMDI1MTc5LDEuNTM4Njg4OTQgMi4zOTI1NDI4OCwxLjY1OTczMjIyIEwyLjQzMTEyNTc1LDEuNzE3MjI4NTIgTDcuNDc3MTYyMzYsNy42Mzg2NTYyNSBMNy40Nzc3NDgxOCwxNC40NTM0ODAxIEw4LjYyMzQ3MzkzLDEzLjc3MjU4OTYgQzguMzU2MTU5MTEsMTQuMjE1MDA4MSA4LjI0Mjc5ODM4LDE0LjY4NDEwNjMgOC4yNjUyODk2OSwxNS4xMjM5NDk5IEw2LjQ5MjU3MjM5LDE2IEw2LjQ5MTk4NDY4LDguMzc4IEwwLjExNzg1Mzg5OSwwLjgyMjQyMjA2MiBDLTAuMDYwMjE0ODg4NiwwLjYxMTM2MjU0OSAtMC4wMzM0NzA2MjE3LDAuMjk1OTExNzM0IDAuMTc3NTg4ODkxLDAuMTE3ODQyOTQ2IEMwLjI2Nzc4ODA3NSwwLjA0MTc0MjgwMjEgMC4zODE5OTc3MTQsMS41NzMxMzM0NWUtMTQgMC41MDAwMTA5NTMsMS41OTg3MjExNmUtMTQgTDE2LjAxOTQyNzcsMS41OTg3MjExNmUtMTQgWiBNOS40NTk0Mjk4NCwxMS41NzQwNDg2IEw5LjcwMTQ3MDcyLDExLjY2NjQ0NjkgQzkuODEyNTgwMjUsMTEuNzExNzQ3IDkuOTIwNjMyOTgsMTEuNzU5OTk2OSAxMC4wMjcwNjM5LDExLjgxMTk4OTUgTDEwLjAyNiwxMi4yODIgTDkuNTg0NjQyOTEsMTIuNzA0MzA4OSBMOS4wOTksMTMuMTc2IEw5LjA5Nzg4NzU0LDExLjQwMzI3NjIgQzkuMjA3NDU1MDQsMTEuNDY5NzM5IDkuMzI4MDQ1MjcsMTEuNTI3MTA4MiA5LjQ1OTQyOTg0LDExLjU3NDA0ODYgWiIgaWQ9IuW9oueKtue7k+WQiCIgZmlsbD0iIzY5Njk2OSI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBkPSJNMTYuMjQ1MzE1NywxMC4wODM5NDE1IEMxNi4wMzA2ODE0LDEwLjYzNTcxNjYgMTQuODcxODc2MSwxMS4xNjY4NzQ1IDEzLjgwODM2NjIsMTEuOTU2OTY3OCBDMTQuMzM3NzA1NywxMi43OTk0MzA0IDE0LjkyMzE3ODUsMTMuOTI5NTE1NCAxNS44OTYyNzk3LDE2IEMxNC42NzYxMDc0LDE0LjU3MjM2NzUgMTMuNzgwMDcwMywxMy43MDg2ODI4IDEyLjg3NTI5MzMsMTIuNzU2OTI3OCBDMTEuOTEyNTQ0MiwxMy42MzczMzkxIDExLjQ1NTYyMywxNC4xMDQyNTg4IDExLjExOTk3MTcsMTQuNzI4MjUwNiBDMTAuNzM4MDI3NiwxNS40MzgzMDI4IDEwLjUxODQ1NTksMTYuMjM2MDcwNiA5Ljc5NTg3NjUxLDE1Ljg4OTk3NzggQzkuMzE0MTU2OSwxNS42NTg0OTAzIDguODgwMDU3MTMsMTQuNzkyNDk5NSA5Ljc5NTg3NjUxLDEzLjg5NDYzMTcgQzEwLjcxMTY5NTksMTIuOTk2NzY0IDExLjQyNTk5MzYsMTIuMzI1ODI5OCAxMS45Mzk0NTk4LDExLjg4MjU4ODIgQzExLjIzOTY1NSwxMS4zMTQ4NzQ3IDEwLjYxMTYyNTIsMTAuOTIzNzkyNiA5Ljc5NTg3NjUxLDEwLjYzMjM0NjEgQzguOTgwMTI3ODMsMTAuMzQwODk5NiA5LjM4NDg0NjY1LDkuNDY4Mjg3NzYgOS41OTUzNDAxOCw5LjIwMDM2OTQ4IEM5LjgwNzIxMzk5LDguOTMzMjEwMTcgMTAuMjQzNzc5MSw4LjkzMzIxMDE3IDEwLjc2NDE0NjcsOS4yMDAzNjk0OCBDMTEuNzgyNzk3NCw5Ljg0Nzc3NTQyIDEyLjU2ODg2OTksMTAuNDY3ODU4MiAxMy4xMjQ0MzQ4LDExLjA2MDYxOCBDMTQuMzIxMTQyMiwxMC40Mjc2MzI1IDE2LjQ1NTExOTEsOS41NDM1NTExIDE2LjI0NTMxNTcsMTAuMDgzOTQxNSBaIiBpZD0iRmlsbC05IiBmaWxsPSIjRkE3NTQxIj48L3BhdGg+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=);\n}\n\n.clear-filter-icon-default {\n  background-repeat: round;\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMThweCIgaGVpZ2h0PSIxOHB4IiB2aWV3Qm94PSIwIDAgMTggMTgiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+ZmlsdGVyIGNsZWFyIGRpc2FibGVfbGlnaHQ8L3RpdGxlPgogICAgPGcgaWQ9ImZpbHRlci1jbGVhci1kaXNhYmxlX2xpZ2h0IiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0i57yW57uEIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjc0MDI5MCwgMS4wMDAwMDApIj4KICAgICAgICAgICAgPHBhdGggZD0iTTEzLjk5NjczNzUsMS4yMjI2NTYyNSBDMTQuMTYyNDIzLDEuMjIyNjU2MjUgMTQuMjk2NzM3NSwxLjM1Njk3MDgzIDE0LjI5NjczNzUsMS41MjI2NTYyNSBDMTQuMjk2NzM3NSwxLjU5NTE1Mjk5IDE0LjI3MDQ4NTIsMS42NjUxOTczOSAxNC4yMjI4MzU4LDEuNzE5ODM1MzMgTDkuMDk5MTYyMzYsNy41OTM2NTYyNSBMOS4wOTc5NjM3OSw4LjI5NzE5NjM5IEM4Ljk5NTIwNzYsOC4zNzUwMDUwNyA4Ljg5OTM1NjM0LDguNDY4NjI1NDIgOC44MTE4MjY1Nyw4LjU3ODk5NDg2IEM4LjU1OTI2NjYxLDguOTAwNDM4OSA4LjM1NTEzOTg2LDkuMzYyNDk1NzUgOC4zMTQ2NjkzOCw5LjgxOTI4MjE2IEM4LjI1NzE3NDIzLDEwLjQ2ODIyNDUgOC41MjkyNjA5MSwxMS4wNTg4NTI5IDkuMDk4ODkzMDYsMTEuNDAzODg1NyBMOS4wOTk0NjUzMiwxMy4xNzU2NTYyIEw5LjA5NTgwMjg1LDEzLjE4MDU2MTEgQzguOTA0MTMyMDksMTMuMzY4NDc0OCA4Ljc0NzI4ODcxLDEzLjU2NzY3MDMgOC42MjM0NzM5MywxMy43NzI1ODk2IEw3LjQ3Nzc0ODE4LDE0LjQ1MzQ4MDEgTDcuNDc3MTYyMzYsNy42Mzg2NTYyNSBMMi40MzExMjU3NSwxLjcxNzIyODUyIEMyLjMyMzY2NjQ1LDEuNTkxMTE2ODIgMi4zMzg3ODcyMSwxLjQwMTc3MDEyIDIuNDY0ODk4OSwxLjI5NDMxMDgzIEMyLjUxOTE3ODQ2LDEuMjQ4MDU5NDMgMi41ODgxNTg3NSwxLjIyMjY1NjI1IDIuNjU5NDcxMTcsMS4yMjI2NTYyNSBMMTMuOTk2NzM3NSwxLjIyMjY1NjI1IFoiIGlkPSLlvaLnirbnu5PlkIgiIGZpbGw9IiNFMEUwRTAiPjwvcGF0aD4KICAgICAgICAgICAgPHBhdGggZD0iTTE2LjAxOTQyNzcsMCBDMTYuMjk1NTcwMSwtMS44ODI1OTQ1MmUtMTUgMTYuNTE5NDI3NywwLjIyMzg1NzYyNSAxNi41MTk0Mjc3LDAuNSBDMTYuNTE5NDI3NywwLjYxODAxMzIzOSAxNi40Nzc2ODQ5LDAuNzMyMjIyODc4IDE2LjQwMTU4NDcsMC44MjI0MjIwNjIgTDEwLjMzMDQxOTQsOC4wMTUxMzA0OCBDOS44NzczMTE0OSw3Ljk1MDg3NTE3IDkuNDQ4Mjk5OCw4LjAzMjM4MjU4IDkuMDk4OTY4MTQsOC4yOTY0MzY1NSBMOS4wOTkxNjIzNiw3LjU5MzY1NjI1IEwxNC4yMjI4MzU4LDEuNzE5ODM1MzMgQzE0LjI3MDQ4NTIsMS42NjUxOTczOSAxNC4yOTY3Mzc1LDEuNTk1MTUyOTkgMTQuMjk2NzM3NSwxLjUyMjY1NjI1IEMxNC4yOTY3Mzc1LDEuMzU2OTcwODMgMTQuMTYyNDIzLDEuMjIyNjU2MjUgMTMuOTk2NzM3NSwxLjIyMjY1NjI1IEwyLjY1OTQ3MTE3LDEuMjIyNjU2MjUgQzIuNTg4MTU4NzUsMS4yMjI2NTYyNSAyLjUxOTE3ODQ2LDEuMjQ4MDU5NDMgMi40NjQ4OTg5LDEuMjk0MzEwODMgQzIuMzU2ODAzMTcsMS4zODY0MTg4IDIuMzMwMjUxNzksMS41Mzg2ODg5NCAyLjM5MjU0Mjg4LDEuNjU5NzMyMjIgTDIuNDMxMTI1NzUsMS43MTcyMjg1MiBMNy40NzcxNjIzNiw3LjYzODY1NjI1IEw3LjQ3Nzc0ODE4LDE0LjQ1MzQ4MDEgTDguNjIzNDczOTMsMTMuNzcyNTg5NiBDOC4zNTYxNTkxMSwxNC4yMTUwMDgxIDguMjQyNzk4MzgsMTQuNjg0MTA2MyA4LjI2NTI4OTY5LDE1LjEyMzk0OTkgTDYuNDkyNTcyMzksMTYgTDYuNDkxOTg0NjgsOC4zNzggTDAuMTE3ODUzODk5LDAuODIyNDIyMDYyIEMtMC4wNjAyMTQ4ODg2LDAuNjExMzYyNTQ5IC0wLjAzMzQ3MDYyMTcsMC4yOTU5MTE3MzQgMC4xNzc1ODg4OTEsMC4xMTc4NDI5NDYgQzAuMjY3Nzg4MDc1LDAuMDQxNzQyODAyMSAwLjM4MTk5NzcxNCwtMi41NTg3NzA3NmUtMTYgMC41MDAwMTA5NTMsMCBMMTYuMDE5NDI3NywwIFogTTkuNDU5NDI5ODQsMTEuNTc0MDQ4NiBMOS43MDE0NzA3MiwxMS42NjY0NDY5IEM5LjgxMjU4MDI1LDExLjcxMTc0NyA5LjkyMDYzMjk4LDExLjc1OTk5NjkgMTAuMDI3MDYzOSwxMS44MTE5ODk1IEwxMC4wMjYsMTIuMjgyIEw5LjU4NDY0MjkxLDEyLjcwNDMwODkgTDkuMDk5LDEzLjE3NiBMOS4wOTc4ODc1NCwxMS40MDMyNzYyIEM5LjIwNzQ1NTA0LDExLjQ2OTczOSA5LjMyODA0NTI3LDExLjUyNzEwODIgOS40NTk0Mjk4NCwxMS41NzQwNDg2IFoiIGlkPSLlvaLnirbnu5PlkIgiIGZpbGw9IiM5ODk4OTgiPjwvcGF0aD4KICAgICAgICAgICAgPHBhdGggZD0iTTE2LjI0NTMxNTcsMTAuMDgzOTQxNSBDMTYuMDMwNjgxNCwxMC42MzU3MTY2IDE0Ljg3MTg3NjEsMTEuMTY2ODc0NSAxMy44MDgzNjYyLDExLjk1Njk2NzggQzE0LjMzNzcwNTcsMTIuNzk5NDMwNCAxNC45MjMxNzg1LDEzLjkyOTUxNTQgMTUuODk2Mjc5NywxNiBDMTQuNjc2MTA3NCwxNC41NzIzNjc1IDEzLjc4MDA3MDMsMTMuNzA4NjgyOCAxMi44NzUyOTMzLDEyLjc1NjkyNzggQzExLjkxMjU0NDIsMTMuNjM3MzM5MSAxMS40NTU2MjMsMTQuMTA0MjU4OCAxMS4xMTk5NzE3LDE0LjcyODI1MDYgQzEwLjczODAyNzYsMTUuNDM4MzAyOCAxMC41MTg0NTU5LDE2LjIzNjA3MDYgOS43OTU4NzY1MSwxNS44ODk5Nzc4IEM5LjMxNDE1NjksMTUuNjU4NDkwMyA4Ljg4MDA1NzEzLDE0Ljc5MjQ5OTUgOS43OTU4NzY1MSwxMy44OTQ2MzE3IEMxMC43MTE2OTU5LDEyLjk5Njc2NCAxMS40MjU5OTM2LDEyLjMyNTgyOTggMTEuOTM5NDU5OCwxMS44ODI1ODgyIEMxMS4yMzk2NTUsMTEuMzE0ODc0NyAxMC42MTE2MjUyLDEwLjkyMzc5MjYgOS43OTU4NzY1MSwxMC42MzIzNDYxIEM4Ljk4MDEyNzgzLDEwLjM0MDg5OTYgOS4zODQ4NDY2NSw5LjQ2ODI4Nzc2IDkuNTk1MzQwMTgsOS4yMDAzNjk0OCBDOS44MDcyMTM5OSw4LjkzMzIxMDE3IDEwLjI0Mzc3OTEsOC45MzMyMTAxNyAxMC43NjQxNDY3LDkuMjAwMzY5NDggQzExLjc4Mjc5NzQsOS44NDc3NzU0MiAxMi41Njg4Njk5LDEwLjQ2Nzg1ODIgMTMuMTI0NDM0OCwxMS4wNjA2MTggQzE0LjMyMTE0MjIsMTAuNDI3NjMyNSAxNi40NTUxMTkxLDkuNTQzNTUxMSAxNi4yNDUzMTU3LDEwLjA4Mzk0MTUgWiIgaWQ9IkZpbGwtOSIgZmlsbD0iIzk4OTg5OCI+PC9wYXRoPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+);\n}\n\n.gc-Filter-list-span {\n  display: block;\n  border-bottom: solid 1px #e1dfdd;\n  margin-left: 32px;\n}\n\n.filter-search {\n  margin: 5px 5px 0px 30px;\n  height: 25px;\n  width: 210px;\n}\n\n.filter-search-input {\n  outline: none;\n  padding-left: 7px;\n}\n\n.filter-select-all-container {\n  height: 20px;\n  margin: 4px 0px 2px 24px;\n}\n\n.filter-select-all-link {\n  height: 16px;\n  cursor: pointer;\n  margin-right: 10px;\n  font-size: 12px;\n  float: left;\n}\n\n.filter-select-all-link:hover {\n  text-decoration: underline;\n}\n\n.filter-select-icon {\n  height: 15px;\n  width: 15px;\n  margin-right: 4px;\n  float: left;\n}\n\n.filter-check-all-icon {\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAAGxJREFUOE+ljsENgDAMAzsaQ3QMxP4/wAhXwTKhEY9TlZOdtK1b/4WVFaysYGUFKxMWdY/hA5T3+x0+BjJYJmOJBoF+87UMYhAwzFBaBnFwYZ1j/kKFltIycHLqMrHyhEvSMrCygpUVrJyntwPdKU02VXQw7gAAAABJRU5ErkJggg==);\n  background-repeat: round;\n}\n\n.filter-uncheck-all-icon {\n  background-repeat: round;\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAAIJJREFUOE+lkssNgDAMQzsCw3UMxEocGKWDQSLVUj5GJeLwhPyI0x7a9qP/gsoKVFagskIUm3ALp3GKZvX63/q0QIcAlqAMXMcFIQ6z7DouTGLptawkMVmeDJi8BFsGQ0jzUcRyvEla4oLAhvVrveu4IOAdxJOwZPkOylBZgcrv9PYAV9tkcyJlS4sAAAAASUVORK5CYII=);\n}\n\n.filter-list-box {\n  margin-top: 10px;\n  display: flex;\n  flex-direction: column;\n  min-height: 277px;\n}\n\n.filter-list-box-host {\n  height: 170px;\n  width: 100%;\n  clear: both;\n  flex: 1;\n  display: flex;\n}\n\n.filter-list-box-icon {\n  display: inline-block;\n  float: left;\n  height: 100%;\n  width: 25px;\n}\n\n.filter-list-box-container {\n  display: inline-block;\n  height: 100%;\n  flex: 1;\n  width: calc(100% - 40px);\n  margin-right: 15px;\n  border: 1px solid rgb(200, 200, 200);\n}\n\n.filter-confirm {\n  display: inline-block;\n  user-select: none;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  cursor: default;\n  height: 25px;\n  line-height: 23px;\n  width: 81px;\n  margin-left: 10px;\n  text-align: center;\n  font-size: 12px;\n  font-weight: normal;\n  color: rgb(0, 0, 0);\n  border: 1px solid rgb(180, 180, 180);\n  background-color: rgb(239, 239, 239);\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n\n.filter-confirm:hover {\n  border: 1px solid rgb(50, 150, 200);\n  background-color: rgba(191, 216, 231, 0.9);\n  line-height: 23px;\n}\n\n.filter-dialog-confirm {\n  box-sizing: border-box;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  height: 24px;\n  line-height: 25px;\n  width: 70px;\n  margin: 8px 20px 7px -15px;\n  text-align: center;\n  font-size: 12px;\n  float: right;\n  font-weight: normal;\n  color: #b1b1b1;\n  border: 1px solid rgb(180, 180, 180);\n  background-color: rgb(239, 239, 239);\n}\n\n.filter-confirm-enable {\n  color: rgb(0, 0, 0);\n  box-sizing: border-box;\n  line-height: 24px;\n  border: 2px solid #0078d7;\n}\n\n.filter-confirm-enable:hover {\n  border: 1px solid rgb(50, 150, 200);\n  background-color: rgba(191, 216, 231, 0.9);\n  line-height: 24px;\n}\n\n.ok-class {\n  line-height: 22px;\n}\n\n.cancel-class {\n  border: 1px solid #b4b4b4;\n}\n\n.filter-bottom-line {\n  display: block;\n  background-color: #D4D4D4;\n  margin-bottom: 10px;\n  margin-top: 9px;\n}\n\n.filter-sort-icon-one {\n  background-repeat: round;\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMThweCIgaGVpZ2h0PSIxOHB4IiB2aWV3Qm94PSIwIDAgMTggMTgiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+c29ydGF6X2xpZ2h0PC90aXRsZT4KICAgIDxnIGlkPSJzb3J0YXpfbGlnaHQiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJTb3J0LUEtdG8tWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMi4wMDAwMDAsIDIuMDAwMDAwKSI+CiAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJTaGFwZSIgZmlsbD0iIzY2NjY2NiIgZmlsbC1ydWxlPSJub256ZXJvIiBwb2ludHM9IjExIDE0Ljk5MzkwMDQgMTQgMTIgMTIgMTIgMTIgLTIuOTEzMTUwMzZlLTE1IDEwIC0yLjkxMzE1MDM2ZS0xNSAxMCAxMiA4IDEyIj48L3BvbHlnb24+CiAgICAgICAgICAgIDxnIGlkPSJHcm91cCI+CiAgICAgICAgICAgICAgICA8cG9seWdvbiBpZD0iWiIgZmlsbD0iIzY2NjY2NiIgcG9pbnRzPSIwLjgwNTYwMjcxNiA5IDYuMjU1NTE3ODMgOSA2LjI1NTUxNzgzIDkuNzgxNTEyNjEgMi4wNTg1NzM4NSAxNC4xNTk2NjM5IDYuNSAxNC4xNTk2NjM5IDYuNSAxNSAwLjUgMTUgMC41IDE0LjIyNjg5MDggNC43MDcxMzA3MyA5Ljg0MDMzNjEzIDAuODA1NjAyNzE2IDkuODQwMzM2MTMiPjwvcG9seWdvbj4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0yLjgxNDQzMjk5LDAgTDQuMTg1NTY3MDEsMCBMNyw3IEw1LjcxMTM0MDIxLDcgTDUuMDQxMjM3MTEsNS4yNDUwOTgwNCBMMS45NTg3NjI4OSw1LjI0NTA5ODA0IEwxLjI4ODY1OTc5LDcgTDAsNyBMMi44MTQ0MzI5OSwwIFogTTIuMzE5NTg3NjMsNC4zMDM5MjE1NyBMNC42ODA0MTIzNyw0LjMwMzkyMTU3IEwzLjUyNTc3MzIsMS4yMzUyOTQxMiBMMy40ODQ1MzYwOCwxLjIzNTI5NDEyIEwyLjMxOTU4NzYzLDQuMzAzOTIxNTcgWiIgaWQ9IkEiIGZpbGw9IiMzNjdGQzkiPjwvcGF0aD4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+);\n}\n\n.filter-sort-icon-two {\n  background-repeat: round;\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMThweCIgaGVpZ2h0PSIxOHB4IiB2aWV3Qm94PSIwIDAgMTggMTgiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+c29ydHphX2xpZ2h0PC90aXRsZT4KICAgIDxnIGlkPSJzb3J0emFfbGlnaHQiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJTb3J0LUEtdG8tWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMi4wMDAwMDAsIDIuMDAwMDAwKSI+CiAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJTaGFwZSIgZmlsbD0iIzY2NjY2NiIgZmlsbC1ydWxlPSJub256ZXJvIiBwb2ludHM9IjExIDE0Ljk5MzkwMDQgMTQgMTIgMTIgMTIgMTIgLTIuOTEzMTUwMzZlLTE1IDEwIC0yLjkxMzE1MDM2ZS0xNSAxMCAxMiA4IDEyIj48L3BvbHlnb24+CiAgICAgICAgICAgIDxnIGlkPSJHcm91cCI+CiAgICAgICAgICAgICAgICA8cG9seWdvbiBpZD0iWiIgZmlsbD0iIzY2NjY2NiIgcG9pbnRzPSIwLjgwNTYwMjcxNiAwIDYuMjU1NTE3ODMgMCA2LjI1NTUxNzgzIDAuNzgxNTEyNjA1IDIuMDU4NTczODUgNS4xNTk2NjM4NyA2LjUgNS4xNTk2NjM4NyA2LjUgNiAwLjUgNiAwLjUgNS4yMjY4OTA3NiA0LjcwNzEzMDczIDAuODQwMzM2MTM0IDAuODA1NjAyNzE2IDAuODQwMzM2MTM0Ij48L3BvbHlnb24+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMi44MTQ0MzI5OSw4IEw0LjE4NTU2NzAxLDggTDcsMTUgTDUuNzExMzQwMjEsMTUgTDUuMDQxMjM3MTEsMTMuMjQ1MDk4IEwxLjk1ODc2Mjg5LDEzLjI0NTA5OCBMMS4yODg2NTk3OSwxNSBMMCwxNSBMMi44MTQ0MzI5OSw4IFogTTIuMzE5NTg3NjMsMTIuMzAzOTIxNiBMNC42ODA0MTIzNywxMi4zMDM5MjE2IEwzLjUyNTc3MzIsOS4yMzUyOTQxMiBMMy40ODQ1MzYwOCw5LjIzNTI5NDEyIEwyLjMxOTU4NzYzLDEyLjMwMzkyMTYgWiIgaWQ9IkEiIGZpbGw9IiMzNjdGQzkiPjwvcGF0aD4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+);\n}\n\n.icon-class {\n  background-repeat: round;\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMThweCIgaGVpZ2h0PSIxOHB4IiB2aWV3Qm94PSIwIDAgMTggMTgiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+Y2hlY2tfbGlnaHQ8L3RpdGxlPgogICAgPGcgaWQ9ImNoZWNrX2xpZ2h0IiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8cG9seWdvbiBpZD0iUGF0aC00IiBmaWxsPSIjMzY3RkM5IiBmaWxsLXJ1bGU9Im5vbnplcm8iIHBvaW50cz0iMTQuMDYwMjI2OSA1IDE1IDUuNzUwMzEwMjkgNy44MjE0MzE4MSAxMyA0IDkuMTQwNzA3NDMgNC45Mzk3NzMxNCA4LjM5MDM5NzEzIDcuODIxNDMxODEgMTEuMzAwNjA1OCI+PC9wb2x5Z29uPgogICAgICAgIDxwYXRoIGQ9Ik0xNywxIEwxNywxNyBMMSwxNyBMMSwxIEwxNywxIFogTTE2LDIgTDIsMiBMMiwxNiBMMTYsMTYgTDE2LDIgWiIgaWQ9IuW9oueKtue7k+WQiCIgZmlsbD0iIzY5Njk2OSI+PC9wYXRoPgogICAgPC9nPgo8L3N2Zz4=);\n}\n\n.icon-class-second-menu {\n  background-repeat: round;\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAO5JREFUOBFjYBgFRIfAjRs3eI8dO7bz+PHjRsiaWJA5uNhnzpxhffny5dr///+7MjExgfQ4w9QywRggev/+/Rx79+6NRBYDamJ8//79/J8/f7r+/v373q9fv6KQ5VEM+Pbt24rv378v27ZtWwFMEZDdCdQUDdT8+u/fv+4uLi4vYXIgmhGZs3HjRr9///6tBYoxA3EqEPMAXTCBkZHxKzMzs6Ofn99pZPUgNooBIIGVK1eCvLAEqJEB6F9GIP0XSPuFhoZuB8mjAwwDQAoWL16cAtQ4G6o4MS4ubgGUTTw1b968wrlz51YRr2PkqgQA82JlH8nI1QYAAAAASUVORK5CYII=);\n}\n\n.filter-dialog-container {\n  border: 1px solid #707070;\n  box-shadow: 2px 2px 10px #707070;\n  width: 446px;\n  height: 165px;\n}\n.filter-dialog-container * {\n  box-sizing: border-box;\n  font-family: \"Segoe UI\", Calibri, Thonburi, Arial, Verdana, sans-serif, \"Mongolian Baiti\", \"Microsoft Yi Baiti\", \"Javanese Text\";\n}\n.filter-dialog-container *:not(input) {\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n.show-value-as-dialog-container {\n  border: 1px solid #707070;\n  box-shadow: 2px 2px 10px #707070;\n  width: 560px;\n  height: 165px;\n}\n.show-value-as-dialog-container * {\n  box-sizing: border-box;\n  font-family: \"Segoe UI\", Calibri, Thonburi, Arial, Verdana, sans-serif, \"Mongolian Baiti\", \"Microsoft Yi Baiti\", \"Javanese Text\";\n}\n.show-value-as-dialog-container *:not(input) {\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n.show-value-as-dialog-header {\n  height: 20%;\n  font-size: 12px;\n  color: #000000;\n  background-color: white;\n  padding-left: 10px;\n}\n.show-value-as-dialog-header > span:first-child {\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  display: inline-block;\n  padding-top: 10px;\n  height: 100%;\n}\n\n.show-value-as-dialog-content {\n  font-size: 12px;\n  padding: 6px 9px 9px 9px;\n  background-color: rgb(240, 240, 240);\n  height: 80%;\n}\n.show-value-as-dialog-content > div:first-child {\n  margin-bottom: 2px;\n}\n.show-value-as-dialog-content > .show-value-as-dialog-content-item {\n  margin-bottom: 2px;\n}\n.show-value-as-dialog-content select {\n  padding: 0px;\n}\n\n.show-value-as-dialog-content-select {\n  width: 82%;\n  height: 22px;\n  float: right;\n  border: 1px solid #abadb3;\n  outline: none;\n  font-size: 12px;\n}\n\n.show-value-as-dialog-content-item {\n  margin-top: 10px;\n  white-space: nowrap;\n}\n.show-value-as-dialog-content-item > span:first-child {\n  display: inline-block;\n}\n\n.show-value-as-dialog-bottom-confirm {\n  position: absolute;\n  right: 12px;\n  bottom: 12px;\n}\n\n.date-group-dialog-container {\n  border: 1px solid #707070;\n  box-shadow: 2px 2px 10px #707070;\n  width: 315px;\n  height: 330px;\n}\n.date-group-dialog-container * {\n  box-sizing: border-box;\n  font-family: \"Segoe UI\", Calibri, Thonburi, Arial, Verdana, sans-serif, \"Mongolian Baiti\", \"Microsoft Yi Baiti\", \"Javanese Text\";\n}\n.date-group-dialog-container *:not(input) {\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n.number-group-dialog-container {\n  border: 1px solid #707070;\n  box-shadow: 2px 2px 10px #707070;\n  width: 315px;\n  height: 248px;\n}\n.number-group-dialog-container * {\n  box-sizing: border-box;\n  font-family: \"Segoe UI\", Calibri, Thonburi, Arial, Verdana, sans-serif, \"Mongolian Baiti\", \"Microsoft Yi Baiti\", \"Javanese Text\";\n}\n.number-group-dialog-container *:not(input) {\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n.date-group-dialog-header {\n  height: 10%;\n  font-size: 12px;\n  color: #000000;\n  background-color: white;\n  padding-left: 10px;\n}\n.date-group-dialog-header > .sjs-cancel-icon {\n  line-height: 26px;\n  border: none;\n}\n\n.number-group-dialog-header {\n  height: 14%;\n  font-size: 12px;\n  color: #000000;\n  background-color: white;\n  padding-left: 10px;\n}\n.number-group-dialog-header > .sjs-cancel-icon {\n  line-height: 28px;\n  border: none;\n}\n\n.date-group-dialog-header-title,\n.number-group-dialog-header-title {\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  display: inline-block;\n  padding-top: 10px;\n  height: 100%;\n}\n\n.date-group-dialog-content-header,\n.number-group-dialog-content-header {\n  margin: 8px 0px 8px 8px;\n  position: relative;\n}\n.date-group-dialog-content-header > span:first-child,\n.number-group-dialog-content-header > span:first-child {\n  display: inline-block;\n  line-height: 21px;\n  position: absolute;\n  padding-right: 6px;\n  background-color: rgb(240, 240, 240);\n}\n\n.date-group-dialog-content {\n  font-size: 12px;\n  padding: 6px 9px 9px 9px;\n  background-color: rgb(240, 240, 240);\n  height: 80%;\n  height: 90%;\n}\n\n.number-group-dialog-content {\n  font-size: 12px;\n  padding: 6px 9px 9px 9px;\n  background-color: rgb(240, 240, 240);\n  height: 80%;\n  height: 86%;\n}\n\n.date-group-dialog-bottom-confirm,\n.number-group-dialog-bottom-confirm {\n  position: absolute;\n  bottom: 12px;\n  right: 12px;\n}\n\n.date-group--header-horizontal-group-line {\n  display: inline-block;\n  margin-bottom: 3px;\n  width: 100%;\n  border-bottom: 1px solid rgb(220, 220, 220);\n}\n\n.date-group--header-horizontal-auto-line,\n.number-group--header-horizontal-line {\n  display: inline-block;\n  width: 100%;\n  margin-bottom: 3px;\n  border-bottom: 1px solid rgb(220, 220, 220);\n}\n\n.date-group-dialog-sub-container {\n  margin: 8px 0px 8px 8px;\n}\n.date-group-dialog-sub-container > span:first-child {\n  position: absolute;\n  display: inline-block;\n  padding-right: 4px;\n  background-color: rgb(240, 240, 240);\n}\n\n.number-group-dialog-sub-container {\n  margin: 16px 0px 8px 8px;\n}\n\n.date-group-by {\n  display: block;\n  box-sizing: border-box;\n  height: 15px;\n  margin: 1px 0px 1px 6px;\n}\n\n.number-group-startingAt-value,\n.number-group-endingAt-value,\n.number-group-by-value {\n  float: right;\n  width: 62%;\n  border: 1px solid #abadb3;\n  outline: none;\n}\n\n.date-group-startingAt-value,\n.date-group-endingAt-value,\n.date-group-by-value {\n  float: right;\n  margin-left: 5px;\n  margin-right: 12px;\n  outline: none;\n  -webkit-appearance: none;\n  -webkit-user-select: auto;\n  user-select: auto;\n}\n\n.date_group_dialog_group-by-subContainer {\n  box-sizing: border-box;\n  margin-top: 8px;\n  width: 273px;\n  height: 125px;\n  margin-left: 13px;\n  border: 1px solid rgba(176, 167, 167, 0.9490196078);\n  background-color: white;\n}\n\n.date-group-by-selected {\n  background-color: rgba(127, 187, 235, 0.7);\n}\n\n.label-title-class {\n  height: 20%;\n  font-size: 12px;\n  color: #000000;\n  background-color: white;\n  padding-left: 10px;\n}\n.label-title-class > .label-title {\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  display: inline-block;\n  padding-top: 10px;\n  height: 100%;\n  width: calc(100% - 50px);\n}\n\n.sjs-cancel-icon {\n  height: 100%;\n  width: 50px;\n  font-size: 26px;\n  font-weight: 300;\n  display: inline-block;\n  float: right;\n  text-align: center;\n  line-height: 25px;\n  border: none;\n  cursor: default;\n}\n.sjs-cancel-icon:hover {\n  background-color: rgb(232, 17, 35);\n  color: white;\n}\n\n.label-filter-body {\n  font-size: 12px;\n  padding: 6px 9px 9px 9px;\n  background-color: rgb(240, 240, 240);\n  height: 80%;\n  width: auto;\n}\n.label-filter-body > .confirm-class {\n  margin-bottom: 2px;\n}\n.label-filter-body > div:first-child {\n  position: relative;\n  margin-bottom: 6px;\n}\n.label-filter-body > div:last-child {\n  position: absolute;\n  right: 12px;\n  bottom: 12px;\n}\n\n.top-ten-content > * {\n  display: inline-block;\n  white-space: nowrap;\n  margin: 15px 2px;\n}\n\n.label-show {\n  display: inline-block;\n  line-height: 21px;\n  position: absolute;\n  padding-right: 6px;\n  background-color: rgb(240, 240, 240);\n}\n\n.split-line {\n  display: inline-block;\n  margin-bottom: 3px;\n  width: 100%;\n  border-bottom: 1px solid rgb(220, 220, 220);\n}\n\n.label-select {\n  margin: 0 2%;\n  display: inline-block;\n  border: 1px solid #abadb3;\n  outline: none;\n  width: 35%;\n  height: 23px;\n  text-overflow: ellipsis;\n  font-size: 12px;\n}\n\n.label-input {\n  display: inline-block;\n  text-align: left;\n  border: 1px solid #abadb3;\n  outline: none;\n  width: 100%;\n  height: 23px;\n  font-size: 12px;\n}\n\n.prompt-info {\n  display: block;\n  line-height: 20px;\n}\n\n.ok-label {\n  border: 2px solid #0078d7;\n  line-height: 21px;\n}\n\n.input-between-container {\n  display: inline-block;\n  width: 58%;\n  margin-left: 2%;\n}\n\n.input-between {\n  display: inline-block;\n  text-align: left;\n  border: 1px solid #abadb3;\n  outline: none;\n  width: 42%;\n  height: 22px;\n  font-size: 12px;\n}\n\n.and-joiner {\n  display: inline-block;\n  text-align: center;\n  width: 11%;\n  height: 20px;\n}\n\n.filter-value-dialog-container {\n  border: 1px solid #707070;\n  box-shadow: 2px 2px 10px #707070;\n  width: 560px;\n  height: 165px;\n}\n.filter-value-dialog-container * {\n  box-sizing: border-box;\n  font-family: \"Segoe UI\", Calibri, Thonburi, Arial, Verdana, sans-serif, \"Mongolian Baiti\", \"Microsoft Yi Baiti\", \"Javanese Text\";\n}\n.filter-value-dialog-container *:not(input) {\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n.value-title-class {\n  height: 20%;\n  font-size: 12px;\n  color: #000000;\n  background-color: white;\n  padding-left: 10px;\n}\n.value-title-class > .label-title {\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  display: inline-block;\n  padding-top: 10px;\n  height: 100%;\n}\n\n.value-filter-body {\n  font-size: 12px;\n  padding: 6px 9px 9px 9px;\n  background-color: rgb(240, 240, 240);\n  height: 80%;\n}\n.value-filter-body > .confirm-class {\n  margin-bottom: 2px;\n}\n.value-filter-body > div:first-child {\n  position: relative;\n  margin-bottom: 6px;\n}\n.value-filter-body > div:last-child {\n  position: absolute;\n  right: 12px;\n  bottom: 12px;\n}\n.value-filter-body .input-between-container {\n  display: inline-block;\n  width: 52%;\n  margin-left: 2%;\n}\n\n.split-line-class {\n  display: inline-block;\n  width: 100%;\n  margin-bottom: 3px;\n  border-bottom: 1px solid rgb(220, 220, 220);\n}\n\n.value-select {\n  display: inline-block;\n  margin-left: 2%;\n  outline: none;\n  width: 20%;\n  height: 22px;\n  margin-top: 2%;\n  border: 1px solid #abadb3;\n  font-size: 12px;\n  text-overflow: ellipsis;\n}\n\n.filter-top-ten-container {\n  border: 1px solid #707070;\n  box-shadow: 2px 2px 10px #707070;\n  width: auto;\n  height: 165px;\n}\n.filter-top-ten-container * {\n  box-sizing: border-box;\n  font-family: \"Segoe UI\", Calibri, Thonburi, Arial, Verdana, sans-serif, \"Mongolian Baiti\", \"Microsoft Yi Baiti\", \"Javanese Text\";\n}\n.filter-top-ten-container *:not(input) {\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n.top-ten-title-class {\n  height: 20%;\n  font-size: 12px;\n  color: #000000;\n  background-color: white;\n  padding-left: 10px;\n}\n.top-ten-title-class > .label-title {\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  display: inline-block;\n  padding-top: 10px;\n  height: 100%;\n}\n\n.top-ten-filter-body {\n  font-size: 12px;\n  padding: 6px 9px 9px 9px;\n  background-color: rgb(240, 240, 240);\n  height: 80%;\n}\n.top-ten-filter-body > div:first-child {\n  position: relative;\n  margin-bottom: 6px;\n}\n.top-ten-filter-body > .confirm-class {\n  margin-bottom: 2px;\n}\n\n.split-line-of-top-ten {\n  display: inline-block;\n  width: 100%;\n  margin-bottom: 3px;\n  border-bottom: 1px solid rgb(220, 220, 220);\n}\n\n.value-of-top-ten {\n  text-align: left;\n  outline: none;\n  height: 22px;\n  border: 1px solid #abadb3;\n  font-size: 12px;\n}\n\n.top-ten-select {\n  border: 1px solid #abadb3;\n  outline: none;\n  width: 100px;\n  height: 20px;\n  height: 22px;\n  text-overflow: ellipsis;\n}\n\n.close-dialog {\n  position: absolute;\n  bottom: 12px;\n  right: 12px;\n}\n\n.by-joiner-class {\n  text-align: center;\n  height: 22px;\n}\n\n.filter-date-dialog-container {\n  border: 1px solid #707070;\n  box-shadow: 2px 2px 10px #707070;\n  width: 450px;\n  height: 150px;\n}\n.filter-date-dialog-container * {\n  box-sizing: border-box;\n  font-family: \"Segoe UI\", Calibri, Thonburi, Arial, Verdana, sans-serif, \"Mongolian Baiti\", \"Microsoft Yi Baiti\", \"Javanese Text\";\n}\n.filter-date-dialog-container *:not(input) {\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n.date-title-class {\n  height: 20%;\n  font-size: 12px;\n  color: #000000;\n  background-color: white;\n  padding-left: 10px;\n}\n.date-title-class > .label-title {\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  display: inline-block;\n  padding-top: 10px;\n  height: 100%;\n}\n\n.date-filter-body {\n  font-size: 12px;\n  padding: 6px 9px 9px 9px;\n  background-color: rgb(240, 240, 240);\n  height: 80%;\n}\n.date-filter-body > .confirm-class {\n  margin-bottom: 2px;\n}\n.date-filter-body .input-between-container {\n  display: inline-block;\n  width: 64%;\n  margin-left: 2%;\n}\n.date-filter-body > div:first-child {\n  margin-bottom: 3px;\n  position: relative;\n}\n.date-filter-body > div:last-child {\n  position: absolute;\n  right: 12px;\n  bottom: 12px;\n}\n\n.date-split-line {\n  display: inline-block;\n  margin-bottom: 3px;\n  width: 100%;\n  border-bottom: 1px solid rgb(220, 220, 220);\n}\n\n.date-select {\n  display: inline-block;\n  margin: 2% 0 2% 2%;\n  border: 1px solid #abadb3;\n  outline: none;\n  width: 30%;\n  height: 22px;\n}\n\n.date-and-joiner {\n  display: inline-block;\n  text-align: right;\n  width: 25px;\n  height: 20px;\n}\n\n.input-of-between-date {\n  margin-left: 10px;\n  display: inline-block;\n  text-align: left;\n  border: none;\n  outline: none;\n  width: 110px;\n  height: 20px;\n}\n\n.gc-pivot-sort-dialog-container {\n  border: 1px solid #707070;\n  box-shadow: 2px 2px 10px #707070;\n  width: 450px;\n  height: 400px;\n}\n.gc-pivot-sort-dialog-container * {\n  box-sizing: border-box;\n  font-family: \"Segoe UI\", Calibri, Thonburi, Arial, Verdana, sans-serif, \"Mongolian Baiti\", \"Microsoft Yi Baiti\", \"Javanese Text\";\n}\n.gc-pivot-sort-dialog-container *:not(input) {\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n.gc-sort-dialog-title {\n  height: 36px;\n  font-size: 12px;\n  color: #000000;\n  background-color: white;\n  padding-left: 10px;\n}\n.gc-sort-dialog-title > .label-title {\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  display: inline-block;\n  padding-top: 10px;\n  height: 100%;\n  width: calc(100% - 50px);\n  cursor: move;\n}\n\n.gc-sort-dialog-body {\n  font-size: 12px;\n  padding: 6px 9px 9px 9px;\n  background-color: rgb(240, 240, 240);\n  height: 80%;\n  height: 364px;\n}\n.gc-sort-dialog-body > div:first-child {\n  position: relative;\n  margin-bottom: 6px;\n}\n.gc-sort-dialog-body > .confirm-class {\n  margin-bottom: 2px;\n}\n.gc-sort-dialog-body input.selectable-item {\n  margin-top: 0px;\n}\n\n.gc-sort-more-options {\n  position: absolute;\n  left: 15px;\n  width: 125px;\n}\n\n.gc-sort-close-dialog {\n  position: absolute;\n  bottom: 12px;\n  right: 12px;\n  width: 100%;\n  display: flex;\n  justify-content: flex-end;\n}\n.gc-sort-close-dialog .gc-sort-confirm-close-dialog {\n  float: right;\n}\n\n.gc-sort-summary {\n  display: block;\n  margin-left: 25px;\n  font-size: 11px;\n  margin-top: 11px;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: pre;\n}\n\n.gc-sort-select {\n  display: block;\n  width: 90%;\n  margin-left: 30px;\n  margin-bottom: 5px;\n  margin-top: 5px;\n}\n\n.gc-sort-range-selector {\n  background-color: #fff;\n  border: 1px solid #a9a9a9;\n  height: 20px;\n  overflow: hidden;\n}\n\n.gc-sort-range-select {\n  padding: 1px;\n  display: flex;\n  border: 1px solid #d3d3d3;\n  height: 100%;\n  background-color: white;\n}\n.gc-sort-range-select .gc-sort-range-input {\n  padding-left: 2px;\n  width: calc(100% - 24px);\n  border: none;\n  padding-top: 1px;\n  padding-bottom: 1px;\n  align-self: center;\n  font-family: inherit;\n  font-size: inherit;\n}\n.gc-sort-range-select:hover:not(.disable) {\n  border: 1px solid gray;\n}\n.gc-sort-range-select .gc-sort-range-select-button {\n  display: inline-block;\n  width: 20px;\n  height: 20px;\n  padding: 1px;\n  align-self: center;\n  cursor: pointer;\n}\n.gc-sort-range-select .gc-sort-range-select-button span {\n  display: block;\n  width: 20px;\n  height: 20px;\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+U1BKUyBBbm90aGVyLVNlbGVjdGluZzwvdGl0bGU+CiAgICA8ZyBpZD0iU1BKUy1Bbm90aGVyLVNlbGVjdGluZyIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9IlN3aXRjaC1yb3cvY29sdW1uIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjAwMDAwMCwgMS4wMDAwMDApIj4KICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS04IiBmaWxsPSIjRDVENUQ1IiB4PSIwIiB5PSIwIiB3aWR0aD0iMTYiIGhlaWdodD0iMTMiPjwvcmVjdD4KICAgICAgICAgICAgPHJlY3QgaWQ9IuefqeW9oiIgZmlsbD0iI0ZGRkZGRiIgeD0iMyIgeT0iNSIgd2lkdGg9IjEwIiBoZWlnaHQ9IjQiPjwvcmVjdD4KICAgICAgICAgICAgPHBhdGggZD0iTTMsNSBMMTMsNSBMMTMsOSBMMyw5IEwzLDUgWiBNNCw2IEw0LDggTDEyLDggTDEyLDYgTDQsNiBaIiBpZD0i55+p5b2iIiBmaWxsPSIjNjY2NjY2IiBmaWxsLXJ1bGU9Im5vbnplcm8iPjwvcGF0aD4KICAgICAgICAgICAgPHBhdGggZD0iTTAsMCBMMTYsMCBMMTYsMTMgTDAsMTMgTDAsMCBaIE0xLDEgTDEsMTIgTDE1LDEyIEwxNSwxIEwxLDEgWiIgaWQ9IuefqeW9oiIgZmlsbD0iIzY2NjY2NiIgZmlsbC1ydWxlPSJub256ZXJvIj48L3BhdGg+CiAgICAgICAgICAgIDxnIGlkPSLnvJbnu4QtOCI+CiAgICAgICAgICAgICAgICA8cmVjdCBpZD0i55+p5b2iIiBmaWxsPSIjODFCRUZDIiB4PSIxIiB5PSIxIiB3aWR0aD0iMTQiIGhlaWdodD0iMiI+PC9yZWN0PgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTE2LDAgTDE2LDQgTDAsNCBMMCwwIEwxNiwwIFogTTE1LDEgTDEsMSBMMSwzIEwxNSwzIEwxNSwxIFoiIGlkPSLlvaLnirbnu5PlkIgiIGZpbGw9IiMzNjdGQzkiIGZpbGwtcnVsZT0ibm9uemVybyI+PC9wYXRoPgogICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDxnIGlkPSLnvJbnu4QtOSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMi41ODc3NjcsIDYuMDAwMDAwKSIgZmlsbC1ydWxlPSJub256ZXJvIj4KICAgICAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJTaGFwZSIgZmlsbD0iI0ZBNzU0MSIgcG9pbnRzPSI1LjQxMjIzMjg1IDcgMi40MTIyMzI4NSAzLjk5NTM1Mjk1IDQuNDEyMjMyODUgMy45OTUzNTI5NSA0LjQxMjIzMjg1IDEgNi40MTIyMzI4NSAxIDYuNDEyMjMyODUgMy45OTUzNTI5NSA4LjQxNDAzOTk4IDMuOTk1MzUyOTUiPjwvcG9seWdvbj4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMC44MjY2NDAyLDIuOTk1MzUyOTUgTDUuNDEyMDE5ODEsOC40MTUwOTU5NCBMMC4wMDA2NTkxMTExNjIsMi45OTUzNTI5NSBMMy40MTIyMzI4NSwyLjk5NTM1Mjk1IEwzLjQxMjIzMjg1LDAgTDcuNDEyMjMyODUsMCBMNy40MTIyMzI4NSwyLjk5NTM1Mjk1IEwxMC44MjY2NDAyLDIuOTk1MzUyOTUgWiBNNS40MTIyMzI4NSw3IEw4LjQxNDAzOTk4LDMuOTk1MzUyOTUgTDYuNDEyMjMyODUsMy45OTUzNTI5NSBMNi40MTIyMzI4NSwxIEw0LjQxMjIzMjg1LDEgTDQuNDEyMjMyODUsMy45OTUzNTI5NSBMMi40MTIyMzI4NSwzLjk5NTM1Mjk1IEw1LjQxMjIzMjg1LDcgWiIgaWQ9IlNoYXBlIiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==);\n  background-repeat: no-repeat;\n  background-position: center center;\n}\n.gc-sort-range-select.disable {\n  background-color: rgb(235, 235, 228);\n}\n.gc-sort-range-select.disable .gc-sort-range-select-button {\n  cursor: default;\n}\n\n.gc-sort-disabled {\n  opacity: 0.6;\n  pointer-events: none;\n  cursor: default;\n}\n\n.gc-pivot-sort-value-dialog-container {\n  border: 1px solid #707070;\n  box-shadow: 2px 2px 10px #707070;\n  width: 450px;\n  height: 300px;\n}\n.gc-pivot-sort-value-dialog-container * {\n  box-sizing: border-box;\n  font-family: \"Segoe UI\", Calibri, Thonburi, Arial, Verdana, sans-serif, \"Mongolian Baiti\", \"Microsoft Yi Baiti\", \"Javanese Text\";\n}\n.gc-pivot-sort-value-dialog-container *:not(input) {\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n.gc-sort-value-dialog-body {\n  font-size: 12px;\n  padding: 6px 9px 9px 9px;\n  background-color: rgb(240, 240, 240);\n  height: 80%;\n  height: 264px;\n}\n.gc-sort-value-dialog-body > div:first-child {\n  position: relative;\n  margin-bottom: 6px;\n}\n.gc-sort-value-dialog-body > .confirm-class {\n  margin-bottom: 2px;\n}\n\n.gc-pivot-sort-half-split-area {\n  display: inline-block;\n  width: 48%;\n  margin-left: 2px;\n  margin-right: 2px;\n}\n.gc-pivot-sort-half-split-area > .confirm-class {\n  margin-bottom: 2px;\n}\n\n.gc-pivot-field-setting-wrapper {\n  background-color: transparent;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n.gc-pivot-field-setting-wrapper input[type=button] {\n  display: inline-block;\n  margin: 0px;\n}\n\n.gc-sort-range-select-container {\n  border: 1px solid #707070;\n  box-shadow: 2px 2px 10px #707070;\n  width: 450px;\n  height: 70px;\n}\n.gc-sort-range-select-container * {\n  box-sizing: border-box;\n  font-family: \"Segoe UI\", Calibri, Thonburi, Arial, Verdana, sans-serif, \"Mongolian Baiti\", \"Microsoft Yi Baiti\", \"Javanese Text\";\n}\n.gc-sort-range-select-container *:not(input) {\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n.gc-sort-range-select-body {\n  font-size: 12px;\n  padding: 6px 9px 9px 9px;\n  background-color: rgb(240, 240, 240);\n  height: 80%;\n  height: 34px;\n}\n.gc-sort-range-select-body > .confirm-class {\n  margin-bottom: 2px;\n}\n\n.gc-pivot-dialog-close:hover {\n  background-color: #E81123;\n  color: white;\n}\n\n.pivot-field-setting-control {\n  width: 75px;\n  height: 23px;\n  line-height: 21px;\n  font-size: 12px;\n  background-color: rgb(225, 225, 225);\n  border: 1px solid rgb(194, 194, 194);\n  padding: 0px;\n  display: inline-block;\n  margin-left: 10px;\n}\n\n.pivot-field-setting-control-format {\n  width: 100px;\n  height: 23px;\n  line-height: 21px;\n  font-size: 12px;\n  background-color: rgb(225, 225, 225);\n  border: 1px solid rgb(194, 194, 194);\n  padding: 0px;\n  display: inline-block;\n}\n\n.pivot-field-setting-control:hover {\n  border: 1px solid rgb(50, 150, 200);\n  background-color: rgba(191, 216, 231, 0.9);\n}\n\n.pivot-field-setting-control-format:hover {\n  border: 1px solid rgb(50, 150, 200);\n  background-color: rgba(191, 216, 231, 0.9);\n}\n\n.pivot-field-row-wrap {\n  width: 100%;\n  margin: 10px 0;\n}\n.pivot-field-row-wrap > span {\n  display: inline-block;\n  margin-left: 5px;\n  vertical-align: middle;\n}\n.pivot-field-row-wrap > span > input {\n  border: 1px solid #d1d1d1;\n  outline: none;\n  height: 22px;\n  width: 245px;\n  box-sizing: border-box;\n}\n\n.gc-pivot-field-setting-content {\n  padding: 0 12px;\n  box-sizing: border-box;\n  background-color: rgb(240, 240, 240);\n}\n.gc-pivot-field-setting-content label {\n  display: inline-block;\n  padding: 0px;\n  vertical-align: middle;\n}\n\n.gc-sjs-field-settings-layout-style {\n  font-size: 12px;\n  font-weight: 700;\n}\n\n.gc-sjs-field-settings-layout-line {\n  border-bottom: 1px solid #c8c8c8;\n  margin: 3px 15px 5px 0px;\n}\n\n.gc-sjs-field-settings-layout-showNoData-container {\n  background-color: #f0f0f0;\n  padding-bottom: 5px;\n}\n.gc-sjs-field-settings-layout-showNoData-container .gc-sjs-field-settings-layout-showNoData, .gc-sjs-field-settings-layout-showNoData-container .gc-sjs-field-settings-layout-showSubtotalTop {\n  margin: 0px;\n  appearance: none;\n  outline: none;\n  display: inline-block;\n  width: 13px;\n  height: 13px;\n  background-color: white;\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTRweCIgaGVpZ2h0PSIxNHB4IiB2aWV3Qm94PSIwIDAgMTQgMTQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+Y2hlY2tfZGFyazwvdGl0bGU+CiAgICA8ZyBpZD0iY2hlY2tfZGFyayIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPHBhdGggZD0iTTEzLDEgTDEzLDEzIEwxLDEzIEwxLDEgTDEzLDEgWiBNMTIsMiBMMiwyIEwyLDEyIEwxMiwxMiBMMTIsMiBaIiBpZD0i5b2i54q257uT5ZCIIiBmaWxsPSIjNjk2OTY5Ij48L3BhdGg+CiAgICA8L2c+Cjwvc3ZnPg==);\n}\n.gc-sjs-field-settings-layout-showNoData-container .gc-sjs-field-settings-layout-showNoData:checked, .gc-sjs-field-settings-layout-showNoData-container .gc-sjs-field-settings-layout-showSubtotalTop:checked {\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTRweCIgaGVpZ2h0PSIxNHB4IiB2aWV3Qm94PSIwIDAgMTQgMTQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+Y2hlY2tfZGFyazwvdGl0bGU+CiAgICA8ZyBpZD0iY2hlY2tfZGFyayIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPHBvbHlnb24gaWQ9IlBhdGgtNCIgZmlsbD0iIzY5Njk2OSIgZmlsbC1ydWxlPSJub256ZXJvIiBwb2ludHM9IjExLjA2MDIyNjkgMyAxMiAzLjc1MDMxMDI5IDUuODIxNDMxODEgMTEgMiA3LjE0MDcwNzQzIDIuOTM5NzczMTQgNi4zOTAzOTcxMyA1LjgyMTQzMTgxIDkuMzAwNjA1OCI+PC9wb2x5Z29uPgogICAgICAgIDxwYXRoIGQ9Ik0xMywxIEwxMywxMyBMMSwxMyBMMSwxIEwxMywxIFogTTEyLDIgTDIsMiBMMiwxMiBMMTIsMTIgTDEyLDIgWiIgaWQ9IuW9oueKtue7k+WQiCIgZmlsbD0iIzY5Njk2OSI+PC9wYXRoPgogICAgPC9nPgo8L3N2Zz4=);\n}\n\n.pivot-field-summarize-header {\n  clear: both;\n  width: 100%;\n  height: 30px;\n}\n\n.pivot-field-summarize-item {\n  float: left;\n  padding: 0 10px;\n  line-height: 30px;\n}\n\n.pivot-field-summarize-item.active {\n  background-color: white;\n}\n\n.pivot-field-summarize-content-header,\n.pivot-field-show-value-as-content-header {\n  font-weight: 500;\n  color: black;\n  font-size: 13px;\n  padding: 5px 0px;\n  margin: 5px 0px;\n  border-bottom: 1px solid #ddd;\n  width: 320px;\n}\n\n.pivot-field-summarize-content-desc {\n  height: 40px;\n  max-width: 320px;\n  margin-bottom: 5px;\n}\n\n.pivot-field-summarize-content,\n.pivot-field-show-value-as-content {\n  background-color: white;\n  padding: 10px 10px;\n}\n.pivot-field-summarize-content input,\n.pivot-field-show-value-as-content input {\n  outline: none;\n  font-size: 12px;\n}\n.pivot-field-summarize-content select,\n.pivot-field-show-value-as-content select {\n  outline: none;\n  font-size: 12px;\n  margin-top: 5px;\n  height: 22px;\n  margin-bottom: 10px;\n  border: 1px solid #d1d1d1;\n}\n\n.pivot-field-summarize-content-list {\n  overflow-y: auto;\n  max-height: 110px;\n  padding-left: 0;\n  margin: 0;\n  border: 1px solid black;\n}\n\n.pivot-field-content-item,\n.pivot-field-content-base-item-item,\n.pivot-field-content-base-field-item,\n.pivot-field-content-number-format-item {\n  list-style-type: none;\n  line-height: 14px;\n  height: 18px;\n  text-indent: 8px;\n  white-space: nowrap;\n}\n\n.pivot-field-content-item.active,\n.pivot-field-content-base-item-item.active,\n.pivot-field-content-base-field-item.active,\n.pivot-field-content-number-format-item.active {\n  background-color: rgb(0, 120, 215);\n  color: white;\n  border: 1px dotted #ff8728;\n  box-sizing: border-box;\n}\n\n.pivot-field-setting-footer {\n  position: relative;\n  background-color: rgb(240, 240, 240);\n  padding: 12px 0px 12px 0;\n  clear: both;\n  height: 23px;\n}\n\n.pivot-field-setting-name-area {\n  overflow: hidden;\n}\n\n.pivot-field-setting-control-wrap {\n  position: absolute;\n  right: 12px;\n  bottom: 12px;\n}\n\n.pivot-field-setting-control-wrap-left {\n  margin-left: 12px;\n  height: 23px;\n}\n\n.gc-panel-view-name {\n  float: left;\n  width: 85%;\n  text-overflow: ellipsis;\n  overflow: hidden;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  white-space: nowrap;\n}\n\n.value-filter::-webkit-inner-spin-button {\n  -webkit-appearance: none;\n}\n\n.value-filter::-webkit-outer-spin-button {\n  -webkit-appearance: none;\n}\n\n.pivot-field-content-hide {\n  display: none;\n}\n\n.pivot-field-show-value-as-content-base-field,\n.pivot-field-show-value-as-content-base-item {\n  overflow-y: auto;\n  padding-left: 0;\n  margin: 0;\n  border: 1px solid black;\n  height: 97px;\n}\n\n.pivot-field-show-value-as-content-type-list {\n  width: 100%;\n  height: 24px;\n}\n\n.pivot-field-show-value-as-content-base-field-list {\n  display: inline-block;\n  width: 49%;\n}\n.pivot-field-show-value-as-content-base-field-list > div:first-child {\n  margin-bottom: 2px;\n}\n\n.pivot-field-show-value-as-content-base-item-list {\n  display: inline-block;\n  width: 49%;\n  float: right;\n}\n.pivot-field-show-value-as-content-base-item-list > div:first-child {\n  margin-bottom: 2px;\n}\n\n.pivot-field-show-value-as-content-base-field.disable,\n.pivot-field-show-value-as-content-base-item.disable {\n  color: gray;\n}\n\n.pivot-field-number-format-content-list {\n  max-height: 143px;\n  overflow: auto;\n  margin-top: 12px;\n  box-sizing: border-box;\n  margin-bottom: 0px;\n  padding-left: 0px;\n  background-color: white;\n  border: 1px solid black;\n  width: 100%;\n}\n\n.pivot-field-number-format-show-value {\n  width: 100%;\n  height: 22px;\n  border: 1px solid #d1d1d1;\n  box-sizing: border-box;\n}\n\n.pivot-field-number-format-area {\n  width: 348px;\n}\n\n.pivot-field-number-format-sample-value {\n  width: 100%;\n  height: 22px;\n  box-sizing: border-box;\n}\n\n.pivot-field-custom-name {\n  font-size: 12px;\n}\n\n.gc-pivot-search-box {\n  display: flex;\n  height: 25px;\n  justify-content: center;\n  flex-wrap: nowrap;\n}\n.gc-pivot-search-box .gc-pivot-search-box-input-container {\n  display: flex;\n  border: 1px solid #c6c6c6;\n  width: calc(100% - 40px);\n  margin-left: 9px;\n  height: 100%;\n  flex-wrap: nowrap;\n}\n.gc-pivot-search-box .gc-pivot-search-box-input-container .gc-pivot-search-box-input {\n  display: flex;\n  flex-grow: 1;\n  border: 0px;\n  outline-style: none;\n  border-right: 0px;\n}\n.gc-pivot-search-box .gc-pivot-search-box-input-container .gc-pivot-search-box-icon {\n  display: none;\n  flex-shrink: 0;\n  width: 25px;\n  height: 25px;\n  border: 0px;\n  border-left: 0px;\n}\n\n.gc-pivot-search-box-icon-background-clear {\n  width: 100%;\n  height: 100%;\n  margin-top: 4px;\n  margin-left: 6px;\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAAIJJREFUOE+lkssNgDAMQzsCw3UMxEocGKWDQSLVUj5GJeLwhPyI0x7a9qP/gsoKVFagskIUm3ALp3GKZvX63/q0QIcAlqAMXMcFIQ6z7DouTGLptawkMVmeDJi8BFsGQ0jzUcRyvEla4oLAhvVrveu4IOAdxJOwZPkOylBZgcrv9PYAV9tkcyJlS4sAAAAASUVORK5CYII=);\n  background-repeat: no-repeat;\n}\n\n.gc-pivot-search-box-icon:hover {\n  background-color: rgb(249, 204, 117);\n}\n\n.gc-timeline-level-dropdown {\n  font-family: \"Segoe UI\", Calibri, Thonburi, Arial, Verdana, sans-serif, \"Mongolian Baiti\", \"Microsoft Yi Baiti\", \"Javanese Text\";\n  width: 120px;\n  font-size: 12px;\n  border: 1px solid darkgray;\n  position: absolute;\n  background-color: white;\n}\n\n.gc-timeline-level-block {\n  height: 25px;\n  line-height: 20px;\n}\n\n.gc-timeline-level-block:hover {\n  background-color: #e9f5ee;\n}\n\n.gc-timeline-level-text {\n  display: inline-block;\n}\n\n.gc-timeline-selected-level {\n  display: inline-block;\n  width: 35px;\n  vertical-align: middle;\n  text-align: center;\n}\n\n.gcSpread.shape-editor-container {\n  font: 14.6667px Calibri, Helvetica Neue, Arial, sans-serif;\n  outline: none;\n  resize: none;\n  box-sizing: content-box;\n  position: fixed;\n  z-index: -1;\n  display: table;\n  left: 0px;\n  top: 0px;\n  width: 0px;\n  height: 0px;\n}\n\n.gcSpread.shape-editor {\n  outline: none;\n  resize: none;\n  border: none;\n  box-sizing: content-box;\n  overflow: hidden;\n  display: table-cell;\n  word-wrap: break-word;\n  white-space: pre-wrap;\n  text-align: left;\n  vertical-align: top;\n  float: none;\n  -webkit-user-select: text;\n  user-select: text;\n  max-width: 0px;\n}\n\n.gc-defined-column-container {\n  --sjs-dc-input-height: 32px;\n  --sjs-dc-color: #222222;\n  --sjs-dc-color-white: #fff;\n  --sjs-dc-background-color: #fcfdfd;\n  --sjs-dc-accent: #dbdbdb;\n  --sjs-dc-accent-light: rgba(219, 219, 219, 0.5607843137);\n  --sjs-dc-accent-heavy: rgba(0, 0, 0, 0.4509803922);\n  --sjs-dc-invalid-color: red;\n  --sjs-dc-font-size: 13px;\n  --sjs-dc-font-family:Segoe UI, Calibri, Thonburi, Arial, Verdana, sans-serif, Mongolian Baiti, Microsoft Yi Baiti, Javanese Text;\n  --sjs-dc-hover-background-color:#d3f0e0;\n  font-size: var(--sjs-dc-font-size);\n  font-family: var(--sjs-dc-font-family);\n  color: var(--sjs-dc-color);\n  background-color: var(--sjs-dc-background-color);\n  --sjs-theme-accent: var(--sjs-dc-accent);\n  --sjs-theme-gray-bg: var(--sjs-dc-accent-light);\n}\n.gc-defined-column-container .gc-defined-column-field-label-validation-container {\n  color: var(--sjs-dc-invalid-color);\n}\n.gc-defined-column-container .gc-defined-column-quieter, .gc-defined-column-container .gc-defined-column-click-quieter, .gc-defined-column-container .gc-defined-column-input-number .gc-defined-column-field-spin-buttons-container div {\n  opacity: 0.5;\n}\n.gc-defined-column-container .gc-defined-column-quieter-light, .gc-defined-column-container .gc-defined-column-input-number .gc-defined-column-field-spin-buttons-container div {\n  opacity: 0.75;\n}\n.gc-defined-column-container .gc-defined-column-unquiet, .gc-defined-column-container .gc-defined-column-click-quieter:hover, .gc-defined-column-container .gc-defined-column-input-number .gc-defined-column-field-spin-buttons-container div:hover {\n  opacity: 1;\n}\n.gc-defined-column-container .gc-defined-column-click, .gc-defined-column-container .gc-defined-column-type-select-container .gc-defined-column-types-container .gc-defined-column-field-type-container, .gc-defined-column-container .gc-defined-column-click-quieter, .gc-defined-column-container .gc-defined-column-input-number .gc-defined-column-field-spin-buttons-container div {\n  cursor: pointer;\n}\n.gc-defined-column-container .gc-defined-column-type-icon-number {\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0ibTEzIDQuNjI3LS4yNDYgMS4wNmgtMi42OTNsLS42MzggMi42ODZoMi44NGwtLjI0NiAxLjA0MmgtMi44Nkw4LjI3MyAxM0g2Ljg0OGwuODg0LTMuNTg1SDUuMTE4TDQuMjMzIDEzSDIuODA4bC44ODUtMy41ODVIMWwuMjQ2LTEuMDQyaDIuNzEybC42NC0yLjY4N2gtMi44NmwuMjQ1LTEuMDU5aDIuODZMNS43MTcgMWgxLjQyNmwtLjg3NSAzLjYyN2gyLjYxNEw5Ljc1NyAxaDEuNDI1bC0uODc1IDMuNjI3SDEzWm0tNC4zNjQgMS4wNkg2LjAyMmwtLjYzOSAyLjY4NmgyLjYxNWwuNjM4LTIuNjg3WiIgZmlsbD0iIzY2NiIgZmlsbC1ydWxlPSJub256ZXJvIi8+PC9zdmc+);\n}\n.gc-defined-column-container .gc-defined-column-type-icon-text {\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0ibTUuMTEgOC4xNDguNjYtMS45NTFjLjQ3LTEuMzYuODg2LTIuNjQgMS4zMDMtNC4wNjZoLjA3Yy40MzQgMS40MS44MzQgMi43MDUgMS4zMiA0LjA2NmwuNjYgMS45NUg1LjExWk0xMC43NTcgMTNoMS41MjlMNy45MjUgMUg2LjM0NEwyIDEzaDEuNDQybDEuMzAzLTMuNzg3aDQuNzQzTDEwLjc1NyAxM1oiIGZpbGw9IiM2NjYiIGZpbGwtcnVsZT0ibm9uemVybyIvPjwvc3ZnPg==);\n}\n.gc-defined-column-container .gc-defined-column-type-icon-formula {\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTguODMzIDBjLjQxMSAwIC43NDkuMTA1IDEuMDA4LjMxNi4yNjMuMjE0LjQuNDU3LjQuNzI1YS43NDMuNzQzIDAgMCAxLS4yMTUuNTQzLjc0OC43NDggMCAwIDEtLjU0OC4yMTUuNjk5LjY5OSAwIDAgMS0uNDgxLS4xNjguNTU4LjU1OCAwIDAgMS0uMi0uNDI2YzAtLjA4LjAyMy0uMTY5LjA2Ny0uMjY1bC4xMDItLjE5NGEuNzMuNzMgMCAwIDAgLjAyOS0uMDYxYzAtLjAyNS0uMDA1LS4wMzUtLjAwOS0uMDRDOC45NTMuNjIgOC44OS42MDUgOC43OTYuNjA1Yy0uMjg2IDAtLjUzOC4wODYtLjc2MS4yNjEtLjMxNi4yNDUtLjYwNi42MzYtLjg2NSAxLjE3MmwtLjA2NS4xNDZjLS4xMTkuMjktLjI5Ny44MDItLjUzIDEuNTI4bC0uMDg2LjI3aDEuMTA4bC0uMTk0LjY3My0uMTQxLjEwNi0uOTgtLjAwMS0uODA0IDMuMTA0Yy0uMzM2IDEuMjkxLS42NzMgMi4zMjEtMS4wMTIgMy4wOTJsLS4xMDEuMjIzYy0uNTQxIDEuMTEzLTEuMTIzIDEuODg0LTEuNzUgMi4zMS0uNDg0LjM0LS45NzQuNTEyLTEuNDY4LjUxMi0uMzQgMC0uNjMtLjEtLjg1Ni0uMjk3YS43Mi43MiAwIDAgMS0uMjkxLS41OWMwLS4xOTkuMDgyLS4zNzUuMjQtLjUyYS44MTMuODEzIDAgMCAxIC41NjItLjIxYy4xNyAwIC4zMi4wNTMuNDQyLjE2LjEyNC4xMDkuMTkuMjQ0LjE5LjM5OGEuNTA1LjUwNSAwIDAgMS0uMTM3LjM0bC0uMTIxLjExMi4wMTkuMDA2LjA3NC4wMDZjLjE5MiAwIC4zOTUtLjA2LjYxLS4xODMuMjE2LS4xMi40MTItLjMwNC41ODktLjU1LjE3Ni0uMjQ3LjM0OC0uNjEzLjUxMy0xLjA5MmwuMTQtLjQ4Yy4wOTktLjM1NC4yNC0uODc0LjQxOC0xLjU0OUw0LjggNC43NkgzLjVsLjE0LS42NjEuMTQ0LS4xMTdjLjQwMiAwIC42OC0uMDI3LjgyNi0uMDc4QS45Mi45MiAwIDAgMCA1IDMuNjJjLjEyNi0uMTQ1LjMwMS0uNDM1LjUyMS0uODY0LjI5Ni0uNTkuNTg2LTEuMDU0Ljg3LTEuMzg4LjM4LS40NTQuNzg0LS43OTUgMS4yMTItMS4wMjMuNDMtLjIzLjg0LS4zNDUgMS4yMjktLjM0NVptNC4zMTkgMy44Yy4yNDYgMCAuNDUxLjA2OS42MDguMjEuMTU4LjE0Mi4yNC4zMTkuMjQuNTE5IDAgLjIyNi0uMDQ4LjM5LS4xNjEuNDk1YS44NDYuODQ2IDAgMCAxLS41NzQuMjE5Yy0uMDg1IDAtLjE3Mi0uMDExLS4yNi0uMDMybC0uMzI3LS4xMDFhMS4wMjIgMS4wMjIgMCAwIDAtLjIyOC0uMDVjLS4wODQgMC0uMTk5LjA1NC0uMzM2LjE2Ny0uMjY1LjIxOC0uNTg0LjYyOC0uOTU1IDEuMjMybC0uMDk1LjE1OC42MDQgMi40NzJjLjA3Ny4zMi4xNDQuNTI5LjE5LjYxbC4wMTguMDI3Yy4wNC4wNDcuMDY2LjA2My4wOC4wNjNhLjM3Mi4zNzIgMCAwIDAgLjE4My0uMDdsLjA5Ny0uMDdjLjI1Ny0uMjEuNDg3LS40OTMuNjc2LS44MzRsLjE5Mi0uMDYuMjYyLjEyNS4wNjQuMjA0YTQuODQzIDQuODQzIDAgMCAxLTEuMjQ1IDEuNDg4Yy0uMjk3LjIzMS0uNTU4LjM1LS43OS4zNS0uMzQgMC0uNjEtLjE4My0uODAyLS41MzItLjA4Mi0uMTUtLjIxMy0uNTk4LS40MDMtMS4zNzNsLS4xODUtLjc4NC0uMTE5LjE5NmMtLjU5Ni45NzItMS4wOTcgMS42NC0xLjUwNyAyLjAxbC0uMS4wODZjLS4zMy4yNjItLjY1Ny4zOTctLjk4LjM5N2EuOTg4Ljk4OCAwIDAgMS0uNjUxLS4yNDkuNzEzLjcxMyAwIDAgMS0uMjI1LS41NDcuNzAzLjcwMyAwIDAgMSAuNzE3LS43MTFjLjE3IDAgLjMzOS4wNjUuNTEuMTlsLjEwMi4wODNjLjEwNS4wOTMuMTguMTM2LjIwMS4xMzYuMDIgMCAuMDctLjAyNS4xNDMtLjA4NS4xOTUtLjE1NS40NjItLjQ4Mi44MDEtLjk4MWwuMzM4LS41MTZjLjI4OC0uNDUuNDc4LS43NjYuNTY4LS45bC0uNDkxLTEuODc2Yy0uMTEtLjI5Mi0uMjQ3LS40OTItLjQwNS0uNjAyLS4xNTgtLjExLS40LS4xNjktLjczLS4xNjktLjEyOSAwLS4yNTkuMDAzLS4zOTUuMDFsLS4xNTMtLjE0OHYtLjI2NWwuMTIyLS4xNDUgMi4wMTEtLjM0NS4xMzEuMDQzYy4yNTEuMjY0LjQ0NS41MzMuNTc1Ljc5OS4wNTQuMTAzLjEyMy4yODcuMjEuNTU4bC4xNjYuNTU2LjQ4OC0uNzExYTMuOTYgMy45NiAwIDAgMSAuNDcyLS41MzNsLjE4Ni0uMTY3Yy4yNi0uMjIzLjQ5NS0uMzc1LjY5OC0uNDUyYTEuMDggMS4wOCAwIDAgMSAuNDY0LS4wOTVaIiBmaWxsPSIjNjY2IiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48L3N2Zz4=);\n}\n.gc-defined-column-container .gc-defined-column-type-icon-checkbox {\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0ibTExLjggMi0uOSAxSDJ2OWg5VjcuNTc4bDEtMS4xMTFWMTNIMVYyaDEwLjhabTEuMTM2IDAgLjg5Ny43ODhMNi45ODEgMTAuNCAzLjMzMyA2LjM0OGwuODk3LS43ODggMi43NTEgMy4wNTZMMTIuOTM2IDJaIiBmaWxsPSIjNjY2IiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48L3N2Zz4=);\n}\n.gc-defined-column-container .gc-defined-column-type-icon-date {\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTYgMHYxaDNWMGgxdjFoNHYxMkgxVjFoNFYwaDFabTcgNUgydjdoMTFWNVptLTMgMXYuMzUxTDcuMzkgMTFINi4xOGwyLjQzMi00SDZWNmg0Wk01IDJIMnYyaDExVjJoLTN2MUg5VjJINnYxSDVWMloiIGZpbGw9IiM2NjYiIGZpbGwtcnVsZT0ibm9uemVybyIvPjwvc3ZnPg==);\n}\n.gc-defined-column-container .gc-defined-column-type-icon-currency {\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTcuNSAwYS41LjUgMCAwIDEgLjUuNWwtLjAwMS45OTkuNTAxLjAwMWEzIDMgMCAwIDEgMyAzIC41LjUgMCAxIDEtMSAwIDIgMiAwIDAgMC0yLTJINi4yNWEyIDIgMCAxIDAgMCA0SDlhMyAzIDAgMCAxIDAgNmwtMS4wMDEtLjAwMUw4IDEzLjVhLjUuNSAwIDEgMS0xIDBsLS4wMDEtMS4wMDFMNiAxMi41YTMgMyAwIDAgMS0zLTMgLjUuNSAwIDEgMSAxIDAgMiAyIDAgMCAwIDIgMmgzYTIgMiAwIDEgMCAwLTRINi4yNWEzIDMgMCAxIDEgMC02bC43NDktLjAwMUw3IC41YS41LjUgMCAwIDEgLjUtLjVaIiBmaWxsPSIjNjY2IiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48L3N2Zz4=);\n}\n.gc-defined-column-container .gc-defined-column-type-icon-percent {\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEgNC4xMDFjMC0uOTQ5LjI0LTEuNzAzLjcyLTIuMjYyQzIuMiAxLjI3OSAyLjg0NyAxIDMuNjYgMWMuNzggMCAxLjM5LjI1NyAxLjgyNy43NzIuNDM3LjUxNC42NTYgMS4yMy42NTYgMi4xNSAwIC45MTMtLjI0MSAxLjY1NS0uNzI0IDIuMjI0LS40ODIuNTctMS4xMjMuODU0LTEuOTIyLjg1NC0uNzU3IDAtMS4zNjItLjI2NS0xLjgxNi0uNzk0QzEuMjI3IDUuNjc2IDEgNC45NzUgMSA0LjEwMVptLjg1Ny0uMDY2YzAgLjY3NC4xNTMgMS4xOTQuNDYgMS41Ni4zMDYuMzY1LjcyNC41NDggMS4yNTQuNTQ4LjU0NyAwIC45Ny0uMTkgMS4yNjgtLjU2OC4yOTgtLjM3OS40NDctLjkxMy40NDctMS42MDIgMC0uNjc0LS4xNDctMS4xOTUtLjQ0LTEuNTYzLS4yOTItLjM2OS0uNzAzLS41NTMtMS4yMzQtLjU1My0uNTQgMC0uOTY5LjE5Mi0xLjI4My41NzYtLjMxNS4zODQtLjQ3Mi45MTgtLjQ3MiAxLjYwMlptOS4yNjEtMi44NjJMMy44OTEgMTIuODk1SDIuNzI5TDkuOTU2IDEuMTczaDEuMTYyWm0tMy4yNiA4LjkzOWMwLS45NDUuMjQtMS43LjcyLTIuMjY1QzkuMDU4IDcuMjgyIDkuNzA0IDcgMTAuNTE0IDdjLjc3NiAwIDEuMzg1LjI1NyAxLjgyNS43NzIuNDQuNTE1LjY2MSAxLjI0LjY2MSAyLjE3NiAwIC45MDUtLjI0NCAxLjY0LS43MzIgMi4yMDUtLjQ4Ny41NjUtMS4xMjQuODQ3LTEuOTEuODQ3LS43NjMgMC0xLjM3LS4yNjctMS44MjItLjgwMi0uNDUzLS41MzUtLjY3OS0xLjIzLS42NzktMi4wODZabS44NTYtLjA2OWMwIC42Ni4xNTMgMS4xNzYuNDYgMS41NDUuMzA2LjM3LjcyNC41NTUgMS4yNTUuNTU1LjU0NiAwIC45NjktLjE5MSAxLjI2Ny0uNTc0LjI5OC0uMzgzLjQ0Ny0uOTE4LjQ0Ny0xLjYwNCAwLS42ODItLjE1LTEuMjA0LS40NDctMS41NjUtLjI5OC0uMzYyLS43MDctLjU0My0xLjIyNi0uNTQzLS41NTggMC0uOTkuMTkzLTEuMjk2LjU3OC0uMzA3LjM4NS0uNDYuOTIxLS40NiAxLjYwOFoiIGZpbGw9IiM2NjYiIGZpbGwtcnVsZT0ibm9uemVybyIvPjwvc3ZnPg==);\n}\n.gc-defined-column-container .gc-defined-column-type-icon-phone {\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTkuNjE1IDkuNDU3Yy0uMTgxLjE2Ny0uNDQuNDU0LS43NjguODU0bC0uMjg0LjM0NS0uMzg3LS4yMjRjLTEuODQ4LTEuMDc0LTMuMzM4LTIuNjU2LTQuMTgtNC40OWwtLjE1OC0uMzQ0LjI3Ni0uMjU5Yy4zNzctLjM1NC42NTMtLjYzMy44MjMtLjgzMS4wMzEtLjAzNi4wNjEtLjA3Mi4wOS0uMTFhNy40NTEgNy40NTEgMCAwIDEtLjI2OS0yLjE2IDEuMDM1IDEuMDM1IDAgMCAwLS40MjEtLjExbC0yLjE3OS0uMDc2Yy0uMDg2LS4wMDMtLjA5Ny4wMDctLjEuMDkzQTEwLjA2IDEwLjA2IDAgMCAwIDExLjc3IDEyLjU2Yy4wODIuMDAzLjA5Ny0uMDExLjEtLjA5NGwuMDc0LTIuMTJhMi42ODMgMi42ODMgMCAwIDAtLjAwMi0uMzQxYy0uMDE1LS4xODMtLjAwNy0uMTctLjA0LS4xNy0uNzQ0LjAyNy0xLjQ0OC0uMTE3LTIuMjQ3LS40MTVhMi4yNTIgMi4yNTIgMCAwIDAtLjA0LjAzN1ptLTEuMjg2LS4xNjRjLjIyNC0uMjYuNDE0LS40NjIuNTcxLS42MDguMzgyLS4zNTQuNjQ4LS41MDcuOTkzLS4zLjczNi4yODcgMS4zNDcuNDIyIDEuOTY3LjQuNzI1LS4wMzIgMS4wNzMuNDU3IDEuMTMgMS4xMzEuMDEzLjE0Ni4wMTIuMjYuMDA1LjQ2NmwtLjA3NCAyLjEyMWMtLjAyMy42NjUtLjUyNyAxLjEzMS0xLjE4OCAxLjEwOEExMS4xMTEgMTEuMTExIDAgMCAxIDEuMDA3IDIuMTA5QzEuMDMgMS40NDIgMS41MjcuOTc4IDIuMTk1IDFsMi4xNzguMDc2Yy43NDIuMDI2IDEuNDY0LjM5IDEuNDM5IDEuMTE3LS4wMjQuNzA1LjA3IDEuNDEuMjc1IDIuMDg0LjEyNi40MS0uMTEzLjc0LS45NzIgMS41Ni43MDkgMS4zNjggMS44MzUgMi41NyAzLjIxNCAzLjQ1NVoiIGZpbGw9IiM2NjYiIGZpbGwtcnVsZT0ibm9uemVybyIvPjwvc3ZnPg==);\n}\n.gc-defined-column-container .gc-defined-column-type-icon-email {\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEyIDJhMiAyIDAgMCAxIDIgMnY3YTIgMiAwIDAgMS0yIDJIMmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmgxMFptLjk2NiAxLjc0MUw4LjQxNCA4LjI5M2EyIDIgMCAwIDEtMi44MjggMEwxLjAzNCAzLjc0QzEuMDEyIDMuODI0IDEgMy45MTEgMSA0djdhMSAxIDAgMCAwIDEgMWgxMGExIDEgMCAwIDAgMS0xVjRjMC0uMDktLjAxMi0uMTc2LS4wMzQtLjI1OVpNMTIgM0gyYy0uMDkgMC0uMTc2LjAxMi0uMjU5LjAzNGw0LjU1MiA0LjU1MmExIDEgMCAwIDAgMS40MTQgMGw0LjU1Mi00LjU1MkExLjAwMSAxLjAwMSAwIDAgMCAxMiAzWiIgZmlsbD0iIzY2NiIgZmlsbC1ydWxlPSJub256ZXJvIi8+PC9zdmc+);\n}\n.gc-defined-column-container .gc-defined-column-type-icon-url {\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTYuMDg1IDcuOTE1YS42MzIuNjMyIDAgMCAxIDAgLjkyMi42NTQuNjU0IDAgMCAxLS45MjIgMCAzLjI0OCAzLjI0OCAwIDAgMSAwLTQuNTlMNy40NiAxLjk1YTMuMjQ4IDMuMjQ4IDAgMCAxIDQuNTkgMCAzLjI0OCAzLjI0OCAwIDAgMSAwIDQuNTlsLS45NjguOTY3YTQuNDg0IDQuNDg0IDAgMCAwLS4yNi0xLjU3bC4zMDYtLjMxMmExLjkzNiAxLjkzNiAwIDAgMCAwLTIuNzUzIDEuOTM2IDEuOTM2IDAgMCAwLTIuNzUzIDBMNi4wODUgNS4xNjNhMS45MzYgMS45MzYgMCAwIDAgMCAyLjc1Mm0xLjgzLTIuNzUyYS42NTQuNjU0IDAgMCAxIC45MjIgMCAzLjI0OCAzLjI0OCAwIDAgMSAwIDQuNTlMNi41NCAxMi4wNWEzLjI0OCAzLjI0OCAwIDAgMS00LjU5IDAgMy4yNDggMy4yNDggMCAwIDEgMC00LjU5bC45NjgtLjk2N2E0LjU0NSA0LjU0NSAwIDAgMCAuMjYgMS41NzdsLS4zMDYuMzA1YTEuOTM2IDEuOTM2IDAgMCAwIDAgMi43NTNjLjc2Ljc2NiAxLjk5My43NjYgMi43NTMgMGwyLjI5MS0yLjI5MmExLjkzNiAxLjkzNiAwIDAgMCAwLTIuNzUyLjYzMi42MzIgMCAwIDEgMC0uOTIyWiIgZmlsbD0iIzY2NiIgZmlsbC1ydWxlPSJub256ZXJvIi8+PC9zdmc+);\n}\n.gc-defined-column-container .gc-defined-column-type-icon-lookup {\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjExIDVhMy4xMSAzLjExIDAgMCAxIDMuMTEgMy4xMWMuMDAxLjY5LS4yMyAxLjM2Mi0uNjU3IDEuOTA1bDEuMzIyIDEuMzE4YS4zODkuMzg5IDAgMCAxIDAgLjU1Mi4zODkuMzg5IDAgMCAxLS41NTIgMGwtMS4zMTgtMS4zMjJhMy4wNzkgMy4wNzkgMCAwIDEtMS45MDUuNjU3IDMuMTEgMy4xMSAwIDEgMSAwLTYuMjJaTTYgMTB2MUgwdi0xaDZabTQuMTEtNC4yMjJhMi4zMzMgMi4zMzMgMCAxIDAgMCA0LjY2NSAyLjMzMyAyLjMzMyAwIDAgMCAwLTQuNjY1Wk02IDYuNXYxSDB2LTFoNlpNMTEgM3YxSDBWM2gxMVoiIGZpbGw9IiM2NjYiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==);\n}\n.gc-defined-column-container .gc-defined-column-type-icon-createdtime {\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgN2EzLjUgMy41IDAgMSAxIDAgNyAzLjUgMy41IDAgMCAxIDAtN1pNNSAwdjFoM1YwaDF2MWg0djUuNzU4YTQuNDg0IDQuNDg0IDAgMCAwLS45OTktLjUwMkwxMiA1SDF2N2w1LjI1Ni4wMDFjLjEyNi4zNTYuMjk2LjY5MS41MDIgMUwwIDEzVjFoNFYwaDFabTYgOGgtMXYySDh2MWgydjJoMXYtMmgydi0xaC0yVjhaTTQgMkgxdjJoMTFWMkg5djFIOFYySDV2MUg0VjJaIiBmaWxsPSIjNjY2IiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48L3N2Zz4=);\n}\n.gc-defined-column-container .gc-defined-column-type-icon-modifiedtime {\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjUgN2MxLjkzNSAwIDMuNSAxLjU2NSAzLjUgMy41UzEyLjQzNSAxNCAxMC41IDE0QTMuNDk3IDMuNDk3IDAgMCAxIDcgMTAuNUM3IDguNTY1IDguNTY1IDcgMTAuNSA3Wk01IDB2MWgzVjBoMXYxaDR2NS43NThhNC40ODQgNC40ODQgMCAwIDAtLjk5OS0uNTAyTDEyIDVIMXY3bDUuMjU2LjAwMWMuMTI2LjM1Ni4yOTYuNjkxLjUwMiAxTDAgMTNWMWg0VjBoMVptNS44NTUgOS4xMDVMOC40IDExLjU2di44MzVoLjgzNUwxMS42OSA5Ljk0bC0uODM1LS44MzVabS43OTgtLjcwNWEuMjA1LjIwNSAwIDAgMC0uMTUzLjA2NWwtLjQwNi40MDUuODMuODMuNDA2LS40MDVhLjIxNC4yMTQgMCAwIDAgMC0uMzE2bC0uNTE0LS41MTRhLjIzNy4yMzcgMCAwIDAtLjE2My0uMDY1Wk00IDJIMXYyaDExVjJIOXYxSDhWMkg1djFINFYyWiIgZmlsbD0iIzY2NiIgZmlsbC1ydWxlPSJub256ZXJvIi8+PC9zdmc+);\n}\n.gc-defined-column-container .gc-defined-column-type-icon-attachment {\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjA0NSAzLjE4MlYxMC41YTIuNTQ1IDIuNTQ1IDAgMSAxLTUuMDkgMFYyLjU0NWExLjU5IDEuNTkgMCAwIDEgMy4xODEgMHY2LjY4MmEuNjM2LjYzNiAwIDAgMS0xLjI3MiAwVjMuMTgyaC0uOTU1djYuMDQ1YTEuNTkgMS41OSAwIDEgMCAzLjE4MiAwVjIuNTQ1YTIuNTQ1IDIuNTQ1IDAgMSAwLTUuMDkxIDBWMTAuNWEzLjUgMy41IDAgMCAwIDcgMFYzLjE4MmgtLjk1NVoiIGZpbGw9IiM2NjYiIGZpbGwtcnVsZT0ibm9uemVybyIvPjwvc3ZnPg==);\n}\n.gc-defined-column-container .gc-defined-column-type-icon-select {\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEgMi41aDh2MUgxdi0xWm05LjA2NC0uMDU3IDEuMjQxIDEuNDY2YS4yNTMuMjUzIDAgMCAwIC4zNjUuMDI1bC4wMjUtLjAyNSAxLjI0MS0xLjQ2NmEuMjc0LjI3NCAwIDAgMC0uMDI0LS4zNzcuMjU0LjI1NCAwIDAgMC0uMTctLjA2NmgtMi40ODNhLjI2My4yNjMgMCAwIDAtLjI1OS4yNjdjMCAuMDY1LjAyMy4xMjguMDY0LjE3NlpNMSA2LjVoOHYxSDF2LTFabTkuMDY0LS4wNTcgMS4yNDEgMS40NjZhLjI1My4yNTMgMCAwIDAgLjM2NS4wMjVsLjAyNS0uMDI1IDEuMjQxLTEuNDY2YS4yNzQuMjc0IDAgMCAwLS4wMjQtLjM3Ny4yNTQuMjU0IDAgMCAwLS4xNy0uMDY2aC0yLjQ4M2EuMjYzLjI2MyAwIDAgMC0uMjU5LjI2N2MwIC4wNjUuMDIzLjEyOC4wNjQuMTc2Wk0xIDEwLjVoOHYxSDF2LTFabTkuMDY0LS4wNTcgMS4yNDEgMS40NjZhLjI1My4yNTMgMCAwIDAgLjM2NS4wMjVsLjAyNS0uMDI1IDEuMjQxLTEuNDY2YS4yNzQuMjc0IDAgMCAwLS4wMjQtLjM3Ny4yNTQuMjU0IDAgMCAwLS4xNy0uMDY2aC0yLjQ4M2EuMjYzLjI2MyAwIDAgMC0uMjU5LjI2N2MwIC4wNjUuMDIzLjEyOC4wNjQuMTc2WiIgZmlsbD0iIzY2NiIgZmlsbC1ydWxlPSJldmVub2RkIi8+PC9zdmc+);\n}\n.gc-defined-column-container .gc-defined-column-type-icon-barcode {\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTIgOXYzaDN2MUgyYTEgMSAwIDAgMS0xLTFWOWgxWm0xMSAwdjNhMSAxIDAgMCAxLTEgMUg5di0xaDNWOWgxWk00IDh2M0gzVjhoMVptNSAwdjNIOFY4aDFabTIgMHYzaC0xVjhoMVpNNyA4djNINVY4aDJabTUuMDUzLTEuMzE2di42MzJIMS45NDd2LS42MzJoMTAuMTA2Wk00IDN2M0gzVjNoMVptNSAwdjNIOFYzaDFabTIgMHYzaC0xVjNoMVpNNyAzdjNINVYzaDJabTUtMmExIDEgMCAwIDEgMSAxdjNoLTFWMkg5VjFoM1pNNSAxdjFIMnYzSDFWMmExIDEgMCAwIDEgMS0xaDNaIiBmaWxsPSIjNjY2IiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48L3N2Zz4=);\n}\n.gc-defined-column-container .gc-defined-column-type-icon-x {\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0iIzk5OSIgZmlsbC1ydWxlPSJub256ZXJvIiBkPSJNMTIgMy4wMDcgMTAuOTkzIDIgNyA1Ljk5MyAzLjAwNyAyIDIgMy4wMDcgNS45OTMgNyAyIDEwLjk5MyAzLjAwNyAxMiA3IDguMDA3IDEwLjk5MyAxMiAxMiAxMC45OTMgOC4wMDcgN3oiLz48L3N2Zz4=);\n}\n.gc-defined-column-container .gc-defined-column-type-icon-chevrondown {\n  width: 16px;\n  height: 16px;\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgLTk2MCA5NjAgOTYwIiB3aWR0aD0iMjAiPjxwYXRoIGQ9Ik00ODAtMzMzIDI0MC01NzNsNTEtNTEgMTg5IDE4OSAxODktMTg5IDUxIDUxLTI0MCAyNDBaIi8+PC9zdmc+);\n}\n.gc-defined-column-container .gc-defined-column-type-icon-magnifyingglass {\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEzLjgyMiAxMy4xMTRjLjIxOS4yMi4yMzguNTU1LjA0My43NS0uMTk2LjE5Ni0uNTMxLjE3Ny0uNzUtLjA0MmwtMy4yMzctMy4yMzZhNS45NzYgNS45NzYgMCAwIDEtMy44NzQgMS40MjIgNi4wMDQgNi4wMDQgMCAxIDEgNi4wMDQtNi4wMDQgNS45NzQgNS45NzQgMCAwIDEtMS40MjIgMy44NzRsMy4yMzYgMy4yMzZabS03LjgxOC0yLjEwN2E1LjAwMyA1LjAwMyAwIDEgMCAwLTEwLjAwNiA1LjAwMyA1LjAwMyAwIDAgMCAwIDEwLjAwNloiIGZpbGw9IiM2NjYiIGZpbGwtcnVsZT0ibm9uemVybyIvPjwvc3ZnPg==);\n}\n.gc-defined-column-container .gc-defined-column-hidden {\n  display: none;\n}\n.gc-defined-column-container .gc-defined-column-focus {\n  border: 1px solid #166ee1;\n}\n.gc-defined-column-container .gc-defined-column-disabled {\n  opacity: 0.6;\n  pointer-events: none;\n  cursor: default;\n}\n.gc-defined-column-container .gc-defined-column-disabled input:disabled {\n  background-color: inherit;\n}\n.gc-defined-column-container .gc-defined-column-hide {\n  display: none;\n}\n.gc-defined-column-container input:disabled.gc-defined-column-disabled {\n  background-color: inherit;\n}\n.gc-defined-column-container .gc-defined-column-content-container {\n  padding-left: 1rem;\n  padding-right: 1rem;\n  padding-bottom: 0.5rem;\n  padding-top: 0.5rem;\n}\n.gc-defined-column-container .gc-defined-column-field-container {\n  margin-top: 0.5rem;\n  margin-bottom: 0.5rem;\n}\n.gc-defined-column-container .gc-defined-column-field-container.gc-define-column-invalid {\n  box-shadow: 0 0 1px rgba(255, 0, 0, 0.32), 0 0 2px rgba(255, 0, 0, 0.08), 0 1px 3px rgba(255, 0, 0, 0.08);\n}\n.gc-defined-column-container .gc-defined-column-field-input-container-input {\n  height: var(--sjs-dc-input-height);\n  outline: 0;\n  color: #444;\n  width: 100%;\n  transition: 0.085s all ease-in;\n  box-sizing: border-box;\n  padding: 0.5rem;\n  font-size: var(--sjs-dc-font-size);\n  font-family: var(--sjs-dc-font-family);\n  line-height: var(--sjs-dc-input-height);\n  border: 1px solid #DAE2ED;\n}\n.gc-defined-column-container .gc-defined-column-field-input-container-input.gc-define-column-invalid {\n  border: 1px solid var(--sjs-dc-invalid-color);\n}\n.gc-defined-column-container .gc-defined-column-field-input-container-input.gc-define-column-invalid:focus {\n  border: 1px solid var(--sjs-dc-invalid-color);\n}\n.gc-defined-column-container .gc-defined-column-field-label-container-label {\n  display: block;\n  width: 14px;\n  height: 14px;\n  background-position: center;\n  background-repeat: no-repeat;\n  background-size: contain;\n  cursor: inherit;\n}\n.gc-defined-column-container .gc-defined-column-type-select-container {\n  width: 100%;\n  transition: 0.085s all ease-in;\n  box-sizing: border-box;\n  margin-top: 0.5rem;\n  border: 1px solid #DAE2ED;\n}\n.gc-defined-column-container .gc-defined-column-type-select-container.gc-define-column-invalid {\n  border: 1px solid var(--sjs-dc-invalid-color);\n}\n.gc-defined-column-container .gc-defined-column-type-select-container .gc-defined-column-field-label-validation-container {\n  position: absolute;\n}\n.gc-defined-column-container .gc-defined-column-type-select-container .gc-defined-column-field-item-container.gc-defined-column-input {\n  background-color: #fff;\n}\n.gc-defined-column-container .gc-defined-column-type-select-container .gc-defined-column-field-container {\n  height: var(--sjs-dc-input-height);\n  padding-left: 0.5rem;\n  padding-right: 0.5rem;\n  display: flex;\n  align-items: center;\n  box-shadow: initial;\n  margin: 0;\n}\n.gc-defined-column-container .gc-defined-column-type-select-container .gc-defined-column-field-container .gc-defined-column-field-input-container {\n  width: 100%;\n}\n.gc-defined-column-container .gc-defined-column-type-select-container .gc-defined-column-field-container .gc-defined-column-field-input-container-input {\n  width: 100%;\n  border: 0px;\n  box-shadow: initial;\n}\n.gc-defined-column-container .gc-defined-column-type-select-container .gc-defined-column-field-container .gc-defined-column-field-input-container-input[readonly=true] {\n  cursor: inherit;\n}\n.gc-defined-column-container .gc-defined-column-type-select-container .gc-defined-column-types-container {\n  overflow: auto;\n  max-height: 360px;\n}\n.gc-defined-column-container .gc-defined-column-type-select-container .gc-defined-column-types-container .gc-defined-column-field-type-container {\n  display: flex;\n  align-items: center;\n  padding: 0.5rem;\n}\n.gc-defined-column-container .gc-defined-column-type-select-container .gc-defined-column-types-container .gc-defined-column-field-type-container:hover {\n  background-image: none;\n  background-color: var(--sjs-dc-hover-background-color);\n}\n.gc-defined-column-container .gc-defined-column-type-select-container .gc-defined-column-types-container .gc-defined-column-field-type-container .gc-defined-column-field-type-icon {\n  display: block;\n  width: 14px;\n  height: 14px;\n  background-position: center;\n  background-repeat: no-repeat;\n  background-size: contain;\n  cursor: inherit;\n}\n.gc-defined-column-container .gc-defined-column-type-select-container .gc-defined-column-types-container .gc-defined-column-field-type-container .gc-defined-column-field-type-text {\n  margin-left: 0.5rem;\n  max-width: 100%;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  color: var(--sjs-dc-color);\n  fill: var(--sjs-dc-color);\n}\n.gc-defined-column-container .gc-defined-column-select-container {\n  position: relative;\n  width: 100%;\n  transition: 0.085s all ease-in;\n  box-sizing: border-box;\n  margin-top: 0.5rem;\n}\n.gc-defined-column-container .gc-defined-column-select-container .gc-defined-column-field-container {\n  height: var(--sjs-dc-input-height);\n  padding-left: 0.5rem;\n  padding-right: 0.2rem;\n  display: flex;\n  align-items: center;\n  box-shadow: initial;\n  margin: 0;\n}\n.gc-defined-column-container .gc-defined-column-select-container .gc-defined-column-field-container .gc-defined-column-field-input-container {\n  width: 100%;\n}\n.gc-defined-column-container .gc-defined-column-select-container .gc-defined-column-field-container .gc-defined-column-field-input-container-input {\n  width: 100%;\n  border: 0px;\n  box-shadow: initial;\n}\n.gc-defined-column-container .gc-defined-column-select-container .gc-defined-column-field-container .gc-defined-column-field-input-container-input[readonly=true] {\n  cursor: inherit;\n}\n.gc-defined-column-container .gc-defined-column-select-container .gc-defined-column-field-container .gc-defined-column-field-input-container-input[readonly=true]::placeholder {\n  color: var(--sjs-dc-color);\n  fill: var(--sjs-dc-color);\n}\n.gc-defined-column-container .gc-defined-column-select-container .gc-defined-column-select-list-container {\n  position: absolute;\n  z-index: 1005;\n  background-color: var(--sjs-dc-background-color);\n  width: 100%;\n  top: calc(var(--sjs-dc-input-height) + 4px);\n  border: 1px solid #DAE2ED;\n  box-sizing: border-box;\n  overflow: auto;\n  max-height: 235px;\n}\n.gc-defined-column-container .gc-defined-column-select-container .gc-defined-column-select-list-container .gc-defined-column-select-item-container {\n  display: flex;\n  cursor: pointer;\n  padding: 0.5rem;\n}\n.gc-defined-column-container .gc-defined-column-select-container .gc-defined-column-select-list-container .gc-defined-column-select-item-container:hover {\n  background-image: none;\n  background-color: var(--sjs-dc-hover-background-color);\n}\n.gc-defined-column-container .gc-defined-column-select-container .gc-defined-column-select-list-container .gc-defined-column-select-item-container.gc-defined-column-list-item-selected {\n  background-color: var(--sjs-dc-hover-background-color);\n}\n.gc-defined-column-container .gc-defined-column-select-container .gc-defined-column-select-list-container .gc-defined-column-select-item-container .gc-defined-column-select-item-icon {\n  display: block;\n  width: 14px;\n  height: 14px;\n  background-position: center;\n  background-repeat: no-repeat;\n  background-size: contain;\n  cursor: inherit;\n}\n.gc-defined-column-container .gc-defined-column-select-container .gc-defined-column-select-list-container .gc-defined-column-select-item-container .gc-defined-column-select-item-text {\n  margin-left: 0.5rem;\n  max-width: 100%;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  color: var(--sjs-dc-color);\n  fill: var(--sjs-dc-color);\n}\n.gc-defined-column-container .gc-defined-column-select-container .gc-defined-column-select-list-container .gc-defined-column-select-item-container.gc-defined-column-select-no-results {\n  cursor: default;\n  opacity: 0.7;\n  flex-direction: column;\n  align-items: center;\n}\n.gc-defined-column-container .gc-defined-column-select-container .gc-defined-column-select-list-container .gc-defined-column-select-item-container.gc-defined-column-select-no-results:hover {\n  background-color: inherit;\n}\n.gc-defined-column-container .gc-defined-column-select-container .gc-defined-column-select-list-container .gc-defined-column-select-item-container.gc-defined-column-select-no-results.gc-defined-column-list-item-selected {\n  background-color: inherit;\n}\n.gc-defined-column-container .gc-defined-column-input-number .gc-defined-column-field-container {\n  display: flex;\n  align-items: center;\n}\n.gc-defined-column-container .gc-defined-column-input-number .gc-defined-column-field-label-container-label {\n  width: initial;\n}\n.gc-defined-column-container .gc-defined-column-input-number .gc-defined-column-field-input-container {\n  flex-grow: 1;\n}\n.gc-defined-column-container .gc-defined-column-input-number .gc-defined-column-field-spin-buttons-container {\n  width: 18px;\n  height: var(--sjs-dc-input-height);\n  display: flex;\n  flex-direction: column;\n}\n.gc-defined-column-container .gc-defined-column-input-number .gc-defined-column-field-spin-buttons-container div {\n  height: 50%;\n}\n.gc-defined-column-container .gc-defined-column-input-number .gc-defined-column-field-spin-buttons-container .gc-defined-column-field-spin-buttons-container-increase::before {\n  content: \"\";\n  background-position: center center;\n  display: block;\n  width: 100%;\n  height: 100%;\n  background-repeat: no-repeat;\n}\n.gc-defined-column-container .gc-defined-column-input-number .gc-defined-column-field-spin-buttons-container .gc-defined-column-field-spin-buttons-container-decrease::after {\n  content: \"\";\n  background-position: center center;\n  display: block;\n  width: 100%;\n  height: 100%;\n  background-repeat: no-repeat;\n}\n.gc-defined-column-container .gc-defined-column-checkbox-container .gc-defined-column-checkbox-item-container {\n  display: flex;\n  width: fit-content;\n}\n.gc-defined-column-container .gc-defined-column-checkbox-container .gc-defined-column-checkbox-item-container:focus {\n  outline: none;\n}\n.gc-defined-column-container .gc-defined-column-checkbox-container .gc-defined-column-check-container {\n  align-self: center;\n}\n.gc-defined-column-container .gc-defined-column-checkbox-container .gc-defined-column-check-uncheck {\n  width: 15px;\n  height: 15px;\n  display: none;\n  background-repeat: no-repeat;\n}\n.gc-defined-column-container .gc-defined-column-checkbox-container .gc-defined-column-check-check {\n  width: 15px;\n  height: 15px;\n  display: none;\n  background-repeat: no-repeat;\n}\n.gc-defined-column-container .gc-defined-column-checkbox-container .gc-defined-column-check-indeterminate {\n  width: 15px;\n  height: 15px;\n  display: none;\n  background-repeat: no-repeat;\n}\n.gc-defined-column-container .gc-defined-column-checkbox-container .gc-defined-column-label-container {\n  margin-left: 0.5rem;\n}\n.gc-defined-column-container .gc-defined-column-switch-container .gc-defined-column-switch-item-container {\n  display: flex;\n  width: fit-content;\n}\n.gc-defined-column-container .gc-defined-column-switch-container .gc-defined-column-switch-container {\n  align-self: center;\n}\n.gc-defined-column-container .gc-defined-column-switch-container .gc-defined-column-label-container {\n  margin-left: 0.5rem;\n}\n.gc-defined-column-container sjs-text-editor.gc-define-column-invalid {\n  --sjs-theme-border-color: var(--sjs-dc-invalid-color);\n}\n.gc-defined-column-container sjs-select {\n  --sjs-theme-accent: var(--sjs-dc-hover-background-color);\n  --sjs-theme-gray-bg: var(--sjs-dc-hover-background-color) none;\n  --sjs-theme-accent-color: var(--sjs-dc-color);\n}\n.gc-defined-column-container sjs-select.gc-define-column-invalid {\n  --sjs-theme-border-color: var(--sjs-dc-invalid-color);\n}\n.gc-defined-column-container sjs-select::part(container) {\n  --sjs-dp-root-height: 32px;\n  --sjs-dp-value-root-height: 30px;\n}\n.gc-defined-column-container sjs-color-picker.gc-defined-column-field-input-container-input {\n  display: block;\n}\n.gc-defined-column-container sjs-color-picker::part(container) {\n  margin-bottom: initial;\n}\n.gc-defined-column-container sjs-color-picker::part(color-value-container) {\n  float: initial;\n  width: initial;\n  height: 100%;\n  margin-top: initial;\n  --sjs-color-value-container-sub-width: 99%;\n  --sjs-color-value-container-sub-height: 95%;\n}\n.gc-defined-column-container sjs-checkbox::part(container) {\n  height: initial;\n  margin: initial;\n  margin-bottom: initial;\n  --sjs-theme-accent: var(--sjs-dc-accent-heavy);\n}\n.gc-defined-column-container sjs-number-editor::part(container) {\n  margin-bottom: initial;\n}\n.gc-defined-column-container .gc-defined-column-list-container .gc-defined-column-list-items-container {\n  margin-bottom: 0.5rem;\n  border: 1px solid #DAE2ED;\n}\n.gc-defined-column-container .gc-defined-column-list-container .gc-defined-column-list-item-container {\n  cursor: pointer;\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n}\n.gc-defined-column-container .gc-defined-column-list-container .gc-defined-column-list-item-container:hover {\n  background-image: none;\n  background-color: var(--sjs-dc-hover-background-color);\n}\n.gc-defined-column-container .gc-defined-column-list-container .gc-defined-column-list-item-container.gc-defined-column-list-item-selected {\n  background-color: var(--sjs-dc-hover-background-color);\n}\n.gc-defined-column-container .gc-defined-column-list-container .gc-defined-column-list-item-container:focus {\n  outline: none;\n}\n.gc-defined-column-container .gc-defined-column-list-container .gc-defined-column-list-item-container .gc-defined-column-list-item-text,\n.gc-defined-column-container .gc-defined-column-list-container .gc-defined-column-list-item-container .gc-defined-column-list-item-value {\n  height: 17px;\n  letter-spacing: 0;\n  text-align: left;\n  display: block;\n  line-height: normal;\n  padding: 5px 10px;\n  border: none;\n  max-width: 100%;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n.gc-defined-column-container .gc-defined-column-list-container .gc-defined-column-list-item-container .gc-defined-column-list-item-text:focus,\n.gc-defined-column-container .gc-defined-column-list-container .gc-defined-column-list-item-container .gc-defined-column-list-item-value:focus {\n  outline: none;\n}\n.gc-defined-column-container .gc-defined-column-list-container .gc-defined-column-list-header {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  position: sticky;\n  top: 0;\n  background-color: var(--sjs-dc-accent-light);\n  width: 100%;\n  box-sizing: border-box;\n}\n.gc-defined-column-container .gc-defined-column-list-container .gc-defined-column-list-header-text,\n.gc-defined-column-container .gc-defined-column-list-container .gc-defined-column-list-header-value {\n  width: 50%;\n  text-align: left;\n  padding: 5px 10px;\n}\n.gc-defined-column-container .gc-defined-column-list-container .gc-defined-column-label-container {\n  height: 32px;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n}\n.gc-defined-column-container .gc-defined-column-list-container .gc-defined-column-list-label-container {\n  display: flex;\n  justify-content: space-between;\n}\n.gc-defined-column-container .gc-defined-column-number-formatting-container .gc-defined-column-checkbox-container {\n  margin-top: 1rem;\n}\n.gc-defined-column-container .gc-defined-column-number-formatting-container .gc-defined-column-switch-container {\n  margin-top: 1rem;\n}\n.gc-defined-column-container .gc-defined-column-number-formatting-container .gc-defined-column-list-container {\n  margin-top: 1rem;\n}\n.gc-defined-column-container .gc-defined-column-number-formatting-container .gc-defined-column-select-box-container {\n  margin-top: 1rem;\n}\n.gc-defined-column-container .gc-defined-column-number-formatting-container .gc-defined-column-number-formatting-negative-item {\n  color: red;\n}\n.gc-defined-column-container .gc-defined-column-number-formatting-container .gc-defined-column-number-formatting-preview-container {\n  margin-top: 1rem;\n}\n.gc-defined-column-container .gc-defined-column-number-formatting-container .gc-defined-column-number-formatting-preview-container .gc-defined-column-number-formatting-preview-text {\n  height: 24px;\n  line-height: 24px;\n  overflow: hidden;\n  word-break: break-all;\n  color: var(--sjs-dc-color);\n  font-weight: 400;\n  padding: 0;\n  margin-bottom: 0;\n  padding-left: 0.7rem;\n}\n.gc-defined-column-container .gc-defined-column-date-formatting-container .gc-defined-column-list-items-container {\n  max-height: 105px;\n  overflow: auto;\n}\n.gc-defined-column-container .gc-defined-column-date-formatting-container .gc-defined-column-checkbox-container {\n  margin-top: 1rem;\n}\n.gc-defined-column-container .gc-defined-column-date-formatting-container .gc-defined-column-switch-container {\n  margin-top: 1rem;\n}\n.gc-defined-column-container .gc-defined-column-date-formatting-container .gc-defined-column-select-box-container {\n  margin-top: 1rem;\n  width: 100%;\n}\n.gc-defined-column-container .gc-defined-column-date-time-picker-container .gc-defined-column-checkbox-container {\n  margin-top: 1rem;\n}\n.gc-defined-column-container .gc-defined-column-date-time-picker-container .gc-defined-column-switch-container {\n  margin-top: 1rem;\n}\n.gc-defined-column-container .gc-defined-column-date-time-picker-container .gc-defined-column-select-box-container {\n  margin-top: 1rem;\n  width: 100%;\n}\n.gc-defined-column-container .gc-defined-column-modified-fields-container .gc-defined-column-list-items-container {\n  max-height: 105px;\n  overflow: auto;\n}\n.gc-defined-column-container .gc-defined-column-modified-fields-container .gc-defined-column-checkbox-container {\n  margin-top: 1rem;\n}\n.gc-defined-column-container .gc-defined-column-modified-fields-container .gc-defined-column-switch-container {\n  margin-top: 1rem;\n}\n.gc-defined-column-container .gc-defined-column-attachment-container .gc-defined-column-list-container {\n  margin-top: 1rem;\n}\n.gc-defined-column-container .gc-defined-column-attachment-container .gc-defined-column-checkbox-container {\n  margin-top: 1rem;\n}\n.gc-defined-column-container .gc-defined-column-attachment-container .gc-defined-column-switch-container {\n  margin-top: 1rem;\n}\n.gc-defined-column-container .gc-defined-column-attachment-container .gc-defined-column-input-number {\n  margin-top: 1rem;\n  margin-right: 1rem;\n  width: 100%;\n}\n.gc-defined-column-container .gc-defined-column-column-type-checkbox-container .gc-defined-column-checkbox-container {\n  margin-top: 1rem;\n}\n.gc-defined-column-container .gc-defined-column-column-type-checkbox-container .gc-defined-column-switch-container {\n  margin-top: 1rem;\n}\n.gc-defined-column-container .gc-defined-column-column-type-checkbox-container .gc-defined-column-input-number {\n  margin-top: 1rem;\n  margin-right: 1rem;\n  width: 100%;\n}\n.gc-defined-column-container .gc-defined-column-checkbox-text-container .gc-defined-column-checkbox-field-item-container {\n  margin-bottom: 0.5rem;\n}\n.gc-defined-column-container .gc-defined-column-combo-box-container .gc-defined-column-label-container {\n  height: initial;\n  line-height: 22px;\n}\n.gc-defined-column-container .gc-defined-column-combo-box-container .gc-defined-column-list-container {\n  margin-top: 1rem;\n}\n.gc-defined-column-container .gc-defined-column-combo-box-container .gc-defined-column-list-items-container {\n  margin-top: 0.5rem;\n  margin-bottom: 0.5rem;\n  margin-top: 0.1rem;\n  border: 1px solid #DAE2ED;\n  height: 125px;\n  overflow: auto;\n}\n.gc-defined-column-container .gc-defined-column-combo-box-container .gc-defined-column-list-item-text,\n.gc-defined-column-container .gc-defined-column-combo-box-container .gc-defined-column-list-item-value {\n  padding: 2px 4px !important;\n  margin: 5px 10px;\n}\n.gc-defined-column-container .gc-defined-column-combo-box-container .gc-defined-column-list-container .gc-defined-column-list-item-container {\n  background-color: #dbdbdb4f;\n}\n.gc-defined-column-container .gc-defined-column-combo-box-container .gc-defined-column-list-container .gc-defined-column-list-item-container:hover {\n  background-image: none;\n  background-color: var(--sjs-dc-hover-background-color);\n}\n.gc-defined-column-container .gc-defined-column-combo-box-container .gc-defined-column-list-container .gc-defined-column-list-item-container.gc-defined-column-list-item-selected {\n  background-color: var(--sjs-dc-hover-background-color);\n}\n.gc-defined-column-container .gc-defined-column-combo-box-container .gc-defined-column-list-container .gc-defined-column-list-item-container.gc-defined-column-list-item-selected .gc-defined-column-list-item-text,\n.gc-defined-column-container .gc-defined-column-combo-box-container .gc-defined-column-list-container .gc-defined-column-list-item-container.gc-defined-column-list-item-selected .gc-defined-column-list-item-value {\n  background-color: var(--sjs-dc-color-white);\n}\n.gc-defined-column-container .gc-defined-column-combo-box-style-container .gc-defined-column-checkbox-container {\n  margin-top: 1rem;\n}\n.gc-defined-column-container .gc-defined-column-combo-box-style-container .gc-defined-column-switch-container {\n  margin-top: 1rem;\n}\n.gc-defined-column-container .gc-defined-column-combo-box-style-container .gc-defined-column-select-box-container {\n  margin-top: 1rem;\n  width: 100%;\n}\n.gc-defined-column-container .gc-defined-column-combo-box-style-container .gc-defined-column-input-number {\n  margin-top: 1rem;\n  margin-right: 1rem;\n  width: 100%;\n}\n.gc-defined-column-container .gc-defined-column-look-up-container .gc-defined-column-select-box-container {\n  margin-top: 1rem;\n  width: 100%;\n}\n.gc-defined-column-container .gc-defined-column-look-up-container .gc-defined-column-input-number {\n  margin-top: 1rem;\n  margin-right: 1rem;\n  width: 100%;\n}\n.gc-defined-column-container .gc-defined-column-look-up-container .gc-defined-column-look-up-field-container {\n  display: flex;\n}\n.gc-defined-column-container .gc-defined-column-formatting-select-container .gc-defined-column-number-formatting-container {\n  margin-top: 1rem;\n}\n.gc-defined-column-container .gc-defined-column-mask-container .gc-defined-column-mask-exclude-container {\n  display: flex;\n}\n.gc-defined-column-container .gc-defined-column-mask-container .gc-defined-column-mask-exclude-container .gc-defined-column-checkbox-container:nth-child(1) {\n  margin-right: 1rem;\n}\n.gc-defined-column-container .gc-defined-column-mask-container .gc-defined-column-mask-exclude-container .gc-defined-column-switch-container:nth-child(1) {\n  margin-right: 1rem;\n}\n.gc-defined-column-container .gc-defined-column-url-container .gc-defined-column-field-input-container-input[type=color] {\n  padding: 1px 2px;\n  background-color: initial;\n}\n.gc-defined-column-container .gc-defined-column-barcode-base-container .gc-defined-column-field-input-container-input[type=color] {\n  padding: 1px 2px;\n  background-color: initial;\n}\n.gc-defined-column-container .gc-defined-column-barcode-base-container .gc-defined-column-barcode-base-style-container {\n  display: grid;\n  grid-template-columns: auto auto;\n  grid-column-gap: 1rem;\n  margin-top: 0.5rem;\n}\n.gc-defined-column-container .gc-defined-column-barcode-base-container .gc-defined-column-barcode-base-style-container .gc-defined-column-field-item-container {\n  margin-top: 0.5rem;\n}\n.gc-defined-column-container .gc-defined-column-barcode-options-container {\n  display: grid;\n  grid-template-columns: repeat(6, 1fr);\n  grid-column-gap: 0.5rem;\n  margin-top: 0.5rem;\n}\n.gc-defined-column-container .gc-defined-column-barcode-options-container .gc-defined-column-select-box-container,\n.gc-defined-column-container .gc-defined-column-barcode-options-container .gc-defined-column-barcode-options-input,\n.gc-defined-column-container .gc-defined-column-barcode-options-container .gc-defined-column-input-number,\n.gc-defined-column-container .gc-defined-column-barcode-options-container .gc-defined-column-empty-div,\n.gc-defined-column-container .gc-defined-column-barcode-options-container .gc-defined-column-switch-field-item-container,\n.gc-defined-column-container .gc-defined-column-barcode-options-container .gc-defined-column-checkbox-field-item-container {\n  grid-column: span 3;\n  margin-top: 0.5rem;\n}\n.gc-defined-column-container .gc-defined-column-barcode-options-container .gc-defined-column-checkbox-container {\n  margin-top: 0.5rem;\n}\n.gc-defined-column-container .gc-defined-column-barcode-options-container .gc-defined-column-checkbox-container .gc-defined-column-checkbox-item-container {\n  align-items: center;\n}\n.gc-defined-column-container .gc-defined-column-barcode-options-container .gc-defined-column-switch-container {\n  margin-top: 0.5rem;\n}\n.gc-defined-column-container .gc-defined-column-barcode-options-container .gc-defined-column-switch-container .gc-defined-column-switch-item-container {\n  align-items: center;\n}\n.gc-defined-column-container .gc-defined-column-barcode-options-container .gc-defined-column-field-item-small-container {\n  grid-column: span 2;\n  display: flex;\n  flex-direction: column;\n  justify-content: space-between;\n}\n.gc-defined-column-container .gc-defined-column-attachment-margins-container {\n  display: grid;\n  grid-template-columns: repeat(2, 1fr);\n  grid-column-gap: 0.5rem;\n  margin-top: 0.5rem;\n}\n.gc-defined-column-container .gc-defined-column-tab-list-container {\n  margin-top: 0.5rem;\n}\n.gc-defined-column-container .gc-defined-column-tab-list-items-container {\n  display: flex;\n}\n.gc-defined-column-container .gc-defined-column-tab-item-container {\n  margin-right: 1rem;\n  padding-top: 0.25rem;\n  padding-bottom: 0.25rem;\n  cursor: pointer;\n  opacity: 0.75;\n}\n.gc-defined-column-container .gc-defined-column-tab-item-container:focus {\n  outline: none;\n}\n.gc-defined-column-container .gc-defined-column-tab-item-container:hover {\n  opacity: 1;\n}\n.gc-defined-column-container .gc-defined-column-tab-item-container-selected {\n  border-bottom: 2px solid var(--sjs-dc-color);\n  font-weight: 500;\n  cursor: inherit;\n  opacity: 1;\n}\n.gc-defined-column-container .gc-defined-column-tab-item-container.gc-defined-column-disabled {\n  opacity: 0.3;\n  cursor: default;\n}\n.gc-defined-column-container .gc-defined-column-tab-panels-container {\n  margin-top: 1rem;\n}\n.gc-defined-column-container .gc-defined-column-tab-panel-container {\n  display: none;\n}\n.gc-defined-column-container .gc-defined-column-tab-panel-container-selected {\n  display: block;\n}\n.gc-defined-column-container .gc-defined-column-tab-list-break-line {\n  border-bottom: 1px solid var(--sjs-dc-accent-light);\n  z-index: -1;\n  position: relative;\n  margin-top: -1px;\n}\n.gc-defined-column-container .gc-defined-column-divider-container {\n  display: flex;\n  margin-top: 1rem;\n  margin-bottom: 0.5rem;\n  width: 100%;\n  min-width: 100%;\n  box-sizing: border-box;\n}\n.gc-defined-column-container .gc-defined-column-divider-container .gc-defined-column-divider-inner-text {\n  padding-inline-start: 0.6rem;\n  padding-inline-end: 0.6rem;\n  box-sizing: border-box;\n  white-space: nowrap;\n  text-align: center;\n}\n.gc-defined-column-container .gc-defined-column-divider-container::before {\n  width: 5%;\n  position: relative;\n  border-block-start: 1px solid var(--sjs-dc-accent-light);\n  border-block-end: 0;\n  transform: translateY(50%);\n  content: \"\";\n  box-sizing: border-box;\n}\n.gc-defined-column-container .gc-defined-column-divider-container::after {\n  width: 95%;\n  position: relative;\n  border-block-start: 1px solid var(--sjs-dc-accent-light);\n  border-block-end: 0;\n  transform: translateY(50%);\n  content: \"\";\n  box-sizing: border-box;\n}\n.gc-defined-column-container .gc-defined-column-footer-container {\n  justify-content: flex-end;\n  align-items: center;\n  display: flex;\n  padding-left: 1rem;\n  padding-right: 1rem;\n  padding-bottom: 1rem;\n  padding-top: 0.5rem;\n}\n.gc-defined-column-container .gc-defined-column-footer-container .gc-defined-column-footer-container-buttons {\n  justify-content: flex-end;\n  align-items: baseline;\n  display: flex;\n}\n.gc-defined-column-container .gc-defined-column-footer-container .gc-defined-column-footer-container-buttons .gc-defined-column-footer-container-button {\n  height: var(--sjs-dc-input-height);\n  font-size: var(--sjs-dc-font-size);\n  font-family: var(--sjs-dc-font-family);\n  line-height: 22px;\n  max-width: 100%;\n  cursor: pointer;\n  justify-content: center;\n  align-items: center;\n  display: inline-flex;\n  padding-left: 0.75rem;\n  padding-right: 0.75rem;\n  margin-left: 0.5rem;\n  text-decoration: none;\n  background-color: transparent;\n  color: var(--sjs-dc-color);\n  fill: var(--sjs-dc-color);\n  border: 1px solid #acacac;\n  background-image: -webkit-linear-gradient(top, #f0f0f0, #e5e5e5);\n  /* For Chrome and Safari */\n  background-image: -moz-linear-gradient(top, #f0f0f0, #e5e5e5);\n  /* For old Fx (3.6 to 15) */\n  background-image: -ms-linear-gradient(top, #f0f0f0, #e5e5e5);\n  /* For pre-releases of IE 10*/\n  background-image: -o-linear-gradient(top, #f0f0f0, #e5e5e5);\n  /* For old Opera (11.1 to 12.0) */\n  background-image: linear-gradient(to bottom, #f0f0f0, #e5e5e5);\n  font-weight: normal;\n  color: black;\n  border-radius: 0;\n}\n.gc-defined-column-container .gc-defined-column-footer-container .gc-defined-column-footer-container-buttons .gc-defined-column-footer-container-button:hover {\n  border: 1px solid #DAE2ED;\n  border-color: var(--sjs-dc-accent-heavy);\n  border: 1px solid #7eb4ea;\n  background-image: -webkit-linear-gradient(top, #ecf4fc, #dcecfc);\n  /* For Chrome and Safari */\n  background-image: -moz-linear-gradient(top, #ecf4fc, #dcecfc);\n  /* For old Fx (3.6 to 15) */\n  background-image: -ms-linear-gradient(top, #ecf4fc, #dcecfc);\n  /* For pre-releases of IE 10*/\n  background-image: -o-linear-gradient(top, #ecf4fc, #dcecfc);\n  /* For old Opera (11.1 to 12.0) */\n  background-image: linear-gradient(to bottom, #ecf4fc, #dcecfc);\n  /* Standard syntax; must be last */\n  background-color: #d3f0e0;\n  border-radius: 0;\n  cursor: pointer;\n  color: black;\n  font-weight: normal;\n  text-shadow: none;\n}\n.gc-defined-column-container .gc-defined-column-add-remove-container {\n  justify-content: flex-end;\n  align-items: center;\n  display: flex;\n}\n.gc-defined-column-container .gc-defined-column-add-remove-container .gc-defined-column-add-remove-container-buttons {\n  justify-content: flex-start;\n  align-items: baseline;\n  display: flex;\n}\n.gc-defined-column-container .gc-defined-column-add-remove-container .gc-defined-column-add-remove-container-buttons .gc-defined-column-add-remove-container-button {\n  font-size: var(--sjs-dc-font-size);\n  font-family: var(--sjs-dc-font-family);\n  line-height: 22px;\n  max-width: 100%;\n  border: 0;\n  cursor: pointer;\n  justify-content: center;\n  align-items: center;\n  display: inline-flex;\n  padding-left: 0.75rem;\n  padding-right: 0.75rem;\n  text-decoration: none;\n  background-color: transparent;\n  color: var(--sjs-dc-color);\n  fill: var(--sjs-dc-color);\n  font-weight: initial;\n}\n.gc-defined-column-container .gc-defined-column-add-remove-container .gc-defined-column-add-remove-container-buttons .gc-defined-column-add-remove-container-button:hover {\n  text-decoration: underline;\n}\n.gc-defined-column-container .gc-defined-column-add-remove-container .gc-defined-column-add-remove-container-buttons .gc-defined-column-add-remove-container-button-icon {\n  display: block;\n  width: 14px;\n  height: 14px;\n  background-position: center;\n  background-repeat: no-repeat;\n  background-size: contain;\n  cursor: inherit;\n  margin-right: 0.2rem;\n  width: 10px;\n  height: 10px;\n}\n.gc-defined-column-container .gc-defined-column-add-remove-container .gc-defined-column-add-remove-container-buttons .gc-defined-column-add-remove-container-button-icon-add {\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+QWRkIGxldmVsPC90aXRsZT4KICAgIDxnIGlkPSJBZGQtbGV2ZWwiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxwYXRoIGQ9Ik0xMCwwIEwxMCw2IEwxNiw2IEwxNiw5IEwxMCw5IEwxMCwxNSBMNywxNSBMNyw5IEwxLDkgTDEsNiBMNyw2IEw3LDAgTDEwLDAgWiIgaWQ9IuW9oueKtue7k+WQiCIgZmlsbD0iIzY2NjY2NiI+PC9wYXRoPgogICAgPC9nPgo8L3N2Zz4=);\n}\n.gc-defined-column-container .gc-defined-column-add-remove-container .gc-defined-column-add-remove-container-buttons .gc-defined-column-add-remove-container-button-icon-remove {\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2aWV3Qm94PSIwIDAgMTYgMTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDU1LjIgKDc4MTgxKSAtIGh0dHBzOi8vc2tldGNoYXBwLmNvbSAtLT4KICAgIDx0aXRsZT5EZWxldGUgTGV2ZWw8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZyBpZD0iRGVsZXRlLUxldmVsIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8cGF0aCBkPSJNMTUuOTY3MDk4NiwyLjQ3NzU4MDYxIEMxNS40NzY1MDU4LDMuNzM4NzgwNzIgMTIuODI3ODA4LDQuOTUyODU1OTkgMTAuMzk2OTI4Miw2Ljc1ODc4MzUxIEMxMS42MDY4NDcsOC42ODQ0MTIyOCAxMi45NDUwNzA2LDExLjI2NzQ2MzcgMTUuMTY5MzAxOSwxNiBDMTIuMzgwMzM2NywxMi43MzY4Mzk5IDEwLjMzMjI1MiwxMC43NjI3MDM1IDguMjY0MTkwMSw4LjU4NzI2MzQ0IEM2LjA2MzYyMDc5LDEwLjU5OTYzMjMgNS4wMTkyMjk1NywxMS42NjY4NzczIDQuMjUyMDI2NSwxMy4wOTMxNDQzIEMzLjM3OTAxMTQ4LDE0LjcxNjEyMDggMi44NzcxMzMzMiwxNi41Mzk1ODk4IDEuMjI1NTIzMjMsMTUuNzQ4NTIwNyBDMC4xMjQ0NDk4NDEsMTUuMjE5NDA2NSAtMC44Njc3NzgxODcsMTMuMjM5OTk4OSAxLjIyNTUyMzIzLDExLjE4NzcyOTcgQzMuMzE4ODI0NjUsOS4xMzU0NjA0NiA0Ljk1MTUwNTExLDcuNjAxODk2NjUgNi4xMjUxNDIwOCw2LjU4ODc3MzA0IEM0LjUyNTU4ODQ3LDUuMjkxMTQyMTIgMy4wOTAwOTE2NCw0LjM5NzI0MDMgMS4yMjU1MjMyMywzLjczMTA3NjgzIEMtMC42MzkwNDUxNzYsMy4wNjQ5MTMzNyAwLjI4NjAyNjQzLDEuMDcwMzcyMDMgMC43NjcxNTQ0ODksMC40NTc5ODczODQgQzEuMjUxNDM3NDgsLTAuMTUyNjYyNDYxIDIuMjQ5MzAwNjQsLTAuMTUyNjYyNDYxIDMuNDM4NzEyMywwLjQ1Nzk4NzM4NCBDNS43NjcwNTY2MSwxLjkzNzc3MjM4IDcuNTYzNzkzODUsMy4zNTUxMDQ1NSA4LjgzMzY1NjQzLDQuNzA5OTgzODkgQzExLjU2ODk4NzcsMy4yNjMxNjAxMSAxNi40NDY2NDkyLDEuMjQyNDAyNTIgMTUuOTY3MDk4NiwyLjQ3NzU4MDYxIFoiIGZpbGw9IiM2NjY2NjYiPjwvcGF0aD4KICAgIDwvZz4KPC9zdmc+);\n}\n\n.gc-table-sheet-panel, .gc-table-sheet-cross-column {\n  position: relative;\n  background-color: var(--sjs-theme-background);\n  box-sizing: border-box;\n  width: 100%;\n  min-width: 300px;\n  height: 100%;\n  font-family: var(--sjs-theme-font-family);\n  font-size: 12px;\n  overflow-x: hidden;\n  overflow-y: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  user-select: none;\n}\n.gc-table-sheet-panel .gc-table-sheet-field-panel, .gc-table-sheet-panel .gc-table-sheet-cross-column-field, .gc-table-sheet-cross-column .gc-table-sheet-field-panel, .gc-table-sheet-cross-column .gc-table-sheet-cross-column-field {\n  margin: 5px 10px 0 10px;\n  width: calc(100% - 20px);\n  height: calc(100% - 30px);\n  border: solid 1px var(--sjs-theme-border-color);\n}\n.gc-table-sheet-panel .gc-table-sheet-field-panel .gcsj-func-ac-popup, .gc-table-sheet-panel .gc-table-sheet-cross-column-field .gcsj-func-ac-popup, .gc-table-sheet-cross-column .gc-table-sheet-field-panel .gcsj-func-ac-popup, .gc-table-sheet-cross-column .gc-table-sheet-cross-column-field .gcsj-func-ac-popup {\n  width: 80%;\n}\n.gc-table-sheet-panel .gc-table-sheet-field-panel .gcsj-func-help-popup, .gc-table-sheet-panel .gc-table-sheet-cross-column-field .gcsj-func-help-popup, .gc-table-sheet-cross-column .gc-table-sheet-field-panel .gcsj-func-help-popup, .gc-table-sheet-cross-column .gc-table-sheet-cross-column-field .gcsj-func-help-popup {\n  white-space: normal;\n}\n.gc-table-sheet-panel .gc-table-sheet-field-container, .gc-table-sheet-panel .gc-table-sheet-cross-column-field-container, .gc-table-sheet-cross-column .gc-table-sheet-field-container, .gc-table-sheet-cross-column .gc-table-sheet-cross-column-field-container {\n  height: 40%;\n}\n.gc-table-sheet-panel .gc-table-sheet-field-container.total-height, .gc-table-sheet-panel .gc-table-sheet-cross-column-field-container.total-height, .gc-table-sheet-cross-column .gc-table-sheet-field-container.total-height, .gc-table-sheet-cross-column .gc-table-sheet-cross-column-field-container.total-height {\n  height: 100% !important;\n}\n.gc-table-sheet-panel .gc-table-sheet-cross-panel, .gc-table-sheet-cross-column .gc-table-sheet-cross-panel {\n  height: 60%;\n}\n.gc-table-sheet-panel .gc-table-sheet-cross-column-detail, .gc-table-sheet-cross-column .gc-table-sheet-cross-column-detail {\n  height: calc(100% - 40px);\n  margin: 0px 10px 10px 9px;\n  padding: 0px;\n  width: calc(100% - 20px);\n  overflow-y: auto;\n  overflow-x: hidden;\n  background-color: var(--sjs-theme-background);\n  border: solid 1px var(--sjs-theme-border-color);\n}\n.gc-table-sheet-panel .gc-table-sheet-cross-column-list-container, .gc-table-sheet-cross-column .gc-table-sheet-cross-column-list-container {\n  height: 20%;\n}\n.gc-table-sheet-panel .disable, .gc-table-sheet-cross-column .disable {\n  opacity: 0.6;\n  pointer-events: none;\n  cursor: default;\n}\n\n.gc-table-sheet-group-panel, .gc-table-sheet-cross-column-list-container, .gc-table-sheet-cross-column-detail {\n  margin: 0px;\n  padding: 0px;\n  width: 100%;\n  height: 30%;\n  overflow-y: auto;\n  overflow-x: hidden;\n  background-color: var(--sjs-theme-background);\n}\n.gc-table-sheet-group-panel.half-height, .gc-table-sheet-cross-column-list-container.half-height, .gc-table-sheet-cross-column-detail.half-height {\n  height: 50% !important;\n}\n.gc-table-sheet-group-panel .gc-table-sheet-group-input, .gc-table-sheet-cross-column-list-container .gc-table-sheet-group-input, .gc-table-sheet-cross-column-detail .gc-table-sheet-group-input {\n  background: var(--sjs-theme-background);\n  color: var(--sjs-theme-color);\n  position: absolute;\n  left: 1px;\n  width: calc(100% - 8px);\n  display: none;\n  font-size: 12px;\n  height: 17px;\n  font-family: inherit;\n  border: 1px solid rgb(82, 146, 247);\n  outline: 1px solid rgb(82, 146, 247);\n  box-shadow: rgba(0, 0, 0, 0.4) 1px 2px 5px;\n}\n\n.gc-table-sheet-group-header, .gc-table-sheet-cross-column-header {\n  box-sizing: border-box;\n  color: var(--sjs-theme-color);\n  outline: none;\n  width: 100%;\n  height: 20px;\n  font-size: large;\n  font-weight: 600;\n  margin-left: 10px;\n}\n\n.gc-table-sheet-group-list, .gc-table-sheet-cross-column-list, .gc-table-sheet-cross-column-attributes-list {\n  position: relative;\n  width: calc(100% - 20px);\n  height: calc(100% - 40px);\n  margin: 6px 0 0 9px;\n  border: dashed var(--sjs-theme-border-color) 1px;\n  overflow-y: auto;\n  overflow-x: hidden;\n  padding-inline-start: 0px;\n  padding: 0px;\n}\n.gc-table-sheet-group-list .gc-table-sheet-group-item, .gc-table-sheet-group-list .gc-table-sheet-cross-column-item, .gc-table-sheet-cross-column-list .gc-table-sheet-group-item, .gc-table-sheet-cross-column-list .gc-table-sheet-cross-column-item, .gc-table-sheet-cross-column-attributes-list .gc-table-sheet-group-item, .gc-table-sheet-cross-column-attributes-list .gc-table-sheet-cross-column-item {\n  height: 23px;\n  line-height: 23px;\n  margin: 2px;\n  background-color: var(--sjs-theme-background);\n  color: var(--sjs-theme-color);\n  box-sizing: border-box;\n  text-overflow: ellipsis;\n  overflow: hidden;\n  word-break: break-all;\n  white-space: nowrap;\n  margin-bottom: 1px;\n  font-size: 12px;\n  border: 1px solid var(--sjs-theme-border-color);\n  outline: none;\n}\n.gc-table-sheet-group-list .gc-table-sheet-cross-column-item-input, .gc-table-sheet-cross-column-list .gc-table-sheet-cross-column-item-input, .gc-table-sheet-cross-column-attributes-list .gc-table-sheet-cross-column-item-input {\n  position: relative;\n}\n.gc-table-sheet-group-list .gc-table-sheet-cross-column-input, .gc-table-sheet-cross-column-list .gc-table-sheet-cross-column-input, .gc-table-sheet-cross-column-attributes-list .gc-table-sheet-cross-column-input {\n  position: absolute;\n  left: 1px;\n  top: 2px;\n  width: calc(100% - 8px);\n  font-size: 12px;\n  height: 17px;\n  font-family: inherit;\n  border: 1px solid rgb(82, 146, 247);\n  outline: 1px solid rgb(82, 146, 247);\n  box-shadow: rgba(0, 0, 0, 0.4) 1px 2px 5px;\n}\n.gc-table-sheet-group-list .gc-table-sheet-group-item:hover, .gc-table-sheet-group-list .gc-table-sheet-cross-column-item:hover, .gc-table-sheet-cross-column-list .gc-table-sheet-group-item:hover, .gc-table-sheet-cross-column-list .gc-table-sheet-cross-column-item:hover, .gc-table-sheet-cross-column-attributes-list .gc-table-sheet-group-item:hover, .gc-table-sheet-cross-column-attributes-list .gc-table-sheet-cross-column-item:hover {\n  cursor: pointer;\n  border: solid 1px var(--sjs-theme-accent);\n}\n.gc-table-sheet-group-list .gc-table-sheet-group-item-reorder-top, .gc-table-sheet-group-list .gc-table-sheet-cross-column-item-reorder-top, .gc-table-sheet-cross-column-list .gc-table-sheet-group-item-reorder-top, .gc-table-sheet-cross-column-list .gc-table-sheet-cross-column-item-reorder-top, .gc-table-sheet-cross-column-attributes-list .gc-table-sheet-group-item-reorder-top, .gc-table-sheet-cross-column-attributes-list .gc-table-sheet-cross-column-item-reorder-top {\n  border: 1px solid var(--sjs-theme-border-color) !important;\n  border-top: solid 1px var(--sjs-theme-accent) !important;\n}\n.gc-table-sheet-group-list .gc-table-sheet-group-item-reorder-bottom, .gc-table-sheet-group-list .gc-table-sheet-cross-column-item-reorder-bottom, .gc-table-sheet-cross-column-list .gc-table-sheet-group-item-reorder-bottom, .gc-table-sheet-cross-column-list .gc-table-sheet-cross-column-item-reorder-bottom, .gc-table-sheet-cross-column-attributes-list .gc-table-sheet-group-item-reorder-bottom, .gc-table-sheet-cross-column-attributes-list .gc-table-sheet-cross-column-item-reorder-bottom {\n  border: 1px solid var(--sjs-theme-border-color) !important;\n  border-bottom: solid 1px var(--sjs-theme-accent) !important;\n}\n.gc-table-sheet-group-list .selected, .gc-table-sheet-cross-column-list .selected, .gc-table-sheet-cross-column-attributes-list .selected {\n  background-color: var(--sjs-theme-accent) !important;\n  color: var(--sjs-theme-accent-color) !important;\n}\n.gc-table-sheet-group-list .selected .gc-table-sheet-group-item-remove, .gc-table-sheet-cross-column-list .selected .gc-table-sheet-group-item-remove, .gc-table-sheet-cross-column-attributes-list .selected .gc-table-sheet-group-item-remove {\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzE5XzE2MjApIj4KPHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJ0cmFuc3BhcmVudCIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTUuODk1MDggMS4yODYyMUM2LjA3MzgyIDEuMTAwNjIgNi4zMTIxNiAxIDYuNTU2NTEgMUg5LjQ0NTk1QzkuNjkwMzEgMSA5LjkyODY0IDEuMTAwNjIgMTAuMTA3NCAxLjI4NjIxQzEwLjI4NjcgMS40NzI0NCAxMC4zOTA3IDEuNzI4OTEgMTAuMzkwNyAyLjAwMDA5VjMuMDAwMThINS42MTE3OVYyLjAwMDA5QzUuNjExNzkgMS43Mjg5MSA1LjcxNTcyIDEuNDcyNDQgNS44OTUwOCAxLjI4NjIxWk00LjYxMTc5IDMuMDAwMThWMi4wMDAwOUM0LjYxMTc5IDEuNDc1NTggNC44MTIyOSAwLjk2ODkzMiA1LjE3NDggMC41OTI1MjNDNS41Mzc5NCAwLjIxNTQ3NCA2LjAzNDU0IDAgNi41NTY1MSAwSDkuNDQ1OTVDOS45Njc5MiAwIDEwLjQ2NDUgMC4yMTU0NzQgMTAuODI3NyAwLjU5MjUyM0MxMS4xOTAyIDAuOTY4OTMyIDExLjM5MDcgMS40NzU1OCAxMS4zOTA3IDIuMDAwMDlWMy4wMDAxOEgxMy4wNTc3SDE0LjUwMjVDMTQuNzc4NiAzLjAwMDE4IDE1LjAwMjUgMy4yMjQwNCAxNS4wMDI1IDMuNTAwMThDMTUuMDAyNSAzLjc3NjMzIDE0Ljc3ODYgNC4wMDAxOCAxNC41MDI1IDQuMDAwMThIMTMuNTU3N1YxNC4wMDA4QzEzLjU1NzcgMTQuNTI1MyAxMy4zNTcyIDE1LjAzMiAxMi45OTQ3IDE1LjQwODRDMTIuNjMxNiAxNS43ODU0IDEyLjEzNSAxNi4wMDA5IDExLjYxMyAxNi4wMDA5SDQuMzg5NDRDMy44Njc0NyAxNi4wMDA5IDMuMzcwODYgMTUuNzg1NCAzLjAwNzczIDE1LjQwODRDMi42NDUyMSAxNS4wMzIgMi40NDQ3MiAxNC41MjUzIDIuNDQ0NzIgMTQuMDAwOFY0LjAwMDE4SDEuNUMxLjIyMzg2IDQuMDAwMTggMSAzLjc3NjMzIDEgMy41MDAxOEMxIDMuMjI0MDQgMS4yMjM4NiAzLjAwMDE4IDEuNSAzLjAwMDE4SDIuOTQ0NzJINC42MTE3OVpNMy40NDQ3MiA0LjAwMDE4VjE0LjAwMDhDMy40NDQ3MiAxNC4yNzIgMy41NDg2NCAxNC41Mjg1IDMuNzI4IDE0LjcxNDdDMy45MDY3NSAxNC45MDAzIDQuMTQ1MDggMTUuMDAwOSA0LjM4OTQ0IDE1LjAwMDlIMTEuNjEzQzExLjg1NzQgMTUuMDAwOSAxMi4wOTU3IDE0LjkwMDMgMTIuMjc0NSAxNC43MTQ3QzEyLjQ1MzggMTQuNTI4NSAxMi41NTc3IDE0LjI3MiAxMi41NTc3IDE0LjAwMDhWNC4wMDAxOEgzLjQ0NDcyWk02LjUgN0M2Ljc3NjE0IDcgNyA3LjIwMzUgNyA3LjQ1NDUyVjExLjU0NTVDNyAxMS43OTY1IDYuNzc2MTQgMTIgNi41IDEyQzYuMjIzODYgMTIgNiAxMS43OTY1IDYgMTEuNTQ1NVY3LjQ1NDUyQzYgNy4yMDM1IDYuMjIzODYgNyA2LjUgN1pNMTAgNy40NTQ1MkMxMCA3LjIwMzUgOS43NzYxNCA3IDkuNSA3QzkuMjIzODYgNyA5IDcuMjAzNSA5IDcuNDU0NTJWMTEuNTQ1NUM5IDExLjc5NjUgOS4yMjM4NiAxMiA5LjUgMTJDOS43NzYxNCAxMiAxMCAxMS43OTY1IDEwIDExLjU0NTVWNy40NTQ1MloiIGZpbGw9IndoaXRlIi8+CjwvZz4KPGRlZnM+CjxjbGlwUGF0aCBpZD0iY2xpcDBfMTlfMTYyMCI+CjxyZWN0IHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgZmlsbD0idHJhbnNwYXJlbnQiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K);\n}\n.gc-table-sheet-group-list .selected .gc-table-sheet-group-item-setting, .gc-table-sheet-cross-column-list .selected .gc-table-sheet-group-item-setting, .gc-table-sheet-cross-column-attributes-list .selected .gc-table-sheet-group-item-setting {\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgd2lkdGg9IjE2cHgiIGhlaWdodD0iMTZweCIgdmlld0JveD0iMCAwIDEwIDEwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KICAgIDx0aXRsZT5zZXR0aW5nIGNvbG9yPC90aXRsZT4NCiAgICA8ZyBpZD0ic2V0dGluZy1jb2xvciIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+DQogICAgICAgIDxnIGlkPSLliIbnu4QiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAuMDAwMDAwLCAtMC4wMDAwMDApIiBmaWxsLXJ1bGU9Im5vbnplcm8iPg0KICAgICAgICAgICAgPHBhdGggZD0iTTUsNi40Mjg1NzE0MyBDNC4yMTIyNDQ5LDYuNDI4NTcxNDMgMy41NzE0Mjg1Nyw1Ljc4Nzc1NTEgMy41NzE0Mjg1Nyw1IEMzLjU3MTQyODU3LDQuMjEyMjQ0OSA0LjIxMjI0NDksMy41NzE0Mjg1NyA1LDMuNTcxNDI4NTcgQzUuNzg3NzU1MSwzLjU3MTQyODU3IDYuNDI4NTcxNDMsNC4yMTIyNDQ5IDYuNDI4NTcxNDMsNSBDNi40Mjg1NzE0Myw1Ljc4Nzc1NTEgNS43ODc3NTUxLDYuNDI4NTcxNDMgNSw2LjQyODU3MTQzIFogTTQuOTk5NjQyODYsMi44NTcxNDI4NiBDMy44MTgwMjE4MiwyLjg1NzE0Mjg2IDIuODU2Nzg1NzEsMy44MTgxMjc0OCAyLjg1Njc4NTcxLDUgQzIuODU2Nzg1NzEsNi4xODEwNTc0NCAzLjgxODAyMTgyLDcuMTQyODU3MTQgNC45OTk2NDI4Niw3LjE0Mjg1NzE0IEM2LjE4MTI2Mzg5LDcuMTQyODU3MTQgNy4xNDI1LDYuMTgxMDU3NDQgNy4xNDI1LDUgQzcuMTQyNSwzLjgxODEyNzQ4IDYuMTgxMjYzODksMi44NTcxNDI4NiA0Ljk5OTY0Mjg2LDIuODU3MTQyODYgWiBNOS4yODA4MTkxMiw1LjI4NzIwNjg4IEM5LjIzODg2MDU5LDUuMzE1MTkyOTMgOS4xOTI3MDYyMSw1LjMzNDc4MzE3IDkuMTQzNzU0NTksNS4zNDU5Nzc1OSBMOC4wMDk0NzU2Myw1LjYyOTMzNjM4IEw3LjkwMzg4LDUuOTUwNDc2MzUgQzcuODU3MDI2MzEsNi4wOTYwMDM4MiA3Ljc5NDc4NzgyLDYuMjQyOTMwNjEgNy43MjEzNjAzOSw2LjM4Nzc1ODQzIEw3LjU2NzUxMjQ0LDYuNjkwMDA3ODEgTDguMTY2ODIwMTMsNy42OTA1MDkyMyBDOC4yMDUyODIxMSw3Ljc1MTM3ODkgOC4yMjI3NjQ4Myw3LjgwNTk1MTcgOC4yMjgzNTkzLDcuODM4ODM1MzEgTDcuODI1NTU3NDEsOC4yNDExMzQ4MyBDNy43ODkxOTMzNSw4LjIzMDY0MDA2IDcuNzU0MjI3OSw4LjIxNjY0NzA0IDcuNzIyMDU5Nyw4LjE5Nzc1NjQ1IEw2LjcxNDM1NTY1LDcuNTU1NDc2NTIgTDYuNDAxNzY0NTksNy43MTc3OTU2MyBDNi4yNTM1MTExMSw3Ljc5NDA1NzYzIDYuMDk5NjYzMTcsNy44NTkxMjUyIDUuOTQxNjE5MzcsNy45MTAxOTk3NSBMNS42MDgwNDkwNCw4LjAxNzk0NjA2IEw1LjM1NjI5Nzg2LDkuMTU3Njc4MDkgQzUuMzQ0NDA5NjEsOS4yMTg1NDc3NiA1LjMxMTU0MjA5LDkuMjY4MjIzIDUuMjg5MTY0MjEsOS4yODU3MTQyOSBMNC43Mzg4MDgxNCw5LjI4NTcxNDI5IEM0LjcxMDgzNTc5LDkuMjQzNzM1MjEgNC42OTEyNTUxNCw5LjE5NzU1ODIyIDQuNjgwMDY2Miw5LjE0ODU4MjYyIEw0LjM5ODk0NDA0LDguMDIxNDQ0MzEgTDQuMDcyMzY2ODEsNy45MTc4OTU5MiBDMy45MDAzMzY4Myw3Ljg2MzMyMzExIDMuNzMzMjAyMDIsNy43OTMzNTc5OCAzLjU3Mzc1OTYsNy43MDg3MDAxNiBMMy4yNTkwNzA2Miw3LjU0Mjg4MjggTDIuMjUyMDY1ODcsOC4xODUxNjI3MyBDMi4yMTUwMDI1MSw4LjIxMTc0OTQ4IDIuMTcxNjQ1MzYsOC4yMjY0NDIxNiAyLjEyNjg4OTU5LDguMjI4NTQxMTEgTDEuNzI1NDg2MzEsNy44MzgxMzU2NiBDMS43MzUyNzY2Myw3Ljc4OTE2MDA3IDEuNzU0MTU3OTcsNy43NDIyODM0MyAxLjc4MDczMTcxLDcuNzAwMzA0MzUgTDIuNDA2NjEzMTMsNi42NTcxMjQyIEwyLjI1NzY2MDM1LDYuMzU2OTczNzcgQzIuMTkxOTI1MzEsNi4yMjYxMzg5NyAyLjEzNjY3OTkxLDYuMDkxMTA2MjcgMi4wOTA1MjU1Myw1Ljk1MTE3NiBMMS45ODQ5Mjk4OSw1LjYyOTMzNjM4IEwwLjg2MTgzOTg4Miw1LjM0ODc3NjE5IEMwLjgwOTM5MTcxOCw1LjMzNzU4MTc3IDAuNzU5MDQxNDgxLDUuMzE2NTkyMjMgMC43MTQyODU3MTQsNS4yODcyMDY4OCBMMC43MTQyODU3MTQsNC43MTgzOTAzNCBMMC43MTQ5ODUwMjMsNC43MTgzOTAzNCBDMC43MjYxNzM5NjUsNC43MTgzOTAzNCAwLjc3NTgyNDg5Myw0LjY4MjcwODEyIDAuODE3NzgzNDI0LDQuNjc1MDExOTUgTDEuOTcxNjQzMDMsNC40MTg5Mzk1NiBMMi4wNzc5Mzc5Nyw0LjA4MTcwNzYyIEMyLjEyMDU5NTgxLDMuOTQzODc2MyAyLjE3OTMzNzc1LDMuODAxMTQ3NDMgMi4yNTc2NjAzNSwzLjY0MzcyNTg4IEwyLjQwNjYxMzEzLDMuMzQzNTc1NDUgTDEuNzg3NzI0OCwyLjMxMDg5MDA3IEMxLjc1NzY1NDUyLDIuMjY1NDEyNzQgMS43MzY2NzUyNSwyLjIxNTczNzQ5IDEuNzI2MTg1NjIsMi4xNjI1NjM5OSBMMi4xMjgyODgyMSwxLjc2MDI2NDQ3IEMyLjE2NzQ0OTUsMS43NzI4NTgxOSAyLjIxMTUwNTk2LDEuNzg4OTUwMTcgMi4yMzE3ODU5MiwxLjgwMjk0MzIgTDMuMjU4MzcxMzEsMi40NTc4MTY4NSBMMy41NzIzNjA5OCwyLjI5MTI5OTg0IEMzLjczMTEwNDA5LDIuMjA3MzQxNjcgMy44OTc1Mzk2LDIuMTM3Mzc2NTQgNC4wNjg4NzAyNywyLjA4MjgwMzc0IEw0LjM5NDA0ODg4LDEuOTc5MjU1MzQgTDQuNjczMDczMTEsMC44NjI2MTE3OTggQzQuNjg5MTU3MjIsMC43OTE5NDcwMTMgNC43MTUwMzE2NCwwLjc0MDg3MjQ2NSA0LjczNDYxMjI5LDAuNzE0Mjg1NzE0IEw1LjMwMzE1MDM5LDAuNzE0Mjg1NzE0IEM1LjI5ODk1NDUzLDAuNzIwNTgyNTc2IDUuMzM4MTE1ODMsMC43NzM3NTYwNzggNS4zNDY1MDc1NCwwLjgxNzgzNDExMyBMNS42MDMxNTM4OCwxLjk3OTI1NTM0IEw1LjkzNjcyNDIsMi4wODcwMDE2NCBDNi4wOTI2NzAwOCwyLjEzODA3NjE5IDYuMjQ5MzE1MjYsMi4yMDMxNDM3NyA2LjQwMjQ2MzksMi4yODI5MDQwMiBMNi43MTUwNTQ5NSwyLjQ0NTkyMjc4IEw3LjcwMTc3OTc0LDEuODE2OTM2MjMgQzcuNzM4MTQzOCwxLjc5MDM0OTQ4IDcuNzgxNTAwOTUsMS43NzQ5NTcxNSA3LjgyNjk1NjAzLDEuNzcyODU4MTkgTDguMjI4MzU5MywyLjE2Mzk2MzI5IEM4LjIxODU2ODk4LDIuMjEyOTM4ODkgOC4xOTk2ODc2NCwyLjI1OTExNTg3IDguMTczMTEzOTEsMi4zMDE3OTQ2MSBMNy41Njc1MTI0NCwzLjMwOTk5MjE5IEw3LjcyMjA1OTcsMy42MTI5NDEyMiBDNy44MDUyNzc0NSwzLjc3NTk1OTk4IDcuODY4MjE1MjUsMy45MjkxODM2MiA3LjkxNjQ2NzU2LDQuMDgxMDA3OTYgTDguMDIyMDYzMTksNC40MTg5Mzk1NiBMOS4xNTI4NDU2LDQuNjcwMTE0MzkgQzkuMjIxMzc3ODcsNC42ODI3MDgxMiA5LjI3NDUyNTM0LDQuNzIyNTg4MjQgOS4yODU3MTQyOSw0Ljc0NDI3NzQ0IEw5LjI4MDgxOTEyLDUuMjg3MjA2ODggWiBNOS4zNzkyODU3MSw0LjA1Mjg1NzE0IEw4LjU3NzE0Mjg2LDMuODc1IEM4LjUxNSwzLjY3NSA4LjQzMjg1NzE0LDMuNDgzNTcxNDMgOC4zMzkyODU3MSwzLjMgTDguNzcyODU3MTQsMi41NzcxNDI4NiBDOC45MzUsMi4zMTc4NTcxNCA5LjAxNzE0Mjg2LDEuOTM3MTQyODYgOC43NzI4NTcxNCwxLjY5Mjg1NzE0IEw4LjMzMDcxNDI5LDEuMjUwNzE0MjkgQzguMDg3MTQyODYsMS4wMDcxNDI4NiA3LjY3NSwxLjA1MDcxNDI5IDcuNDI1NzE0MjksMS4yMjM1NzE0MyBMNi43MjI4NTcxNCwxLjY3MTQyODU3IEM2LjUzOTI4NTcxLDEuNTc2NDI4NTcgNi4zNDg1NzE0MywxLjQ5NTcxNDI5IDYuMTUxNDI4NTcsMS40MzE0Mjg1NyBMNS45NzE0Mjg1NywwLjYyIEM1LjkxNzg1NzE0LDAuMzIyMTQyODU3IDUuNjU3MTQyODYsMCA1LjMxMjE0Mjg2LDAgTDQuNjg3MTQyODYsMCBDNC4zNDIxNDI4NiwwIDQuMTMwNzE0MjksMC4zMjcxNDI4NTcgNC4wNjIxNDI4NiwwLjYyNSBMMy44NjE0Mjg1NywxLjQyNzE0Mjg2IEMzLjY1MTQyODU3LDEuNDk0Mjg1NzEgMy40NDc4NTcxNCwxLjU3OTI4NTcxIDMuMjUyODU3MTQsMS42ODI4NTcxNCBMMi41MzE0Mjg1NywxLjIyMzU3MTQzIEMyLjI4MzU3MTQzLDEuMDUwNzE0MjkgMS44NzE0Mjg1NywxLjAwNzE0Mjg2IDEuNjI3MTQyODYsMS4yNTA3MTQyOSBMMS4xODUsMS42OTI4NTcxNCBDMC45NDE0Mjg1NzEsMS45MzcxNDI4NiAxLjAyMjg1NzE0LDIuMzE3ODU3MTQgMS4xODUsMi41NzY0Mjg1NyBMMS42NDE0Mjg1NywzLjMzNzg1NzE0IEMxLjU1NDI4NTcxLDMuNTEwNzE0MjkgMS40ODA3MTQyOSwzLjY5MDcxNDI5IDEuNDIxNDI4NTcsMy44NzUgTDAuNjIsNC4wNTI4NTcxNCBDMC4zMjIxNDI4NTcsNC4xMDY0Mjg1NyAwLDQuMzY3MTQyODYgMCw0LjcxMjE0Mjg2IEwwLDUuMzM3MTQyODYgQzAsNS42ODI4NTcxNCAwLjMyNzE0Mjg1Nyw1Ljg5NDI4NTcxIDAuNjI1LDUuOTYyMTQyODYgTDEuNDM2NDI4NTcsNi4xNjUgQzEuNDkyMTQyODYsNi4zMzcxNDI4NiAxLjU2Mjg1NzE0LDYuNTAyODU3MTQgMS42NDIxNDI4Niw2LjY2Mjg1NzE0IEwxLjE4NSw3LjQyNSBDMS4wMjM1NzE0Myw3LjY4MzU3MTQzIDAuOTQxNDI4NTcxLDguMDY0Mjg1NzEgMS4xODUsOC4zMDg1NzE0MyBMMS42MjcxNDI4Niw4Ljc1MDcxNDI5IEMxLjg3MTQyODU3LDguOTk1IDIuMjgyODU3MTQsOC45NSAyLjUzMTQyODU3LDguNzc4NTcxNDMgTDMuMjU0Mjg1NzEsOC4zMTc4NTcxNCBDMy40NTA3MTQyOSw4LjQyMTQyODU3IDMuNjU1NzE0MjksOC41MDc4NTcxNCAzLjg2NzE0Mjg2LDguNTc1IEw0LjA2NzE0Mjg2LDkuMzc0Mjg1NzEgQzQuMTM1NzE0MjksOS42NzIxNDI4NiA0LjM0NjQyODU3LDkuOTk5Mjg1NzEgNC42OTIxNDI4Niw5Ljk5OTI4NTcxIEw1LjMxNjQyODU3LDkuOTk5Mjg1NzEgQzUuNjYyMTQyODYsOS45OTkyODU3MSA1LjkyMjE0Mjg2LDkuNjc3MTQyODYgNS45NzU3MTQyOSw5LjM3OTI4NTcxIEw2LjE1NjQyODU3LDguNTY1IEM2LjM1Mjg1NzE0LDguNTAxNDI4NTcgNi41NDA3MTQyOSw4LjQyMTQyODU3IDYuNzIxNDI4NTcsOC4zMjc4NTcxNCBMNy40MjU3MTQyOSw4Ljc3Nzg1NzE0IEM3LjY3NSw4Ljk1IDguMDg2NDI4NTcsOC45OTQyODU3MSA4LjMzMDcxNDI5LDguNzUgTDguNzcyODU3MTQsOC4zMDc4NTcxNCBDOS4wMTcxNDI4Niw4LjA2MzU3MTQzIDguOTM1LDcuNjgyODU3MTQgOC43NzI4NTcxNCw3LjQyNDI4NTcxIEw4LjMzOTI4NTcxLDYuNyBDOC40MjY0Mjg1Nyw2LjUyODU3MTQzIDguNTAxNDI4NTcsNi4zNSA4LjU2MjE0Mjg2LDYuMTY0Mjg1NzEgTDkuMzc1LDUuOTYyMTQyODYgQzkuNjcyMTQyODYsNS44OTI4NTcxNCAxMCw1LjY4MjE0Mjg2IDEwLDUuMzM2NDI4NTcgTDEwLDQuNzExNDI4NTcgQzEwLDQuMzY2NDI4NTcgOS42Nzc4NTcxNCw0LjEwNTcxNDI5IDkuMzc5Mjg1NzEsNC4wNTIxNDI4NiBMOS4zNzkyODU3MSw0LjA1Mjg1NzE0IFoiIGlkPSJGaWxsLTMiIGZpbGw9IiNmZmZmZmYiPjwvcGF0aD4NCiAgICAgICAgPC9nPg0KICAgIDwvZz4NCjwvc3ZnPg0K);\n}\n.gc-table-sheet-group-list .selected .gc-table-sheet-cross-column-item-edit, .gc-table-sheet-cross-column-list .selected .gc-table-sheet-cross-column-item-edit, .gc-table-sheet-cross-column-attributes-list .selected .gc-table-sheet-cross-column-item-edit {\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB0PSIxNjQ5ODQzMjA5MjY3IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9Ijg0NzMiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTcyNi42NTI4MDEgNDI5LjMwNTYwMyAyOTcuMzQ3MTk5IDQyOS4zMDU2MDMgNTEyLjE5MzQwNSA2MzguMTU2MjU4WiIgcC1pZD0iODQ3NCIgZmlsbD0iI2ZmZmZmZiI+PC9wYXRoPjwvc3ZnPg==);\n}\n.gc-table-sheet-group-list .selected .gc-table-sheet-summary-item-label, .gc-table-sheet-cross-column-list .selected .gc-table-sheet-summary-item-label, .gc-table-sheet-cross-column-attributes-list .selected .gc-table-sheet-summary-item-label {\n  color: var(--sjs-theme-accent-color);\n}\n.gc-table-sheet-group-list .gc-table-sheet-group-item-label, .gc-table-sheet-group-list .gc-table-sheet-cross-column-item-label, .gc-table-sheet-cross-column-list .gc-table-sheet-group-item-label, .gc-table-sheet-cross-column-list .gc-table-sheet-cross-column-item-label, .gc-table-sheet-cross-column-attributes-list .gc-table-sheet-group-item-label, .gc-table-sheet-cross-column-attributes-list .gc-table-sheet-cross-column-item-label {\n  margin-left: 5px;\n  width: 80%;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  display: inline-block;\n  white-space: nowrap;\n}\n.gc-table-sheet-group-list .gc-table-sheet-group-item-remove, .gc-table-sheet-group-list .gc-table-sheet-summary-item-remove, .gc-table-sheet-group-list .gc-table-sheet-group-item-setting, .gc-table-sheet-cross-column-list .gc-table-sheet-group-item-remove, .gc-table-sheet-cross-column-list .gc-table-sheet-summary-item-remove, .gc-table-sheet-cross-column-list .gc-table-sheet-group-item-setting, .gc-table-sheet-cross-column-attributes-list .gc-table-sheet-group-item-remove, .gc-table-sheet-cross-column-attributes-list .gc-table-sheet-summary-item-remove, .gc-table-sheet-cross-column-attributes-list .gc-table-sheet-group-item-setting {\n  float: right;\n  cursor: pointer;\n  background-repeat: no-repeat;\n  background-position: center;\n  width: 16px;\n  height: 16px;\n  margin-top: 3px;\n  margin-right: 3px;\n}\n.gc-table-sheet-group-list .gc-table-sheet-group-item-remove, .gc-table-sheet-group-list .gc-table-sheet-summary-item-remove, .gc-table-sheet-cross-column-list .gc-table-sheet-group-item-remove, .gc-table-sheet-cross-column-list .gc-table-sheet-summary-item-remove, .gc-table-sheet-cross-column-attributes-list .gc-table-sheet-group-item-remove, .gc-table-sheet-cross-column-attributes-list .gc-table-sheet-summary-item-remove {\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzE5XzE2MzEpIj4KPHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJ0cmFuc3BhcmVudCIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTUuODk1MDggMS4yODYyMUM2LjA3MzgyIDEuMTAwNjIgNi4zMTIxNiAxIDYuNTU2NTEgMUg5LjQ0NTk1QzkuNjkwMzEgMSA5LjkyODY0IDEuMTAwNjIgMTAuMTA3NCAxLjI4NjIxQzEwLjI4NjcgMS40NzI0NCAxMC4zOTA3IDEuNzI4OTEgMTAuMzkwNyAyLjAwMDA5VjMuMDAwMThINS42MTE3OVYyLjAwMDA5QzUuNjExNzkgMS43Mjg5MSA1LjcxNTcyIDEuNDcyNDQgNS44OTUwOCAxLjI4NjIxWk00LjYxMTc5IDMuMDAwMThWMi4wMDAwOUM0LjYxMTc5IDEuNDc1NTggNC44MTIyOSAwLjk2ODkzMiA1LjE3NDggMC41OTI1MjNDNS41Mzc5NCAwLjIxNTQ3NCA2LjAzNDU0IDAgNi41NTY1MSAwSDkuNDQ1OTVDOS45Njc5MiAwIDEwLjQ2NDUgMC4yMTU0NzQgMTAuODI3NyAwLjU5MjUyM0MxMS4xOTAyIDAuOTY4OTMyIDExLjM5MDcgMS40NzU1OCAxMS4zOTA3IDIuMDAwMDlWMy4wMDAxOEgxMy4wNTc3SDE0LjUwMjVDMTQuNzc4NiAzLjAwMDE4IDE1LjAwMjUgMy4yMjQwNCAxNS4wMDI1IDMuNTAwMThDMTUuMDAyNSAzLjc3NjMzIDE0Ljc3ODYgNC4wMDAxOCAxNC41MDI1IDQuMDAwMThIMTMuNTU3N1YxNC4wMDA4QzEzLjU1NzcgMTQuNTI1MyAxMy4zNTcyIDE1LjAzMiAxMi45OTQ3IDE1LjQwODRDMTIuNjMxNiAxNS43ODU0IDEyLjEzNSAxNi4wMDA5IDExLjYxMyAxNi4wMDA5SDQuMzg5NDRDMy44Njc0NyAxNi4wMDA5IDMuMzcwODYgMTUuNzg1NCAzLjAwNzczIDE1LjQwODRDMi42NDUyMSAxNS4wMzIgMi40NDQ3MiAxNC41MjUzIDIuNDQ0NzIgMTQuMDAwOFY0LjAwMDE4SDEuNUMxLjIyMzg2IDQuMDAwMTggMSAzLjc3NjMzIDEgMy41MDAxOEMxIDMuMjI0MDQgMS4yMjM4NiAzLjAwMDE4IDEuNSAzLjAwMDE4SDIuOTQ0NzJINC42MTE3OVpNMy40NDQ3MiA0LjAwMDE4VjE0LjAwMDhDMy40NDQ3MiAxNC4yNzIgMy41NDg2NCAxNC41Mjg1IDMuNzI4IDE0LjcxNDdDMy45MDY3NSAxNC45MDAzIDQuMTQ1MDggMTUuMDAwOSA0LjM4OTQ0IDE1LjAwMDlIMTEuNjEzQzExLjg1NzQgMTUuMDAwOSAxMi4wOTU3IDE0LjkwMDMgMTIuMjc0NSAxNC43MTQ3QzEyLjQ1MzggMTQuNTI4NSAxMi41NTc3IDE0LjI3MiAxMi41NTc3IDE0LjAwMDhWNC4wMDAxOEgzLjQ0NDcyWk02LjUgN0M2Ljc3NjE0IDcgNyA3LjIwMzUgNyA3LjQ1NDUyVjExLjU0NTVDNyAxMS43OTY1IDYuNzc2MTQgMTIgNi41IDEyQzYuMjIzODYgMTIgNiAxMS43OTY1IDYgMTEuNTQ1NVY3LjQ1NDUyQzYgNy4yMDM1IDYuMjIzODYgNyA2LjUgN1pNMTAgNy40NTQ1MkMxMCA3LjIwMzUgOS43NzYxNCA3IDkuNSA3QzkuMjIzODYgNyA5IDcuMjAzNSA5IDcuNDU0NTJWMTEuNTQ1NUM5IDExLjc5NjUgOS4yMjM4NiAxMiA5LjUgMTJDOS43NzYxNCAxMiAxMCAxMS43OTY1IDEwIDExLjU0NTVWNy40NTQ1MloiIGZpbGw9IiM2NjY2NjYiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xOV8xNjMxIj4KPHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJ0cmFuc3BhcmVudCIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=);\n}\n.gc-table-sheet-group-list .gc-table-sheet-group-item-setting, .gc-table-sheet-cross-column-list .gc-table-sheet-group-item-setting, .gc-table-sheet-cross-column-attributes-list .gc-table-sheet-group-item-setting {\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgd2lkdGg9IjE2cHgiIGhlaWdodD0iMTZweCIgdmlld0JveD0iMCAwIDEwIDEwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KICAgIDx0aXRsZT5zZXR0aW5nIGNvbG9yPC90aXRsZT4NCiAgICA8ZyBpZD0ic2V0dGluZy1jb2xvciIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+DQogICAgICAgIDxnIGlkPSLliIbnu4QiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAuMDAwMDAwLCAtMC4wMDAwMDApIiBmaWxsLXJ1bGU9Im5vbnplcm8iPg0KICAgICAgICAgICAgPHBhdGggZD0iTTUsNi40Mjg1NzE0MyBDNC4yMTIyNDQ5LDYuNDI4NTcxNDMgMy41NzE0Mjg1Nyw1Ljc4Nzc1NTEgMy41NzE0Mjg1Nyw1IEMzLjU3MTQyODU3LDQuMjEyMjQ0OSA0LjIxMjI0NDksMy41NzE0Mjg1NyA1LDMuNTcxNDI4NTcgQzUuNzg3NzU1MSwzLjU3MTQyODU3IDYuNDI4NTcxNDMsNC4yMTIyNDQ5IDYuNDI4NTcxNDMsNSBDNi40Mjg1NzE0Myw1Ljc4Nzc1NTEgNS43ODc3NTUxLDYuNDI4NTcxNDMgNSw2LjQyODU3MTQzIFogTTQuOTk5NjQyODYsMi44NTcxNDI4NiBDMy44MTgwMjE4MiwyLjg1NzE0Mjg2IDIuODU2Nzg1NzEsMy44MTgxMjc0OCAyLjg1Njc4NTcxLDUgQzIuODU2Nzg1NzEsNi4xODEwNTc0NCAzLjgxODAyMTgyLDcuMTQyODU3MTQgNC45OTk2NDI4Niw3LjE0Mjg1NzE0IEM2LjE4MTI2Mzg5LDcuMTQyODU3MTQgNy4xNDI1LDYuMTgxMDU3NDQgNy4xNDI1LDUgQzcuMTQyNSwzLjgxODEyNzQ4IDYuMTgxMjYzODksMi44NTcxNDI4NiA0Ljk5OTY0Mjg2LDIuODU3MTQyODYgWiBNOS4yODA4MTkxMiw1LjI4NzIwNjg4IEM5LjIzODg2MDU5LDUuMzE1MTkyOTMgOS4xOTI3MDYyMSw1LjMzNDc4MzE3IDkuMTQzNzU0NTksNS4zNDU5Nzc1OSBMOC4wMDk0NzU2Myw1LjYyOTMzNjM4IEw3LjkwMzg4LDUuOTUwNDc2MzUgQzcuODU3MDI2MzEsNi4wOTYwMDM4MiA3Ljc5NDc4NzgyLDYuMjQyOTMwNjEgNy43MjEzNjAzOSw2LjM4Nzc1ODQzIEw3LjU2NzUxMjQ0LDYuNjkwMDA3ODEgTDguMTY2ODIwMTMsNy42OTA1MDkyMyBDOC4yMDUyODIxMSw3Ljc1MTM3ODkgOC4yMjI3NjQ4Myw3LjgwNTk1MTcgOC4yMjgzNTkzLDcuODM4ODM1MzEgTDcuODI1NTU3NDEsOC4yNDExMzQ4MyBDNy43ODkxOTMzNSw4LjIzMDY0MDA2IDcuNzU0MjI3OSw4LjIxNjY0NzA0IDcuNzIyMDU5Nyw4LjE5Nzc1NjQ1IEw2LjcxNDM1NTY1LDcuNTU1NDc2NTIgTDYuNDAxNzY0NTksNy43MTc3OTU2MyBDNi4yNTM1MTExMSw3Ljc5NDA1NzYzIDYuMDk5NjYzMTcsNy44NTkxMjUyIDUuOTQxNjE5MzcsNy45MTAxOTk3NSBMNS42MDgwNDkwNCw4LjAxNzk0NjA2IEw1LjM1NjI5Nzg2LDkuMTU3Njc4MDkgQzUuMzQ0NDA5NjEsOS4yMTg1NDc3NiA1LjMxMTU0MjA5LDkuMjY4MjIzIDUuMjg5MTY0MjEsOS4yODU3MTQyOSBMNC43Mzg4MDgxNCw5LjI4NTcxNDI5IEM0LjcxMDgzNTc5LDkuMjQzNzM1MjEgNC42OTEyNTUxNCw5LjE5NzU1ODIyIDQuNjgwMDY2Miw5LjE0ODU4MjYyIEw0LjM5ODk0NDA0LDguMDIxNDQ0MzEgTDQuMDcyMzY2ODEsNy45MTc4OTU5MiBDMy45MDAzMzY4Myw3Ljg2MzMyMzExIDMuNzMzMjAyMDIsNy43OTMzNTc5OCAzLjU3Mzc1OTYsNy43MDg3MDAxNiBMMy4yNTkwNzA2Miw3LjU0Mjg4MjggTDIuMjUyMDY1ODcsOC4xODUxNjI3MyBDMi4yMTUwMDI1MSw4LjIxMTc0OTQ4IDIuMTcxNjQ1MzYsOC4yMjY0NDIxNiAyLjEyNjg4OTU5LDguMjI4NTQxMTEgTDEuNzI1NDg2MzEsNy44MzgxMzU2NiBDMS43MzUyNzY2Myw3Ljc4OTE2MDA3IDEuNzU0MTU3OTcsNy43NDIyODM0MyAxLjc4MDczMTcxLDcuNzAwMzA0MzUgTDIuNDA2NjEzMTMsNi42NTcxMjQyIEwyLjI1NzY2MDM1LDYuMzU2OTczNzcgQzIuMTkxOTI1MzEsNi4yMjYxMzg5NyAyLjEzNjY3OTkxLDYuMDkxMTA2MjcgMi4wOTA1MjU1Myw1Ljk1MTE3NiBMMS45ODQ5Mjk4OSw1LjYyOTMzNjM4IEwwLjg2MTgzOTg4Miw1LjM0ODc3NjE5IEMwLjgwOTM5MTcxOCw1LjMzNzU4MTc3IDAuNzU5MDQxNDgxLDUuMzE2NTkyMjMgMC43MTQyODU3MTQsNS4yODcyMDY4OCBMMC43MTQyODU3MTQsNC43MTgzOTAzNCBMMC43MTQ5ODUwMjMsNC43MTgzOTAzNCBDMC43MjYxNzM5NjUsNC43MTgzOTAzNCAwLjc3NTgyNDg5Myw0LjY4MjcwODEyIDAuODE3NzgzNDI0LDQuNjc1MDExOTUgTDEuOTcxNjQzMDMsNC40MTg5Mzk1NiBMMi4wNzc5Mzc5Nyw0LjA4MTcwNzYyIEMyLjEyMDU5NTgxLDMuOTQzODc2MyAyLjE3OTMzNzc1LDMuODAxMTQ3NDMgMi4yNTc2NjAzNSwzLjY0MzcyNTg4IEwyLjQwNjYxMzEzLDMuMzQzNTc1NDUgTDEuNzg3NzI0OCwyLjMxMDg5MDA3IEMxLjc1NzY1NDUyLDIuMjY1NDEyNzQgMS43MzY2NzUyNSwyLjIxNTczNzQ5IDEuNzI2MTg1NjIsMi4xNjI1NjM5OSBMMi4xMjgyODgyMSwxLjc2MDI2NDQ3IEMyLjE2NzQ0OTUsMS43NzI4NTgxOSAyLjIxMTUwNTk2LDEuNzg4OTUwMTcgMi4yMzE3ODU5MiwxLjgwMjk0MzIgTDMuMjU4MzcxMzEsMi40NTc4MTY4NSBMMy41NzIzNjA5OCwyLjI5MTI5OTg0IEMzLjczMTEwNDA5LDIuMjA3MzQxNjcgMy44OTc1Mzk2LDIuMTM3Mzc2NTQgNC4wNjg4NzAyNywyLjA4MjgwMzc0IEw0LjM5NDA0ODg4LDEuOTc5MjU1MzQgTDQuNjczMDczMTEsMC44NjI2MTE3OTggQzQuNjg5MTU3MjIsMC43OTE5NDcwMTMgNC43MTUwMzE2NCwwLjc0MDg3MjQ2NSA0LjczNDYxMjI5LDAuNzE0Mjg1NzE0IEw1LjMwMzE1MDM5LDAuNzE0Mjg1NzE0IEM1LjI5ODk1NDUzLDAuNzIwNTgyNTc2IDUuMzM4MTE1ODMsMC43NzM3NTYwNzggNS4zNDY1MDc1NCwwLjgxNzgzNDExMyBMNS42MDMxNTM4OCwxLjk3OTI1NTM0IEw1LjkzNjcyNDIsMi4wODcwMDE2NCBDNi4wOTI2NzAwOCwyLjEzODA3NjE5IDYuMjQ5MzE1MjYsMi4yMDMxNDM3NyA2LjQwMjQ2MzksMi4yODI5MDQwMiBMNi43MTUwNTQ5NSwyLjQ0NTkyMjc4IEw3LjcwMTc3OTc0LDEuODE2OTM2MjMgQzcuNzM4MTQzOCwxLjc5MDM0OTQ4IDcuNzgxNTAwOTUsMS43NzQ5NTcxNSA3LjgyNjk1NjAzLDEuNzcyODU4MTkgTDguMjI4MzU5MywyLjE2Mzk2MzI5IEM4LjIxODU2ODk4LDIuMjEyOTM4ODkgOC4xOTk2ODc2NCwyLjI1OTExNTg3IDguMTczMTEzOTEsMi4zMDE3OTQ2MSBMNy41Njc1MTI0NCwzLjMwOTk5MjE5IEw3LjcyMjA1OTcsMy42MTI5NDEyMiBDNy44MDUyNzc0NSwzLjc3NTk1OTk4IDcuODY4MjE1MjUsMy45MjkxODM2MiA3LjkxNjQ2NzU2LDQuMDgxMDA3OTYgTDguMDIyMDYzMTksNC40MTg5Mzk1NiBMOS4xNTI4NDU2LDQuNjcwMTE0MzkgQzkuMjIxMzc3ODcsNC42ODI3MDgxMiA5LjI3NDUyNTM0LDQuNzIyNTg4MjQgOS4yODU3MTQyOSw0Ljc0NDI3NzQ0IEw5LjI4MDgxOTEyLDUuMjg3MjA2ODggWiBNOS4zNzkyODU3MSw0LjA1Mjg1NzE0IEw4LjU3NzE0Mjg2LDMuODc1IEM4LjUxNSwzLjY3NSA4LjQzMjg1NzE0LDMuNDgzNTcxNDMgOC4zMzkyODU3MSwzLjMgTDguNzcyODU3MTQsMi41NzcxNDI4NiBDOC45MzUsMi4zMTc4NTcxNCA5LjAxNzE0Mjg2LDEuOTM3MTQyODYgOC43NzI4NTcxNCwxLjY5Mjg1NzE0IEw4LjMzMDcxNDI5LDEuMjUwNzE0MjkgQzguMDg3MTQyODYsMS4wMDcxNDI4NiA3LjY3NSwxLjA1MDcxNDI5IDcuNDI1NzE0MjksMS4yMjM1NzE0MyBMNi43MjI4NTcxNCwxLjY3MTQyODU3IEM2LjUzOTI4NTcxLDEuNTc2NDI4NTcgNi4zNDg1NzE0MywxLjQ5NTcxNDI5IDYuMTUxNDI4NTcsMS40MzE0Mjg1NyBMNS45NzE0Mjg1NywwLjYyIEM1LjkxNzg1NzE0LDAuMzIyMTQyODU3IDUuNjU3MTQyODYsMCA1LjMxMjE0Mjg2LDAgTDQuNjg3MTQyODYsMCBDNC4zNDIxNDI4NiwwIDQuMTMwNzE0MjksMC4zMjcxNDI4NTcgNC4wNjIxNDI4NiwwLjYyNSBMMy44NjE0Mjg1NywxLjQyNzE0Mjg2IEMzLjY1MTQyODU3LDEuNDk0Mjg1NzEgMy40NDc4NTcxNCwxLjU3OTI4NTcxIDMuMjUyODU3MTQsMS42ODI4NTcxNCBMMi41MzE0Mjg1NywxLjIyMzU3MTQzIEMyLjI4MzU3MTQzLDEuMDUwNzE0MjkgMS44NzE0Mjg1NywxLjAwNzE0Mjg2IDEuNjI3MTQyODYsMS4yNTA3MTQyOSBMMS4xODUsMS42OTI4NTcxNCBDMC45NDE0Mjg1NzEsMS45MzcxNDI4NiAxLjAyMjg1NzE0LDIuMzE3ODU3MTQgMS4xODUsMi41NzY0Mjg1NyBMMS42NDE0Mjg1NywzLjMzNzg1NzE0IEMxLjU1NDI4NTcxLDMuNTEwNzE0MjkgMS40ODA3MTQyOSwzLjY5MDcxNDI5IDEuNDIxNDI4NTcsMy44NzUgTDAuNjIsNC4wNTI4NTcxNCBDMC4zMjIxNDI4NTcsNC4xMDY0Mjg1NyAwLDQuMzY3MTQyODYgMCw0LjcxMjE0Mjg2IEwwLDUuMzM3MTQyODYgQzAsNS42ODI4NTcxNCAwLjMyNzE0Mjg1Nyw1Ljg5NDI4NTcxIDAuNjI1LDUuOTYyMTQyODYgTDEuNDM2NDI4NTcsNi4xNjUgQzEuNDkyMTQyODYsNi4zMzcxNDI4NiAxLjU2Mjg1NzE0LDYuNTAyODU3MTQgMS42NDIxNDI4Niw2LjY2Mjg1NzE0IEwxLjE4NSw3LjQyNSBDMS4wMjM1NzE0Myw3LjY4MzU3MTQzIDAuOTQxNDI4NTcxLDguMDY0Mjg1NzEgMS4xODUsOC4zMDg1NzE0MyBMMS42MjcxNDI4Niw4Ljc1MDcxNDI5IEMxLjg3MTQyODU3LDguOTk1IDIuMjgyODU3MTQsOC45NSAyLjUzMTQyODU3LDguNzc4NTcxNDMgTDMuMjU0Mjg1NzEsOC4zMTc4NTcxNCBDMy40NTA3MTQyOSw4LjQyMTQyODU3IDMuNjU1NzE0MjksOC41MDc4NTcxNCAzLjg2NzE0Mjg2LDguNTc1IEw0LjA2NzE0Mjg2LDkuMzc0Mjg1NzEgQzQuMTM1NzE0MjksOS42NzIxNDI4NiA0LjM0NjQyODU3LDkuOTk5Mjg1NzEgNC42OTIxNDI4Niw5Ljk5OTI4NTcxIEw1LjMxNjQyODU3LDkuOTk5Mjg1NzEgQzUuNjYyMTQyODYsOS45OTkyODU3MSA1LjkyMjE0Mjg2LDkuNjc3MTQyODYgNS45NzU3MTQyOSw5LjM3OTI4NTcxIEw2LjE1NjQyODU3LDguNTY1IEM2LjM1Mjg1NzE0LDguNTAxNDI4NTcgNi41NDA3MTQyOSw4LjQyMTQyODU3IDYuNzIxNDI4NTcsOC4zMjc4NTcxNCBMNy40MjU3MTQyOSw4Ljc3Nzg1NzE0IEM3LjY3NSw4Ljk1IDguMDg2NDI4NTcsOC45OTQyODU3MSA4LjMzMDcxNDI5LDguNzUgTDguNzcyODU3MTQsOC4zMDc4NTcxNCBDOS4wMTcxNDI4Niw4LjA2MzU3MTQzIDguOTM1LDcuNjgyODU3MTQgOC43NzI4NTcxNCw3LjQyNDI4NTcxIEw4LjMzOTI4NTcxLDYuNyBDOC40MjY0Mjg1Nyw2LjUyODU3MTQzIDguNTAxNDI4NTcsNi4zNSA4LjU2MjE0Mjg2LDYuMTY0Mjg1NzEgTDkuMzc1LDUuOTYyMTQyODYgQzkuNjcyMTQyODYsNS44OTI4NTcxNCAxMCw1LjY4MjE0Mjg2IDEwLDUuMzM2NDI4NTcgTDEwLDQuNzExNDI4NTcgQzEwLDQuMzY2NDI4NTcgOS42Nzc4NTcxNCw0LjEwNTcxNDI5IDkuMzc5Mjg1NzEsNC4wNTIxNDI4NiBMOS4zNzkyODU3MSw0LjA1Mjg1NzE0IFoiIGlkPSJGaWxsLTMiIGZpbGw9IiM2ZDZkNmUiPjwvcGF0aD4NCiAgICAgICAgPC9nPg0KICAgIDwvZz4NCjwvc3ZnPg0K);\n}\n.gc-table-sheet-group-list .gc-table-sheet-cross-column-item-checkbox, .gc-table-sheet-cross-column-list .gc-table-sheet-cross-column-item-checkbox, .gc-table-sheet-cross-column-attributes-list .gc-table-sheet-cross-column-item-checkbox {\n  float: left;\n}\n.gc-table-sheet-group-list .gc-table-sheet-cross-column-item-label, .gc-table-sheet-cross-column-list .gc-table-sheet-cross-column-item-label, .gc-table-sheet-cross-column-attributes-list .gc-table-sheet-cross-column-item-label {\n  float: left;\n}\n.gc-table-sheet-group-list .gc-table-sheet-cross-column-item-edit, .gc-table-sheet-cross-column-list .gc-table-sheet-cross-column-item-edit, .gc-table-sheet-cross-column-attributes-list .gc-table-sheet-cross-column-item-edit {\n  float: right;\n  cursor: pointer;\n  background-repeat: no-repeat;\n  background-position: center;\n  width: 16px;\n  height: 16px;\n  margin-top: 3px;\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB0PSIxNjQ5ODQzMjA5MjY3IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9Ijg0NzMiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTcyNi42NTI4MDEgNDI5LjMwNTYwMyAyOTcuMzQ3MTk5IDQyOS4zMDU2MDMgNTEyLjE5MzQwNSA2MzguMTU2MjU4WiIgcC1pZD0iODQ3NCIgZmlsbD0iIzY2NjY2NiI+PC9wYXRoPjwvc3ZnPg==);\n}\n.gc-table-sheet-group-list .gc-table-sheet-cross-column-item-editing, .gc-table-sheet-cross-column-list .gc-table-sheet-cross-column-item-editing, .gc-table-sheet-cross-column-attributes-list .gc-table-sheet-cross-column-item-editing {\n  height: initial;\n}\n.gc-table-sheet-group-list .gc-table-sheet-cross-column-item-editing .gc-table-sheet-cross-column-item-edit, .gc-table-sheet-cross-column-list .gc-table-sheet-cross-column-item-editing .gc-table-sheet-cross-column-item-edit, .gc-table-sheet-cross-column-attributes-list .gc-table-sheet-cross-column-item-editing .gc-table-sheet-cross-column-item-edit {\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB0PSIxNjQ5ODQzMjA5MjY3IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9Ijg0NzMiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTcyNi42NTI4MDEgNDI5LjMwNTYwMyAyOTcuMzQ3MTk5IDQyOS4zMDU2MDMgNTEyLjE5MzQwNSA2MzguMTU2MjU4WiIgcC1pZD0iODQ3NCIgZmlsbD0iIzY2NjY2NiI+PC9wYXRoPjwvc3ZnPg==);\n}\n.gc-table-sheet-group-list .gc-table-sheet-cross-column-item-editing.selected .gc-table-sheet-cross-column-item-edit, .gc-table-sheet-cross-column-list .gc-table-sheet-cross-column-item-editing.selected .gc-table-sheet-cross-column-item-edit, .gc-table-sheet-cross-column-attributes-list .gc-table-sheet-cross-column-item-editing.selected .gc-table-sheet-cross-column-item-edit {\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB0PSIxNjQ5ODQzMjA5MjY3IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9Ijg0NzMiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTcyNi42NTI4MDEgNDI5LjMwNTYwMyAyOTcuMzQ3MTk5IDQyOS4zMDU2MDMgNTEyLjE5MzQwNSA2MzguMTU2MjU4WiIgcC1pZD0iODQ3NCIgZmlsbD0iI2ZmZmZmZiI+PC9wYXRoPjwvc3ZnPg==);\n}\n.gc-table-sheet-group-list .gc-table-sheet-cross-column-attributes-formatter, .gc-table-sheet-cross-column-list .gc-table-sheet-cross-column-attributes-formatter, .gc-table-sheet-cross-column-attributes-list .gc-table-sheet-cross-column-attributes-formatter {\n  float: left;\n  height: 23px;\n}\n.gc-table-sheet-group-list .gc-table-sheet-group-tip, .gc-table-sheet-group-list .gc-table-sheet-cross-column-tip, .gc-table-sheet-cross-column-list .gc-table-sheet-group-tip, .gc-table-sheet-cross-column-list .gc-table-sheet-cross-column-tip, .gc-table-sheet-cross-column-attributes-list .gc-table-sheet-group-tip, .gc-table-sheet-cross-column-attributes-list .gc-table-sheet-cross-column-tip {\n  display: block;\n  position: absolute;\n  left: 50%;\n  top: 50%;\n  transform: translate(-50%, -50%);\n  opacity: 0.75;\n  color: var(--sjs-theme-color);\n}\n\n.gc-table-sheet-field-header {\n  display: block;\n  color: var(--sjs-theme-color);\n  box-sizing: border-box;\n  outline: none;\n  width: 100%;\n  height: 20px;\n  font-size: large;\n  font-weight: 600;\n  margin-left: 10px;\n}\n.gc-table-sheet-field-header .gc-table-sheet-add-calculate-column, .gc-table-sheet-field-header .gc-table-sheet-add-cross-column, .gc-table-sheet-field-header .gc-table-sheet-save-cross-column, .gc-table-sheet-field-header .gc-table-sheet-cancel-cross-column {\n  padding: 0 1px 1px 0;\n  width: 15px;\n  height: 15px;\n  float: right;\n  display: block;\n  margin-right: 22px;\n  margin-top: 4px;\n  position: relative;\n  cursor: pointer;\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjEiIHdpZHRoPSIxNXB4IiBoZWlnaHQ9IjE1cHgiPg0KICA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAxIC01MzAgLTI2NSApIj4NCiAgICA8cGF0aCBkPSJNIDAgNyAgTCA3IDYuOTk5OTk5OTk5ODk4MTM3ICBMIDcgMCAgTCA4IDAgIEwgOC4wMDAwMDAxMjU0NTE2MDYgNyAgTCAxNSA3ICBMIDE1IDggIEwgOCA4LjAwMDAwMDAwMDEwMTg2MyAgTCA4IDE1ICBMIDcgMTUgIEwgNi45OTk5OTk4NzQ1NDgzOTQgOCAgTCAwIDggIEwgMCA3ICBaICIgZmlsbC1ydWxlPSJub256ZXJvIiBmaWxsPSJibGFjayIgc3Ryb2tlPSJub25lIiB0cmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAxIDUzMCAyNjUgKSIvPg0KICA8L2c+DQo8L3N2Zz4=);\n  background-position: center;\n  background-repeat: no-repeat;\n  background-size: 12px;\n}\n.gc-table-sheet-field-header .gc-table-sheet-add-calculate-column:hover, .gc-table-sheet-field-header .gc-table-sheet-add-cross-column:hover, .gc-table-sheet-field-header .gc-table-sheet-save-cross-column:hover, .gc-table-sheet-field-header .gc-table-sheet-cancel-cross-column:hover {\n  background-color: lightgray;\n}\n.gc-table-sheet-field-header .gc-table-sheet-add-cross-column {\n  margin-right: 10px;\n}\n.gc-table-sheet-field-header .gc-table-sheet-cancel-cross-column {\n  margin-right: 10px;\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTJweCIgaGVpZ2h0PSIxMnB4IiB2aWV3Qm94PSIwIDAgMTIgMTIiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDU1ICg3ODA3NikgLSBodHRwczovL3NrZXRjaGFwcC5jb20gLS0+CiAgICA8dGl0bGU+Y2xlYXI8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZyBpZD0iY2xlYXIiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxwb2x5Z29uIGZpbGw9IiM2RTZFNkUiIGZpbGwtcnVsZT0ibm9uemVybyIgcG9pbnRzPSI4Ljg3NTQ2MzkgMyAxMCA0LjEyNDUzNjEgNy42MjQ1MzYxIDYuNSAxMCA4Ljg3NTQ2MzkgOC44NzU0NjM5IDEwIDYuNSA3LjYyNDUzNjEgNC4xMjQ1MzYxIDEwIDMgOC44NzU0NjM5IDUuMzc1NDYzOSA2LjUgMyA0LjEyNDUzNjEgNC4xMjQ1MzYxIDMgNi41IDUuMzc1NDYzOSI+PC9wb2x5Z29uPgogICAgPC9nPgo8L3N2Zz4=);\n}\n.gc-table-sheet-field-header .gc-table-sheet-save-cross-column {\n  margin-right: 22px;\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTJweCIgaGVpZ2h0PSIxMnB4IiB2aWV3Qm94PSIwIDAgMTIgMTIiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDU1ICg3ODA3NikgLSBodHRwczovL3NrZXRjaGFwcC5jb20gLS0+CiAgICA8dGl0bGU+b2s8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZyBpZD0ib2siIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxwYXRoIGQ9Ik01LjY3NjUyMjQsMTAgQzUuNjc2NTIyNCwxMCA2LjkxNzAzMjUzLDcuMzM0ODI5MDcgOC40MTk2ODA3OSw1LjMyNjE2ODAyIEM5LjU4MDA5Mzk2LDMuNzc2MzU0NDYgMTEsMi43MTg3NTQxMSAxMSwyLjcxODc1NDExIEwxMC41MTYxMDg0LDIgQzEwLjUxNjEwODQsMiA4Ljk2NzEyNTYsMi43MDIwNjg3NSA3LjU3NzY3MjIzLDQuMDUwMzc0NDYgQzYuMTY4MzYwMTEsNS40MTcyOTA3NiA1LjM0NDg4MTIxLDYuOTQ2NTczNSA1LjM0NDg4MTIxLDYuOTQ2NTczNSBMMy4yOTc0Mzg1Niw1LjAxMTcxMzA5IEwyLDYuNDYwMTI1OTcgTDUuNjc2NTE5ODEsOS45OTk5ODc0NyBMNS42NzY1MTk4MSw5Ljk5OTk4NzQ3IEw1LjY3NjUyMjQsMTAgWiIgaWQ9Ik9LIiBmaWxsPSIjNkU2RTZFIiBmaWxsLXJ1bGU9Im5vbnplcm8iPjwvcGF0aD4KICAgIDwvZz4KPC9zdmc+);\n}\n\n.gc-table-sheet-summary-container, .gc-table-sheet-cross-column-detail {\n  margin: 0px 10px 10px 9px;\n  padding: 0px;\n  width: calc(100% - 20px);\n  height: calc(30% - 10px);\n  overflow-y: hidden;\n  overflow-x: hidden;\n  background-color: var(--sjs-theme-background);\n  border: solid 1px lightgrey;\n}\n.gc-table-sheet-summary-container.half-height, .gc-table-sheet-cross-column-detail.half-height {\n  height: calc(50% - 10px) !important;\n}\n\n.gc-table-sheet-summary-header {\n  background-color: #D3E3DA;\n  font-weight: 500;\n}\n.gc-table-sheet-summary-header .gc-table-sheet-summary-label {\n  color: #333;\n  width: 80%;\n  height: 20px;\n  line-height: 20px;\n  margin-left: 4px;\n  display: inline-block;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n.gc-table-sheet-summary-header .gc-table-sheet-summary-function {\n  margin-top: 2px;\n  width: 16px;\n  height: 16px;\n  background-position: center;\n  background-repeat: no-repeat;\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJ0cmFuc3BhcmVudCIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTExLjIzMDcgMC4zNDg4NkMxMC45NDk2IDAuMTE5MjEzIDEwLjU3ODIgMCAxMC4xMTI5IDBDOS42ODEzNCAwIDkuMjIwMDkgMC4xMjc5NDYgOC43Mjk4MSAwLjM4OTUxOUM4LjI0NTA5IDAuNjQ3NjM0IDcuNzg2MTUgMS4wMzU0NCA3LjM1MjkzIDEuNTUxNjlDNy4wMzMxMSAxLjkyODgxIDYuNzAxMjIgMi40NTU4OCA2LjM1OTI4IDMuMTM4NDhDNi4xMDYwNSAzLjYzMzE2IDUuOTAzMDIgMy45NzE2OSA1Ljc0ODQ4IDQuMTQ5MzJDNS42MDI0MSA0LjMxODgyIDUuNDQzMDkgNC40MzUxIDUuMjY3MTQgNC40OTYxOEM1LjA3MjYgNC41NjQwMiA0LjcyMDQzIDQuNTkzNTIgNC4yMTE5OCA0LjU4OTk5TDQuMDUxODMgNS4zNDY3N0g1LjU1NDI5TDQuMDc4MDcgMTAuOTU5M0MzLjcyNjc5IDEyLjI4MzUgMy41MTE1IDEzLjA2MyAzLjQzMjg2IDEzLjMwMjRDMy4yNDI2MyAxMy44NTY3IDMuMDQyNzcgMTQuMjg0OSAyLjgzMiAxNC41ODAyQzIuNjMwOTMgMTQuODYwNyAyLjQwMDI0IDE1LjA3MDUgMS42NTUwNCAxNS4xOTM4QzEuNDc2ODcgMTUuMDU1NCAxLjI1MDA5IDE0Ljc4OTMgMC44NTM1NzMgMTQuMjc2QzAuNjE4NDQ3IDE0LjI3NiAwLjQxOTMyNyAxNC4zNTEyIDAuMjUzNzA2IDE0LjUwMDVDMC4wODMwODk2IDE0LjY1NyAwIDE0Ljg0IDAgMTUuMDQ4NkMwIDE1LjMwNTEgMC4xMDI0MDggMTUuNTEyNSAwLjMwNzkyMiAxNS42NzI4QzAuNTU3ODkzIDE1Ljg4ODggMC44NzM3MzMgMTYgMS4yNTIwNiAxNkMxLjgwMjY2IDE2IDIuMzUzOTggMTUuODA5MSAyLjkwNDEgMTUuNDIzMUMzLjYxMTE0IDE0Ljk0MTcgNC4yNzc2IDE0LjA2MjYgNC44OTgxOSAxMi43ODY2QzUuMzI0NjggMTEuODgyOCA1Ljc1MTE4IDEwLjYxMzQgNi4xNzcyNyA4Ljk3NzE1TDcuMTE2OTQgNS4zNDY3N0g4LjM3NTgyTDguNTk0OTEgNC41ODk4Nkg3LjMxNTQ4QzcuNzA3ODggMy4zNDQzMyA3Ljk4MDIxIDIuNTY0MTYgOC4xMzE4OSAyLjI0NzMzQzguNDI2MDEgMS42NDA1NSA4Ljc1Nzg2IDEuMTg5OCA5Ljc0NDM2IDAuODc3MTgzQzkuOTg4NjcgMS4wMzE4NiAxMC4zMTUzIDEuMzQxNiAxMC44NTY1IDEuOTMzMzZDMTEuMDk0NiAxLjkzMzM2IDExLjI4NjggMS44NTYzNiAxMS40Mzg1IDEuNzA1NTNDMTEuNTg5MSAxLjU1NDIzIDExLjY2NjUgMS4zNjI4MiAxMS42NjY1IDEuMTMwMDdDMTEuNjY2NSAwLjg1MTczMSAxMS41MjcgMC41ODk0NzIgMTEuMjMwNyAwLjM0ODg2Wk0xMS45MzYgNS4zMTY3MUMxMS43ODE5IDUuMDAyMjIgMTEuNTQ4OCA0LjY4MTUzIDExLjIzOTEgNC4zNjQzNUw4LjY2NjYyIDUuMzI2NjRDOS4zOTk4NiA1LjIyNDM3IDkuOTI3OTkgNS4yNjE5OSAxMC4yMzkzIDUuNDc5MjZDMTAuNDQyIDUuNjIwNTkgMTAuNjAyOSA1Ljg2NzI5IDEwLjczMTMgNi4yMDY3NEwxMC43NDc2IDYuMjYxODdDMTAuODA0OSA2LjQ2NTAzIDEwLjk4NiA3LjE1ODI1IDExLjI5MTUgOC4zNDIzMkMxMS4xNDMzIDguNjU4NSAxMC44NDM3IDkuMTU2NjYgMTAuMzk2NiA5LjgzOTg4QzkuOTU0NDIgMTAuNTEzIDkuNjA2OTMgMTAuOTY1IDguNzgzMjkgMTEuMTIxMUM4LjU2NDY1IDEwLjkzODggOC4zNTcwNSAxMC44NTQ3IDguMTYxNzIgMTAuODU0N0M3Ljk0NzExIDEwLjg1NDcgNy43NjczIDEwLjkyODcgNy42MjI2NiAxMS4wNzIzQzcuNDc4NDUgMTEuMjE2NiA3LjQwNTA0IDExLjM5NTYgNy40MDUwNCAxMS42MDQ1QzcuNDA1MDQgMTEuODQ3NiA3LjQ4NTk5IDEyLjAzOTUgNy42NDE3NCAxMi4xODI4QzcuODU5IDEyLjM2NTMgOC4wOTE5MyAxMi40NTE0IDguMzQ1MjEgMTIuNDUxNEM4LjY5NDA5IDEyLjQ1MTQgOS4wNTczNiAxMi4zMDYzIDkuNDMwNjIgMTIuMDA4NUM5Ljk1NjI2IDExLjU4MzIgMTAuNjQ1MyAxMC42NjEyIDExLjQ5MzggOS4yMzYzOUMxMS44NDg4IDEwLjc4MTQgMTIuMDg1NiAxMS42NTg2IDEyLjIwNDEgMTEuODc0M0MxMi4zMDc1IDEyLjA2MjQgMTIuNDIxNCAxMi4yMDkzIDEzLjA2NjkgMTIuNDUxNEMxMy4zMDU0IDEyLjQ1MTQgMTMuNTk1NyAxMi4zMjY0IDEzLjkzNDYgMTIuMDYyOUMxNC41MTY5IDExLjYwNDEgMTQuOTk0NyAxMS4wMjQ1IDE0Ljg3NzUgMTAuMTI3MUMxNC42NjQgMTAuNTExOCAxNC40MDE4IDEwLjgzMTIgMTMuNTMxNiAxMS4xMzQ1QzEzLjQ2OSAxMS4wMTg1IDEzLjM5OTIgMTAuNzgwMyAxMy4zMTM5IDEwLjQyNUwxMi42MTA0IDcuNTQ2QzEzLjA5MDUgNi43Mzg2NSAxMy41MDIgNi4xODg0MyAxNC4yODM1IDUuNjkzODVDMTQuMzU5NiA1LjY5Mzg1IDE0LjQ5MjkgNS43MjYyMSAxNC45MTczIDUuODI5MzJDMTUuMDA1OCA1Ljg1MDc5IDE1LjEwNjggNS44NzUzNCAxNS4yMjI2IDUuOTAzMzFDMTUuNDUwNyA1LjkwMzMxIDE1LjY2NDQgNS44NTU1IDE2IDUuMTUwODdDMTYgNC45NDE4MSAxNS45MTY2IDQuNzU4NTUgMTUuNzQ2MyA0LjYwNTE0QzE1LjU4ODEgNC40NjI3NyAxNS4zODcgNC4zNzMxOSAxNC41OTQ5IDQuNDgxNTFDMTQuMzYzOCA0LjU2OSAxNC4wOTgyIDQuNzM3MyAxMy43OTk0IDQuOTk0MzRDMTMuNTA1OCA1LjI0NDM5IDEzLjI1NzQgNS41MDc3OCAxMy4wNTA4IDUuNzg5NDdMMTIuNDA0NSA2LjczMjg2QzEyLjE5MjUgNS45Nzg2MiAxMi4wMzY2IDUuNTA2ODggMTEuOTM2IDUuMzE2NzFaIiBmaWxsPSIjNjY2NjY2Ii8+Cjwvc3ZnPgo=);\n  float: right;\n  margin-right: 2px;\n  cursor: pointer;\n}\n.gc-table-sheet-summary-header .gc-table-sheet-summary-remove {\n  margin-top: 2px;\n  width: 16px;\n  height: 16px;\n  background-position: center;\n  background-repeat: no-repeat;\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzE5XzE2MzEpIj4KPHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJ0cmFuc3BhcmVudCIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTUuODk1MDggMS4yODYyMUM2LjA3MzgyIDEuMTAwNjIgNi4zMTIxNiAxIDYuNTU2NTEgMUg5LjQ0NTk1QzkuNjkwMzEgMSA5LjkyODY0IDEuMTAwNjIgMTAuMTA3NCAxLjI4NjIxQzEwLjI4NjcgMS40NzI0NCAxMC4zOTA3IDEuNzI4OTEgMTAuMzkwNyAyLjAwMDA5VjMuMDAwMThINS42MTE3OVYyLjAwMDA5QzUuNjExNzkgMS43Mjg5MSA1LjcxNTcyIDEuNDcyNDQgNS44OTUwOCAxLjI4NjIxWk00LjYxMTc5IDMuMDAwMThWMi4wMDAwOUM0LjYxMTc5IDEuNDc1NTggNC44MTIyOSAwLjk2ODkzMiA1LjE3NDggMC41OTI1MjNDNS41Mzc5NCAwLjIxNTQ3NCA2LjAzNDU0IDAgNi41NTY1MSAwSDkuNDQ1OTVDOS45Njc5MiAwIDEwLjQ2NDUgMC4yMTU0NzQgMTAuODI3NyAwLjU5MjUyM0MxMS4xOTAyIDAuOTY4OTMyIDExLjM5MDcgMS40NzU1OCAxMS4zOTA3IDIuMDAwMDlWMy4wMDAxOEgxMy4wNTc3SDE0LjUwMjVDMTQuNzc4NiAzLjAwMDE4IDE1LjAwMjUgMy4yMjQwNCAxNS4wMDI1IDMuNTAwMThDMTUuMDAyNSAzLjc3NjMzIDE0Ljc3ODYgNC4wMDAxOCAxNC41MDI1IDQuMDAwMThIMTMuNTU3N1YxNC4wMDA4QzEzLjU1NzcgMTQuNTI1MyAxMy4zNTcyIDE1LjAzMiAxMi45OTQ3IDE1LjQwODRDMTIuNjMxNiAxNS43ODU0IDEyLjEzNSAxNi4wMDA5IDExLjYxMyAxNi4wMDA5SDQuMzg5NDRDMy44Njc0NyAxNi4wMDA5IDMuMzcwODYgMTUuNzg1NCAzLjAwNzczIDE1LjQwODRDMi42NDUyMSAxNS4wMzIgMi40NDQ3MiAxNC41MjUzIDIuNDQ0NzIgMTQuMDAwOFY0LjAwMDE4SDEuNUMxLjIyMzg2IDQuMDAwMTggMSAzLjc3NjMzIDEgMy41MDAxOEMxIDMuMjI0MDQgMS4yMjM4NiAzLjAwMDE4IDEuNSAzLjAwMDE4SDIuOTQ0NzJINC42MTE3OVpNMy40NDQ3MiA0LjAwMDE4VjE0LjAwMDhDMy40NDQ3MiAxNC4yNzIgMy41NDg2NCAxNC41Mjg1IDMuNzI4IDE0LjcxNDdDMy45MDY3NSAxNC45MDAzIDQuMTQ1MDggMTUuMDAwOSA0LjM4OTQ0IDE1LjAwMDlIMTEuNjEzQzExLjg1NzQgMTUuMDAwOSAxMi4wOTU3IDE0LjkwMDMgMTIuMjc0NSAxNC43MTQ3QzEyLjQ1MzggMTQuNTI4NSAxMi41NTc3IDE0LjI3MiAxMi41NTc3IDE0LjAwMDhWNC4wMDAxOEgzLjQ0NDcyWk02LjUgN0M2Ljc3NjE0IDcgNyA3LjIwMzUgNyA3LjQ1NDUyVjExLjU0NTVDNyAxMS43OTY1IDYuNzc2MTQgMTIgNi41IDEyQzYuMjIzODYgMTIgNiAxMS43OTY1IDYgMTEuNTQ1NVY3LjQ1NDUyQzYgNy4yMDM1IDYuMjIzODYgNyA2LjUgN1pNMTAgNy40NTQ1MkMxMCA3LjIwMzUgOS43NzYxNCA3IDkuNSA3QzkuMjIzODYgNyA5IDcuMjAzNSA5IDcuNDU0NTJWMTEuNTQ1NUM5IDExLjc5NjUgOS4yMjM4NiAxMiA5LjUgMTJDOS43NzYxNCAxMiAxMCAxMS43OTY1IDEwIDExLjU0NTVWNy40NTQ1MloiIGZpbGw9IiM2NjY2NjYiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xOV8xNjMxIj4KPHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJ0cmFuc3BhcmVudCIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=);\n  float: right;\n  margin-right: 5px;\n  cursor: pointer;\n}\n\n.gc-table-sheet-summary-item-formula, .gc-table-sheet-summary-item-caption {\n  width: 100%;\n  height: 20px;\n  margin: 2px;\n}\n.gc-table-sheet-summary-item-formula .gc-table-sheet-summary-item-label, .gc-table-sheet-summary-item-caption .gc-table-sheet-summary-item-label {\n  width: 25%;\n  display: inline-block;\n  margin-left: 5px;\n}\n.gc-table-sheet-summary-item-formula .gc-table-sheet-summary-item-input-formula, .gc-table-sheet-summary-item-formula .gc-table-sheet-summary-item-input-caption, .gc-table-sheet-summary-item-formula .gc-table-sheet-summary-item-input-slice, .gc-table-sheet-summary-item-formula .gc-table-sheet-cross-column-item-input-filter, .gc-table-sheet-summary-item-caption .gc-table-sheet-summary-item-input-formula, .gc-table-sheet-summary-item-caption .gc-table-sheet-summary-item-input-caption, .gc-table-sheet-summary-item-caption .gc-table-sheet-summary-item-input-slice, .gc-table-sheet-summary-item-caption .gc-table-sheet-cross-column-item-input-filter {\n  width: 60%;\n  height: 16px;\n  display: inline-block;\n  border: solid 1px var(--sjs-theme-border-color);\n  color: var(--sjs-theme-color);\n  background-color: var(--sjs-theme-background);\n  outline-color: rgb(82, 146, 247);\n}\n\n.gc-table-sheet-cross-column-attributes-list-container {\n  width: 100%;\n  height: calc(100% - 110px);\n}\n.gc-table-sheet-cross-column-attributes-list-container .gc-table-sheet-summary-item-label {\n  width: 30%;\n  display: inline-block;\n  margin-left: 7px;\n}\n.gc-table-sheet-cross-column-attributes-list-container .gc-table-sheet-cross-column-attributes-list {\n  list-style: none;\n  height: calc(100% - 60px);\n}\n.gc-table-sheet-cross-column-attributes-list-container .gc-table-sheet-cross-column-attributes-list .gc-table-sheet-cross-column-static-list-item {\n  height: 23px;\n  line-height: 23px;\n  margin: 2px;\n  background-color: #f2f2ff;\n  color: var(--sjs-theme-color);\n  box-sizing: border-box;\n  text-overflow: ellipsis;\n  overflow: hidden;\n  word-break: break-all;\n  white-space: nowrap;\n  margin-bottom: 1px;\n  font-size: 12px;\n  border: 1px solid var(--sjs-theme-border-color);\n  outline: none;\n}\n.gc-table-sheet-cross-column-attributes-list-container .gc-table-sheet-cross-column-attributes-list .gc-table-sheet-cross-column-static-list-item .gc-table-sheet-cross-column-item-label {\n  height: 23px;\n  width: 100%;\n  line-height: 23px;\n  background-color: #f2f2ff;\n  box-sizing: border-box;\n  text-overflow: ellipsis;\n  overflow: hidden;\n  word-break: break-all;\n  white-space: nowrap;\n  font-size: 12px;\n  outline: none;\n}\n\n.gc-table-sheet-summary-list-container, .gc-table-sheet-cross-column-detail-content {\n  padding-inline-start: 0px;\n  padding: 0px;\n  margin: 0px;\n  height: calc(100% - 20px);\n  width: 100%;\n  overflow-y: auto;\n  overflow-x: hidden;\n}\n\n.gc-table-sheet-cross-column-detail-content {\n  overflow: hidden;\n  height: 100%;\n}\n\n.gc-table-sheet-cross-item-input-name {\n  background-color: var(--sjs-theme-background);\n  color: var(--sjs-theme-color);\n  width: calc(60% - 20px);\n  height: 16px;\n  display: inline-block;\n  border: solid 1px lightgrey;\n  border-right: none;\n  outline: none;\n  z-index: 2;\n  position: absolute;\n}\n\n.gc-table-sheet-cross-item-select-name {\n  width: calc(60% + 20px);\n  height: 20px;\n  display: inline-block;\n  border: solid 1px lightgrey;\n  border-left: none;\n  position: relative;\n  z-index: 1;\n  outline: none;\n  background-color: var(--sjs-theme-background);\n  color: var(--sjs-theme-color);\n}\n\n.gc-table-sheet-cross-column-value-caption {\n  position: relative;\n}\n.gc-table-sheet-cross-column-value-caption .gc-table-sheet-cross-column-value-caption-label {\n  position: absolute;\n  top: 1px;\n}\n.gc-table-sheet-cross-column-value-caption input[type=checkbox] {\n  margin-left: 0;\n}\n\n.gc-table-sheet-summary-item {\n  border-top: solid 1px lightgrey;\n  position: relative;\n}\n\n.gc-table-sheet-summary-item-formula, .gc-table-sheet-summary-item-caption, .gc-table-sheet-summary-item-slice, .gc-table-sheet-summary-item-relateTo,\n.gc-table-sheet-summary-item-position {\n  width: 100%;\n  height: 20px;\n  margin: 2px;\n}\n\n.gc-table-sheet-summary-item-position {\n  width: 100%;\n  height: 23px;\n  margin: 2px;\n}\n\n.gc-table-sheet-summary-item-select {\n  width: 60%;\n  color: var(--sjs-theme-color);\n  background-color: var(--sjs-theme-background);\n  border: solid 1px #d3d3d3;\n  box-sizing: content-box;\n  padding: 1px 2px;\n  appearance: none;\n  outline: none;\n  background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 16 16%27%3E%3Cpath fill=%27%23666%27 fill-rule=%27evenodd%27 d=%27M3 5h10l-5 5z%27/%3E%3C/svg%3E\");\n  background-position: right center;\n  background-repeat: no-repeat;\n  cursor: pointer;\n}\n\n.gc-table-sheet-summary-item-label {\n  color: var(--sjs-theme-color);\n  width: 25%;\n  display: inline-block;\n  margin-left: 5px;\n}\n\n.gc-table-sheet-cross-detail-input, .gc-table-sheet-summary-item-input-caption, .gc-table-sheet-summary-item-input-slice {\n  width: 65%;\n  height: 16px;\n  display: inline-block;\n  border: solid 1px lightgrey;\n  outline-color: rgb(82, 146, 247);\n  background-color: var(--sjs-theme-background);\n  color: var(--sjs-theme-color);\n}\n\n.gc-table-sheet-summary-item-input-caption, .gc-table-sheet-summary-item-input-slice {\n  width: 60%;\n  border: solid 1px var(--sjs-theme-border-color);\n  color: var(--sjs-theme-color);\n  background-color: var(--sjs-theme-background);\n}\n\n.gc-table-sheet-summary-item-remove-icon {\n  width: 16px;\n  height: 16px;\n  margin-left: 4px;\n  position: absolute;\n  display: inline-block;\n  cursor: pointer;\n  background-position: center;\n  background-repeat: no-repeat;\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzE5XzE2MzEpIj4KPHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJ0cmFuc3BhcmVudCIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTUuODk1MDggMS4yODYyMUM2LjA3MzgyIDEuMTAwNjIgNi4zMTIxNiAxIDYuNTU2NTEgMUg5LjQ0NTk1QzkuNjkwMzEgMSA5LjkyODY0IDEuMTAwNjIgMTAuMTA3NCAxLjI4NjIxQzEwLjI4NjcgMS40NzI0NCAxMC4zOTA3IDEuNzI4OTEgMTAuMzkwNyAyLjAwMDA5VjMuMDAwMThINS42MTE3OVYyLjAwMDA5QzUuNjExNzkgMS43Mjg5MSA1LjcxNTcyIDEuNDcyNDQgNS44OTUwOCAxLjI4NjIxWk00LjYxMTc5IDMuMDAwMThWMi4wMDAwOUM0LjYxMTc5IDEuNDc1NTggNC44MTIyOSAwLjk2ODkzMiA1LjE3NDggMC41OTI1MjNDNS41Mzc5NCAwLjIxNTQ3NCA2LjAzNDU0IDAgNi41NTY1MSAwSDkuNDQ1OTVDOS45Njc5MiAwIDEwLjQ2NDUgMC4yMTU0NzQgMTAuODI3NyAwLjU5MjUyM0MxMS4xOTAyIDAuOTY4OTMyIDExLjM5MDcgMS40NzU1OCAxMS4zOTA3IDIuMDAwMDlWMy4wMDAxOEgxMy4wNTc3SDE0LjUwMjVDMTQuNzc4NiAzLjAwMDE4IDE1LjAwMjUgMy4yMjQwNCAxNS4wMDI1IDMuNTAwMThDMTUuMDAyNSAzLjc3NjMzIDE0Ljc3ODYgNC4wMDAxOCAxNC41MDI1IDQuMDAwMThIMTMuNTU3N1YxNC4wMDA4QzEzLjU1NzcgMTQuNTI1MyAxMy4zNTcyIDE1LjAzMiAxMi45OTQ3IDE1LjQwODRDMTIuNjMxNiAxNS43ODU0IDEyLjEzNSAxNi4wMDA5IDExLjYxMyAxNi4wMDA5SDQuMzg5NDRDMy44Njc0NyAxNi4wMDA5IDMuMzcwODYgMTUuNzg1NCAzLjAwNzczIDE1LjQwODRDMi42NDUyMSAxNS4wMzIgMi40NDQ3MiAxNC41MjUzIDIuNDQ0NzIgMTQuMDAwOFY0LjAwMDE4SDEuNUMxLjIyMzg2IDQuMDAwMTggMSAzLjc3NjMzIDEgMy41MDAxOEMxIDMuMjI0MDQgMS4yMjM4NiAzLjAwMDE4IDEuNSAzLjAwMDE4SDIuOTQ0NzJINC42MTE3OVpNMy40NDQ3MiA0LjAwMDE4VjE0LjAwMDhDMy40NDQ3MiAxNC4yNzIgMy41NDg2NCAxNC41Mjg1IDMuNzI4IDE0LjcxNDdDMy45MDY3NSAxNC45MDAzIDQuMTQ1MDggMTUuMDAwOSA0LjM4OTQ0IDE1LjAwMDlIMTEuNjEzQzExLjg1NzQgMTUuMDAwOSAxMi4wOTU3IDE0LjkwMDMgMTIuMjc0NSAxNC43MTQ3QzEyLjQ1MzggMTQuNTI4NSAxMi41NTc3IDE0LjI3MiAxMi41NTc3IDE0LjAwMDhWNC4wMDAxOEgzLjQ0NDcyWk02LjUgN0M2Ljc3NjE0IDcgNyA3LjIwMzUgNyA3LjQ1NDUyVjExLjU0NTVDNyAxMS43OTY1IDYuNzc2MTQgMTIgNi41IDEyQzYuMjIzODYgMTIgNiAxMS43OTY1IDYgMTEuNTQ1NVY3LjQ1NDUyQzYgNy4yMDM1IDYuMjIzODYgNyA2LjUgN1pNMTAgNy40NTQ1MkMxMCA3LjIwMzUgOS43NzYxNCA3IDkuNSA3QzkuMjIzODYgNyA5IDcuMjAzNSA5IDcuNDU0NTJWMTEuNTQ1NUM5IDExLjc5NjUgOS4yMjM4NiAxMiA5LjUgMTJDOS43NzYxNCAxMiAxMCAxMS43OTY1IDEwIDExLjU0NTVWNy40NTQ1MloiIGZpbGw9IiM2NjY2NjYiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xOV8xNjMxIj4KPHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJ0cmFuc3BhcmVudCIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=);\n}\n\n.gc-table-sheet-move-span {\n  padding: 0px 0px 4px 4px;\n  line-height: 23px;\n  height: 18px;\n  position: absolute;\n  background-color: var(--sjs-theme-background);\n  border: 1px solid var(--sjs-theme-border-color);\n  box-shadow: rgba(0, 0, 0, 0.4) 1px 2px 5px;\n  min-width: 200px;\n  font-size: 13px;\n  color: var(--sjs-theme-color);\n  letter-spacing: 0.2px;\n  z-index: 3;\n}\n\n.gc-table-sheet-cross-column-select {\n  width: 67%;\n  height: 20px;\n  display: inline-block;\n  border: solid 1px lightgrey;\n  outline-color: rgb(82, 146, 247);\n}\n\n.gc-table-sheet-hidden {\n  display: none;\n}\n\n.gc-name-box-container {\n  background-color: #ffffff;\n  color: #000000;\n}\n\n.gc-name-box-container .gc-name-box-selector {\n  background-color: #ffffff;\n  color: #000000;\n}\n\n.gc-name-box-container .gc-name-box-dropdown {\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTJweCIgaGVpZ2h0PSIxMnB4IiB2aWV3Qm94PSIwIDAgMTIgMTIiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDU1ICg3ODA3NikgLSBodHRwczovL3NrZXRjaGFwcC5jb20gLS0+CiAgICA8dGl0bGU+ZHJvcGRvd248L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZyBpZD0iZHJvcGRvd24iIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxwb2x5Z29uIGZpbGw9IiM2RTZFNkUiIHBvaW50cz0iMyA0IDEwIDQgNi41IDkiPjwvcG9seWdvbj4KICAgIDwvZz4KPC9zdmc+);\n}\n\n.gc-name-box-container {\n  display: flex;\n  flex-wrap: nowrap;\n  width: 100%;\n  height: 100%;\n  border: 1px solid #c6c6c6;\n}\n.gc-name-box-container .gc-name-box-selector {\n  display: flex;\n  width: 0;\n  flex-grow: 5;\n  padding-top: 2px;\n  text-align: center;\n  min-width: 0px;\n  border: none;\n  border-right: 0px;\n  outline: none;\n}\n.gc-name-box-container .gc-name-box-dropdown {\n  display: flex;\n  width: 20px;\n  border: none;\n  background-repeat: no-repeat;\n  background-position: center;\n}\n.gc-name-box-container .gc-name-box-disabled {\n  pointer-events: none;\n}\n.gc-name-box-container input::-ms-clear {\n  display: none;\n}\n\n.gc-name-box-list {\n  overflow-y: auto;\n  overflow-x: hidden;\n  word-wrap: nowrap;\n  text-overflow: ellipsis;\n  width: 100%;\n}\n\n.gc-spread-filter-custom-dialog {\n  background-color: rgb(240, 240, 240);\n  min-width: 840px;\n  min-height: 260px;\n  font-size: 12px;\n}\n\n.gc-spread-filter-custom-dialog .gc-spread-filter-dialog-title {\n  width: 100%;\n  height: 34px;\n  background-color: rgb(255, 255, 255);\n  padding: 0px 0px 0px 12px;\n  box-sizing: border-box;\n}\n\n.gc-spread-filter-custom-dialog .gc-spread-filter-dialog-title-text {\n  float: left;\n  height: 34px;\n  line-height: 34px;\n  display: inline-block;\n}\n\n.gc-spread-filter-custom-dialog .gc-spread-filter-dialog-title-close {\n  float: right;\n  height: 34px;\n  line-height: 34px;\n  display: inline-block;\n  font-size: 18px;\n  width: 36px;\n  text-align: center;\n}\n\n.gc-spread-filter-custom-dialog .gc-spread-filter-dialog-custom-select {\n  height: 25px;\n  width: 29%;\n  margin-bottom: 0px;\n  margin-right: 12px;\n  font-size: inherit;\n  padding: 0px;\n  box-sizing: border-box;\n}\n\n.gc-spread-filter-custom-dialog .gc-spread-filter-dialog-condition {\n  position: relative;\n  padding: 0px 0px 12px 4%;\n}\n\n.gc-spread-filter-custom-dialog .gc-spread-filter-dialog-value-select {\n  height: 25px;\n  width: 100%;\n  margin: 0px;\n  padding: 0px;\n}\n\n.gc-spread-filter-custom-dialog .gc-spread-filter-dialog-value-select-wrap {\n  position: absolute;\n  left: 34%;\n  top: 0px;\n  width: 63%;\n}\n\n.gc-spread-filter-custom-dialog .gc-spread-filter-dialog-value-select-input {\n  position: absolute;\n  left: 2px;\n  top: 2px;\n  width: calc(100% - 25px);\n  text-indent: 5px;\n  border: 0px;\n  height: 21px;\n  box-sizing: border-box;\n  outline: none;\n  padding: 0px;\n  margin: 0px;\n}\n\n.gc-spread-filter-custom-dialog .gc-spread-filter-dialog-value-select-spread {\n  position: absolute;\n  top: 25px;\n  width: 100%;\n  height: 333px;\n  border: 1px solid black;\n  display: none;\n  z-index: 1;\n}\n\n.gc-formula-editor-token-const-string {\n  color: #BF1CDD;\n}\n\n.gc-formula-editor-token-const-number {\n  color: #198E70;\n}\n\n.gc-formula-editor-token-const-boolean {\n  color: #2535FF;\n}\n\n.gc-formula-editor-token-const-error {\n  color: #EE322B;\n}\n\n.gc-formula-editor-token-operator-prefix {\n  color: #000000;\n}\n\n.gc-formula-editor-token-operator-infix {\n  color: #000000;\n}\n\n.gc-formula-editor-token-operator-postfix {\n  color: #000000;\n}\n\n.gc-formula-editor-token-function {\n  color: #2535FF;\n}\n\n.gc-formula-editor-token-name {\n  color: #9B865E;\n}\n\n.gc-formula-editor-token-reference-1 {\n  color: rgb(50, 106, 199);\n}\n\n.gc-formula-editor-token-reference-2 {\n  color: rgb(192, 53, 62);\n}\n\n.gc-formula-editor-token-reference-3 {\n  color: rgb(129, 87, 183);\n}\n\n.gc-formula-editor-token-reference-4 {\n  color: rgb(0, 124, 32);\n}\n\n.gc-formula-editor-token-reference-5 {\n  color: rgb(176, 62, 132);\n}\n\n.gc-formula-editor-token-reference-6 {\n  color: rgb(182, 73, 0);\n}\n\n.gc-formula-editor-token-reference-7 {\n  color: rgb(38, 115, 146);\n}\n\n.gc-formula-editor-token-argument-separator {\n  color: #000000;\n}\n\n.gc-formula-editor-content {\n  color: #5c6166;\n  background-color: #fcfcfc;\n  font: 14.6667px Consolas, \"Menlo\", \"Monaco\", \"Courier New\", \"monospace\";\n}\n\n.gc-formula-editor-gutters {\n  color: rgb(128, 129, 137);\n  background-color: #fcfcfc;\n  font: 14.6667px Consolas, \"Menlo\", \"Monaco\", \"Courier New\", \"monospace\";\n}\n\n.gc-formula-editor-caret {\n  color: #000000;\n}\n\n.gc-formula-editor-active-line {\n  background-color: rgba(211, 211, 211, 0.431372549);\n}\n\n.gc-formula-editor-selection {\n  background-color: #a9ceff;\n}\n\n.gc-formula-editor-tooltip-help-function {\n  font: 14.6667px Consolas, \"Menlo\", \"Monaco\", \"Courier New\", \"monospace\";\n}\n\n.gc-formula-editor-tooltip-help-function-title {\n  color: #000000;\n  background-color: #BFBEBE;\n  padding-top: 8px;\n  padding-bottom: 10px;\n  padding-left: 8px;\n  padding-right: 8px;\n  margin: 0px;\n}\n\n.gc-formula-editor-tooltip-help-function-description {\n  color: #7E7E7E;\n  background-color: #FFFFFF;\n  margin: 0px;\n  padding-top: 5px;\n  padding-bottom: 5px;\n  padding-left: 8px;\n  padding-right: 8px;\n  font-size: 13px;\n}\n\n.gc-formula-editor-tooltip-help-function-title-function-name {\n  font-weight: bold;\n}\n\n.gc-formula-editor-tooltip-help-function-title-active-parameter {\n  color: rgb(201, 36, 36);\n  font-weight: bold;\n}\n\n.gc-formula-editor-tooltip-autocompletion-function {\n  font: 14.6667px Consolas, \"Menlo\", \"Monaco\", \"Courier New\", \"monospace\";\n  color: #7E7E7E;\n  background-color: #FFFFFF;\n  border: 1px solid rgb(119, 119, 119);\n}\n\n.gc-formula-editor-tooltip-autocompletion-function-icon {\n  font: 14.6667px Consolas, \"Menlo\", \"Monaco\", \"Courier New\", \"monospace\";\n  color: #7E7E7E;\n}\n\n.gc-formula-editor-tooltip-autocompletion-function-name {\n  font: 14.6667px Consolas, \"Menlo\", \"Monaco\", \"Courier New\", \"monospace\";\n  color: #7E7E7E;\n}\n\n.gc-formula-editor-tooltip-autocompletion-function-description {\n  font: 14.6667px Consolas, \"Menlo\", \"Monaco\", \"Courier New\", \"monospace\";\n  color: #7E7E7E;\n}\n\n.gc-formula-editor-tooltip-autocompletion-function-active-item {\n  color: #000000;\n  background-color: #BFBEBE;\n}\n\n.gc-formula-editor-tooltip-error-message {\n  font: 14.6667px Consolas, \"Menlo\", \"Monaco\", \"Courier New\", \"monospace\";\n  color: #7E7E7E;\n  background-color: #FFFFFF;\n}\n\n.sjs-data-chart-tip {\n  box-shadow: rgba(0, 0, 0, 0.24) 0px 3px 8px !important;\n  border-radius: 3px !important;\n}\n"
  },
  {
    "path": "instock/web/static/js/FileSaver.js",
    "content": "/*\n* FileSaver.js\n* A saveAs() FileSaver implementation.\n*\n* By Eli Grey, http://eligrey.com\n*\n* License : https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md (MIT)\n* source  : http://purl.eligrey.com/github/FileSaver.js\n*/\n\n// The one and only way of getting global scope in all environments\n// https://stackoverflow.com/q/3277182/1008999\nvar _global = typeof window === 'object' && window.window === window\n  ? window : typeof self === 'object' && self.self === self\n  ? self : typeof global === 'object' && global.global === global\n  ? global\n  : this\n\nfunction bom (blob, opts) {\n  if (typeof opts === 'undefined') opts = { autoBom: false }\n  else if (typeof opts !== 'object') {\n    console.warn('Deprecated: Expected third argument to be a object')\n    opts = { autoBom: !opts }\n  }\n\n  // prepend BOM for UTF-8 XML and text/* types (including HTML)\n  // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF\n  if (opts.autoBom && /^\\s*(?:text\\/\\S*|application\\/xml|\\S*\\/\\S*\\+xml)\\s*;.*charset\\s*=\\s*utf-8/i.test(blob.type)) {\n    return new Blob([String.fromCharCode(0xFEFF), blob], { type: blob.type })\n  }\n  return blob\n}\n\nfunction download (url, name, opts) {\n  var xhr = new XMLHttpRequest()\n  xhr.open('GET', url)\n  xhr.responseType = 'blob'\n  xhr.onload = function () {\n    saveAs(xhr.response, name, opts)\n  }\n  xhr.onerror = function () {\n    console.error('could not download file')\n  }\n  xhr.send()\n}\n\nfunction corsEnabled (url) {\n  var xhr = new XMLHttpRequest()\n  // use sync to avoid popup blocker\n  xhr.open('HEAD', url, false)\n  try {\n    xhr.send()\n  } catch (e) {}\n  return xhr.status >= 200 && xhr.status <= 299\n}\n\n// `a.click()` doesn't work for all browsers (#465)\nfunction click (node) {\n  try {\n    node.dispatchEvent(new MouseEvent('click'))\n  } catch (e) {\n    var evt = document.createEvent('MouseEvents')\n    evt.initMouseEvent('click', true, true, window, 0, 0, 0, 80,\n                          20, false, false, false, false, 0, null)\n    node.dispatchEvent(evt)\n  }\n}\n\n// Detect WebView inside a native macOS app by ruling out all browsers\n// We just need to check for 'Safari' because all other browsers (besides Firefox) include that too\n// https://www.whatismybrowser.com/guides/the-latest-user-agent/macos\nvar isMacOSWebView = /Macintosh/.test(navigator.userAgent) && /AppleWebKit/.test(navigator.userAgent) && !/Safari/.test(navigator.userAgent)\n\nvar saveAs = _global.saveAs || (\n  // probably in some web worker\n  (typeof window !== 'object' || window !== _global)\n    ? function saveAs () { /* noop */ }\n\n  // Use download attribute first if possible (#193 Lumia mobile) unless this is a macOS WebView\n  : ('download' in HTMLAnchorElement.prototype && !isMacOSWebView)\n  ? function saveAs (blob, name, opts) {\n    var URL = _global.URL || _global.webkitURL\n    var a = document.createElement('a')\n    name = name || blob.name || 'download'\n\n    a.download = name\n    a.rel = 'noopener' // tabnabbing\n\n    // TODO: detect chrome extensions & packaged apps\n    // a.target = '_blank'\n\n    if (typeof blob === 'string') {\n      // Support regular links\n      a.href = blob\n      if (a.origin !== location.origin) {\n        corsEnabled(a.href)\n          ? download(blob, name, opts)\n          : click(a, a.target = '_blank')\n      } else {\n        click(a)\n      }\n    } else {\n      // Support blobs\n      a.href = URL.createObjectURL(blob)\n      setTimeout(function () { URL.revokeObjectURL(a.href) }, 4E4) // 40s\n      setTimeout(function () { click(a) }, 0)\n    }\n  }\n\n  // Use msSaveOrOpenBlob as a second approach\n  : 'msSaveOrOpenBlob' in navigator\n  ? function saveAs (blob, name, opts) {\n    name = name || blob.name || 'download'\n\n    if (typeof blob === 'string') {\n      if (corsEnabled(blob)) {\n        download(blob, name, opts)\n      } else {\n        var a = document.createElement('a')\n        a.href = blob\n        a.target = '_blank'\n        setTimeout(function () { click(a) })\n      }\n    } else {\n      navigator.msSaveOrOpenBlob(bom(blob, opts), name)\n    }\n  }\n\n  // Fallback to using FileReader and a popup\n  : function saveAs (blob, name, opts, popup) {\n    // Open a popup immediately do go around popup blocker\n    // Mostly only available on user interaction and the fileReader is async so...\n    popup = popup || open('', '_blank')\n    if (popup) {\n      popup.document.title =\n      popup.document.body.innerText = 'downloading...'\n    }\n\n    if (typeof blob === 'string') return download(blob, name, opts)\n\n    var force = blob.type === 'application/octet-stream'\n    var isSafari = /constructor/i.test(_global.HTMLElement) || _global.safari\n    var isChromeIOS = /CriOS\\/[\\d]+/.test(navigator.userAgent)\n\n    if ((isChromeIOS || (force && isSafari) || isMacOSWebView) && typeof FileReader !== 'undefined') {\n      // Safari doesn't allow downloading of blob URLs\n      var reader = new FileReader()\n      reader.onloadend = function () {\n        var url = reader.result\n        url = isChromeIOS ? url : url.replace(/^data:[^;]*;/, 'data:attachment/file;')\n        if (popup) popup.location.href = url\n        else location = url\n        popup = null // reverse-tabnabbing #460\n      }\n      reader.readAsDataURL(blob)\n    } else {\n      var URL = _global.URL || _global.webkitURL\n      var url = URL.createObjectURL(blob)\n      if (popup) popup.location = url\n      else location.href = url\n      popup = null // reverse-tabnabbing #460\n      setTimeout(function () { URL.revokeObjectURL(url) }, 4E4) // 40s\n    }\n  }\n)\n\n_global.saveAs = saveAs.saveAs = saveAs\n\nif (typeof module !== 'undefined') {\n  module.exports = saveAs;\n}\n"
  },
  {
    "path": "instock/web/static/js/bootstrap.min-3.4.1.js",
    "content": "/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under the MIT license\n */\nif(\"undefined\"==typeof jQuery)throw new Error(\"Bootstrap's JavaScript requires jQuery\");!function(t){\"use strict\";var e=jQuery.fn.jquery.split(\" \")[0].split(\".\");if(e[0]<2&&e[1]<9||1==e[0]&&9==e[1]&&e[2]<1||3<e[0])throw new Error(\"Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4\")}(),function(n){\"use strict\";n.fn.emulateTransitionEnd=function(t){var e=!1,i=this;n(this).one(\"bsTransitionEnd\",function(){e=!0});return setTimeout(function(){e||n(i).trigger(n.support.transition.end)},t),this},n(function(){n.support.transition=function o(){var t=document.createElement(\"bootstrap\"),e={WebkitTransition:\"webkitTransitionEnd\",MozTransition:\"transitionend\",OTransition:\"oTransitionEnd otransitionend\",transition:\"transitionend\"};for(var i in e)if(t.style[i]!==undefined)return{end:e[i]};return!1}(),n.support.transition&&(n.event.special.bsTransitionEnd={bindType:n.support.transition.end,delegateType:n.support.transition.end,handle:function(t){if(n(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}})})}(jQuery),function(s){\"use strict\";var e='[data-dismiss=\"alert\"]',a=function(t){s(t).on(\"click\",e,this.close)};a.VERSION=\"3.4.1\",a.TRANSITION_DURATION=150,a.prototype.close=function(t){var e=s(this),i=e.attr(\"data-target\");i||(i=(i=e.attr(\"href\"))&&i.replace(/.*(?=#[^\\s]*$)/,\"\")),i=\"#\"===i?[]:i;var o=s(document).find(i);function n(){o.detach().trigger(\"closed.bs.alert\").remove()}t&&t.preventDefault(),o.length||(o=e.closest(\".alert\")),o.trigger(t=s.Event(\"close.bs.alert\")),t.isDefaultPrevented()||(o.removeClass(\"in\"),s.support.transition&&o.hasClass(\"fade\")?o.one(\"bsTransitionEnd\",n).emulateTransitionEnd(a.TRANSITION_DURATION):n())};var t=s.fn.alert;s.fn.alert=function o(i){return this.each(function(){var t=s(this),e=t.data(\"bs.alert\");e||t.data(\"bs.alert\",e=new a(this)),\"string\"==typeof i&&e[i].call(t)})},s.fn.alert.Constructor=a,s.fn.alert.noConflict=function(){return s.fn.alert=t,this},s(document).on(\"click.bs.alert.data-api\",e,a.prototype.close)}(jQuery),function(s){\"use strict\";var n=function(t,e){this.$element=s(t),this.options=s.extend({},n.DEFAULTS,e),this.isLoading=!1};function i(o){return this.each(function(){var t=s(this),e=t.data(\"bs.button\"),i=\"object\"==typeof o&&o;e||t.data(\"bs.button\",e=new n(this,i)),\"toggle\"==o?e.toggle():o&&e.setState(o)})}n.VERSION=\"3.4.1\",n.DEFAULTS={loadingText:\"loading...\"},n.prototype.setState=function(t){var e=\"disabled\",i=this.$element,o=i.is(\"input\")?\"val\":\"html\",n=i.data();t+=\"Text\",null==n.resetText&&i.data(\"resetText\",i[o]()),setTimeout(s.proxy(function(){i[o](null==n[t]?this.options[t]:n[t]),\"loadingText\"==t?(this.isLoading=!0,i.addClass(e).attr(e,e).prop(e,!0)):this.isLoading&&(this.isLoading=!1,i.removeClass(e).removeAttr(e).prop(e,!1))},this),0)},n.prototype.toggle=function(){var t=!0,e=this.$element.closest('[data-toggle=\"buttons\"]');if(e.length){var i=this.$element.find(\"input\");\"radio\"==i.prop(\"type\")?(i.prop(\"checked\")&&(t=!1),e.find(\".active\").removeClass(\"active\"),this.$element.addClass(\"active\")):\"checkbox\"==i.prop(\"type\")&&(i.prop(\"checked\")!==this.$element.hasClass(\"active\")&&(t=!1),this.$element.toggleClass(\"active\")),i.prop(\"checked\",this.$element.hasClass(\"active\")),t&&i.trigger(\"change\")}else this.$element.attr(\"aria-pressed\",!this.$element.hasClass(\"active\")),this.$element.toggleClass(\"active\")};var t=s.fn.button;s.fn.button=i,s.fn.button.Constructor=n,s.fn.button.noConflict=function(){return s.fn.button=t,this},s(document).on(\"click.bs.button.data-api\",'[data-toggle^=\"button\"]',function(t){var e=s(t.target).closest(\".btn\");i.call(e,\"toggle\"),s(t.target).is('input[type=\"radio\"], input[type=\"checkbox\"]')||(t.preventDefault(),e.is(\"input,button\")?e.trigger(\"focus\"):e.find(\"input:visible,button:visible\").first().trigger(\"focus\"))}).on(\"focus.bs.button.data-api blur.bs.button.data-api\",'[data-toggle^=\"button\"]',function(t){s(t.target).closest(\".btn\").toggleClass(\"focus\",/^focus(in)?$/.test(t.type))})}(jQuery),function(p){\"use strict\";var c=function(t,e){this.$element=p(t),this.$indicators=this.$element.find(\".carousel-indicators\"),this.options=e,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on(\"keydown.bs.carousel\",p.proxy(this.keydown,this)),\"hover\"==this.options.pause&&!(\"ontouchstart\"in document.documentElement)&&this.$element.on(\"mouseenter.bs.carousel\",p.proxy(this.pause,this)).on(\"mouseleave.bs.carousel\",p.proxy(this.cycle,this))};function r(n){return this.each(function(){var t=p(this),e=t.data(\"bs.carousel\"),i=p.extend({},c.DEFAULTS,t.data(),\"object\"==typeof n&&n),o=\"string\"==typeof n?n:i.slide;e||t.data(\"bs.carousel\",e=new c(this,i)),\"number\"==typeof n?e.to(n):o?e[o]():i.interval&&e.pause().cycle()})}c.VERSION=\"3.4.1\",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:\"hover\",wrap:!0,keyboard:!0},c.prototype.keydown=function(t){if(!/input|textarea/i.test(t.target.tagName)){switch(t.which){case 37:this.prev();break;case 39:this.next();break;default:return}t.preventDefault()}},c.prototype.cycle=function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(p.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(t){return this.$items=t.parent().children(\".item\"),this.$items.index(t||this.$active)},c.prototype.getItemForDirection=function(t,e){var i=this.getItemIndex(e);if((\"prev\"==t&&0===i||\"next\"==t&&i==this.$items.length-1)&&!this.options.wrap)return e;var o=(i+(\"prev\"==t?-1:1))%this.$items.length;return this.$items.eq(o)},c.prototype.to=function(t){var e=this,i=this.getItemIndex(this.$active=this.$element.find(\".item.active\"));if(!(t>this.$items.length-1||t<0))return this.sliding?this.$element.one(\"slid.bs.carousel\",function(){e.to(t)}):i==t?this.pause().cycle():this.slide(i<t?\"next\":\"prev\",this.$items.eq(t))},c.prototype.pause=function(t){return t||(this.paused=!0),this.$element.find(\".next, .prev\").length&&p.support.transition&&(this.$element.trigger(p.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){if(!this.sliding)return this.slide(\"next\")},c.prototype.prev=function(){if(!this.sliding)return this.slide(\"prev\")},c.prototype.slide=function(t,e){var i=this.$element.find(\".item.active\"),o=e||this.getItemForDirection(t,i),n=this.interval,s=\"next\"==t?\"left\":\"right\",a=this;if(o.hasClass(\"active\"))return this.sliding=!1;var r=o[0],l=p.Event(\"slide.bs.carousel\",{relatedTarget:r,direction:s});if(this.$element.trigger(l),!l.isDefaultPrevented()){if(this.sliding=!0,n&&this.pause(),this.$indicators.length){this.$indicators.find(\".active\").removeClass(\"active\");var h=p(this.$indicators.children()[this.getItemIndex(o)]);h&&h.addClass(\"active\")}var d=p.Event(\"slid.bs.carousel\",{relatedTarget:r,direction:s});return p.support.transition&&this.$element.hasClass(\"slide\")?(o.addClass(t),\"object\"==typeof o&&o.length&&o[0].offsetWidth,i.addClass(s),o.addClass(s),i.one(\"bsTransitionEnd\",function(){o.removeClass([t,s].join(\" \")).addClass(\"active\"),i.removeClass([\"active\",s].join(\" \")),a.sliding=!1,setTimeout(function(){a.$element.trigger(d)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(i.removeClass(\"active\"),o.addClass(\"active\"),this.sliding=!1,this.$element.trigger(d)),n&&this.cycle(),this}};var t=p.fn.carousel;p.fn.carousel=r,p.fn.carousel.Constructor=c,p.fn.carousel.noConflict=function(){return p.fn.carousel=t,this};var e=function(t){var e=p(this),i=e.attr(\"href\");i&&(i=i.replace(/.*(?=#[^\\s]+$)/,\"\"));var o=e.attr(\"data-target\")||i,n=p(document).find(o);if(n.hasClass(\"carousel\")){var s=p.extend({},n.data(),e.data()),a=e.attr(\"data-slide-to\");a&&(s.interval=!1),r.call(n,s),a&&n.data(\"bs.carousel\").to(a),t.preventDefault()}};p(document).on(\"click.bs.carousel.data-api\",\"[data-slide]\",e).on(\"click.bs.carousel.data-api\",\"[data-slide-to]\",e),p(window).on(\"load\",function(){p('[data-ride=\"carousel\"]').each(function(){var t=p(this);r.call(t,t.data())})})}(jQuery),function(a){\"use strict\";var r=function(t,e){this.$element=a(t),this.options=a.extend({},r.DEFAULTS,e),this.$trigger=a('[data-toggle=\"collapse\"][href=\"#'+t.id+'\"],[data-toggle=\"collapse\"][data-target=\"#'+t.id+'\"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};function n(t){var e,i=t.attr(\"data-target\")||(e=t.attr(\"href\"))&&e.replace(/.*(?=#[^\\s]+$)/,\"\");return a(document).find(i)}function l(o){return this.each(function(){var t=a(this),e=t.data(\"bs.collapse\"),i=a.extend({},r.DEFAULTS,t.data(),\"object\"==typeof o&&o);!e&&i.toggle&&/show|hide/.test(o)&&(i.toggle=!1),e||t.data(\"bs.collapse\",e=new r(this,i)),\"string\"==typeof o&&e[o]()})}r.VERSION=\"3.4.1\",r.TRANSITION_DURATION=350,r.DEFAULTS={toggle:!0},r.prototype.dimension=function(){return this.$element.hasClass(\"width\")?\"width\":\"height\"},r.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass(\"in\")){var t,e=this.$parent&&this.$parent.children(\".panel\").children(\".in, .collapsing\");if(!(e&&e.length&&(t=e.data(\"bs.collapse\"))&&t.transitioning)){var i=a.Event(\"show.bs.collapse\");if(this.$element.trigger(i),!i.isDefaultPrevented()){e&&e.length&&(l.call(e,\"hide\"),t||e.data(\"bs.collapse\",null));var o=this.dimension();this.$element.removeClass(\"collapse\").addClass(\"collapsing\")[o](0).attr(\"aria-expanded\",!0),this.$trigger.removeClass(\"collapsed\").attr(\"aria-expanded\",!0),this.transitioning=1;var n=function(){this.$element.removeClass(\"collapsing\").addClass(\"collapse in\")[o](\"\"),this.transitioning=0,this.$element.trigger(\"shown.bs.collapse\")};if(!a.support.transition)return n.call(this);var s=a.camelCase([\"scroll\",o].join(\"-\"));this.$element.one(\"bsTransitionEnd\",a.proxy(n,this)).emulateTransitionEnd(r.TRANSITION_DURATION)[o](this.$element[0][s])}}}},r.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass(\"in\")){var t=a.Event(\"hide.bs.collapse\");if(this.$element.trigger(t),!t.isDefaultPrevented()){var e=this.dimension();this.$element[e](this.$element[e]())[0].offsetHeight,this.$element.addClass(\"collapsing\").removeClass(\"collapse in\").attr(\"aria-expanded\",!1),this.$trigger.addClass(\"collapsed\").attr(\"aria-expanded\",!1),this.transitioning=1;var i=function(){this.transitioning=0,this.$element.removeClass(\"collapsing\").addClass(\"collapse\").trigger(\"hidden.bs.collapse\")};if(!a.support.transition)return i.call(this);this.$element[e](0).one(\"bsTransitionEnd\",a.proxy(i,this)).emulateTransitionEnd(r.TRANSITION_DURATION)}}},r.prototype.toggle=function(){this[this.$element.hasClass(\"in\")?\"hide\":\"show\"]()},r.prototype.getParent=function(){return a(document).find(this.options.parent).find('[data-toggle=\"collapse\"][data-parent=\"'+this.options.parent+'\"]').each(a.proxy(function(t,e){var i=a(e);this.addAriaAndCollapsedClass(n(i),i)},this)).end()},r.prototype.addAriaAndCollapsedClass=function(t,e){var i=t.hasClass(\"in\");t.attr(\"aria-expanded\",i),e.toggleClass(\"collapsed\",!i).attr(\"aria-expanded\",i)};var t=a.fn.collapse;a.fn.collapse=l,a.fn.collapse.Constructor=r,a.fn.collapse.noConflict=function(){return a.fn.collapse=t,this},a(document).on(\"click.bs.collapse.data-api\",'[data-toggle=\"collapse\"]',function(t){var e=a(this);e.attr(\"data-target\")||t.preventDefault();var i=n(e),o=i.data(\"bs.collapse\")?\"toggle\":e.data();l.call(i,o)})}(jQuery),function(a){\"use strict\";var r='[data-toggle=\"dropdown\"]',o=function(t){a(t).on(\"click.bs.dropdown\",this.toggle)};function l(t){var e=t.attr(\"data-target\");e||(e=(e=t.attr(\"href\"))&&/#[A-Za-z]/.test(e)&&e.replace(/.*(?=#[^\\s]*$)/,\"\"));var i=\"#\"!==e?a(document).find(e):null;return i&&i.length?i:t.parent()}function s(o){o&&3===o.which||(a(\".dropdown-backdrop\").remove(),a(r).each(function(){var t=a(this),e=l(t),i={relatedTarget:this};e.hasClass(\"open\")&&(o&&\"click\"==o.type&&/input|textarea/i.test(o.target.tagName)&&a.contains(e[0],o.target)||(e.trigger(o=a.Event(\"hide.bs.dropdown\",i)),o.isDefaultPrevented()||(t.attr(\"aria-expanded\",\"false\"),e.removeClass(\"open\").trigger(a.Event(\"hidden.bs.dropdown\",i)))))}))}o.VERSION=\"3.4.1\",o.prototype.toggle=function(t){var e=a(this);if(!e.is(\".disabled, :disabled\")){var i=l(e),o=i.hasClass(\"open\");if(s(),!o){\"ontouchstart\"in document.documentElement&&!i.closest(\".navbar-nav\").length&&a(document.createElement(\"div\")).addClass(\"dropdown-backdrop\").insertAfter(a(this)).on(\"click\",s);var n={relatedTarget:this};if(i.trigger(t=a.Event(\"show.bs.dropdown\",n)),t.isDefaultPrevented())return;e.trigger(\"focus\").attr(\"aria-expanded\",\"true\"),i.toggleClass(\"open\").trigger(a.Event(\"shown.bs.dropdown\",n))}return!1}},o.prototype.keydown=function(t){if(/(38|40|27|32)/.test(t.which)&&!/input|textarea/i.test(t.target.tagName)){var e=a(this);if(t.preventDefault(),t.stopPropagation(),!e.is(\".disabled, :disabled\")){var i=l(e),o=i.hasClass(\"open\");if(!o&&27!=t.which||o&&27==t.which)return 27==t.which&&i.find(r).trigger(\"focus\"),e.trigger(\"click\");var n=i.find(\".dropdown-menu li:not(.disabled):visible a\");if(n.length){var s=n.index(t.target);38==t.which&&0<s&&s--,40==t.which&&s<n.length-1&&s++,~s||(s=0),n.eq(s).trigger(\"focus\")}}}};var t=a.fn.dropdown;a.fn.dropdown=function e(i){return this.each(function(){var t=a(this),e=t.data(\"bs.dropdown\");e||t.data(\"bs.dropdown\",e=new o(this)),\"string\"==typeof i&&e[i].call(t)})},a.fn.dropdown.Constructor=o,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=t,this},a(document).on(\"click.bs.dropdown.data-api\",s).on(\"click.bs.dropdown.data-api\",\".dropdown form\",function(t){t.stopPropagation()}).on(\"click.bs.dropdown.data-api\",r,o.prototype.toggle).on(\"keydown.bs.dropdown.data-api\",r,o.prototype.keydown).on(\"keydown.bs.dropdown.data-api\",\".dropdown-menu\",o.prototype.keydown)}(jQuery),function(a){\"use strict\";var s=function(t,e){this.options=e,this.$body=a(document.body),this.$element=a(t),this.$dialog=this.$element.find(\".modal-dialog\"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.fixedContent=\".navbar-fixed-top, .navbar-fixed-bottom\",this.options.remote&&this.$element.find(\".modal-content\").load(this.options.remote,a.proxy(function(){this.$element.trigger(\"loaded.bs.modal\")},this))};function r(o,n){return this.each(function(){var t=a(this),e=t.data(\"bs.modal\"),i=a.extend({},s.DEFAULTS,t.data(),\"object\"==typeof o&&o);e||t.data(\"bs.modal\",e=new s(this,i)),\"string\"==typeof o?e[o](n):i.show&&e.show(n)})}s.VERSION=\"3.4.1\",s.TRANSITION_DURATION=300,s.BACKDROP_TRANSITION_DURATION=150,s.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},s.prototype.toggle=function(t){return this.isShown?this.hide():this.show(t)},s.prototype.show=function(i){var o=this,t=a.Event(\"show.bs.modal\",{relatedTarget:i});this.$element.trigger(t),this.isShown||t.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass(\"modal-open\"),this.escape(),this.resize(),this.$element.on(\"click.dismiss.bs.modal\",'[data-dismiss=\"modal\"]',a.proxy(this.hide,this)),this.$dialog.on(\"mousedown.dismiss.bs.modal\",function(){o.$element.one(\"mouseup.dismiss.bs.modal\",function(t){a(t.target).is(o.$element)&&(o.ignoreBackdropClick=!0)})}),this.backdrop(function(){var t=a.support.transition&&o.$element.hasClass(\"fade\");o.$element.parent().length||o.$element.appendTo(o.$body),o.$element.show().scrollTop(0),o.adjustDialog(),t&&o.$element[0].offsetWidth,o.$element.addClass(\"in\"),o.enforceFocus();var e=a.Event(\"shown.bs.modal\",{relatedTarget:i});t?o.$dialog.one(\"bsTransitionEnd\",function(){o.$element.trigger(\"focus\").trigger(e)}).emulateTransitionEnd(s.TRANSITION_DURATION):o.$element.trigger(\"focus\").trigger(e)}))},s.prototype.hide=function(t){t&&t.preventDefault(),t=a.Event(\"hide.bs.modal\"),this.$element.trigger(t),this.isShown&&!t.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off(\"focusin.bs.modal\"),this.$element.removeClass(\"in\").off(\"click.dismiss.bs.modal\").off(\"mouseup.dismiss.bs.modal\"),this.$dialog.off(\"mousedown.dismiss.bs.modal\"),a.support.transition&&this.$element.hasClass(\"fade\")?this.$element.one(\"bsTransitionEnd\",a.proxy(this.hideModal,this)).emulateTransitionEnd(s.TRANSITION_DURATION):this.hideModal())},s.prototype.enforceFocus=function(){a(document).off(\"focusin.bs.modal\").on(\"focusin.bs.modal\",a.proxy(function(t){document===t.target||this.$element[0]===t.target||this.$element.has(t.target).length||this.$element.trigger(\"focus\")},this))},s.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on(\"keydown.dismiss.bs.modal\",a.proxy(function(t){27==t.which&&this.hide()},this)):this.isShown||this.$element.off(\"keydown.dismiss.bs.modal\")},s.prototype.resize=function(){this.isShown?a(window).on(\"resize.bs.modal\",a.proxy(this.handleUpdate,this)):a(window).off(\"resize.bs.modal\")},s.prototype.hideModal=function(){var t=this;this.$element.hide(),this.backdrop(function(){t.$body.removeClass(\"modal-open\"),t.resetAdjustments(),t.resetScrollbar(),t.$element.trigger(\"hidden.bs.modal\")})},s.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},s.prototype.backdrop=function(t){var e=this,i=this.$element.hasClass(\"fade\")?\"fade\":\"\";if(this.isShown&&this.options.backdrop){var o=a.support.transition&&i;if(this.$backdrop=a(document.createElement(\"div\")).addClass(\"modal-backdrop \"+i).appendTo(this.$body),this.$element.on(\"click.dismiss.bs.modal\",a.proxy(function(t){this.ignoreBackdropClick?this.ignoreBackdropClick=!1:t.target===t.currentTarget&&(\"static\"==this.options.backdrop?this.$element[0].focus():this.hide())},this)),o&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass(\"in\"),!t)return;o?this.$backdrop.one(\"bsTransitionEnd\",t).emulateTransitionEnd(s.BACKDROP_TRANSITION_DURATION):t()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass(\"in\");var n=function(){e.removeBackdrop(),t&&t()};a.support.transition&&this.$element.hasClass(\"fade\")?this.$backdrop.one(\"bsTransitionEnd\",n).emulateTransitionEnd(s.BACKDROP_TRANSITION_DURATION):n()}else t&&t()},s.prototype.handleUpdate=function(){this.adjustDialog()},s.prototype.adjustDialog=function(){var t=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&t?this.scrollbarWidth:\"\",paddingRight:this.bodyIsOverflowing&&!t?this.scrollbarWidth:\"\"})},s.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:\"\",paddingRight:\"\"})},s.prototype.checkScrollbar=function(){var t=window.innerWidth;if(!t){var e=document.documentElement.getBoundingClientRect();t=e.right-Math.abs(e.left)}this.bodyIsOverflowing=document.body.clientWidth<t,this.scrollbarWidth=this.measureScrollbar()},s.prototype.setScrollbar=function(){var t=parseInt(this.$body.css(\"padding-right\")||0,10);this.originalBodyPad=document.body.style.paddingRight||\"\";var n=this.scrollbarWidth;this.bodyIsOverflowing&&(this.$body.css(\"padding-right\",t+n),a(this.fixedContent).each(function(t,e){var i=e.style.paddingRight,o=a(e).css(\"padding-right\");a(e).data(\"padding-right\",i).css(\"padding-right\",parseFloat(o)+n+\"px\")}))},s.prototype.resetScrollbar=function(){this.$body.css(\"padding-right\",this.originalBodyPad),a(this.fixedContent).each(function(t,e){var i=a(e).data(\"padding-right\");a(e).removeData(\"padding-right\"),e.style.paddingRight=i||\"\"})},s.prototype.measureScrollbar=function(){var t=document.createElement(\"div\");t.className=\"modal-scrollbar-measure\",this.$body.append(t);var e=t.offsetWidth-t.clientWidth;return this.$body[0].removeChild(t),e};var t=a.fn.modal;a.fn.modal=r,a.fn.modal.Constructor=s,a.fn.modal.noConflict=function(){return a.fn.modal=t,this},a(document).on(\"click.bs.modal.data-api\",'[data-toggle=\"modal\"]',function(t){var e=a(this),i=e.attr(\"href\"),o=e.attr(\"data-target\")||i&&i.replace(/.*(?=#[^\\s]+$)/,\"\"),n=a(document).find(o),s=n.data(\"bs.modal\")?\"toggle\":a.extend({remote:!/#/.test(i)&&i},n.data(),e.data());e.is(\"a\")&&t.preventDefault(),n.one(\"show.bs.modal\",function(t){t.isDefaultPrevented()||n.one(\"hidden.bs.modal\",function(){e.is(\":visible\")&&e.trigger(\"focus\")})}),r.call(n,s,this)})}(jQuery),function(g){\"use strict\";var o=[\"sanitize\",\"whiteList\",\"sanitizeFn\"],a=[\"background\",\"cite\",\"href\",\"itemtype\",\"longdesc\",\"poster\",\"src\",\"xlink:href\"],t={\"*\":[\"class\",\"dir\",\"id\",\"lang\",\"role\",/^aria-[\\w-]*$/i],a:[\"target\",\"href\",\"title\",\"rel\"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:[\"src\",\"alt\",\"title\",\"width\",\"height\"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},r=/^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi,l=/^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;function u(t,e){var i=t.nodeName.toLowerCase();if(-1!==g.inArray(i,e))return-1===g.inArray(i,a)||Boolean(t.nodeValue.match(r)||t.nodeValue.match(l));for(var o=g(e).filter(function(t,e){return e instanceof RegExp}),n=0,s=o.length;n<s;n++)if(i.match(o[n]))return!0;return!1}function n(t,e,i){if(0===t.length)return t;if(i&&\"function\"==typeof i)return i(t);if(!document.implementation||!document.implementation.createHTMLDocument)return t;var o=document.implementation.createHTMLDocument(\"sanitization\");o.body.innerHTML=t;for(var n=g.map(e,function(t,e){return e}),s=g(o.body).find(\"*\"),a=0,r=s.length;a<r;a++){var l=s[a],h=l.nodeName.toLowerCase();if(-1!==g.inArray(h,n))for(var d=g.map(l.attributes,function(t){return t}),p=[].concat(e[\"*\"]||[],e[h]||[]),c=0,f=d.length;c<f;c++)u(d[c],p)||l.removeAttribute(d[c].nodeName);else l.parentNode.removeChild(l)}return o.body.innerHTML}var m=function(t,e){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.inState=null,this.init(\"tooltip\",t,e)};m.VERSION=\"3.4.1\",m.TRANSITION_DURATION=150,m.DEFAULTS={animation:!0,placement:\"top\",selector:!1,template:'<div class=\"tooltip\" role=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>',trigger:\"hover focus\",title:\"\",delay:0,html:!1,container:!1,viewport:{selector:\"body\",padding:0},sanitize:!0,sanitizeFn:null,whiteList:t},m.prototype.init=function(t,e,i){if(this.enabled=!0,this.type=t,this.$element=g(e),this.options=this.getOptions(i),this.$viewport=this.options.viewport&&g(document).find(g.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error(\"`selector` option must be specified when initializing \"+this.type+\" on the window.document object!\");for(var o=this.options.trigger.split(\" \"),n=o.length;n--;){var s=o[n];if(\"click\"==s)this.$element.on(\"click.\"+this.type,this.options.selector,g.proxy(this.toggle,this));else if(\"manual\"!=s){var a=\"hover\"==s?\"mouseenter\":\"focusin\",r=\"hover\"==s?\"mouseleave\":\"focusout\";this.$element.on(a+\".\"+this.type,this.options.selector,g.proxy(this.enter,this)),this.$element.on(r+\".\"+this.type,this.options.selector,g.proxy(this.leave,this))}}this.options.selector?this._options=g.extend({},this.options,{trigger:\"manual\",selector:\"\"}):this.fixTitle()},m.prototype.getDefaults=function(){return m.DEFAULTS},m.prototype.getOptions=function(t){var e=this.$element.data();for(var i in e)e.hasOwnProperty(i)&&-1!==g.inArray(i,o)&&delete e[i];return(t=g.extend({},this.getDefaults(),e,t)).delay&&\"number\"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),t.sanitize&&(t.template=n(t.template,t.whiteList,t.sanitizeFn)),t},m.prototype.getDelegateOptions=function(){var i={},o=this.getDefaults();return this._options&&g.each(this._options,function(t,e){o[t]!=e&&(i[t]=e)}),i},m.prototype.enter=function(t){var e=t instanceof this.constructor?t:g(t.currentTarget).data(\"bs.\"+this.type);if(e||(e=new this.constructor(t.currentTarget,this.getDelegateOptions()),g(t.currentTarget).data(\"bs.\"+this.type,e)),t instanceof g.Event&&(e.inState[\"focusin\"==t.type?\"focus\":\"hover\"]=!0),e.tip().hasClass(\"in\")||\"in\"==e.hoverState)e.hoverState=\"in\";else{if(clearTimeout(e.timeout),e.hoverState=\"in\",!e.options.delay||!e.options.delay.show)return e.show();e.timeout=setTimeout(function(){\"in\"==e.hoverState&&e.show()},e.options.delay.show)}},m.prototype.isInStateTrue=function(){for(var t in this.inState)if(this.inState[t])return!0;return!1},m.prototype.leave=function(t){var e=t instanceof this.constructor?t:g(t.currentTarget).data(\"bs.\"+this.type);if(e||(e=new this.constructor(t.currentTarget,this.getDelegateOptions()),g(t.currentTarget).data(\"bs.\"+this.type,e)),t instanceof g.Event&&(e.inState[\"focusout\"==t.type?\"focus\":\"hover\"]=!1),!e.isInStateTrue()){if(clearTimeout(e.timeout),e.hoverState=\"out\",!e.options.delay||!e.options.delay.hide)return e.hide();e.timeout=setTimeout(function(){\"out\"==e.hoverState&&e.hide()},e.options.delay.hide)}},m.prototype.show=function(){var t=g.Event(\"show.bs.\"+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(t);var e=g.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(t.isDefaultPrevented()||!e)return;var i=this,o=this.tip(),n=this.getUID(this.type);this.setContent(),o.attr(\"id\",n),this.$element.attr(\"aria-describedby\",n),this.options.animation&&o.addClass(\"fade\");var s=\"function\"==typeof this.options.placement?this.options.placement.call(this,o[0],this.$element[0]):this.options.placement,a=/\\s?auto?\\s?/i,r=a.test(s);r&&(s=s.replace(a,\"\")||\"top\"),o.detach().css({top:0,left:0,display:\"block\"}).addClass(s).data(\"bs.\"+this.type,this),this.options.container?o.appendTo(g(document).find(this.options.container)):o.insertAfter(this.$element),this.$element.trigger(\"inserted.bs.\"+this.type);var l=this.getPosition(),h=o[0].offsetWidth,d=o[0].offsetHeight;if(r){var p=s,c=this.getPosition(this.$viewport);s=\"bottom\"==s&&l.bottom+d>c.bottom?\"top\":\"top\"==s&&l.top-d<c.top?\"bottom\":\"right\"==s&&l.right+h>c.width?\"left\":\"left\"==s&&l.left-h<c.left?\"right\":s,o.removeClass(p).addClass(s)}var f=this.getCalculatedOffset(s,l,h,d);this.applyPlacement(f,s);var u=function(){var t=i.hoverState;i.$element.trigger(\"shown.bs.\"+i.type),i.hoverState=null,\"out\"==t&&i.leave(i)};g.support.transition&&this.$tip.hasClass(\"fade\")?o.one(\"bsTransitionEnd\",u).emulateTransitionEnd(m.TRANSITION_DURATION):u()}},m.prototype.applyPlacement=function(t,e){var i=this.tip(),o=i[0].offsetWidth,n=i[0].offsetHeight,s=parseInt(i.css(\"margin-top\"),10),a=parseInt(i.css(\"margin-left\"),10);isNaN(s)&&(s=0),isNaN(a)&&(a=0),t.top+=s,t.left+=a,g.offset.setOffset(i[0],g.extend({using:function(t){i.css({top:Math.round(t.top),left:Math.round(t.left)})}},t),0),i.addClass(\"in\");var r=i[0].offsetWidth,l=i[0].offsetHeight;\"top\"==e&&l!=n&&(t.top=t.top+n-l);var h=this.getViewportAdjustedDelta(e,t,r,l);h.left?t.left+=h.left:t.top+=h.top;var d=/top|bottom/.test(e),p=d?2*h.left-o+r:2*h.top-n+l,c=d?\"offsetWidth\":\"offsetHeight\";i.offset(t),this.replaceArrow(p,i[0][c],d)},m.prototype.replaceArrow=function(t,e,i){this.arrow().css(i?\"left\":\"top\",50*(1-t/e)+\"%\").css(i?\"top\":\"left\",\"\")},m.prototype.setContent=function(){var t=this.tip(),e=this.getTitle();this.options.html?(this.options.sanitize&&(e=n(e,this.options.whiteList,this.options.sanitizeFn)),t.find(\".tooltip-inner\").html(e)):t.find(\".tooltip-inner\").text(e),t.removeClass(\"fade in top bottom left right\")},m.prototype.hide=function(t){var e=this,i=g(this.$tip),o=g.Event(\"hide.bs.\"+this.type);function n(){\"in\"!=e.hoverState&&i.detach(),e.$element&&e.$element.removeAttr(\"aria-describedby\").trigger(\"hidden.bs.\"+e.type),t&&t()}if(this.$element.trigger(o),!o.isDefaultPrevented())return i.removeClass(\"in\"),g.support.transition&&i.hasClass(\"fade\")?i.one(\"bsTransitionEnd\",n).emulateTransitionEnd(m.TRANSITION_DURATION):n(),this.hoverState=null,this},m.prototype.fixTitle=function(){var t=this.$element;(t.attr(\"title\")||\"string\"!=typeof t.attr(\"data-original-title\"))&&t.attr(\"data-original-title\",t.attr(\"title\")||\"\").attr(\"title\",\"\")},m.prototype.hasContent=function(){return this.getTitle()},m.prototype.getPosition=function(t){var e=(t=t||this.$element)[0],i=\"BODY\"==e.tagName,o=e.getBoundingClientRect();null==o.width&&(o=g.extend({},o,{width:o.right-o.left,height:o.bottom-o.top}));var n=window.SVGElement&&e instanceof window.SVGElement,s=i?{top:0,left:0}:n?null:t.offset(),a={scroll:i?document.documentElement.scrollTop||document.body.scrollTop:t.scrollTop()},r=i?{width:g(window).width(),height:g(window).height()}:null;return g.extend({},o,a,r,s)},m.prototype.getCalculatedOffset=function(t,e,i,o){return\"bottom\"==t?{top:e.top+e.height,left:e.left+e.width/2-i/2}:\"top\"==t?{top:e.top-o,left:e.left+e.width/2-i/2}:\"left\"==t?{top:e.top+e.height/2-o/2,left:e.left-i}:{top:e.top+e.height/2-o/2,left:e.left+e.width}},m.prototype.getViewportAdjustedDelta=function(t,e,i,o){var n={top:0,left:0};if(!this.$viewport)return n;var s=this.options.viewport&&this.options.viewport.padding||0,a=this.getPosition(this.$viewport);if(/right|left/.test(t)){var r=e.top-s-a.scroll,l=e.top+s-a.scroll+o;r<a.top?n.top=a.top-r:l>a.top+a.height&&(n.top=a.top+a.height-l)}else{var h=e.left-s,d=e.left+s+i;h<a.left?n.left=a.left-h:d>a.right&&(n.left=a.left+a.width-d)}return n},m.prototype.getTitle=function(){var t=this.$element,e=this.options;return t.attr(\"data-original-title\")||(\"function\"==typeof e.title?e.title.call(t[0]):e.title)},m.prototype.getUID=function(t){for(;t+=~~(1e6*Math.random()),document.getElementById(t););return t},m.prototype.tip=function(){if(!this.$tip&&(this.$tip=g(this.options.template),1!=this.$tip.length))throw new Error(this.type+\" `template` option must consist of exactly 1 top-level element!\");return this.$tip},m.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(\".tooltip-arrow\")},m.prototype.enable=function(){this.enabled=!0},m.prototype.disable=function(){this.enabled=!1},m.prototype.toggleEnabled=function(){this.enabled=!this.enabled},m.prototype.toggle=function(t){var e=this;t&&((e=g(t.currentTarget).data(\"bs.\"+this.type))||(e=new this.constructor(t.currentTarget,this.getDelegateOptions()),g(t.currentTarget).data(\"bs.\"+this.type,e))),t?(e.inState.click=!e.inState.click,e.isInStateTrue()?e.enter(e):e.leave(e)):e.tip().hasClass(\"in\")?e.leave(e):e.enter(e)},m.prototype.destroy=function(){var t=this;clearTimeout(this.timeout),this.hide(function(){t.$element.off(\".\"+t.type).removeData(\"bs.\"+t.type),t.$tip&&t.$tip.detach(),t.$tip=null,t.$arrow=null,t.$viewport=null,t.$element=null})},m.prototype.sanitizeHtml=function(t){return n(t,this.options.whiteList,this.options.sanitizeFn)};var e=g.fn.tooltip;g.fn.tooltip=function i(o){return this.each(function(){var t=g(this),e=t.data(\"bs.tooltip\"),i=\"object\"==typeof o&&o;!e&&/destroy|hide/.test(o)||(e||t.data(\"bs.tooltip\",e=new m(this,i)),\"string\"==typeof o&&e[o]())})},g.fn.tooltip.Constructor=m,g.fn.tooltip.noConflict=function(){return g.fn.tooltip=e,this}}(jQuery),function(n){\"use strict\";var s=function(t,e){this.init(\"popover\",t,e)};if(!n.fn.tooltip)throw new Error(\"Popover requires tooltip.js\");s.VERSION=\"3.4.1\",s.DEFAULTS=n.extend({},n.fn.tooltip.Constructor.DEFAULTS,{placement:\"right\",trigger:\"click\",content:\"\",template:'<div class=\"popover\" role=\"tooltip\"><div class=\"arrow\"></div><h3 class=\"popover-title\"></h3><div class=\"popover-content\"></div></div>'}),((s.prototype=n.extend({},n.fn.tooltip.Constructor.prototype)).constructor=s).prototype.getDefaults=function(){return s.DEFAULTS},s.prototype.setContent=function(){var t=this.tip(),e=this.getTitle(),i=this.getContent();if(this.options.html){var o=typeof i;this.options.sanitize&&(e=this.sanitizeHtml(e),\"string\"===o&&(i=this.sanitizeHtml(i))),t.find(\".popover-title\").html(e),t.find(\".popover-content\").children().detach().end()[\"string\"===o?\"html\":\"append\"](i)}else t.find(\".popover-title\").text(e),t.find(\".popover-content\").children().detach().end().text(i);t.removeClass(\"fade top bottom left right in\"),t.find(\".popover-title\").html()||t.find(\".popover-title\").hide()},s.prototype.hasContent=function(){return this.getTitle()||this.getContent()},s.prototype.getContent=function(){var t=this.$element,e=this.options;return t.attr(\"data-content\")||(\"function\"==typeof e.content?e.content.call(t[0]):e.content)},s.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(\".arrow\")};var t=n.fn.popover;n.fn.popover=function e(o){return this.each(function(){var t=n(this),e=t.data(\"bs.popover\"),i=\"object\"==typeof o&&o;!e&&/destroy|hide/.test(o)||(e||t.data(\"bs.popover\",e=new s(this,i)),\"string\"==typeof o&&e[o]())})},n.fn.popover.Constructor=s,n.fn.popover.noConflict=function(){return n.fn.popover=t,this}}(jQuery),function(s){\"use strict\";function n(t,e){this.$body=s(document.body),this.$scrollElement=s(t).is(document.body)?s(window):s(t),this.options=s.extend({},n.DEFAULTS,e),this.selector=(this.options.target||\"\")+\" .nav li > a\",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on(\"scroll.bs.scrollspy\",s.proxy(this.process,this)),this.refresh(),this.process()}function e(o){return this.each(function(){var t=s(this),e=t.data(\"bs.scrollspy\"),i=\"object\"==typeof o&&o;e||t.data(\"bs.scrollspy\",e=new n(this,i)),\"string\"==typeof o&&e[o]()})}n.VERSION=\"3.4.1\",n.DEFAULTS={offset:10},n.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},n.prototype.refresh=function(){var t=this,o=\"offset\",n=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),s.isWindow(this.$scrollElement[0])||(o=\"position\",n=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var t=s(this),e=t.data(\"target\")||t.attr(\"href\"),i=/^#./.test(e)&&s(e);return i&&i.length&&i.is(\":visible\")&&[[i[o]().top+n,e]]||null}).sort(function(t,e){return t[0]-e[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},n.prototype.process=function(){var t,e=this.$scrollElement.scrollTop()+this.options.offset,i=this.getScrollHeight(),o=this.options.offset+i-this.$scrollElement.height(),n=this.offsets,s=this.targets,a=this.activeTarget;if(this.scrollHeight!=i&&this.refresh(),o<=e)return a!=(t=s[s.length-1])&&this.activate(t);if(a&&e<n[0])return this.activeTarget=null,this.clear();for(t=n.length;t--;)a!=s[t]&&e>=n[t]&&(n[t+1]===undefined||e<n[t+1])&&this.activate(s[t])},n.prototype.activate=function(t){this.activeTarget=t,this.clear();var e=this.selector+'[data-target=\"'+t+'\"],'+this.selector+'[href=\"'+t+'\"]',i=s(e).parents(\"li\").addClass(\"active\");i.parent(\".dropdown-menu\").length&&(i=i.closest(\"li.dropdown\").addClass(\"active\")),i.trigger(\"activate.bs.scrollspy\")},n.prototype.clear=function(){s(this.selector).parentsUntil(this.options.target,\".active\").removeClass(\"active\")};var t=s.fn.scrollspy;s.fn.scrollspy=e,s.fn.scrollspy.Constructor=n,s.fn.scrollspy.noConflict=function(){return s.fn.scrollspy=t,this},s(window).on(\"load.bs.scrollspy.data-api\",function(){s('[data-spy=\"scroll\"]').each(function(){var t=s(this);e.call(t,t.data())})})}(jQuery),function(r){\"use strict\";var a=function(t){this.element=r(t)};function e(i){return this.each(function(){var t=r(this),e=t.data(\"bs.tab\");e||t.data(\"bs.tab\",e=new a(this)),\"string\"==typeof i&&e[i]()})}a.VERSION=\"3.4.1\",a.TRANSITION_DURATION=150,a.prototype.show=function(){var t=this.element,e=t.closest(\"ul:not(.dropdown-menu)\"),i=t.data(\"target\");if(i||(i=(i=t.attr(\"href\"))&&i.replace(/.*(?=#[^\\s]*$)/,\"\")),!t.parent(\"li\").hasClass(\"active\")){var o=e.find(\".active:last a\"),n=r.Event(\"hide.bs.tab\",{relatedTarget:t[0]}),s=r.Event(\"show.bs.tab\",{relatedTarget:o[0]});if(o.trigger(n),t.trigger(s),!s.isDefaultPrevented()&&!n.isDefaultPrevented()){var a=r(document).find(i);this.activate(t.closest(\"li\"),e),this.activate(a,a.parent(),function(){o.trigger({type:\"hidden.bs.tab\",relatedTarget:t[0]}),t.trigger({type:\"shown.bs.tab\",relatedTarget:o[0]})})}}},a.prototype.activate=function(t,e,i){var o=e.find(\"> .active\"),n=i&&r.support.transition&&(o.length&&o.hasClass(\"fade\")||!!e.find(\"> .fade\").length);function s(){o.removeClass(\"active\").find(\"> .dropdown-menu > .active\").removeClass(\"active\").end().find('[data-toggle=\"tab\"]').attr(\"aria-expanded\",!1),t.addClass(\"active\").find('[data-toggle=\"tab\"]').attr(\"aria-expanded\",!0),n?(t[0].offsetWidth,t.addClass(\"in\")):t.removeClass(\"fade\"),t.parent(\".dropdown-menu\").length&&t.closest(\"li.dropdown\").addClass(\"active\").end().find('[data-toggle=\"tab\"]').attr(\"aria-expanded\",!0),i&&i()}o.length&&n?o.one(\"bsTransitionEnd\",s).emulateTransitionEnd(a.TRANSITION_DURATION):s(),o.removeClass(\"in\")};var t=r.fn.tab;r.fn.tab=e,r.fn.tab.Constructor=a,r.fn.tab.noConflict=function(){return r.fn.tab=t,this};var i=function(t){t.preventDefault(),e.call(r(this),\"show\")};r(document).on(\"click.bs.tab.data-api\",'[data-toggle=\"tab\"]',i).on(\"click.bs.tab.data-api\",'[data-toggle=\"pill\"]',i)}(jQuery),function(l){\"use strict\";var h=function(t,e){this.options=l.extend({},h.DEFAULTS,e);var i=this.options.target===h.DEFAULTS.target?l(this.options.target):l(document).find(this.options.target);this.$target=i.on(\"scroll.bs.affix.data-api\",l.proxy(this.checkPosition,this)).on(\"click.bs.affix.data-api\",l.proxy(this.checkPositionWithEventLoop,this)),this.$element=l(t),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};function i(o){return this.each(function(){var t=l(this),e=t.data(\"bs.affix\"),i=\"object\"==typeof o&&o;e||t.data(\"bs.affix\",e=new h(this,i)),\"string\"==typeof o&&e[o]()})}h.VERSION=\"3.4.1\",h.RESET=\"affix affix-top affix-bottom\",h.DEFAULTS={offset:0,target:window},h.prototype.getState=function(t,e,i,o){var n=this.$target.scrollTop(),s=this.$element.offset(),a=this.$target.height();if(null!=i&&\"top\"==this.affixed)return n<i&&\"top\";if(\"bottom\"==this.affixed)return null!=i?!(n+this.unpin<=s.top)&&\"bottom\":!(n+a<=t-o)&&\"bottom\";var r=null==this.affixed,l=r?n:s.top;return null!=i&&n<=i?\"top\":null!=o&&t-o<=l+(r?a:e)&&\"bottom\"},h.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(h.RESET).addClass(\"affix\");var t=this.$target.scrollTop(),e=this.$element.offset();return this.pinnedOffset=e.top-t},h.prototype.checkPositionWithEventLoop=function(){setTimeout(l.proxy(this.checkPosition,this),1)},h.prototype.checkPosition=function(){if(this.$element.is(\":visible\")){var t=this.$element.height(),e=this.options.offset,i=e.top,o=e.bottom,n=Math.max(l(document).height(),l(document.body).height());\"object\"!=typeof e&&(o=i=e),\"function\"==typeof i&&(i=e.top(this.$element)),\"function\"==typeof o&&(o=e.bottom(this.$element));var s=this.getState(n,t,i,o);if(this.affixed!=s){null!=this.unpin&&this.$element.css(\"top\",\"\");var a=\"affix\"+(s?\"-\"+s:\"\"),r=l.Event(a+\".bs.affix\");if(this.$element.trigger(r),r.isDefaultPrevented())return;this.affixed=s,this.unpin=\"bottom\"==s?this.getPinnedOffset():null,this.$element.removeClass(h.RESET).addClass(a).trigger(a.replace(\"affix\",\"affixed\")+\".bs.affix\")}\"bottom\"==s&&this.$element.offset({top:n-t-o})}};var t=l.fn.affix;l.fn.affix=i,l.fn.affix.Constructor=h,l.fn.affix.noConflict=function(){return l.fn.affix=t,this},l(window).on(\"load\",function(){l('[data-spy=\"affix\"]').each(function(){var t=l(this),e=t.data();e.offset=e.offset||{},null!=e.offsetBottom&&(e.offset.bottom=e.offsetBottom),null!=e.offsetTop&&(e.offset.top=e.offsetTop),i.call(t,e)})})}(jQuery);"
  },
  {
    "path": "instock/web/static/js/jquery.min-3.7.1.js",
    "content": "/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */\n!function(e,t){\"use strict\";\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return t(e)}:t(e)}(\"undefined\"!=typeof window?window:this,function(ie,e){\"use strict\";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return\"function\"==typeof e&&\"number\"!=typeof e.nodeType&&\"function\"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement(\"script\");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?n[i.call(e)]||\"object\":typeof e}var t=\"3.7.1\",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&\"length\"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&(\"array\"===n||0===t||\"number\"==typeof t&&0<t&&t-1 in e)}function fe(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}ce.fn=ce.prototype={jquery:t,constructor:ce,length:0,toArray:function(){return ae.call(this)},get:function(e){return null==e?ae.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=ce.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return ce.each(this,e)},map:function(n){return this.pushStack(ce.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(ae.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(ce.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(ce.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:s,sort:oe.sort,splice:oe.splice},ce.extend=ce.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for(\"boolean\"==typeof a&&(l=a,a=arguments[s]||{},s++),\"object\"==typeof a||v(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],\"__proto__\"!==t&&a!==r&&(l&&r&&(ce.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||ce.isPlainObject(n)?n:{},i=!1,a[t]=ce.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},ce.extend({expando:\"jQuery\"+(t+Math.random()).replace(/\\D/g,\"\"),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||\"[object Object]\"!==i.call(e))&&(!(t=r(e))||\"function\"==typeof(n=ue.call(t,\"constructor\")&&t.constructor)&&o.call(n)===a)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){m(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(c(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},text:function(e){var t,n=\"\",r=0,i=e.nodeType;if(!i)while(t=e[r++])n+=ce.text(t);return 1===i||11===i?e.textContent:9===i?e.documentElement.textContent:3===i||4===i?e.nodeValue:n},makeArray:function(e,t){var n=t||[];return null!=e&&(c(Object(e))?ce.merge(n,\"string\"==typeof e?[e]:e):s.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:se.call(t,e,n)},isXMLDoc:function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!l.test(t||n&&n.nodeName||\"HTML\")},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(c(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:le}),\"function\"==typeof Symbol&&(ce.fn[Symbol.iterator]=oe[Symbol.iterator]),ce.each(\"Boolean Number String Function Array Date RegExp Object Error Symbol\".split(\" \"),function(e,t){n[\"[object \"+t+\"]\"]=t.toLowerCase()});var pe=oe.pop,de=oe.sort,he=oe.splice,ge=\"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",ve=new RegExp(\"^\"+ge+\"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\"+ge+\"+$\",\"g\");ce.contains=function(e,t){var n=t&&t.parentNode;return e===n||!(!n||1!==n.nodeType||!(e.contains?e.contains(n):e.compareDocumentPosition&&16&e.compareDocumentPosition(n)))};var f=/([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\x80-\\uFFFF\\w-]/g;function p(e,t){return t?\"\\0\"===e?\"\\ufffd\":e.slice(0,-1)+\"\\\\\"+e.charCodeAt(e.length-1).toString(16)+\" \":\"\\\\\"+e}ce.escapeSelector=function(e){return(e+\"\").replace(f,p)};var ye=C,me=s;!function(){var e,b,w,o,a,T,r,C,d,i,k=me,S=ce.expando,E=0,n=0,s=W(),c=W(),u=W(),h=W(),l=function(e,t){return e===t&&(a=!0),0},f=\"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",t=\"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\"+ge+\"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\",p=\"\\\\[\"+ge+\"*(\"+t+\")(?:\"+ge+\"*([*^$|!~]?=)\"+ge+\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\"+t+\"))|)\"+ge+\"*\\\\]\",g=\":(\"+t+\")(?:\\\\((('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\"+p+\")*)|.*)\\\\)|)\",v=new RegExp(ge+\"+\",\"g\"),y=new RegExp(\"^\"+ge+\"*,\"+ge+\"*\"),m=new RegExp(\"^\"+ge+\"*([>+~]|\"+ge+\")\"+ge+\"*\"),x=new RegExp(ge+\"|>\"),j=new RegExp(g),A=new RegExp(\"^\"+t+\"$\"),D={ID:new RegExp(\"^#(\"+t+\")\"),CLASS:new RegExp(\"^\\\\.(\"+t+\")\"),TAG:new RegExp(\"^(\"+t+\"|[*])\"),ATTR:new RegExp(\"^\"+p),PSEUDO:new RegExp(\"^\"+g),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+ge+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+ge+\"*(?:([+-]|)\"+ge+\"*(\\\\d+)|))\"+ge+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+f+\")$\",\"i\"),needsContext:new RegExp(\"^\"+ge+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+ge+\"*((?:-\\\\d)?\\\\d*)\"+ge+\"*\\\\)|)(?=[^-]|$)\",\"i\")},N=/^(?:input|select|textarea|button)$/i,q=/^h\\d$/i,L=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,H=/[+~]/,O=new RegExp(\"\\\\\\\\[\\\\da-fA-F]{1,6}\"+ge+\"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\",\"g\"),P=function(e,t){var n=\"0x\"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,\"fieldset\")},{dir:\"parentNode\",next:\"legend\"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],\"string\"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+\" \"]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute(\"id\"))?s=ce.escapeSelector(s):e.setAttribute(\"id\",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?\"#\"+s:\":scope\")+\" \"+Q(l[o]);c=l.join(\",\")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute(\"id\")}}}return re(t.replace(ve,\"$1\"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+\" \")>b.cacheLength&&delete e[r.shift()],e[t+\" \"]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement(\"fieldset\");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,\"input\")&&e.type===t}}function _(t){return function(e){return(fe(e,\"input\")||fe(e,\"button\"))&&e.type===t}}function z(t){return function(e){return\"form\"in e?e.parentNode&&!1===e.disabled?\"label\"in e?\"label\"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:\"label\"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&\"undefined\"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener(\"unload\",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,\"*\")}),le.scope=$(function(){return T.querySelectorAll(\":scope\")}),le.cssHas=$(function(){try{return T.querySelector(\":has(*,:jqfake)\"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute(\"id\")===t}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t=\"undefined\"!=typeof e.getAttributeNode&&e.getAttributeNode(\"id\");return t&&t.value===n}},b.find.ID=function(e,t){if(\"undefined\"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode(\"id\"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return\"undefined\"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if(\"undefined\"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML=\"<a id='\"+S+\"' href='' disabled='disabled'></a><select id='\"+S+\"-\\r\\\\' disabled='disabled'><option selected=''></option></select>\",e.querySelectorAll(\"[selected]\").length||d.push(\"\\\\[\"+ge+\"*(?:value|\"+f+\")\"),e.querySelectorAll(\"[id~=\"+S+\"-]\").length||d.push(\"~=\"),e.querySelectorAll(\"a#\"+S+\"+*\").length||d.push(\".#.+[+~]\"),e.querySelectorAll(\":checked\").length||d.push(\":checked\"),(t=T.createElement(\"input\")).setAttribute(\"type\",\"hidden\"),e.appendChild(t).setAttribute(\"name\",\"D\"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(\":disabled\").length&&d.push(\":enabled\",\":disabled\"),(t=T.createElement(\"input\")).setAttribute(\"name\",\"\"),e.appendChild(t),e.querySelectorAll(\"[name='']\").length||d.push(\"\\\\[\"+ge+\"*name\"+ge+\"*=\"+ge+\"*(?:''|\\\"\\\")\")}),le.cssHas||d.push(\":has\"),d=d.length&&new RegExp(d.join(\"|\")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+\" \"]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0<I(t,T,null,[e]).length},I.contains=function(e,t){return(e.ownerDocument||e)!=T&&V(e),ce.contains(e,t)},I.attr=function(e,t){(e.ownerDocument||e)!=T&&V(e);var n=b.attrHandle[t.toLowerCase()],r=n&&ue.call(b.attrHandle,t.toLowerCase())?n(e,t,!C):void 0;return void 0!==r?r:e.getAttribute(t)},I.error=function(e){throw new Error(\"Syntax error, unrecognized expression: \"+e)},ce.uniqueSort=function(e){var t,n=[],r=0,i=0;if(a=!le.sortStable,o=!le.sortStable&&ae.call(e,0),de.call(e,l),a){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)he.call(e,n[r],1)}return o=null,e},ce.fn.uniqueSort=function(){return this.pushStack(ce.uniqueSort(ae.apply(this)))},(b=ce.expr={cacheLength:50,createPseudo:F,match:D,attrHandle:{},find:{},relative:{\">\":{dir:\"parentNode\",first:!0},\" \":{dir:\"parentNode\"},\"+\":{dir:\"previousSibling\",first:!0},\"~\":{dir:\"previousSibling\"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||\"\").replace(O,P),\"~=\"===e[2]&&(e[3]=\" \"+e[3]+\" \"),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),\"nth\"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*(\"even\"===e[3]||\"odd\"===e[3])),e[5]=+(e[7]+e[8]||\"odd\"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||\"\":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(\")\",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return\"*\"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+\" \"];return t||(t=new RegExp(\"(^|\"+ge+\")\"+e+\"(\"+ge+\"|$)\"))&&s(e,function(e){return t.test(\"string\"==typeof e.className&&e.className||\"undefined\"!=typeof e.getAttribute&&e.getAttribute(\"class\")||\"\")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?\"!=\"===r:!r||(t+=\"\",\"=\"===r?t===i:\"!=\"===r?t!==i:\"^=\"===r?i&&0===t.indexOf(i):\"*=\"===r?i&&-1<t.indexOf(i):\"$=\"===r?i&&t.slice(-i.length)===i:\"~=\"===r?-1<(\" \"+t.replace(v,\" \")+\" \").indexOf(i):\"|=\"===r&&(t===i||t.slice(0,i.length+1)===i+\"-\"))}},CHILD:function(d,e,t,h,g){var v=\"nth\"!==d.slice(0,3),y=\"last\"!==d.slice(-4),m=\"of-type\"===e;return 1===h&&0===g?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u=v!==y?\"nextSibling\":\"previousSibling\",l=e.parentNode,c=m&&e.nodeName.toLowerCase(),f=!n&&!m,p=!1;if(l){if(v){while(u){o=e;while(o=o[u])if(m?fe(o,c):1===o.nodeType)return!1;s=u=\"only\"===d&&!s&&\"nextSibling\"}return!0}if(s=[y?l.firstChild:l.lastChild],y&&f){p=(a=(r=(i=l[S]||(l[S]={}))[d]||[])[0]===E&&r[1])&&r[2],o=a&&l.childNodes[a];while(o=++a&&o&&o[u]||(p=a=0)||s.pop())if(1===o.nodeType&&++p&&o===e){i[d]=[E,a,p];break}}else if(f&&(p=a=(r=(i=e[S]||(e[S]={}))[d]||[])[0]===E&&r[1]),!1===p)while(o=++a&&o&&o[u]||(p=a=0)||s.pop())if((m?fe(o,c):1===o.nodeType)&&++p&&(f&&((i=o[S]||(o[S]={}))[d]=[E,p]),o===e))break;return(p-=g)===h||p%h==0&&0<=p/h}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||I.error(\"unsupported pseudo: \"+e);return a[S]?a(o):1<a.length?(t=[e,e,\"\",o],b.setFilters.hasOwnProperty(e.toLowerCase())?F(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=se.call(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:F(function(e){var r=[],i=[],s=ne(e.replace(ve,\"$1\"));return s[S]?F(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:F(function(t){return function(e){return 0<I(t,e).length}}),contains:F(function(t){return t=t.replace(O,P),function(e){return-1<(e.textContent||ce.text(e)).indexOf(t)}}),lang:F(function(n){return A.test(n||\"\")||I.error(\"unsupported lang: \"+n),n=n.replace(O,P).toLowerCase(),function(e){var t;do{if(t=C?e.lang:e.getAttribute(\"xml:lang\")||e.getAttribute(\"lang\"))return(t=t.toLowerCase())===n||0===t.indexOf(n+\"-\")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=ie.location&&ie.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===r},focus:function(e){return e===function(){try{return T.activeElement}catch(e){}}()&&T.hasFocus()&&!!(e.type||e.href||~e.tabIndex)},enabled:z(!1),disabled:z(!0),checked:function(e){return fe(e,\"input\")&&!!e.checked||fe(e,\"option\")&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return q.test(e.nodeName)},input:function(e){return N.test(e.nodeName)},button:function(e){return fe(e,\"input\")&&\"button\"===e.type||fe(e,\"button\")},text:function(e){var t;return fe(e,\"input\")&&\"text\"===e.type&&(null==(t=e.getAttribute(\"type\"))||\"text\"===t.toLowerCase())},first:X(function(){return[0]}),last:X(function(e,t){return[t-1]}),eq:X(function(e,t,n){return[n<0?n+t:n]}),even:X(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:X(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:X(function(e,t,n){var r;for(r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:X(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=B(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=_(e);function G(){}function Y(e,t){var n,r,i,o,a,s,u,l=c[e+\" \"];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=y.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=m.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace(ve,\" \")}),a=a.slice(n.length)),b.filter)!(r=D[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?I.error(e):c(e,s).slice(0)}function Q(e){for(var t=0,n=e.length,r=\"\";t<n;t++)r+=e[t].value;return r}function J(a,e,t){var s=e.dir,u=e.next,l=u||s,c=t&&\"parentNode\"===l,f=n++;return e.first?function(e,t,n){while(e=e[s])if(1===e.nodeType||c)return a(e,t,n);return!1}:function(e,t,n){var r,i,o=[E,f];if(n){while(e=e[s])if((1===e.nodeType||c)&&a(e,t,n))return!0}else while(e=e[s])if(1===e.nodeType||c)if(i=e[S]||(e[S]={}),u&&fe(e,u))e=e[s]||e;else{if((r=i[l])&&r[0]===E&&r[1]===f)return o[2]=r[2];if((i[l]=o)[2]=a(e,t,n))return!0}return!1}}function K(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Z(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function ee(d,h,g,v,y,e){return v&&!v[S]&&(v=ee(v)),y&&!y[S]&&(y=ee(y,e)),F(function(e,t,n,r){var i,o,a,s,u=[],l=[],c=t.length,f=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)I(e,t[r],n);return n}(h||\"*\",n.nodeType?[n]:n,[]),p=!d||!e&&h?f:Z(f,u,d,n,r);if(g?g(p,s=y||(e?d:c||v)?[]:t,n,r):s=p,v){i=Z(s,l),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(s[l[o]]=!(p[l[o]]=a))}if(e){if(y||d){if(y){i=[],o=s.length;while(o--)(a=s[o])&&i.push(p[o]=a);y(null,s=[],i,r)}o=s.length;while(o--)(a=s[o])&&-1<(i=y?se.call(e,a):u[o])&&(e[i]=!(t[i]=a))}}else s=Z(s===t?s.splice(c,s.length):s),y?y(null,t,s,r):k.apply(t,s)})}function te(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[\" \"],s=o?1:0,u=J(function(e){return e===i},a,!0),l=J(function(e){return-1<se.call(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!=w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[J(K(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return ee(1<s&&K(c),1<s&&Q(e.slice(0,s-1).concat({value:\" \"===e[s-2].type?\"*\":\"\"})).replace(ve,\"$1\"),t,s<n&&te(e.slice(s,n)),n<r&&te(e=e.slice(n)),n<r&&Q(e))}c.push(t)}return K(c)}function ne(e,t){var n,v,y,m,x,r,i=[],o=[],a=u[e+\" \"];if(!a){t||(t=Y(e)),n=t.length;while(n--)(a=te(t[n]))[S]?i.push(a):o.push(a);(a=u(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l=\"0\",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG(\"*\",i),h=E+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==T||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==T||(V(o),n=!C);while(s=v[a++])if(s(o,t||T,n)){k.call(r,o);break}i&&(E=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=pe.call(r));f=Z(f)}k.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&ce.uniqueSort(r)}return i&&(E=h,w=p),c},m?F(r):r))).selector=e}return a}function re(e,t,n,r){var i,o,a,s,u,l=\"function\"==typeof e&&e,c=!r&&Y(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&\"ID\"===(a=o[0]).type&&9===t.nodeType&&C&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(O,P),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=D.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(O,P),H.test(o[0].type)&&U(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&Q(o)))return k.apply(n,r),n;break}}}return(l||ne(e,c))(r,t,!C,n,!t||H.test(e)&&U(t.parentNode)||t),n}G.prototype=b.filters=b.pseudos,b.setFilters=new G,le.sortStable=S.split(\"\").sort(l).join(\"\")===S,V(),le.sortDetached=$(function(e){return 1&e.compareDocumentPosition(T.createElement(\"fieldset\"))}),ce.find=I,ce.expr[\":\"]=ce.expr.pseudos,ce.unique=ce.uniqueSort,I.compile=ne,I.select=re,I.setDocument=V,I.tokenize=Y,I.escape=ce.escapeSelector,I.getText=ce.text,I.isXML=ce.isXMLDoc,I.selectors=ce.expr,I.support=ce.support,I.uniqueSort=ce.uniqueSort}();var d=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&ce(e).is(n))break;r.push(e)}return r},h=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},b=ce.expr.match.needsContext,w=/^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):\"string\"!=typeof n?ce.grep(e,function(e){return-1<se.call(n,e)!==r}):ce.filter(n,e,r)}ce.filter=function(e,t,n){var r=t[0];return n&&(e=\":not(\"+e+\")\"),1===t.length&&1===r.nodeType?ce.find.matchesSelector(r,e)?[r]:[]:ce.find.matches(e,ce.grep(t,function(e){return 1===e.nodeType}))},ce.fn.extend({find:function(e){var t,n,r=this.length,i=this;if(\"string\"!=typeof e)return this.pushStack(ce(e).filter(function(){for(t=0;t<r;t++)if(ce.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)ce.find(e,i[t],n);return 1<r?ce.uniqueSort(n):n},filter:function(e){return this.pushStack(T(this,e||[],!1))},not:function(e){return this.pushStack(T(this,e||[],!0))},is:function(e){return!!T(this,\"string\"==typeof e&&b.test(e)?ce(e):e||[],!1).length}});var k,S=/^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,\"string\"==typeof e){if(!(r=\"<\"===e[0]&&\">\"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(ce.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a=\"string\"!=typeof e&&ce(e);if(!b.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&ce.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?ce.uniqueSort(o):o)},index:function(e){return e?\"string\"==typeof e?se.call(ce(e),this[0]):se.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(ce.uniqueSort(ce.merge(this.get(),ce(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),ce.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return d(e,\"parentNode\")},parentsUntil:function(e,t,n){return d(e,\"parentNode\",n)},next:function(e){return A(e,\"nextSibling\")},prev:function(e){return A(e,\"previousSibling\")},nextAll:function(e){return d(e,\"nextSibling\")},prevAll:function(e){return d(e,\"previousSibling\")},nextUntil:function(e,t,n){return d(e,\"nextSibling\",n)},prevUntil:function(e,t,n){return d(e,\"previousSibling\",n)},siblings:function(e){return h((e.parentNode||{}).firstChild,e)},children:function(e){return h(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(fe(e,\"template\")&&(e=e.content||e),ce.merge([],e.childNodes))}},function(r,i){ce.fn[r]=function(e,t){var n=ce.map(this,i,e);return\"Until\"!==r.slice(-5)&&(t=e),t&&\"string\"==typeof t&&(n=ce.filter(t,n)),1<this.length&&(j[r]||ce.uniqueSort(n),E.test(r)&&n.reverse()),this.pushStack(n)}});var D=/[^\\x20\\t\\r\\n\\f]+/g;function N(e){return e}function q(e){throw e}function L(e,t,n,r){var i;try{e&&v(i=e.promise)?i.call(e).done(t).fail(n):e&&v(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}ce.Callbacks=function(r){var e,n;r=\"string\"==typeof r?(e=r,n={},ce.each(e.match(D)||[],function(e,t){n[t]=!0}),n):ce.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:\"\")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){ce.each(e,function(e,t){v(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&\"string\"!==x(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return ce.each(arguments,function(e,t){var n;while(-1<(n=ce.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<ce.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t=\"\",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=\"\"),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},ce.extend({Deferred:function(e){var o=[[\"notify\",\"progress\",ce.Callbacks(\"memory\"),ce.Callbacks(\"memory\"),2],[\"resolve\",\"done\",ce.Callbacks(\"once memory\"),ce.Callbacks(\"once memory\"),0,\"resolved\"],[\"reject\",\"fail\",ce.Callbacks(\"once memory\"),ce.Callbacks(\"once memory\"),1,\"rejected\"]],i=\"pending\",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},\"catch\":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return ce.Deferred(function(r){ce.each(o,function(e,t){var n=v(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&v(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+\"With\"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError(\"Thenable self-resolution\");t=e&&(\"object\"==typeof e||\"function\"==typeof e)&&e.then,v(t)?s?t.call(e,l(u,o,N,s),l(u,o,q,s)):(u++,t.call(e,l(u,o,N,s),l(u,o,q,s),l(u,o,N,o.notifyWith))):(a!==N&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){ce.Deferred.exceptionHook&&ce.Deferred.exceptionHook(e,t.error),u<=i+1&&(a!==q&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(ce.Deferred.getErrorHook?t.error=ce.Deferred.getErrorHook():ce.Deferred.getStackHook&&(t.error=ce.Deferred.getStackHook()),ie.setTimeout(t))}}return ce.Deferred(function(e){o[0][3].add(l(0,e,v(r)?r:N,e.notifyWith)),o[1][3].add(l(0,e,v(t)?t:N)),o[2][3].add(l(0,e,v(n)?n:q))}).promise()},promise:function(e){return null!=e?ce.extend(e,a):a}},s={};return ce.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+\"With\"](this===s?void 0:this,arguments),this},s[t[0]+\"With\"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=ae.call(arguments),o=ce.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?ae.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(L(e,o.done(a(t)).resolve,o.reject,!n),\"pending\"===o.state()||v(i[t]&&i[t].then)))return o.then();while(t--)L(i[t],a(t),o.reject);return o.promise()}});var H=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;ce.Deferred.exceptionHook=function(e,t){ie.console&&ie.console.warn&&e&&H.test(e.name)&&ie.console.warn(\"jQuery.Deferred exception: \"+e.message,e.stack,t)},ce.readyException=function(e){ie.setTimeout(function(){throw e})};var O=ce.Deferred();function P(){C.removeEventListener(\"DOMContentLoaded\",P),ie.removeEventListener(\"load\",P),ce.ready()}ce.fn.ready=function(e){return O.then(e)[\"catch\"](function(e){ce.readyException(e)}),this},ce.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--ce.readyWait:ce.isReady)||(ce.isReady=!0)!==e&&0<--ce.readyWait||O.resolveWith(C,[ce])}}),ce.ready.then=O.then,\"complete\"===C.readyState||\"loading\"!==C.readyState&&!C.documentElement.doScroll?ie.setTimeout(ce.ready):(C.addEventListener(\"DOMContentLoaded\",P),ie.addEventListener(\"load\",P));var M=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if(\"object\"===x(n))for(s in i=!0,n)M(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,v(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(ce(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},R=/^-ms-/,I=/-([a-z])/g;function W(e,t){return t.toUpperCase()}function F(e){return e.replace(R,\"ms-\").replace(I,W)}var $=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function B(){this.expando=ce.expando+B.uid++}B.uid=1,B.prototype={cache:function(e){var t=e[this.expando];return t||(t={},$(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if(\"string\"==typeof t)i[F(t)]=n;else for(r in t)i[F(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][F(t)]},access:function(e,t,n){return void 0===t||t&&\"string\"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(F):(t=F(t))in r?[t]:t.match(D)||[]).length;while(n--)delete r[t[n]]}(void 0===t||ce.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!ce.isEmptyObject(t)}};var _=new B,z=new B,X=/^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,U=/[A-Z]/g;function V(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r=\"data-\"+t.replace(U,\"-$&\").toLowerCase(),\"string\"==typeof(n=e.getAttribute(r))){try{n=\"true\"===(i=n)||\"false\"!==i&&(\"null\"===i?null:i===+i+\"\"?+i:X.test(i)?JSON.parse(i):i)}catch(e){}z.set(e,t,n)}else n=void 0;return n}ce.extend({hasData:function(e){return z.hasData(e)||_.hasData(e)},data:function(e,t,n){return z.access(e,t,n)},removeData:function(e,t){z.remove(e,t)},_data:function(e,t,n){return _.access(e,t,n)},_removeData:function(e,t){_.remove(e,t)}}),ce.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=z.get(o),1===o.nodeType&&!_.get(o,\"hasDataAttrs\"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf(\"data-\")&&(r=F(r.slice(5)),V(o,r,i[r]));_.set(o,\"hasDataAttrs\",!0)}return i}return\"object\"==typeof n?this.each(function(){z.set(this,n)}):M(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=z.get(o,n))?t:void 0!==(t=V(o,n))?t:void 0;this.each(function(){z.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){z.remove(this,e)})}}),ce.extend({queue:function(e,t,n){var r;if(e)return t=(t||\"fx\")+\"queue\",r=_.get(e,t),n&&(!r||Array.isArray(n)?r=_.access(e,t,ce.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||\"fx\";var n=ce.queue(e,t),r=n.length,i=n.shift(),o=ce._queueHooks(e,t);\"inprogress\"===i&&(i=n.shift(),r--),i&&(\"fx\"===t&&n.unshift(\"inprogress\"),delete o.stop,i.call(e,function(){ce.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+\"queueHooks\";return _.get(e,n)||_.access(e,n,{empty:ce.Callbacks(\"once memory\").add(function(){_.remove(e,[t+\"queue\",n])})})}}),ce.fn.extend({queue:function(t,n){var e=2;return\"string\"!=typeof t&&(n=t,t=\"fx\",e--),arguments.length<e?ce.queue(this[0],t):void 0===n?this:this.each(function(){var e=ce.queue(this,t,n);ce._queueHooks(this,t),\"fx\"===t&&\"inprogress\"!==e[0]&&ce.dequeue(this,t)})},dequeue:function(e){return this.each(function(){ce.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||\"fx\",[])},promise:function(e,t){var n,r=1,i=ce.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};\"string\"!=typeof e&&(t=e,e=void 0),e=e||\"fx\";while(a--)(n=_.get(o[a],e+\"queueHooks\"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var G=/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,Y=new RegExp(\"^(?:([+-])=|)(\"+G+\")([a-z%]*)$\",\"i\"),Q=[\"Top\",\"Right\",\"Bottom\",\"Left\"],J=C.documentElement,K=function(e){return ce.contains(e.ownerDocument,e)},Z={composed:!0};J.getRootNode&&(K=function(e){return ce.contains(e.ownerDocument,e)||e.getRootNode(Z)===e.ownerDocument});var ee=function(e,t){return\"none\"===(e=t||e).style.display||\"\"===e.style.display&&K(e)&&\"none\"===ce.css(e,\"display\")};function te(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return ce.css(e,t,\"\")},u=s(),l=n&&n[3]||(ce.cssNumber[t]?\"\":\"px\"),c=e.nodeType&&(ce.cssNumber[t]||\"px\"!==l&&+u)&&Y.exec(ce.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)ce.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,ce.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ne={};function re(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?(\"none\"===n&&(l[c]=_.get(r,\"display\")||null,l[c]||(r.style.display=\"\")),\"\"===r.style.display&&ee(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ne[s])||(o=a.body.appendChild(a.createElement(s)),u=ce.css(o,\"display\"),o.parentNode.removeChild(o),\"none\"===u&&(u=\"block\"),ne[s]=u)))):\"none\"!==n&&(l[c]=\"none\",_.set(r,\"display\",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}ce.fn.extend({show:function(){return re(this,!0)},hide:function(){return re(this)},toggle:function(e){return\"boolean\"==typeof e?e?this.show():this.hide():this.each(function(){ee(this)?ce(this).show():ce(this).hide()})}});var xe,be,we=/^(?:checkbox|radio)$/i,Te=/<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i,Ce=/^$|^module$|\\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement(\"div\")),(be=C.createElement(\"input\")).setAttribute(\"type\",\"radio\"),be.setAttribute(\"checked\",\"checked\"),be.setAttribute(\"name\",\"t\"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML=\"<textarea>x</textarea>\",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML=\"<option></option>\",le.option=!!xe.lastChild;var ke={thead:[1,\"<table>\",\"</table>\"],col:[2,\"<table><colgroup>\",\"</colgroup></table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],_default:[0,\"\",\"\"]};function Se(e,t){var n;return n=\"undefined\"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||\"*\"):\"undefined\"!=typeof e.querySelectorAll?e.querySelectorAll(t||\"*\"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n<r;n++)_.set(e[n],\"globalEval\",!t||_.get(t[n],\"globalEval\"))}ke.tbody=ke.tfoot=ke.colgroup=ke.caption=ke.thead,ke.th=ke.td,le.option||(ke.optgroup=ke.option=[1,\"<select multiple='multiple'>\",\"</select>\"]);var je=/<|&#?\\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if(\"object\"===x(o))ce.merge(p,o.nodeType?[o]:o);else if(je.test(o)){a=a||f.appendChild(t.createElement(\"div\")),s=(Te.exec(o)||[\"\",\"\"])[1].toLowerCase(),u=ke[s]||ke._default,a.innerHTML=u[1]+ce.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;ce.merge(p,a.childNodes),(a=f.firstChild).textContent=\"\"}else p.push(t.createTextNode(o));f.textContent=\"\",d=0;while(o=p[d++])if(r&&-1<ce.inArray(o,r))i&&i.push(o);else if(l=K(o),a=Se(f.appendChild(o),\"script\"),l&&Ee(a),n){c=0;while(o=a[c++])Ce.test(o.type||\"\")&&n.push(o)}return f}var De=/^([^.]*)(?:\\.(.+)|)/;function Ne(){return!0}function qe(){return!1}function Le(e,t,n,r,i,o){var a,s;if(\"object\"==typeof t){for(s in\"string\"!=typeof n&&(r=r||n,n=void 0),t)Le(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&(\"string\"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=qe;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return ce().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=ce.guid++)),e.each(function(){ce.event.add(this,t,i,r,n)})}function He(e,r,t){t?(_.set(e,r,!1),ce.event.add(e,r,{namespace:!1,handler:function(e){var t,n=_.get(this,r);if(1&e.isTrigger&&this[r]){if(n)(ce.event.special[r]||{}).delegateType&&e.stopPropagation();else if(n=ae.call(arguments),_.set(this,r,n),this[r](),t=_.get(this,r),_.set(this,r,!1),n!==t)return e.stopImmediatePropagation(),e.preventDefault(),t}else n&&(_.set(this,r,ce.event.trigger(n[0],n.slice(1),this)),e.stopPropagation(),e.isImmediatePropagationStopped=Ne)}})):void 0===_.get(e,r)&&ce.event.add(e,r,Ne)}ce.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=_.get(t);if($(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&ce.find.matchesSelector(J,i),n.guid||(n.guid=ce.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return\"undefined\"!=typeof ce&&ce.event.triggered!==e.type?ce.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||\"\").match(D)||[\"\"]).length;while(l--)d=g=(s=De.exec(e[l])||[])[1],h=(s[2]||\"\").split(\".\").sort(),d&&(f=ce.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=ce.event.special[d]||{},c=ce.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&ce.expr.match.needsContext.test(i),namespace:h.join(\".\")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),ce.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=_.hasData(e)&&_.get(e);if(v&&(u=v.events)){l=(t=(t||\"\").match(D)||[\"\"]).length;while(l--)if(d=g=(s=De.exec(t[l])||[])[1],h=(s[2]||\"\").split(\".\").sort(),d){f=ce.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp(\"(^|\\\\.)\"+h.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&(\"**\"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||ce.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)ce.event.remove(e,d+t[l],n,r,!0);ce.isEmptyObject(u)&&_.remove(e,\"handle events\")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=ce.event.fix(e),l=(_.get(this,\"events\")||Object.create(null))[u.type]||[],c=ce.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=ce.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((ce.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!(\"click\"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&(\"click\"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+\" \"]&&(a[i]=r.needsContext?-1<ce(i,this).index(l):ce.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(ce.Event.prototype,t,{enumerable:!0,configurable:!0,get:v(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[ce.expando]?e:new ce.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return we.test(t.type)&&t.click&&fe(t,\"input\")&&He(t,\"click\",!0),!1},trigger:function(e){var t=this||e;return we.test(t.type)&&t.click&&fe(t,\"input\")&&He(t,\"click\"),!0},_default:function(e){var t=e.target;return we.test(t.type)&&t.click&&fe(t,\"input\")&&_.get(t,\"click\")||fe(t,\"a\")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},ce.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},ce.Event=function(e,t){if(!(this instanceof ce.Event))return new ce.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ne:qe,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&ce.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[ce.expando]=!0},ce.Event.prototype={constructor:ce.Event,isDefaultPrevented:qe,isPropagationStopped:qe,isImmediatePropagationStopped:qe,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ne,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ne,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ne,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},ce.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,\"char\":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},ce.event.addProp),ce.each({focus:\"focusin\",blur:\"focusout\"},function(r,i){function o(e){if(C.documentMode){var t=_.get(this,\"handle\"),n=ce.event.fix(e);n.type=\"focusin\"===e.type?\"focus\":\"blur\",n.isSimulated=!0,t(e),n.target===n.currentTarget&&t(n)}else ce.event.simulate(i,e.target,ce.event.fix(e))}ce.event.special[r]={setup:function(){var e;if(He(this,r,!0),!C.documentMode)return!1;(e=_.get(this,i))||this.addEventListener(i,o),_.set(this,i,(e||0)+1)},trigger:function(){return He(this,r),!0},teardown:function(){var e;if(!C.documentMode)return!1;(e=_.get(this,i)-1)?_.set(this,i,e):(this.removeEventListener(i,o),_.remove(this,i))},_default:function(e){return _.get(e.target,r)},delegateType:i},ce.event.special[i]={setup:function(){var e=this.ownerDocument||this.document||this,t=C.documentMode?this:e,n=_.get(t,i);n||(C.documentMode?this.addEventListener(i,o):e.addEventListener(r,o,!0)),_.set(t,i,(n||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=C.documentMode?this:e,n=_.get(t,i)-1;n?_.set(t,i,n):(C.documentMode?this.removeEventListener(i,o):e.removeEventListener(r,o,!0),_.remove(t,i))}}}),ce.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\",pointerenter:\"pointerover\",pointerleave:\"pointerout\"},function(e,i){ce.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||ce.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),ce.fn.extend({on:function(e,t,n,r){return Le(this,e,t,n,r)},one:function(e,t,n,r){return Le(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,ce(e.delegateTarget).off(r.namespace?r.origType+\".\"+r.namespace:r.origType,r.selector,r.handler),this;if(\"object\"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&\"function\"!=typeof t||(n=t,t=void 0),!1===n&&(n=qe),this.each(function(){ce.event.remove(this,e,n,t)})}});var Oe=/<script|<style|<link/i,Pe=/checked\\s*(?:[^=]|=\\s*.checked.)/i,Me=/^\\s*<!\\[CDATA\\[|\\]\\]>\\s*$/g;function Re(e,t){return fe(e,\"table\")&&fe(11!==t.nodeType?t:t.firstChild,\"tr\")&&ce(e).children(\"tbody\")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute(\"type\"))+\"/\"+e.type,e}function We(e){return\"true/\"===(e.type||\"\").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute(\"type\"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,\"handle events\"),s)for(n=0,r=s[i].length;n<r;n++)ce.event.add(t,i,s[i][n]);z.hasData(e)&&(o=z.access(e),a=ce.extend({},o),z.set(t,a))}}function $e(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=v(d);if(h||1<f&&\"string\"==typeof d&&!le.checkClone&&Pe.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),$e(t,r,i,o)});if(f&&(t=(e=Ae(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=ce.map(Se(e,\"script\"),Ie)).length;c<f;c++)u=e,c!==p&&(u=ce.clone(u,!0,!0),s&&ce.merge(a,Se(u,\"script\"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,ce.map(a,We),c=0;c<s;c++)u=a[c],Ce.test(u.type||\"\")&&!_.access(u,\"globalEval\")&&ce.contains(l,u)&&(u.src&&\"module\"!==(u.type||\"\").toLowerCase()?ce._evalUrl&&!u.noModule&&ce._evalUrl(u.src,{nonce:u.nonce||u.getAttribute(\"nonce\")},l):m(u.textContent.replace(Me,\"\"),u,l))}return n}function Be(e,t,n){for(var r,i=t?ce.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||ce.cleanData(Se(r)),r.parentNode&&(n&&K(r)&&Ee(Se(r,\"script\")),r.parentNode.removeChild(r));return e}ce.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=K(e);if(!(le.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||ce.isXMLDoc(e)))for(a=Se(c),r=0,i=(o=Se(e)).length;r<i;r++)s=o[r],u=a[r],void 0,\"input\"===(l=u.nodeName.toLowerCase())&&we.test(s.type)?u.checked=s.checked:\"input\"!==l&&\"textarea\"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||Se(e),a=a||Se(c),r=0,i=o.length;r<i;r++)Fe(o[r],a[r]);else Fe(e,c);return 0<(a=Se(c,\"script\")).length&&Ee(a,!f&&Se(e,\"script\")),c},cleanData:function(e){for(var t,n,r,i=ce.event.special,o=0;void 0!==(n=e[o]);o++)if($(n)){if(t=n[_.expando]){if(t.events)for(r in t.events)i[r]?ce.event.remove(n,r):ce.removeEvent(n,r,t.handle);n[_.expando]=void 0}n[z.expando]&&(n[z.expando]=void 0)}}}),ce.fn.extend({detach:function(e){return Be(this,e,!0)},remove:function(e){return Be(this,e)},text:function(e){return M(this,function(e){return void 0===e?ce.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return $e(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Re(this,e).appendChild(e)})},prepend:function(){return $e(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Re(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return $e(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return $e(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(ce.cleanData(Se(e,!1)),e.textContent=\"\");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return ce.clone(this,e,t)})},html:function(e){return M(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if(\"string\"==typeof e&&!Oe.test(e)&&!ke[(Te.exec(e)||[\"\",\"\"])[1].toLowerCase()]){e=ce.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(ce.cleanData(Se(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return $e(this,arguments,function(e){var t=this.parentNode;ce.inArray(this,n)<0&&(ce.cleanData(Se(this)),t&&t.replaceChild(e,this))},n)}}),ce.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(e,a){ce.fn[e]=function(e){for(var t,n=[],r=ce(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),ce(r[o])[a](t),s.apply(n,t.get());return this.pushStack(n)}});var _e=new RegExp(\"^(\"+G+\")(?!px)[a-z%]+$\",\"i\"),ze=/^--/,Xe=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=ie),t.getComputedStyle(e)},Ue=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ve=new RegExp(Q.join(\"|\"),\"i\");function Ge(e,t,n){var r,i,o,a,s=ze.test(t),u=e.style;return(n=n||Xe(e))&&(a=n.getPropertyValue(t)||n[t],s&&a&&(a=a.replace(ve,\"$1\")||void 0),\"\"!==a||K(e)||(a=ce.style(e,t)),!le.pixelBoxStyles()&&_e.test(a)&&Ve.test(t)&&(r=u.width,i=u.minWidth,o=u.maxWidth,u.minWidth=u.maxWidth=u.width=a,a=n.width,u.width=r,u.minWidth=i,u.maxWidth=o)),void 0!==a?a+\"\":a}function Ye(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText=\"position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0\",l.style.cssText=\"position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%\",J.appendChild(u).appendChild(l);var e=ie.getComputedStyle(l);n=\"1%\"!==e.top,s=12===t(e.marginLeft),l.style.right=\"60%\",o=36===t(e.right),r=36===t(e.width),l.style.position=\"absolute\",i=12===t(l.offsetWidth/3),J.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=C.createElement(\"div\"),l=C.createElement(\"div\");l.style&&(l.style.backgroundClip=\"content-box\",l.cloneNode(!0).style.backgroundClip=\"\",le.clearCloneStyle=\"content-box\"===l.style.backgroundClip,ce.extend(le,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=C.createElement(\"table\"),t=C.createElement(\"tr\"),n=C.createElement(\"div\"),e.style.cssText=\"position:absolute;left:-11111px;border-collapse:separate\",t.style.cssText=\"box-sizing:content-box;border:1px solid\",t.style.height=\"1px\",n.style.height=\"9px\",n.style.display=\"block\",J.appendChild(e).appendChild(t).appendChild(n),r=ie.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,J.removeChild(e)),a}}))}();var Qe=[\"Webkit\",\"Moz\",\"ms\"],Je=C.createElement(\"div\").style,Ke={};function Ze(e){var t=ce.cssProps[e]||Ke[e];return t||(e in Je?e:Ke[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Qe.length;while(n--)if((e=Qe[n]+t)in Je)return e}(e)||e)}var et=/^(none|table(?!-c[ea]).+)/,tt={position:\"absolute\",visibility:\"hidden\",display:\"block\"},nt={letterSpacing:\"0\",fontWeight:\"400\"};function rt(e,t,n){var r=Y.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||\"px\"):t}function it(e,t,n,r,i,o){var a=\"width\"===t?1:0,s=0,u=0,l=0;if(n===(r?\"border\":\"content\"))return 0;for(;a<4;a+=2)\"margin\"===n&&(l+=ce.css(e,n+Q[a],!0,i)),r?(\"content\"===n&&(u-=ce.css(e,\"padding\"+Q[a],!0,i)),\"margin\"!==n&&(u-=ce.css(e,\"border\"+Q[a]+\"Width\",!0,i))):(u+=ce.css(e,\"padding\"+Q[a],!0,i),\"padding\"!==n?u+=ce.css(e,\"border\"+Q[a]+\"Width\",!0,i):s+=ce.css(e,\"border\"+Q[a]+\"Width\",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e[\"offset\"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u+l}function ot(e,t,n){var r=Xe(e),i=(!le.boxSizingReliable()||n)&&\"border-box\"===ce.css(e,\"boxSizing\",!1,r),o=i,a=Ge(e,t,r),s=\"offset\"+t[0].toUpperCase()+t.slice(1);if(_e.test(a)){if(!n)return a;a=\"auto\"}return(!le.boxSizingReliable()&&i||!le.reliableTrDimensions()&&fe(e,\"tr\")||\"auto\"===a||!parseFloat(a)&&\"inline\"===ce.css(e,\"display\",!1,r))&&e.getClientRects().length&&(i=\"border-box\"===ce.css(e,\"boxSizing\",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+it(e,t,n||(i?\"border\":\"content\"),o,r,a)+\"px\"}function at(e,t,n,r,i){return new at.prototype.init(e,t,n,r,i)}ce.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Ge(e,\"opacity\");return\"\"===n?\"1\":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=F(t),u=ze.test(t),l=e.style;if(u||(t=Ze(s)),a=ce.cssHooks[t]||ce.cssHooks[s],void 0===n)return a&&\"get\"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];\"string\"===(o=typeof n)&&(i=Y.exec(n))&&i[1]&&(n=te(e,t,i),o=\"number\"),null!=n&&n==n&&(\"number\"!==o||u||(n+=i&&i[3]||(ce.cssNumber[s]?\"\":\"px\")),le.clearCloneStyle||\"\"!==n||0!==t.indexOf(\"background\")||(l[t]=\"inherit\"),a&&\"set\"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=F(t);return ze.test(t)||(t=Ze(s)),(a=ce.cssHooks[t]||ce.cssHooks[s])&&\"get\"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Ge(e,t,r)),\"normal\"===i&&t in nt&&(i=nt[t]),\"\"===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),ce.each([\"height\",\"width\"],function(e,u){ce.cssHooks[u]={get:function(e,t,n){if(t)return!et.test(ce.css(e,\"display\"))||e.getClientRects().length&&e.getBoundingClientRect().width?ot(e,u,n):Ue(e,tt,function(){return ot(e,u,n)})},set:function(e,t,n){var r,i=Xe(e),o=!le.scrollboxSize()&&\"absolute\"===i.position,a=(o||n)&&\"border-box\"===ce.css(e,\"boxSizing\",!1,i),s=n?it(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e[\"offset\"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-it(e,u,\"border\",!1,i)-.5)),s&&(r=Y.exec(t))&&\"px\"!==(r[3]||\"px\")&&(e.style[u]=t,t=ce.css(e,u)),rt(0,t,s)}}}),ce.cssHooks.marginLeft=Ye(le.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Ge(e,\"marginLeft\"))||e.getBoundingClientRect().left-Ue(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+\"px\"}),ce.each({margin:\"\",padding:\"\",border:\"Width\"},function(i,o){ce.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r=\"string\"==typeof e?e.split(\" \"):[e];t<4;t++)n[i+Q[t]+o]=r[t]||r[t-2]||r[0];return n}},\"margin\"!==i&&(ce.cssHooks[i+o].set=rt)}),ce.fn.extend({css:function(e,t){return M(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Xe(e),i=t.length;a<i;a++)o[t[a]]=ce.css(e,t[a],!1,r);return o}return void 0!==n?ce.style(e,t,n):ce.css(e,t)},e,t,1<arguments.length)}}),((ce.Tween=at).prototype={constructor:at,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||ce.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(ce.cssNumber[n]?\"\":\"px\")},cur:function(){var e=at.propHooks[this.prop];return e&&e.get?e.get(this):at.propHooks._default.get(this)},run:function(e){var t,n=at.propHooks[this.prop];return this.options.duration?this.pos=t=ce.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):at.propHooks._default.set(this),this}}).init.prototype=at.prototype,(at.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=ce.css(e.elem,e.prop,\"\"))&&\"auto\"!==t?t:0},set:function(e){ce.fx.step[e.prop]?ce.fx.step[e.prop](e):1!==e.elem.nodeType||!ce.cssHooks[e.prop]&&null==e.elem.style[Ze(e.prop)]?e.elem[e.prop]=e.now:ce.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=at.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},ce.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:\"swing\"},ce.fx=at.prototype.init,ce.fx.step={};var st,ut,lt,ct,ft=/^(?:toggle|show|hide)$/,pt=/queueHooks$/;function dt(){ut&&(!1===C.hidden&&ie.requestAnimationFrame?ie.requestAnimationFrame(dt):ie.setTimeout(dt,ce.fx.interval),ce.fx.tick())}function ht(){return ie.setTimeout(function(){st=void 0}),st=Date.now()}function gt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i[\"margin\"+(n=Q[r])]=i[\"padding\"+n]=e;return t&&(i.opacity=i.width=e),i}function vt(e,t,n){for(var r,i=(yt.tweeners[t]||[]).concat(yt.tweeners[\"*\"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function yt(o,e,t){var n,a,r=0,i=yt.prefilters.length,s=ce.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=st||ht(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:ce.extend({},e),opts:ce.extend(!0,{specialEasing:{},easing:ce.easing._default},t),originalProperties:e,originalOptions:t,startTime:st||ht(),duration:t.duration,tweens:[],createTween:function(e,t){var n=ce.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=F(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=ce.cssHooks[r])&&\"expand\"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=yt.prefilters[r].call(l,o,c,l.opts))return v(n.stop)&&(ce._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return ce.map(c,vt,l),v(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),ce.fx.timer(ce.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}ce.Animation=ce.extend(yt,{tweeners:{\"*\":[function(e,t){var n=this.createTween(e,t);return te(n.elem,e,Y.exec(t),n),n}]},tweener:function(e,t){v(e)?(t=e,e=[\"*\"]):e=e.match(D);for(var n,r=0,i=e.length;r<i;r++)n=e[r],yt.tweeners[n]=yt.tweeners[n]||[],yt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f=\"width\"in t||\"height\"in t,p=this,d={},h=e.style,g=e.nodeType&&ee(e),v=_.get(e,\"fxshow\");for(r in n.queue||(null==(a=ce._queueHooks(e,\"fx\")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,ce.queue(e,\"fx\").length||a.empty.fire()})})),t)if(i=t[r],ft.test(i)){if(delete t[r],o=o||\"toggle\"===i,i===(g?\"hide\":\"show\")){if(\"show\"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||ce.style(e,r)}if((u=!ce.isEmptyObject(t))||!ce.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=_.get(e,\"display\")),\"none\"===(c=ce.css(e,\"display\"))&&(l?c=l:(re([e],!0),l=e.style.display||l,c=ce.css(e,\"display\"),re([e]))),(\"inline\"===c||\"inline-block\"===c&&null!=l)&&\"none\"===ce.css(e,\"float\")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l=\"none\"===c?\"\":c)),h.display=\"inline-block\")),n.overflow&&(h.overflow=\"hidden\",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?\"hidden\"in v&&(g=v.hidden):v=_.access(e,\"fxshow\",{display:l}),o&&(v.hidden=!g),g&&re([e],!0),p.done(function(){for(r in g||re([e]),_.remove(e,\"fxshow\"),d)ce.style(e,r,d[r])})),u=vt(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?yt.prefilters.unshift(e):yt.prefilters.push(e)}}),ce.speed=function(e,t,n){var r=e&&\"object\"==typeof e?ce.extend({},e):{complete:n||!n&&t||v(e)&&e,duration:e,easing:n&&t||t&&!v(t)&&t};return ce.fx.off?r.duration=0:\"number\"!=typeof r.duration&&(r.duration in ce.fx.speeds?r.duration=ce.fx.speeds[r.duration]:r.duration=ce.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue=\"fx\"),r.old=r.complete,r.complete=function(){v(r.old)&&r.old.call(this),r.queue&&ce.dequeue(this,r.queue)},r},ce.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ee).css(\"opacity\",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=ce.isEmptyObject(t),o=ce.speed(e,n,r),a=function(){var e=yt(this,ce.extend({},t),o);(i||_.get(this,\"finish\"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return\"string\"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||\"fx\",[]),this.each(function(){var e=!0,t=null!=i&&i+\"queueHooks\",n=ce.timers,r=_.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&pt.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||ce.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||\"fx\"),this.each(function(){var e,t=_.get(this),n=t[a+\"queue\"],r=t[a+\"queueHooks\"],i=ce.timers,o=n?n.length:0;for(t.finish=!0,ce.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),ce.each([\"toggle\",\"show\",\"hide\"],function(e,r){var i=ce.fn[r];ce.fn[r]=function(e,t,n){return null==e||\"boolean\"==typeof e?i.apply(this,arguments):this.animate(gt(r,!0),e,t,n)}}),ce.each({slideDown:gt(\"show\"),slideUp:gt(\"hide\"),slideToggle:gt(\"toggle\"),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(e,r){ce.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),ce.timers=[],ce.fx.tick=function(){var e,t=0,n=ce.timers;for(st=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||ce.fx.stop(),st=void 0},ce.fx.timer=function(e){ce.timers.push(e),ce.fx.start()},ce.fx.interval=13,ce.fx.start=function(){ut||(ut=!0,dt())},ce.fx.stop=function(){ut=null},ce.fx.speeds={slow:600,fast:200,_default:400},ce.fn.delay=function(r,e){return r=ce.fx&&ce.fx.speeds[r]||r,e=e||\"fx\",this.queue(e,function(e,t){var n=ie.setTimeout(e,r);t.stop=function(){ie.clearTimeout(n)}})},lt=C.createElement(\"input\"),ct=C.createElement(\"select\").appendChild(C.createElement(\"option\")),lt.type=\"checkbox\",le.checkOn=\"\"!==lt.value,le.optSelected=ct.selected,(lt=C.createElement(\"input\")).value=\"t\",lt.type=\"radio\",le.radioValue=\"t\"===lt.value;var mt,xt=ce.expr.attrHandle;ce.fn.extend({attr:function(e,t){return M(this,ce.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){ce.removeAttr(this,e)})}}),ce.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return\"undefined\"==typeof e.getAttribute?ce.prop(e,t,n):(1===o&&ce.isXMLDoc(e)||(i=ce.attrHooks[t.toLowerCase()]||(ce.expr.match.bool.test(t)?mt:void 0)),void 0!==n?null===n?void ce.removeAttr(e,t):i&&\"set\"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+\"\"),n):i&&\"get\"in i&&null!==(r=i.get(e,t))?r:null==(r=ce.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!le.radioValue&&\"radio\"===t&&fe(e,\"input\")){var n=e.value;return e.setAttribute(\"type\",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(D);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),mt={set:function(e,t,n){return!1===t?ce.removeAttr(e,n):e.setAttribute(n,n),n}},ce.each(ce.expr.match.bool.source.match(/\\w+/g),function(e,t){var a=xt[t]||ce.find.attr;xt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=xt[o],xt[o]=r,r=null!=a(e,t,n)?o:null,xt[o]=i),r}});var bt=/^(?:input|select|textarea|button)$/i,wt=/^(?:a|area)$/i;function Tt(e){return(e.match(D)||[]).join(\" \")}function Ct(e){return e.getAttribute&&e.getAttribute(\"class\")||\"\"}function kt(e){return Array.isArray(e)?e:\"string\"==typeof e&&e.match(D)||[]}ce.fn.extend({prop:function(e,t){return M(this,ce.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[ce.propFix[e]||e]})}}),ce.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&ce.isXMLDoc(e)||(t=ce.propFix[t]||t,i=ce.propHooks[t]),void 0!==n?i&&\"set\"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&\"get\"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=ce.find.attr(e,\"tabindex\");return t?parseInt(t,10):bt.test(e.nodeName)||wt.test(e.nodeName)&&e.href?0:-1}}},propFix:{\"for\":\"htmlFor\",\"class\":\"className\"}}),le.optSelected||(ce.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),ce.each([\"tabIndex\",\"readOnly\",\"maxLength\",\"cellSpacing\",\"cellPadding\",\"rowSpan\",\"colSpan\",\"useMap\",\"frameBorder\",\"contentEditable\"],function(){ce.propFix[this.toLowerCase()]=this}),ce.fn.extend({addClass:function(t){var e,n,r,i,o,a;return v(t)?this.each(function(e){ce(this).addClass(t.call(this,e,Ct(this)))}):(e=kt(t)).length?this.each(function(){if(r=Ct(this),n=1===this.nodeType&&\" \"+Tt(r)+\" \"){for(o=0;o<e.length;o++)i=e[o],n.indexOf(\" \"+i+\" \")<0&&(n+=i+\" \");a=Tt(n),r!==a&&this.setAttribute(\"class\",a)}}):this},removeClass:function(t){var e,n,r,i,o,a;return v(t)?this.each(function(e){ce(this).removeClass(t.call(this,e,Ct(this)))}):arguments.length?(e=kt(t)).length?this.each(function(){if(r=Ct(this),n=1===this.nodeType&&\" \"+Tt(r)+\" \"){for(o=0;o<e.length;o++){i=e[o];while(-1<n.indexOf(\" \"+i+\" \"))n=n.replace(\" \"+i+\" \",\" \")}a=Tt(n),r!==a&&this.setAttribute(\"class\",a)}}):this:this.attr(\"class\",\"\")},toggleClass:function(t,n){var e,r,i,o,a=typeof t,s=\"string\"===a||Array.isArray(t);return v(t)?this.each(function(e){ce(this).toggleClass(t.call(this,e,Ct(this),n),n)}):\"boolean\"==typeof n&&s?n?this.addClass(t):this.removeClass(t):(e=kt(t),this.each(function(){if(s)for(o=ce(this),i=0;i<e.length;i++)r=e[i],o.hasClass(r)?o.removeClass(r):o.addClass(r);else void 0!==t&&\"boolean\"!==a||((r=Ct(this))&&_.set(this,\"__className__\",r),this.setAttribute&&this.setAttribute(\"class\",r||!1===t?\"\":_.get(this,\"__className__\")||\"\"))}))},hasClass:function(e){var t,n,r=0;t=\" \"+e+\" \";while(n=this[r++])if(1===n.nodeType&&-1<(\" \"+Tt(Ct(n))+\" \").indexOf(t))return!0;return!1}});var St=/\\r/g;ce.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=v(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,ce(this).val()):n)?t=\"\":\"number\"==typeof t?t+=\"\":Array.isArray(t)&&(t=ce.map(t,function(e){return null==e?\"\":e+\"\"})),(r=ce.valHooks[this.type]||ce.valHooks[this.nodeName.toLowerCase()])&&\"set\"in r&&void 0!==r.set(this,t,\"value\")||(this.value=t))})):t?(r=ce.valHooks[t.type]||ce.valHooks[t.nodeName.toLowerCase()])&&\"get\"in r&&void 0!==(e=r.get(t,\"value\"))?e:\"string\"==typeof(e=t.value)?e.replace(St,\"\"):null==e?\"\":e:void 0}}),ce.extend({valHooks:{option:{get:function(e){var t=ce.find.attr(e,\"value\");return null!=t?t:Tt(ce.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a=\"select-one\"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!fe(n.parentNode,\"optgroup\"))){if(t=ce(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=ce.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<ce.inArray(ce.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),ce.each([\"radio\",\"checkbox\"],function(){ce.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<ce.inArray(ce(e).val(),t)}},le.checkOn||(ce.valHooks[this].get=function(e){return null===e.getAttribute(\"value\")?\"on\":e.value})});var Et=ie.location,jt={guid:Date.now()},At=/\\?/;ce.parseXML=function(e){var t,n;if(!e||\"string\"!=typeof e)return null;try{t=(new ie.DOMParser).parseFromString(e,\"text/xml\")}catch(e){}return n=t&&t.getElementsByTagName(\"parsererror\")[0],t&&!n||ce.error(\"Invalid XML: \"+(n?ce.map(n.childNodes,function(e){return e.textContent}).join(\"\\n\"):e)),t};var Dt=/^(?:focusinfocus|focusoutblur)$/,Nt=function(e){e.stopPropagation()};ce.extend(ce.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||C],d=ue.call(e,\"type\")?e.type:e,h=ue.call(e,\"namespace\")?e.namespace.split(\".\"):[];if(o=f=a=n=n||C,3!==n.nodeType&&8!==n.nodeType&&!Dt.test(d+ce.event.triggered)&&(-1<d.indexOf(\".\")&&(d=(h=d.split(\".\")).shift(),h.sort()),u=d.indexOf(\":\")<0&&\"on\"+d,(e=e[ce.expando]?e:new ce.Event(d,\"object\"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join(\".\"),e.rnamespace=e.namespace?new RegExp(\"(^|\\\\.)\"+h.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:ce.makeArray(t,[e]),c=ce.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!y(n)){for(s=c.delegateType||d,Dt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||C)&&p.push(a.defaultView||a.parentWindow||ie)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(_.get(o,\"events\")||Object.create(null))[e.type]&&_.get(o,\"handle\"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&$(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!$(n)||u&&v(n[d])&&!y(n)&&((a=n[u])&&(n[u]=null),ce.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,Nt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,Nt),ce.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=ce.extend(new ce.Event,n,{type:e,isSimulated:!0});ce.event.trigger(r,null,t)}}),ce.fn.extend({trigger:function(e,t){return this.each(function(){ce.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return ce.event.trigger(e,t,n,!0)}});var qt=/\\[\\]$/,Lt=/\\r?\\n/g,Ht=/^(?:submit|button|image|reset|file)$/i,Ot=/^(?:input|select|textarea|keygen)/i;function Pt(n,e,r,i){var t;if(Array.isArray(e))ce.each(e,function(e,t){r||qt.test(n)?i(n,t):Pt(n+\"[\"+(\"object\"==typeof t&&null!=t?e:\"\")+\"]\",t,r,i)});else if(r||\"object\"!==x(e))i(n,e);else for(t in e)Pt(n+\"[\"+t+\"]\",e[t],r,i)}ce.param=function(e,t){var n,r=[],i=function(e,t){var n=v(t)?t():t;r[r.length]=encodeURIComponent(e)+\"=\"+encodeURIComponent(null==n?\"\":n)};if(null==e)return\"\";if(Array.isArray(e)||e.jquery&&!ce.isPlainObject(e))ce.each(e,function(){i(this.name,this.value)});else for(n in e)Pt(n,e[n],t,i);return r.join(\"&\")},ce.fn.extend({serialize:function(){return ce.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=ce.prop(this,\"elements\");return e?ce.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!ce(this).is(\":disabled\")&&Ot.test(this.nodeName)&&!Ht.test(e)&&(this.checked||!we.test(e))}).map(function(e,t){var n=ce(this).val();return null==n?null:Array.isArray(n)?ce.map(n,function(e){return{name:t.name,value:e.replace(Lt,\"\\r\\n\")}}):{name:t.name,value:n.replace(Lt,\"\\r\\n\")}}).get()}});var Mt=/%20/g,Rt=/#.*$/,It=/([?&])_=[^&]*/,Wt=/^(.*?):[ \\t]*([^\\r\\n]*)$/gm,Ft=/^(?:GET|HEAD)$/,$t=/^\\/\\//,Bt={},_t={},zt=\"*/\".concat(\"*\"),Xt=C.createElement(\"a\");function Ut(o){return function(e,t){\"string\"!=typeof e&&(t=e,e=\"*\");var n,r=0,i=e.toLowerCase().match(D)||[];if(v(t))while(n=i[r++])\"+\"===n[0]?(n=n.slice(1)||\"*\",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Vt(t,i,o,a){var s={},u=t===_t;function l(e){var r;return s[e]=!0,ce.each(t[e]||[],function(e,t){var n=t(i,o,a);return\"string\"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s[\"*\"]&&l(\"*\")}function Gt(e,t){var n,r,i=ce.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&ce.extend(!0,e,r),e}Xt.href=Et.href,ce.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Et.href,type:\"GET\",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Et.protocol),global:!0,processData:!0,async:!0,contentType:\"application/x-www-form-urlencoded; charset=UTF-8\",accepts:{\"*\":zt,text:\"text/plain\",html:\"text/html\",xml:\"application/xml, text/xml\",json:\"application/json, text/javascript\"},contents:{xml:/\\bxml\\b/,html:/\\bhtml/,json:/\\bjson\\b/},responseFields:{xml:\"responseXML\",text:\"responseText\",json:\"responseJSON\"},converters:{\"* text\":String,\"text html\":!0,\"text json\":JSON.parse,\"text xml\":ce.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Gt(Gt(e,ce.ajaxSettings),t):Gt(ce.ajaxSettings,e)},ajaxPrefilter:Ut(Bt),ajaxTransport:Ut(_t),ajax:function(e,t){\"object\"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=ce.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?ce(y):ce.event,x=ce.Deferred(),b=ce.Callbacks(\"once memory\"),w=v.statusCode||{},a={},s={},u=\"canceled\",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Wt.exec(p))n[t[1].toLowerCase()+\" \"]=(n[t[1].toLowerCase()+\" \"]||[]).concat(t[2])}t=n[e.toLowerCase()+\" \"]}return null==t?null:t.join(\", \")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Et.href)+\"\").replace($t,Et.protocol+\"//\"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||\"*\").toLowerCase().match(D)||[\"\"],null==v.crossDomain){r=C.createElement(\"a\");try{r.href=v.url,r.href=r.href,v.crossDomain=Xt.protocol+\"//\"+Xt.host!=r.protocol+\"//\"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&\"string\"!=typeof v.data&&(v.data=ce.param(v.data,v.traditional)),Vt(Bt,v,t,T),h)return T;for(i in(g=ce.event&&v.global)&&0==ce.active++&&ce.event.trigger(\"ajaxStart\"),v.type=v.type.toUpperCase(),v.hasContent=!Ft.test(v.type),f=v.url.replace(Rt,\"\"),v.hasContent?v.data&&v.processData&&0===(v.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&(v.data=v.data.replace(Mt,\"+\")):(o=v.url.slice(f.length),v.data&&(v.processData||\"string\"==typeof v.data)&&(f+=(At.test(f)?\"&\":\"?\")+v.data,delete v.data),!1===v.cache&&(f=f.replace(It,\"$1\"),o=(At.test(f)?\"&\":\"?\")+\"_=\"+jt.guid+++o),v.url=f+o),v.ifModified&&(ce.lastModified[f]&&T.setRequestHeader(\"If-Modified-Since\",ce.lastModified[f]),ce.etag[f]&&T.setRequestHeader(\"If-None-Match\",ce.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader(\"Content-Type\",v.contentType),T.setRequestHeader(\"Accept\",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+(\"*\"!==v.dataTypes[0]?\", \"+zt+\"; q=0.01\":\"\"):v.accepts[\"*\"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u=\"abort\",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Vt(_t,v,t,T)){if(T.readyState=1,g&&m.trigger(\"ajaxSend\",[T,v]),h)return T;v.async&&0<v.timeout&&(d=ie.setTimeout(function(){T.abort(\"timeout\")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,\"No Transport\");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&ie.clearTimeout(d),c=void 0,p=r||\"\",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while(\"*\"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader(\"Content-Type\"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+\" \"+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<ce.inArray(\"script\",v.dataTypes)&&ce.inArray(\"json\",v.dataTypes)<0&&(v.converters[\"text script\"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if(\"*\"===o)o=u;else if(\"*\"!==u&&u!==o){if(!(a=l[u+\" \"+o]||l[\"* \"+o]))for(i in l)if((s=i.split(\" \"))[1]===o&&(a=l[u+\" \"+s[0]]||l[\"* \"+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e[\"throws\"])t=a(t);else try{t=a(t)}catch(e){return{state:\"parsererror\",error:a?e:\"No conversion from \"+u+\" to \"+o}}}return{state:\"success\",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader(\"Last-Modified\"))&&(ce.lastModified[f]=u),(u=T.getResponseHeader(\"etag\"))&&(ce.etag[f]=u)),204===e||\"HEAD\"===v.type?l=\"nocontent\":304===e?l=\"notmodified\":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l=\"error\",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+\"\",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?\"ajaxSuccess\":\"ajaxError\",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger(\"ajaxComplete\",[T,v]),--ce.active||ce.event.trigger(\"ajaxStop\")))}return T},getJSON:function(e,t,n){return ce.get(e,t,n,\"json\")},getScript:function(e,t){return ce.get(e,void 0,t,\"script\")}}),ce.each([\"get\",\"post\"],function(e,i){ce[i]=function(e,t,n,r){return v(t)&&(r=r||n,n=t,t=void 0),ce.ajax(ce.extend({url:e,type:i,dataType:r,data:t,success:n},ce.isPlainObject(e)&&e))}}),ce.ajaxPrefilter(function(e){var t;for(t in e.headers)\"content-type\"===t.toLowerCase()&&(e.contentType=e.headers[t]||\"\")}),ce._evalUrl=function(e,t,n){return ce.ajax({url:e,type:\"GET\",dataType:\"script\",cache:!0,async:!1,global:!1,converters:{\"text script\":function(){}},dataFilter:function(e){ce.globalEval(e,t,n)}})},ce.fn.extend({wrapAll:function(e){var t;return this[0]&&(v(e)&&(e=e.call(this[0])),t=ce(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return v(n)?this.each(function(e){ce(this).wrapInner(n.call(this,e))}):this.each(function(){var e=ce(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=v(t);return this.each(function(e){ce(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not(\"body\").each(function(){ce(this).replaceWith(this.childNodes)}),this}}),ce.expr.pseudos.hidden=function(e){return!ce.expr.pseudos.visible(e)},ce.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},ce.ajaxSettings.xhr=function(){try{return new ie.XMLHttpRequest}catch(e){}};var Yt={0:200,1223:204},Qt=ce.ajaxSettings.xhr();le.cors=!!Qt&&\"withCredentials\"in Qt,le.ajax=Qt=!!Qt,ce.ajaxTransport(function(i){var o,a;if(le.cors||Qt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e[\"X-Requested-With\"]||(e[\"X-Requested-With\"]=\"XMLHttpRequest\"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,\"abort\"===e?r.abort():\"error\"===e?\"number\"!=typeof r.status?t(0,\"error\"):t(r.status,r.statusText):t(Yt[r.status]||r.status,r.statusText,\"text\"!==(r.responseType||\"text\")||\"string\"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o(\"error\"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&ie.setTimeout(function(){o&&a()})},o=o(\"abort\");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),ce.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),ce.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/\\b(?:java|ecma)script\\b/},converters:{\"text script\":function(e){return ce.globalEval(e),e}}}),ce.ajaxPrefilter(\"script\",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type=\"GET\")}),ce.ajaxTransport(\"script\",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=ce(\"<script>\").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on(\"load error\",i=function(e){r.remove(),i=null,e&&t(\"error\"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\\?(?=&|$)|\\?\\?/;ce.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){var e=Kt.pop()||ce.expando+\"_\"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter(\"json jsonp\",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?\"url\":\"string\"==typeof e.data&&0===(e.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&Zt.test(e.data)&&\"data\");if(a||\"jsonp\"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,\"$1\"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?\"&\":\"?\")+e.jsonp+\"=\"+r),e.converters[\"script json\"]=function(){return o||ce.error(r+\" was not called\"),o[0]},e.dataTypes[0]=\"json\",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),\"script\"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument(\"\").body).innerHTML=\"<form></form><form></form>\",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return\"string\"!=typeof e?[]:(\"boolean\"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument(\"\")).createElement(\"base\")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(\" \");return-1<s&&(r=Tt(e.slice(s)),e=e.slice(0,s)),v(t)?(n=t,t=void 0):t&&\"object\"==typeof t&&(i=\"POST\"),0<a.length&&ce.ajax({url:e,type:i||\"GET\",dataType:\"html\",data:t}).done(function(e){o=arguments,a.html(r?ce(\"<div>\").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,\"position\"),c=ce(e),f={};\"static\"===l&&(e.style.position=\"relative\"),s=c.offset(),o=ce.css(e,\"top\"),u=ce.css(e,\"left\"),(\"absolute\"===l||\"fixed\"===l)&&-1<(o+u).indexOf(\"auto\")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),\"using\"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if(\"fixed\"===ce.css(r,\"position\"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&\"static\"===ce.css(e,\"position\"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,\"borderTopWidth\",!0),i.left+=ce.css(e,\"borderLeftWidth\",!0))}return{top:t.top-i.top-ce.css(r,\"marginTop\",!0),left:t.left-i.left-ce.css(r,\"marginLeft\",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&\"static\"===ce.css(e,\"position\"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:\"pageXOffset\",scrollTop:\"pageYOffset\"},function(t,i){var o=\"pageYOffset\"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each([\"top\",\"left\"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+\"px\":t})}),ce.each({Height:\"height\",Width:\"width\"},function(a,s){ce.each({padding:\"inner\"+a,content:s,\"\":\"outer\"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||\"boolean\"!=typeof e),i=r||(!0===e||!0===t?\"margin\":\"border\");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf(\"outer\")?e[\"inner\"+a]:e.document.documentElement[\"client\"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body[\"scroll\"+a],r[\"scroll\"+a],e.body[\"offset\"+a],r[\"offset\"+a],r[\"client\"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each([\"ajaxStart\",\"ajaxStop\",\"ajaxComplete\",\"ajaxError\",\"ajaxSuccess\",\"ajaxSend\"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,\"**\"):this.off(t,e||\"**\",n)},hover:function(e,t){return this.on(\"mouseenter\",e).on(\"mouseleave\",t||e)}}),ce.each(\"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu\".split(\" \"),function(e,n){ce.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var en=/^[\\s\\uFEFF\\xA0]+|([^\\s\\uFEFF\\xA0])[\\s\\uFEFF\\xA0]+$/g;ce.proxy=function(e,t){var n,r,i;if(\"string\"==typeof t&&(n=e[t],t=e,e=n),v(e))return r=ae.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(ae.call(arguments)))}).guid=e.guid=e.guid||ce.guid++,i},ce.holdReady=function(e){e?ce.readyWait++:ce.ready(!0)},ce.isArray=Array.isArray,ce.parseJSON=JSON.parse,ce.nodeName=fe,ce.isFunction=v,ce.isWindow=y,ce.camelCase=F,ce.type=x,ce.now=Date.now,ce.isNumeric=function(e){var t=ce.type(e);return(\"number\"===t||\"string\"===t)&&!isNaN(e-parseFloat(e))},ce.trim=function(e){return null==e?\"\":(e+\"\").replace(en,\"$1\")},\"function\"==typeof define&&define.amd&&define(\"jquery\",[],function(){return ce});var tn=ie.jQuery,nn=ie.$;return ce.noConflict=function(e){return ie.$===ce&&(ie.$=nn),e&&ie.jQuery===ce&&(ie.jQuery=tn),ce},\"undefined\"==typeof e&&(ie.jQuery=ie.$=ce),ce});"
  },
  {
    "path": "instock/web/templates/common/footer.html",
    "content": "{% block footer %}\n{% end %}"
  },
  {
    "path": "instock/web/templates/common/header.html",
    "content": "{% block header %}\n{% end %}"
  },
  {
    "path": "instock/web/templates/common/left_menu.html",
    "content": "{% block left_menu %}\n<link rel=\"stylesheet\" href=\"/static/css/ace.min.css\" class=\"ace-main-stylesheet\" id=\"main-ace-style\" />\n<link rel=\"stylesheet\" href=\"/static/css/ace-skins.min.css\"/>\n<script src=\"/static/js/ace.min.js\"></script>\n<script src=\"/static/js/ace-elements.min.js\"></script>\n<script src=\"/static/js/ace-extra.min.js\"></script>\n<script type=\"text/javascript\">\n    try{ace.settings.loadState('sidebar')}catch(e){}\n    $.extend({\n        getUrlVars: function(){\n            let vars = [], hash;\n            const hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');\n            for(let i = 0; i < hashes.length; i++)\n            {\n                hash = hashes[i].split('=');\n                vars.push(hash[0]);\n                vars[hash[0]] = hash[1];\n            }\n            return vars;\n        },\n        getUrlVar: function(name){\n            return $.getUrlVars()[name];\n        }\n    });\n</script>\n<div id=\"navbar\" class=\"navbar navbar-default ace-save-state\" style=\"display:none;\">\n    <div class=\"navbar-container ace-save-state\" id=\"navbar-container\">\n        <button type=\"button\" class=\"navbar-toggle menu-toggler pull-left\" id=\"menu-toggler\" data-target=\"#sidebar\">\n            <span class=\"sr-only\">Toggle sidebar</span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n        </button>\n    </div>\n</div>\n<script type=\"text/javascript\">\n    if('ontouchstart' in document.documentElement) document.getElementById('navbar').style.display = \"block\";\n</script>\n<div id=\"sidebar\" class=\"sidebar responsive ace-save-state navbar_fixed sidebar-fixed\">\n    <ul class=\"nav nav-list\">\n        <li class=\"\">\n            <a href=\"/\">\n                <i class=\"menu-icon fa fa-tachometer\"></i>\n                <span class=\"menu-text\"> InStock股票系统 </span>\n            </a>\n            <b class=\"arrow\"></b>\n        </li>\n        {% set isOpenStr = \"\" %}\n        {% try %}\n            {% if request.uri == \"/\" or request.uri == \"/instock/\" %}\n                {% set isOpenStr = \"open\" %}\n            {% end %}\n        {% except %}\n        {% end %}\n        <li class=\"{{ isOpenStr }}\">\n            <a href=\"#\" class=\"dropdown-toggle\">\n                <i class=\"menu-icon fa fa-desktop\"></i>\n                <span class=\"menu-text\">ima知识库</span>\n                <b class=\"arrow fa fa-angle-down\"></b>\n            </a>\n            <b class=\"arrow\"></b>\n            <ul class=\"submenu\">\n                <li class=\"active\">\n                    <a href=\"/\">\n                        <i class=\"menu-icon fa fa-caret-right\"></i>\n                        myhhub/stock知识库\n                    </a>\n                    <b class=\"arrow\"></b>\n                </li>\n            </ul>\n        </li>\n{% set loopType = \"\" %}\n{% for leftMenuTmp in leftMenu.leftMenuList %}\n    {% if leftMenuTmp.type != loopType %}\n        {% if loopType != \"\" %}\n            </ul>\n            </li>\n        {% end %}\n        {% set loopType = leftMenuTmp.type %}\n        {% set isOpenStr = \"\" %}\n        {% try %}\n            {% if web_module_data.type == leftMenuTmp.type %}\n                {% set isOpenStr = \"open\" %}\n            {% end %}\n        {% except %}\n        {% end %}\n        <li class=\"{{ isOpenStr }}\">\n            <a href=\"#\" class=\"dropdown-toggle\">\n                <i class=\"menu-icon {{ leftMenuTmp.ico }}\"></i>\n                <span class=\"menu-text\">{{ leftMenuTmp.type }}</span>\n                <b class=\"arrow fa fa-angle-down\"></b>\n            </a>\n            <b class=\"arrow\"></b>\n            <ul class=\"submenu\">\n    {% end %}\n                {% set isActiveStr = \"\" %}\n                {% try %}\n                    {% if web_module_data.name == leftMenuTmp.name %}\n                        {% set isActiveStr = \"active\" %}\n                    {% end %}\n                {% except %}\n                {% end %}\n                <li class=\"{{ isActiveStr }}\">\n                    <a href=\"{{ leftMenuTmp.url }}\">\n                        <i class=\"menu-icon fa fa-caret-right\"></i>\n                        {{ leftMenuTmp.name }}\n                    </a>\n                    <b class=\"arrow\"></b>\n                </li>\n{% end %}\n            </ul>\n        </li>\n    </ul>\n    <div class=\"sidebar-toggle sidebar-collapse\" id=\"sidebar-collapse\">\n        <i id=\"sidebar-toggle-icon\" class=\"ace-icon fa fa-angle-double-left ace-save-state\" data-icon1=\"ace-icon fa fa-angle-double-left\" data-icon2=\"ace-icon fa fa-angle-double-right\"></i>\n    </div>\n</div>\n{% end %}"
  },
  {
    "path": "instock/web/templates/common/meta.html",
    "content": "{% block meta %}\n<meta name=\"spreadjs culture\" content=\"zh-cn\" />\n<link rel=\"icon\" href=\"/static/img/favicon.ico\">\n<link rel=\"stylesheet\" href=\"/static/css/bootstrap.min-3.4.1.css\" />\n<link rel=\"stylesheet\" href=\"/static/css/font-awesome.min-4.5.0.css\" />\n<script src=\"/static/js/jquery.min-3.7.1.js\"></script>\n<script type=\"text/javascript\">\n    if('ontouchstart' in document.documentElement) document.write(\"<script src='/static/js/jquery.mobile.custom.min.js'>\"+\"<\"+\"/script>\");\n</script>\n<script src=\"/static/js/bootstrap.min-3.4.1.js\"></script>\n<style>\nhtml,body {\n    top: 0;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    height:100%;\n}\n</style>\n{% end %}"
  },
  {
    "path": "instock/web/templates/index.html",
    "content": "{% extends \"layout/default.html\" %}\n\n{% block main_content %}\n<div class=\"page-content\">\n    <h3 class=\"header smaller lighter\">InStock股票系统</h3>\n    <div class=\"clearfix\">\n        <div class=\"pull-left tableTools-container\">\n            <h3> ima知识库</h3>\n            <ul>\n                <li>\n                    <a href=\" https://ima.qq.com/wiki/?shareId=8b0da768c77bc863f1cad8eb9482e37a6eeb26ad7171523b687d48c1a67c8e2c\" target=\"_blank\" rel=\"noopener noreferrer\">专业量化级股票因子池，每日更新全网全域股票数据，个股信息覆盖超2200个维度栏目，为个股精选提供高维度、高质量的数据核心支撑。</a>\n                </li>\n                <li>\n                    <a href=\"https://ima.qq.com/wiki/?shareId=8b0da768c77bc863f1cad8eb9482e37a6eeb26ad7171523b687d48c1a67c8e2c\" target=\"_blank\" rel=\"noopener noreferrer\">地址：https://ima.qq.com/wiki/?shareId=8b0da768c77bc863f1cad8eb9482e37a6eeb26ad7171523b687d48c1a67c8e2c</a>\n                </li>\n            </ul>\n        </div>\n    </div>\n    <div class=\"clearfix\">\n        <div class=\"pull-left tableTools-container\">\n            <h3>功能介绍</h3>\n        </div>\n    </div>\n     <p dir=\"auto\" class=\"red\">一：综合选股</p>\n    <div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\">\n        <pre class=\"notranslate\"><code>\n            综合选股支持股票范围、基本面、技术面、消息面、人气指标、行情数据等方面共200多个信息栏目进行自由组合选股。选股条件分为以下大类：\n            1.股票范围\n            市场、 行业、地区、 概念、 风格、指数成份、 上市时间。\n            2.基本面\n            估值指标、每股指标、盈利能力、成长能力、资本结构与偿债能力、股本股东。\n            3.技术面\n            MACD金叉、KDJ金叉、放量突破、低位资金净流入、高位资金净流出、向上突破均线、均线多头排列、均线空头排列、连涨放量、下跌无量、一根大阳线、两根大阳线、旭日东升、强势多方、炮拨云见日、七仙女下凡(七连阴)、八仙过海(八连阳)、九阳神功(九连阳)、四串阳、天量法则、放量上攻、穿头破脚、倒转锤头、射击之星、黄昏之星、曙光初现、身怀六甲、乌云盖顶、早晨之星、窄幅整理。\n            4.消息面\n            公告大事、机构关注情况、机构持股家数、机构持股比例。\n            5.人气指标\n            股吧人气排名、人气排名变化、人气排名连涨、人气排名连跌、人气排名创新高、人气排名创新低、新晋粉丝占比、铁杆粉丝占比、7日关注排名、今日浏览排名。\n            6.行情数据\n            股价表现、成交情况、资金流向、行情统计、沪深股通。\n        </code></pre>\n    </div>\n\n    <p dir=\"auto\" class=\"red\">二：股票每日数据</p>\n    <div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\">\n        <pre class=\"notranslate\"><code>\n            包括每日股票数据、股票资金流向、股票分红配送、股票龙虎榜、股票大宗交易、股票基本面数据、行业资金流向、概念资金流向、早盘抢筹数据、尾盘抢筹数据、涨停原因揭密、每日ETF数据。\n\n            抓取A股票每日数据，主要为一些关键数据，同时封装抓取方法，方便扩展系统获取个人关注的数据。\n        </code></pre>\n    </div>\n\n\n    <p dir=\"auto\" class=\"red\">三：计算股票指标</p>\n    <div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\">\n        <pre class=\"notranslate\"><code>\n            基于talib、pandas 计算指标，计算高效准确。调整个别指标公式，确保结果和同花顺、通信达结果一致。 指标：\n\n            1、MACD 2、KDJ 3、BOLL 4、TRIX，TRMA 5、CR 6、SMA 7、RSI\n            8、VR，MAVR 9、ROC 10、DMI，+DI，-DI，DX，ADX，ADXR 11、W&R\n            12、CCI 13、TR、ATR 14、DMA、AMA 15、OBV 16、SAR 17、PSY\n            18、BRAR 19、EMV 20、BIAS 21、TEMA  22、MFI 23、VWMA\n            24、PPO 25、WT 26、Supertrend  27、DPO  28、VHF  29、RVI\n            30、FI 31、ENE 32、STOCHRSI\n        </code></pre>\n    </div>\n\n    <p dir=\"auto\" class=\"red\">四：根据指标判定可能买入卖出的股票</p>\n    <div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\">\n        <pre class=\"notranslate\"><code>\n            KDJ:\n            1、超买区：K值在80以上，D值在70以上，J值大于90时为超买。一般情况下，股价有可能下跌。投资者应谨慎行事，局外人不应再追涨，局内人应适时卖出。\n            2、超卖区：K值在20以下，D值在30以下为超卖区。一般情况下，股价有可能上涨，反弹的可能性增大。局内人不应轻易抛出股票，局外人可寻机入场。\n\n            RSI:\n            1、当六日指标上升到达80时，表示股市已有超买现象，如果一旦继续上升，超过90以上时，则表示已到严重超买的警戒区，股价已形成头部，极可能在短期内反转回转。\n            2、当六日强弱指标下降至20时，表示股市有超卖现象，如果一旦继续下降至10以下时则表示已到严重超卖区域，股价极可能有止跌回升的机会。\n\n            CCI:\n            1、当CCI＞﹢100时，表明股价已经进入非常态区间——超买区间，股价的异动现象应多加关注。\n            2、当CCI＜﹣100时，表明股价已经进入另一个非常态区间——超卖区间，投资者可以逢低吸纳股票。\n\n            CR:\n            1、跌穿a、b、c、d四条线，再由低点向上爬升160时，为短线获利的一个良机，应适当卖出股票。\n            2、CR跌至40以下时，是建仓良机。\n\n            WR:\n            1、当％R线达到20时，市场处于超买状况，走势可能即将见顶。\n            2、当％R线达到80时，市场处于超卖状况，股价走势随时可能见底。\n\n            VR:\n            1、获利区域160－450根据情况获利了结。\n            2、低价区域40－70可以买进。\n        </code></pre>\n    </div>\n\n    <p dir=\"auto\" class=\"red\">五：K线形态识别</p>\n    <div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\">\n        <pre class=\"notranslate\"><code>\n            K线形态识别返回的结果有三种： 负：出现卖出信号 0：没有出现该形态 正：出现买入信号\n\n            1、两只乌鸦\n            三日K线模式，第一天长阳，第二天高开收阴，第三天再次高开继续收阴， 收盘比前一日收盘价低，预示股价下跌。\n\n            2、三只乌鸦\n            三日K线模式，连续三根阴线，每日收盘价都下跌且接近最低价， 每日开盘价都在上根K线实体内，预示股价下跌。\n\n            3、三内部上涨和下跌\n            三日K线模式，母子信号+长K线，以三内部上涨为例，K线为阴阳阳， 第三天收盘价高于第一天开盘价，第二天K线在第一天K线内部，预示着股价上涨。\n\n            4、三线打击\n            四日K线模式，前三根阳线，每日收盘价都比前一日高， 开盘价在前一日实体内，第四日市场高开，收盘价低于第一日开盘价，预示股价下跌。\n\n            5、三外部上涨和下跌\n            三日K线模式，与三内部上涨和下跌类似，K线为阴阳阳，但第一日与第二日的K线形态相反， 以三外部上涨为例，第一日K线在第二日K线内部，预示着股价上涨。\n\n            6、南方三星\n            三日K线模式，与大敌当前相反，三日K线皆阴，第一日有长下影线， 第二日与第一日类似，K线整体小于第一日，第三日无下影线实体信号， 成交价格都在第一日振幅之内，预示下跌趋势反转，股价上升。\n\n            7、三个白兵\n            三日K线模式，三日K线皆阳， 每日收盘价变高且接近最高价，开盘价在前一日实体上半部，预示股价上升。\n\n            8、弃婴\n            三日K线模式，第二日价格跳空且收十字星（开盘价与收盘价接近， 最高价最低价相差不大），预示趋势反转，发生在顶部下跌，底部上涨。\n\n            9、大敌当前\n            三日K线模式，三日都收阳，每日收盘价都比前一日高， 开盘价都在前一日实体以内，实体变短，上影线变长。\n\n            10、捉腰带线\n            两日K线模式，下跌趋势中，第一日阴线， 第二日开盘价为最低价，阳线，收盘价接近最高价，预示价格上涨。\n\n            11、脱离\n            五日K线模式，以看涨脱离为例，下跌趋势中，第一日长阴线，第二日跳空阴线，延续趋势开始震荡， 第五日长阳线，收盘价在第一天收盘价与第二天开盘价之间，预示价格上涨。\n\n            12、收盘缺影线\n            一日K线模式，以阳线为例，最低价低于开盘价，收盘价等于最高价， 预示着趋势持续。\n\n            13、藏婴吞没\n            四日K线模式，下跌趋势中，前两日阴线无影线 ，第二日开盘、收盘价皆低于第二日，第三日倒锤头， 第四日开盘价高于前一日最高价，收盘价低于前一日最低价，预示着底部反转。\n\n            14、反击线\n            二日K线模式，与分离线类似。\n\n            15、乌云压顶\n            二日K线模式，第一日长阳，第二日开盘价高于前一日最高价， 收盘价处于前一日实体中部以下，预示着股价下跌。\n\n            16、十字\n            一日K线模式，开盘价与收盘价基本相同。\n\n            17、十字星\n            一日K线模式，开盘价与收盘价基本相同，上下影线不会很长，预示着当前趋势反转。\n\n            18、蜻蜓十字/T形十字\n            一日K线模式，开盘后价格一路走低， 之后收复，收盘价与开盘价相同，预示趋势反转。\n\n            19、吞噬模式\n            两日K线模式，分多头吞噬和空头吞噬，以多头吞噬为例，第一日为阴线， 第二日阳线，第一日的开盘价和收盘价在第二日开盘价收盘价之内，但不能完全相同。\n\n            20、十字暮星\n            三日K线模式，基本模式为暮星，第二日收盘价和开盘价相同，预示顶部反转。\n\n            21、暮星\n            三日K线模式，与晨星相反，上升趋势中, 第一日阳线，第二日价格振幅较小，第三日阴线，预示顶部反转。\n\n            22、向上/下跳空并列阳线\n            二日K线模式，上升趋势向上跳空，下跌趋势向下跳空, 第一日与第二日有相同开盘价，实体长度差不多，则趋势持续。\n\n            23、墓碑十字/倒T十字\n            一日K线模式，开盘价与收盘价相同，上影线长，无下影线，预示底部反转。\n\n            24、锤头\n            一日K线模式，实体较短，无上影线， 下影线大于实体长度两倍，处于下跌趋势底部，预示反转。\n\n            25、上吊线\n            一日K线模式，形状与锤子类似，处于上升趋势的顶部，预示着趋势反转。\n\n            26、母子线\n            二日K线模式，分多头母子与空头母子，两者相反，以多头母子为例，在下跌趋势中，第一日K线长阴， 第二日开盘价收盘价在第一日价格振幅之内，为阳线，预示趋势反转，股价上升。\n\n            27、十字孕线\n            二日K线模式，与母子线类似，若第二日K线是十字线， 便称为十字孕线，预示着趋势反转。\n\n            28、风高浪大线\n            三日K线模式，具有极长的上/下影线与短的实体，预示着趋势反转。\n\n            29、陷阱\n            三日K线模式，与母子类似，第二日价格在前一日实体范围内, 第三日收盘价高于前两日，反转失败，趋势继续。\n\n            30、修正陷阱\n            三日K线模式，与陷阱类似，上升趋势中，第三日跳空高开； 下跌趋势中，第三日跳空低开，反转失败，趋势继续。\n\n            31、家鸽\n            二日K线模式，与母子线类似，不同的的是二日K线颜色相同， 第二日最高价、最低价都在第一日实体之内，预示着趋势反转。\n\n            32、三胞胎乌鸦\n            三日K线模式，上涨趋势中，三日都为阴线，长度大致相等， 每日开盘价等于前一日收盘价，收盘价接近当日最低价，预示价格下跌。\n\n            33、颈内线\n            二日K线模式，下跌趋势中，第一日长阴线， 第二日开盘价较低，收盘价略高于第一日收盘价，阳线，实体较短，预示着下跌继续。\n\n            34、倒锤头\n            一日K线模式，上影线较长，长度为实体2倍以上， 无下影线，在下跌趋势底部，预示着趋势反转。\n\n            35、反冲形态\n            二日K线模式，与分离线类似，两日K线为秃线，颜色相反，存在跳空缺口。\n\n            36、由较长缺影线决定的反冲形态\n            二日K线模式，与反冲形态类似，较长缺影线决定价格的涨跌。\n\n            37、梯底\n            五日K线模式，下跌趋势中，前三日阴线， 开盘价与收盘价皆低于前一日开盘、收盘价，第四日倒锤头，第五日开盘价高于前一日开盘价， 阳线，收盘价高于前几日价格振幅，预示着底部反转。\n\n            38、长脚十字\n            一日K线模式，开盘价与收盘价相同居当日价格中部，上下影线长， 表达市场不确定性。\n\n            39、长蜡烛\n            一日K线模式，K线实体长，无上下影线。\n\n            40、光头光脚/缺影线\n            一日K线模式，上下两头都没有影线的实体， 阴线预示着熊市持续或者牛市反转，阳线相反。\n\n            41、相同低价\n            二日K线模式，下跌趋势中，第一日长阴线， 第二日阴线，收盘价与前一日相同，预示底部确认，该价格为支撑位。\n\n            42、铺垫\n            五日K线模式，上涨趋势中，第一日阳线，第二日跳空高开影线， 第三、四日短实体影线，第五日阳线，收盘价高于前四日，预示趋势持续。\n\n            43、十字晨星\n            三日K线模式， 基本模式为晨星，第二日K线为十字星，预示底部反转。\n\n            44、晨星\n            三日K线模式，下跌趋势，第一日阴线， 第二日价格振幅较小，第三天阳线，预示底部反转。\n\n            45、颈上线\n            二日K线模式，下跌趋势中，第一日长阴线，第二日开盘价较低， 收盘价与前一日最低价相同，阳线，实体较短，预示着延续下跌趋势。\n\n            46、刺透形态\n            两日K线模式，下跌趋势中，第一日阴线，第二日收盘价低于前一日最低价， 收盘价处在第一日实体上部，预示着底部反转。\n\n            47、黄包车夫\n            一日K线模式，与长腿十字线类似， 若实体正好处于价格振幅中点，称为黄包车夫。\n\n            48、上升/下降三法\n            五日K线模式，以上升三法为例，上涨趋势中， 第一日长阳线，中间三日价格在第一日范围内小幅震荡， 第五日长阳线，收盘价高于第一日收盘价，预示股价上升。\n\n            49、分离线\n            二日K线模式，上涨趋势中，第一日阴线，第二日阳线， 第二日开盘价与第一日相同且为最低价，预示着趋势继续。\n\n            50、射击之星\n            一日K线模式，上影线至少为实体长度两倍， 没有下影线，预示着股价下跌\n\n            51、短蜡烛\n            一日K线模式，实体短，无上下影线\n\n            52、纺锤\n            一日K线，实体小。\n\n            53、停顿形态\n            三日K线模式，上涨趋势中，第二日长阳线， 第三日开盘于前一日收盘价附近，短阳线，预示着上涨结束\n\n            54、条形三明治\n            三日K线模式，第一日长阴线，第二日阳线，开盘价高于前一日收盘价， 第三日开盘价高于前两日最高价，收盘价于第一日收盘价相同。\n\n            55、探水竿\n            一日K线模式，大致与蜻蜓十字相同，下影线长度长。\n\n            56、跳空并列阴阳线\n            三日K线模式，分上涨和下跌，以上升为例， 前两日阳线，第二日跳空，第三日阴线，收盘价于缺口中，上升趋势持续。\n\n            57、插入\n            二日K线模式，与颈上线类似，下跌趋势中，第一日长阴线，第二日开盘价跳空， 收盘价略低于前一日实体中部，与颈上线相比实体较长，预示着趋势持续。\n\n            58、三星\n            三日K线模式，由三个十字组成， 第二日十字必须高于或者低于第一日和第三日，预示着反转。\n\n            59、奇特三河床\n            三日K线模式，下跌趋势中，第一日长阴线，第二日为锤头，最低价创新低，第三日开盘价低于第二日收盘价，收阳线， 收盘价不高于第二日收盘价，预示着反转，第二日下影线越长可能性越大。\n\n            60、向上跳空的两只乌鸦\n            三日K线模式，第一日阳线，第二日跳空以高于第一日最高价开盘， 收阴线，第三日开盘价高于第二日，收阴线，与第一日比仍有缺口。\n\n            61、上升/下降跳空三法\n            五日K线模式，以上升跳空三法为例，上涨趋势中，第一日长阳线，第二日短阳线，第三日跳空阳线，第四日阴线，开盘价与收盘价于前两日实体内， 第五日长阳线，收盘价高于第一日收盘价，预示股价上升。\n        </code></pre>\n    </div>\n\n    <p dir=\"auto\" class=\"red\">六：筹码分布</p>\n    <div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\">\n        <pre class=\"notranslate\"><code>\n            筹码分布通过计算一定时间范围内股票的:最高价、最低价、成交数，输出对应价格成交数占整个流通盘比值的分布图形。计算高效准确，结果与东方财富等专业软件的一致，缺省计算210个交易日的成本，可以自行设定时间范围。\n        </code></pre>\n    </div>\n\n    <p dir=\"auto\" class=\"red\">七：策略选股</p>\n    <div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\">\n        <pre class=\"notranslate\"><code>\n            1、放量上涨\n                1）当日比前一天上涨小于2%或收盘价小于开盘价。\n                2）当日成交额不低于2亿。\n                3）当日成交量/5日平均成交量>=2。\n            <br>\n            2、均线多头\n                MA30向上\n                1）30日前的30日均线<20日前的30日均线<10日前的30日均线<当日的30日均线。\n                2）(当日的30日均线/30日前的30日均线)>1.2。\n            <br>\n            3、停机坪\n                1）最近15日有涨幅大于9.5%，且必须是放量上涨。\n                2）紧接的下个交易日必须高开，收盘价必须上涨，且与开盘价不能大于等于相差3%。\n                3）接下2、3个交易日必须高开，收盘价必须上涨，且与开盘价不能大于等于相差3%，且每天涨跌幅在5%间。\n            <br>\n            4、回踩年线\n                1）分2个时间段：前段=最近60交易日最高收盘价之前交易日(长度>0)，后段=最高价当日及后面的交易日。\n                2）前段由年线(250日)以下向上突破。\n                3）后段必须在年线以上运行，且后段最低价日与最高价日相差必须在10-50日间。\n                4）回踩伴随缩量：最高价日交易量/后段最低价日交易量>2,后段最低价/最高价<0.8。\n            <br>\n            5、突破平台\n                1）60日内某日收盘价>=60日均线>开盘价。\n                2）且【1】放量上涨。\n                3）且【1】间之前时间，任意一天收盘价与60日均线偏离在-5%~20%之间。\n            <br>\n            6、无大幅回撤\n                1）当日收盘价比60日前的收盘价的涨幅小于0.6。\n                2）最近60日，不能有单日跌幅超7%、高开低走7%、两日累计跌幅10%、两日高开低走累计10%。\n            <br>\n            7、海龟交易法则\n                最后一个交易日收市价为指定区间内最高价。\n                1）当日收盘价>=最近60日最高收盘价。\n            <br>\n            8、高而窄的旗形\n                1）必须至少上市交易60日。\n                2）当日收盘价/之前24~10日的最低价>=1.9。\n                3）之前24~10日必须连续两天涨幅大于等于9.5%。\n            <br>\n            9、放量跌停。\n                1）跌>9.5%。\n                2）成交额不低于2亿。\n                3）成交量至少是5日平均成交量的4倍。\n            <br>\n            10、低ATR成长\n                1）必须至少上市交易250日。\n                2）最近10个交易日的最高收盘价必须比最近10个交易日的最低收盘价高1.1倍。\n            <br>\n            11、股票基本面选股\n                1）市盈率小于等于20，且大于0。\n                2）市净率小于等于10。\n                3）净资产收益率大于等于15。\n        </code></pre>\n    </div>\n\n    <p dir=\"auto\" class=\"red\">八：选股验证</p>\n    <div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\">\n        <pre class=\"notranslate\"><code>\n            对指标、策略等选出的股票进行回测，验证其准确性。\n        </code></pre>\n    </div>\n\n    <p dir=\"auto\" class=\"red\">九：选股验证</p>\n    <div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\">\n        <pre class=\"notranslate\"><code>\n            对指标、策略等选出的股票进行回测，验证策略的成功率，是否可用。\n        </code></pre>\n    </div>\n    <p dir=\"auto\" class=\"red\">十：自动交易</p>\n    <div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\">\n        <pre class=\"notranslate\"><code>\n            支持自动交易，内置自动打新股的策略及示例策略，由于涉及金钱，规避可能存在风险，没有提供其他交易策略。\n\n            具有交易日志，以及支持为每个交易策略配置交易日志。\n\n            特别提醒：交易日10:00点会触发打新，不想打新的删除stagging.py或不要启动“交易服务”。\n        </code></pre>\n    </div>\n    <p dir=\"auto\" class=\"red\">十一：关注功能</p>\n    <div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\">\n        <pre class=\"notranslate\"><code>\n            支持股票关注，关注股票在各个模块(含有的)置顶、标红显示。\n        </code></pre>\n    </div>\n    <p dir=\"auto\" class=\"red\">十二：支持批量</p>\n    <div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\">\n        <pre class=\"notranslate\"><code>\n            可以通过时间段、枚举时间、当前时间进行指标计算、策略选股及回测等。同时支持智能识别交易日，可以输入任意日期。\n\n            具体执行设置如下：\n\n            ------整体作业，支持批量作业------\n            当前时间作业 python execute_daily_job.py\n            单个时间作业 python execute_daily_job.py 2022-03-01\n            枚举时间作业 python execute_daily_job.py 2022-01-01,2021-02-08,2022-03-12\n            区间时间作业 python execute_daily_job.py 2022-01-01 2022-03-01\n\n            ------单功能作业，支持批量作业，回测数据自动填补到当前\n            综合选股作业 python selection_data_daily_job.py\n            基础数据实时作业 python basic_data_daily_job.py\n            基础数据收盘2小时后作业 python backtest_data_daily_job.py\n            基础数据非实时作业 python basic_data_other_daily_job.py\n            指标数据作业 python indicators_data_daily_job.py\n            K线形态作业 klinepattern_data_daily_job.py\n            策略数据作业 python strategy_data_daily_job.py\n            回测数据 python backtest_data_daily_job.py\n        </code></pre>\n    </div>\n</div>\n{% end %}"
  },
  {
    "path": "instock/web/templates/layout/default.html",
    "content": "{% extends \"../common/meta.html\" %}\n{% extends \"../common/header.html\" %}\n{% extends \"../common/footer.html\" %}\n{% extends \"../common/left_menu.html\" %}\n\n{% extends \"main.html\" %}"
  },
  {
    "path": "instock/web/templates/layout/indicators-main.html",
    "content": "<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\" />\n\t\t<meta charset=\"utf-8\" />\n\t\t<title>InStock股票系统</title>\n        <script type=\"text/javascript\">\n            const meta = document.createElement('meta');\n            meta.setAttribute('name','viewport');\n            meta.setAttribute('content','width=device-width,initial-scale=' + (window.screen.width / 1000) + ', maximum-scale=1.0');//1000为页面实际宽度\n            document.getElementsByTagName('head')[0].appendChild(meta);\n        </script>\n\t\t{% block meta %}{% end %}\n\t</head>\n\n\t<body>\n        {% block main_content %}{% end %}\n\t</body>\n</html>\n"
  },
  {
    "path": "instock/web/templates/layout/indicators.html",
    "content": "{% extends \"../common/meta.html\" %}\n\n{% extends \"indicators-main.html\" %}"
  },
  {
    "path": "instock/web/templates/layout/main.html",
    "content": "<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\" />\n\t\t<meta charset=\"utf-8\" />\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0\" />\n\t\t<title>InStock股票系统</title>\n\t\t{% block meta %}{% end %}\n\t</head>\n\n\t<body class=\"skin-1\">\n        <div class=\"main-container ace-save-state\" id=\"main-container\" style=\"height: 100%;\">\n\t\t\t<script type=\"text/javascript\">\n\t\t\t\ttry{ace.settings.loadState('main-container')}catch(e){}\n\t\t\t</script>\n            {% block header %}{% end %}\n            {% block left_menu %}{% end %}\n            <div class=\"main-content\" style=\"height: 100%;\">\n                <div class=\"main-content-inner\" style=\"height: 100%;\">\n                    {% block main_content %}{% end %}\n                </div>\n            </div>\n            {% block footer %}{% end %}\n         </div>\n\t</body>\n</html>"
  },
  {
    "path": "instock/web/templates/stock_indicators.html",
    "content": "{% extends \"layout/indicators.html\" %}\n{% block main_content %}\n<script type=\"text/javascript\" src=\"/static/js/bokeh-3.8.1.min.js\"></script>\n<script type=\"text/javascript\" src=\"/static/js/bokeh-widgets-3.8.1.min.js\"></script>\n<script type=\"text/javascript\">\n    Bokeh.set_log_level(\"error\");\n    function attention(code,obj){\n            $.ajax({\n                type : \"get\",\n                url : \"/instock/control/attention\",\n                data : {code:code,otype:obj.value},\n                dateType: \"json\",\n                success:function(json){\n                    if (obj.value===\"1\"){\n                        obj.value=\"0\";\n                        obj.innerText=\"关注\";\n                    }else{\n                        obj.value=\"1\";\n                        obj.innerText=\"取关\";\n                    }\n                }\n            });\n        }\n</script>\n{% for element in comp_list %}\n<div>\n    {% raw element[\"div\"] %}\n    {% raw element[\"script\"] %}\n</div>\n{% end %}\n{% end %}"
  },
  {
    "path": "instock/web/templates/stock_web.html",
    "content": "{% extends \"layout/default.html\" %}\n\n{% block main_content %}\n<link rel=\"stylesheet\" href=\"/static/css/bootstrap-datepicker3.min.css\" />\n<link rel=\"stylesheet\" href=\"/static/css/gc.spread.sheets.excel2013white.css\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"/static/js/gc.spread.sheets.all.min.js\"></script>\n<script src=\"/static/js/FileSaver.js\" type=\"text/javascript\"></script>\n<script src=\"/static/js/gc.spread.sheets.tablesheet.min.js\" type=\"text/javascript\"></script>\n<script type=\"text/javascript\" src=\"/static/js/gc.spread.sheets.resources.zh.min.js\"></script>\n<script src=\"/static/js/gc.spread.excelio.min.js\" type=\"text/javascript\"></script>\n<script src=\"/static/js/bootstrap-datepicker.min.js\"></script>\n<script src=\"/static/js/bootstrap-datepicker.zh-CN.min.js\"></script>\n<div style=\"height: 100%;overflow: hidden;\">\n        <div class=\"table-header\" style=\"width:100%;height:35px;\">\n            <div style=\"display:inline-block;float:left;height:100%;\">\n                <div style=\"display:inline-block;float:left;text-overflow:ellipsis;white-space:nowrap;\">\n                    {{ web_module_data.name }}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;日期：\n                </div>\n                <div style=\"display:inline-block;float:right;\">\n                    <input type=\"hidden\" id=\"dateid_old\">\n                    <input type=\"text\" value=\"{{ date_now }}\" id=\"dateid\" class=\"input-group-sm form-control date-picker\">\n                </div>\n            </div>\n            <div style=\"display:inline-block;float:right;height:100%;\">\n                <input type=\"button\" id=\"resetFilter\" value=\"重置筛选\" style=\"background-color:#307ECC;height:100%;\">\n                <input type=\"button\" id=\"saveExcel\" value=\"保存Excel\" style=\"background-color:#307ECC;height:100%;\">\n            </div>\n        </div>\n        <div id=\"instock-data\" style=\"width:100%;height:calc( 100% - 55px );\"></div>\n        <div id=\"statusBar\" style=\"width:100%;height:20px;\"></div>\n</div>\n\n<script type=\"text/javascript\">\n    const nameParam = $.getUrlVar('table_name');\n    let dateParam = \"{{ date_now }}\";\n    const colInfos = {% raw web_module_data.column_names %};\n    let myView;\n\n    $(document).ready(function () {\n        const spread = new GC.Spread.Sheets.Workbook(document.getElementById('instock-data'), {sheetCount: 0});\n        spread.options.newTabVisible = false;\n        spread.options.tabEditable = false;\n        spread.options.tabNavigationVisible = false;\n        spread.options.tabStripRatio = 0.37;\n        const sheet = spread.addSheetTab(0, nameParam, GC.Spread.Sheets.SheetType.tableSheet);\n        sheet.options.sheetTabColor = 'red';\n        sheet.options.allowAddNew = false; //hide new row\n        sheet.setDefaultRowHeight(80, GC.Spread.Sheets.SheetArea.colHeader);\n        sheet.applyTableTheme(GC.Spread.Sheets.Tables.TableThemes.light18)\n        if (colInfos[1].value == 'code') {\n            let hyperlinkStyle = new GC.Spread.Sheets.Style();\n            let hl = new GC.Spread.Sheets.CellTypes.HyperLink();\n            hl.onClickAction(function (cell) {\n                row = cell.row;\n                window.open('/instock/data/indicators?code=' + sheet.getSheet().getValue(row, 1) + '&date=' + (sheet.getSheet().getValue(row, 0)).format('yyyy-MM-dd') + '&name=' + sheet.getSheet().getValue(row, 2), '_blank');\n            });\n            hyperlinkStyle.cellType = hl;\n            colInfos[1].style = hyperlinkStyle;\n        }\n        let statusBar = initStatusBar(spread);\n        initSpread(spread, statusBar);\n        initEvent(spread, statusBar);\n        const elem = document.querySelector('#instock-data')\n        {\n          let prevWidth;\n          new ResizeObserver(changes => {\n            for(const change of changes){\n              if(change.contentRect.width === prevWidth) {return;}\n              spread.refresh();\n            }\n          }).observe(elem);\n        };\n\n        $( \".date-picker\" ).datepicker({\n            language: 'zh-CN', //设置语言\n            format:\"yyyy-mm-dd\",\n            showOtherMonths: true,\n            selectOtherMonths: false,\n            autoclose: true,\n            todayHighlight: true,\n            onSelect: function(selected,evnt) {\n                 console.log(selected);\n            }\n        }).on('changeDate', function(ev){\n           initSpread(GC.Spread.Sheets.findControl(document.getElementById('instock-data')));\n        });\n    });\n\n    function initStatusBar(spread) {\n        let old_cnd = 1;\n        let StatusItem = GC.Spread.Sheets.StatusBar.StatusItem;\n        function RecordCountItem(name, options) {\n            StatusItem.call(this, name, options);\n            this.cno = 1;\n            this.dataSourceLength = 0;\n            this.visibleLength =  0;\n        }\n        RecordCountItem.prototype = new StatusItem();\n        RecordCountItem.prototype.onCreateItemView = function(container) {\n            let element = this._element;\n            if (!element) {\n                element = this._element = document.createElement(\"span\");\n                element.innerHTML = \" <i class=\\\"fa fa-commenting-o\\\"></i>总记录/筛选记录：<b>\" + this.dataSourceLength + \"</b> / <b>\" + this.visibleLength + \"</b> 条 - 当前位置：第 <b>\" + this.cno + \"</b> 行\";\n            }\n            container.appendChild(element);\n        };\n        RecordCountItem.prototype.onBind = function(context) {\n            let _this = this;\n            context.bind(GC.Spread.Sheets.Events.SelectionChanged, function(e, args) {\n                let row = args.newSelections[0].row;\n                if (row > 0 || args.newSelections[0].rowCount > 0) {\n                    _this.cno = row + 1;\n                }else{\n                    _this.cno = 0;\n                }\n                _this.onUpdate();\n            });\n            context.bind(GC.Spread.Sheets.Events.RangeFiltered, function (e, args) {\n                _this.dataSourceLength = myView.length();\n                _this.visibleLength = myView.visibleLength();\n                if (_this.visibleLength===0){old_cnd=_this.cno;_this.cno = 0;}\n                _this.onUpdate();\n            });\n            context.bind(GC.Spread.Sheets.Events.RangeFilterCleared, function (e, args) {\n                _this.dataSourceLength = myView.length();\n                _this.visibleLength = myView.visibleLength();\n                if (_this.visibleLength>0){_this.cno = old_cnd;}\n                _this.onUpdate();\n            });\n        };\n        RecordCountItem.prototype.onUpdate = function() {\n            StatusItem.prototype.onUpdate.call(this);\n            this._element.innerHTML = \" <i class=\\\"fa fa-commenting-o\\\"></i>总记录/筛选记录：<b>\" + this.dataSourceLength + \"</b> / <b>\" + this.visibleLength + \"</b> 条 - 当前位置：第 <b>\" + this.cno + \"</b> 行\";\n        };\n        let recordCountItem = new RecordCountItem('recordCountItem', { menuContent: '当前位置', value: 0 });\n        let statusBar = new GC.Spread.Sheets.StatusBar.StatusBar(document.getElementById('statusBar'), {\n            items: [recordCountItem]\n        });\n        statusBar.bind(spread);\n        return statusBar;\n    }\n\n    function initSpread(spread, statusBar) {\n        const dateParam_old = document.getElementById(\"dateid_old\").value\n        dateParam = document.getElementById('dateid').value;\n        if (dateParam_old === dateParam) return;\n        document.getElementById(\"dateid_old\").value = dateParam\n        spread.suspendPaint();\n        const dataManager = spread.dataManager();\n        const productTable = dataManager.addTable(\"productTable\", {\n            remote: {\n                read: {\n                    url: \"/instock/api_data?name=\"+nameParam+\"&date=\"+dateParam\n                }\n            },\n            schema: {\n              columns: {\n                listing_date: { dataType: \"date\" },\n                report_date: { dataType: \"date\" },\n                plan_date: { dataType: \"date\" },\n                record_date: { dataType: \"date\" },\n                ex_dividend_date: { dataType: \"date\" },\n                record_date: { dataType: \"date\" },\n              },\n            }\n        });\n        const sheet = spread.getActiveSheetTab();\n        myView = productTable.addView(\"myView\",colInfos);\n        myView.fetch().then(function() {\n            sheet.setDataView(myView);\n            sheet.togglePinnedColumns([0,1,2]);\n            if (statusBar) {\n                let recordItem = statusBar.get(\"recordCountItem\");\n                if (recordItem) {\n                    recordItem.dataSourceLength = myView.length();\n                    recordItem.visibleLength = myView.visibleLength();\n                    if (recordItem.visibleLength===0){recordItem.cno = 0;}\n                    recordItem.onUpdate();\n                }\n            }\n        });\n        spread.resumePaint();\n    }\n\n    function initEvent(spread,statusBar) {\n        document.getElementById('saveExcel').onclick = function() {\n            const excelIo = new GC.Spread.Excel.IO();\n            const json = spread.toJSON({ includeBindingSource: true, saveAsView: true });\n            excelIo.save(json, function(blob) {\n                saveAs(blob, nameParam+dateParam+\".xlsx\");\n            }, function(e) {\n                console.log(e);\n            });\n        };\n        document.getElementById(\"resetFilter\").onclick = function() {\n            spread.getActiveSheetTab().getSheet().rowFilter().reset();\n            if (statusBar) {\n                let recordItem = statusBar.get(\"recordCountItem\");\n                if (recordItem) {\n                    recordItem.visibleLength =recordItem.dataSourceLength\n                    recordItem.onUpdate();\n                }\n            }\n        };\n    }\n\n    Date.prototype.format = function (format) {\n      let o = {\n        \"y\": \"\" + this.getFullYear(),\n        \"M\": \"\" + (this.getMonth() + 1),  //month\n        \"d\": \"\" + this.getDate(),         //day\n        \"h\": \"\" + this.getHours(),        //hour\n      }\n      return Object.keys(o).reduce((pre, k)=> (new RegExp(\"(\" + k + \"+)\").test(pre)) ? (pre.replace(RegExp.$1, RegExp.$1.length === 1 ? o[k] : o[k].padStart(2, \"0\"))) : pre , format);\n    }\n</script>\n{% end %}"
  },
  {
    "path": "instock/web/web_service.py",
    "content": "#!/usr/local/bin/python3\n# -*- coding: utf-8 -*-\n\nimport logging\nimport os.path\nimport sys\nfrom abc import ABC\n\nimport tornado.escape\nimport tornado.httpserver\nimport tornado.ioloop\nimport tornado.options\nfrom tornado import gen\n\n# 在项目运行时，临时将项目路径添加到环境变量\ncpath_current = os.path.dirname(os.path.dirname(__file__))\ncpath = os.path.abspath(os.path.join(cpath_current, os.pardir))\nsys.path.append(cpath)\nlog_path = os.path.join(cpath_current, 'log')\nif not os.path.exists(log_path):\n    os.makedirs(log_path)\nlogging.basicConfig(format='%(asctime)s %(message)s', filename=os.path.join(log_path, 'stock_web.log'))\nlogging.getLogger().setLevel(logging.ERROR)\nimport instock.lib.torndb as torndb\nimport instock.lib.database as mdb\nimport instock.lib.version as version\nimport instock.web.dataTableHandler as dataTableHandler\nimport instock.web.dataIndicatorsHandler as dataIndicatorsHandler\nimport instock.web.base as webBase\n\n__author__ = 'myh '\n__date__ = '2023/3/10 '\n\n\nclass Application(tornado.web.Application):\n    def __init__(self):\n        handlers = [\n            # 设置路由\n            (r\"/\", HomeHandler),\n            (r\"/instock/\", HomeHandler),\n            # 使用datatable 展示报表数据模块。\n            (r\"/instock/api_data\", dataTableHandler.GetStockDataHandler),\n            (r\"/instock/data\", dataTableHandler.GetStockHtmlHandler),\n            # 获得股票指标数据。\n            (r\"/instock/data/indicators\", dataIndicatorsHandler.GetDataIndicatorsHandler),\n            # 加入关注\n            (r\"/instock/control/attention\", dataIndicatorsHandler.SaveCollectHandler),\n        ]\n        settings = dict(  # 配置\n            template_path=os.path.join(os.path.dirname(__file__), \"templates\"),\n            static_path=os.path.join(os.path.dirname(__file__), \"static\"),\n            xsrf_cookies=False,  # True,\n            # cookie加密\n            cookie_secret=\"027bb1b670eddf0392cdda8709268a17b58b7\",\n            debug=True,\n        )\n        super(Application, self).__init__(handlers, **settings)\n        # Have one global connection to the blog DB across all handlers\n        self.db = torndb.Connection(**mdb.MYSQL_CONN_TORNDB)\n\n\n# 首页handler。\nclass HomeHandler(webBase.BaseHandler, ABC):\n    @gen.coroutine\n    def get(self):\n        self.render(\"index.html\",\n                    stockVersion=version.__version__,\n                    leftMenu=webBase.GetLeftMenu(self.request.uri))\n\n\ndef main():\n    # tornado.options.parse_command_line()\n    tornado.options.options.logging = None\n\n    http_server = tornado.httpserver.HTTPServer(Application())\n    port = 9988\n    http_server.listen(port)\n\n    print(f\"服务已启动，web地址 : http://localhost:{port}/\")\n    logging.error(f\"服务已启动，web地址 : http://localhost:{port}/\")\n\n    tornado.ioloop.IOLoop.current().start()\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "requirements.txt",
    "content": "numpy==2.4.1\npandas==2.3.3\npy_mini_racer==0.6.0\nmini-racer==0.13.2\nTA_Lib==0.6.8\narrow==1.4.0\nbokeh==3.8.1\nPyMySQL==1.1.2\nrequests==2.32.5\nLogbook==1.9.2\nSQLAlchemy==2.0.45\ntornado==6.5.4\ntqdm==4.67.1\nurllib3==2.6.3\neasytrader==0.23.7\nbeautifulsoup4==4.14.3\npycryptodome==3.23.0\npython_dateutil==2.9.0.post0"
  },
  {
    "path": "supervisor/supervisord.conf",
    "content": "[unix_http_server]\nfile=/tmp/supervisor.sock   ; the path to the socket file\n\n[inet_http_server]         ; inet (TCP) server disabled by default\nport=*:9001        ; ip_address:port specifier, *:port for all iface\n;username=user              ; default is no username (open server)\n;password=123               ; default is no password (open server)\n\n[supervisord]\nlogfile=/tmp/supervisord.log ; main log file; default $CWD/supervisord.log\nlogfile_maxbytes=50MB        ; max main logfile bytes b4 rotation; default 50MB\nlogfile_backups=10           ; # of main logfile backups; 0 means none, default 10\nloglevel=info                ; log level; default info; others: debug,warn,trace\npidfile=/tmp/supervisord.pid ; supervisord pidfile; default supervisord.pid\nnodaemon=false               ; start in foreground if true; default false\nminfds=1024                  ; min. avail startup file descriptors; default 1024\nminprocs=200                 ; min. avail process descriptors;default 200\n\n[rpcinterface:supervisor]\nsupervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface\n\n[supervisorctl]\nserverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket\n\n[program:run_job]\ncommand=/data/InStock/instock/bin/run_job.sh\nautorestart=false\nstartretries=0\npriority=100\n\n[program:run_web]\ncommand=/data/InStock/instock/bin/run_web.sh\nautorestart=true\npriority=500\nstopasgroup=true\nkillasgroup=true\n\n[program:run_cron]\ncommand=/data/InStock/instock/bin/run_cron.sh\nautorestart=true\npriority=900\n"
  }
]