From e994e56c23889f4e223659c2d0017f8d1714597d Mon Sep 17 00:00:00 2001 From: Edward Sun <68405458+EdwardoSunny@users.noreply.github.com> Date: Sat, 7 Jun 2025 15:04:43 -0700 Subject: [PATCH 01/14] Remove EODHD from readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d2fd70fd..4d8b903a 100644 --- a/README.md +++ b/README.md @@ -92,7 +92,7 @@ pip install -r requirements.txt ### Required APIs -You will also need the FinnHub API and EODHD API for financial data. All of our code is implemented with the free tier. +You will also need the FinnHub API for financial data. All of our code is implemented with the free tier. ```bash export FINNHUB_API_KEY=$YOUR_FINNHUB_API_KEY ``` From 0fdfd3586784193d7dc69bfa7bc0b4f2002caca2 Mon Sep 17 00:00:00 2001 From: Edward Sun <68405458+EdwardoSunny@users.noreply.github.com> Date: Sun, 8 Jun 2025 13:16:10 -0700 Subject: [PATCH 02/14] Fix default python usage config code --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4d8b903a..73bbbcb9 100644 --- a/README.md +++ b/README.md @@ -136,8 +136,9 @@ To use TradingAgents inside your code, you can import the `tradingagents` module ```python from tradingagents.graph.trading_graph import TradingAgentsGraph +from tradingagents.default_config import DEFAULT_CONFIG -ta = TradingAgentsGraph(debug=True, config=config) +ta = TradingAgentsGraph(debug=True, config=DEFAULT_CONFIG.copy()) # forward propagate _, decision = ta.propagate("NVDA", "2024-05-10") From 0013415378dc83f45f7cf56d3457f6bcef381b90 Mon Sep 17 00:00:00 2001 From: Yijia-Xiao Date: Mon, 9 Jun 2025 15:14:41 -0700 Subject: [PATCH 03/14] Add star history --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 73bbbcb9..c8848424 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,16 @@ > > So we decided to fully open-source the framework. Looking forward to building impactful projects with you! +
+ + + + + TradingAgents Star History + + +
+
๐Ÿš€ [TradingAgents](#tradingagents-framework) | โšก [Installation & CLI](#installation-and-cli) | ๐ŸŽฌ [Demo](https://www.youtube.com/watch?v=90gr5lwjIho) | ๐Ÿ“ฆ [Package Usage](#tradingagents-package) | ๐Ÿค [Contributing](#contributing) | ๐Ÿ“„ [Citation](#citation) From a87986839632535a61bdd1383e8c9f81dd3a87da Mon Sep 17 00:00:00 2001 From: neo Date: Tue, 10 Jun 2025 06:51:06 +0800 Subject: [PATCH 04/14] docs: add links to other language versions of README (#13) Added language selection links to the README for easier access to translated versions: German, Spanish, French, Japanese, Korean, Portuguese, Russian, and Chinese. --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index c8848424..9846761e 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,18 @@ Community
+
+ + Deutsch | + Espaรฑol | + franรงais | + ๆ—ฅๆœฌ่ชž | + ํ•œ๊ตญ์–ด | + Portuguรชs | + ะ ัƒััะบะธะน | + ไธญๆ–‡ +
+ --- # TradingAgents: Multi-Agents LLM Financial Trading Framework From 570644d9396a1f5c6dc14f34e3d19cb2556caf20 Mon Sep 17 00:00:00 2001 From: saksham0161 Date: Thu, 12 Jun 2025 08:13:39 +0530 Subject: [PATCH 05/14] Fix ticker hardcoding in prompt (#28) --- tradingagents/dataflows/interface.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tradingagents/dataflows/interface.py b/tradingagents/dataflows/interface.py index d31d84e2..e0c0b700 100644 --- a/tradingagents/dataflows/interface.py +++ b/tradingagents/dataflows/interface.py @@ -713,7 +713,7 @@ def get_stock_news_openai(ticker, curr_date): "content": [ { "type": "input_text", - "text": f"Can you search Social Media for {ticker} on TSLA from 7 days before {curr_date} to {curr_date}? Make sure you only get the data posted during that period.", + "text": f"Can you search Social Media for {ticker} from 7 days before {curr_date} to {curr_date}? Make sure you only get the data posted during that period.", } ], } From ba5b6e8be8639ecd04c62194aad931fc7fbd3a14 Mon Sep 17 00:00:00 2001 From: kimheesu Date: Thu, 12 Jun 2025 15:06:35 +0900 Subject: [PATCH 06/14] :[add] OpenAIEmbeddings from langchain_openai --- .gitignore | 16 +- LICENSE | 402 ++-- README.md | 426 ++-- cli/main.py | 2018 ++++++++--------- cli/models.py | 20 +- cli/static/welcome.txt | 14 +- cli/utils.py | 390 ++-- main.py | 38 +- requirements.txt | 48 +- setup.py | 86 +- tradingagents/agents/__init__.py | 82 +- .../agents/analysts/fundamentals_analyst.py | 118 +- .../agents/analysts/market_analyst.py | 168 +- tradingagents/agents/analysts/news_analyst.py | 110 +- .../agents/analysts/social_media_analyst.py | 110 +- .../agents/managers/research_manager.py | 110 +- tradingagents/agents/managers/risk_manager.py | 132 +- .../agents/researchers/bear_researcher.py | 122 +- .../agents/researchers/bull_researcher.py | 118 +- .../agents/risk_mgmt/aggresive_debator.py | 110 +- .../agents/risk_mgmt/conservative_debator.py | 116 +- .../agents/risk_mgmt/neutral_debator.py | 110 +- tradingagents/agents/trader/trader.py | 86 +- tradingagents/agents/utils/agent_states.py | 152 +- tradingagents/agents/utils/agent_utils.py | 822 +++---- tradingagents/agents/utils/memory.py | 219 +- tradingagents/dataflows/__init__.py | 92 +- tradingagents/dataflows/config.py | 68 +- tradingagents/dataflows/finnhub_utils.py | 72 +- tradingagents/dataflows/googlenews_utils.py | 216 +- tradingagents/dataflows/interface.py | 1608 ++++++------- tradingagents/dataflows/reddit_utils.py | 270 +-- tradingagents/dataflows/stockstats_utils.py | 174 +- tradingagents/dataflows/utils.py | 78 +- tradingagents/dataflows/yfin_utils.py | 234 +- tradingagents/default_config.py | 38 +- tradingagents/graph/__init__.py | 34 +- tradingagents/graph/conditional_logic.py | 134 +- tradingagents/graph/propagation.py | 98 +- tradingagents/graph/reflection.py | 242 +- tradingagents/graph/setup.py | 410 ++-- tradingagents/graph/signal_processing.py | 62 +- tradingagents/graph/trading_graph.py | 486 ++-- 43 files changed, 5230 insertions(+), 5229 deletions(-) diff --git a/.gitignore b/.gitignore index 8313619e..688d247b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,8 @@ -env/ -__pycache__/ -.DS_Store -*.csv -src/ -eval_results/ -eval_data/ -*.egg-info/ +env/ +__pycache__/ +.DS_Store +*.csv +src/ +eval_results/ +eval_data/ +*.egg-info/ diff --git a/LICENSE b/LICENSE index 261eeb9e..29f81d81 100644 --- a/LICENSE +++ b/LICENSE @@ -1,201 +1,201 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md index 9846761e..bbb1fe75 100644 --- a/README.md +++ b/README.md @@ -1,213 +1,213 @@ -

- -

- -
- arXiv - Discord - WeChat - X Follow -
- Community -
- -
- - Deutsch | - Espaรฑol | - franรงais | - ๆ—ฅๆœฌ่ชž | - ํ•œ๊ตญ์–ด | - Portuguรชs | - ะ ัƒััะบะธะน | - ไธญๆ–‡ -
- ---- - -# TradingAgents: Multi-Agents LLM Financial Trading Framework - -> ๐ŸŽ‰ **TradingAgents** officially released! We have received numerous inquiries about the work, and we would like to express our thanks for the enthusiasm in our community. -> -> So we decided to fully open-source the framework. Looking forward to building impactful projects with you! - -
- - - - - TradingAgents Star History - - -
- -
- -๐Ÿš€ [TradingAgents](#tradingagents-framework) | โšก [Installation & CLI](#installation-and-cli) | ๐ŸŽฌ [Demo](https://www.youtube.com/watch?v=90gr5lwjIho) | ๐Ÿ“ฆ [Package Usage](#tradingagents-package) | ๐Ÿค [Contributing](#contributing) | ๐Ÿ“„ [Citation](#citation) - -
- -## TradingAgents Framework - -TradingAgents is a multi-agent trading framework that mirrors the dynamics of real-world trading firms. By deploying specialized LLM-powered agents: from fundamental analysts, sentiment experts, and technical analysts, to trader, risk management team, the platform collaboratively evaluates market conditions and informs trading decisions. Moreover, these agents engage in dynamic discussions to pinpoint the optimal strategy. - -

- -

- -> TradingAgents framework is designed for research purposes. Trading performance may vary based on many factors, including the chosen backbone language models, model temperature, trading periods, the quality of data, and other non-deterministic factors. [It is not intended as financial, investment, or trading advice.](https://tauric.ai/disclaimer/) - -Our framework decomposes complex trading tasks into specialized roles. This ensures the system achieves a robust, scalable approach to market analysis and decision-making. - -### Analyst Team -- Fundamentals Analyst: Evaluates company financials and performance metrics, identifying intrinsic values and potential red flags. -- Sentiment Analyst: Analyzes social media and public sentiment using sentiment scoring algorithms to gauge short-term market mood. -- News Analyst: Monitors global news and macroeconomic indicators, interpreting the impact of events on market conditions. -- Technical Analyst: Utilizes technical indicators (like MACD and RSI) to detect trading patterns and forecast price movements. - -

- -

- -### Researcher Team -- Comprises both bullish and bearish researchers who critically assess the insights provided by the Analyst Team. Through structured debates, they balance potential gains against inherent risks. - -

- -

- -### Trader Agent -- Composes reports from the analysts and researchers to make informed trading decisions. It determines the timing and magnitude of trades based on comprehensive market insights. - -

- -

- -### Risk Management and Portfolio Manager -- Continuously evaluates portfolio risk by assessing market volatility, liquidity, and other risk factors. The risk management team evaluates and adjusts trading strategies, providing assessment reports to the Portfolio Manager for final decision. -- The Portfolio Manager approves/rejects the transaction proposal. If approved, the order will be sent to the simulated exchange and executed. - -

- -

- -## Installation and CLI - -### Installation - -Clone TradingAgents: -```bash -git clone https://github.com/TauricResearch/TradingAgents.git -cd TradingAgents -``` - -Create a virtual environment in any of your favorite environment managers: -```bash -conda create -n tradingagents python=3.13 -conda activate tradingagents -``` - -Install dependencies: -```bash -pip install -r requirements.txt -``` - -### Required APIs - -You will also need the FinnHub API for financial data. All of our code is implemented with the free tier. -```bash -export FINNHUB_API_KEY=$YOUR_FINNHUB_API_KEY -``` - -You will need the OpenAI API for all the agents. -```bash -export OPENAI_API_KEY=$YOUR_OPENAI_API_KEY -``` - -### CLI Usage - -You can also try out the CLI directly by running: -```bash -python -m cli.main -``` -You will see a screen where you can select your desired tickers, date, LLMs, research depth, etc. - -

- -

- -An interface will appear showing results as they load, letting you track the agent's progress as it runs. - -

- -

- -

- -

- -## TradingAgents Package - -### Implementation Details - -We built TradingAgents with LangGraph to ensure flexibility and modularity. We utilize `o1-preview` and `gpt-4o` as our deep thinking and fast thinking LLMs for our experiments. However, for testing purposes, we recommend you use `o4-mini` and `gpt-4.1-mini` to save on costs as our framework makes **lots of** API calls. - -### Python Usage - -To use TradingAgents inside your code, you can import the `tradingagents` module and initialize a `TradingAgentsGraph()` object. The `.propagate()` function will return a decision. You can run `main.py`, here's also a quick example: - -```python -from tradingagents.graph.trading_graph import TradingAgentsGraph -from tradingagents.default_config import DEFAULT_CONFIG - -ta = TradingAgentsGraph(debug=True, config=DEFAULT_CONFIG.copy()) - -# forward propagate -_, decision = ta.propagate("NVDA", "2024-05-10") -print(decision) -``` - -You can also adjust the default configuration to set your own choice of LLMs, debate rounds, etc. - -```python -from tradingagents.graph.trading_graph import TradingAgentsGraph -from tradingagents.default_config import DEFAULT_CONFIG - -# Create a custom config -config = DEFAULT_CONFIG.copy() -config["deep_think_llm"] = "gpt-4.1-nano" # Use a different model -config["quick_think_llm"] = "gpt-4.1-nano" # Use a different model -config["max_debate_rounds"] = 1 # Increase debate rounds -config["online_tools"] = True # Use online tools or cached data - -# Initialize with custom config -ta = TradingAgentsGraph(debug=True, config=config) - -# forward propagate -_, decision = ta.propagate("NVDA", "2024-05-10") -print(decision) -``` - -> For `online_tools`, we recommend enabling them for experimentation, as they provide access to real-time data. The agents' offline tools rely on cached data from our **Tauric TradingDB**, a curated dataset we use for backtesting. We're currently in the process of refining this dataset, and we plan to release it soon alongside our upcoming projects. Stay tuned! - -You can view the full list of configurations in `tradingagents/default_config.py`. - -## Contributing - -We welcome contributions from the community! Whether it's fixing a bug, improving documentation, or suggesting a new feature, your input helps make this project better. If you are interested in this line of research, please consider joining our open-source financial AI research community [Tauric Research](https://tauric.ai/). - -## Citation - -Please reference our work if you find *TradingAgents* provides you with some help :) - -``` -@misc{xiao2025tradingagentsmultiagentsllmfinancial, - title={TradingAgents: Multi-Agents LLM Financial Trading Framework}, - author={Yijia Xiao and Edward Sun and Di Luo and Wei Wang}, - year={2025}, - eprint={2412.20138}, - archivePrefix={arXiv}, - primaryClass={q-fin.TR}, - url={https://arxiv.org/abs/2412.20138}, -} -``` +

+ +

+ +
+ arXiv + Discord + WeChat + X Follow +
+ Community +
+ +
+ + Deutsch | + Espaรฑol | + franรงais | + ๆ—ฅๆœฌ่ชž | + ํ•œ๊ตญ์–ด | + Portuguรชs | + ะ ัƒััะบะธะน | + ไธญๆ–‡ +
+ +--- + +# TradingAgents: Multi-Agents LLM Financial Trading Framework + +> ๐ŸŽ‰ **TradingAgents** officially released! We have received numerous inquiries about the work, and we would like to express our thanks for the enthusiasm in our community. +> +> So we decided to fully open-source the framework. Looking forward to building impactful projects with you! + +
+ + + + + TradingAgents Star History + + +
+ +
+ +๐Ÿš€ [TradingAgents](#tradingagents-framework) | โšก [Installation & CLI](#installation-and-cli) | ๐ŸŽฌ [Demo](https://www.youtube.com/watch?v=90gr5lwjIho) | ๐Ÿ“ฆ [Package Usage](#tradingagents-package) | ๐Ÿค [Contributing](#contributing) | ๐Ÿ“„ [Citation](#citation) + +
+ +## TradingAgents Framework + +TradingAgents is a multi-agent trading framework that mirrors the dynamics of real-world trading firms. By deploying specialized LLM-powered agents: from fundamental analysts, sentiment experts, and technical analysts, to trader, risk management team, the platform collaboratively evaluates market conditions and informs trading decisions. Moreover, these agents engage in dynamic discussions to pinpoint the optimal strategy. + +

+ +

+ +> TradingAgents framework is designed for research purposes. Trading performance may vary based on many factors, including the chosen backbone language models, model temperature, trading periods, the quality of data, and other non-deterministic factors. [It is not intended as financial, investment, or trading advice.](https://tauric.ai/disclaimer/) + +Our framework decomposes complex trading tasks into specialized roles. This ensures the system achieves a robust, scalable approach to market analysis and decision-making. + +### Analyst Team +- Fundamentals Analyst: Evaluates company financials and performance metrics, identifying intrinsic values and potential red flags. +- Sentiment Analyst: Analyzes social media and public sentiment using sentiment scoring algorithms to gauge short-term market mood. +- News Analyst: Monitors global news and macroeconomic indicators, interpreting the impact of events on market conditions. +- Technical Analyst: Utilizes technical indicators (like MACD and RSI) to detect trading patterns and forecast price movements. + +

+ +

+ +### Researcher Team +- Comprises both bullish and bearish researchers who critically assess the insights provided by the Analyst Team. Through structured debates, they balance potential gains against inherent risks. + +

+ +

+ +### Trader Agent +- Composes reports from the analysts and researchers to make informed trading decisions. It determines the timing and magnitude of trades based on comprehensive market insights. + +

+ +

+ +### Risk Management and Portfolio Manager +- Continuously evaluates portfolio risk by assessing market volatility, liquidity, and other risk factors. The risk management team evaluates and adjusts trading strategies, providing assessment reports to the Portfolio Manager for final decision. +- The Portfolio Manager approves/rejects the transaction proposal. If approved, the order will be sent to the simulated exchange and executed. + +

+ +

+ +## Installation and CLI + +### Installation + +Clone TradingAgents: +```bash +git clone https://github.com/TauricResearch/TradingAgents.git +cd TradingAgents +``` + +Create a virtual environment in any of your favorite environment managers: +```bash +conda create -n tradingagents python=3.13 +conda activate tradingagents +``` + +Install dependencies: +```bash +pip install -r requirements.txt +``` + +### Required APIs + +You will also need the FinnHub API for financial data. All of our code is implemented with the free tier. +```bash +export FINNHUB_API_KEY=$YOUR_FINNHUB_API_KEY +``` + +You will need the OpenAI API for all the agents. +```bash +export OPENAI_API_KEY=$YOUR_OPENAI_API_KEY +``` + +### CLI Usage + +You can also try out the CLI directly by running: +```bash +python -m cli.main +``` +You will see a screen where you can select your desired tickers, date, LLMs, research depth, etc. + +

+ +

+ +An interface will appear showing results as they load, letting you track the agent's progress as it runs. + +

+ +

+ +

+ +

+ +## TradingAgents Package + +### Implementation Details + +We built TradingAgents with LangGraph to ensure flexibility and modularity. We utilize `o1-preview` and `gpt-4o` as our deep thinking and fast thinking LLMs for our experiments. However, for testing purposes, we recommend you use `o4-mini` and `gpt-4.1-mini` to save on costs as our framework makes **lots of** API calls. + +### Python Usage + +To use TradingAgents inside your code, you can import the `tradingagents` module and initialize a `TradingAgentsGraph()` object. The `.propagate()` function will return a decision. You can run `main.py`, here's also a quick example: + +```python +from tradingagents.graph.trading_graph import TradingAgentsGraph +from tradingagents.default_config import DEFAULT_CONFIG + +ta = TradingAgentsGraph(debug=True, config=DEFAULT_CONFIG.copy()) + +# forward propagate +_, decision = ta.propagate("NVDA", "2024-05-10") +print(decision) +``` + +You can also adjust the default configuration to set your own choice of LLMs, debate rounds, etc. + +```python +from tradingagents.graph.trading_graph import TradingAgentsGraph +from tradingagents.default_config import DEFAULT_CONFIG + +# Create a custom config +config = DEFAULT_CONFIG.copy() +config["deep_think_llm"] = "gpt-4.1-nano" # Use a different model +config["quick_think_llm"] = "gpt-4.1-nano" # Use a different model +config["max_debate_rounds"] = 1 # Increase debate rounds +config["online_tools"] = True # Use online tools or cached data + +# Initialize with custom config +ta = TradingAgentsGraph(debug=True, config=config) + +# forward propagate +_, decision = ta.propagate("NVDA", "2024-05-10") +print(decision) +``` + +> For `online_tools`, we recommend enabling them for experimentation, as they provide access to real-time data. The agents' offline tools rely on cached data from our **Tauric TradingDB**, a curated dataset we use for backtesting. We're currently in the process of refining this dataset, and we plan to release it soon alongside our upcoming projects. Stay tuned! + +You can view the full list of configurations in `tradingagents/default_config.py`. + +## Contributing + +We welcome contributions from the community! Whether it's fixing a bug, improving documentation, or suggesting a new feature, your input helps make this project better. If you are interested in this line of research, please consider joining our open-source financial AI research community [Tauric Research](https://tauric.ai/). + +## Citation + +Please reference our work if you find *TradingAgents* provides you with some help :) + +``` +@misc{xiao2025tradingagentsmultiagentsllmfinancial, + title={TradingAgents: Multi-Agents LLM Financial Trading Framework}, + author={Yijia Xiao and Edward Sun and Di Luo and Wei Wang}, + year={2025}, + eprint={2412.20138}, + archivePrefix={arXiv}, + primaryClass={q-fin.TR}, + url={https://arxiv.org/abs/2412.20138}, +} +``` diff --git a/cli/main.py b/cli/main.py index e7bed4ee..15dc1d7f 100644 --- a/cli/main.py +++ b/cli/main.py @@ -1,1009 +1,1009 @@ -from typing import Optional -import datetime -import typer -from rich.console import Console -from rich.panel import Panel -from rich.spinner import Spinner -from rich.live import Live -from rich.columns import Columns -from rich.markdown import Markdown -from rich.layout import Layout -from rich.text import Text -from rich.live import Live -from rich.table import Table -from collections import deque -import time -from rich.tree import Tree -from rich import box -from rich.align import Align -from rich.rule import Rule - -from tradingagents.graph.trading_graph import TradingAgentsGraph -from tradingagents.default_config import DEFAULT_CONFIG -from cli.models import AnalystType -from cli.utils import * - -console = Console() - -app = typer.Typer( - name="TradingAgents", - help="TradingAgents CLI: Multi-Agents LLM Financial Trading Framework", - add_completion=True, # Enable shell completion -) - - -# Create a deque to store recent messages with a maximum length -class MessageBuffer: - def __init__(self, max_length=100): - self.messages = deque(maxlen=max_length) - self.tool_calls = deque(maxlen=max_length) - self.current_report = None - self.final_report = None # Store the complete final report - self.agent_status = { - # Analyst Team - "Market Analyst": "pending", - "Social Analyst": "pending", - "News Analyst": "pending", - "Fundamentals Analyst": "pending", - # Research Team - "Bull Researcher": "pending", - "Bear Researcher": "pending", - "Research Manager": "pending", - # Trading Team - "Trader": "pending", - # Risk Management Team - "Risky Analyst": "pending", - "Neutral Analyst": "pending", - "Safe Analyst": "pending", - # Portfolio Management Team - "Portfolio Manager": "pending", - } - self.current_agent = None - self.report_sections = { - "market_report": None, - "sentiment_report": None, - "news_report": None, - "fundamentals_report": None, - "investment_plan": None, - "trader_investment_plan": None, - "final_trade_decision": None, - } - - def add_message(self, message_type, content): - timestamp = datetime.datetime.now().strftime("%H:%M:%S") - self.messages.append((timestamp, message_type, content)) - - def add_tool_call(self, tool_name, args): - timestamp = datetime.datetime.now().strftime("%H:%M:%S") - self.tool_calls.append((timestamp, tool_name, args)) - - def update_agent_status(self, agent, status): - if agent in self.agent_status: - self.agent_status[agent] = status - self.current_agent = agent - - def update_report_section(self, section_name, content): - if section_name in self.report_sections: - self.report_sections[section_name] = content - self._update_current_report() - - def _update_current_report(self): - # For the panel display, only show the most recently updated section - latest_section = None - latest_content = None - - # Find the most recently updated section - for section, content in self.report_sections.items(): - if content is not None: - latest_section = section - latest_content = content - - if latest_section and latest_content: - # Format the current section for display - section_titles = { - "market_report": "Market Analysis", - "sentiment_report": "Social Sentiment", - "news_report": "News Analysis", - "fundamentals_report": "Fundamentals Analysis", - "investment_plan": "Research Team Decision", - "trader_investment_plan": "Trading Team Plan", - "final_trade_decision": "Portfolio Management Decision", - } - self.current_report = ( - f"### {section_titles[latest_section]}\n{latest_content}" - ) - - # Update the final complete report - self._update_final_report() - - def _update_final_report(self): - report_parts = [] - - # Analyst Team Reports - if any( - self.report_sections[section] - for section in [ - "market_report", - "sentiment_report", - "news_report", - "fundamentals_report", - ] - ): - report_parts.append("## Analyst Team Reports") - if self.report_sections["market_report"]: - report_parts.append( - f"### Market Analysis\n{self.report_sections['market_report']}" - ) - if self.report_sections["sentiment_report"]: - report_parts.append( - f"### Social Sentiment\n{self.report_sections['sentiment_report']}" - ) - if self.report_sections["news_report"]: - report_parts.append( - f"### News Analysis\n{self.report_sections['news_report']}" - ) - if self.report_sections["fundamentals_report"]: - report_parts.append( - f"### Fundamentals Analysis\n{self.report_sections['fundamentals_report']}" - ) - - # Research Team Reports - if self.report_sections["investment_plan"]: - report_parts.append("## Research Team Decision") - report_parts.append(f"{self.report_sections['investment_plan']}") - - # Trading Team Reports - if self.report_sections["trader_investment_plan"]: - report_parts.append("## Trading Team Plan") - report_parts.append(f"{self.report_sections['trader_investment_plan']}") - - # Portfolio Management Decision - if self.report_sections["final_trade_decision"]: - report_parts.append("## Portfolio Management Decision") - report_parts.append(f"{self.report_sections['final_trade_decision']}") - - self.final_report = "\n\n".join(report_parts) if report_parts else None - - -message_buffer = MessageBuffer() - - -def create_layout(): - layout = Layout() - layout.split_column( - Layout(name="header", size=3), - Layout(name="main"), - Layout(name="footer", size=3), - ) - layout["main"].split_column( - Layout(name="upper", ratio=3), Layout(name="analysis", ratio=5) - ) - layout["upper"].split_row( - Layout(name="progress", ratio=2), Layout(name="messages", ratio=3) - ) - return layout - - -def update_display(layout, spinner_text=None): - # Header with welcome message - layout["header"].update( - Panel( - "[bold green]Welcome to TradingAgents CLI[/bold green]\n" - "[dim]ยฉ [Tauric Research](https://github.com/TauricResearch)[/dim]", - title="Welcome to TradingAgents", - border_style="green", - padding=(1, 2), - expand=True, - ) - ) - - # Progress panel showing agent status - progress_table = Table( - show_header=True, - header_style="bold magenta", - show_footer=False, - box=box.SIMPLE_HEAD, # Use simple header with horizontal lines - title=None, # Remove the redundant Progress title - padding=(0, 2), # Add horizontal padding - expand=True, # Make table expand to fill available space - ) - progress_table.add_column("Team", style="cyan", justify="center", width=20) - progress_table.add_column("Agent", style="green", justify="center", width=20) - progress_table.add_column("Status", style="yellow", justify="center", width=20) - - # Group agents by team - teams = { - "Analyst Team": [ - "Market Analyst", - "Social Analyst", - "News Analyst", - "Fundamentals Analyst", - ], - "Research Team": ["Bull Researcher", "Bear Researcher", "Research Manager"], - "Trading Team": ["Trader"], - "Risk Management": ["Risky Analyst", "Neutral Analyst", "Safe Analyst"], - "Portfolio Management": ["Portfolio Manager"], - } - - for team, agents in teams.items(): - # Add first agent with team name - first_agent = agents[0] - status = message_buffer.agent_status[first_agent] - if status == "in_progress": - spinner = Spinner( - "dots", text="[blue]in_progress[/blue]", style="bold cyan" - ) - status_cell = spinner - else: - status_color = { - "pending": "yellow", - "completed": "green", - "error": "red", - }.get(status, "white") - status_cell = f"[{status_color}]{status}[/{status_color}]" - progress_table.add_row(team, first_agent, status_cell) - - # Add remaining agents in team - for agent in agents[1:]: - status = message_buffer.agent_status[agent] - if status == "in_progress": - spinner = Spinner( - "dots", text="[blue]in_progress[/blue]", style="bold cyan" - ) - status_cell = spinner - else: - status_color = { - "pending": "yellow", - "completed": "green", - "error": "red", - }.get(status, "white") - status_cell = f"[{status_color}]{status}[/{status_color}]" - progress_table.add_row("", agent, status_cell) - - # Add horizontal line after each team - progress_table.add_row("โ”€" * 20, "โ”€" * 20, "โ”€" * 20, style="dim") - - layout["progress"].update( - Panel(progress_table, title="Progress", border_style="cyan", padding=(1, 2)) - ) - - # Messages panel showing recent messages and tool calls - messages_table = Table( - show_header=True, - header_style="bold magenta", - show_footer=False, - expand=True, # Make table expand to fill available space - box=box.MINIMAL, # Use minimal box style for a lighter look - show_lines=True, # Keep horizontal lines - padding=(0, 1), # Add some padding between columns - ) - messages_table.add_column("Time", style="cyan", width=8, justify="center") - messages_table.add_column("Type", style="green", width=10, justify="center") - messages_table.add_column( - "Content", style="white", no_wrap=False, ratio=1 - ) # Make content column expand - - # Combine tool calls and messages - all_messages = [] - - # Add tool calls - for timestamp, tool_name, args in message_buffer.tool_calls: - # Truncate tool call args if too long - if isinstance(args, str) and len(args) > 100: - args = args[:97] + "..." - all_messages.append((timestamp, "Tool", f"{tool_name}: {args}")) - - # Add regular messages - for timestamp, msg_type, content in message_buffer.messages: - # Truncate message content if too long - if isinstance(content, str) and len(content) > 200: - content = content[:197] + "..." - all_messages.append((timestamp, msg_type, content)) - - # Sort by timestamp - all_messages.sort(key=lambda x: x[0]) - - # Calculate how many messages we can show based on available space - # Start with a reasonable number and adjust based on content length - max_messages = 12 # Increased from 8 to better fill the space - - # Get the last N messages that will fit in the panel - recent_messages = all_messages[-max_messages:] - - # Add messages to table - for timestamp, msg_type, content in recent_messages: - # Format content with word wrapping - wrapped_content = Text(content, overflow="fold") - messages_table.add_row(timestamp, msg_type, wrapped_content) - - if spinner_text: - messages_table.add_row("", "Spinner", spinner_text) - - # Add a footer to indicate if messages were truncated - if len(all_messages) > max_messages: - messages_table.footer = ( - f"[dim]Showing last {max_messages} of {len(all_messages)} messages[/dim]" - ) - - layout["messages"].update( - Panel( - messages_table, - title="Messages & Tools", - border_style="blue", - padding=(1, 2), - ) - ) - - # Analysis panel showing current report - if message_buffer.current_report: - layout["analysis"].update( - Panel( - Markdown(message_buffer.current_report), - title="Current Report", - border_style="green", - padding=(1, 2), - ) - ) - else: - layout["analysis"].update( - Panel( - "[italic]Waiting for analysis report...[/italic]", - title="Current Report", - border_style="green", - padding=(1, 2), - ) - ) - - # Footer with statistics - tool_calls_count = len(message_buffer.tool_calls) - llm_calls_count = sum( - 1 for _, msg_type, _ in message_buffer.messages if msg_type == "Reasoning" - ) - reports_count = sum( - 1 for content in message_buffer.report_sections.values() if content is not None - ) - - stats_table = Table(show_header=False, box=None, padding=(0, 2), expand=True) - stats_table.add_column("Stats", justify="center") - stats_table.add_row( - f"Tool Calls: {tool_calls_count} | LLM Calls: {llm_calls_count} | Generated Reports: {reports_count}" - ) - - layout["footer"].update(Panel(stats_table, border_style="grey50")) - - -def get_user_selections(): - """Get all user selections before starting the analysis display.""" - # Display ASCII art welcome message - with open("./cli/static/welcome.txt", "r") as f: - welcome_ascii = f.read() - - # Create welcome box content - welcome_content = f"{welcome_ascii}\n" - welcome_content += "[bold green]TradingAgents: Multi-Agents LLM Financial Trading Framework - CLI[/bold green]\n\n" - welcome_content += "[bold]Workflow Steps:[/bold]\n" - welcome_content += "I. Analyst Team โ†’ II. Research Team โ†’ III. Trader โ†’ IV. Risk Management โ†’ V. Portfolio Management\n\n" - welcome_content += ( - "[dim]Built by [Tauric Research](https://github.com/TauricResearch)[/dim]" - ) - - # Create and center the welcome box - welcome_box = Panel( - welcome_content, - border_style="green", - padding=(1, 2), - title="Welcome to TradingAgents", - subtitle="Multi-Agents LLM Financial Trading Framework", - ) - console.print(Align.center(welcome_box)) - console.print() # Add a blank line after the welcome box - - # Create a boxed questionnaire for each step - def create_question_box(title, prompt, default=None): - box_content = f"[bold]{title}[/bold]\n" - box_content += f"[dim]{prompt}[/dim]" - if default: - box_content += f"\n[dim]Default: {default}[/dim]" - return Panel(box_content, border_style="blue", padding=(1, 2)) - - # Step 1: Ticker symbol - console.print( - create_question_box( - "Step 1: Ticker Symbol", "Enter the ticker symbol to analyze", "SPY" - ) - ) - selected_ticker = get_ticker() - - # Step 2: Analysis date - default_date = datetime.datetime.now().strftime("%Y-%m-%d") - console.print( - create_question_box( - "Step 2: Analysis Date", - "Enter the analysis date (YYYY-MM-DD)", - default_date, - ) - ) - analysis_date = get_analysis_date() - - # Step 3: Select analysts - console.print( - create_question_box( - "Step 3: Analysts Team", "Select your LLM analyst agents for the analysis" - ) - ) - selected_analysts = select_analysts() - console.print( - f"[green]Selected analysts:[/green] {', '.join(analyst.value for analyst in selected_analysts)}" - ) - - # Step 4: Research depth - console.print( - create_question_box( - "Step 4: Research Depth", "Select your research depth level" - ) - ) - selected_research_depth = select_research_depth() - - # Step 5: Thinking agents - console.print( - create_question_box( - "Step 5: Thinking Agents", "Select your thinking agents for analysis" - ) - ) - selected_shallow_thinker = select_shallow_thinking_agent() - selected_deep_thinker = select_deep_thinking_agent() - - return { - "ticker": selected_ticker, - "analysis_date": analysis_date, - "analysts": selected_analysts, - "research_depth": selected_research_depth, - "shallow_thinker": selected_shallow_thinker, - "deep_thinker": selected_deep_thinker, - } - - -def get_ticker(): - """Get ticker symbol from user input.""" - return typer.prompt("", default="SPY") - - -def get_analysis_date(): - """Get the analysis date from user input.""" - while True: - date_str = typer.prompt( - "", default=datetime.datetime.now().strftime("%Y-%m-%d") - ) - try: - # Validate date format and ensure it's not in the future - analysis_date = datetime.datetime.strptime(date_str, "%Y-%m-%d") - if analysis_date.date() > datetime.datetime.now().date(): - console.print("[red]Error: Analysis date cannot be in the future[/red]") - continue - return date_str - except ValueError: - console.print( - "[red]Error: Invalid date format. Please use YYYY-MM-DD[/red]" - ) - - -def display_complete_report(final_state): - """Display the complete analysis report with team-based panels.""" - console.print("\n[bold green]Complete Analysis Report[/bold green]\n") - - # I. Analyst Team Reports - analyst_reports = [] - - # Market Analyst Report - if final_state.get("market_report"): - analyst_reports.append( - Panel( - Markdown(final_state["market_report"]), - title="Market Analyst", - border_style="blue", - padding=(1, 2), - ) - ) - - # Social Analyst Report - if final_state.get("sentiment_report"): - analyst_reports.append( - Panel( - Markdown(final_state["sentiment_report"]), - title="Social Analyst", - border_style="blue", - padding=(1, 2), - ) - ) - - # News Analyst Report - if final_state.get("news_report"): - analyst_reports.append( - Panel( - Markdown(final_state["news_report"]), - title="News Analyst", - border_style="blue", - padding=(1, 2), - ) - ) - - # Fundamentals Analyst Report - if final_state.get("fundamentals_report"): - analyst_reports.append( - Panel( - Markdown(final_state["fundamentals_report"]), - title="Fundamentals Analyst", - border_style="blue", - padding=(1, 2), - ) - ) - - if analyst_reports: - console.print( - Panel( - Columns(analyst_reports, equal=True, expand=True), - title="I. Analyst Team Reports", - border_style="cyan", - padding=(1, 2), - ) - ) - - # II. Research Team Reports - if final_state.get("investment_debate_state"): - research_reports = [] - debate_state = final_state["investment_debate_state"] - - # Bull Researcher Analysis - if debate_state.get("bull_history"): - research_reports.append( - Panel( - Markdown(debate_state["bull_history"]), - title="Bull Researcher", - border_style="blue", - padding=(1, 2), - ) - ) - - # Bear Researcher Analysis - if debate_state.get("bear_history"): - research_reports.append( - Panel( - Markdown(debate_state["bear_history"]), - title="Bear Researcher", - border_style="blue", - padding=(1, 2), - ) - ) - - # Research Manager Decision - if debate_state.get("judge_decision"): - research_reports.append( - Panel( - Markdown(debate_state["judge_decision"]), - title="Research Manager", - border_style="blue", - padding=(1, 2), - ) - ) - - if research_reports: - console.print( - Panel( - Columns(research_reports, equal=True, expand=True), - title="II. Research Team Decision", - border_style="magenta", - padding=(1, 2), - ) - ) - - # III. Trading Team Reports - if final_state.get("trader_investment_plan"): - console.print( - Panel( - Panel( - Markdown(final_state["trader_investment_plan"]), - title="Trader", - border_style="blue", - padding=(1, 2), - ), - title="III. Trading Team Plan", - border_style="yellow", - padding=(1, 2), - ) - ) - - # IV. Risk Management Team Reports - if final_state.get("risk_debate_state"): - risk_reports = [] - risk_state = final_state["risk_debate_state"] - - # Aggressive (Risky) Analyst Analysis - if risk_state.get("risky_history"): - risk_reports.append( - Panel( - Markdown(risk_state["risky_history"]), - title="Aggressive Analyst", - border_style="blue", - padding=(1, 2), - ) - ) - - # Conservative (Safe) Analyst Analysis - if risk_state.get("safe_history"): - risk_reports.append( - Panel( - Markdown(risk_state["safe_history"]), - title="Conservative Analyst", - border_style="blue", - padding=(1, 2), - ) - ) - - # Neutral Analyst Analysis - if risk_state.get("neutral_history"): - risk_reports.append( - Panel( - Markdown(risk_state["neutral_history"]), - title="Neutral Analyst", - border_style="blue", - padding=(1, 2), - ) - ) - - if risk_reports: - console.print( - Panel( - Columns(risk_reports, equal=True, expand=True), - title="IV. Risk Management Team Decision", - border_style="red", - padding=(1, 2), - ) - ) - - # V. Portfolio Manager Decision - if risk_state.get("judge_decision"): - console.print( - Panel( - Panel( - Markdown(risk_state["judge_decision"]), - title="Portfolio Manager", - border_style="blue", - padding=(1, 2), - ), - title="V. Portfolio Manager Decision", - border_style="green", - padding=(1, 2), - ) - ) - - -def update_research_team_status(status): - """Update status for all research team members and trader.""" - research_team = ["Bull Researcher", "Bear Researcher", "Research Manager", "Trader"] - for agent in research_team: - message_buffer.update_agent_status(agent, status) - - -def run_analysis(): - # First get all user selections - selections = get_user_selections() - - # Create config with selected research depth - config = DEFAULT_CONFIG.copy() - config["max_debate_rounds"] = selections["research_depth"] - config["max_risk_discuss_rounds"] = selections["research_depth"] - config["quick_think_llm"] = selections["shallow_thinker"] - config["deep_think_llm"] = selections["deep_thinker"] - - # Initialize the graph - graph = TradingAgentsGraph( - [analyst.value for analyst in selections["analysts"]], config=config, debug=True - ) - - # Now start the display layout - layout = create_layout() - - with Live(layout, refresh_per_second=4) as live: - # Initial display - update_display(layout) - - # Add initial messages - message_buffer.add_message("System", f"Selected ticker: {selections['ticker']}") - message_buffer.add_message( - "System", f"Analysis date: {selections['analysis_date']}" - ) - message_buffer.add_message( - "System", - f"Selected analysts: {', '.join(analyst.value for analyst in selections['analysts'])}", - ) - update_display(layout) - - # Reset agent statuses - for agent in message_buffer.agent_status: - message_buffer.update_agent_status(agent, "pending") - - # Reset report sections - for section in message_buffer.report_sections: - message_buffer.report_sections[section] = None - message_buffer.current_report = None - message_buffer.final_report = None - - # Update agent status to in_progress for the first analyst - first_analyst = f"{selections['analysts'][0].value.capitalize()} Analyst" - message_buffer.update_agent_status(first_analyst, "in_progress") - update_display(layout) - - # Create spinner text - spinner_text = ( - f"Analyzing {selections['ticker']} on {selections['analysis_date']}..." - ) - update_display(layout, spinner_text) - - # Initialize state and get graph args - init_agent_state = graph.propagator.create_initial_state( - selections["ticker"], selections["analysis_date"] - ) - args = graph.propagator.get_graph_args() - - # Stream the analysis - trace = [] - for chunk in graph.graph.stream(init_agent_state, **args): - if len(chunk["messages"]) > 0: - # Get the last message from the chunk - last_message = chunk["messages"][-1] - - # Extract message content and type - if hasattr(last_message, "content"): - content = last_message.content - msg_type = "Reasoning" - else: - content = str(last_message) - msg_type = "System" - - # Add message to buffer - message_buffer.add_message(msg_type, content) - - # If it's a tool call, add it to tool calls - if hasattr(last_message, "tool_calls"): - for tool_call in last_message.tool_calls: - # Handle both dictionary and object tool calls - if isinstance(tool_call, dict): - message_buffer.add_tool_call( - tool_call["name"], tool_call["args"] - ) - else: - message_buffer.add_tool_call(tool_call.name, tool_call.args) - - # Update reports and agent status based on chunk content - # Analyst Team Reports - if "market_report" in chunk and chunk["market_report"]: - message_buffer.update_report_section( - "market_report", chunk["market_report"] - ) - message_buffer.update_agent_status("Market Analyst", "completed") - # Set next analyst to in_progress - if "social" in selections["analysts"]: - message_buffer.update_agent_status( - "Social Analyst", "in_progress" - ) - - if "sentiment_report" in chunk and chunk["sentiment_report"]: - message_buffer.update_report_section( - "sentiment_report", chunk["sentiment_report"] - ) - message_buffer.update_agent_status("Social Analyst", "completed") - # Set next analyst to in_progress - if "news" in selections["analysts"]: - message_buffer.update_agent_status( - "News Analyst", "in_progress" - ) - - if "news_report" in chunk and chunk["news_report"]: - message_buffer.update_report_section( - "news_report", chunk["news_report"] - ) - message_buffer.update_agent_status("News Analyst", "completed") - # Set next analyst to in_progress - if "fundamentals" in selections["analysts"]: - message_buffer.update_agent_status( - "Fundamentals Analyst", "in_progress" - ) - - if "fundamentals_report" in chunk and chunk["fundamentals_report"]: - message_buffer.update_report_section( - "fundamentals_report", chunk["fundamentals_report"] - ) - message_buffer.update_agent_status( - "Fundamentals Analyst", "completed" - ) - # Set all research team members to in_progress - update_research_team_status("in_progress") - - # Research Team - Handle Investment Debate State - if ( - "investment_debate_state" in chunk - and chunk["investment_debate_state"] - ): - debate_state = chunk["investment_debate_state"] - - # Update Bull Researcher status and report - if "bull_history" in debate_state and debate_state["bull_history"]: - # Keep all research team members in progress - update_research_team_status("in_progress") - # Extract latest bull response - bull_responses = debate_state["bull_history"].split("\n") - latest_bull = bull_responses[-1] if bull_responses else "" - if latest_bull: - message_buffer.add_message("Reasoning", latest_bull) - # Update research report with bull's latest analysis - message_buffer.update_report_section( - "investment_plan", - f"### Bull Researcher Analysis\n{latest_bull}", - ) - - # Update Bear Researcher status and report - if "bear_history" in debate_state and debate_state["bear_history"]: - # Keep all research team members in progress - update_research_team_status("in_progress") - # Extract latest bear response - bear_responses = debate_state["bear_history"].split("\n") - latest_bear = bear_responses[-1] if bear_responses else "" - if latest_bear: - message_buffer.add_message("Reasoning", latest_bear) - # Update research report with bear's latest analysis - message_buffer.update_report_section( - "investment_plan", - f"{message_buffer.report_sections['investment_plan']}\n\n### Bear Researcher Analysis\n{latest_bear}", - ) - - # Update Research Manager status and final decision - if ( - "judge_decision" in debate_state - and debate_state["judge_decision"] - ): - # Keep all research team members in progress until final decision - update_research_team_status("in_progress") - message_buffer.add_message( - "Reasoning", - f"Research Manager: {debate_state['judge_decision']}", - ) - # Update research report with final decision - message_buffer.update_report_section( - "investment_plan", - f"{message_buffer.report_sections['investment_plan']}\n\n### Research Manager Decision\n{debate_state['judge_decision']}", - ) - # Mark all research team members as completed - update_research_team_status("completed") - # Set first risk analyst to in_progress - message_buffer.update_agent_status( - "Risky Analyst", "in_progress" - ) - - # Trading Team - if ( - "trader_investment_plan" in chunk - and chunk["trader_investment_plan"] - ): - message_buffer.update_report_section( - "trader_investment_plan", chunk["trader_investment_plan"] - ) - # Set first risk analyst to in_progress - message_buffer.update_agent_status("Risky Analyst", "in_progress") - - # Risk Management Team - Handle Risk Debate State - if "risk_debate_state" in chunk and chunk["risk_debate_state"]: - risk_state = chunk["risk_debate_state"] - - # Update Risky Analyst status and report - if ( - "current_risky_response" in risk_state - and risk_state["current_risky_response"] - ): - message_buffer.update_agent_status( - "Risky Analyst", "in_progress" - ) - message_buffer.add_message( - "Reasoning", - f"Risky Analyst: {risk_state['current_risky_response']}", - ) - # Update risk report with risky analyst's latest analysis only - message_buffer.update_report_section( - "final_trade_decision", - f"### Risky Analyst Analysis\n{risk_state['current_risky_response']}", - ) - - # Update Safe Analyst status and report - if ( - "current_safe_response" in risk_state - and risk_state["current_safe_response"] - ): - message_buffer.update_agent_status( - "Safe Analyst", "in_progress" - ) - message_buffer.add_message( - "Reasoning", - f"Safe Analyst: {risk_state['current_safe_response']}", - ) - # Update risk report with safe analyst's latest analysis only - message_buffer.update_report_section( - "final_trade_decision", - f"### Safe Analyst Analysis\n{risk_state['current_safe_response']}", - ) - - # Update Neutral Analyst status and report - if ( - "current_neutral_response" in risk_state - and risk_state["current_neutral_response"] - ): - message_buffer.update_agent_status( - "Neutral Analyst", "in_progress" - ) - message_buffer.add_message( - "Reasoning", - f"Neutral Analyst: {risk_state['current_neutral_response']}", - ) - # Update risk report with neutral analyst's latest analysis only - message_buffer.update_report_section( - "final_trade_decision", - f"### Neutral Analyst Analysis\n{risk_state['current_neutral_response']}", - ) - - # Update Portfolio Manager status and final decision - if "judge_decision" in risk_state and risk_state["judge_decision"]: - message_buffer.update_agent_status( - "Portfolio Manager", "in_progress" - ) - message_buffer.add_message( - "Reasoning", - f"Portfolio Manager: {risk_state['judge_decision']}", - ) - # Update risk report with final decision only - message_buffer.update_report_section( - "final_trade_decision", - f"### Portfolio Manager Decision\n{risk_state['judge_decision']}", - ) - # Mark risk analysts as completed - message_buffer.update_agent_status("Risky Analyst", "completed") - message_buffer.update_agent_status("Safe Analyst", "completed") - message_buffer.update_agent_status( - "Neutral Analyst", "completed" - ) - message_buffer.update_agent_status( - "Portfolio Manager", "completed" - ) - - # Update the display - update_display(layout) - - trace.append(chunk) - - # Get final state and decision - final_state = trace[-1] - decision = graph.process_signal(final_state["final_trade_decision"]) - - # Update all agent statuses to completed - for agent in message_buffer.agent_status: - message_buffer.update_agent_status(agent, "completed") - - message_buffer.add_message( - "Analysis", f"Completed analysis for {selections['analysis_date']}" - ) - - # Update final report sections - for section in message_buffer.report_sections.keys(): - if section in final_state: - message_buffer.update_report_section(section, final_state[section]) - - # Display the complete final report - display_complete_report(final_state) - - update_display(layout) - - -@app.command() -def analyze(): - run_analysis() - - -if __name__ == "__main__": - app() +from typing import Optional +import datetime +import typer +from rich.console import Console +from rich.panel import Panel +from rich.spinner import Spinner +from rich.live import Live +from rich.columns import Columns +from rich.markdown import Markdown +from rich.layout import Layout +from rich.text import Text +from rich.live import Live +from rich.table import Table +from collections import deque +import time +from rich.tree import Tree +from rich import box +from rich.align import Align +from rich.rule import Rule + +from tradingagents.graph.trading_graph import TradingAgentsGraph +from tradingagents.default_config import DEFAULT_CONFIG +from cli.models import AnalystType +from cli.utils import * + +console = Console() + +app = typer.Typer( + name="TradingAgents", + help="TradingAgents CLI: Multi-Agents LLM Financial Trading Framework", + add_completion=True, # Enable shell completion +) + + +# Create a deque to store recent messages with a maximum length +class MessageBuffer: + def __init__(self, max_length=100): + self.messages = deque(maxlen=max_length) + self.tool_calls = deque(maxlen=max_length) + self.current_report = None + self.final_report = None # Store the complete final report + self.agent_status = { + # Analyst Team + "Market Analyst": "pending", + "Social Analyst": "pending", + "News Analyst": "pending", + "Fundamentals Analyst": "pending", + # Research Team + "Bull Researcher": "pending", + "Bear Researcher": "pending", + "Research Manager": "pending", + # Trading Team + "Trader": "pending", + # Risk Management Team + "Risky Analyst": "pending", + "Neutral Analyst": "pending", + "Safe Analyst": "pending", + # Portfolio Management Team + "Portfolio Manager": "pending", + } + self.current_agent = None + self.report_sections = { + "market_report": None, + "sentiment_report": None, + "news_report": None, + "fundamentals_report": None, + "investment_plan": None, + "trader_investment_plan": None, + "final_trade_decision": None, + } + + def add_message(self, message_type, content): + timestamp = datetime.datetime.now().strftime("%H:%M:%S") + self.messages.append((timestamp, message_type, content)) + + def add_tool_call(self, tool_name, args): + timestamp = datetime.datetime.now().strftime("%H:%M:%S") + self.tool_calls.append((timestamp, tool_name, args)) + + def update_agent_status(self, agent, status): + if agent in self.agent_status: + self.agent_status[agent] = status + self.current_agent = agent + + def update_report_section(self, section_name, content): + if section_name in self.report_sections: + self.report_sections[section_name] = content + self._update_current_report() + + def _update_current_report(self): + # For the panel display, only show the most recently updated section + latest_section = None + latest_content = None + + # Find the most recently updated section + for section, content in self.report_sections.items(): + if content is not None: + latest_section = section + latest_content = content + + if latest_section and latest_content: + # Format the current section for display + section_titles = { + "market_report": "Market Analysis", + "sentiment_report": "Social Sentiment", + "news_report": "News Analysis", + "fundamentals_report": "Fundamentals Analysis", + "investment_plan": "Research Team Decision", + "trader_investment_plan": "Trading Team Plan", + "final_trade_decision": "Portfolio Management Decision", + } + self.current_report = ( + f"### {section_titles[latest_section]}\n{latest_content}" + ) + + # Update the final complete report + self._update_final_report() + + def _update_final_report(self): + report_parts = [] + + # Analyst Team Reports + if any( + self.report_sections[section] + for section in [ + "market_report", + "sentiment_report", + "news_report", + "fundamentals_report", + ] + ): + report_parts.append("## Analyst Team Reports") + if self.report_sections["market_report"]: + report_parts.append( + f"### Market Analysis\n{self.report_sections['market_report']}" + ) + if self.report_sections["sentiment_report"]: + report_parts.append( + f"### Social Sentiment\n{self.report_sections['sentiment_report']}" + ) + if self.report_sections["news_report"]: + report_parts.append( + f"### News Analysis\n{self.report_sections['news_report']}" + ) + if self.report_sections["fundamentals_report"]: + report_parts.append( + f"### Fundamentals Analysis\n{self.report_sections['fundamentals_report']}" + ) + + # Research Team Reports + if self.report_sections["investment_plan"]: + report_parts.append("## Research Team Decision") + report_parts.append(f"{self.report_sections['investment_plan']}") + + # Trading Team Reports + if self.report_sections["trader_investment_plan"]: + report_parts.append("## Trading Team Plan") + report_parts.append(f"{self.report_sections['trader_investment_plan']}") + + # Portfolio Management Decision + if self.report_sections["final_trade_decision"]: + report_parts.append("## Portfolio Management Decision") + report_parts.append(f"{self.report_sections['final_trade_decision']}") + + self.final_report = "\n\n".join(report_parts) if report_parts else None + + +message_buffer = MessageBuffer() + + +def create_layout(): + layout = Layout() + layout.split_column( + Layout(name="header", size=3), + Layout(name="main"), + Layout(name="footer", size=3), + ) + layout["main"].split_column( + Layout(name="upper", ratio=3), Layout(name="analysis", ratio=5) + ) + layout["upper"].split_row( + Layout(name="progress", ratio=2), Layout(name="messages", ratio=3) + ) + return layout + + +def update_display(layout, spinner_text=None): + # Header with welcome message + layout["header"].update( + Panel( + "[bold green]Welcome to TradingAgents CLI[/bold green]\n" + "[dim]ยฉ [Tauric Research](https://github.com/TauricResearch)[/dim]", + title="Welcome to TradingAgents", + border_style="green", + padding=(1, 2), + expand=True, + ) + ) + + # Progress panel showing agent status + progress_table = Table( + show_header=True, + header_style="bold magenta", + show_footer=False, + box=box.SIMPLE_HEAD, # Use simple header with horizontal lines + title=None, # Remove the redundant Progress title + padding=(0, 2), # Add horizontal padding + expand=True, # Make table expand to fill available space + ) + progress_table.add_column("Team", style="cyan", justify="center", width=20) + progress_table.add_column("Agent", style="green", justify="center", width=20) + progress_table.add_column("Status", style="yellow", justify="center", width=20) + + # Group agents by team + teams = { + "Analyst Team": [ + "Market Analyst", + "Social Analyst", + "News Analyst", + "Fundamentals Analyst", + ], + "Research Team": ["Bull Researcher", "Bear Researcher", "Research Manager"], + "Trading Team": ["Trader"], + "Risk Management": ["Risky Analyst", "Neutral Analyst", "Safe Analyst"], + "Portfolio Management": ["Portfolio Manager"], + } + + for team, agents in teams.items(): + # Add first agent with team name + first_agent = agents[0] + status = message_buffer.agent_status[first_agent] + if status == "in_progress": + spinner = Spinner( + "dots", text="[blue]in_progress[/blue]", style="bold cyan" + ) + status_cell = spinner + else: + status_color = { + "pending": "yellow", + "completed": "green", + "error": "red", + }.get(status, "white") + status_cell = f"[{status_color}]{status}[/{status_color}]" + progress_table.add_row(team, first_agent, status_cell) + + # Add remaining agents in team + for agent in agents[1:]: + status = message_buffer.agent_status[agent] + if status == "in_progress": + spinner = Spinner( + "dots", text="[blue]in_progress[/blue]", style="bold cyan" + ) + status_cell = spinner + else: + status_color = { + "pending": "yellow", + "completed": "green", + "error": "red", + }.get(status, "white") + status_cell = f"[{status_color}]{status}[/{status_color}]" + progress_table.add_row("", agent, status_cell) + + # Add horizontal line after each team + progress_table.add_row("โ”€" * 20, "โ”€" * 20, "โ”€" * 20, style="dim") + + layout["progress"].update( + Panel(progress_table, title="Progress", border_style="cyan", padding=(1, 2)) + ) + + # Messages panel showing recent messages and tool calls + messages_table = Table( + show_header=True, + header_style="bold magenta", + show_footer=False, + expand=True, # Make table expand to fill available space + box=box.MINIMAL, # Use minimal box style for a lighter look + show_lines=True, # Keep horizontal lines + padding=(0, 1), # Add some padding between columns + ) + messages_table.add_column("Time", style="cyan", width=8, justify="center") + messages_table.add_column("Type", style="green", width=10, justify="center") + messages_table.add_column( + "Content", style="white", no_wrap=False, ratio=1 + ) # Make content column expand + + # Combine tool calls and messages + all_messages = [] + + # Add tool calls + for timestamp, tool_name, args in message_buffer.tool_calls: + # Truncate tool call args if too long + if isinstance(args, str) and len(args) > 100: + args = args[:97] + "..." + all_messages.append((timestamp, "Tool", f"{tool_name}: {args}")) + + # Add regular messages + for timestamp, msg_type, content in message_buffer.messages: + # Truncate message content if too long + if isinstance(content, str) and len(content) > 200: + content = content[:197] + "..." + all_messages.append((timestamp, msg_type, content)) + + # Sort by timestamp + all_messages.sort(key=lambda x: x[0]) + + # Calculate how many messages we can show based on available space + # Start with a reasonable number and adjust based on content length + max_messages = 12 # Increased from 8 to better fill the space + + # Get the last N messages that will fit in the panel + recent_messages = all_messages[-max_messages:] + + # Add messages to table + for timestamp, msg_type, content in recent_messages: + # Format content with word wrapping + wrapped_content = Text(content, overflow="fold") + messages_table.add_row(timestamp, msg_type, wrapped_content) + + if spinner_text: + messages_table.add_row("", "Spinner", spinner_text) + + # Add a footer to indicate if messages were truncated + if len(all_messages) > max_messages: + messages_table.footer = ( + f"[dim]Showing last {max_messages} of {len(all_messages)} messages[/dim]" + ) + + layout["messages"].update( + Panel( + messages_table, + title="Messages & Tools", + border_style="blue", + padding=(1, 2), + ) + ) + + # Analysis panel showing current report + if message_buffer.current_report: + layout["analysis"].update( + Panel( + Markdown(message_buffer.current_report), + title="Current Report", + border_style="green", + padding=(1, 2), + ) + ) + else: + layout["analysis"].update( + Panel( + "[italic]Waiting for analysis report...[/italic]", + title="Current Report", + border_style="green", + padding=(1, 2), + ) + ) + + # Footer with statistics + tool_calls_count = len(message_buffer.tool_calls) + llm_calls_count = sum( + 1 for _, msg_type, _ in message_buffer.messages if msg_type == "Reasoning" + ) + reports_count = sum( + 1 for content in message_buffer.report_sections.values() if content is not None + ) + + stats_table = Table(show_header=False, box=None, padding=(0, 2), expand=True) + stats_table.add_column("Stats", justify="center") + stats_table.add_row( + f"Tool Calls: {tool_calls_count} | LLM Calls: {llm_calls_count} | Generated Reports: {reports_count}" + ) + + layout["footer"].update(Panel(stats_table, border_style="grey50")) + + +def get_user_selections(): + """Get all user selections before starting the analysis display.""" + # Display ASCII art welcome message + with open("./cli/static/welcome.txt", "r") as f: + welcome_ascii = f.read() + + # Create welcome box content + welcome_content = f"{welcome_ascii}\n" + welcome_content += "[bold green]TradingAgents: Multi-Agents LLM Financial Trading Framework - CLI[/bold green]\n\n" + welcome_content += "[bold]Workflow Steps:[/bold]\n" + welcome_content += "I. Analyst Team โ†’ II. Research Team โ†’ III. Trader โ†’ IV. Risk Management โ†’ V. Portfolio Management\n\n" + welcome_content += ( + "[dim]Built by [Tauric Research](https://github.com/TauricResearch)[/dim]" + ) + + # Create and center the welcome box + welcome_box = Panel( + welcome_content, + border_style="green", + padding=(1, 2), + title="Welcome to TradingAgents", + subtitle="Multi-Agents LLM Financial Trading Framework", + ) + console.print(Align.center(welcome_box)) + console.print() # Add a blank line after the welcome box + + # Create a boxed questionnaire for each step + def create_question_box(title, prompt, default=None): + box_content = f"[bold]{title}[/bold]\n" + box_content += f"[dim]{prompt}[/dim]" + if default: + box_content += f"\n[dim]Default: {default}[/dim]" + return Panel(box_content, border_style="blue", padding=(1, 2)) + + # Step 1: Ticker symbol + console.print( + create_question_box( + "Step 1: Ticker Symbol", "Enter the ticker symbol to analyze", "SPY" + ) + ) + selected_ticker = get_ticker() + + # Step 2: Analysis date + default_date = datetime.datetime.now().strftime("%Y-%m-%d") + console.print( + create_question_box( + "Step 2: Analysis Date", + "Enter the analysis date (YYYY-MM-DD)", + default_date, + ) + ) + analysis_date = get_analysis_date() + + # Step 3: Select analysts + console.print( + create_question_box( + "Step 3: Analysts Team", "Select your LLM analyst agents for the analysis" + ) + ) + selected_analysts = select_analysts() + console.print( + f"[green]Selected analysts:[/green] {', '.join(analyst.value for analyst in selected_analysts)}" + ) + + # Step 4: Research depth + console.print( + create_question_box( + "Step 4: Research Depth", "Select your research depth level" + ) + ) + selected_research_depth = select_research_depth() + + # Step 5: Thinking agents + console.print( + create_question_box( + "Step 5: Thinking Agents", "Select your thinking agents for analysis" + ) + ) + selected_shallow_thinker = select_shallow_thinking_agent() + selected_deep_thinker = select_deep_thinking_agent() + + return { + "ticker": selected_ticker, + "analysis_date": analysis_date, + "analysts": selected_analysts, + "research_depth": selected_research_depth, + "shallow_thinker": selected_shallow_thinker, + "deep_thinker": selected_deep_thinker, + } + + +def get_ticker(): + """Get ticker symbol from user input.""" + return typer.prompt("", default="SPY") + + +def get_analysis_date(): + """Get the analysis date from user input.""" + while True: + date_str = typer.prompt( + "", default=datetime.datetime.now().strftime("%Y-%m-%d") + ) + try: + # Validate date format and ensure it's not in the future + analysis_date = datetime.datetime.strptime(date_str, "%Y-%m-%d") + if analysis_date.date() > datetime.datetime.now().date(): + console.print("[red]Error: Analysis date cannot be in the future[/red]") + continue + return date_str + except ValueError: + console.print( + "[red]Error: Invalid date format. Please use YYYY-MM-DD[/red]" + ) + + +def display_complete_report(final_state): + """Display the complete analysis report with team-based panels.""" + console.print("\n[bold green]Complete Analysis Report[/bold green]\n") + + # I. Analyst Team Reports + analyst_reports = [] + + # Market Analyst Report + if final_state.get("market_report"): + analyst_reports.append( + Panel( + Markdown(final_state["market_report"]), + title="Market Analyst", + border_style="blue", + padding=(1, 2), + ) + ) + + # Social Analyst Report + if final_state.get("sentiment_report"): + analyst_reports.append( + Panel( + Markdown(final_state["sentiment_report"]), + title="Social Analyst", + border_style="blue", + padding=(1, 2), + ) + ) + + # News Analyst Report + if final_state.get("news_report"): + analyst_reports.append( + Panel( + Markdown(final_state["news_report"]), + title="News Analyst", + border_style="blue", + padding=(1, 2), + ) + ) + + # Fundamentals Analyst Report + if final_state.get("fundamentals_report"): + analyst_reports.append( + Panel( + Markdown(final_state["fundamentals_report"]), + title="Fundamentals Analyst", + border_style="blue", + padding=(1, 2), + ) + ) + + if analyst_reports: + console.print( + Panel( + Columns(analyst_reports, equal=True, expand=True), + title="I. Analyst Team Reports", + border_style="cyan", + padding=(1, 2), + ) + ) + + # II. Research Team Reports + if final_state.get("investment_debate_state"): + research_reports = [] + debate_state = final_state["investment_debate_state"] + + # Bull Researcher Analysis + if debate_state.get("bull_history"): + research_reports.append( + Panel( + Markdown(debate_state["bull_history"]), + title="Bull Researcher", + border_style="blue", + padding=(1, 2), + ) + ) + + # Bear Researcher Analysis + if debate_state.get("bear_history"): + research_reports.append( + Panel( + Markdown(debate_state["bear_history"]), + title="Bear Researcher", + border_style="blue", + padding=(1, 2), + ) + ) + + # Research Manager Decision + if debate_state.get("judge_decision"): + research_reports.append( + Panel( + Markdown(debate_state["judge_decision"]), + title="Research Manager", + border_style="blue", + padding=(1, 2), + ) + ) + + if research_reports: + console.print( + Panel( + Columns(research_reports, equal=True, expand=True), + title="II. Research Team Decision", + border_style="magenta", + padding=(1, 2), + ) + ) + + # III. Trading Team Reports + if final_state.get("trader_investment_plan"): + console.print( + Panel( + Panel( + Markdown(final_state["trader_investment_plan"]), + title="Trader", + border_style="blue", + padding=(1, 2), + ), + title="III. Trading Team Plan", + border_style="yellow", + padding=(1, 2), + ) + ) + + # IV. Risk Management Team Reports + if final_state.get("risk_debate_state"): + risk_reports = [] + risk_state = final_state["risk_debate_state"] + + # Aggressive (Risky) Analyst Analysis + if risk_state.get("risky_history"): + risk_reports.append( + Panel( + Markdown(risk_state["risky_history"]), + title="Aggressive Analyst", + border_style="blue", + padding=(1, 2), + ) + ) + + # Conservative (Safe) Analyst Analysis + if risk_state.get("safe_history"): + risk_reports.append( + Panel( + Markdown(risk_state["safe_history"]), + title="Conservative Analyst", + border_style="blue", + padding=(1, 2), + ) + ) + + # Neutral Analyst Analysis + if risk_state.get("neutral_history"): + risk_reports.append( + Panel( + Markdown(risk_state["neutral_history"]), + title="Neutral Analyst", + border_style="blue", + padding=(1, 2), + ) + ) + + if risk_reports: + console.print( + Panel( + Columns(risk_reports, equal=True, expand=True), + title="IV. Risk Management Team Decision", + border_style="red", + padding=(1, 2), + ) + ) + + # V. Portfolio Manager Decision + if risk_state.get("judge_decision"): + console.print( + Panel( + Panel( + Markdown(risk_state["judge_decision"]), + title="Portfolio Manager", + border_style="blue", + padding=(1, 2), + ), + title="V. Portfolio Manager Decision", + border_style="green", + padding=(1, 2), + ) + ) + + +def update_research_team_status(status): + """Update status for all research team members and trader.""" + research_team = ["Bull Researcher", "Bear Researcher", "Research Manager", "Trader"] + for agent in research_team: + message_buffer.update_agent_status(agent, status) + + +def run_analysis(): + # First get all user selections + selections = get_user_selections() + + # Create config with selected research depth + config = DEFAULT_CONFIG.copy() + config["max_debate_rounds"] = selections["research_depth"] + config["max_risk_discuss_rounds"] = selections["research_depth"] + config["quick_think_llm"] = selections["shallow_thinker"] + config["deep_think_llm"] = selections["deep_thinker"] + + # Initialize the graph + graph = TradingAgentsGraph( + [analyst.value for analyst in selections["analysts"]], config=config, debug=True + ) + + # Now start the display layout + layout = create_layout() + + with Live(layout, refresh_per_second=4) as live: + # Initial display + update_display(layout) + + # Add initial messages + message_buffer.add_message("System", f"Selected ticker: {selections['ticker']}") + message_buffer.add_message( + "System", f"Analysis date: {selections['analysis_date']}" + ) + message_buffer.add_message( + "System", + f"Selected analysts: {', '.join(analyst.value for analyst in selections['analysts'])}", + ) + update_display(layout) + + # Reset agent statuses + for agent in message_buffer.agent_status: + message_buffer.update_agent_status(agent, "pending") + + # Reset report sections + for section in message_buffer.report_sections: + message_buffer.report_sections[section] = None + message_buffer.current_report = None + message_buffer.final_report = None + + # Update agent status to in_progress for the first analyst + first_analyst = f"{selections['analysts'][0].value.capitalize()} Analyst" + message_buffer.update_agent_status(first_analyst, "in_progress") + update_display(layout) + + # Create spinner text + spinner_text = ( + f"Analyzing {selections['ticker']} on {selections['analysis_date']}..." + ) + update_display(layout, spinner_text) + + # Initialize state and get graph args + init_agent_state = graph.propagator.create_initial_state( + selections["ticker"], selections["analysis_date"] + ) + args = graph.propagator.get_graph_args() + + # Stream the analysis + trace = [] + for chunk in graph.graph.stream(init_agent_state, **args): + if len(chunk["messages"]) > 0: + # Get the last message from the chunk + last_message = chunk["messages"][-1] + + # Extract message content and type + if hasattr(last_message, "content"): + content = last_message.content + msg_type = "Reasoning" + else: + content = str(last_message) + msg_type = "System" + + # Add message to buffer + message_buffer.add_message(msg_type, content) + + # If it's a tool call, add it to tool calls + if hasattr(last_message, "tool_calls"): + for tool_call in last_message.tool_calls: + # Handle both dictionary and object tool calls + if isinstance(tool_call, dict): + message_buffer.add_tool_call( + tool_call["name"], tool_call["args"] + ) + else: + message_buffer.add_tool_call(tool_call.name, tool_call.args) + + # Update reports and agent status based on chunk content + # Analyst Team Reports + if "market_report" in chunk and chunk["market_report"]: + message_buffer.update_report_section( + "market_report", chunk["market_report"] + ) + message_buffer.update_agent_status("Market Analyst", "completed") + # Set next analyst to in_progress + if "social" in selections["analysts"]: + message_buffer.update_agent_status( + "Social Analyst", "in_progress" + ) + + if "sentiment_report" in chunk and chunk["sentiment_report"]: + message_buffer.update_report_section( + "sentiment_report", chunk["sentiment_report"] + ) + message_buffer.update_agent_status("Social Analyst", "completed") + # Set next analyst to in_progress + if "news" in selections["analysts"]: + message_buffer.update_agent_status( + "News Analyst", "in_progress" + ) + + if "news_report" in chunk and chunk["news_report"]: + message_buffer.update_report_section( + "news_report", chunk["news_report"] + ) + message_buffer.update_agent_status("News Analyst", "completed") + # Set next analyst to in_progress + if "fundamentals" in selections["analysts"]: + message_buffer.update_agent_status( + "Fundamentals Analyst", "in_progress" + ) + + if "fundamentals_report" in chunk and chunk["fundamentals_report"]: + message_buffer.update_report_section( + "fundamentals_report", chunk["fundamentals_report"] + ) + message_buffer.update_agent_status( + "Fundamentals Analyst", "completed" + ) + # Set all research team members to in_progress + update_research_team_status("in_progress") + + # Research Team - Handle Investment Debate State + if ( + "investment_debate_state" in chunk + and chunk["investment_debate_state"] + ): + debate_state = chunk["investment_debate_state"] + + # Update Bull Researcher status and report + if "bull_history" in debate_state and debate_state["bull_history"]: + # Keep all research team members in progress + update_research_team_status("in_progress") + # Extract latest bull response + bull_responses = debate_state["bull_history"].split("\n") + latest_bull = bull_responses[-1] if bull_responses else "" + if latest_bull: + message_buffer.add_message("Reasoning", latest_bull) + # Update research report with bull's latest analysis + message_buffer.update_report_section( + "investment_plan", + f"### Bull Researcher Analysis\n{latest_bull}", + ) + + # Update Bear Researcher status and report + if "bear_history" in debate_state and debate_state["bear_history"]: + # Keep all research team members in progress + update_research_team_status("in_progress") + # Extract latest bear response + bear_responses = debate_state["bear_history"].split("\n") + latest_bear = bear_responses[-1] if bear_responses else "" + if latest_bear: + message_buffer.add_message("Reasoning", latest_bear) + # Update research report with bear's latest analysis + message_buffer.update_report_section( + "investment_plan", + f"{message_buffer.report_sections['investment_plan']}\n\n### Bear Researcher Analysis\n{latest_bear}", + ) + + # Update Research Manager status and final decision + if ( + "judge_decision" in debate_state + and debate_state["judge_decision"] + ): + # Keep all research team members in progress until final decision + update_research_team_status("in_progress") + message_buffer.add_message( + "Reasoning", + f"Research Manager: {debate_state['judge_decision']}", + ) + # Update research report with final decision + message_buffer.update_report_section( + "investment_plan", + f"{message_buffer.report_sections['investment_plan']}\n\n### Research Manager Decision\n{debate_state['judge_decision']}", + ) + # Mark all research team members as completed + update_research_team_status("completed") + # Set first risk analyst to in_progress + message_buffer.update_agent_status( + "Risky Analyst", "in_progress" + ) + + # Trading Team + if ( + "trader_investment_plan" in chunk + and chunk["trader_investment_plan"] + ): + message_buffer.update_report_section( + "trader_investment_plan", chunk["trader_investment_plan"] + ) + # Set first risk analyst to in_progress + message_buffer.update_agent_status("Risky Analyst", "in_progress") + + # Risk Management Team - Handle Risk Debate State + if "risk_debate_state" in chunk and chunk["risk_debate_state"]: + risk_state = chunk["risk_debate_state"] + + # Update Risky Analyst status and report + if ( + "current_risky_response" in risk_state + and risk_state["current_risky_response"] + ): + message_buffer.update_agent_status( + "Risky Analyst", "in_progress" + ) + message_buffer.add_message( + "Reasoning", + f"Risky Analyst: {risk_state['current_risky_response']}", + ) + # Update risk report with risky analyst's latest analysis only + message_buffer.update_report_section( + "final_trade_decision", + f"### Risky Analyst Analysis\n{risk_state['current_risky_response']}", + ) + + # Update Safe Analyst status and report + if ( + "current_safe_response" in risk_state + and risk_state["current_safe_response"] + ): + message_buffer.update_agent_status( + "Safe Analyst", "in_progress" + ) + message_buffer.add_message( + "Reasoning", + f"Safe Analyst: {risk_state['current_safe_response']}", + ) + # Update risk report with safe analyst's latest analysis only + message_buffer.update_report_section( + "final_trade_decision", + f"### Safe Analyst Analysis\n{risk_state['current_safe_response']}", + ) + + # Update Neutral Analyst status and report + if ( + "current_neutral_response" in risk_state + and risk_state["current_neutral_response"] + ): + message_buffer.update_agent_status( + "Neutral Analyst", "in_progress" + ) + message_buffer.add_message( + "Reasoning", + f"Neutral Analyst: {risk_state['current_neutral_response']}", + ) + # Update risk report with neutral analyst's latest analysis only + message_buffer.update_report_section( + "final_trade_decision", + f"### Neutral Analyst Analysis\n{risk_state['current_neutral_response']}", + ) + + # Update Portfolio Manager status and final decision + if "judge_decision" in risk_state and risk_state["judge_decision"]: + message_buffer.update_agent_status( + "Portfolio Manager", "in_progress" + ) + message_buffer.add_message( + "Reasoning", + f"Portfolio Manager: {risk_state['judge_decision']}", + ) + # Update risk report with final decision only + message_buffer.update_report_section( + "final_trade_decision", + f"### Portfolio Manager Decision\n{risk_state['judge_decision']}", + ) + # Mark risk analysts as completed + message_buffer.update_agent_status("Risky Analyst", "completed") + message_buffer.update_agent_status("Safe Analyst", "completed") + message_buffer.update_agent_status( + "Neutral Analyst", "completed" + ) + message_buffer.update_agent_status( + "Portfolio Manager", "completed" + ) + + # Update the display + update_display(layout) + + trace.append(chunk) + + # Get final state and decision + final_state = trace[-1] + decision = graph.process_signal(final_state["final_trade_decision"]) + + # Update all agent statuses to completed + for agent in message_buffer.agent_status: + message_buffer.update_agent_status(agent, "completed") + + message_buffer.add_message( + "Analysis", f"Completed analysis for {selections['analysis_date']}" + ) + + # Update final report sections + for section in message_buffer.report_sections.keys(): + if section in final_state: + message_buffer.update_report_section(section, final_state[section]) + + # Display the complete final report + display_complete_report(final_state) + + update_display(layout) + + +@app.command() +def analyze(): + run_analysis() + + +if __name__ == "__main__": + app() diff --git a/cli/models.py b/cli/models.py index f68c3da1..06e67623 100644 --- a/cli/models.py +++ b/cli/models.py @@ -1,10 +1,10 @@ -from enum import Enum -from typing import List, Optional, Dict -from pydantic import BaseModel - - -class AnalystType(str, Enum): - MARKET = "market" - SOCIAL = "social" - NEWS = "news" - FUNDAMENTALS = "fundamentals" +from enum import Enum +from typing import List, Optional, Dict +from pydantic import BaseModel + + +class AnalystType(str, Enum): + MARKET = "market" + SOCIAL = "social" + NEWS = "news" + FUNDAMENTALS = "fundamentals" diff --git a/cli/static/welcome.txt b/cli/static/welcome.txt index f2cf641d..95a28e58 100644 --- a/cli/static/welcome.txt +++ b/cli/static/welcome.txt @@ -1,7 +1,7 @@ - - ______ ___ ___ __ - /_ __/________ _____/ (_)___ ____ _/ | ____ ____ ____ / /______ - / / / ___/ __ `/ __ / / __ \/ __ `/ /| |/ __ `/ _ \/ __ \/ __/ ___/ - / / / / / /_/ / /_/ / / / / / /_/ / ___ / /_/ / __/ / / / /_(__ ) -/_/ /_/ \__,_/\__,_/_/_/ /_/\__, /_/ |_\__, /\___/_/ /_/\__/____/ - /____/ /____/ + + ______ ___ ___ __ + /_ __/________ _____/ (_)___ ____ _/ | ____ ____ ____ / /______ + / / / ___/ __ `/ __ / / __ \/ __ `/ /| |/ __ `/ _ \/ __ \/ __/ ___/ + / / / / / /_/ / /_/ / / / / / /_/ / ___ / /_/ / __/ / / / /_(__ ) +/_/ /_/ \__,_/\__,_/_/_/ /_/\__, /_/ |_\__, /\___/_/ /_/\__/____/ + /____/ /____/ diff --git a/cli/utils.py b/cli/utils.py index c3865253..3763aca5 100644 --- a/cli/utils.py +++ b/cli/utils.py @@ -1,195 +1,195 @@ -import questionary -from typing import List, Optional, Tuple, Dict - -from cli.models import AnalystType - -ANALYST_ORDER = [ - ("Market Analyst", AnalystType.MARKET), - ("Social Media Analyst", AnalystType.SOCIAL), - ("News Analyst", AnalystType.NEWS), - ("Fundamentals Analyst", AnalystType.FUNDAMENTALS), -] - - -def get_ticker() -> str: - """Prompt the user to enter a ticker symbol.""" - ticker = questionary.text( - "Enter the ticker symbol to analyze:", - validate=lambda x: len(x.strip()) > 0 or "Please enter a valid ticker symbol.", - style=questionary.Style( - [ - ("text", "fg:green"), - ("highlighted", "noinherit"), - ] - ), - ).ask() - - if not ticker: - console.print("\n[red]No ticker symbol provided. Exiting...[/red]") - exit(1) - - return ticker.strip().upper() - - -def get_analysis_date() -> str: - """Prompt the user to enter a date in YYYY-MM-DD format.""" - import re - from datetime import datetime - - def validate_date(date_str: str) -> bool: - if not re.match(r"^\d{4}-\d{2}-\d{2}$", date_str): - return False - try: - datetime.strptime(date_str, "%Y-%m-%d") - return True - except ValueError: - return False - - date = questionary.text( - "Enter the analysis date (YYYY-MM-DD):", - validate=lambda x: validate_date(x.strip()) - or "Please enter a valid date in YYYY-MM-DD format.", - style=questionary.Style( - [ - ("text", "fg:green"), - ("highlighted", "noinherit"), - ] - ), - ).ask() - - if not date: - console.print("\n[red]No date provided. Exiting...[/red]") - exit(1) - - return date.strip() - - -def select_analysts() -> List[AnalystType]: - """Select analysts using an interactive checkbox.""" - choices = questionary.checkbox( - "Select Your [Analysts Team]:", - choices=[ - questionary.Choice(display, value=value) for display, value in ANALYST_ORDER - ], - instruction="\n- Press Space to select/unselect analysts\n- Press 'a' to select/unselect all\n- Press Enter when done", - validate=lambda x: len(x) > 0 or "You must select at least one analyst.", - style=questionary.Style( - [ - ("checkbox-selected", "fg:green"), - ("selected", "fg:green noinherit"), - ("highlighted", "noinherit"), - ("pointer", "noinherit"), - ] - ), - ).ask() - - if not choices: - console.print("\n[red]No analysts selected. Exiting...[/red]") - exit(1) - - return choices - - -def select_research_depth() -> int: - """Select research depth using an interactive selection.""" - - # Define research depth options with their corresponding values - DEPTH_OPTIONS = [ - ("Shallow - Quick research, few debate and strategy discussion rounds", 1), - ("Medium - Middle ground, moderate debate rounds and strategy discussion", 3), - ("Deep - Comprehensive research, in depth debate and strategy discussion", 5), - ] - - choice = questionary.select( - "Select Your [Research Depth]:", - choices=[ - questionary.Choice(display, value=value) for display, value in DEPTH_OPTIONS - ], - instruction="\n- Use arrow keys to navigate\n- Press Enter to select", - style=questionary.Style( - [ - ("selected", "fg:yellow noinherit"), - ("highlighted", "fg:yellow noinherit"), - ("pointer", "fg:yellow noinherit"), - ] - ), - ).ask() - - if choice is None: - console.print("\n[red]No research depth selected. Exiting...[/red]") - exit(1) - - return choice - - -def select_shallow_thinking_agent() -> str: - """Select shallow thinking llm engine using an interactive selection.""" - - # Define shallow thinking llm engine options with their corresponding model names - SHALLOW_AGENT_OPTIONS = [ - ("GPT-4o-mini - Fast and efficient for quick tasks", "gpt-4o-mini"), - ("GPT-4.1-nano - Ultra-lightweight model for basic operations", "gpt-4.1-nano"), - ("GPT-4.1-mini - Compact model with good performance", "gpt-4.1-mini"), - ("GPT-4o - Standard model with solid capabilities", "gpt-4o"), - ] - - choice = questionary.select( - "Select Your [Quick-Thinking LLM Engine]:", - choices=[ - questionary.Choice(display, value=value) - for display, value in SHALLOW_AGENT_OPTIONS - ], - instruction="\n- Use arrow keys to navigate\n- Press Enter to select", - style=questionary.Style( - [ - ("selected", "fg:magenta noinherit"), - ("highlighted", "fg:magenta noinherit"), - ("pointer", "fg:magenta noinherit"), - ] - ), - ).ask() - - if choice is None: - console.print( - "\n[red]No shallow thinking llm engine selected. Exiting...[/red]" - ) - exit(1) - - return choice - - -def select_deep_thinking_agent() -> str: - """Select deep thinking llm engine using an interactive selection.""" - - # Define deep thinking llm engine options with their corresponding model names - DEEP_AGENT_OPTIONS = [ - ("GPT-4.1-nano - Ultra-lightweight model for basic operations", "gpt-4.1-nano"), - ("GPT-4.1-mini - Compact model with good performance", "gpt-4.1-mini"), - ("GPT-4o - Standard model with solid capabilities", "gpt-4o"), - ("o4-mini - Specialized reasoning model (compact)", "o4-mini"), - ("o3-mini - Advanced reasoning model (lightweight)", "o3-mini"), - ("o3 - Full advanced reasoning model", "o3"), - ("o1 - Premier reasoning and problem-solving model", "o1"), - ] - - choice = questionary.select( - "Select Your [Deep-Thinking LLM Engine]:", - choices=[ - questionary.Choice(display, value=value) - for display, value in DEEP_AGENT_OPTIONS - ], - instruction="\n- Use arrow keys to navigate\n- Press Enter to select", - style=questionary.Style( - [ - ("selected", "fg:magenta noinherit"), - ("highlighted", "fg:magenta noinherit"), - ("pointer", "fg:magenta noinherit"), - ] - ), - ).ask() - - if choice is None: - console.print("\n[red]No deep thinking llm engine selected. Exiting...[/red]") - exit(1) - - return choice +import questionary +from typing import List, Optional, Tuple, Dict + +from cli.models import AnalystType + +ANALYST_ORDER = [ + ("Market Analyst", AnalystType.MARKET), + ("Social Media Analyst", AnalystType.SOCIAL), + ("News Analyst", AnalystType.NEWS), + ("Fundamentals Analyst", AnalystType.FUNDAMENTALS), +] + + +def get_ticker() -> str: + """Prompt the user to enter a ticker symbol.""" + ticker = questionary.text( + "Enter the ticker symbol to analyze:", + validate=lambda x: len(x.strip()) > 0 or "Please enter a valid ticker symbol.", + style=questionary.Style( + [ + ("text", "fg:green"), + ("highlighted", "noinherit"), + ] + ), + ).ask() + + if not ticker: + console.print("\n[red]No ticker symbol provided. Exiting...[/red]") + exit(1) + + return ticker.strip().upper() + + +def get_analysis_date() -> str: + """Prompt the user to enter a date in YYYY-MM-DD format.""" + import re + from datetime import datetime + + def validate_date(date_str: str) -> bool: + if not re.match(r"^\d{4}-\d{2}-\d{2}$", date_str): + return False + try: + datetime.strptime(date_str, "%Y-%m-%d") + return True + except ValueError: + return False + + date = questionary.text( + "Enter the analysis date (YYYY-MM-DD):", + validate=lambda x: validate_date(x.strip()) + or "Please enter a valid date in YYYY-MM-DD format.", + style=questionary.Style( + [ + ("text", "fg:green"), + ("highlighted", "noinherit"), + ] + ), + ).ask() + + if not date: + console.print("\n[red]No date provided. Exiting...[/red]") + exit(1) + + return date.strip() + + +def select_analysts() -> List[AnalystType]: + """Select analysts using an interactive checkbox.""" + choices = questionary.checkbox( + "Select Your [Analysts Team]:", + choices=[ + questionary.Choice(display, value=value) for display, value in ANALYST_ORDER + ], + instruction="\n- Press Space to select/unselect analysts\n- Press 'a' to select/unselect all\n- Press Enter when done", + validate=lambda x: len(x) > 0 or "You must select at least one analyst.", + style=questionary.Style( + [ + ("checkbox-selected", "fg:green"), + ("selected", "fg:green noinherit"), + ("highlighted", "noinherit"), + ("pointer", "noinherit"), + ] + ), + ).ask() + + if not choices: + console.print("\n[red]No analysts selected. Exiting...[/red]") + exit(1) + + return choices + + +def select_research_depth() -> int: + """Select research depth using an interactive selection.""" + + # Define research depth options with their corresponding values + DEPTH_OPTIONS = [ + ("Shallow - Quick research, few debate and strategy discussion rounds", 1), + ("Medium - Middle ground, moderate debate rounds and strategy discussion", 3), + ("Deep - Comprehensive research, in depth debate and strategy discussion", 5), + ] + + choice = questionary.select( + "Select Your [Research Depth]:", + choices=[ + questionary.Choice(display, value=value) for display, value in DEPTH_OPTIONS + ], + instruction="\n- Use arrow keys to navigate\n- Press Enter to select", + style=questionary.Style( + [ + ("selected", "fg:yellow noinherit"), + ("highlighted", "fg:yellow noinherit"), + ("pointer", "fg:yellow noinherit"), + ] + ), + ).ask() + + if choice is None: + console.print("\n[red]No research depth selected. Exiting...[/red]") + exit(1) + + return choice + + +def select_shallow_thinking_agent() -> str: + """Select shallow thinking llm engine using an interactive selection.""" + + # Define shallow thinking llm engine options with their corresponding model names + SHALLOW_AGENT_OPTIONS = [ + ("GPT-4o-mini - Fast and efficient for quick tasks", "gpt-4o-mini"), + ("GPT-4.1-nano - Ultra-lightweight model for basic operations", "gpt-4.1-nano"), + ("GPT-4.1-mini - Compact model with good performance", "gpt-4.1-mini"), + ("GPT-4o - Standard model with solid capabilities", "gpt-4o"), + ] + + choice = questionary.select( + "Select Your [Quick-Thinking LLM Engine]:", + choices=[ + questionary.Choice(display, value=value) + for display, value in SHALLOW_AGENT_OPTIONS + ], + instruction="\n- Use arrow keys to navigate\n- Press Enter to select", + style=questionary.Style( + [ + ("selected", "fg:magenta noinherit"), + ("highlighted", "fg:magenta noinherit"), + ("pointer", "fg:magenta noinherit"), + ] + ), + ).ask() + + if choice is None: + console.print( + "\n[red]No shallow thinking llm engine selected. Exiting...[/red]" + ) + exit(1) + + return choice + + +def select_deep_thinking_agent() -> str: + """Select deep thinking llm engine using an interactive selection.""" + + # Define deep thinking llm engine options with their corresponding model names + DEEP_AGENT_OPTIONS = [ + ("GPT-4.1-nano - Ultra-lightweight model for basic operations", "gpt-4.1-nano"), + ("GPT-4.1-mini - Compact model with good performance", "gpt-4.1-mini"), + ("GPT-4o - Standard model with solid capabilities", "gpt-4o"), + ("o4-mini - Specialized reasoning model (compact)", "o4-mini"), + ("o3-mini - Advanced reasoning model (lightweight)", "o3-mini"), + ("o3 - Full advanced reasoning model", "o3"), + ("o1 - Premier reasoning and problem-solving model", "o1"), + ] + + choice = questionary.select( + "Select Your [Deep-Thinking LLM Engine]:", + choices=[ + questionary.Choice(display, value=value) + for display, value in DEEP_AGENT_OPTIONS + ], + instruction="\n- Use arrow keys to navigate\n- Press Enter to select", + style=questionary.Style( + [ + ("selected", "fg:magenta noinherit"), + ("highlighted", "fg:magenta noinherit"), + ("pointer", "fg:magenta noinherit"), + ] + ), + ).ask() + + if choice is None: + console.print("\n[red]No deep thinking llm engine selected. Exiting...[/red]") + exit(1) + + return choice diff --git a/main.py b/main.py index c78cd6e6..979d039b 100644 --- a/main.py +++ b/main.py @@ -1,19 +1,19 @@ -from tradingagents.graph.trading_graph import TradingAgentsGraph -from tradingagents.default_config import DEFAULT_CONFIG - -# Create a custom config -config = DEFAULT_CONFIG.copy() -config["deep_think_llm"] = "gpt-4.1-nano" # Use a different model -config["quick_think_llm"] = "gpt-4.1-nano" # Use a different model -config["max_debate_rounds"] = 1 # Increase debate rounds -config["online_tools"] = True # Increase debate rounds - -# Initialize with custom config -ta = TradingAgentsGraph(debug=True, config=config) - -# forward propagate -_, decision = ta.propagate("NVDA", "2024-05-10") -print(decision) - -# Memorize mistakes and reflect -# ta.reflect_and_remember(1000) # parameter is the position returns +from tradingagents.graph.trading_graph import TradingAgentsGraph +from tradingagents.default_config import DEFAULT_CONFIG + +# Create a custom config +config = DEFAULT_CONFIG.copy() +config["deep_think_llm"] = "gpt-4.1-nano" # Use a different model +config["quick_think_llm"] = "gpt-4.1-nano" # Use a different model +config["max_debate_rounds"] = 1 # Increase debate rounds +config["online_tools"] = True # Increase debate rounds + +# Initialize with custom config +ta = TradingAgentsGraph(debug=True, config=config) + +# forward propagate +_, decision = ta.propagate("NVDA", "2024-05-10") +print(decision) + +# Memorize mistakes and reflect +# ta.reflect_and_remember(1000) # parameter is the position returns diff --git a/requirements.txt b/requirements.txt index 1c7c2818..9c86f454 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,24 +1,24 @@ -typing-extensions -langchain-openai -langchain-experimental -pandas -yfinance -praw -feedparser -stockstats -eodhd -langgraph -chromadb -setuptools -backtrader -akshare -tushare -finnhub-python -parsel -requests -tqdm -pytz -redis -chainlit -rich -questionary +typing-extensions +langchain-openai +langchain-experimental +pandas +yfinance +praw +feedparser +stockstats +eodhd +langgraph +chromadb +setuptools +backtrader +akshare +tushare +finnhub-python +parsel +requests +tqdm +pytz +redis +chainlit +rich +questionary diff --git a/setup.py b/setup.py index 793df3e6..1a6d4d33 100644 --- a/setup.py +++ b/setup.py @@ -1,43 +1,43 @@ -""" -Setup script for the TradingAgents package. -""" - -from setuptools import setup, find_packages - -setup( - name="tradingagents", - version="0.1.0", - description="Multi-Agents LLM Financial Trading Framework", - author="TradingAgents Team", - author_email="yijia.xiao@cs.ucla.edu", - url="https://github.com/TauricResearch", - packages=find_packages(), - install_requires=[ - "langchain>=0.1.0", - "langchain-openai>=0.0.2", - "langchain-experimental>=0.0.40", - "langgraph>=0.0.20", - "numpy>=1.24.0", - "pandas>=2.0.0", - "praw>=7.7.0", - "stockstats>=0.5.4", - "yfinance>=0.2.31", - "typer>=0.9.0", - "rich>=13.0.0", - "questionary>=2.0.1", - ], - python_requires=">=3.10", - entry_points={ - "console_scripts": [ - "tradingagents=cli.main:app", - ], - }, - classifiers=[ - "Development Status :: 3 - Alpha", - "Intended Audience :: Financial and Trading Industry", - "License :: OSI Approved :: Apache Software License", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.10", - "Topic :: Office/Business :: Financial :: Investment", - ], -) +""" +Setup script for the TradingAgents package. +""" + +from setuptools import setup, find_packages + +setup( + name="tradingagents", + version="0.1.0", + description="Multi-Agents LLM Financial Trading Framework", + author="TradingAgents Team", + author_email="yijia.xiao@cs.ucla.edu", + url="https://github.com/TauricResearch", + packages=find_packages(), + install_requires=[ + "langchain>=0.1.0", + "langchain-openai>=0.0.2", + "langchain-experimental>=0.0.40", + "langgraph>=0.0.20", + "numpy>=1.24.0", + "pandas>=2.0.0", + "praw>=7.7.0", + "stockstats>=0.5.4", + "yfinance>=0.2.31", + "typer>=0.9.0", + "rich>=13.0.0", + "questionary>=2.0.1", + ], + python_requires=">=3.10", + entry_points={ + "console_scripts": [ + "tradingagents=cli.main:app", + ], + }, + classifiers=[ + "Development Status :: 3 - Alpha", + "Intended Audience :: Financial and Trading Industry", + "License :: OSI Approved :: Apache Software License", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.10", + "Topic :: Office/Business :: Financial :: Investment", + ], +) diff --git a/tradingagents/agents/__init__.py b/tradingagents/agents/__init__.py index 6f507651..80c6123f 100644 --- a/tradingagents/agents/__init__.py +++ b/tradingagents/agents/__init__.py @@ -1,41 +1,41 @@ -from .utils.agent_utils import Toolkit, create_msg_delete -from .utils.agent_states import AgentState, InvestDebateState, RiskDebateState -from .utils.memory import FinancialSituationMemory - -from .analysts.fundamentals_analyst import create_fundamentals_analyst -from .analysts.market_analyst import create_market_analyst -from .analysts.news_analyst import create_news_analyst -from .analysts.social_media_analyst import create_social_media_analyst - -from .researchers.bear_researcher import create_bear_researcher -from .researchers.bull_researcher import create_bull_researcher - -from .risk_mgmt.aggresive_debator import create_risky_debator -from .risk_mgmt.conservative_debator import create_safe_debator -from .risk_mgmt.neutral_debator import create_neutral_debator - -from .managers.research_manager import create_research_manager -from .managers.risk_manager import create_risk_manager - -from .trader.trader import create_trader - -__all__ = [ - "FinancialSituationMemory", - "Toolkit", - "AgentState", - "create_msg_delete", - "InvestDebateState", - "RiskDebateState", - "create_bear_researcher", - "create_bull_researcher", - "create_research_manager", - "create_fundamentals_analyst", - "create_market_analyst", - "create_neutral_debator", - "create_news_analyst", - "create_risky_debator", - "create_risk_manager", - "create_safe_debator", - "create_social_media_analyst", - "create_trader", -] +from .utils.agent_utils import Toolkit, create_msg_delete +from .utils.agent_states import AgentState, InvestDebateState, RiskDebateState +from .utils.memory import FinancialSituationMemory + +from .analysts.fundamentals_analyst import create_fundamentals_analyst +from .analysts.market_analyst import create_market_analyst +from .analysts.news_analyst import create_news_analyst +from .analysts.social_media_analyst import create_social_media_analyst + +from .researchers.bear_researcher import create_bear_researcher +from .researchers.bull_researcher import create_bull_researcher + +from .risk_mgmt.aggresive_debator import create_risky_debator +from .risk_mgmt.conservative_debator import create_safe_debator +from .risk_mgmt.neutral_debator import create_neutral_debator + +from .managers.research_manager import create_research_manager +from .managers.risk_manager import create_risk_manager + +from .trader.trader import create_trader + +__all__ = [ + "FinancialSituationMemory", + "Toolkit", + "AgentState", + "create_msg_delete", + "InvestDebateState", + "RiskDebateState", + "create_bear_researcher", + "create_bull_researcher", + "create_research_manager", + "create_fundamentals_analyst", + "create_market_analyst", + "create_neutral_debator", + "create_news_analyst", + "create_risky_debator", + "create_risk_manager", + "create_safe_debator", + "create_social_media_analyst", + "create_trader", +] diff --git a/tradingagents/agents/analysts/fundamentals_analyst.py b/tradingagents/agents/analysts/fundamentals_analyst.py index 45ddb915..0969b797 100644 --- a/tradingagents/agents/analysts/fundamentals_analyst.py +++ b/tradingagents/agents/analysts/fundamentals_analyst.py @@ -1,59 +1,59 @@ -from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder -import time -import json - - -def create_fundamentals_analyst(llm, toolkit): - def fundamentals_analyst_node(state): - current_date = state["trade_date"] - ticker = state["company_of_interest"] - company_name = state["company_of_interest"] - - if toolkit.config["online_tools"]: - tools = [toolkit.get_fundamentals_openai] - else: - tools = [ - toolkit.get_finnhub_company_insider_sentiment, - toolkit.get_finnhub_company_insider_transactions, - toolkit.get_simfin_balance_sheet, - toolkit.get_simfin_cashflow, - toolkit.get_simfin_income_stmt, - ] - - system_message = ( - "You are a researcher tasked with analyzing fundamental information over the past week about a company. Please write a comprehensive report of the company's fundamental information such as financial documents, company profile, basic company financials, company financial history, insider sentiment and insider transactions to gain a full view of the company's fundamental information to inform traders. Make sure to include as much detail as possible. Do not simply state the trends are mixed, provide detailed and finegrained analysis and insights that may help traders make decisions." - + " Make sure to append a Makrdown table at the end of the report to organize key points in the report, organized and easy to read.", - ) - - prompt = ChatPromptTemplate.from_messages( - [ - ( - "system", - "You are a helpful AI assistant, collaborating with other assistants." - " Use the provided tools to progress towards answering the question." - " If you are unable to fully answer, that's OK; another assistant with different tools" - " will help where you left off. Execute what you can to make progress." - " If you or any other assistant has the FINAL TRANSACTION PROPOSAL: **BUY/HOLD/SELL** or deliverable," - " prefix your response with FINAL TRANSACTION PROPOSAL: **BUY/HOLD/SELL** so the team knows to stop." - " You have access to the following tools: {tool_names}.\n{system_message}" - "For your reference, the current date is {current_date}. The company we want to look at is {ticker}", - ), - MessagesPlaceholder(variable_name="messages"), - ] - ) - - prompt = prompt.partial(system_message=system_message) - prompt = prompt.partial(tool_names=", ".join([tool.name for tool in tools])) - prompt = prompt.partial(current_date=current_date) - prompt = prompt.partial(ticker=ticker) - - chain = prompt | llm.bind_tools(tools) - - result = chain.invoke(state["messages"]) - - return { - "messages": [result], - "fundamentals_report": result.content, - } - - return fundamentals_analyst_node +from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder +import time +import json + + +def create_fundamentals_analyst(llm, toolkit): + def fundamentals_analyst_node(state): + current_date = state["trade_date"] + ticker = state["company_of_interest"] + company_name = state["company_of_interest"] + + if toolkit.config["online_tools"]: + tools = [toolkit.get_fundamentals_openai] + else: + tools = [ + toolkit.get_finnhub_company_insider_sentiment, + toolkit.get_finnhub_company_insider_transactions, + toolkit.get_simfin_balance_sheet, + toolkit.get_simfin_cashflow, + toolkit.get_simfin_income_stmt, + ] + + system_message = ( + "You are a researcher tasked with analyzing fundamental information over the past week about a company. Please write a comprehensive report of the company's fundamental information such as financial documents, company profile, basic company financials, company financial history, insider sentiment and insider transactions to gain a full view of the company's fundamental information to inform traders. Make sure to include as much detail as possible. Do not simply state the trends are mixed, provide detailed and finegrained analysis and insights that may help traders make decisions." + + " Make sure to append a Makrdown table at the end of the report to organize key points in the report, organized and easy to read.", + ) + + prompt = ChatPromptTemplate.from_messages( + [ + ( + "system", + "You are a helpful AI assistant, collaborating with other assistants." + " Use the provided tools to progress towards answering the question." + " If you are unable to fully answer, that's OK; another assistant with different tools" + " will help where you left off. Execute what you can to make progress." + " If you or any other assistant has the FINAL TRANSACTION PROPOSAL: **BUY/HOLD/SELL** or deliverable," + " prefix your response with FINAL TRANSACTION PROPOSAL: **BUY/HOLD/SELL** so the team knows to stop." + " You have access to the following tools: {tool_names}.\n{system_message}" + "For your reference, the current date is {current_date}. The company we want to look at is {ticker}", + ), + MessagesPlaceholder(variable_name="messages"), + ] + ) + + prompt = prompt.partial(system_message=system_message) + prompt = prompt.partial(tool_names=", ".join([tool.name for tool in tools])) + prompt = prompt.partial(current_date=current_date) + prompt = prompt.partial(ticker=ticker) + + chain = prompt | llm.bind_tools(tools) + + result = chain.invoke(state["messages"]) + + return { + "messages": [result], + "fundamentals_report": result.content, + } + + return fundamentals_analyst_node diff --git a/tradingagents/agents/analysts/market_analyst.py b/tradingagents/agents/analysts/market_analyst.py index 4a18761a..378f8046 100644 --- a/tradingagents/agents/analysts/market_analyst.py +++ b/tradingagents/agents/analysts/market_analyst.py @@ -1,84 +1,84 @@ -from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder -import time -import json - - -def create_market_analyst(llm, toolkit): - - def market_analyst_node(state): - current_date = state["trade_date"] - ticker = state["company_of_interest"] - company_name = state["company_of_interest"] - - if toolkit.config["online_tools"]: - tools = [ - toolkit.get_YFin_data_online, - toolkit.get_stockstats_indicators_report_online, - ] - else: - tools = [ - toolkit.get_YFin_data, - toolkit.get_stockstats_indicators_report, - ] - - system_message = ( - """You are a trading assistant tasked with analyzing financial markets. Your role is to select the **most relevant indicators** for a given market condition or trading strategy from the following list. The goal is to choose up to **8 indicators** that provide complementary insights without redundancy. Categories and each category's indicators are: - -Moving Averages: -- close_50_sma: 50 SMA: A medium-term trend indicator. Usage: Identify trend direction and serve as dynamic support/resistance. Tips: It lags price; combine with faster indicators for timely signals. -- close_200_sma: 200 SMA: A long-term trend benchmark. Usage: Confirm overall market trend and identify golden/death cross setups. Tips: It reacts slowly; best for strategic trend confirmation rather than frequent trading entries. -- close_10_ema: 10 EMA: A responsive short-term average. Usage: Capture quick shifts in momentum and potential entry points. Tips: Prone to noise in choppy markets; use alongside longer averages for filtering false signals. - -MACD Related: -- macd: MACD: Computes momentum via differences of EMAs. Usage: Look for crossovers and divergence as signals of trend changes. Tips: Confirm with other indicators in low-volatility or sideways markets. -- macds: MACD Signal: An EMA smoothing of the MACD line. Usage: Use crossovers with the MACD line to trigger trades. Tips: Should be part of a broader strategy to avoid false positives. -- macdh: MACD Histogram: Shows the gap between the MACD line and its signal. Usage: Visualize momentum strength and spot divergence early. Tips: Can be volatile; complement with additional filters in fast-moving markets. - -Momentum Indicators: -- rsi: RSI: Measures momentum to flag overbought/oversold conditions. Usage: Apply 70/30 thresholds and watch for divergence to signal reversals. Tips: In strong trends, RSI may remain extreme; always cross-check with trend analysis. - -Volatility Indicators: -- boll: Bollinger Middle: A 20 SMA serving as the basis for Bollinger Bands. Usage: Acts as a dynamic benchmark for price movement. Tips: Combine with the upper and lower bands to effectively spot breakouts or reversals. -- boll_ub: Bollinger Upper Band: Typically 2 standard deviations above the middle line. Usage: Signals potential overbought conditions and breakout zones. Tips: Confirm signals with other tools; prices may ride the band in strong trends. -- boll_lb: Bollinger Lower Band: Typically 2 standard deviations below the middle line. Usage: Indicates potential oversold conditions. Tips: Use additional analysis to avoid false reversal signals. -- atr: ATR: Averages true range to measure volatility. Usage: Set stop-loss levels and adjust position sizes based on current market volatility. Tips: It's a reactive measure, so use it as part of a broader risk management strategy. - -Volume-Based Indicators: -- vwma: VWMA: A moving average weighted by volume. Usage: Confirm trends by integrating price action with volume data. Tips: Watch for skewed results from volume spikes; use in combination with other volume analyses. - -- Select indicators that provide diverse and complementary information. Avoid redundancy (e.g., do not select both rsi and stochrsi). Also briefly explain why they are suitable for the given market context. When you tool call, please use the exact name of the indicators provided above as they are defined parameters, otherwise your call will fail. Please make sure to call get_YFin_data first to retrieve the CSV that is needed to generate indicators. Write a very detailed and nuanced report of the trends you observe. Do not simply state the trends are mixed, provide detailed and finegrained analysis and insights that may help traders make decisions.""" - + """ Make sure to append a Markdown table at the end of the report to organize key points in the report, organized and easy to read.""" - ) - - prompt = ChatPromptTemplate.from_messages( - [ - ( - "system", - "You are a helpful AI assistant, collaborating with other assistants." - " Use the provided tools to progress towards answering the question." - " If you are unable to fully answer, that's OK; another assistant with different tools" - " will help where you left off. Execute what you can to make progress." - " If you or any other assistant has the FINAL TRANSACTION PROPOSAL: **BUY/HOLD/SELL** or deliverable," - " prefix your response with FINAL TRANSACTION PROPOSAL: **BUY/HOLD/SELL** so the team knows to stop." - " You have access to the following tools: {tool_names}.\n{system_message}" - "For your reference, the current date is {current_date}. The company we want to look at is {ticker}", - ), - MessagesPlaceholder(variable_name="messages"), - ] - ) - - prompt = prompt.partial(system_message=system_message) - prompt = prompt.partial(tool_names=", ".join([tool.name for tool in tools])) - prompt = prompt.partial(current_date=current_date) - prompt = prompt.partial(ticker=ticker) - - chain = prompt | llm.bind_tools(tools) - - result = chain.invoke(state["messages"]) - - return { - "messages": [result], - "market_report": result.content, - } - - return market_analyst_node +from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder +import time +import json + + +def create_market_analyst(llm, toolkit): + + def market_analyst_node(state): + current_date = state["trade_date"] + ticker = state["company_of_interest"] + company_name = state["company_of_interest"] + + if toolkit.config["online_tools"]: + tools = [ + toolkit.get_YFin_data_online, + toolkit.get_stockstats_indicators_report_online, + ] + else: + tools = [ + toolkit.get_YFin_data, + toolkit.get_stockstats_indicators_report, + ] + + system_message = ( + """You are a trading assistant tasked with analyzing financial markets. Your role is to select the **most relevant indicators** for a given market condition or trading strategy from the following list. The goal is to choose up to **8 indicators** that provide complementary insights without redundancy. Categories and each category's indicators are: + +Moving Averages: +- close_50_sma: 50 SMA: A medium-term trend indicator. Usage: Identify trend direction and serve as dynamic support/resistance. Tips: It lags price; combine with faster indicators for timely signals. +- close_200_sma: 200 SMA: A long-term trend benchmark. Usage: Confirm overall market trend and identify golden/death cross setups. Tips: It reacts slowly; best for strategic trend confirmation rather than frequent trading entries. +- close_10_ema: 10 EMA: A responsive short-term average. Usage: Capture quick shifts in momentum and potential entry points. Tips: Prone to noise in choppy markets; use alongside longer averages for filtering false signals. + +MACD Related: +- macd: MACD: Computes momentum via differences of EMAs. Usage: Look for crossovers and divergence as signals of trend changes. Tips: Confirm with other indicators in low-volatility or sideways markets. +- macds: MACD Signal: An EMA smoothing of the MACD line. Usage: Use crossovers with the MACD line to trigger trades. Tips: Should be part of a broader strategy to avoid false positives. +- macdh: MACD Histogram: Shows the gap between the MACD line and its signal. Usage: Visualize momentum strength and spot divergence early. Tips: Can be volatile; complement with additional filters in fast-moving markets. + +Momentum Indicators: +- rsi: RSI: Measures momentum to flag overbought/oversold conditions. Usage: Apply 70/30 thresholds and watch for divergence to signal reversals. Tips: In strong trends, RSI may remain extreme; always cross-check with trend analysis. + +Volatility Indicators: +- boll: Bollinger Middle: A 20 SMA serving as the basis for Bollinger Bands. Usage: Acts as a dynamic benchmark for price movement. Tips: Combine with the upper and lower bands to effectively spot breakouts or reversals. +- boll_ub: Bollinger Upper Band: Typically 2 standard deviations above the middle line. Usage: Signals potential overbought conditions and breakout zones. Tips: Confirm signals with other tools; prices may ride the band in strong trends. +- boll_lb: Bollinger Lower Band: Typically 2 standard deviations below the middle line. Usage: Indicates potential oversold conditions. Tips: Use additional analysis to avoid false reversal signals. +- atr: ATR: Averages true range to measure volatility. Usage: Set stop-loss levels and adjust position sizes based on current market volatility. Tips: It's a reactive measure, so use it as part of a broader risk management strategy. + +Volume-Based Indicators: +- vwma: VWMA: A moving average weighted by volume. Usage: Confirm trends by integrating price action with volume data. Tips: Watch for skewed results from volume spikes; use in combination with other volume analyses. + +- Select indicators that provide diverse and complementary information. Avoid redundancy (e.g., do not select both rsi and stochrsi). Also briefly explain why they are suitable for the given market context. When you tool call, please use the exact name of the indicators provided above as they are defined parameters, otherwise your call will fail. Please make sure to call get_YFin_data first to retrieve the CSV that is needed to generate indicators. Write a very detailed and nuanced report of the trends you observe. Do not simply state the trends are mixed, provide detailed and finegrained analysis and insights that may help traders make decisions.""" + + """ Make sure to append a Markdown table at the end of the report to organize key points in the report, organized and easy to read.""" + ) + + prompt = ChatPromptTemplate.from_messages( + [ + ( + "system", + "You are a helpful AI assistant, collaborating with other assistants." + " Use the provided tools to progress towards answering the question." + " If you are unable to fully answer, that's OK; another assistant with different tools" + " will help where you left off. Execute what you can to make progress." + " If you or any other assistant has the FINAL TRANSACTION PROPOSAL: **BUY/HOLD/SELL** or deliverable," + " prefix your response with FINAL TRANSACTION PROPOSAL: **BUY/HOLD/SELL** so the team knows to stop." + " You have access to the following tools: {tool_names}.\n{system_message}" + "For your reference, the current date is {current_date}. The company we want to look at is {ticker}", + ), + MessagesPlaceholder(variable_name="messages"), + ] + ) + + prompt = prompt.partial(system_message=system_message) + prompt = prompt.partial(tool_names=", ".join([tool.name for tool in tools])) + prompt = prompt.partial(current_date=current_date) + prompt = prompt.partial(ticker=ticker) + + chain = prompt | llm.bind_tools(tools) + + result = chain.invoke(state["messages"]) + + return { + "messages": [result], + "market_report": result.content, + } + + return market_analyst_node diff --git a/tradingagents/agents/analysts/news_analyst.py b/tradingagents/agents/analysts/news_analyst.py index 12222f5d..08f217b0 100644 --- a/tradingagents/agents/analysts/news_analyst.py +++ b/tradingagents/agents/analysts/news_analyst.py @@ -1,55 +1,55 @@ -from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder -import time -import json - - -def create_news_analyst(llm, toolkit): - def news_analyst_node(state): - current_date = state["trade_date"] - ticker = state["company_of_interest"] - - if toolkit.config["online_tools"]: - tools = [toolkit.get_global_news_openai, toolkit.get_google_news] - else: - tools = [ - toolkit.get_finnhub_news, - toolkit.get_reddit_news, - toolkit.get_google_news, - ] - - system_message = ( - "You are a news researcher tasked with analyzing recent news and trends over the past week. Please write a comprehensive report of the current state of the world that is relevant for trading and macroeconomics. Look at news from EODHD, and finnhub to be comprehensive. Do not simply state the trends are mixed, provide detailed and finegrained analysis and insights that may help traders make decisions." - + """ Make sure to append a Makrdown table at the end of the report to organize key points in the report, organized and easy to read.""" - ) - - prompt = ChatPromptTemplate.from_messages( - [ - ( - "system", - "You are a helpful AI assistant, collaborating with other assistants." - " Use the provided tools to progress towards answering the question." - " If you are unable to fully answer, that's OK; another assistant with different tools" - " will help where you left off. Execute what you can to make progress." - " If you or any other assistant has the FINAL TRANSACTION PROPOSAL: **BUY/HOLD/SELL** or deliverable," - " prefix your response with FINAL TRANSACTION PROPOSAL: **BUY/HOLD/SELL** so the team knows to stop." - " You have access to the following tools: {tool_names}.\n{system_message}" - "For your reference, the current date is {current_date}. We are looking at the company {ticker}", - ), - MessagesPlaceholder(variable_name="messages"), - ] - ) - - prompt = prompt.partial(system_message=system_message) - prompt = prompt.partial(tool_names=", ".join([tool.name for tool in tools])) - prompt = prompt.partial(current_date=current_date) - prompt = prompt.partial(ticker=ticker) - - chain = prompt | llm.bind_tools(tools) - result = chain.invoke(state["messages"]) - - return { - "messages": [result], - "news_report": result.content, - } - - return news_analyst_node +from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder +import time +import json + + +def create_news_analyst(llm, toolkit): + def news_analyst_node(state): + current_date = state["trade_date"] + ticker = state["company_of_interest"] + + if toolkit.config["online_tools"]: + tools = [toolkit.get_global_news_openai, toolkit.get_google_news] + else: + tools = [ + toolkit.get_finnhub_news, + toolkit.get_reddit_news, + toolkit.get_google_news, + ] + + system_message = ( + "You are a news researcher tasked with analyzing recent news and trends over the past week. Please write a comprehensive report of the current state of the world that is relevant for trading and macroeconomics. Look at news from EODHD, and finnhub to be comprehensive. Do not simply state the trends are mixed, provide detailed and finegrained analysis and insights that may help traders make decisions." + + """ Make sure to append a Makrdown table at the end of the report to organize key points in the report, organized and easy to read.""" + ) + + prompt = ChatPromptTemplate.from_messages( + [ + ( + "system", + "You are a helpful AI assistant, collaborating with other assistants." + " Use the provided tools to progress towards answering the question." + " If you are unable to fully answer, that's OK; another assistant with different tools" + " will help where you left off. Execute what you can to make progress." + " If you or any other assistant has the FINAL TRANSACTION PROPOSAL: **BUY/HOLD/SELL** or deliverable," + " prefix your response with FINAL TRANSACTION PROPOSAL: **BUY/HOLD/SELL** so the team knows to stop." + " You have access to the following tools: {tool_names}.\n{system_message}" + "For your reference, the current date is {current_date}. We are looking at the company {ticker}", + ), + MessagesPlaceholder(variable_name="messages"), + ] + ) + + prompt = prompt.partial(system_message=system_message) + prompt = prompt.partial(tool_names=", ".join([tool.name for tool in tools])) + prompt = prompt.partial(current_date=current_date) + prompt = prompt.partial(ticker=ticker) + + chain = prompt | llm.bind_tools(tools) + result = chain.invoke(state["messages"]) + + return { + "messages": [result], + "news_report": result.content, + } + + return news_analyst_node diff --git a/tradingagents/agents/analysts/social_media_analyst.py b/tradingagents/agents/analysts/social_media_analyst.py index 42fb1f71..d6062c18 100644 --- a/tradingagents/agents/analysts/social_media_analyst.py +++ b/tradingagents/agents/analysts/social_media_analyst.py @@ -1,55 +1,55 @@ -from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder -import time -import json - - -def create_social_media_analyst(llm, toolkit): - def social_media_analyst_node(state): - current_date = state["trade_date"] - ticker = state["company_of_interest"] - company_name = state["company_of_interest"] - - if toolkit.config["online_tools"]: - tools = [toolkit.get_stock_news_openai] - else: - tools = [ - toolkit.get_reddit_stock_info, - ] - - system_message = ( - "You are a social media and company specific news researcher/analyst tasked with analyzing social media posts, recent company news, and public sentiment for a specific company over the past week. You will be given a company's name your objective is to write a comprehensive long report detailing your analysis, insights, and implications for traders and investors on this company's current state after looking at social media and what people are saying about that company, analyzing sentiment data of what people feel each day about the company, and looking at recent company news. Try to look at all sources possible from social media to sentiment to news. Do not simply state the trends are mixed, provide detailed and finegrained analysis and insights that may help traders make decisions." - + """ Make sure to append a Makrdown table at the end of the report to organize key points in the report, organized and easy to read.""", - ) - - prompt = ChatPromptTemplate.from_messages( - [ - ( - "system", - "You are a helpful AI assistant, collaborating with other assistants." - " Use the provided tools to progress towards answering the question." - " If you are unable to fully answer, that's OK; another assistant with different tools" - " will help where you left off. Execute what you can to make progress." - " If you or any other assistant has the FINAL TRANSACTION PROPOSAL: **BUY/HOLD/SELL** or deliverable," - " prefix your response with FINAL TRANSACTION PROPOSAL: **BUY/HOLD/SELL** so the team knows to stop." - " You have access to the following tools: {tool_names}.\n{system_message}" - "For your reference, the current date is {current_date}. The current company we want to analyze is {ticker}", - ), - MessagesPlaceholder(variable_name="messages"), - ] - ) - - prompt = prompt.partial(system_message=system_message) - prompt = prompt.partial(tool_names=", ".join([tool.name for tool in tools])) - prompt = prompt.partial(current_date=current_date) - prompt = prompt.partial(ticker=ticker) - - chain = prompt | llm.bind_tools(tools) - - result = chain.invoke(state["messages"]) - - return { - "messages": [result], - "sentiment_report": result.content, - } - - return social_media_analyst_node +from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder +import time +import json + + +def create_social_media_analyst(llm, toolkit): + def social_media_analyst_node(state): + current_date = state["trade_date"] + ticker = state["company_of_interest"] + company_name = state["company_of_interest"] + + if toolkit.config["online_tools"]: + tools = [toolkit.get_stock_news_openai] + else: + tools = [ + toolkit.get_reddit_stock_info, + ] + + system_message = ( + "You are a social media and company specific news researcher/analyst tasked with analyzing social media posts, recent company news, and public sentiment for a specific company over the past week. You will be given a company's name your objective is to write a comprehensive long report detailing your analysis, insights, and implications for traders and investors on this company's current state after looking at social media and what people are saying about that company, analyzing sentiment data of what people feel each day about the company, and looking at recent company news. Try to look at all sources possible from social media to sentiment to news. Do not simply state the trends are mixed, provide detailed and finegrained analysis and insights that may help traders make decisions." + + """ Make sure to append a Makrdown table at the end of the report to organize key points in the report, organized and easy to read.""", + ) + + prompt = ChatPromptTemplate.from_messages( + [ + ( + "system", + "You are a helpful AI assistant, collaborating with other assistants." + " Use the provided tools to progress towards answering the question." + " If you are unable to fully answer, that's OK; another assistant with different tools" + " will help where you left off. Execute what you can to make progress." + " If you or any other assistant has the FINAL TRANSACTION PROPOSAL: **BUY/HOLD/SELL** or deliverable," + " prefix your response with FINAL TRANSACTION PROPOSAL: **BUY/HOLD/SELL** so the team knows to stop." + " You have access to the following tools: {tool_names}.\n{system_message}" + "For your reference, the current date is {current_date}. The current company we want to analyze is {ticker}", + ), + MessagesPlaceholder(variable_name="messages"), + ] + ) + + prompt = prompt.partial(system_message=system_message) + prompt = prompt.partial(tool_names=", ".join([tool.name for tool in tools])) + prompt = prompt.partial(current_date=current_date) + prompt = prompt.partial(ticker=ticker) + + chain = prompt | llm.bind_tools(tools) + + result = chain.invoke(state["messages"]) + + return { + "messages": [result], + "sentiment_report": result.content, + } + + return social_media_analyst_node diff --git a/tradingagents/agents/managers/research_manager.py b/tradingagents/agents/managers/research_manager.py index c537fa2f..029a83b5 100644 --- a/tradingagents/agents/managers/research_manager.py +++ b/tradingagents/agents/managers/research_manager.py @@ -1,55 +1,55 @@ -import time -import json - - -def create_research_manager(llm, memory): - def research_manager_node(state) -> dict: - history = state["investment_debate_state"].get("history", "") - market_research_report = state["market_report"] - sentiment_report = state["sentiment_report"] - news_report = state["news_report"] - fundamentals_report = state["fundamentals_report"] - - investment_debate_state = state["investment_debate_state"] - - curr_situation = f"{market_research_report}\n\n{sentiment_report}\n\n{news_report}\n\n{fundamentals_report}" - past_memories = memory.get_memories(curr_situation, n_matches=2) - - past_memory_str = "" - for i, rec in enumerate(past_memories, 1): - past_memory_str += rec["recommendation"] + "\n\n" - - prompt = f"""As the portfolio manager and debate facilitator, your role is to critically evaluate this round of debate and make a definitive decision: align with the bear analyst, the bull analyst, or choose Hold only if it is strongly justified based on the arguments presented. - -Summarize the key points from both sides concisely, focusing on the most compelling evidence or reasoning. Your recommendationโ€”Buy, Sell, or Holdโ€”must be clear and actionable. Avoid defaulting to Hold simply because both sides have valid points; commit to a stance grounded in the debate's strongest arguments. - -Additionally, develop a detailed investment plan for the trader. This should include: - -Your Recommendation: A decisive stance supported by the most convincing arguments. -Rationale: An explanation of why these arguments lead to your conclusion. -Strategic Actions: Concrete steps for implementing the recommendation. -Take into account your past mistakes on similar situations. Use these insights to refine your decision-making and ensure you are learning and improving. Present your analysis conversationally, as if speaking naturally, without special formatting. - -Here are your past reflections on mistakes: -\"{past_memory_str}\" - -Here is the debate: -Debate History: -{history}""" - response = llm.invoke(prompt) - - new_investment_debate_state = { - "judge_decision": response.content, - "history": investment_debate_state.get("history", ""), - "bear_history": investment_debate_state.get("bear_history", ""), - "bull_history": investment_debate_state.get("bull_history", ""), - "current_response": response.content, - "count": investment_debate_state["count"], - } - - return { - "investment_debate_state": new_investment_debate_state, - "investment_plan": response.content, - } - - return research_manager_node +import time +import json + + +def create_research_manager(llm, memory): + def research_manager_node(state) -> dict: + history = state["investment_debate_state"].get("history", "") + market_research_report = state["market_report"] + sentiment_report = state["sentiment_report"] + news_report = state["news_report"] + fundamentals_report = state["fundamentals_report"] + + investment_debate_state = state["investment_debate_state"] + + curr_situation = f"{market_research_report}\n\n{sentiment_report}\n\n{news_report}\n\n{fundamentals_report}" + past_memories = memory.get_memories(curr_situation, n_matches=2) + + past_memory_str = "" + for i, rec in enumerate(past_memories, 1): + past_memory_str += rec["recommendation"] + "\n\n" + + prompt = f"""As the portfolio manager and debate facilitator, your role is to critically evaluate this round of debate and make a definitive decision: align with the bear analyst, the bull analyst, or choose Hold only if it is strongly justified based on the arguments presented. + +Summarize the key points from both sides concisely, focusing on the most compelling evidence or reasoning. Your recommendationโ€”Buy, Sell, or Holdโ€”must be clear and actionable. Avoid defaulting to Hold simply because both sides have valid points; commit to a stance grounded in the debate's strongest arguments. + +Additionally, develop a detailed investment plan for the trader. This should include: + +Your Recommendation: A decisive stance supported by the most convincing arguments. +Rationale: An explanation of why these arguments lead to your conclusion. +Strategic Actions: Concrete steps for implementing the recommendation. +Take into account your past mistakes on similar situations. Use these insights to refine your decision-making and ensure you are learning and improving. Present your analysis conversationally, as if speaking naturally, without special formatting. + +Here are your past reflections on mistakes: +\"{past_memory_str}\" + +Here is the debate: +Debate History: +{history}""" + response = llm.invoke(prompt) + + new_investment_debate_state = { + "judge_decision": response.content, + "history": investment_debate_state.get("history", ""), + "bear_history": investment_debate_state.get("bear_history", ""), + "bull_history": investment_debate_state.get("bull_history", ""), + "current_response": response.content, + "count": investment_debate_state["count"], + } + + return { + "investment_debate_state": new_investment_debate_state, + "investment_plan": response.content, + } + + return research_manager_node diff --git a/tradingagents/agents/managers/risk_manager.py b/tradingagents/agents/managers/risk_manager.py index fba763d6..1288cb76 100644 --- a/tradingagents/agents/managers/risk_manager.py +++ b/tradingagents/agents/managers/risk_manager.py @@ -1,66 +1,66 @@ -import time -import json - - -def create_risk_manager(llm, memory): - def risk_manager_node(state) -> dict: - - company_name = state["company_of_interest"] - - history = state["risk_debate_state"]["history"] - risk_debate_state = state["risk_debate_state"] - market_research_report = state["market_report"] - news_report = state["news_report"] - fundamentals_report = state["news_report"] - sentiment_report = state["sentiment_report"] - trader_plan = state["investment_plan"] - - curr_situation = f"{market_research_report}\n\n{sentiment_report}\n\n{news_report}\n\n{fundamentals_report}" - past_memories = memory.get_memories(curr_situation, n_matches=2) - - past_memory_str = "" - for i, rec in enumerate(past_memories, 1): - past_memory_str += rec["recommendation"] + "\n\n" - - prompt = f"""As the Risk Management Judge and Debate Facilitator, your goal is to evaluate the debate between three risk analystsโ€”Risky, Neutral, and Safe/Conservativeโ€”and determine the best course of action for the trader. Your decision must result in a clear recommendation: Buy, Sell, or Hold. Choose Hold only if strongly justified by specific arguments, not as a fallback when all sides seem valid. Strive for clarity and decisiveness. - -Guidelines for Decision-Making: -1. **Summarize Key Arguments**: Extract the strongest points from each analyst, focusing on relevance to the context. -2. **Provide Rationale**: Support your recommendation with direct quotes and counterarguments from the debate. -3. **Refine the Trader's Plan**: Start with the trader's original plan, **{trader_plan}**, and adjust it based on the analysts' insights. -4. **Learn from Past Mistakes**: Use lessons from **{past_memory_str}** to address prior misjudgments and improve the decision you are making now to make sure you don't make a wrong BUY/SELL/HOLD call that loses money. - -Deliverables: -- A clear and actionable recommendation: Buy, Sell, or Hold. -- Detailed reasoning anchored in the debate and past reflections. - ---- - -**Analysts Debate History:** -{history} - ---- - -Focus on actionable insights and continuous improvement. Build on past lessons, critically evaluate all perspectives, and ensure each decision advances better outcomes.""" - - response = llm.invoke(prompt) - - new_risk_debate_state = { - "judge_decision": response.content, - "history": risk_debate_state["history"], - "risky_history": risk_debate_state["risky_history"], - "safe_history": risk_debate_state["safe_history"], - "neutral_history": risk_debate_state["neutral_history"], - "latest_speaker": "Judge", - "current_risky_response": risk_debate_state["current_risky_response"], - "current_safe_response": risk_debate_state["current_safe_response"], - "current_neutral_response": risk_debate_state["current_neutral_response"], - "count": risk_debate_state["count"], - } - - return { - "risk_debate_state": new_risk_debate_state, - "final_trade_decision": response.content, - } - - return risk_manager_node +import time +import json + + +def create_risk_manager(llm, memory): + def risk_manager_node(state) -> dict: + + company_name = state["company_of_interest"] + + history = state["risk_debate_state"]["history"] + risk_debate_state = state["risk_debate_state"] + market_research_report = state["market_report"] + news_report = state["news_report"] + fundamentals_report = state["news_report"] + sentiment_report = state["sentiment_report"] + trader_plan = state["investment_plan"] + + curr_situation = f"{market_research_report}\n\n{sentiment_report}\n\n{news_report}\n\n{fundamentals_report}" + past_memories = memory.get_memories(curr_situation, n_matches=2) + + past_memory_str = "" + for i, rec in enumerate(past_memories, 1): + past_memory_str += rec["recommendation"] + "\n\n" + + prompt = f"""As the Risk Management Judge and Debate Facilitator, your goal is to evaluate the debate between three risk analystsโ€”Risky, Neutral, and Safe/Conservativeโ€”and determine the best course of action for the trader. Your decision must result in a clear recommendation: Buy, Sell, or Hold. Choose Hold only if strongly justified by specific arguments, not as a fallback when all sides seem valid. Strive for clarity and decisiveness. + +Guidelines for Decision-Making: +1. **Summarize Key Arguments**: Extract the strongest points from each analyst, focusing on relevance to the context. +2. **Provide Rationale**: Support your recommendation with direct quotes and counterarguments from the debate. +3. **Refine the Trader's Plan**: Start with the trader's original plan, **{trader_plan}**, and adjust it based on the analysts' insights. +4. **Learn from Past Mistakes**: Use lessons from **{past_memory_str}** to address prior misjudgments and improve the decision you are making now to make sure you don't make a wrong BUY/SELL/HOLD call that loses money. + +Deliverables: +- A clear and actionable recommendation: Buy, Sell, or Hold. +- Detailed reasoning anchored in the debate and past reflections. + +--- + +**Analysts Debate History:** +{history} + +--- + +Focus on actionable insights and continuous improvement. Build on past lessons, critically evaluate all perspectives, and ensure each decision advances better outcomes.""" + + response = llm.invoke(prompt) + + new_risk_debate_state = { + "judge_decision": response.content, + "history": risk_debate_state["history"], + "risky_history": risk_debate_state["risky_history"], + "safe_history": risk_debate_state["safe_history"], + "neutral_history": risk_debate_state["neutral_history"], + "latest_speaker": "Judge", + "current_risky_response": risk_debate_state["current_risky_response"], + "current_safe_response": risk_debate_state["current_safe_response"], + "current_neutral_response": risk_debate_state["current_neutral_response"], + "count": risk_debate_state["count"], + } + + return { + "risk_debate_state": new_risk_debate_state, + "final_trade_decision": response.content, + } + + return risk_manager_node diff --git a/tradingagents/agents/researchers/bear_researcher.py b/tradingagents/agents/researchers/bear_researcher.py index 6634490a..47c28f66 100644 --- a/tradingagents/agents/researchers/bear_researcher.py +++ b/tradingagents/agents/researchers/bear_researcher.py @@ -1,61 +1,61 @@ -from langchain_core.messages import AIMessage -import time -import json - - -def create_bear_researcher(llm, memory): - def bear_node(state) -> dict: - investment_debate_state = state["investment_debate_state"] - history = investment_debate_state.get("history", "") - bear_history = investment_debate_state.get("bear_history", "") - - current_response = investment_debate_state.get("current_response", "") - market_research_report = state["market_report"] - sentiment_report = state["sentiment_report"] - news_report = state["news_report"] - fundamentals_report = state["fundamentals_report"] - - curr_situation = f"{market_research_report}\n\n{sentiment_report}\n\n{news_report}\n\n{fundamentals_report}" - past_memories = memory.get_memories(curr_situation, n_matches=2) - - past_memory_str = "" - for i, rec in enumerate(past_memories, 1): - past_memory_str += rec["recommendation"] + "\n\n" - - prompt = f"""You are a Bear Analyst making the case against investing in the stock. Your goal is to present a well-reasoned argument emphasizing risks, challenges, and negative indicators. Leverage the provided research and data to highlight potential downsides and counter bullish arguments effectively. - -Key points to focus on: - -- Risks and Challenges: Highlight factors like market saturation, financial instability, or macroeconomic threats that could hinder the stock's performance. -- Competitive Weaknesses: Emphasize vulnerabilities such as weaker market positioning, declining innovation, or threats from competitors. -- Negative Indicators: Use evidence from financial data, market trends, or recent adverse news to support your position. -- Bull Counterpoints: Critically analyze the bull argument with specific data and sound reasoning, exposing weaknesses or over-optimistic assumptions. -- Engagement: Present your argument in a conversational style, directly engaging with the bull analyst's points and debating effectively rather than simply listing facts. - -Resources available: - -Market research report: {market_research_report} -Social media sentiment report: {sentiment_report} -Latest world affairs news: {news_report} -Company fundamentals report: {fundamentals_report} -Conversation history of the debate: {history} -Last bull argument: {current_response} -Reflections from similar situations and lessons learned: {past_memory_str} -Use this information to deliver a compelling bear argument, refute the bull's claims, and engage in a dynamic debate that demonstrates the risks and weaknesses of investing in the stock. You must also address reflections and learn from lessons and mistakes you made in the past. -""" - - response = llm.invoke(prompt) - - argument = f"Bear Analyst: {response.content}" - - new_investment_debate_state = { - "history": history + "\n" + argument, - "bear_history": bear_history + "\n" + argument, - "bull_history": investment_debate_state.get("bull_history", ""), - "current_response": argument, - "count": investment_debate_state["count"] + 1, - } - - return {"investment_debate_state": new_investment_debate_state} - - return bear_node +from langchain_core.messages import AIMessage +import time +import json + + +def create_bear_researcher(llm, memory): + def bear_node(state) -> dict: + investment_debate_state = state["investment_debate_state"] + history = investment_debate_state.get("history", "") + bear_history = investment_debate_state.get("bear_history", "") + + current_response = investment_debate_state.get("current_response", "") + market_research_report = state["market_report"] + sentiment_report = state["sentiment_report"] + news_report = state["news_report"] + fundamentals_report = state["fundamentals_report"] + + curr_situation = f"{market_research_report}\n\n{sentiment_report}\n\n{news_report}\n\n{fundamentals_report}" + past_memories = memory.get_memories(curr_situation, n_matches=2) + + past_memory_str = "" + for i, rec in enumerate(past_memories, 1): + past_memory_str += rec["recommendation"] + "\n\n" + + prompt = f"""You are a Bear Analyst making the case against investing in the stock. Your goal is to present a well-reasoned argument emphasizing risks, challenges, and negative indicators. Leverage the provided research and data to highlight potential downsides and counter bullish arguments effectively. + +Key points to focus on: + +- Risks and Challenges: Highlight factors like market saturation, financial instability, or macroeconomic threats that could hinder the stock's performance. +- Competitive Weaknesses: Emphasize vulnerabilities such as weaker market positioning, declining innovation, or threats from competitors. +- Negative Indicators: Use evidence from financial data, market trends, or recent adverse news to support your position. +- Bull Counterpoints: Critically analyze the bull argument with specific data and sound reasoning, exposing weaknesses or over-optimistic assumptions. +- Engagement: Present your argument in a conversational style, directly engaging with the bull analyst's points and debating effectively rather than simply listing facts. + +Resources available: + +Market research report: {market_research_report} +Social media sentiment report: {sentiment_report} +Latest world affairs news: {news_report} +Company fundamentals report: {fundamentals_report} +Conversation history of the debate: {history} +Last bull argument: {current_response} +Reflections from similar situations and lessons learned: {past_memory_str} +Use this information to deliver a compelling bear argument, refute the bull's claims, and engage in a dynamic debate that demonstrates the risks and weaknesses of investing in the stock. You must also address reflections and learn from lessons and mistakes you made in the past. +""" + + response = llm.invoke(prompt) + + argument = f"Bear Analyst: {response.content}" + + new_investment_debate_state = { + "history": history + "\n" + argument, + "bear_history": bear_history + "\n" + argument, + "bull_history": investment_debate_state.get("bull_history", ""), + "current_response": argument, + "count": investment_debate_state["count"] + 1, + } + + return {"investment_debate_state": new_investment_debate_state} + + return bear_node diff --git a/tradingagents/agents/researchers/bull_researcher.py b/tradingagents/agents/researchers/bull_researcher.py index b03ef755..3be2e4a1 100644 --- a/tradingagents/agents/researchers/bull_researcher.py +++ b/tradingagents/agents/researchers/bull_researcher.py @@ -1,59 +1,59 @@ -from langchain_core.messages import AIMessage -import time -import json - - -def create_bull_researcher(llm, memory): - def bull_node(state) -> dict: - investment_debate_state = state["investment_debate_state"] - history = investment_debate_state.get("history", "") - bull_history = investment_debate_state.get("bull_history", "") - - current_response = investment_debate_state.get("current_response", "") - market_research_report = state["market_report"] - sentiment_report = state["sentiment_report"] - news_report = state["news_report"] - fundamentals_report = state["fundamentals_report"] - - curr_situation = f"{market_research_report}\n\n{sentiment_report}\n\n{news_report}\n\n{fundamentals_report}" - past_memories = memory.get_memories(curr_situation, n_matches=2) - - past_memory_str = "" - for i, rec in enumerate(past_memories, 1): - past_memory_str += rec["recommendation"] + "\n\n" - - prompt = f"""You are a Bull Analyst advocating for investing in the stock. Your task is to build a strong, evidence-based case emphasizing growth potential, competitive advantages, and positive market indicators. Leverage the provided research and data to address concerns and counter bearish arguments effectively. - -Key points to focus on: -- Growth Potential: Highlight the company's market opportunities, revenue projections, and scalability. -- Competitive Advantages: Emphasize factors like unique products, strong branding, or dominant market positioning. -- Positive Indicators: Use financial health, industry trends, and recent positive news as evidence. -- Bear Counterpoints: Critically analyze the bear argument with specific data and sound reasoning, addressing concerns thoroughly and showing why the bull perspective holds stronger merit. -- Engagement: Present your argument in a conversational style, engaging directly with the bear analyst's points and debating effectively rather than just listing data. - -Resources available: -Market research report: {market_research_report} -Social media sentiment report: {sentiment_report} -Latest world affairs news: {news_report} -Company fundamentals report: {fundamentals_report} -Conversation history of the debate: {history} -Last bear argument: {current_response} -Reflections from similar situations and lessons learned: {past_memory_str} -Use this information to deliver a compelling bull argument, refute the bear's concerns, and engage in a dynamic debate that demonstrates the strengths of the bull position. You must also address reflections and learn from lessons and mistakes you made in the past. -""" - - response = llm.invoke(prompt) - - argument = f"Bull Analyst: {response.content}" - - new_investment_debate_state = { - "history": history + "\n" + argument, - "bull_history": bull_history + "\n" + argument, - "bear_history": investment_debate_state.get("bear_history", ""), - "current_response": argument, - "count": investment_debate_state["count"] + 1, - } - - return {"investment_debate_state": new_investment_debate_state} - - return bull_node +from langchain_core.messages import AIMessage +import time +import json + + +def create_bull_researcher(llm, memory): + def bull_node(state) -> dict: + investment_debate_state = state["investment_debate_state"] + history = investment_debate_state.get("history", "") + bull_history = investment_debate_state.get("bull_history", "") + + current_response = investment_debate_state.get("current_response", "") + market_research_report = state["market_report"] + sentiment_report = state["sentiment_report"] + news_report = state["news_report"] + fundamentals_report = state["fundamentals_report"] + + curr_situation = f"{market_research_report}\n\n{sentiment_report}\n\n{news_report}\n\n{fundamentals_report}" + past_memories = memory.get_memories(curr_situation, n_matches=2) + + past_memory_str = "" + for i, rec in enumerate(past_memories, 1): + past_memory_str += rec["recommendation"] + "\n\n" + + prompt = f"""You are a Bull Analyst advocating for investing in the stock. Your task is to build a strong, evidence-based case emphasizing growth potential, competitive advantages, and positive market indicators. Leverage the provided research and data to address concerns and counter bearish arguments effectively. + +Key points to focus on: +- Growth Potential: Highlight the company's market opportunities, revenue projections, and scalability. +- Competitive Advantages: Emphasize factors like unique products, strong branding, or dominant market positioning. +- Positive Indicators: Use financial health, industry trends, and recent positive news as evidence. +- Bear Counterpoints: Critically analyze the bear argument with specific data and sound reasoning, addressing concerns thoroughly and showing why the bull perspective holds stronger merit. +- Engagement: Present your argument in a conversational style, engaging directly with the bear analyst's points and debating effectively rather than just listing data. + +Resources available: +Market research report: {market_research_report} +Social media sentiment report: {sentiment_report} +Latest world affairs news: {news_report} +Company fundamentals report: {fundamentals_report} +Conversation history of the debate: {history} +Last bear argument: {current_response} +Reflections from similar situations and lessons learned: {past_memory_str} +Use this information to deliver a compelling bull argument, refute the bear's concerns, and engage in a dynamic debate that demonstrates the strengths of the bull position. You must also address reflections and learn from lessons and mistakes you made in the past. +""" + + response = llm.invoke(prompt) + + argument = f"Bull Analyst: {response.content}" + + new_investment_debate_state = { + "history": history + "\n" + argument, + "bull_history": bull_history + "\n" + argument, + "bear_history": investment_debate_state.get("bear_history", ""), + "current_response": argument, + "count": investment_debate_state["count"] + 1, + } + + return {"investment_debate_state": new_investment_debate_state} + + return bull_node diff --git a/tradingagents/agents/risk_mgmt/aggresive_debator.py b/tradingagents/agents/risk_mgmt/aggresive_debator.py index 7e2b4937..d9aa34cb 100644 --- a/tradingagents/agents/risk_mgmt/aggresive_debator.py +++ b/tradingagents/agents/risk_mgmt/aggresive_debator.py @@ -1,55 +1,55 @@ -import time -import json - - -def create_risky_debator(llm): - def risky_node(state) -> dict: - risk_debate_state = state["risk_debate_state"] - history = risk_debate_state.get("history", "") - risky_history = risk_debate_state.get("risky_history", "") - - current_safe_response = risk_debate_state.get("current_safe_response", "") - current_neutral_response = risk_debate_state.get("current_neutral_response", "") - - market_research_report = state["market_report"] - sentiment_report = state["sentiment_report"] - news_report = state["news_report"] - fundamentals_report = state["fundamentals_report"] - - trader_decision = state["trader_investment_plan"] - - prompt = f"""As the Risky Risk Analyst, your role is to actively champion high-reward, high-risk opportunities, emphasizing bold strategies and competitive advantages. When evaluating the trader's decision or plan, focus intently on the potential upside, growth potential, and innovative benefitsโ€”even when these come with elevated risk. Use the provided market data and sentiment analysis to strengthen your arguments and challenge the opposing views. Specifically, respond directly to each point made by the conservative and neutral analysts, countering with data-driven rebuttals and persuasive reasoning. Highlight where their caution might miss critical opportunities or where their assumptions may be overly conservative. Here is the trader's decision: - -{trader_decision} - -Your task is to create a compelling case for the trader's decision by questioning and critiquing the conservative and neutral stances to demonstrate why your high-reward perspective offers the best path forward. Incorporate insights from the following sources into your arguments: - -Market Research Report: {market_research_report} -Social Media Sentiment Report: {sentiment_report} -Latest World Affairs Report: {news_report} -Company Fundamentals Report: {fundamentals_report} -Here is the current conversation history: {history} Here are the last arguments from the conservative analyst: {current_safe_response} Here are the last arguments from the neutral analyst: {current_neutral_response}. If there are no responses from the other viewpoints, do not halluncinate and just present your point. - -Engage actively by addressing any specific concerns raised, refuting the weaknesses in their logic, and asserting the benefits of risk-taking to outpace market norms. Maintain a focus on debating and persuading, not just presenting data. Challenge each counterpoint to underscore why a high-risk approach is optimal. Output conversationally as if you are speaking without any special formatting.""" - - response = llm.invoke(prompt) - - argument = f"Risky Analyst: {response.content}" - - new_risk_debate_state = { - "history": history + "\n" + argument, - "risky_history": risky_history + "\n" + argument, - "safe_history": risk_debate_state.get("safe_history", ""), - "neutral_history": risk_debate_state.get("neutral_history", ""), - "latest_speaker": "Risky", - "current_risky_response": argument, - "current_safe_response": risk_debate_state.get("current_safe_response", ""), - "current_neutral_response": risk_debate_state.get( - "current_neutral_response", "" - ), - "count": risk_debate_state["count"] + 1, - } - - return {"risk_debate_state": new_risk_debate_state} - - return risky_node +import time +import json + + +def create_risky_debator(llm): + def risky_node(state) -> dict: + risk_debate_state = state["risk_debate_state"] + history = risk_debate_state.get("history", "") + risky_history = risk_debate_state.get("risky_history", "") + + current_safe_response = risk_debate_state.get("current_safe_response", "") + current_neutral_response = risk_debate_state.get("current_neutral_response", "") + + market_research_report = state["market_report"] + sentiment_report = state["sentiment_report"] + news_report = state["news_report"] + fundamentals_report = state["fundamentals_report"] + + trader_decision = state["trader_investment_plan"] + + prompt = f"""As the Risky Risk Analyst, your role is to actively champion high-reward, high-risk opportunities, emphasizing bold strategies and competitive advantages. When evaluating the trader's decision or plan, focus intently on the potential upside, growth potential, and innovative benefitsโ€”even when these come with elevated risk. Use the provided market data and sentiment analysis to strengthen your arguments and challenge the opposing views. Specifically, respond directly to each point made by the conservative and neutral analysts, countering with data-driven rebuttals and persuasive reasoning. Highlight where their caution might miss critical opportunities or where their assumptions may be overly conservative. Here is the trader's decision: + +{trader_decision} + +Your task is to create a compelling case for the trader's decision by questioning and critiquing the conservative and neutral stances to demonstrate why your high-reward perspective offers the best path forward. Incorporate insights from the following sources into your arguments: + +Market Research Report: {market_research_report} +Social Media Sentiment Report: {sentiment_report} +Latest World Affairs Report: {news_report} +Company Fundamentals Report: {fundamentals_report} +Here is the current conversation history: {history} Here are the last arguments from the conservative analyst: {current_safe_response} Here are the last arguments from the neutral analyst: {current_neutral_response}. If there are no responses from the other viewpoints, do not halluncinate and just present your point. + +Engage actively by addressing any specific concerns raised, refuting the weaknesses in their logic, and asserting the benefits of risk-taking to outpace market norms. Maintain a focus on debating and persuading, not just presenting data. Challenge each counterpoint to underscore why a high-risk approach is optimal. Output conversationally as if you are speaking without any special formatting.""" + + response = llm.invoke(prompt) + + argument = f"Risky Analyst: {response.content}" + + new_risk_debate_state = { + "history": history + "\n" + argument, + "risky_history": risky_history + "\n" + argument, + "safe_history": risk_debate_state.get("safe_history", ""), + "neutral_history": risk_debate_state.get("neutral_history", ""), + "latest_speaker": "Risky", + "current_risky_response": argument, + "current_safe_response": risk_debate_state.get("current_safe_response", ""), + "current_neutral_response": risk_debate_state.get( + "current_neutral_response", "" + ), + "count": risk_debate_state["count"] + 1, + } + + return {"risk_debate_state": new_risk_debate_state} + + return risky_node diff --git a/tradingagents/agents/risk_mgmt/conservative_debator.py b/tradingagents/agents/risk_mgmt/conservative_debator.py index c56e16ad..0627a55a 100644 --- a/tradingagents/agents/risk_mgmt/conservative_debator.py +++ b/tradingagents/agents/risk_mgmt/conservative_debator.py @@ -1,58 +1,58 @@ -from langchain_core.messages import AIMessage -import time -import json - - -def create_safe_debator(llm): - def safe_node(state) -> dict: - risk_debate_state = state["risk_debate_state"] - history = risk_debate_state.get("history", "") - safe_history = risk_debate_state.get("safe_history", "") - - current_risky_response = risk_debate_state.get("current_risky_response", "") - current_neutral_response = risk_debate_state.get("current_neutral_response", "") - - market_research_report = state["market_report"] - sentiment_report = state["sentiment_report"] - news_report = state["news_report"] - fundamentals_report = state["fundamentals_report"] - - trader_decision = state["trader_investment_plan"] - - prompt = f"""As the Safe/Conservative Risk Analyst, your primary objective is to protect assets, minimize volatility, and ensure steady, reliable growth. You prioritize stability, security, and risk mitigation, carefully assessing potential losses, economic downturns, and market volatility. When evaluating the trader's decision or plan, critically examine high-risk elements, pointing out where the decision may expose the firm to undue risk and where more cautious alternatives could secure long-term gains. Here is the trader's decision: - -{trader_decision} - -Your task is to actively counter the arguments of the Risky and Neutral Analysts, highlighting where their views may overlook potential threats or fail to prioritize sustainability. Respond directly to their points, drawing from the following data sources to build a convincing case for a low-risk approach adjustment to the trader's decision: - -Market Research Report: {market_research_report} -Social Media Sentiment Report: {sentiment_report} -Latest World Affairs Report: {news_report} -Company Fundamentals Report: {fundamentals_report} -Here is the current conversation history: {history} Here is the last response from the risky analyst: {current_risky_response} Here is the last response from the neutral analyst: {current_neutral_response}. If there are no responses from the other viewpoints, do not halluncinate and just present your point. - -Engage by questioning their optimism and emphasizing the potential downsides they may have overlooked. Address each of their counterpoints to showcase why a conservative stance is ultimately the safest path for the firm's assets. Focus on debating and critiquing their arguments to demonstrate the strength of a low-risk strategy over their approaches. Output conversationally as if you are speaking without any special formatting.""" - - response = llm.invoke(prompt) - - argument = f"Safe Analyst: {response.content}" - - new_risk_debate_state = { - "history": history + "\n" + argument, - "risky_history": risk_debate_state.get("risky_history", ""), - "safe_history": safe_history + "\n" + argument, - "neutral_history": risk_debate_state.get("neutral_history", ""), - "latest_speaker": "Safe", - "current_risky_response": risk_debate_state.get( - "current_risky_response", "" - ), - "current_safe_response": argument, - "current_neutral_response": risk_debate_state.get( - "current_neutral_response", "" - ), - "count": risk_debate_state["count"] + 1, - } - - return {"risk_debate_state": new_risk_debate_state} - - return safe_node +from langchain_core.messages import AIMessage +import time +import json + + +def create_safe_debator(llm): + def safe_node(state) -> dict: + risk_debate_state = state["risk_debate_state"] + history = risk_debate_state.get("history", "") + safe_history = risk_debate_state.get("safe_history", "") + + current_risky_response = risk_debate_state.get("current_risky_response", "") + current_neutral_response = risk_debate_state.get("current_neutral_response", "") + + market_research_report = state["market_report"] + sentiment_report = state["sentiment_report"] + news_report = state["news_report"] + fundamentals_report = state["fundamentals_report"] + + trader_decision = state["trader_investment_plan"] + + prompt = f"""As the Safe/Conservative Risk Analyst, your primary objective is to protect assets, minimize volatility, and ensure steady, reliable growth. You prioritize stability, security, and risk mitigation, carefully assessing potential losses, economic downturns, and market volatility. When evaluating the trader's decision or plan, critically examine high-risk elements, pointing out where the decision may expose the firm to undue risk and where more cautious alternatives could secure long-term gains. Here is the trader's decision: + +{trader_decision} + +Your task is to actively counter the arguments of the Risky and Neutral Analysts, highlighting where their views may overlook potential threats or fail to prioritize sustainability. Respond directly to their points, drawing from the following data sources to build a convincing case for a low-risk approach adjustment to the trader's decision: + +Market Research Report: {market_research_report} +Social Media Sentiment Report: {sentiment_report} +Latest World Affairs Report: {news_report} +Company Fundamentals Report: {fundamentals_report} +Here is the current conversation history: {history} Here is the last response from the risky analyst: {current_risky_response} Here is the last response from the neutral analyst: {current_neutral_response}. If there are no responses from the other viewpoints, do not halluncinate and just present your point. + +Engage by questioning their optimism and emphasizing the potential downsides they may have overlooked. Address each of their counterpoints to showcase why a conservative stance is ultimately the safest path for the firm's assets. Focus on debating and critiquing their arguments to demonstrate the strength of a low-risk strategy over their approaches. Output conversationally as if you are speaking without any special formatting.""" + + response = llm.invoke(prompt) + + argument = f"Safe Analyst: {response.content}" + + new_risk_debate_state = { + "history": history + "\n" + argument, + "risky_history": risk_debate_state.get("risky_history", ""), + "safe_history": safe_history + "\n" + argument, + "neutral_history": risk_debate_state.get("neutral_history", ""), + "latest_speaker": "Safe", + "current_risky_response": risk_debate_state.get( + "current_risky_response", "" + ), + "current_safe_response": argument, + "current_neutral_response": risk_debate_state.get( + "current_neutral_response", "" + ), + "count": risk_debate_state["count"] + 1, + } + + return {"risk_debate_state": new_risk_debate_state} + + return safe_node diff --git a/tradingagents/agents/risk_mgmt/neutral_debator.py b/tradingagents/agents/risk_mgmt/neutral_debator.py index a6d2ef5c..aacf297b 100644 --- a/tradingagents/agents/risk_mgmt/neutral_debator.py +++ b/tradingagents/agents/risk_mgmt/neutral_debator.py @@ -1,55 +1,55 @@ -import time -import json - - -def create_neutral_debator(llm): - def neutral_node(state) -> dict: - risk_debate_state = state["risk_debate_state"] - history = risk_debate_state.get("history", "") - neutral_history = risk_debate_state.get("neutral_history", "") - - current_risky_response = risk_debate_state.get("current_risky_response", "") - current_safe_response = risk_debate_state.get("current_safe_response", "") - - market_research_report = state["market_report"] - sentiment_report = state["sentiment_report"] - news_report = state["news_report"] - fundamentals_report = state["fundamentals_report"] - - trader_decision = state["trader_investment_plan"] - - prompt = f"""As the Neutral Risk Analyst, your role is to provide a balanced perspective, weighing both the potential benefits and risks of the trader's decision or plan. You prioritize a well-rounded approach, evaluating the upsides and downsides while factoring in broader market trends, potential economic shifts, and diversification strategies.Here is the trader's decision: - -{trader_decision} - -Your task is to challenge both the Risky and Safe Analysts, pointing out where each perspective may be overly optimistic or overly cautious. Use insights from the following data sources to support a moderate, sustainable strategy to adjust the trader's decision: - -Market Research Report: {market_research_report} -Social Media Sentiment Report: {sentiment_report} -Latest World Affairs Report: {news_report} -Company Fundamentals Report: {fundamentals_report} -Here is the current conversation history: {history} Here is the last response from the risky analyst: {current_risky_response} Here is the last response from the safe analyst: {current_safe_response}. If there are no responses from the other viewpoints, do not halluncinate and just present your point. - -Engage actively by analyzing both sides critically, addressing weaknesses in the risky and conservative arguments to advocate for a more balanced approach. Challenge each of their points to illustrate why a moderate risk strategy might offer the best of both worlds, providing growth potential while safeguarding against extreme volatility. Focus on debating rather than simply presenting data, aiming to show that a balanced view can lead to the most reliable outcomes. Output conversationally as if you are speaking without any special formatting.""" - - response = llm.invoke(prompt) - - argument = f"Neutral Analyst: {response.content}" - - new_risk_debate_state = { - "history": history + "\n" + argument, - "risky_history": risk_debate_state.get("risky_history", ""), - "safe_history": risk_debate_state.get("safe_history", ""), - "neutral_history": neutral_history + "\n" + argument, - "latest_speaker": "Neutral", - "current_risky_response": risk_debate_state.get( - "current_risky_response", "" - ), - "current_safe_response": risk_debate_state.get("current_safe_response", ""), - "current_neutral_response": argument, - "count": risk_debate_state["count"] + 1, - } - - return {"risk_debate_state": new_risk_debate_state} - - return neutral_node +import time +import json + + +def create_neutral_debator(llm): + def neutral_node(state) -> dict: + risk_debate_state = state["risk_debate_state"] + history = risk_debate_state.get("history", "") + neutral_history = risk_debate_state.get("neutral_history", "") + + current_risky_response = risk_debate_state.get("current_risky_response", "") + current_safe_response = risk_debate_state.get("current_safe_response", "") + + market_research_report = state["market_report"] + sentiment_report = state["sentiment_report"] + news_report = state["news_report"] + fundamentals_report = state["fundamentals_report"] + + trader_decision = state["trader_investment_plan"] + + prompt = f"""As the Neutral Risk Analyst, your role is to provide a balanced perspective, weighing both the potential benefits and risks of the trader's decision or plan. You prioritize a well-rounded approach, evaluating the upsides and downsides while factoring in broader market trends, potential economic shifts, and diversification strategies.Here is the trader's decision: + +{trader_decision} + +Your task is to challenge both the Risky and Safe Analysts, pointing out where each perspective may be overly optimistic or overly cautious. Use insights from the following data sources to support a moderate, sustainable strategy to adjust the trader's decision: + +Market Research Report: {market_research_report} +Social Media Sentiment Report: {sentiment_report} +Latest World Affairs Report: {news_report} +Company Fundamentals Report: {fundamentals_report} +Here is the current conversation history: {history} Here is the last response from the risky analyst: {current_risky_response} Here is the last response from the safe analyst: {current_safe_response}. If there are no responses from the other viewpoints, do not halluncinate and just present your point. + +Engage actively by analyzing both sides critically, addressing weaknesses in the risky and conservative arguments to advocate for a more balanced approach. Challenge each of their points to illustrate why a moderate risk strategy might offer the best of both worlds, providing growth potential while safeguarding against extreme volatility. Focus on debating rather than simply presenting data, aiming to show that a balanced view can lead to the most reliable outcomes. Output conversationally as if you are speaking without any special formatting.""" + + response = llm.invoke(prompt) + + argument = f"Neutral Analyst: {response.content}" + + new_risk_debate_state = { + "history": history + "\n" + argument, + "risky_history": risk_debate_state.get("risky_history", ""), + "safe_history": risk_debate_state.get("safe_history", ""), + "neutral_history": neutral_history + "\n" + argument, + "latest_speaker": "Neutral", + "current_risky_response": risk_debate_state.get( + "current_risky_response", "" + ), + "current_safe_response": risk_debate_state.get("current_safe_response", ""), + "current_neutral_response": argument, + "count": risk_debate_state["count"] + 1, + } + + return {"risk_debate_state": new_risk_debate_state} + + return neutral_node diff --git a/tradingagents/agents/trader/trader.py b/tradingagents/agents/trader/trader.py index 282a8411..0c645751 100644 --- a/tradingagents/agents/trader/trader.py +++ b/tradingagents/agents/trader/trader.py @@ -1,43 +1,43 @@ -import functools -import time -import json - - -def create_trader(llm, memory): - def trader_node(state, name): - company_name = state["company_of_interest"] - investment_plan = state["investment_plan"] - market_research_report = state["market_report"] - sentiment_report = state["sentiment_report"] - news_report = state["news_report"] - fundamentals_report = state["fundamentals_report"] - - curr_situation = f"{market_research_report}\n\n{sentiment_report}\n\n{news_report}\n\n{fundamentals_report}" - past_memories = memory.get_memories(curr_situation, n_matches=2) - - past_memory_str = "" - for i, rec in enumerate(past_memories, 1): - past_memory_str += rec["recommendation"] + "\n\n" - - context = { - "role": "user", - "content": f"Based on a comprehensive analysis by a team of analysts, here is an investment plan tailored for {company_name}. This plan incorporates insights from current technical market trends, macroeconomic indicators, and social media sentiment. Use this plan as a foundation for evaluating your next trading decision.\n\nProposed Investment Plan: {investment_plan}\n\nLeverage these insights to make an informed and strategic decision.", - } - - messages = [ - { - "role": "system", - "content": f"""You are a trading agent analyzing market data to make investment decisions. Based on your analysis, provide a specific recommendation to buy, sell, or hold. End with a firm decision and always conclude your response with 'FINAL TRANSACTION PROPOSAL: **BUY/HOLD/SELL**' to confirm your recommendation. Do not forget to utilize lessons from past decisions to learn from your mistakes. Here is some reflections from similar situatiosn you traded in and the lessons learned: {past_memory_str}""", - }, - context, - ] - - result = llm.invoke(messages) - - return { - "messages": [result], - "trader_investment_plan": result.content, - "sender": name, - } - - return functools.partial(trader_node, name="Trader") +import functools +import time +import json + + +def create_trader(llm, memory): + def trader_node(state, name): + company_name = state["company_of_interest"] + investment_plan = state["investment_plan"] + market_research_report = state["market_report"] + sentiment_report = state["sentiment_report"] + news_report = state["news_report"] + fundamentals_report = state["fundamentals_report"] + + curr_situation = f"{market_research_report}\n\n{sentiment_report}\n\n{news_report}\n\n{fundamentals_report}" + past_memories = memory.get_memories(curr_situation, n_matches=2) + + past_memory_str = "" + for i, rec in enumerate(past_memories, 1): + past_memory_str += rec["recommendation"] + "\n\n" + + context = { + "role": "user", + "content": f"Based on a comprehensive analysis by a team of analysts, here is an investment plan tailored for {company_name}. This plan incorporates insights from current technical market trends, macroeconomic indicators, and social media sentiment. Use this plan as a foundation for evaluating your next trading decision.\n\nProposed Investment Plan: {investment_plan}\n\nLeverage these insights to make an informed and strategic decision.", + } + + messages = [ + { + "role": "system", + "content": f"""You are a trading agent analyzing market data to make investment decisions. Based on your analysis, provide a specific recommendation to buy, sell, or hold. End with a firm decision and always conclude your response with 'FINAL TRANSACTION PROPOSAL: **BUY/HOLD/SELL**' to confirm your recommendation. Do not forget to utilize lessons from past decisions to learn from your mistakes. Here is some reflections from similar situatiosn you traded in and the lessons learned: {past_memory_str}""", + }, + context, + ] + + result = llm.invoke(messages) + + return { + "messages": [result], + "trader_investment_plan": result.content, + "sender": name, + } + + return functools.partial(trader_node, name="Trader") diff --git a/tradingagents/agents/utils/agent_states.py b/tradingagents/agents/utils/agent_states.py index 3a859ea1..f347febd 100644 --- a/tradingagents/agents/utils/agent_states.py +++ b/tradingagents/agents/utils/agent_states.py @@ -1,76 +1,76 @@ -from typing import Annotated, Sequence -from datetime import date, timedelta, datetime -from typing_extensions import TypedDict, Optional -from langchain_openai import ChatOpenAI -from tradingagents.agents import * -from langgraph.prebuilt import ToolNode -from langgraph.graph import END, StateGraph, START, MessagesState - - -# Researcher team state -class InvestDebateState(TypedDict): - bull_history: Annotated[ - str, "Bullish Conversation history" - ] # Bullish Conversation history - bear_history: Annotated[ - str, "Bearish Conversation history" - ] # Bullish Conversation history - history: Annotated[str, "Conversation history"] # Conversation history - current_response: Annotated[str, "Latest response"] # Last response - judge_decision: Annotated[str, "Final judge decision"] # Last response - count: Annotated[int, "Length of the current conversation"] # Conversation length - - -# Risk management team state -class RiskDebateState(TypedDict): - risky_history: Annotated[ - str, "Risky Agent's Conversation history" - ] # Conversation history - safe_history: Annotated[ - str, "Safe Agent's Conversation history" - ] # Conversation history - neutral_history: Annotated[ - str, "Neutral Agent's Conversation history" - ] # Conversation history - history: Annotated[str, "Conversation history"] # Conversation history - latest_speaker: Annotated[str, "Analyst that spoke last"] - current_risky_response: Annotated[ - str, "Latest response by the risky analyst" - ] # Last response - current_safe_response: Annotated[ - str, "Latest response by the safe analyst" - ] # Last response - current_neutral_response: Annotated[ - str, "Latest response by the neutral analyst" - ] # Last response - judge_decision: Annotated[str, "Judge's decision"] - count: Annotated[int, "Length of the current conversation"] # Conversation length - - -class AgentState(MessagesState): - company_of_interest: Annotated[str, "Company that we are interested in trading"] - trade_date: Annotated[str, "What date we are trading at"] - - sender: Annotated[str, "Agent that sent this message"] - - # research step - market_report: Annotated[str, "Report from the Market Analyst"] - sentiment_report: Annotated[str, "Report from the Social Media Analyst"] - news_report: Annotated[ - str, "Report from the News Researcher of current world affairs" - ] - fundamentals_report: Annotated[str, "Report from the Fundamentals Researcher"] - - # researcher team discussion step - investment_debate_state: Annotated[ - InvestDebateState, "Current state of the debate on if to invest or not" - ] - investment_plan: Annotated[str, "Plan generated by the Analyst"] - - trader_investment_plan: Annotated[str, "Plan generated by the Trader"] - - # risk management team discussion step - risk_debate_state: Annotated[ - RiskDebateState, "Current state of the debate on evaluating risk" - ] - final_trade_decision: Annotated[str, "Final decision made by the Risk Analysts"] +from typing import Annotated, Sequence +from datetime import date, timedelta, datetime +from typing_extensions import TypedDict, Optional +from langchain_openai import ChatOpenAI +from tradingagents.agents import * +from langgraph.prebuilt import ToolNode +from langgraph.graph import END, StateGraph, START, MessagesState + + +# Researcher team state +class InvestDebateState(TypedDict): + bull_history: Annotated[ + str, "Bullish Conversation history" + ] # Bullish Conversation history + bear_history: Annotated[ + str, "Bearish Conversation history" + ] # Bullish Conversation history + history: Annotated[str, "Conversation history"] # Conversation history + current_response: Annotated[str, "Latest response"] # Last response + judge_decision: Annotated[str, "Final judge decision"] # Last response + count: Annotated[int, "Length of the current conversation"] # Conversation length + + +# Risk management team state +class RiskDebateState(TypedDict): + risky_history: Annotated[ + str, "Risky Agent's Conversation history" + ] # Conversation history + safe_history: Annotated[ + str, "Safe Agent's Conversation history" + ] # Conversation history + neutral_history: Annotated[ + str, "Neutral Agent's Conversation history" + ] # Conversation history + history: Annotated[str, "Conversation history"] # Conversation history + latest_speaker: Annotated[str, "Analyst that spoke last"] + current_risky_response: Annotated[ + str, "Latest response by the risky analyst" + ] # Last response + current_safe_response: Annotated[ + str, "Latest response by the safe analyst" + ] # Last response + current_neutral_response: Annotated[ + str, "Latest response by the neutral analyst" + ] # Last response + judge_decision: Annotated[str, "Judge's decision"] + count: Annotated[int, "Length of the current conversation"] # Conversation length + + +class AgentState(MessagesState): + company_of_interest: Annotated[str, "Company that we are interested in trading"] + trade_date: Annotated[str, "What date we are trading at"] + + sender: Annotated[str, "Agent that sent this message"] + + # research step + market_report: Annotated[str, "Report from the Market Analyst"] + sentiment_report: Annotated[str, "Report from the Social Media Analyst"] + news_report: Annotated[ + str, "Report from the News Researcher of current world affairs" + ] + fundamentals_report: Annotated[str, "Report from the Fundamentals Researcher"] + + # researcher team discussion step + investment_debate_state: Annotated[ + InvestDebateState, "Current state of the debate on if to invest or not" + ] + investment_plan: Annotated[str, "Plan generated by the Analyst"] + + trader_investment_plan: Annotated[str, "Plan generated by the Trader"] + + # risk management team discussion step + risk_debate_state: Annotated[ + RiskDebateState, "Current state of the debate on evaluating risk" + ] + final_trade_decision: Annotated[str, "Final decision made by the Risk Analysts"] diff --git a/tradingagents/agents/utils/agent_utils.py b/tradingagents/agents/utils/agent_utils.py index 6e6c9751..b1fbfc31 100644 --- a/tradingagents/agents/utils/agent_utils.py +++ b/tradingagents/agents/utils/agent_utils.py @@ -1,411 +1,411 @@ -from langchain_core.messages import BaseMessage, HumanMessage, ToolMessage, AIMessage -from typing import List -from typing import Annotated -from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder -from langchain_core.messages import RemoveMessage -from langchain_core.tools import tool -from datetime import date, timedelta, datetime -import functools -import pandas as pd -import os -from dateutil.relativedelta import relativedelta -from langchain_openai import ChatOpenAI -import tradingagents.dataflows.interface as interface -from tradingagents.default_config import DEFAULT_CONFIG - - -def create_msg_delete(): - def delete_messages(state): - """To prevent message history from overflowing, regularly clear message history after a stage of the pipeline is done""" - messages = state["messages"] - return {"messages": [RemoveMessage(id=m.id) for m in messages]} - - return delete_messages - - -class Toolkit: - _config = DEFAULT_CONFIG.copy() - - @classmethod - def update_config(cls, config): - """Update the class-level configuration.""" - cls._config.update(config) - - @property - def config(self): - """Access the configuration.""" - return self._config - - def __init__(self, config=None): - if config: - self.update_config(config) - - @staticmethod - @tool - def get_reddit_news( - curr_date: Annotated[str, "Date you want to get news for in yyyy-mm-dd format"], - ) -> str: - """ - Retrieve global news from Reddit within a specified time frame. - Args: - curr_date (str): Date you want to get news for in yyyy-mm-dd format - Returns: - str: A formatted dataframe containing the latest global news from Reddit in the specified time frame. - """ - - global_news_result = interface.get_reddit_global_news(curr_date, 7, 5) - - return global_news_result - - @staticmethod - @tool - def get_finnhub_news( - ticker: Annotated[ - str, - "Search query of a company, e.g. 'AAPL, TSM, etc.", - ], - start_date: Annotated[str, "Start date in yyyy-mm-dd format"], - end_date: Annotated[str, "End date in yyyy-mm-dd format"], - ): - """ - Retrieve the latest news about a given stock from Finnhub within a date range - Args: - ticker (str): Ticker of a company. e.g. AAPL, TSM - start_date (str): Start date in yyyy-mm-dd format - end_date (str): End date in yyyy-mm-dd format - Returns: - str: A formatted dataframe containing news about the company within the date range from start_date to end_date - """ - - end_date_str = end_date - - end_date = datetime.strptime(end_date, "%Y-%m-%d") - start_date = datetime.strptime(start_date, "%Y-%m-%d") - look_back_days = (end_date - start_date).days - - finnhub_news_result = interface.get_finnhub_news( - ticker, end_date_str, look_back_days - ) - - return finnhub_news_result - - @staticmethod - @tool - def get_reddit_stock_info( - ticker: Annotated[ - str, - "Ticker of a company. e.g. AAPL, TSM", - ], - curr_date: Annotated[str, "Current date you want to get news for"], - ) -> str: - """ - Retrieve the latest news about a given stock from Reddit, given the current date. - Args: - ticker (str): Ticker of a company. e.g. AAPL, TSM - curr_date (str): current date in yyyy-mm-dd format to get news for - Returns: - str: A formatted dataframe containing the latest news about the company on the given date - """ - - stock_news_results = interface.get_reddit_company_news(ticker, curr_date, 7, 5) - - return stock_news_results - - @staticmethod - @tool - def get_YFin_data( - symbol: Annotated[str, "ticker symbol of the company"], - start_date: Annotated[str, "Start date in yyyy-mm-dd format"], - end_date: Annotated[str, "Start date in yyyy-mm-dd format"], - ) -> str: - """ - Retrieve the stock price data for a given ticker symbol from Yahoo Finance. - Args: - symbol (str): Ticker symbol of the company, e.g. AAPL, TSM - start_date (str): Start date in yyyy-mm-dd format - end_date (str): End date in yyyy-mm-dd format - Returns: - str: A formatted dataframe containing the stock price data for the specified ticker symbol in the specified date range. - """ - - result_data = interface.get_YFin_data(symbol, start_date, end_date) - - return result_data - - @staticmethod - @tool - def get_YFin_data_online( - symbol: Annotated[str, "ticker symbol of the company"], - start_date: Annotated[str, "Start date in yyyy-mm-dd format"], - end_date: Annotated[str, "Start date in yyyy-mm-dd format"], - ) -> str: - """ - Retrieve the stock price data for a given ticker symbol from Yahoo Finance. - Args: - symbol (str): Ticker symbol of the company, e.g. AAPL, TSM - start_date (str): Start date in yyyy-mm-dd format - end_date (str): End date in yyyy-mm-dd format - Returns: - str: A formatted dataframe containing the stock price data for the specified ticker symbol in the specified date range. - """ - - result_data = interface.get_YFin_data_online(symbol, start_date, end_date) - - return result_data - - @staticmethod - @tool - def get_stockstats_indicators_report( - symbol: Annotated[str, "ticker symbol of the company"], - indicator: Annotated[ - str, "technical indicator to get the analysis and report of" - ], - curr_date: Annotated[ - str, "The current trading date you are trading on, YYYY-mm-dd" - ], - look_back_days: Annotated[int, "how many days to look back"] = 30, - ) -> str: - """ - Retrieve stock stats indicators for a given ticker symbol and indicator. - Args: - symbol (str): Ticker symbol of the company, e.g. AAPL, TSM - indicator (str): Technical indicator to get the analysis and report of - curr_date (str): The current trading date you are trading on, YYYY-mm-dd - look_back_days (int): How many days to look back, default is 30 - Returns: - str: A formatted dataframe containing the stock stats indicators for the specified ticker symbol and indicator. - """ - - result_stockstats = interface.get_stock_stats_indicators_window( - symbol, indicator, curr_date, look_back_days, False - ) - - return result_stockstats - - @staticmethod - @tool - def get_stockstats_indicators_report_online( - symbol: Annotated[str, "ticker symbol of the company"], - indicator: Annotated[ - str, "technical indicator to get the analysis and report of" - ], - curr_date: Annotated[ - str, "The current trading date you are trading on, YYYY-mm-dd" - ], - look_back_days: Annotated[int, "how many days to look back"] = 30, - ) -> str: - """ - Retrieve stock stats indicators for a given ticker symbol and indicator. - Args: - symbol (str): Ticker symbol of the company, e.g. AAPL, TSM - indicator (str): Technical indicator to get the analysis and report of - curr_date (str): The current trading date you are trading on, YYYY-mm-dd - look_back_days (int): How many days to look back, default is 30 - Returns: - str: A formatted dataframe containing the stock stats indicators for the specified ticker symbol and indicator. - """ - - result_stockstats = interface.get_stock_stats_indicators_window( - symbol, indicator, curr_date, look_back_days, True - ) - - return result_stockstats - - @staticmethod - @tool - def get_finnhub_company_insider_sentiment( - ticker: Annotated[str, "ticker symbol for the company"], - curr_date: Annotated[ - str, - "current date of you are trading at, yyyy-mm-dd", - ], - ): - """ - Retrieve insider sentiment information about a company (retrieved from public SEC information) for the past 30 days - Args: - ticker (str): ticker symbol of the company - curr_date (str): current date you are trading at, yyyy-mm-dd - Returns: - str: a report of the sentiment in the past 30 days starting at curr_date - """ - - data_sentiment = interface.get_finnhub_company_insider_sentiment( - ticker, curr_date, 30 - ) - - return data_sentiment - - @staticmethod - @tool - def get_finnhub_company_insider_transactions( - ticker: Annotated[str, "ticker symbol"], - curr_date: Annotated[ - str, - "current date you are trading at, yyyy-mm-dd", - ], - ): - """ - Retrieve insider transaction information about a company (retrieved from public SEC information) for the past 30 days - Args: - ticker (str): ticker symbol of the company - curr_date (str): current date you are trading at, yyyy-mm-dd - Returns: - str: a report of the company's insider transactions/trading information in the past 30 days - """ - - data_trans = interface.get_finnhub_company_insider_transactions( - ticker, curr_date, 30 - ) - - return data_trans - - @staticmethod - @tool - def get_simfin_balance_sheet( - ticker: Annotated[str, "ticker symbol"], - freq: Annotated[ - str, - "reporting frequency of the company's financial history: annual/quarterly", - ], - curr_date: Annotated[str, "current date you are trading at, yyyy-mm-dd"], - ): - """ - Retrieve the most recent balance sheet of a company - Args: - ticker (str): ticker symbol of the company - freq (str): reporting frequency of the company's financial history: annual / quarterly - curr_date (str): current date you are trading at, yyyy-mm-dd - Returns: - str: a report of the company's most recent balance sheet - """ - - data_balance_sheet = interface.get_simfin_balance_sheet(ticker, freq, curr_date) - - return data_balance_sheet - - @staticmethod - @tool - def get_simfin_cashflow( - ticker: Annotated[str, "ticker symbol"], - freq: Annotated[ - str, - "reporting frequency of the company's financial history: annual/quarterly", - ], - curr_date: Annotated[str, "current date you are trading at, yyyy-mm-dd"], - ): - """ - Retrieve the most recent cash flow statement of a company - Args: - ticker (str): ticker symbol of the company - freq (str): reporting frequency of the company's financial history: annual / quarterly - curr_date (str): current date you are trading at, yyyy-mm-dd - Returns: - str: a report of the company's most recent cash flow statement - """ - - data_cashflow = interface.get_simfin_cashflow(ticker, freq, curr_date) - - return data_cashflow - - @staticmethod - @tool - def get_simfin_income_stmt( - ticker: Annotated[str, "ticker symbol"], - freq: Annotated[ - str, - "reporting frequency of the company's financial history: annual/quarterly", - ], - curr_date: Annotated[str, "current date you are trading at, yyyy-mm-dd"], - ): - """ - Retrieve the most recent income statement of a company - Args: - ticker (str): ticker symbol of the company - freq (str): reporting frequency of the company's financial history: annual / quarterly - curr_date (str): current date you are trading at, yyyy-mm-dd - Returns: - str: a report of the company's most recent income statement - """ - - data_income_stmt = interface.get_simfin_income_statements( - ticker, freq, curr_date - ) - - return data_income_stmt - - @staticmethod - @tool - def get_google_news( - query: Annotated[str, "Query to search with"], - curr_date: Annotated[str, "Curr date in yyyy-mm-dd format"], - ): - """ - Retrieve the latest news from Google News based on a query and date range. - Args: - query (str): Query to search with - curr_date (str): Current date in yyyy-mm-dd format - look_back_days (int): How many days to look back - Returns: - str: A formatted string containing the latest news from Google News based on the query and date range. - """ - - google_news_results = interface.get_google_news(query, curr_date, 7) - - return google_news_results - - @staticmethod - @tool - def get_stock_news_openai( - ticker: Annotated[str, "the company's ticker"], - curr_date: Annotated[str, "Current date in yyyy-mm-dd format"], - ): - """ - Retrieve the latest news about a given stock by using OpenAI's news API. - Args: - ticker (str): Ticker of a company. e.g. AAPL, TSM - curr_date (str): Current date in yyyy-mm-dd format - Returns: - str: A formatted string containing the latest news about the company on the given date. - """ - - openai_news_results = interface.get_stock_news_openai(ticker, curr_date) - - return openai_news_results - - @staticmethod - @tool - def get_global_news_openai( - curr_date: Annotated[str, "Current date in yyyy-mm-dd format"], - ): - """ - Retrieve the latest macroeconomics news on a given date using OpenAI's macroeconomics news API. - Args: - curr_date (str): Current date in yyyy-mm-dd format - Returns: - str: A formatted string containing the latest macroeconomic news on the given date. - """ - - openai_news_results = interface.get_global_news_openai(curr_date) - - return openai_news_results - - @staticmethod - @tool - def get_fundamentals_openai( - ticker: Annotated[str, "the company's ticker"], - curr_date: Annotated[str, "Current date in yyyy-mm-dd format"], - ): - """ - Retrieve the latest fundamental information about a given stock on a given date by using OpenAI's news API. - Args: - ticker (str): Ticker of a company. e.g. AAPL, TSM - curr_date (str): Current date in yyyy-mm-dd format - Returns: - str: A formatted string containing the latest fundamental information about the company on the given date. - """ - - openai_fundamentals_results = interface.get_fundamentals_openai( - ticker, curr_date - ) - - return openai_fundamentals_results +from langchain_core.messages import BaseMessage, HumanMessage, ToolMessage, AIMessage +from typing import List +from typing import Annotated +from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder +from langchain_core.messages import RemoveMessage +from langchain_core.tools import tool +from datetime import date, timedelta, datetime +import functools +import pandas as pd +import os +from dateutil.relativedelta import relativedelta +from langchain_openai import ChatOpenAI +import tradingagents.dataflows.interface as interface +from tradingagents.default_config import DEFAULT_CONFIG + + +def create_msg_delete(): + def delete_messages(state): + """To prevent message history from overflowing, regularly clear message history after a stage of the pipeline is done""" + messages = state["messages"] + return {"messages": [RemoveMessage(id=m.id) for m in messages]} + + return delete_messages + + +class Toolkit: + _config = DEFAULT_CONFIG.copy() + + @classmethod + def update_config(cls, config): + """Update the class-level configuration.""" + cls._config.update(config) + + @property + def config(self): + """Access the configuration.""" + return self._config + + def __init__(self, config=None): + if config: + self.update_config(config) + + @staticmethod + @tool + def get_reddit_news( + curr_date: Annotated[str, "Date you want to get news for in yyyy-mm-dd format"], + ) -> str: + """ + Retrieve global news from Reddit within a specified time frame. + Args: + curr_date (str): Date you want to get news for in yyyy-mm-dd format + Returns: + str: A formatted dataframe containing the latest global news from Reddit in the specified time frame. + """ + + global_news_result = interface.get_reddit_global_news(curr_date, 7, 5) + + return global_news_result + + @staticmethod + @tool + def get_finnhub_news( + ticker: Annotated[ + str, + "Search query of a company, e.g. 'AAPL, TSM, etc.", + ], + start_date: Annotated[str, "Start date in yyyy-mm-dd format"], + end_date: Annotated[str, "End date in yyyy-mm-dd format"], + ): + """ + Retrieve the latest news about a given stock from Finnhub within a date range + Args: + ticker (str): Ticker of a company. e.g. AAPL, TSM + start_date (str): Start date in yyyy-mm-dd format + end_date (str): End date in yyyy-mm-dd format + Returns: + str: A formatted dataframe containing news about the company within the date range from start_date to end_date + """ + + end_date_str = end_date + + end_date = datetime.strptime(end_date, "%Y-%m-%d") + start_date = datetime.strptime(start_date, "%Y-%m-%d") + look_back_days = (end_date - start_date).days + + finnhub_news_result = interface.get_finnhub_news( + ticker, end_date_str, look_back_days + ) + + return finnhub_news_result + + @staticmethod + @tool + def get_reddit_stock_info( + ticker: Annotated[ + str, + "Ticker of a company. e.g. AAPL, TSM", + ], + curr_date: Annotated[str, "Current date you want to get news for"], + ) -> str: + """ + Retrieve the latest news about a given stock from Reddit, given the current date. + Args: + ticker (str): Ticker of a company. e.g. AAPL, TSM + curr_date (str): current date in yyyy-mm-dd format to get news for + Returns: + str: A formatted dataframe containing the latest news about the company on the given date + """ + + stock_news_results = interface.get_reddit_company_news(ticker, curr_date, 7, 5) + + return stock_news_results + + @staticmethod + @tool + def get_YFin_data( + symbol: Annotated[str, "ticker symbol of the company"], + start_date: Annotated[str, "Start date in yyyy-mm-dd format"], + end_date: Annotated[str, "Start date in yyyy-mm-dd format"], + ) -> str: + """ + Retrieve the stock price data for a given ticker symbol from Yahoo Finance. + Args: + symbol (str): Ticker symbol of the company, e.g. AAPL, TSM + start_date (str): Start date in yyyy-mm-dd format + end_date (str): End date in yyyy-mm-dd format + Returns: + str: A formatted dataframe containing the stock price data for the specified ticker symbol in the specified date range. + """ + + result_data = interface.get_YFin_data(symbol, start_date, end_date) + + return result_data + + @staticmethod + @tool + def get_YFin_data_online( + symbol: Annotated[str, "ticker symbol of the company"], + start_date: Annotated[str, "Start date in yyyy-mm-dd format"], + end_date: Annotated[str, "Start date in yyyy-mm-dd format"], + ) -> str: + """ + Retrieve the stock price data for a given ticker symbol from Yahoo Finance. + Args: + symbol (str): Ticker symbol of the company, e.g. AAPL, TSM + start_date (str): Start date in yyyy-mm-dd format + end_date (str): End date in yyyy-mm-dd format + Returns: + str: A formatted dataframe containing the stock price data for the specified ticker symbol in the specified date range. + """ + + result_data = interface.get_YFin_data_online(symbol, start_date, end_date) + + return result_data + + @staticmethod + @tool + def get_stockstats_indicators_report( + symbol: Annotated[str, "ticker symbol of the company"], + indicator: Annotated[ + str, "technical indicator to get the analysis and report of" + ], + curr_date: Annotated[ + str, "The current trading date you are trading on, YYYY-mm-dd" + ], + look_back_days: Annotated[int, "how many days to look back"] = 30, + ) -> str: + """ + Retrieve stock stats indicators for a given ticker symbol and indicator. + Args: + symbol (str): Ticker symbol of the company, e.g. AAPL, TSM + indicator (str): Technical indicator to get the analysis and report of + curr_date (str): The current trading date you are trading on, YYYY-mm-dd + look_back_days (int): How many days to look back, default is 30 + Returns: + str: A formatted dataframe containing the stock stats indicators for the specified ticker symbol and indicator. + """ + + result_stockstats = interface.get_stock_stats_indicators_window( + symbol, indicator, curr_date, look_back_days, False + ) + + return result_stockstats + + @staticmethod + @tool + def get_stockstats_indicators_report_online( + symbol: Annotated[str, "ticker symbol of the company"], + indicator: Annotated[ + str, "technical indicator to get the analysis and report of" + ], + curr_date: Annotated[ + str, "The current trading date you are trading on, YYYY-mm-dd" + ], + look_back_days: Annotated[int, "how many days to look back"] = 30, + ) -> str: + """ + Retrieve stock stats indicators for a given ticker symbol and indicator. + Args: + symbol (str): Ticker symbol of the company, e.g. AAPL, TSM + indicator (str): Technical indicator to get the analysis and report of + curr_date (str): The current trading date you are trading on, YYYY-mm-dd + look_back_days (int): How many days to look back, default is 30 + Returns: + str: A formatted dataframe containing the stock stats indicators for the specified ticker symbol and indicator. + """ + + result_stockstats = interface.get_stock_stats_indicators_window( + symbol, indicator, curr_date, look_back_days, True + ) + + return result_stockstats + + @staticmethod + @tool + def get_finnhub_company_insider_sentiment( + ticker: Annotated[str, "ticker symbol for the company"], + curr_date: Annotated[ + str, + "current date of you are trading at, yyyy-mm-dd", + ], + ): + """ + Retrieve insider sentiment information about a company (retrieved from public SEC information) for the past 30 days + Args: + ticker (str): ticker symbol of the company + curr_date (str): current date you are trading at, yyyy-mm-dd + Returns: + str: a report of the sentiment in the past 30 days starting at curr_date + """ + + data_sentiment = interface.get_finnhub_company_insider_sentiment( + ticker, curr_date, 30 + ) + + return data_sentiment + + @staticmethod + @tool + def get_finnhub_company_insider_transactions( + ticker: Annotated[str, "ticker symbol"], + curr_date: Annotated[ + str, + "current date you are trading at, yyyy-mm-dd", + ], + ): + """ + Retrieve insider transaction information about a company (retrieved from public SEC information) for the past 30 days + Args: + ticker (str): ticker symbol of the company + curr_date (str): current date you are trading at, yyyy-mm-dd + Returns: + str: a report of the company's insider transactions/trading information in the past 30 days + """ + + data_trans = interface.get_finnhub_company_insider_transactions( + ticker, curr_date, 30 + ) + + return data_trans + + @staticmethod + @tool + def get_simfin_balance_sheet( + ticker: Annotated[str, "ticker symbol"], + freq: Annotated[ + str, + "reporting frequency of the company's financial history: annual/quarterly", + ], + curr_date: Annotated[str, "current date you are trading at, yyyy-mm-dd"], + ): + """ + Retrieve the most recent balance sheet of a company + Args: + ticker (str): ticker symbol of the company + freq (str): reporting frequency of the company's financial history: annual / quarterly + curr_date (str): current date you are trading at, yyyy-mm-dd + Returns: + str: a report of the company's most recent balance sheet + """ + + data_balance_sheet = interface.get_simfin_balance_sheet(ticker, freq, curr_date) + + return data_balance_sheet + + @staticmethod + @tool + def get_simfin_cashflow( + ticker: Annotated[str, "ticker symbol"], + freq: Annotated[ + str, + "reporting frequency of the company's financial history: annual/quarterly", + ], + curr_date: Annotated[str, "current date you are trading at, yyyy-mm-dd"], + ): + """ + Retrieve the most recent cash flow statement of a company + Args: + ticker (str): ticker symbol of the company + freq (str): reporting frequency of the company's financial history: annual / quarterly + curr_date (str): current date you are trading at, yyyy-mm-dd + Returns: + str: a report of the company's most recent cash flow statement + """ + + data_cashflow = interface.get_simfin_cashflow(ticker, freq, curr_date) + + return data_cashflow + + @staticmethod + @tool + def get_simfin_income_stmt( + ticker: Annotated[str, "ticker symbol"], + freq: Annotated[ + str, + "reporting frequency of the company's financial history: annual/quarterly", + ], + curr_date: Annotated[str, "current date you are trading at, yyyy-mm-dd"], + ): + """ + Retrieve the most recent income statement of a company + Args: + ticker (str): ticker symbol of the company + freq (str): reporting frequency of the company's financial history: annual / quarterly + curr_date (str): current date you are trading at, yyyy-mm-dd + Returns: + str: a report of the company's most recent income statement + """ + + data_income_stmt = interface.get_simfin_income_statements( + ticker, freq, curr_date + ) + + return data_income_stmt + + @staticmethod + @tool + def get_google_news( + query: Annotated[str, "Query to search with"], + curr_date: Annotated[str, "Curr date in yyyy-mm-dd format"], + ): + """ + Retrieve the latest news from Google News based on a query and date range. + Args: + query (str): Query to search with + curr_date (str): Current date in yyyy-mm-dd format + look_back_days (int): How many days to look back + Returns: + str: A formatted string containing the latest news from Google News based on the query and date range. + """ + + google_news_results = interface.get_google_news(query, curr_date, 7) + + return google_news_results + + @staticmethod + @tool + def get_stock_news_openai( + ticker: Annotated[str, "the company's ticker"], + curr_date: Annotated[str, "Current date in yyyy-mm-dd format"], + ): + """ + Retrieve the latest news about a given stock by using OpenAI's news API. + Args: + ticker (str): Ticker of a company. e.g. AAPL, TSM + curr_date (str): Current date in yyyy-mm-dd format + Returns: + str: A formatted string containing the latest news about the company on the given date. + """ + + openai_news_results = interface.get_stock_news_openai(ticker, curr_date) + + return openai_news_results + + @staticmethod + @tool + def get_global_news_openai( + curr_date: Annotated[str, "Current date in yyyy-mm-dd format"], + ): + """ + Retrieve the latest macroeconomics news on a given date using OpenAI's macroeconomics news API. + Args: + curr_date (str): Current date in yyyy-mm-dd format + Returns: + str: A formatted string containing the latest macroeconomic news on the given date. + """ + + openai_news_results = interface.get_global_news_openai(curr_date) + + return openai_news_results + + @staticmethod + @tool + def get_fundamentals_openai( + ticker: Annotated[str, "the company's ticker"], + curr_date: Annotated[str, "Current date in yyyy-mm-dd format"], + ): + """ + Retrieve the latest fundamental information about a given stock on a given date by using OpenAI's news API. + Args: + ticker (str): Ticker of a company. e.g. AAPL, TSM + curr_date (str): Current date in yyyy-mm-dd format + Returns: + str: A formatted string containing the latest fundamental information about the company on the given date. + """ + + openai_fundamentals_results = interface.get_fundamentals_openai( + ticker, curr_date + ) + + return openai_fundamentals_results diff --git a/tradingagents/agents/utils/memory.py b/tradingagents/agents/utils/memory.py index a1934bd8..782a1ee2 100644 --- a/tradingagents/agents/utils/memory.py +++ b/tradingagents/agents/utils/memory.py @@ -1,109 +1,110 @@ -import chromadb -from chromadb.config import Settings -from openai import OpenAI -import numpy as np - - -class FinancialSituationMemory: - def __init__(self, name): - self.client = OpenAI() - self.chroma_client = chromadb.Client(Settings(allow_reset=True)) - self.situation_collection = self.chroma_client.create_collection(name=name) - - def get_embedding(self, text): - """Get OpenAI embedding for a text""" - response = self.client.embeddings.create( - model="text-embedding-ada-002", input=text - ) - return response.data[0].embedding - - def add_situations(self, situations_and_advice): - """Add financial situations and their corresponding advice. Parameter is a list of tuples (situation, rec)""" - - situations = [] - advice = [] - ids = [] - embeddings = [] - - offset = self.situation_collection.count() - - for i, (situation, recommendation) in enumerate(situations_and_advice): - situations.append(situation) - advice.append(recommendation) - ids.append(str(offset + i)) - embeddings.append(self.get_embedding(situation)) - - self.situation_collection.add( - documents=situations, - metadatas=[{"recommendation": rec} for rec in advice], - embeddings=embeddings, - ids=ids, - ) - - def get_memories(self, current_situation, n_matches=1): - """Find matching recommendations using OpenAI embeddings""" - query_embedding = self.get_embedding(current_situation) - - results = self.situation_collection.query( - query_embeddings=[query_embedding], - n_results=n_matches, - include=["metadatas", "documents", "distances"], - ) - - matched_results = [] - for i in range(len(results["documents"][0])): - matched_results.append( - { - "matched_situation": results["documents"][0][i], - "recommendation": results["metadatas"][0][i]["recommendation"], - "similarity_score": 1 - results["distances"][0][i], - } - ) - - return matched_results - - -if __name__ == "__main__": - # Example usage - matcher = FinancialSituationMemory() - - # Example data - example_data = [ - ( - "High inflation rate with rising interest rates and declining consumer spending", - "Consider defensive sectors like consumer staples and utilities. Review fixed-income portfolio duration.", - ), - ( - "Tech sector showing high volatility with increasing institutional selling pressure", - "Reduce exposure to high-growth tech stocks. Look for value opportunities in established tech companies with strong cash flows.", - ), - ( - "Strong dollar affecting emerging markets with increasing forex volatility", - "Hedge currency exposure in international positions. Consider reducing allocation to emerging market debt.", - ), - ( - "Market showing signs of sector rotation with rising yields", - "Rebalance portfolio to maintain target allocations. Consider increasing exposure to sectors benefiting from higher rates.", - ), - ] - - # Add the example situations and recommendations - matcher.add_situations(example_data) - - # Example query - current_situation = """ - Market showing increased volatility in tech sector, with institutional investors - reducing positions and rising interest rates affecting growth stock valuations - """ - - try: - recommendations = matcher.get_memories(current_situation, n_matches=2) - - for i, rec in enumerate(recommendations, 1): - print(f"\nMatch {i}:") - print(f"Similarity Score: {rec['similarity_score']:.2f}") - print(f"Matched Situation: {rec['matched_situation']}") - print(f"Recommendation: {rec['recommendation']}") - - except Exception as e: - print(f"Error during recommendation: {str(e)}") +import chromadb +from chromadb.config import Settings +from openai import OpenAI +import numpy as np +from langchain_openai import OpenAIEmbeddings +import os + +class FinancialSituationMemory: + def __init__(self, name): + # self.client = OpenAI() + self.embeddings = OpenAIEmbeddings(model="text-embedding-ada-002", api_key=os.getenv("OPENAI_API_KEY")) + self.chroma_client = chromadb.Client(Settings(allow_reset=True)) + self.situation_collection = self.chroma_client.create_collection(name=name) + + def get_embedding(self, text): + """Get OpenAI embedding for a text""" + embedding = self.embeddings.embed_query(text) + + return embedding + + def add_situations(self, situations_and_advice): + """Add financial situations and their corresponding advice. Parameter is a list of tuples (situation, rec)""" + + situations = [] + advice = [] + ids = [] + embeddings = [] + + offset = self.situation_collection.count() + + for i, (situation, recommendation) in enumerate(situations_and_advice): + situations.append(situation) + advice.append(recommendation) + ids.append(str(offset + i)) + embeddings.append(self.get_embedding(situation)) + + self.situation_collection.add( + documents=situations, + metadatas=[{"recommendation": rec} for rec in advice], + embeddings=embeddings, + ids=ids, + ) + + def get_memories(self, current_situation, n_matches=1): + """Find matching recommendations using OpenAI embeddings""" + query_embedding = self.get_embedding(current_situation) + + results = self.situation_collection.query( + query_embeddings=[query_embedding], + n_results=n_matches, + include=["metadatas", "documents", "distances"], + ) + + matched_results = [] + for i in range(len(results["documents"][0])): + matched_results.append( + { + "matched_situation": results["documents"][0][i], + "recommendation": results["metadatas"][0][i]["recommendation"], + "similarity_score": 1 - results["distances"][0][i], + } + ) + + return matched_results + + +if __name__ == "__main__": + # Example usage + matcher = FinancialSituationMemory() + + # Example data + example_data = [ + ( + "High inflation rate with rising interest rates and declining consumer spending", + "Consider defensive sectors like consumer staples and utilities. Review fixed-income portfolio duration.", + ), + ( + "Tech sector showing high volatility with increasing institutional selling pressure", + "Reduce exposure to high-growth tech stocks. Look for value opportunities in established tech companies with strong cash flows.", + ), + ( + "Strong dollar affecting emerging markets with increasing forex volatility", + "Hedge currency exposure in international positions. Consider reducing allocation to emerging market debt.", + ), + ( + "Market showing signs of sector rotation with rising yields", + "Rebalance portfolio to maintain target allocations. Consider increasing exposure to sectors benefiting from higher rates.", + ), + ] + + # Add the example situations and recommendations + matcher.add_situations(example_data) + + # Example query + current_situation = """ + Market showing increased volatility in tech sector, with institutional investors + reducing positions and rising interest rates affecting growth stock valuations + """ + + try: + recommendations = matcher.get_memories(current_situation, n_matches=2) + + for i, rec in enumerate(recommendations, 1): + print(f"\nMatch {i}:") + print(f"Similarity Score: {rec['similarity_score']:.2f}") + print(f"Matched Situation: {rec['matched_situation']}") + print(f"Recommendation: {rec['recommendation']}") + + except Exception as e: + print(f"Error during recommendation: {str(e)}") diff --git a/tradingagents/dataflows/__init__.py b/tradingagents/dataflows/__init__.py index b0c04d1d..858b5798 100644 --- a/tradingagents/dataflows/__init__.py +++ b/tradingagents/dataflows/__init__.py @@ -1,46 +1,46 @@ -from .finnhub_utils import get_data_in_range -from .googlenews_utils import getNewsData -from .yfin_utils import YFinanceUtils -from .reddit_utils import fetch_top_from_category -from .stockstats_utils import StockstatsUtils -from .yfin_utils import YFinanceUtils - -from .interface import ( - # News and sentiment functions - get_finnhub_news, - get_finnhub_company_insider_sentiment, - get_finnhub_company_insider_transactions, - get_google_news, - get_reddit_global_news, - get_reddit_company_news, - # Financial statements functions - get_simfin_balance_sheet, - get_simfin_cashflow, - get_simfin_income_statements, - # Technical analysis functions - get_stock_stats_indicators_window, - get_stockstats_indicator, - # Market data functions - get_YFin_data_window, - get_YFin_data, -) - -__all__ = [ - # News and sentiment functions - "get_finnhub_news", - "get_finnhub_company_insider_sentiment", - "get_finnhub_company_insider_transactions", - "get_google_news", - "get_reddit_global_news", - "get_reddit_company_news", - # Financial statements functions - "get_simfin_balance_sheet", - "get_simfin_cashflow", - "get_simfin_income_statements", - # Technical analysis functions - "get_stock_stats_indicators_window", - "get_stockstats_indicator", - # Market data functions - "get_YFin_data_window", - "get_YFin_data", -] +from .finnhub_utils import get_data_in_range +from .googlenews_utils import getNewsData +from .yfin_utils import YFinanceUtils +from .reddit_utils import fetch_top_from_category +from .stockstats_utils import StockstatsUtils +from .yfin_utils import YFinanceUtils + +from .interface import ( + # News and sentiment functions + get_finnhub_news, + get_finnhub_company_insider_sentiment, + get_finnhub_company_insider_transactions, + get_google_news, + get_reddit_global_news, + get_reddit_company_news, + # Financial statements functions + get_simfin_balance_sheet, + get_simfin_cashflow, + get_simfin_income_statements, + # Technical analysis functions + get_stock_stats_indicators_window, + get_stockstats_indicator, + # Market data functions + get_YFin_data_window, + get_YFin_data, +) + +__all__ = [ + # News and sentiment functions + "get_finnhub_news", + "get_finnhub_company_insider_sentiment", + "get_finnhub_company_insider_transactions", + "get_google_news", + "get_reddit_global_news", + "get_reddit_company_news", + # Financial statements functions + "get_simfin_balance_sheet", + "get_simfin_cashflow", + "get_simfin_income_statements", + # Technical analysis functions + "get_stock_stats_indicators_window", + "get_stockstats_indicator", + # Market data functions + "get_YFin_data_window", + "get_YFin_data", +] diff --git a/tradingagents/dataflows/config.py b/tradingagents/dataflows/config.py index b8a8f8aa..3d233d64 100644 --- a/tradingagents/dataflows/config.py +++ b/tradingagents/dataflows/config.py @@ -1,34 +1,34 @@ -import tradingagents.default_config as default_config -from typing import Dict, Optional - -# Use default config but allow it to be overridden -_config: Optional[Dict] = None -DATA_DIR: Optional[str] = None - - -def initialize_config(): - """Initialize the configuration with default values.""" - global _config, DATA_DIR - if _config is None: - _config = default_config.DEFAULT_CONFIG.copy() - DATA_DIR = _config["data_dir"] - - -def set_config(config: Dict): - """Update the configuration with custom values.""" - global _config, DATA_DIR - if _config is None: - _config = default_config.DEFAULT_CONFIG.copy() - _config.update(config) - DATA_DIR = _config["data_dir"] - - -def get_config() -> Dict: - """Get the current configuration.""" - if _config is None: - initialize_config() - return _config.copy() - - -# Initialize with default config -initialize_config() +import tradingagents.default_config as default_config +from typing import Dict, Optional + +# Use default config but allow it to be overridden +_config: Optional[Dict] = None +DATA_DIR: Optional[str] = None + + +def initialize_config(): + """Initialize the configuration with default values.""" + global _config, DATA_DIR + if _config is None: + _config = default_config.DEFAULT_CONFIG.copy() + DATA_DIR = _config["data_dir"] + + +def set_config(config: Dict): + """Update the configuration with custom values.""" + global _config, DATA_DIR + if _config is None: + _config = default_config.DEFAULT_CONFIG.copy() + _config.update(config) + DATA_DIR = _config["data_dir"] + + +def get_config() -> Dict: + """Get the current configuration.""" + if _config is None: + initialize_config() + return _config.copy() + + +# Initialize with default config +initialize_config() diff --git a/tradingagents/dataflows/finnhub_utils.py b/tradingagents/dataflows/finnhub_utils.py index e7c7103c..088d1297 100644 --- a/tradingagents/dataflows/finnhub_utils.py +++ b/tradingagents/dataflows/finnhub_utils.py @@ -1,36 +1,36 @@ -import json -import os - - -def get_data_in_range(ticker, start_date, end_date, data_type, data_dir, period=None): - """ - Gets finnhub data saved and processed on disk. - Args: - start_date (str): Start date in YYYY-MM-DD format. - end_date (str): End date in YYYY-MM-DD format. - data_type (str): Type of data from finnhub to fetch. Can be insider_trans, SEC_filings, news_data, insider_senti, or fin_as_reported. - data_dir (str): Directory where the data is saved. - period (str): Default to none, if there is a period specified, should be annual or quarterly. - """ - - if period: - data_path = os.path.join( - data_dir, - "finnhub_data", - data_type, - f"{ticker}_{period}_data_formatted.json", - ) - else: - data_path = os.path.join( - data_dir, "finnhub_data", data_type, f"{ticker}_data_formatted.json" - ) - - data = open(data_path, "r") - data = json.load(data) - - # filter keys (date, str in format YYYY-MM-DD) by the date range (str, str in format YYYY-MM-DD) - filtered_data = {} - for key, value in data.items(): - if start_date <= key <= end_date and len(value) > 0: - filtered_data[key] = value - return filtered_data +import json +import os + + +def get_data_in_range(ticker, start_date, end_date, data_type, data_dir, period=None): + """ + Gets finnhub data saved and processed on disk. + Args: + start_date (str): Start date in YYYY-MM-DD format. + end_date (str): End date in YYYY-MM-DD format. + data_type (str): Type of data from finnhub to fetch. Can be insider_trans, SEC_filings, news_data, insider_senti, or fin_as_reported. + data_dir (str): Directory where the data is saved. + period (str): Default to none, if there is a period specified, should be annual or quarterly. + """ + + if period: + data_path = os.path.join( + data_dir, + "finnhub_data", + data_type, + f"{ticker}_{period}_data_formatted.json", + ) + else: + data_path = os.path.join( + data_dir, "finnhub_data", data_type, f"{ticker}_data_formatted.json" + ) + + data = open(data_path, "r") + data = json.load(data) + + # filter keys (date, str in format YYYY-MM-DD) by the date range (str, str in format YYYY-MM-DD) + filtered_data = {} + for key, value in data.items(): + if start_date <= key <= end_date and len(value) > 0: + filtered_data[key] = value + return filtered_data diff --git a/tradingagents/dataflows/googlenews_utils.py b/tradingagents/dataflows/googlenews_utils.py index bdc6124d..6c799ea5 100644 --- a/tradingagents/dataflows/googlenews_utils.py +++ b/tradingagents/dataflows/googlenews_utils.py @@ -1,108 +1,108 @@ -import json -import requests -from bs4 import BeautifulSoup -from datetime import datetime -import time -import random -from tenacity import ( - retry, - stop_after_attempt, - wait_exponential, - retry_if_exception_type, - retry_if_result, -) - - -def is_rate_limited(response): - """Check if the response indicates rate limiting (status code 429)""" - return response.status_code == 429 - - -@retry( - retry=(retry_if_result(is_rate_limited)), - wait=wait_exponential(multiplier=1, min=4, max=60), - stop=stop_after_attempt(5), -) -def make_request(url, headers): - """Make a request with retry logic for rate limiting""" - # Random delay before each request to avoid detection - time.sleep(random.uniform(2, 6)) - response = requests.get(url, headers=headers) - return response - - -def getNewsData(query, start_date, end_date): - """ - Scrape Google News search results for a given query and date range. - query: str - search query - start_date: str - start date in the format yyyy-mm-dd or mm/dd/yyyy - end_date: str - end date in the format yyyy-mm-dd or mm/dd/yyyy - """ - if "-" in start_date: - start_date = datetime.strptime(start_date, "%Y-%m-%d") - start_date = start_date.strftime("%m/%d/%Y") - if "-" in end_date: - end_date = datetime.strptime(end_date, "%Y-%m-%d") - end_date = end_date.strftime("%m/%d/%Y") - - headers = { - "User-Agent": ( - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " - "AppleWebKit/537.36 (KHTML, like Gecko) " - "Chrome/101.0.4951.54 Safari/537.36" - ) - } - - news_results = [] - page = 0 - while True: - offset = page * 10 - url = ( - f"https://www.google.com/search?q={query}" - f"&tbs=cdr:1,cd_min:{start_date},cd_max:{end_date}" - f"&tbm=nws&start={offset}" - ) - - try: - response = make_request(url, headers) - soup = BeautifulSoup(response.content, "html.parser") - results_on_page = soup.select("div.SoaBEf") - - if not results_on_page: - break # No more results found - - for el in results_on_page: - try: - link = el.find("a")["href"] - title = el.select_one("div.MBeuO").get_text() - snippet = el.select_one(".GI74Re").get_text() - date = el.select_one(".LfVVr").get_text() - source = el.select_one(".NUnG9d span").get_text() - news_results.append( - { - "link": link, - "title": title, - "snippet": snippet, - "date": date, - "source": source, - } - ) - except Exception as e: - print(f"Error processing result: {e}") - # If one of the fields is not found, skip this result - continue - - # Update the progress bar with the current count of results scraped - - # Check for the "Next" link (pagination) - next_link = soup.find("a", id="pnnext") - if not next_link: - break - - page += 1 - - except Exception as e: - print(f"Failed after multiple retries: {e}") - break - - return news_results +import json +import requests +from bs4 import BeautifulSoup +from datetime import datetime +import time +import random +from tenacity import ( + retry, + stop_after_attempt, + wait_exponential, + retry_if_exception_type, + retry_if_result, +) + + +def is_rate_limited(response): + """Check if the response indicates rate limiting (status code 429)""" + return response.status_code == 429 + + +@retry( + retry=(retry_if_result(is_rate_limited)), + wait=wait_exponential(multiplier=1, min=4, max=60), + stop=stop_after_attempt(5), +) +def make_request(url, headers): + """Make a request with retry logic for rate limiting""" + # Random delay before each request to avoid detection + time.sleep(random.uniform(2, 6)) + response = requests.get(url, headers=headers) + return response + + +def getNewsData(query, start_date, end_date): + """ + Scrape Google News search results for a given query and date range. + query: str - search query + start_date: str - start date in the format yyyy-mm-dd or mm/dd/yyyy + end_date: str - end date in the format yyyy-mm-dd or mm/dd/yyyy + """ + if "-" in start_date: + start_date = datetime.strptime(start_date, "%Y-%m-%d") + start_date = start_date.strftime("%m/%d/%Y") + if "-" in end_date: + end_date = datetime.strptime(end_date, "%Y-%m-%d") + end_date = end_date.strftime("%m/%d/%Y") + + headers = { + "User-Agent": ( + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " + "AppleWebKit/537.36 (KHTML, like Gecko) " + "Chrome/101.0.4951.54 Safari/537.36" + ) + } + + news_results = [] + page = 0 + while True: + offset = page * 10 + url = ( + f"https://www.google.com/search?q={query}" + f"&tbs=cdr:1,cd_min:{start_date},cd_max:{end_date}" + f"&tbm=nws&start={offset}" + ) + + try: + response = make_request(url, headers) + soup = BeautifulSoup(response.content, "html.parser") + results_on_page = soup.select("div.SoaBEf") + + if not results_on_page: + break # No more results found + + for el in results_on_page: + try: + link = el.find("a")["href"] + title = el.select_one("div.MBeuO").get_text() + snippet = el.select_one(".GI74Re").get_text() + date = el.select_one(".LfVVr").get_text() + source = el.select_one(".NUnG9d span").get_text() + news_results.append( + { + "link": link, + "title": title, + "snippet": snippet, + "date": date, + "source": source, + } + ) + except Exception as e: + print(f"Error processing result: {e}") + # If one of the fields is not found, skip this result + continue + + # Update the progress bar with the current count of results scraped + + # Check for the "Next" link (pagination) + next_link = soup.find("a", id="pnnext") + if not next_link: + break + + page += 1 + + except Exception as e: + print(f"Failed after multiple retries: {e}") + break + + return news_results diff --git a/tradingagents/dataflows/interface.py b/tradingagents/dataflows/interface.py index e0c0b700..fa8162c2 100644 --- a/tradingagents/dataflows/interface.py +++ b/tradingagents/dataflows/interface.py @@ -1,804 +1,804 @@ -from typing import Annotated, Dict -from .reddit_utils import fetch_top_from_category -from .yfin_utils import * -from .stockstats_utils import * -from .googlenews_utils import * -from .finnhub_utils import get_data_in_range -from dateutil.relativedelta import relativedelta -from concurrent.futures import ThreadPoolExecutor -from datetime import datetime -import json -import os -import pandas as pd -from tqdm import tqdm -import yfinance as yf -from openai import OpenAI -from .config import get_config, set_config, DATA_DIR - - -def get_finnhub_news( - ticker: Annotated[ - str, - "Search query of a company's, e.g. 'AAPL, TSM, etc.", - ], - curr_date: Annotated[str, "Current date in yyyy-mm-dd format"], - look_back_days: Annotated[int, "how many days to look back"], -): - """ - Retrieve news about a company within a time frame - - Args - ticker (str): ticker for the company you are interested in - start_date (str): Start date in yyyy-mm-dd format - end_date (str): End date in yyyy-mm-dd format - Returns - str: dataframe containing the news of the company in the time frame - - """ - - start_date = datetime.strptime(curr_date, "%Y-%m-%d") - before = start_date - relativedelta(days=look_back_days) - before = before.strftime("%Y-%m-%d") - - result = get_data_in_range(ticker, before, curr_date, "news_data", DATA_DIR) - - if len(result) == 0: - return "" - - combined_result = "" - for day, data in result.items(): - if len(data) == 0: - continue - for entry in data: - current_news = ( - "### " + entry["headline"] + f" ({day})" + "\n" + entry["summary"] - ) - combined_result += current_news + "\n\n" - - return f"## {ticker} News, from {before} to {curr_date}:\n" + str(combined_result) - - -def get_finnhub_company_insider_sentiment( - ticker: Annotated[str, "ticker symbol for the company"], - curr_date: Annotated[ - str, - "current date of you are trading at, yyyy-mm-dd", - ], - look_back_days: Annotated[int, "number of days to look back"], -): - """ - Retrieve insider sentiment about a company (retrieved from public SEC information) for the past 15 days - Args: - ticker (str): ticker symbol of the company - curr_date (str): current date you are trading on, yyyy-mm-dd - Returns: - str: a report of the sentiment in the past 15 days starting at curr_date - """ - - date_obj = datetime.strptime(curr_date, "%Y-%m-%d") - before = date_obj - relativedelta(days=look_back_days) - before = before.strftime("%Y-%m-%d") - - data = get_data_in_range(ticker, before, curr_date, "insider_senti", DATA_DIR) - - if len(data) == 0: - return "" - - result_str = "" - seen_dicts = [] - for date, senti_list in data.items(): - for entry in senti_list: - if entry not in seen_dicts: - result_str += f"### {entry['year']}-{entry['month']}:\nChange: {entry['change']}\nMonthly Share Purchase Ratio: {entry['mspr']}\n\n" - seen_dicts.append(entry) - - return ( - f"## {ticker} Insider Sentiment Data for {before} to {curr_date}:\n" - + result_str - + "The change field refers to the net buying/selling from all insiders' transactions. The mspr field refers to monthly share purchase ratio." - ) - - -def get_finnhub_company_insider_transactions( - ticker: Annotated[str, "ticker symbol"], - curr_date: Annotated[ - str, - "current date you are trading at, yyyy-mm-dd", - ], - look_back_days: Annotated[int, "how many days to look back"], -): - """ - Retrieve insider transcaction information about a company (retrieved from public SEC information) for the past 15 days - Args: - ticker (str): ticker symbol of the company - curr_date (str): current date you are trading at, yyyy-mm-dd - Returns: - str: a report of the company's insider transaction/trading informtaion in the past 15 days - """ - - date_obj = datetime.strptime(curr_date, "%Y-%m-%d") - before = date_obj - relativedelta(days=look_back_days) - before = before.strftime("%Y-%m-%d") - - data = get_data_in_range(ticker, before, curr_date, "insider_trans", DATA_DIR) - - if len(data) == 0: - return "" - - result_str = "" - - seen_dicts = [] - for date, senti_list in data.items(): - for entry in senti_list: - if entry not in seen_dicts: - result_str += f"### Filing Date: {entry['filingDate']}, {entry['name']}:\nChange:{entry['change']}\nShares: {entry['share']}\nTransaction Price: {entry['transactionPrice']}\nTransaction Code: {entry['transactionCode']}\n\n" - seen_dicts.append(entry) - - return ( - f"## {ticker} insider transactions from {before} to {curr_date}:\n" - + result_str - + "The change field reflects the variation in share countโ€”here a negative number indicates a reduction in holdingsโ€”while share specifies the total number of shares involved. The transactionPrice denotes the per-share price at which the trade was executed, and transactionDate marks when the transaction occurred. The name field identifies the insider making the trade, and transactionCode (e.g., S for sale) clarifies the nature of the transaction. FilingDate records when the transaction was officially reported, and the unique id links to the specific SEC filing, as indicated by the source. Additionally, the symbol ties the transaction to a particular company, isDerivative flags whether the trade involves derivative securities, and currency notes the currency context of the transaction." - ) - - -def get_simfin_balance_sheet( - ticker: Annotated[str, "ticker symbol"], - freq: Annotated[ - str, - "reporting frequency of the company's financial history: annual / quarterly", - ], - curr_date: Annotated[str, "current date you are trading at, yyyy-mm-dd"], -): - data_path = os.path.join( - DATA_DIR, - "fundamental_data", - "simfin_data_all", - "balance_sheet", - "companies", - "us", - f"us-balance-{freq}.csv", - ) - df = pd.read_csv(data_path, sep=";") - - # Convert date strings to datetime objects and remove any time components - df["Report Date"] = pd.to_datetime(df["Report Date"], utc=True).dt.normalize() - df["Publish Date"] = pd.to_datetime(df["Publish Date"], utc=True).dt.normalize() - - # Convert the current date to datetime and normalize - curr_date_dt = pd.to_datetime(curr_date, utc=True).normalize() - - # Filter the DataFrame for the given ticker and for reports that were published on or before the current date - filtered_df = df[(df["Ticker"] == ticker) & (df["Publish Date"] <= curr_date_dt)] - - # Check if there are any available reports; if not, return a notification - if filtered_df.empty: - print("No balance sheet available before the given current date.") - return "" - - # Get the most recent balance sheet by selecting the row with the latest Publish Date - latest_balance_sheet = filtered_df.loc[filtered_df["Publish Date"].idxmax()] - - # drop the SimFinID column - latest_balance_sheet = latest_balance_sheet.drop("SimFinId") - - return ( - f"## {freq} balance sheet for {ticker} released on {str(latest_balance_sheet['Publish Date'])[0:10]}: \n" - + str(latest_balance_sheet) - + "\n\nThis includes metadata like reporting dates and currency, share details, and a breakdown of assets, liabilities, and equity. Assets are grouped as current (liquid items like cash and receivables) and noncurrent (long-term investments and property). Liabilities are split between short-term obligations and long-term debts, while equity reflects shareholder funds such as paid-in capital and retained earnings. Together, these components ensure that total assets equal the sum of liabilities and equity." - ) - - -def get_simfin_cashflow( - ticker: Annotated[str, "ticker symbol"], - freq: Annotated[ - str, - "reporting frequency of the company's financial history: annual / quarterly", - ], - curr_date: Annotated[str, "current date you are trading at, yyyy-mm-dd"], -): - data_path = os.path.join( - DATA_DIR, - "fundamental_data", - "simfin_data_all", - "cash_flow", - "companies", - "us", - f"us-cashflow-{freq}.csv", - ) - df = pd.read_csv(data_path, sep=";") - - # Convert date strings to datetime objects and remove any time components - df["Report Date"] = pd.to_datetime(df["Report Date"], utc=True).dt.normalize() - df["Publish Date"] = pd.to_datetime(df["Publish Date"], utc=True).dt.normalize() - - # Convert the current date to datetime and normalize - curr_date_dt = pd.to_datetime(curr_date, utc=True).normalize() - - # Filter the DataFrame for the given ticker and for reports that were published on or before the current date - filtered_df = df[(df["Ticker"] == ticker) & (df["Publish Date"] <= curr_date_dt)] - - # Check if there are any available reports; if not, return a notification - if filtered_df.empty: - print("No cash flow statement available before the given current date.") - return "" - - # Get the most recent cash flow statement by selecting the row with the latest Publish Date - latest_cash_flow = filtered_df.loc[filtered_df["Publish Date"].idxmax()] - - # drop the SimFinID column - latest_cash_flow = latest_cash_flow.drop("SimFinId") - - return ( - f"## {freq} cash flow statement for {ticker} released on {str(latest_cash_flow['Publish Date'])[0:10]}: \n" - + str(latest_cash_flow) - + "\n\nThis includes metadata like reporting dates and currency, share details, and a breakdown of cash movements. Operating activities show cash generated from core business operations, including net income adjustments for non-cash items and working capital changes. Investing activities cover asset acquisitions/disposals and investments. Financing activities include debt transactions, equity issuances/repurchases, and dividend payments. The net change in cash represents the overall increase or decrease in the company's cash position during the reporting period." - ) - - -def get_simfin_income_statements( - ticker: Annotated[str, "ticker symbol"], - freq: Annotated[ - str, - "reporting frequency of the company's financial history: annual / quarterly", - ], - curr_date: Annotated[str, "current date you are trading at, yyyy-mm-dd"], -): - data_path = os.path.join( - DATA_DIR, - "fundamental_data", - "simfin_data_all", - "income_statements", - "companies", - "us", - f"us-income-{freq}.csv", - ) - df = pd.read_csv(data_path, sep=";") - - # Convert date strings to datetime objects and remove any time components - df["Report Date"] = pd.to_datetime(df["Report Date"], utc=True).dt.normalize() - df["Publish Date"] = pd.to_datetime(df["Publish Date"], utc=True).dt.normalize() - - # Convert the current date to datetime and normalize - curr_date_dt = pd.to_datetime(curr_date, utc=True).normalize() - - # Filter the DataFrame for the given ticker and for reports that were published on or before the current date - filtered_df = df[(df["Ticker"] == ticker) & (df["Publish Date"] <= curr_date_dt)] - - # Check if there are any available reports; if not, return a notification - if filtered_df.empty: - print("No income statement available before the given current date.") - return "" - - # Get the most recent income statement by selecting the row with the latest Publish Date - latest_income = filtered_df.loc[filtered_df["Publish Date"].idxmax()] - - # drop the SimFinID column - latest_income = latest_income.drop("SimFinId") - - return ( - f"## {freq} income statement for {ticker} released on {str(latest_income['Publish Date'])[0:10]}: \n" - + str(latest_income) - + "\n\nThis includes metadata like reporting dates and currency, share details, and a comprehensive breakdown of the company's financial performance. Starting with Revenue, it shows Cost of Revenue and resulting Gross Profit. Operating Expenses are detailed, including SG&A, R&D, and Depreciation. The statement then shows Operating Income, followed by non-operating items and Interest Expense, leading to Pretax Income. After accounting for Income Tax and any Extraordinary items, it concludes with Net Income, representing the company's bottom-line profit or loss for the period." - ) - - -def get_google_news( - query: Annotated[str, "Query to search with"], - curr_date: Annotated[str, "Curr date in yyyy-mm-dd format"], - look_back_days: Annotated[int, "how many days to look back"], -) -> str: - query = query.replace(" ", "+") - - start_date = datetime.strptime(curr_date, "%Y-%m-%d") - before = start_date - relativedelta(days=look_back_days) - before = before.strftime("%Y-%m-%d") - - news_results = getNewsData(query, before, curr_date) - - news_str = "" - - for news in news_results: - news_str += ( - f"### {news['title']} (source: {news['source']}) \n\n{news['snippet']}\n\n" - ) - - if len(news_results) == 0: - return "" - - return f"## {query} Google News, from {before} to {curr_date}:\n\n{news_str}" - - -def get_reddit_global_news( - start_date: Annotated[str, "Start date in yyyy-mm-dd format"], - look_back_days: Annotated[int, "how many days to look back"], - max_limit_per_day: Annotated[int, "Maximum number of news per day"], -) -> str: - """ - Retrieve the latest top reddit news - Args: - start_date: Start date in yyyy-mm-dd format - end_date: End date in yyyy-mm-dd format - Returns: - str: A formatted dataframe containing the latest news articles posts on reddit and meta information in these columns: "created_utc", "id", "title", "selftext", "score", "num_comments", "url" - """ - - start_date = datetime.strptime(start_date, "%Y-%m-%d") - before = start_date - relativedelta(days=look_back_days) - before = before.strftime("%Y-%m-%d") - - posts = [] - # iterate from start_date to end_date - curr_date = datetime.strptime(before, "%Y-%m-%d") - - total_iterations = (start_date - curr_date).days + 1 - pbar = tqdm(desc=f"Getting Global News on {start_date}", total=total_iterations) - - while curr_date <= start_date: - curr_date_str = curr_date.strftime("%Y-%m-%d") - fetch_result = fetch_top_from_category( - "global_news", - curr_date_str, - max_limit_per_day, - data_path=os.path.join(DATA_DIR, "reddit_data"), - ) - posts.extend(fetch_result) - curr_date += relativedelta(days=1) - pbar.update(1) - - pbar.close() - - if len(posts) == 0: - return "" - - news_str = "" - for post in posts: - if post["content"] == "": - news_str += f"### {post['title']}\n\n" - else: - news_str += f"### {post['title']}\n\n{post['content']}\n\n" - - return f"## Global News Reddit, from {before} to {curr_date}:\n{news_str}" - - -def get_reddit_company_news( - ticker: Annotated[str, "ticker symbol of the company"], - start_date: Annotated[str, "Start date in yyyy-mm-dd format"], - look_back_days: Annotated[int, "how many days to look back"], - max_limit_per_day: Annotated[int, "Maximum number of news per day"], -) -> str: - """ - Retrieve the latest top reddit news - Args: - ticker: ticker symbol of the company - start_date: Start date in yyyy-mm-dd format - end_date: End date in yyyy-mm-dd format - Returns: - str: A formatted dataframe containing the latest news articles posts on reddit and meta information in these columns: "created_utc", "id", "title", "selftext", "score", "num_comments", "url" - """ - - start_date = datetime.strptime(start_date, "%Y-%m-%d") - before = start_date - relativedelta(days=look_back_days) - before = before.strftime("%Y-%m-%d") - - posts = [] - # iterate from start_date to end_date - curr_date = datetime.strptime(before, "%Y-%m-%d") - - total_iterations = (start_date - curr_date).days + 1 - pbar = tqdm( - desc=f"Getting Company News for {ticker} on {start_date}", - total=total_iterations, - ) - - while curr_date <= start_date: - curr_date_str = curr_date.strftime("%Y-%m-%d") - fetch_result = fetch_top_from_category( - "company_news", - curr_date_str, - max_limit_per_day, - ticker, - data_path=os.path.join(DATA_DIR, "reddit_data"), - ) - posts.extend(fetch_result) - curr_date += relativedelta(days=1) - - pbar.update(1) - - pbar.close() - - if len(posts) == 0: - return "" - - news_str = "" - for post in posts: - if post["content"] == "": - news_str += f"### {post['title']}\n\n" - else: - news_str += f"### {post['title']}\n\n{post['content']}\n\n" - - return f"##{ticker} News Reddit, from {before} to {curr_date}:\n\n{news_str}" - - -def get_stock_stats_indicators_window( - symbol: Annotated[str, "ticker symbol of the company"], - indicator: Annotated[str, "technical indicator to get the analysis and report of"], - curr_date: Annotated[ - str, "The current trading date you are trading on, YYYY-mm-dd" - ], - look_back_days: Annotated[int, "how many days to look back"], - online: Annotated[bool, "to fetch data online or offline"], -) -> str: - - best_ind_params = { - # Moving Averages - "close_50_sma": ( - "50 SMA: A medium-term trend indicator. " - "Usage: Identify trend direction and serve as dynamic support/resistance. " - "Tips: It lags price; combine with faster indicators for timely signals." - ), - "close_200_sma": ( - "200 SMA: A long-term trend benchmark. " - "Usage: Confirm overall market trend and identify golden/death cross setups. " - "Tips: It reacts slowly; best for strategic trend confirmation rather than frequent trading entries." - ), - "close_10_ema": ( - "10 EMA: A responsive short-term average. " - "Usage: Capture quick shifts in momentum and potential entry points. " - "Tips: Prone to noise in choppy markets; use alongside longer averages for filtering false signals." - ), - # MACD Related - "macd": ( - "MACD: Computes momentum via differences of EMAs. " - "Usage: Look for crossovers and divergence as signals of trend changes. " - "Tips: Confirm with other indicators in low-volatility or sideways markets." - ), - "macds": ( - "MACD Signal: An EMA smoothing of the MACD line. " - "Usage: Use crossovers with the MACD line to trigger trades. " - "Tips: Should be part of a broader strategy to avoid false positives." - ), - "macdh": ( - "MACD Histogram: Shows the gap between the MACD line and its signal. " - "Usage: Visualize momentum strength and spot divergence early. " - "Tips: Can be volatile; complement with additional filters in fast-moving markets." - ), - # Momentum Indicators - "rsi": ( - "RSI: Measures momentum to flag overbought/oversold conditions. " - "Usage: Apply 70/30 thresholds and watch for divergence to signal reversals. " - "Tips: In strong trends, RSI may remain extreme; always cross-check with trend analysis." - ), - # Volatility Indicators - "boll": ( - "Bollinger Middle: A 20 SMA serving as the basis for Bollinger Bands. " - "Usage: Acts as a dynamic benchmark for price movement. " - "Tips: Combine with the upper and lower bands to effectively spot breakouts or reversals." - ), - "boll_ub": ( - "Bollinger Upper Band: Typically 2 standard deviations above the middle line. " - "Usage: Signals potential overbought conditions and breakout zones. " - "Tips: Confirm signals with other tools; prices may ride the band in strong trends." - ), - "boll_lb": ( - "Bollinger Lower Band: Typically 2 standard deviations below the middle line. " - "Usage: Indicates potential oversold conditions. " - "Tips: Use additional analysis to avoid false reversal signals." - ), - "atr": ( - "ATR: Averages true range to measure volatility. " - "Usage: Set stop-loss levels and adjust position sizes based on current market volatility. " - "Tips: It's a reactive measure, so use it as part of a broader risk management strategy." - ), - # Volume-Based Indicators - "vwma": ( - "VWMA: A moving average weighted by volume. " - "Usage: Confirm trends by integrating price action with volume data. " - "Tips: Watch for skewed results from volume spikes; use in combination with other volume analyses." - ), - "mfi": ( - "MFI: The Money Flow Index is a momentum indicator that uses both price and volume to measure buying and selling pressure. " - "Usage: Identify overbought (>80) or oversold (<20) conditions and confirm the strength of trends or reversals. " - "Tips: Use alongside RSI or MACD to confirm signals; divergence between price and MFI can indicate potential reversals." - ), - } - - if indicator not in best_ind_params: - raise ValueError( - f"Indicator {indicator} is not supported. Please choose from: {list(best_ind_params.keys())}" - ) - - end_date = curr_date - curr_date = datetime.strptime(curr_date, "%Y-%m-%d") - before = curr_date - relativedelta(days=look_back_days) - - if not online: - # read from YFin data - data = pd.read_csv( - os.path.join( - DATA_DIR, - f"market_data/price_data/{symbol}-YFin-data-2015-01-01-2025-03-25.csv", - ) - ) - data["Date"] = pd.to_datetime(data["Date"], utc=True) - dates_in_df = data["Date"].astype(str).str[:10] - - ind_string = "" - while curr_date >= before: - # only do the trading dates - if curr_date.strftime("%Y-%m-%d") in dates_in_df.values: - indicator_value = get_stockstats_indicator( - symbol, indicator, curr_date.strftime("%Y-%m-%d"), online - ) - - ind_string += f"{curr_date.strftime('%Y-%m-%d')}: {indicator_value}\n" - - curr_date = curr_date - relativedelta(days=1) - else: - # online gathering - ind_string = "" - while curr_date >= before: - indicator_value = get_stockstats_indicator( - symbol, indicator, curr_date.strftime("%Y-%m-%d"), online - ) - - ind_string += f"{curr_date.strftime('%Y-%m-%d')}: {indicator_value}\n" - - curr_date = curr_date - relativedelta(days=1) - - result_str = ( - f"## {indicator} values from {before.strftime('%Y-%m-%d')} to {end_date}:\n\n" - + ind_string - + "\n\n" - + best_ind_params.get(indicator, "No description available.") - ) - - return result_str - - -def get_stockstats_indicator( - symbol: Annotated[str, "ticker symbol of the company"], - indicator: Annotated[str, "technical indicator to get the analysis and report of"], - curr_date: Annotated[ - str, "The current trading date you are trading on, YYYY-mm-dd" - ], - online: Annotated[bool, "to fetch data online or offline"], -) -> str: - - curr_date = datetime.strptime(curr_date, "%Y-%m-%d") - curr_date = curr_date.strftime("%Y-%m-%d") - - try: - indicator_value = StockstatsUtils.get_stock_stats( - symbol, - indicator, - curr_date, - os.path.join(DATA_DIR, "market_data", "price_data"), - online=online, - ) - except Exception as e: - print( - f"Error getting stockstats indicator data for indicator {indicator} on {curr_date}: {e}" - ) - return "" - - return str(indicator_value) - - -def get_YFin_data_window( - symbol: Annotated[str, "ticker symbol of the company"], - curr_date: Annotated[str, "Start date in yyyy-mm-dd format"], - look_back_days: Annotated[int, "how many days to look back"], -) -> str: - # calculate past days - date_obj = datetime.strptime(curr_date, "%Y-%m-%d") - before = date_obj - relativedelta(days=look_back_days) - start_date = before.strftime("%Y-%m-%d") - - # read in data - data = pd.read_csv( - os.path.join( - DATA_DIR, - f"market_data/price_data/{symbol}-YFin-data-2015-01-01-2025-03-25.csv", - ) - ) - - # Extract just the date part for comparison - data["DateOnly"] = data["Date"].str[:10] - - # Filter data between the start and end dates (inclusive) - filtered_data = data[ - (data["DateOnly"] >= start_date) & (data["DateOnly"] <= curr_date) - ] - - # Drop the temporary column we created - filtered_data = filtered_data.drop("DateOnly", axis=1) - - # Set pandas display options to show the full DataFrame - with pd.option_context( - "display.max_rows", None, "display.max_columns", None, "display.width", None - ): - df_string = filtered_data.to_string() - - return ( - f"## Raw Market Data for {symbol} from {start_date} to {curr_date}:\n\n" - + df_string - ) - - -def get_YFin_data_online( - symbol: Annotated[str, "ticker symbol of the company"], - start_date: Annotated[str, "Start date in yyyy-mm-dd format"], - end_date: Annotated[str, "Start date in yyyy-mm-dd format"], -): - - datetime.strptime(start_date, "%Y-%m-%d") - datetime.strptime(end_date, "%Y-%m-%d") - - # Create ticker object - ticker = yf.Ticker(symbol.upper()) - - # Fetch historical data for the specified date range - data = ticker.history(start=start_date, end=end_date) - - # Check if data is empty - if data.empty: - return ( - f"No data found for symbol '{symbol}' between {start_date} and {end_date}" - ) - - # Remove timezone info from index for cleaner output - if data.index.tz is not None: - data.index = data.index.tz_localize(None) - - # Round numerical values to 2 decimal places for cleaner display - numeric_columns = ["Open", "High", "Low", "Close", "Adj Close"] - for col in numeric_columns: - if col in data.columns: - data[col] = data[col].round(2) - - # Convert DataFrame to CSV string - csv_string = data.to_csv() - - # Add header information - header = f"# Stock data for {symbol.upper()} from {start_date} to {end_date}\n" - header += f"# Total records: {len(data)}\n" - header += f"# Data retrieved on: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n\n" - - return header + csv_string - - -def get_YFin_data( - symbol: Annotated[str, "ticker symbol of the company"], - start_date: Annotated[str, "Start date in yyyy-mm-dd format"], - end_date: Annotated[str, "Start date in yyyy-mm-dd format"], -) -> str: - # read in data - data = pd.read_csv( - os.path.join( - DATA_DIR, - f"market_data/price_data/{symbol}-YFin-data-2015-01-01-2025-03-25.csv", - ) - ) - - if end_date > "2025-03-25": - raise Exception( - f"Get_YFin_Data: {end_date} is outside of the data range of 2015-01-01 to 2025-03-25" - ) - - # Extract just the date part for comparison - data["DateOnly"] = data["Date"].str[:10] - - # Filter data between the start and end dates (inclusive) - filtered_data = data[ - (data["DateOnly"] >= start_date) & (data["DateOnly"] <= end_date) - ] - - # Drop the temporary column we created - filtered_data = filtered_data.drop("DateOnly", axis=1) - - # remove the index from the dataframe - filtered_data = filtered_data.reset_index(drop=True) - - return filtered_data - - -def get_stock_news_openai(ticker, curr_date): - client = OpenAI() - - response = client.responses.create( - model="gpt-4.1-mini", - input=[ - { - "role": "system", - "content": [ - { - "type": "input_text", - "text": f"Can you search Social Media for {ticker} from 7 days before {curr_date} to {curr_date}? Make sure you only get the data posted during that period.", - } - ], - } - ], - text={"format": {"type": "text"}}, - reasoning={}, - tools=[ - { - "type": "web_search_preview", - "user_location": {"type": "approximate"}, - "search_context_size": "low", - } - ], - temperature=1, - max_output_tokens=4096, - top_p=1, - store=True, - ) - - return response.output[1].content[0].text - - -def get_global_news_openai(curr_date): - client = OpenAI() - - response = client.responses.create( - model="gpt-4.1-mini", - input=[ - { - "role": "system", - "content": [ - { - "type": "input_text", - "text": f"Can you search global or macroeconomics news from 7 days before {curr_date} to {curr_date} that would be informative for trading purposes? Make sure you only get the data posted during that period.", - } - ], - } - ], - text={"format": {"type": "text"}}, - reasoning={}, - tools=[ - { - "type": "web_search_preview", - "user_location": {"type": "approximate"}, - "search_context_size": "low", - } - ], - temperature=1, - max_output_tokens=4096, - top_p=1, - store=True, - ) - - return response.output[1].content[0].text - - -def get_fundamentals_openai(ticker, curr_date): - client = OpenAI() - - response = client.responses.create( - model="gpt-4.1-mini", - input=[ - { - "role": "system", - "content": [ - { - "type": "input_text", - "text": f"Can you search Fundamental for discussions on {ticker} during of the month before {curr_date} to the month of {curr_date}. Make sure you only get the data posted during that period. List as a table, with PE/PS/Cash flow/ etc", - } - ], - } - ], - text={"format": {"type": "text"}}, - reasoning={}, - tools=[ - { - "type": "web_search_preview", - "user_location": {"type": "approximate"}, - "search_context_size": "low", - } - ], - temperature=1, - max_output_tokens=4096, - top_p=1, - store=True, - ) - - return response.output[1].content[0].text +from typing import Annotated, Dict +from .reddit_utils import fetch_top_from_category +from .yfin_utils import * +from .stockstats_utils import * +from .googlenews_utils import * +from .finnhub_utils import get_data_in_range +from dateutil.relativedelta import relativedelta +from concurrent.futures import ThreadPoolExecutor +from datetime import datetime +import json +import os +import pandas as pd +from tqdm import tqdm +import yfinance as yf +from openai import OpenAI +from .config import get_config, set_config, DATA_DIR + + +def get_finnhub_news( + ticker: Annotated[ + str, + "Search query of a company's, e.g. 'AAPL, TSM, etc.", + ], + curr_date: Annotated[str, "Current date in yyyy-mm-dd format"], + look_back_days: Annotated[int, "how many days to look back"], +): + """ + Retrieve news about a company within a time frame + + Args + ticker (str): ticker for the company you are interested in + start_date (str): Start date in yyyy-mm-dd format + end_date (str): End date in yyyy-mm-dd format + Returns + str: dataframe containing the news of the company in the time frame + + """ + + start_date = datetime.strptime(curr_date, "%Y-%m-%d") + before = start_date - relativedelta(days=look_back_days) + before = before.strftime("%Y-%m-%d") + + result = get_data_in_range(ticker, before, curr_date, "news_data", DATA_DIR) + + if len(result) == 0: + return "" + + combined_result = "" + for day, data in result.items(): + if len(data) == 0: + continue + for entry in data: + current_news = ( + "### " + entry["headline"] + f" ({day})" + "\n" + entry["summary"] + ) + combined_result += current_news + "\n\n" + + return f"## {ticker} News, from {before} to {curr_date}:\n" + str(combined_result) + + +def get_finnhub_company_insider_sentiment( + ticker: Annotated[str, "ticker symbol for the company"], + curr_date: Annotated[ + str, + "current date of you are trading at, yyyy-mm-dd", + ], + look_back_days: Annotated[int, "number of days to look back"], +): + """ + Retrieve insider sentiment about a company (retrieved from public SEC information) for the past 15 days + Args: + ticker (str): ticker symbol of the company + curr_date (str): current date you are trading on, yyyy-mm-dd + Returns: + str: a report of the sentiment in the past 15 days starting at curr_date + """ + + date_obj = datetime.strptime(curr_date, "%Y-%m-%d") + before = date_obj - relativedelta(days=look_back_days) + before = before.strftime("%Y-%m-%d") + + data = get_data_in_range(ticker, before, curr_date, "insider_senti", DATA_DIR) + + if len(data) == 0: + return "" + + result_str = "" + seen_dicts = [] + for date, senti_list in data.items(): + for entry in senti_list: + if entry not in seen_dicts: + result_str += f"### {entry['year']}-{entry['month']}:\nChange: {entry['change']}\nMonthly Share Purchase Ratio: {entry['mspr']}\n\n" + seen_dicts.append(entry) + + return ( + f"## {ticker} Insider Sentiment Data for {before} to {curr_date}:\n" + + result_str + + "The change field refers to the net buying/selling from all insiders' transactions. The mspr field refers to monthly share purchase ratio." + ) + + +def get_finnhub_company_insider_transactions( + ticker: Annotated[str, "ticker symbol"], + curr_date: Annotated[ + str, + "current date you are trading at, yyyy-mm-dd", + ], + look_back_days: Annotated[int, "how many days to look back"], +): + """ + Retrieve insider transcaction information about a company (retrieved from public SEC information) for the past 15 days + Args: + ticker (str): ticker symbol of the company + curr_date (str): current date you are trading at, yyyy-mm-dd + Returns: + str: a report of the company's insider transaction/trading informtaion in the past 15 days + """ + + date_obj = datetime.strptime(curr_date, "%Y-%m-%d") + before = date_obj - relativedelta(days=look_back_days) + before = before.strftime("%Y-%m-%d") + + data = get_data_in_range(ticker, before, curr_date, "insider_trans", DATA_DIR) + + if len(data) == 0: + return "" + + result_str = "" + + seen_dicts = [] + for date, senti_list in data.items(): + for entry in senti_list: + if entry not in seen_dicts: + result_str += f"### Filing Date: {entry['filingDate']}, {entry['name']}:\nChange:{entry['change']}\nShares: {entry['share']}\nTransaction Price: {entry['transactionPrice']}\nTransaction Code: {entry['transactionCode']}\n\n" + seen_dicts.append(entry) + + return ( + f"## {ticker} insider transactions from {before} to {curr_date}:\n" + + result_str + + "The change field reflects the variation in share countโ€”here a negative number indicates a reduction in holdingsโ€”while share specifies the total number of shares involved. The transactionPrice denotes the per-share price at which the trade was executed, and transactionDate marks when the transaction occurred. The name field identifies the insider making the trade, and transactionCode (e.g., S for sale) clarifies the nature of the transaction. FilingDate records when the transaction was officially reported, and the unique id links to the specific SEC filing, as indicated by the source. Additionally, the symbol ties the transaction to a particular company, isDerivative flags whether the trade involves derivative securities, and currency notes the currency context of the transaction." + ) + + +def get_simfin_balance_sheet( + ticker: Annotated[str, "ticker symbol"], + freq: Annotated[ + str, + "reporting frequency of the company's financial history: annual / quarterly", + ], + curr_date: Annotated[str, "current date you are trading at, yyyy-mm-dd"], +): + data_path = os.path.join( + DATA_DIR, + "fundamental_data", + "simfin_data_all", + "balance_sheet", + "companies", + "us", + f"us-balance-{freq}.csv", + ) + df = pd.read_csv(data_path, sep=";") + + # Convert date strings to datetime objects and remove any time components + df["Report Date"] = pd.to_datetime(df["Report Date"], utc=True).dt.normalize() + df["Publish Date"] = pd.to_datetime(df["Publish Date"], utc=True).dt.normalize() + + # Convert the current date to datetime and normalize + curr_date_dt = pd.to_datetime(curr_date, utc=True).normalize() + + # Filter the DataFrame for the given ticker and for reports that were published on or before the current date + filtered_df = df[(df["Ticker"] == ticker) & (df["Publish Date"] <= curr_date_dt)] + + # Check if there are any available reports; if not, return a notification + if filtered_df.empty: + print("No balance sheet available before the given current date.") + return "" + + # Get the most recent balance sheet by selecting the row with the latest Publish Date + latest_balance_sheet = filtered_df.loc[filtered_df["Publish Date"].idxmax()] + + # drop the SimFinID column + latest_balance_sheet = latest_balance_sheet.drop("SimFinId") + + return ( + f"## {freq} balance sheet for {ticker} released on {str(latest_balance_sheet['Publish Date'])[0:10]}: \n" + + str(latest_balance_sheet) + + "\n\nThis includes metadata like reporting dates and currency, share details, and a breakdown of assets, liabilities, and equity. Assets are grouped as current (liquid items like cash and receivables) and noncurrent (long-term investments and property). Liabilities are split between short-term obligations and long-term debts, while equity reflects shareholder funds such as paid-in capital and retained earnings. Together, these components ensure that total assets equal the sum of liabilities and equity." + ) + + +def get_simfin_cashflow( + ticker: Annotated[str, "ticker symbol"], + freq: Annotated[ + str, + "reporting frequency of the company's financial history: annual / quarterly", + ], + curr_date: Annotated[str, "current date you are trading at, yyyy-mm-dd"], +): + data_path = os.path.join( + DATA_DIR, + "fundamental_data", + "simfin_data_all", + "cash_flow", + "companies", + "us", + f"us-cashflow-{freq}.csv", + ) + df = pd.read_csv(data_path, sep=";") + + # Convert date strings to datetime objects and remove any time components + df["Report Date"] = pd.to_datetime(df["Report Date"], utc=True).dt.normalize() + df["Publish Date"] = pd.to_datetime(df["Publish Date"], utc=True).dt.normalize() + + # Convert the current date to datetime and normalize + curr_date_dt = pd.to_datetime(curr_date, utc=True).normalize() + + # Filter the DataFrame for the given ticker and for reports that were published on or before the current date + filtered_df = df[(df["Ticker"] == ticker) & (df["Publish Date"] <= curr_date_dt)] + + # Check if there are any available reports; if not, return a notification + if filtered_df.empty: + print("No cash flow statement available before the given current date.") + return "" + + # Get the most recent cash flow statement by selecting the row with the latest Publish Date + latest_cash_flow = filtered_df.loc[filtered_df["Publish Date"].idxmax()] + + # drop the SimFinID column + latest_cash_flow = latest_cash_flow.drop("SimFinId") + + return ( + f"## {freq} cash flow statement for {ticker} released on {str(latest_cash_flow['Publish Date'])[0:10]}: \n" + + str(latest_cash_flow) + + "\n\nThis includes metadata like reporting dates and currency, share details, and a breakdown of cash movements. Operating activities show cash generated from core business operations, including net income adjustments for non-cash items and working capital changes. Investing activities cover asset acquisitions/disposals and investments. Financing activities include debt transactions, equity issuances/repurchases, and dividend payments. The net change in cash represents the overall increase or decrease in the company's cash position during the reporting period." + ) + + +def get_simfin_income_statements( + ticker: Annotated[str, "ticker symbol"], + freq: Annotated[ + str, + "reporting frequency of the company's financial history: annual / quarterly", + ], + curr_date: Annotated[str, "current date you are trading at, yyyy-mm-dd"], +): + data_path = os.path.join( + DATA_DIR, + "fundamental_data", + "simfin_data_all", + "income_statements", + "companies", + "us", + f"us-income-{freq}.csv", + ) + df = pd.read_csv(data_path, sep=";") + + # Convert date strings to datetime objects and remove any time components + df["Report Date"] = pd.to_datetime(df["Report Date"], utc=True).dt.normalize() + df["Publish Date"] = pd.to_datetime(df["Publish Date"], utc=True).dt.normalize() + + # Convert the current date to datetime and normalize + curr_date_dt = pd.to_datetime(curr_date, utc=True).normalize() + + # Filter the DataFrame for the given ticker and for reports that were published on or before the current date + filtered_df = df[(df["Ticker"] == ticker) & (df["Publish Date"] <= curr_date_dt)] + + # Check if there are any available reports; if not, return a notification + if filtered_df.empty: + print("No income statement available before the given current date.") + return "" + + # Get the most recent income statement by selecting the row with the latest Publish Date + latest_income = filtered_df.loc[filtered_df["Publish Date"].idxmax()] + + # drop the SimFinID column + latest_income = latest_income.drop("SimFinId") + + return ( + f"## {freq} income statement for {ticker} released on {str(latest_income['Publish Date'])[0:10]}: \n" + + str(latest_income) + + "\n\nThis includes metadata like reporting dates and currency, share details, and a comprehensive breakdown of the company's financial performance. Starting with Revenue, it shows Cost of Revenue and resulting Gross Profit. Operating Expenses are detailed, including SG&A, R&D, and Depreciation. The statement then shows Operating Income, followed by non-operating items and Interest Expense, leading to Pretax Income. After accounting for Income Tax and any Extraordinary items, it concludes with Net Income, representing the company's bottom-line profit or loss for the period." + ) + + +def get_google_news( + query: Annotated[str, "Query to search with"], + curr_date: Annotated[str, "Curr date in yyyy-mm-dd format"], + look_back_days: Annotated[int, "how many days to look back"], +) -> str: + query = query.replace(" ", "+") + + start_date = datetime.strptime(curr_date, "%Y-%m-%d") + before = start_date - relativedelta(days=look_back_days) + before = before.strftime("%Y-%m-%d") + + news_results = getNewsData(query, before, curr_date) + + news_str = "" + + for news in news_results: + news_str += ( + f"### {news['title']} (source: {news['source']}) \n\n{news['snippet']}\n\n" + ) + + if len(news_results) == 0: + return "" + + return f"## {query} Google News, from {before} to {curr_date}:\n\n{news_str}" + + +def get_reddit_global_news( + start_date: Annotated[str, "Start date in yyyy-mm-dd format"], + look_back_days: Annotated[int, "how many days to look back"], + max_limit_per_day: Annotated[int, "Maximum number of news per day"], +) -> str: + """ + Retrieve the latest top reddit news + Args: + start_date: Start date in yyyy-mm-dd format + end_date: End date in yyyy-mm-dd format + Returns: + str: A formatted dataframe containing the latest news articles posts on reddit and meta information in these columns: "created_utc", "id", "title", "selftext", "score", "num_comments", "url" + """ + + start_date = datetime.strptime(start_date, "%Y-%m-%d") + before = start_date - relativedelta(days=look_back_days) + before = before.strftime("%Y-%m-%d") + + posts = [] + # iterate from start_date to end_date + curr_date = datetime.strptime(before, "%Y-%m-%d") + + total_iterations = (start_date - curr_date).days + 1 + pbar = tqdm(desc=f"Getting Global News on {start_date}", total=total_iterations) + + while curr_date <= start_date: + curr_date_str = curr_date.strftime("%Y-%m-%d") + fetch_result = fetch_top_from_category( + "global_news", + curr_date_str, + max_limit_per_day, + data_path=os.path.join(DATA_DIR, "reddit_data"), + ) + posts.extend(fetch_result) + curr_date += relativedelta(days=1) + pbar.update(1) + + pbar.close() + + if len(posts) == 0: + return "" + + news_str = "" + for post in posts: + if post["content"] == "": + news_str += f"### {post['title']}\n\n" + else: + news_str += f"### {post['title']}\n\n{post['content']}\n\n" + + return f"## Global News Reddit, from {before} to {curr_date}:\n{news_str}" + + +def get_reddit_company_news( + ticker: Annotated[str, "ticker symbol of the company"], + start_date: Annotated[str, "Start date in yyyy-mm-dd format"], + look_back_days: Annotated[int, "how many days to look back"], + max_limit_per_day: Annotated[int, "Maximum number of news per day"], +) -> str: + """ + Retrieve the latest top reddit news + Args: + ticker: ticker symbol of the company + start_date: Start date in yyyy-mm-dd format + end_date: End date in yyyy-mm-dd format + Returns: + str: A formatted dataframe containing the latest news articles posts on reddit and meta information in these columns: "created_utc", "id", "title", "selftext", "score", "num_comments", "url" + """ + + start_date = datetime.strptime(start_date, "%Y-%m-%d") + before = start_date - relativedelta(days=look_back_days) + before = before.strftime("%Y-%m-%d") + + posts = [] + # iterate from start_date to end_date + curr_date = datetime.strptime(before, "%Y-%m-%d") + + total_iterations = (start_date - curr_date).days + 1 + pbar = tqdm( + desc=f"Getting Company News for {ticker} on {start_date}", + total=total_iterations, + ) + + while curr_date <= start_date: + curr_date_str = curr_date.strftime("%Y-%m-%d") + fetch_result = fetch_top_from_category( + "company_news", + curr_date_str, + max_limit_per_day, + ticker, + data_path=os.path.join(DATA_DIR, "reddit_data"), + ) + posts.extend(fetch_result) + curr_date += relativedelta(days=1) + + pbar.update(1) + + pbar.close() + + if len(posts) == 0: + return "" + + news_str = "" + for post in posts: + if post["content"] == "": + news_str += f"### {post['title']}\n\n" + else: + news_str += f"### {post['title']}\n\n{post['content']}\n\n" + + return f"##{ticker} News Reddit, from {before} to {curr_date}:\n\n{news_str}" + + +def get_stock_stats_indicators_window( + symbol: Annotated[str, "ticker symbol of the company"], + indicator: Annotated[str, "technical indicator to get the analysis and report of"], + curr_date: Annotated[ + str, "The current trading date you are trading on, YYYY-mm-dd" + ], + look_back_days: Annotated[int, "how many days to look back"], + online: Annotated[bool, "to fetch data online or offline"], +) -> str: + + best_ind_params = { + # Moving Averages + "close_50_sma": ( + "50 SMA: A medium-term trend indicator. " + "Usage: Identify trend direction and serve as dynamic support/resistance. " + "Tips: It lags price; combine with faster indicators for timely signals." + ), + "close_200_sma": ( + "200 SMA: A long-term trend benchmark. " + "Usage: Confirm overall market trend and identify golden/death cross setups. " + "Tips: It reacts slowly; best for strategic trend confirmation rather than frequent trading entries." + ), + "close_10_ema": ( + "10 EMA: A responsive short-term average. " + "Usage: Capture quick shifts in momentum and potential entry points. " + "Tips: Prone to noise in choppy markets; use alongside longer averages for filtering false signals." + ), + # MACD Related + "macd": ( + "MACD: Computes momentum via differences of EMAs. " + "Usage: Look for crossovers and divergence as signals of trend changes. " + "Tips: Confirm with other indicators in low-volatility or sideways markets." + ), + "macds": ( + "MACD Signal: An EMA smoothing of the MACD line. " + "Usage: Use crossovers with the MACD line to trigger trades. " + "Tips: Should be part of a broader strategy to avoid false positives." + ), + "macdh": ( + "MACD Histogram: Shows the gap between the MACD line and its signal. " + "Usage: Visualize momentum strength and spot divergence early. " + "Tips: Can be volatile; complement with additional filters in fast-moving markets." + ), + # Momentum Indicators + "rsi": ( + "RSI: Measures momentum to flag overbought/oversold conditions. " + "Usage: Apply 70/30 thresholds and watch for divergence to signal reversals. " + "Tips: In strong trends, RSI may remain extreme; always cross-check with trend analysis." + ), + # Volatility Indicators + "boll": ( + "Bollinger Middle: A 20 SMA serving as the basis for Bollinger Bands. " + "Usage: Acts as a dynamic benchmark for price movement. " + "Tips: Combine with the upper and lower bands to effectively spot breakouts or reversals." + ), + "boll_ub": ( + "Bollinger Upper Band: Typically 2 standard deviations above the middle line. " + "Usage: Signals potential overbought conditions and breakout zones. " + "Tips: Confirm signals with other tools; prices may ride the band in strong trends." + ), + "boll_lb": ( + "Bollinger Lower Band: Typically 2 standard deviations below the middle line. " + "Usage: Indicates potential oversold conditions. " + "Tips: Use additional analysis to avoid false reversal signals." + ), + "atr": ( + "ATR: Averages true range to measure volatility. " + "Usage: Set stop-loss levels and adjust position sizes based on current market volatility. " + "Tips: It's a reactive measure, so use it as part of a broader risk management strategy." + ), + # Volume-Based Indicators + "vwma": ( + "VWMA: A moving average weighted by volume. " + "Usage: Confirm trends by integrating price action with volume data. " + "Tips: Watch for skewed results from volume spikes; use in combination with other volume analyses." + ), + "mfi": ( + "MFI: The Money Flow Index is a momentum indicator that uses both price and volume to measure buying and selling pressure. " + "Usage: Identify overbought (>80) or oversold (<20) conditions and confirm the strength of trends or reversals. " + "Tips: Use alongside RSI or MACD to confirm signals; divergence between price and MFI can indicate potential reversals." + ), + } + + if indicator not in best_ind_params: + raise ValueError( + f"Indicator {indicator} is not supported. Please choose from: {list(best_ind_params.keys())}" + ) + + end_date = curr_date + curr_date = datetime.strptime(curr_date, "%Y-%m-%d") + before = curr_date - relativedelta(days=look_back_days) + + if not online: + # read from YFin data + data = pd.read_csv( + os.path.join( + DATA_DIR, + f"market_data/price_data/{symbol}-YFin-data-2015-01-01-2025-03-25.csv", + ) + ) + data["Date"] = pd.to_datetime(data["Date"], utc=True) + dates_in_df = data["Date"].astype(str).str[:10] + + ind_string = "" + while curr_date >= before: + # only do the trading dates + if curr_date.strftime("%Y-%m-%d") in dates_in_df.values: + indicator_value = get_stockstats_indicator( + symbol, indicator, curr_date.strftime("%Y-%m-%d"), online + ) + + ind_string += f"{curr_date.strftime('%Y-%m-%d')}: {indicator_value}\n" + + curr_date = curr_date - relativedelta(days=1) + else: + # online gathering + ind_string = "" + while curr_date >= before: + indicator_value = get_stockstats_indicator( + symbol, indicator, curr_date.strftime("%Y-%m-%d"), online + ) + + ind_string += f"{curr_date.strftime('%Y-%m-%d')}: {indicator_value}\n" + + curr_date = curr_date - relativedelta(days=1) + + result_str = ( + f"## {indicator} values from {before.strftime('%Y-%m-%d')} to {end_date}:\n\n" + + ind_string + + "\n\n" + + best_ind_params.get(indicator, "No description available.") + ) + + return result_str + + +def get_stockstats_indicator( + symbol: Annotated[str, "ticker symbol of the company"], + indicator: Annotated[str, "technical indicator to get the analysis and report of"], + curr_date: Annotated[ + str, "The current trading date you are trading on, YYYY-mm-dd" + ], + online: Annotated[bool, "to fetch data online or offline"], +) -> str: + + curr_date = datetime.strptime(curr_date, "%Y-%m-%d") + curr_date = curr_date.strftime("%Y-%m-%d") + + try: + indicator_value = StockstatsUtils.get_stock_stats( + symbol, + indicator, + curr_date, + os.path.join(DATA_DIR, "market_data", "price_data"), + online=online, + ) + except Exception as e: + print( + f"Error getting stockstats indicator data for indicator {indicator} on {curr_date}: {e}" + ) + return "" + + return str(indicator_value) + + +def get_YFin_data_window( + symbol: Annotated[str, "ticker symbol of the company"], + curr_date: Annotated[str, "Start date in yyyy-mm-dd format"], + look_back_days: Annotated[int, "how many days to look back"], +) -> str: + # calculate past days + date_obj = datetime.strptime(curr_date, "%Y-%m-%d") + before = date_obj - relativedelta(days=look_back_days) + start_date = before.strftime("%Y-%m-%d") + + # read in data + data = pd.read_csv( + os.path.join( + DATA_DIR, + f"market_data/price_data/{symbol}-YFin-data-2015-01-01-2025-03-25.csv", + ) + ) + + # Extract just the date part for comparison + data["DateOnly"] = data["Date"].str[:10] + + # Filter data between the start and end dates (inclusive) + filtered_data = data[ + (data["DateOnly"] >= start_date) & (data["DateOnly"] <= curr_date) + ] + + # Drop the temporary column we created + filtered_data = filtered_data.drop("DateOnly", axis=1) + + # Set pandas display options to show the full DataFrame + with pd.option_context( + "display.max_rows", None, "display.max_columns", None, "display.width", None + ): + df_string = filtered_data.to_string() + + return ( + f"## Raw Market Data for {symbol} from {start_date} to {curr_date}:\n\n" + + df_string + ) + + +def get_YFin_data_online( + symbol: Annotated[str, "ticker symbol of the company"], + start_date: Annotated[str, "Start date in yyyy-mm-dd format"], + end_date: Annotated[str, "Start date in yyyy-mm-dd format"], +): + + datetime.strptime(start_date, "%Y-%m-%d") + datetime.strptime(end_date, "%Y-%m-%d") + + # Create ticker object + ticker = yf.Ticker(symbol.upper()) + + # Fetch historical data for the specified date range + data = ticker.history(start=start_date, end=end_date) + + # Check if data is empty + if data.empty: + return ( + f"No data found for symbol '{symbol}' between {start_date} and {end_date}" + ) + + # Remove timezone info from index for cleaner output + if data.index.tz is not None: + data.index = data.index.tz_localize(None) + + # Round numerical values to 2 decimal places for cleaner display + numeric_columns = ["Open", "High", "Low", "Close", "Adj Close"] + for col in numeric_columns: + if col in data.columns: + data[col] = data[col].round(2) + + # Convert DataFrame to CSV string + csv_string = data.to_csv() + + # Add header information + header = f"# Stock data for {symbol.upper()} from {start_date} to {end_date}\n" + header += f"# Total records: {len(data)}\n" + header += f"# Data retrieved on: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n\n" + + return header + csv_string + + +def get_YFin_data( + symbol: Annotated[str, "ticker symbol of the company"], + start_date: Annotated[str, "Start date in yyyy-mm-dd format"], + end_date: Annotated[str, "Start date in yyyy-mm-dd format"], +) -> str: + # read in data + data = pd.read_csv( + os.path.join( + DATA_DIR, + f"market_data/price_data/{symbol}-YFin-data-2015-01-01-2025-03-25.csv", + ) + ) + + if end_date > "2025-03-25": + raise Exception( + f"Get_YFin_Data: {end_date} is outside of the data range of 2015-01-01 to 2025-03-25" + ) + + # Extract just the date part for comparison + data["DateOnly"] = data["Date"].str[:10] + + # Filter data between the start and end dates (inclusive) + filtered_data = data[ + (data["DateOnly"] >= start_date) & (data["DateOnly"] <= end_date) + ] + + # Drop the temporary column we created + filtered_data = filtered_data.drop("DateOnly", axis=1) + + # remove the index from the dataframe + filtered_data = filtered_data.reset_index(drop=True) + + return filtered_data + + +def get_stock_news_openai(ticker, curr_date): + client = OpenAI() + + response = client.responses.create( + model="gpt-4.1-mini", + input=[ + { + "role": "system", + "content": [ + { + "type": "input_text", + "text": f"Can you search Social Media for {ticker} from 7 days before {curr_date} to {curr_date}? Make sure you only get the data posted during that period.", + } + ], + } + ], + text={"format": {"type": "text"}}, + reasoning={}, + tools=[ + { + "type": "web_search_preview", + "user_location": {"type": "approximate"}, + "search_context_size": "low", + } + ], + temperature=1, + max_output_tokens=4096, + top_p=1, + store=True, + ) + + return response.output[1].content[0].text + + +def get_global_news_openai(curr_date): + client = OpenAI() + + response = client.responses.create( + model="gpt-4.1-mini", + input=[ + { + "role": "system", + "content": [ + { + "type": "input_text", + "text": f"Can you search global or macroeconomics news from 7 days before {curr_date} to {curr_date} that would be informative for trading purposes? Make sure you only get the data posted during that period.", + } + ], + } + ], + text={"format": {"type": "text"}}, + reasoning={}, + tools=[ + { + "type": "web_search_preview", + "user_location": {"type": "approximate"}, + "search_context_size": "low", + } + ], + temperature=1, + max_output_tokens=4096, + top_p=1, + store=True, + ) + + return response.output[1].content[0].text + + +def get_fundamentals_openai(ticker, curr_date): + client = OpenAI() + + response = client.responses.create( + model="gpt-4.1-mini", + input=[ + { + "role": "system", + "content": [ + { + "type": "input_text", + "text": f"Can you search Fundamental for discussions on {ticker} during of the month before {curr_date} to the month of {curr_date}. Make sure you only get the data posted during that period. List as a table, with PE/PS/Cash flow/ etc", + } + ], + } + ], + text={"format": {"type": "text"}}, + reasoning={}, + tools=[ + { + "type": "web_search_preview", + "user_location": {"type": "approximate"}, + "search_context_size": "low", + } + ], + temperature=1, + max_output_tokens=4096, + top_p=1, + store=True, + ) + + return response.output[1].content[0].text diff --git a/tradingagents/dataflows/reddit_utils.py b/tradingagents/dataflows/reddit_utils.py index 2532f0d1..d5decdea 100644 --- a/tradingagents/dataflows/reddit_utils.py +++ b/tradingagents/dataflows/reddit_utils.py @@ -1,135 +1,135 @@ -import requests -import time -import json -from datetime import datetime, timedelta -from contextlib import contextmanager -from typing import Annotated -import os -import re - -ticker_to_company = { - "AAPL": "Apple", - "MSFT": "Microsoft", - "GOOGL": "Google", - "AMZN": "Amazon", - "TSLA": "Tesla", - "NVDA": "Nvidia", - "TSM": "Taiwan Semiconductor Manufacturing Company OR TSMC", - "JPM": "JPMorgan Chase OR JP Morgan", - "JNJ": "Johnson & Johnson OR JNJ", - "V": "Visa", - "WMT": "Walmart", - "META": "Meta OR Facebook", - "AMD": "AMD", - "INTC": "Intel", - "QCOM": "Qualcomm", - "BABA": "Alibaba", - "ADBE": "Adobe", - "NFLX": "Netflix", - "CRM": "Salesforce", - "PYPL": "PayPal", - "PLTR": "Palantir", - "MU": "Micron", - "SQ": "Block OR Square", - "ZM": "Zoom", - "CSCO": "Cisco", - "SHOP": "Shopify", - "ORCL": "Oracle", - "X": "Twitter OR X", - "SPOT": "Spotify", - "AVGO": "Broadcom", - "ASML": "ASML ", - "TWLO": "Twilio", - "SNAP": "Snap Inc.", - "TEAM": "Atlassian", - "SQSP": "Squarespace", - "UBER": "Uber", - "ROKU": "Roku", - "PINS": "Pinterest", -} - - -def fetch_top_from_category( - category: Annotated[ - str, "Category to fetch top post from. Collection of subreddits." - ], - date: Annotated[str, "Date to fetch top posts from."], - max_limit: Annotated[int, "Maximum number of posts to fetch."], - query: Annotated[str, "Optional query to search for in the subreddit."] = None, - data_path: Annotated[ - str, - "Path to the data folder. Default is 'reddit_data'.", - ] = "reddit_data", -): - base_path = data_path - - all_content = [] - - if max_limit < len(os.listdir(os.path.join(base_path, category))): - raise ValueError( - "REDDIT FETCHING ERROR: max limit is less than the number of files in the category. Will not be able to fetch any posts" - ) - - limit_per_subreddit = max_limit // len( - os.listdir(os.path.join(base_path, category)) - ) - - for data_file in os.listdir(os.path.join(base_path, category)): - # check if data_file is a .jsonl file - if not data_file.endswith(".jsonl"): - continue - - all_content_curr_subreddit = [] - - with open(os.path.join(base_path, category, data_file), "rb") as f: - for i, line in enumerate(f): - # skip empty lines - if not line.strip(): - continue - - parsed_line = json.loads(line) - - # select only lines that are from the date - post_date = datetime.utcfromtimestamp( - parsed_line["created_utc"] - ).strftime("%Y-%m-%d") - if post_date != date: - continue - - # if is company_news, check that the title or the content has the company's name (query) mentioned - if "company" in category and query: - search_terms = [] - if "OR" in ticker_to_company[query]: - search_terms = ticker_to_company[query].split(" OR ") - else: - search_terms = [ticker_to_company[query]] - - search_terms.append(query) - - found = False - for term in search_terms: - if re.search( - term, parsed_line["title"], re.IGNORECASE - ) or re.search(term, parsed_line["selftext"], re.IGNORECASE): - found = True - break - - if not found: - continue - - post = { - "title": parsed_line["title"], - "content": parsed_line["selftext"], - "url": parsed_line["url"], - "upvotes": parsed_line["ups"], - "posted_date": post_date, - } - - all_content_curr_subreddit.append(post) - - # sort all_content_curr_subreddit by upvote_ratio in descending order - all_content_curr_subreddit.sort(key=lambda x: x["upvotes"], reverse=True) - - all_content.extend(all_content_curr_subreddit[:limit_per_subreddit]) - - return all_content +import requests +import time +import json +from datetime import datetime, timedelta +from contextlib import contextmanager +from typing import Annotated +import os +import re + +ticker_to_company = { + "AAPL": "Apple", + "MSFT": "Microsoft", + "GOOGL": "Google", + "AMZN": "Amazon", + "TSLA": "Tesla", + "NVDA": "Nvidia", + "TSM": "Taiwan Semiconductor Manufacturing Company OR TSMC", + "JPM": "JPMorgan Chase OR JP Morgan", + "JNJ": "Johnson & Johnson OR JNJ", + "V": "Visa", + "WMT": "Walmart", + "META": "Meta OR Facebook", + "AMD": "AMD", + "INTC": "Intel", + "QCOM": "Qualcomm", + "BABA": "Alibaba", + "ADBE": "Adobe", + "NFLX": "Netflix", + "CRM": "Salesforce", + "PYPL": "PayPal", + "PLTR": "Palantir", + "MU": "Micron", + "SQ": "Block OR Square", + "ZM": "Zoom", + "CSCO": "Cisco", + "SHOP": "Shopify", + "ORCL": "Oracle", + "X": "Twitter OR X", + "SPOT": "Spotify", + "AVGO": "Broadcom", + "ASML": "ASML ", + "TWLO": "Twilio", + "SNAP": "Snap Inc.", + "TEAM": "Atlassian", + "SQSP": "Squarespace", + "UBER": "Uber", + "ROKU": "Roku", + "PINS": "Pinterest", +} + + +def fetch_top_from_category( + category: Annotated[ + str, "Category to fetch top post from. Collection of subreddits." + ], + date: Annotated[str, "Date to fetch top posts from."], + max_limit: Annotated[int, "Maximum number of posts to fetch."], + query: Annotated[str, "Optional query to search for in the subreddit."] = None, + data_path: Annotated[ + str, + "Path to the data folder. Default is 'reddit_data'.", + ] = "reddit_data", +): + base_path = data_path + + all_content = [] + + if max_limit < len(os.listdir(os.path.join(base_path, category))): + raise ValueError( + "REDDIT FETCHING ERROR: max limit is less than the number of files in the category. Will not be able to fetch any posts" + ) + + limit_per_subreddit = max_limit // len( + os.listdir(os.path.join(base_path, category)) + ) + + for data_file in os.listdir(os.path.join(base_path, category)): + # check if data_file is a .jsonl file + if not data_file.endswith(".jsonl"): + continue + + all_content_curr_subreddit = [] + + with open(os.path.join(base_path, category, data_file), "rb") as f: + for i, line in enumerate(f): + # skip empty lines + if not line.strip(): + continue + + parsed_line = json.loads(line) + + # select only lines that are from the date + post_date = datetime.utcfromtimestamp( + parsed_line["created_utc"] + ).strftime("%Y-%m-%d") + if post_date != date: + continue + + # if is company_news, check that the title or the content has the company's name (query) mentioned + if "company" in category and query: + search_terms = [] + if "OR" in ticker_to_company[query]: + search_terms = ticker_to_company[query].split(" OR ") + else: + search_terms = [ticker_to_company[query]] + + search_terms.append(query) + + found = False + for term in search_terms: + if re.search( + term, parsed_line["title"], re.IGNORECASE + ) or re.search(term, parsed_line["selftext"], re.IGNORECASE): + found = True + break + + if not found: + continue + + post = { + "title": parsed_line["title"], + "content": parsed_line["selftext"], + "url": parsed_line["url"], + "upvotes": parsed_line["ups"], + "posted_date": post_date, + } + + all_content_curr_subreddit.append(post) + + # sort all_content_curr_subreddit by upvote_ratio in descending order + all_content_curr_subreddit.sort(key=lambda x: x["upvotes"], reverse=True) + + all_content.extend(all_content_curr_subreddit[:limit_per_subreddit]) + + return all_content diff --git a/tradingagents/dataflows/stockstats_utils.py b/tradingagents/dataflows/stockstats_utils.py index 78ffb220..6d87f484 100644 --- a/tradingagents/dataflows/stockstats_utils.py +++ b/tradingagents/dataflows/stockstats_utils.py @@ -1,87 +1,87 @@ -import pandas as pd -import yfinance as yf -from stockstats import wrap -from typing import Annotated -import os -from .config import get_config - - -class StockstatsUtils: - @staticmethod - def get_stock_stats( - symbol: Annotated[str, "ticker symbol for the company"], - indicator: Annotated[ - str, "quantitative indicators based off of the stock data for the company" - ], - curr_date: Annotated[ - str, "curr date for retrieving stock price data, YYYY-mm-dd" - ], - data_dir: Annotated[ - str, - "directory where the stock data is stored.", - ], - online: Annotated[ - bool, - "whether to use online tools to fetch data or offline tools. If True, will use online tools.", - ] = False, - ): - df = None - data = None - - if not online: - try: - data = pd.read_csv( - os.path.join( - data_dir, - f"{symbol}-YFin-data-2015-01-01-2025-03-25.csv", - ) - ) - df = wrap(data) - except FileNotFoundError: - raise Exception("Stockstats fail: Yahoo Finance data not fetched yet!") - else: - # Get today's date as YYYY-mm-dd to add to cache - today_date = pd.Timestamp.today() - curr_date = pd.to_datetime(curr_date) - - end_date = today_date - start_date = today_date - pd.DateOffset(years=15) - start_date = start_date.strftime("%Y-%m-%d") - end_date = end_date.strftime("%Y-%m-%d") - - # Get config and ensure cache directory exists - config = get_config() - os.makedirs(config["data_cache_dir"], exist_ok=True) - - data_file = os.path.join( - config["data_cache_dir"], - f"{symbol}-YFin-data-{start_date}-{end_date}.csv", - ) - - if os.path.exists(data_file): - data = pd.read_csv(data_file) - data["Date"] = pd.to_datetime(data["Date"]) - else: - data = yf.download( - symbol, - start=start_date, - end=end_date, - multi_level_index=False, - progress=False, - auto_adjust=True, - ) - data = data.reset_index() - data.to_csv(data_file, index=False) - - df = wrap(data) - df["Date"] = df["Date"].dt.strftime("%Y-%m-%d") - curr_date = curr_date.strftime("%Y-%m-%d") - - df[indicator] # trigger stockstats to calculate the indicator - matching_rows = df[df["Date"].str.startswith(curr_date)] - - if not matching_rows.empty: - indicator_value = matching_rows[indicator].values[0] - return indicator_value - else: - return "N/A: Not a trading day (weekend or holiday)" +import pandas as pd +import yfinance as yf +from stockstats import wrap +from typing import Annotated +import os +from .config import get_config + + +class StockstatsUtils: + @staticmethod + def get_stock_stats( + symbol: Annotated[str, "ticker symbol for the company"], + indicator: Annotated[ + str, "quantitative indicators based off of the stock data for the company" + ], + curr_date: Annotated[ + str, "curr date for retrieving stock price data, YYYY-mm-dd" + ], + data_dir: Annotated[ + str, + "directory where the stock data is stored.", + ], + online: Annotated[ + bool, + "whether to use online tools to fetch data or offline tools. If True, will use online tools.", + ] = False, + ): + df = None + data = None + + if not online: + try: + data = pd.read_csv( + os.path.join( + data_dir, + f"{symbol}-YFin-data-2015-01-01-2025-03-25.csv", + ) + ) + df = wrap(data) + except FileNotFoundError: + raise Exception("Stockstats fail: Yahoo Finance data not fetched yet!") + else: + # Get today's date as YYYY-mm-dd to add to cache + today_date = pd.Timestamp.today() + curr_date = pd.to_datetime(curr_date) + + end_date = today_date + start_date = today_date - pd.DateOffset(years=15) + start_date = start_date.strftime("%Y-%m-%d") + end_date = end_date.strftime("%Y-%m-%d") + + # Get config and ensure cache directory exists + config = get_config() + os.makedirs(config["data_cache_dir"], exist_ok=True) + + data_file = os.path.join( + config["data_cache_dir"], + f"{symbol}-YFin-data-{start_date}-{end_date}.csv", + ) + + if os.path.exists(data_file): + data = pd.read_csv(data_file) + data["Date"] = pd.to_datetime(data["Date"]) + else: + data = yf.download( + symbol, + start=start_date, + end=end_date, + multi_level_index=False, + progress=False, + auto_adjust=True, + ) + data = data.reset_index() + data.to_csv(data_file, index=False) + + df = wrap(data) + df["Date"] = df["Date"].dt.strftime("%Y-%m-%d") + curr_date = curr_date.strftime("%Y-%m-%d") + + df[indicator] # trigger stockstats to calculate the indicator + matching_rows = df[df["Date"].str.startswith(curr_date)] + + if not matching_rows.empty: + indicator_value = matching_rows[indicator].values[0] + return indicator_value + else: + return "N/A: Not a trading day (weekend or holiday)" diff --git a/tradingagents/dataflows/utils.py b/tradingagents/dataflows/utils.py index 4523de19..1d8c2c4f 100644 --- a/tradingagents/dataflows/utils.py +++ b/tradingagents/dataflows/utils.py @@ -1,39 +1,39 @@ -import os -import json -import pandas as pd -from datetime import date, timedelta, datetime -from typing import Annotated - -SavePathType = Annotated[str, "File path to save data. If None, data is not saved."] - -def save_output(data: pd.DataFrame, tag: str, save_path: SavePathType = None) -> None: - if save_path: - data.to_csv(save_path) - print(f"{tag} saved to {save_path}") - - -def get_current_date(): - return date.today().strftime("%Y-%m-%d") - - -def decorate_all_methods(decorator): - def class_decorator(cls): - for attr_name, attr_value in cls.__dict__.items(): - if callable(attr_value): - setattr(cls, attr_name, decorator(attr_value)) - return cls - - return class_decorator - - -def get_next_weekday(date): - - if not isinstance(date, datetime): - date = datetime.strptime(date, "%Y-%m-%d") - - if date.weekday() >= 5: - days_to_add = 7 - date.weekday() - next_weekday = date + timedelta(days=days_to_add) - return next_weekday - else: - return date +import os +import json +import pandas as pd +from datetime import date, timedelta, datetime +from typing import Annotated + +SavePathType = Annotated[str, "File path to save data. If None, data is not saved."] + +def save_output(data: pd.DataFrame, tag: str, save_path: SavePathType = None) -> None: + if save_path: + data.to_csv(save_path) + print(f"{tag} saved to {save_path}") + + +def get_current_date(): + return date.today().strftime("%Y-%m-%d") + + +def decorate_all_methods(decorator): + def class_decorator(cls): + for attr_name, attr_value in cls.__dict__.items(): + if callable(attr_value): + setattr(cls, attr_name, decorator(attr_value)) + return cls + + return class_decorator + + +def get_next_weekday(date): + + if not isinstance(date, datetime): + date = datetime.strptime(date, "%Y-%m-%d") + + if date.weekday() >= 5: + days_to_add = 7 - date.weekday() + next_weekday = date + timedelta(days=days_to_add) + return next_weekday + else: + return date diff --git a/tradingagents/dataflows/yfin_utils.py b/tradingagents/dataflows/yfin_utils.py index bd7ca324..0dba2b30 100644 --- a/tradingagents/dataflows/yfin_utils.py +++ b/tradingagents/dataflows/yfin_utils.py @@ -1,117 +1,117 @@ -# gets data/stats - -import yfinance as yf -from typing import Annotated, Callable, Any, Optional -from pandas import DataFrame -import pandas as pd -from functools import wraps - -from .utils import save_output, SavePathType, decorate_all_methods - - -def init_ticker(func: Callable) -> Callable: - """Decorator to initialize yf.Ticker and pass it to the function.""" - - @wraps(func) - def wrapper(symbol: Annotated[str, "ticker symbol"], *args, **kwargs) -> Any: - ticker = yf.Ticker(symbol) - return func(ticker, *args, **kwargs) - - return wrapper - - -@decorate_all_methods(init_ticker) -class YFinanceUtils: - - def get_stock_data( - symbol: Annotated[str, "ticker symbol"], - start_date: Annotated[ - str, "start date for retrieving stock price data, YYYY-mm-dd" - ], - end_date: Annotated[ - str, "end date for retrieving stock price data, YYYY-mm-dd" - ], - save_path: SavePathType = None, - ) -> DataFrame: - """retrieve stock price data for designated ticker symbol""" - ticker = symbol - # add one day to the end_date so that the data range is inclusive - end_date = pd.to_datetime(end_date) + pd.DateOffset(days=1) - end_date = end_date.strftime("%Y-%m-%d") - stock_data = ticker.history(start=start_date, end=end_date) - # save_output(stock_data, f"Stock data for {ticker.ticker}", save_path) - return stock_data - - def get_stock_info( - symbol: Annotated[str, "ticker symbol"], - ) -> dict: - """Fetches and returns latest stock information.""" - ticker = symbol - stock_info = ticker.info - return stock_info - - def get_company_info( - symbol: Annotated[str, "ticker symbol"], - save_path: Optional[str] = None, - ) -> DataFrame: - """Fetches and returns company information as a DataFrame.""" - ticker = symbol - info = ticker.info - company_info = { - "Company Name": info.get("shortName", "N/A"), - "Industry": info.get("industry", "N/A"), - "Sector": info.get("sector", "N/A"), - "Country": info.get("country", "N/A"), - "Website": info.get("website", "N/A"), - } - company_info_df = DataFrame([company_info]) - if save_path: - company_info_df.to_csv(save_path) - print(f"Company info for {ticker.ticker} saved to {save_path}") - return company_info_df - - def get_stock_dividends( - symbol: Annotated[str, "ticker symbol"], - save_path: Optional[str] = None, - ) -> DataFrame: - """Fetches and returns the latest dividends data as a DataFrame.""" - ticker = symbol - dividends = ticker.dividends - if save_path: - dividends.to_csv(save_path) - print(f"Dividends for {ticker.ticker} saved to {save_path}") - return dividends - - def get_income_stmt(symbol: Annotated[str, "ticker symbol"]) -> DataFrame: - """Fetches and returns the latest income statement of the company as a DataFrame.""" - ticker = symbol - income_stmt = ticker.financials - return income_stmt - - def get_balance_sheet(symbol: Annotated[str, "ticker symbol"]) -> DataFrame: - """Fetches and returns the latest balance sheet of the company as a DataFrame.""" - ticker = symbol - balance_sheet = ticker.balance_sheet - return balance_sheet - - def get_cash_flow(symbol: Annotated[str, "ticker symbol"]) -> DataFrame: - """Fetches and returns the latest cash flow statement of the company as a DataFrame.""" - ticker = symbol - cash_flow = ticker.cashflow - return cash_flow - - def get_analyst_recommendations(symbol: Annotated[str, "ticker symbol"]) -> tuple: - """Fetches the latest analyst recommendations and returns the most common recommendation and its count.""" - ticker = symbol - recommendations = ticker.recommendations - if recommendations.empty: - return None, 0 # No recommendations available - - # Assuming 'period' column exists and needs to be excluded - row_0 = recommendations.iloc[0, 1:] # Exclude 'period' column if necessary - - # Find the maximum voting result - max_votes = row_0.max() - majority_voting_result = row_0[row_0 == max_votes].index.tolist() - - return majority_voting_result[0], max_votes +# gets data/stats + +import yfinance as yf +from typing import Annotated, Callable, Any, Optional +from pandas import DataFrame +import pandas as pd +from functools import wraps + +from .utils import save_output, SavePathType, decorate_all_methods + + +def init_ticker(func: Callable) -> Callable: + """Decorator to initialize yf.Ticker and pass it to the function.""" + + @wraps(func) + def wrapper(symbol: Annotated[str, "ticker symbol"], *args, **kwargs) -> Any: + ticker = yf.Ticker(symbol) + return func(ticker, *args, **kwargs) + + return wrapper + + +@decorate_all_methods(init_ticker) +class YFinanceUtils: + + def get_stock_data( + symbol: Annotated[str, "ticker symbol"], + start_date: Annotated[ + str, "start date for retrieving stock price data, YYYY-mm-dd" + ], + end_date: Annotated[ + str, "end date for retrieving stock price data, YYYY-mm-dd" + ], + save_path: SavePathType = None, + ) -> DataFrame: + """retrieve stock price data for designated ticker symbol""" + ticker = symbol + # add one day to the end_date so that the data range is inclusive + end_date = pd.to_datetime(end_date) + pd.DateOffset(days=1) + end_date = end_date.strftime("%Y-%m-%d") + stock_data = ticker.history(start=start_date, end=end_date) + # save_output(stock_data, f"Stock data for {ticker.ticker}", save_path) + return stock_data + + def get_stock_info( + symbol: Annotated[str, "ticker symbol"], + ) -> dict: + """Fetches and returns latest stock information.""" + ticker = symbol + stock_info = ticker.info + return stock_info + + def get_company_info( + symbol: Annotated[str, "ticker symbol"], + save_path: Optional[str] = None, + ) -> DataFrame: + """Fetches and returns company information as a DataFrame.""" + ticker = symbol + info = ticker.info + company_info = { + "Company Name": info.get("shortName", "N/A"), + "Industry": info.get("industry", "N/A"), + "Sector": info.get("sector", "N/A"), + "Country": info.get("country", "N/A"), + "Website": info.get("website", "N/A"), + } + company_info_df = DataFrame([company_info]) + if save_path: + company_info_df.to_csv(save_path) + print(f"Company info for {ticker.ticker} saved to {save_path}") + return company_info_df + + def get_stock_dividends( + symbol: Annotated[str, "ticker symbol"], + save_path: Optional[str] = None, + ) -> DataFrame: + """Fetches and returns the latest dividends data as a DataFrame.""" + ticker = symbol + dividends = ticker.dividends + if save_path: + dividends.to_csv(save_path) + print(f"Dividends for {ticker.ticker} saved to {save_path}") + return dividends + + def get_income_stmt(symbol: Annotated[str, "ticker symbol"]) -> DataFrame: + """Fetches and returns the latest income statement of the company as a DataFrame.""" + ticker = symbol + income_stmt = ticker.financials + return income_stmt + + def get_balance_sheet(symbol: Annotated[str, "ticker symbol"]) -> DataFrame: + """Fetches and returns the latest balance sheet of the company as a DataFrame.""" + ticker = symbol + balance_sheet = ticker.balance_sheet + return balance_sheet + + def get_cash_flow(symbol: Annotated[str, "ticker symbol"]) -> DataFrame: + """Fetches and returns the latest cash flow statement of the company as a DataFrame.""" + ticker = symbol + cash_flow = ticker.cashflow + return cash_flow + + def get_analyst_recommendations(symbol: Annotated[str, "ticker symbol"]) -> tuple: + """Fetches the latest analyst recommendations and returns the most common recommendation and its count.""" + ticker = symbol + recommendations = ticker.recommendations + if recommendations.empty: + return None, 0 # No recommendations available + + # Assuming 'period' column exists and needs to be excluded + row_0 = recommendations.iloc[0, 1:] # Exclude 'period' column if necessary + + # Find the maximum voting result + max_votes = row_0.max() + majority_voting_result = row_0[row_0 == max_votes].index.tolist() + + return majority_voting_result[0], max_votes diff --git a/tradingagents/default_config.py b/tradingagents/default_config.py index 5bb2548c..583d73ac 100644 --- a/tradingagents/default_config.py +++ b/tradingagents/default_config.py @@ -1,19 +1,19 @@ -import os - -DEFAULT_CONFIG = { - "project_dir": os.path.abspath(os.path.join(os.path.dirname(__file__), ".")), - "data_dir": "/Users/yluo/Documents/Code/ScAI/FR1-data", - "data_cache_dir": os.path.join( - os.path.abspath(os.path.join(os.path.dirname(__file__), ".")), - "dataflows/data_cache", - ), - # LLM settings - "deep_think_llm": "o4-mini", - "quick_think_llm": "gpt-4o-mini", - # Debate and discussion settings - "max_debate_rounds": 1, - "max_risk_discuss_rounds": 1, - "max_recur_limit": 100, - # Tool settings - "online_tools": True, -} +import os + +DEFAULT_CONFIG = { + "project_dir": os.path.abspath(os.path.join(os.path.dirname(__file__), ".")), + "data_dir": "/Users/yluo/Documents/Code/ScAI/FR1-data", + "data_cache_dir": os.path.join( + os.path.abspath(os.path.join(os.path.dirname(__file__), ".")), + "dataflows/data_cache", + ), + # LLM settings + "deep_think_llm": "o4-mini", + "quick_think_llm": "gpt-4o-mini", + # Debate and discussion settings + "max_debate_rounds": 1, + "max_risk_discuss_rounds": 1, + "max_recur_limit": 100, + # Tool settings + "online_tools": True, +} diff --git a/tradingagents/graph/__init__.py b/tradingagents/graph/__init__.py index 80982c19..e713b81d 100644 --- a/tradingagents/graph/__init__.py +++ b/tradingagents/graph/__init__.py @@ -1,17 +1,17 @@ -# TradingAgents/graph/__init__.py - -from .trading_graph import TradingAgentsGraph -from .conditional_logic import ConditionalLogic -from .setup import GraphSetup -from .propagation import Propagator -from .reflection import Reflector -from .signal_processing import SignalProcessor - -__all__ = [ - "TradingAgentsGraph", - "ConditionalLogic", - "GraphSetup", - "Propagator", - "Reflector", - "SignalProcessor", -] +# TradingAgents/graph/__init__.py + +from .trading_graph import TradingAgentsGraph +from .conditional_logic import ConditionalLogic +from .setup import GraphSetup +from .propagation import Propagator +from .reflection import Reflector +from .signal_processing import SignalProcessor + +__all__ = [ + "TradingAgentsGraph", + "ConditionalLogic", + "GraphSetup", + "Propagator", + "Reflector", + "SignalProcessor", +] diff --git a/tradingagents/graph/conditional_logic.py b/tradingagents/graph/conditional_logic.py index e7c87859..dc28c9b2 100644 --- a/tradingagents/graph/conditional_logic.py +++ b/tradingagents/graph/conditional_logic.py @@ -1,67 +1,67 @@ -# TradingAgents/graph/conditional_logic.py - -from tradingagents.agents.utils.agent_states import AgentState - - -class ConditionalLogic: - """Handles conditional logic for determining graph flow.""" - - def __init__(self, max_debate_rounds=1, max_risk_discuss_rounds=1): - """Initialize with configuration parameters.""" - self.max_debate_rounds = max_debate_rounds - self.max_risk_discuss_rounds = max_risk_discuss_rounds - - def should_continue_market(self, state: AgentState): - """Determine if market analysis should continue.""" - messages = state["messages"] - last_message = messages[-1] - if last_message.tool_calls: - return "tools_market" - return "Msg Clear Market" - - def should_continue_social(self, state: AgentState): - """Determine if social media analysis should continue.""" - messages = state["messages"] - last_message = messages[-1] - if last_message.tool_calls: - return "tools_social" - return "Msg Clear Social" - - def should_continue_news(self, state: AgentState): - """Determine if news analysis should continue.""" - messages = state["messages"] - last_message = messages[-1] - if last_message.tool_calls: - return "tools_news" - return "Msg Clear News" - - def should_continue_fundamentals(self, state: AgentState): - """Determine if fundamentals analysis should continue.""" - messages = state["messages"] - last_message = messages[-1] - if last_message.tool_calls: - return "tools_fundamentals" - return "Msg Clear Fundamentals" - - def should_continue_debate(self, state: AgentState) -> str: - """Determine if debate should continue.""" - - if ( - state["investment_debate_state"]["count"] >= 2 * self.max_debate_rounds - ): # 3 rounds of back-and-forth between 2 agents - return "Research Manager" - if state["investment_debate_state"]["current_response"].startswith("Bull"): - return "Bear Researcher" - return "Bull Researcher" - - def should_continue_risk_analysis(self, state: AgentState) -> str: - """Determine if risk analysis should continue.""" - if ( - state["risk_debate_state"]["count"] >= 3 * self.max_risk_discuss_rounds - ): # 3 rounds of back-and-forth between 3 agents - return "Risk Judge" - if state["risk_debate_state"]["latest_speaker"].startswith("Risky"): - return "Safe Analyst" - if state["risk_debate_state"]["latest_speaker"].startswith("Safe"): - return "Neutral Analyst" - return "Risky Analyst" +# TradingAgents/graph/conditional_logic.py + +from tradingagents.agents.utils.agent_states import AgentState + + +class ConditionalLogic: + """Handles conditional logic for determining graph flow.""" + + def __init__(self, max_debate_rounds=1, max_risk_discuss_rounds=1): + """Initialize with configuration parameters.""" + self.max_debate_rounds = max_debate_rounds + self.max_risk_discuss_rounds = max_risk_discuss_rounds + + def should_continue_market(self, state: AgentState): + """Determine if market analysis should continue.""" + messages = state["messages"] + last_message = messages[-1] + if last_message.tool_calls: + return "tools_market" + return "Msg Clear Market" + + def should_continue_social(self, state: AgentState): + """Determine if social media analysis should continue.""" + messages = state["messages"] + last_message = messages[-1] + if last_message.tool_calls: + return "tools_social" + return "Msg Clear Social" + + def should_continue_news(self, state: AgentState): + """Determine if news analysis should continue.""" + messages = state["messages"] + last_message = messages[-1] + if last_message.tool_calls: + return "tools_news" + return "Msg Clear News" + + def should_continue_fundamentals(self, state: AgentState): + """Determine if fundamentals analysis should continue.""" + messages = state["messages"] + last_message = messages[-1] + if last_message.tool_calls: + return "tools_fundamentals" + return "Msg Clear Fundamentals" + + def should_continue_debate(self, state: AgentState) -> str: + """Determine if debate should continue.""" + + if ( + state["investment_debate_state"]["count"] >= 2 * self.max_debate_rounds + ): # 3 rounds of back-and-forth between 2 agents + return "Research Manager" + if state["investment_debate_state"]["current_response"].startswith("Bull"): + return "Bear Researcher" + return "Bull Researcher" + + def should_continue_risk_analysis(self, state: AgentState) -> str: + """Determine if risk analysis should continue.""" + if ( + state["risk_debate_state"]["count"] >= 3 * self.max_risk_discuss_rounds + ): # 3 rounds of back-and-forth between 3 agents + return "Risk Judge" + if state["risk_debate_state"]["latest_speaker"].startswith("Risky"): + return "Safe Analyst" + if state["risk_debate_state"]["latest_speaker"].startswith("Safe"): + return "Neutral Analyst" + return "Risky Analyst" diff --git a/tradingagents/graph/propagation.py b/tradingagents/graph/propagation.py index 58ebd0a8..0eec27d1 100644 --- a/tradingagents/graph/propagation.py +++ b/tradingagents/graph/propagation.py @@ -1,49 +1,49 @@ -# TradingAgents/graph/propagation.py - -from typing import Dict, Any -from tradingagents.agents.utils.agent_states import ( - AgentState, - InvestDebateState, - RiskDebateState, -) - - -class Propagator: - """Handles state initialization and propagation through the graph.""" - - def __init__(self, max_recur_limit=100): - """Initialize with configuration parameters.""" - self.max_recur_limit = max_recur_limit - - def create_initial_state( - self, company_name: str, trade_date: str - ) -> Dict[str, Any]: - """Create the initial state for the agent graph.""" - return { - "messages": [("human", company_name)], - "company_of_interest": company_name, - "trade_date": str(trade_date), - "investment_debate_state": InvestDebateState( - {"history": "", "current_response": "", "count": 0} - ), - "risk_debate_state": RiskDebateState( - { - "history": "", - "current_risky_response": "", - "current_safe_response": "", - "current_neutral_response": "", - "count": 0, - } - ), - "market_report": "", - "fundamentals_report": "", - "sentiment_report": "", - "news_report": "", - } - - def get_graph_args(self) -> Dict[str, Any]: - """Get arguments for the graph invocation.""" - return { - "stream_mode": "values", - "config": {"recursion_limit": self.max_recur_limit}, - } +# TradingAgents/graph/propagation.py + +from typing import Dict, Any +from tradingagents.agents.utils.agent_states import ( + AgentState, + InvestDebateState, + RiskDebateState, +) + + +class Propagator: + """Handles state initialization and propagation through the graph.""" + + def __init__(self, max_recur_limit=100): + """Initialize with configuration parameters.""" + self.max_recur_limit = max_recur_limit + + def create_initial_state( + self, company_name: str, trade_date: str + ) -> Dict[str, Any]: + """Create the initial state for the agent graph.""" + return { + "messages": [("human", company_name)], + "company_of_interest": company_name, + "trade_date": str(trade_date), + "investment_debate_state": InvestDebateState( + {"history": "", "current_response": "", "count": 0} + ), + "risk_debate_state": RiskDebateState( + { + "history": "", + "current_risky_response": "", + "current_safe_response": "", + "current_neutral_response": "", + "count": 0, + } + ), + "market_report": "", + "fundamentals_report": "", + "sentiment_report": "", + "news_report": "", + } + + def get_graph_args(self) -> Dict[str, Any]: + """Get arguments for the graph invocation.""" + return { + "stream_mode": "values", + "config": {"recursion_limit": self.max_recur_limit}, + } diff --git a/tradingagents/graph/reflection.py b/tradingagents/graph/reflection.py index 33303231..57a876dc 100644 --- a/tradingagents/graph/reflection.py +++ b/tradingagents/graph/reflection.py @@ -1,121 +1,121 @@ -# TradingAgents/graph/reflection.py - -from typing import Dict, Any -from langchain_openai import ChatOpenAI - - -class Reflector: - """Handles reflection on decisions and updating memory.""" - - def __init__(self, quick_thinking_llm: ChatOpenAI): - """Initialize the reflector with an LLM.""" - self.quick_thinking_llm = quick_thinking_llm - self.reflection_system_prompt = self._get_reflection_prompt() - - def _get_reflection_prompt(self) -> str: - """Get the system prompt for reflection.""" - return """ -You are an expert financial analyst tasked with reviewing trading decisions/analysis and providing a comprehensive, step-by-step analysis. -Your goal is to deliver detailed insights into investment decisions and highlight opportunities for improvement, adhering strictly to the following guidelines: - -1. Reasoning: - - For each trading decision, determine whether it was correct or incorrect. A correct decision results in an increase in returns, while an incorrect decision does the opposite. - - Analyze the contributing factors to each success or mistake. Consider: - - Market intelligence. - - Technical indicators. - - Technical signals. - - Price movement analysis. - - Overall market data analysis - - News analysis. - - Social media and sentiment analysis. - - Fundamental data analysis. - - Weight the importance of each factor in the decision-making process. - -2. Improvement: - - For any incorrect decisions, propose revisions to maximize returns. - - Provide a detailed list of corrective actions or improvements, including specific recommendations (e.g., changing a decision from HOLD to BUY on a particular date). - -3. Summary: - - Summarize the lessons learned from the successes and mistakes. - - Highlight how these lessons can be adapted for future trading scenarios and draw connections between similar situations to apply the knowledge gained. - -4. Query: - - Extract key insights from the summary into a concise sentence of no more than 1000 tokens. - - Ensure the condensed sentence captures the essence of the lessons and reasoning for easy reference. - -Adhere strictly to these instructions, and ensure your output is detailed, accurate, and actionable. You will also be given objective descriptions of the market from a price movements, technical indicator, news, and sentiment perspective to provide more context for your analysis. -""" - - def _extract_current_situation(self, current_state: Dict[str, Any]) -> str: - """Extract the current market situation from the state.""" - curr_market_report = current_state["market_report"] - curr_sentiment_report = current_state["sentiment_report"] - curr_news_report = current_state["news_report"] - curr_fundamentals_report = current_state["fundamentals_report"] - - return f"{curr_market_report}\n\n{curr_sentiment_report}\n\n{curr_news_report}\n\n{curr_fundamentals_report}" - - def _reflect_on_component( - self, component_type: str, report: str, situation: str, returns_losses - ) -> str: - """Generate reflection for a component.""" - messages = [ - ("system", self.reflection_system_prompt), - ( - "human", - f"Returns: {returns_losses}\n\nAnalysis/Decision: {report}\n\nObjective Market Reports for Reference: {situation}", - ), - ] - - result = self.quick_thinking_llm.invoke(messages).content - return result - - def reflect_bull_researcher(self, current_state, returns_losses, bull_memory): - """Reflect on bull researcher's analysis and update memory.""" - situation = self._extract_current_situation(current_state) - bull_debate_history = current_state["investment_debate_state"]["bull_history"] - - result = self._reflect_on_component( - "BULL", bull_debate_history, situation, returns_losses - ) - bull_memory.add_situations([(situation, result)]) - - def reflect_bear_researcher(self, current_state, returns_losses, bear_memory): - """Reflect on bear researcher's analysis and update memory.""" - situation = self._extract_current_situation(current_state) - bear_debate_history = current_state["investment_debate_state"]["bear_history"] - - result = self._reflect_on_component( - "BEAR", bear_debate_history, situation, returns_losses - ) - bear_memory.add_situations([(situation, result)]) - - def reflect_trader(self, current_state, returns_losses, trader_memory): - """Reflect on trader's decision and update memory.""" - situation = self._extract_current_situation(current_state) - trader_decision = current_state["trader_investment_plan"] - - result = self._reflect_on_component( - "TRADER", trader_decision, situation, returns_losses - ) - trader_memory.add_situations([(situation, result)]) - - def reflect_invest_judge(self, current_state, returns_losses, invest_judge_memory): - """Reflect on investment judge's decision and update memory.""" - situation = self._extract_current_situation(current_state) - judge_decision = current_state["investment_debate_state"]["judge_decision"] - - result = self._reflect_on_component( - "INVEST JUDGE", judge_decision, situation, returns_losses - ) - invest_judge_memory.add_situations([(situation, result)]) - - def reflect_risk_manager(self, current_state, returns_losses, risk_manager_memory): - """Reflect on risk manager's decision and update memory.""" - situation = self._extract_current_situation(current_state) - judge_decision = current_state["risk_debate_state"]["judge_decision"] - - result = self._reflect_on_component( - "RISK JUDGE", judge_decision, situation, returns_losses - ) - risk_manager_memory.add_situations([(situation, result)]) +# TradingAgents/graph/reflection.py + +from typing import Dict, Any +from langchain_openai import ChatOpenAI + + +class Reflector: + """Handles reflection on decisions and updating memory.""" + + def __init__(self, quick_thinking_llm: ChatOpenAI): + """Initialize the reflector with an LLM.""" + self.quick_thinking_llm = quick_thinking_llm + self.reflection_system_prompt = self._get_reflection_prompt() + + def _get_reflection_prompt(self) -> str: + """Get the system prompt for reflection.""" + return """ +You are an expert financial analyst tasked with reviewing trading decisions/analysis and providing a comprehensive, step-by-step analysis. +Your goal is to deliver detailed insights into investment decisions and highlight opportunities for improvement, adhering strictly to the following guidelines: + +1. Reasoning: + - For each trading decision, determine whether it was correct or incorrect. A correct decision results in an increase in returns, while an incorrect decision does the opposite. + - Analyze the contributing factors to each success or mistake. Consider: + - Market intelligence. + - Technical indicators. + - Technical signals. + - Price movement analysis. + - Overall market data analysis + - News analysis. + - Social media and sentiment analysis. + - Fundamental data analysis. + - Weight the importance of each factor in the decision-making process. + +2. Improvement: + - For any incorrect decisions, propose revisions to maximize returns. + - Provide a detailed list of corrective actions or improvements, including specific recommendations (e.g., changing a decision from HOLD to BUY on a particular date). + +3. Summary: + - Summarize the lessons learned from the successes and mistakes. + - Highlight how these lessons can be adapted for future trading scenarios and draw connections between similar situations to apply the knowledge gained. + +4. Query: + - Extract key insights from the summary into a concise sentence of no more than 1000 tokens. + - Ensure the condensed sentence captures the essence of the lessons and reasoning for easy reference. + +Adhere strictly to these instructions, and ensure your output is detailed, accurate, and actionable. You will also be given objective descriptions of the market from a price movements, technical indicator, news, and sentiment perspective to provide more context for your analysis. +""" + + def _extract_current_situation(self, current_state: Dict[str, Any]) -> str: + """Extract the current market situation from the state.""" + curr_market_report = current_state["market_report"] + curr_sentiment_report = current_state["sentiment_report"] + curr_news_report = current_state["news_report"] + curr_fundamentals_report = current_state["fundamentals_report"] + + return f"{curr_market_report}\n\n{curr_sentiment_report}\n\n{curr_news_report}\n\n{curr_fundamentals_report}" + + def _reflect_on_component( + self, component_type: str, report: str, situation: str, returns_losses + ) -> str: + """Generate reflection for a component.""" + messages = [ + ("system", self.reflection_system_prompt), + ( + "human", + f"Returns: {returns_losses}\n\nAnalysis/Decision: {report}\n\nObjective Market Reports for Reference: {situation}", + ), + ] + + result = self.quick_thinking_llm.invoke(messages).content + return result + + def reflect_bull_researcher(self, current_state, returns_losses, bull_memory): + """Reflect on bull researcher's analysis and update memory.""" + situation = self._extract_current_situation(current_state) + bull_debate_history = current_state["investment_debate_state"]["bull_history"] + + result = self._reflect_on_component( + "BULL", bull_debate_history, situation, returns_losses + ) + bull_memory.add_situations([(situation, result)]) + + def reflect_bear_researcher(self, current_state, returns_losses, bear_memory): + """Reflect on bear researcher's analysis and update memory.""" + situation = self._extract_current_situation(current_state) + bear_debate_history = current_state["investment_debate_state"]["bear_history"] + + result = self._reflect_on_component( + "BEAR", bear_debate_history, situation, returns_losses + ) + bear_memory.add_situations([(situation, result)]) + + def reflect_trader(self, current_state, returns_losses, trader_memory): + """Reflect on trader's decision and update memory.""" + situation = self._extract_current_situation(current_state) + trader_decision = current_state["trader_investment_plan"] + + result = self._reflect_on_component( + "TRADER", trader_decision, situation, returns_losses + ) + trader_memory.add_situations([(situation, result)]) + + def reflect_invest_judge(self, current_state, returns_losses, invest_judge_memory): + """Reflect on investment judge's decision and update memory.""" + situation = self._extract_current_situation(current_state) + judge_decision = current_state["investment_debate_state"]["judge_decision"] + + result = self._reflect_on_component( + "INVEST JUDGE", judge_decision, situation, returns_losses + ) + invest_judge_memory.add_situations([(situation, result)]) + + def reflect_risk_manager(self, current_state, returns_losses, risk_manager_memory): + """Reflect on risk manager's decision and update memory.""" + situation = self._extract_current_situation(current_state) + judge_decision = current_state["risk_debate_state"]["judge_decision"] + + result = self._reflect_on_component( + "RISK JUDGE", judge_decision, situation, returns_losses + ) + risk_manager_memory.add_situations([(situation, result)]) diff --git a/tradingagents/graph/setup.py b/tradingagents/graph/setup.py index 847c429f..b3b7059c 100644 --- a/tradingagents/graph/setup.py +++ b/tradingagents/graph/setup.py @@ -1,205 +1,205 @@ -# TradingAgents/graph/setup.py - -from typing import Dict, Any -from langchain_openai import ChatOpenAI -from langgraph.graph import END, StateGraph, START -from langgraph.prebuilt import ToolNode - -from tradingagents.agents import * -from tradingagents.agents.utils.agent_states import AgentState -from tradingagents.agents.utils.agent_utils import Toolkit - -from .conditional_logic import ConditionalLogic - - -class GraphSetup: - """Handles the setup and configuration of the agent graph.""" - - def __init__( - self, - quick_thinking_llm: ChatOpenAI, - deep_thinking_llm: ChatOpenAI, - toolkit: Toolkit, - tool_nodes: Dict[str, ToolNode], - bull_memory, - bear_memory, - trader_memory, - invest_judge_memory, - risk_manager_memory, - conditional_logic: ConditionalLogic, - ): - """Initialize with required components.""" - self.quick_thinking_llm = quick_thinking_llm - self.deep_thinking_llm = deep_thinking_llm - self.toolkit = toolkit - self.tool_nodes = tool_nodes - self.bull_memory = bull_memory - self.bear_memory = bear_memory - self.trader_memory = trader_memory - self.invest_judge_memory = invest_judge_memory - self.risk_manager_memory = risk_manager_memory - self.conditional_logic = conditional_logic - - def setup_graph( - self, selected_analysts=["market", "social", "news", "fundamentals"] - ): - """Set up and compile the agent workflow graph. - - Args: - selected_analysts (list): List of analyst types to include. Options are: - - "market": Market analyst - - "social": Social media analyst - - "news": News analyst - - "fundamentals": Fundamentals analyst - """ - if len(selected_analysts) == 0: - raise ValueError("Trading Agents Graph Setup Error: no analysts selected!") - - # Create analyst nodes - analyst_nodes = {} - delete_nodes = {} - tool_nodes = {} - - if "market" in selected_analysts: - analyst_nodes["market"] = create_market_analyst( - self.quick_thinking_llm, self.toolkit - ) - delete_nodes["market"] = create_msg_delete() - tool_nodes["market"] = self.tool_nodes["market"] - - if "social" in selected_analysts: - analyst_nodes["social"] = create_social_media_analyst( - self.quick_thinking_llm, self.toolkit - ) - delete_nodes["social"] = create_msg_delete() - tool_nodes["social"] = self.tool_nodes["social"] - - if "news" in selected_analysts: - analyst_nodes["news"] = create_news_analyst( - self.quick_thinking_llm, self.toolkit - ) - delete_nodes["news"] = create_msg_delete() - tool_nodes["news"] = self.tool_nodes["news"] - - if "fundamentals" in selected_analysts: - analyst_nodes["fundamentals"] = create_fundamentals_analyst( - self.quick_thinking_llm, self.toolkit - ) - delete_nodes["fundamentals"] = create_msg_delete() - tool_nodes["fundamentals"] = self.tool_nodes["fundamentals"] - - # Create researcher and manager nodes - bull_researcher_node = create_bull_researcher( - self.quick_thinking_llm, self.bull_memory - ) - bear_researcher_node = create_bear_researcher( - self.quick_thinking_llm, self.bear_memory - ) - research_manager_node = create_research_manager( - self.deep_thinking_llm, self.invest_judge_memory - ) - trader_node = create_trader(self.quick_thinking_llm, self.trader_memory) - - # Create risk analysis nodes - risky_analyst = create_risky_debator(self.quick_thinking_llm) - neutral_analyst = create_neutral_debator(self.quick_thinking_llm) - safe_analyst = create_safe_debator(self.quick_thinking_llm) - risk_manager_node = create_risk_manager( - self.deep_thinking_llm, self.risk_manager_memory - ) - - # Create workflow - workflow = StateGraph(AgentState) - - # Add analyst nodes to the graph - for analyst_type, node in analyst_nodes.items(): - workflow.add_node(f"{analyst_type.capitalize()} Analyst", node) - workflow.add_node( - f"Msg Clear {analyst_type.capitalize()}", delete_nodes[analyst_type] - ) - workflow.add_node(f"tools_{analyst_type}", tool_nodes[analyst_type]) - - # Add other nodes - workflow.add_node("Bull Researcher", bull_researcher_node) - workflow.add_node("Bear Researcher", bear_researcher_node) - workflow.add_node("Research Manager", research_manager_node) - workflow.add_node("Trader", trader_node) - workflow.add_node("Risky Analyst", risky_analyst) - workflow.add_node("Neutral Analyst", neutral_analyst) - workflow.add_node("Safe Analyst", safe_analyst) - workflow.add_node("Risk Judge", risk_manager_node) - - # Define edges - # Start with the first analyst - first_analyst = selected_analysts[0] - workflow.add_edge(START, f"{first_analyst.capitalize()} Analyst") - - # Connect analysts in sequence - for i, analyst_type in enumerate(selected_analysts): - current_analyst = f"{analyst_type.capitalize()} Analyst" - current_tools = f"tools_{analyst_type}" - current_clear = f"Msg Clear {analyst_type.capitalize()}" - - # Add conditional edges for current analyst - workflow.add_conditional_edges( - current_analyst, - getattr(self.conditional_logic, f"should_continue_{analyst_type}"), - [current_tools, current_clear], - ) - workflow.add_edge(current_tools, current_analyst) - - # Connect to next analyst or to Bull Researcher if this is the last analyst - if i < len(selected_analysts) - 1: - next_analyst = f"{selected_analysts[i+1].capitalize()} Analyst" - workflow.add_edge(current_clear, next_analyst) - else: - workflow.add_edge(current_clear, "Bull Researcher") - - # Add remaining edges - workflow.add_conditional_edges( - "Bull Researcher", - self.conditional_logic.should_continue_debate, - { - "Bear Researcher": "Bear Researcher", - "Research Manager": "Research Manager", - }, - ) - workflow.add_conditional_edges( - "Bear Researcher", - self.conditional_logic.should_continue_debate, - { - "Bull Researcher": "Bull Researcher", - "Research Manager": "Research Manager", - }, - ) - workflow.add_edge("Research Manager", "Trader") - workflow.add_edge("Trader", "Risky Analyst") - workflow.add_conditional_edges( - "Risky Analyst", - self.conditional_logic.should_continue_risk_analysis, - { - "Safe Analyst": "Safe Analyst", - "Risk Judge": "Risk Judge", - }, - ) - workflow.add_conditional_edges( - "Safe Analyst", - self.conditional_logic.should_continue_risk_analysis, - { - "Neutral Analyst": "Neutral Analyst", - "Risk Judge": "Risk Judge", - }, - ) - workflow.add_conditional_edges( - "Neutral Analyst", - self.conditional_logic.should_continue_risk_analysis, - { - "Risky Analyst": "Risky Analyst", - "Risk Judge": "Risk Judge", - }, - ) - - workflow.add_edge("Risk Judge", END) - - # Compile and return - return workflow.compile() +# TradingAgents/graph/setup.py + +from typing import Dict, Any +from langchain_openai import ChatOpenAI +from langgraph.graph import END, StateGraph, START +from langgraph.prebuilt import ToolNode + +from tradingagents.agents import * +from tradingagents.agents.utils.agent_states import AgentState +from tradingagents.agents.utils.agent_utils import Toolkit + +from .conditional_logic import ConditionalLogic + + +class GraphSetup: + """Handles the setup and configuration of the agent graph.""" + + def __init__( + self, + quick_thinking_llm: ChatOpenAI, + deep_thinking_llm: ChatOpenAI, + toolkit: Toolkit, + tool_nodes: Dict[str, ToolNode], + bull_memory, + bear_memory, + trader_memory, + invest_judge_memory, + risk_manager_memory, + conditional_logic: ConditionalLogic, + ): + """Initialize with required components.""" + self.quick_thinking_llm = quick_thinking_llm + self.deep_thinking_llm = deep_thinking_llm + self.toolkit = toolkit + self.tool_nodes = tool_nodes + self.bull_memory = bull_memory + self.bear_memory = bear_memory + self.trader_memory = trader_memory + self.invest_judge_memory = invest_judge_memory + self.risk_manager_memory = risk_manager_memory + self.conditional_logic = conditional_logic + + def setup_graph( + self, selected_analysts=["market", "social", "news", "fundamentals"] + ): + """Set up and compile the agent workflow graph. + + Args: + selected_analysts (list): List of analyst types to include. Options are: + - "market": Market analyst + - "social": Social media analyst + - "news": News analyst + - "fundamentals": Fundamentals analyst + """ + if len(selected_analysts) == 0: + raise ValueError("Trading Agents Graph Setup Error: no analysts selected!") + + # Create analyst nodes + analyst_nodes = {} + delete_nodes = {} + tool_nodes = {} + + if "market" in selected_analysts: + analyst_nodes["market"] = create_market_analyst( + self.quick_thinking_llm, self.toolkit + ) + delete_nodes["market"] = create_msg_delete() + tool_nodes["market"] = self.tool_nodes["market"] + + if "social" in selected_analysts: + analyst_nodes["social"] = create_social_media_analyst( + self.quick_thinking_llm, self.toolkit + ) + delete_nodes["social"] = create_msg_delete() + tool_nodes["social"] = self.tool_nodes["social"] + + if "news" in selected_analysts: + analyst_nodes["news"] = create_news_analyst( + self.quick_thinking_llm, self.toolkit + ) + delete_nodes["news"] = create_msg_delete() + tool_nodes["news"] = self.tool_nodes["news"] + + if "fundamentals" in selected_analysts: + analyst_nodes["fundamentals"] = create_fundamentals_analyst( + self.quick_thinking_llm, self.toolkit + ) + delete_nodes["fundamentals"] = create_msg_delete() + tool_nodes["fundamentals"] = self.tool_nodes["fundamentals"] + + # Create researcher and manager nodes + bull_researcher_node = create_bull_researcher( + self.quick_thinking_llm, self.bull_memory + ) + bear_researcher_node = create_bear_researcher( + self.quick_thinking_llm, self.bear_memory + ) + research_manager_node = create_research_manager( + self.deep_thinking_llm, self.invest_judge_memory + ) + trader_node = create_trader(self.quick_thinking_llm, self.trader_memory) + + # Create risk analysis nodes + risky_analyst = create_risky_debator(self.quick_thinking_llm) + neutral_analyst = create_neutral_debator(self.quick_thinking_llm) + safe_analyst = create_safe_debator(self.quick_thinking_llm) + risk_manager_node = create_risk_manager( + self.deep_thinking_llm, self.risk_manager_memory + ) + + # Create workflow + workflow = StateGraph(AgentState) + + # Add analyst nodes to the graph + for analyst_type, node in analyst_nodes.items(): + workflow.add_node(f"{analyst_type.capitalize()} Analyst", node) + workflow.add_node( + f"Msg Clear {analyst_type.capitalize()}", delete_nodes[analyst_type] + ) + workflow.add_node(f"tools_{analyst_type}", tool_nodes[analyst_type]) + + # Add other nodes + workflow.add_node("Bull Researcher", bull_researcher_node) + workflow.add_node("Bear Researcher", bear_researcher_node) + workflow.add_node("Research Manager", research_manager_node) + workflow.add_node("Trader", trader_node) + workflow.add_node("Risky Analyst", risky_analyst) + workflow.add_node("Neutral Analyst", neutral_analyst) + workflow.add_node("Safe Analyst", safe_analyst) + workflow.add_node("Risk Judge", risk_manager_node) + + # Define edges + # Start with the first analyst + first_analyst = selected_analysts[0] + workflow.add_edge(START, f"{first_analyst.capitalize()} Analyst") + + # Connect analysts in sequence + for i, analyst_type in enumerate(selected_analysts): + current_analyst = f"{analyst_type.capitalize()} Analyst" + current_tools = f"tools_{analyst_type}" + current_clear = f"Msg Clear {analyst_type.capitalize()}" + + # Add conditional edges for current analyst + workflow.add_conditional_edges( + current_analyst, + getattr(self.conditional_logic, f"should_continue_{analyst_type}"), + [current_tools, current_clear], + ) + workflow.add_edge(current_tools, current_analyst) + + # Connect to next analyst or to Bull Researcher if this is the last analyst + if i < len(selected_analysts) - 1: + next_analyst = f"{selected_analysts[i+1].capitalize()} Analyst" + workflow.add_edge(current_clear, next_analyst) + else: + workflow.add_edge(current_clear, "Bull Researcher") + + # Add remaining edges + workflow.add_conditional_edges( + "Bull Researcher", + self.conditional_logic.should_continue_debate, + { + "Bear Researcher": "Bear Researcher", + "Research Manager": "Research Manager", + }, + ) + workflow.add_conditional_edges( + "Bear Researcher", + self.conditional_logic.should_continue_debate, + { + "Bull Researcher": "Bull Researcher", + "Research Manager": "Research Manager", + }, + ) + workflow.add_edge("Research Manager", "Trader") + workflow.add_edge("Trader", "Risky Analyst") + workflow.add_conditional_edges( + "Risky Analyst", + self.conditional_logic.should_continue_risk_analysis, + { + "Safe Analyst": "Safe Analyst", + "Risk Judge": "Risk Judge", + }, + ) + workflow.add_conditional_edges( + "Safe Analyst", + self.conditional_logic.should_continue_risk_analysis, + { + "Neutral Analyst": "Neutral Analyst", + "Risk Judge": "Risk Judge", + }, + ) + workflow.add_conditional_edges( + "Neutral Analyst", + self.conditional_logic.should_continue_risk_analysis, + { + "Risky Analyst": "Risky Analyst", + "Risk Judge": "Risk Judge", + }, + ) + + workflow.add_edge("Risk Judge", END) + + # Compile and return + return workflow.compile() diff --git a/tradingagents/graph/signal_processing.py b/tradingagents/graph/signal_processing.py index 903e8529..d4b843e5 100644 --- a/tradingagents/graph/signal_processing.py +++ b/tradingagents/graph/signal_processing.py @@ -1,31 +1,31 @@ -# TradingAgents/graph/signal_processing.py - -from langchain_openai import ChatOpenAI - - -class SignalProcessor: - """Processes trading signals to extract actionable decisions.""" - - def __init__(self, quick_thinking_llm: ChatOpenAI): - """Initialize with an LLM for processing.""" - self.quick_thinking_llm = quick_thinking_llm - - def process_signal(self, full_signal: str) -> str: - """ - Process a full trading signal to extract the core decision. - - Args: - full_signal: Complete trading signal text - - Returns: - Extracted decision (BUY, SELL, or HOLD) - """ - messages = [ - ( - "system", - "You are an efficient assistant designed to analyze paragraphs or financial reports provided by a group of analysts. Your task is to extract the investment decision: SELL, BUY, or HOLD. Provide only the extracted decision (SELL, BUY, or HOLD) as your output, without adding any additional text or information.", - ), - ("human", full_signal), - ] - - return self.quick_thinking_llm.invoke(messages).content +# TradingAgents/graph/signal_processing.py + +from langchain_openai import ChatOpenAI + + +class SignalProcessor: + """Processes trading signals to extract actionable decisions.""" + + def __init__(self, quick_thinking_llm: ChatOpenAI): + """Initialize with an LLM for processing.""" + self.quick_thinking_llm = quick_thinking_llm + + def process_signal(self, full_signal: str) -> str: + """ + Process a full trading signal to extract the core decision. + + Args: + full_signal: Complete trading signal text + + Returns: + Extracted decision (BUY, SELL, or HOLD) + """ + messages = [ + ( + "system", + "You are an efficient assistant designed to analyze paragraphs or financial reports provided by a group of analysts. Your task is to extract the investment decision: SELL, BUY, or HOLD. Provide only the extracted decision (SELL, BUY, or HOLD) as your output, without adding any additional text or information.", + ), + ("human", full_signal), + ] + + return self.quick_thinking_llm.invoke(messages).content diff --git a/tradingagents/graph/trading_graph.py b/tradingagents/graph/trading_graph.py index bbd45071..396f96b8 100644 --- a/tradingagents/graph/trading_graph.py +++ b/tradingagents/graph/trading_graph.py @@ -1,243 +1,243 @@ -# TradingAgents/graph/trading_graph.py - -import os -from pathlib import Path -import json -from datetime import date -from typing import Dict, Any, Tuple, List, Optional - -from langchain_openai import ChatOpenAI -from langgraph.prebuilt import ToolNode - -from tradingagents.agents import * -from tradingagents.default_config import DEFAULT_CONFIG -from tradingagents.agents.utils.memory import FinancialSituationMemory -from tradingagents.agents.utils.agent_states import ( - AgentState, - InvestDebateState, - RiskDebateState, -) -from tradingagents.dataflows.interface import set_config - -from .conditional_logic import ConditionalLogic -from .setup import GraphSetup -from .propagation import Propagator -from .reflection import Reflector -from .signal_processing import SignalProcessor - - -class TradingAgentsGraph: - """Main class that orchestrates the trading agents framework.""" - - def __init__( - self, - selected_analysts=["market", "social", "news", "fundamentals"], - debug=False, - config: Dict[str, Any] = None, - ): - """Initialize the trading agents graph and components. - - Args: - selected_analysts: List of analyst types to include - debug: Whether to run in debug mode - config: Configuration dictionary. If None, uses default config - """ - self.debug = debug - self.config = config or DEFAULT_CONFIG - - # Update the interface's config - set_config(self.config) - - # Create necessary directories - os.makedirs( - os.path.join(self.config["project_dir"], "dataflows/data_cache"), - exist_ok=True, - ) - - # Initialize LLMs - self.deep_thinking_llm = ChatOpenAI(model=self.config["deep_think_llm"]) - self.quick_thinking_llm = ChatOpenAI( - model=self.config["quick_think_llm"], temperature=0.1 - ) - self.toolkit = Toolkit(config=self.config) - - # Initialize memories - self.bull_memory = FinancialSituationMemory("bull_memory") - self.bear_memory = FinancialSituationMemory("bear_memory") - self.trader_memory = FinancialSituationMemory("trader_memory") - self.invest_judge_memory = FinancialSituationMemory("invest_judge_memory") - self.risk_manager_memory = FinancialSituationMemory("risk_manager_memory") - - # Create tool nodes - self.tool_nodes = self._create_tool_nodes() - - # Initialize components - self.conditional_logic = ConditionalLogic() - self.graph_setup = GraphSetup( - self.quick_thinking_llm, - self.deep_thinking_llm, - self.toolkit, - self.tool_nodes, - self.bull_memory, - self.bear_memory, - self.trader_memory, - self.invest_judge_memory, - self.risk_manager_memory, - self.conditional_logic, - ) - - self.propagator = Propagator() - self.reflector = Reflector(self.quick_thinking_llm) - self.signal_processor = SignalProcessor(self.quick_thinking_llm) - - # State tracking - self.curr_state = None - self.ticker = None - self.log_states_dict = {} # date to full state dict - - # Set up the graph - self.graph = self.graph_setup.setup_graph(selected_analysts) - - def _create_tool_nodes(self) -> Dict[str, ToolNode]: - """Create tool nodes for different data sources.""" - return { - "market": ToolNode( - [ - # online tools - self.toolkit.get_YFin_data_online, - self.toolkit.get_stockstats_indicators_report_online, - # offline tools - self.toolkit.get_YFin_data, - self.toolkit.get_stockstats_indicators_report, - ] - ), - "social": ToolNode( - [ - # online tools - self.toolkit.get_stock_news_openai, - # offline tools - self.toolkit.get_reddit_stock_info, - ] - ), - "news": ToolNode( - [ - # online tools - self.toolkit.get_global_news_openai, - self.toolkit.get_google_news, - # offline tools - self.toolkit.get_finnhub_news, - self.toolkit.get_reddit_news, - ] - ), - "fundamentals": ToolNode( - [ - # online tools - self.toolkit.get_fundamentals_openai, - # offline tools - self.toolkit.get_finnhub_company_insider_sentiment, - self.toolkit.get_finnhub_company_insider_transactions, - self.toolkit.get_simfin_balance_sheet, - self.toolkit.get_simfin_cashflow, - self.toolkit.get_simfin_income_stmt, - ] - ), - } - - def propagate(self, company_name, trade_date): - """Run the trading agents graph for a company on a specific date.""" - - self.ticker = company_name - - # Initialize state - init_agent_state = self.propagator.create_initial_state( - company_name, trade_date - ) - args = self.propagator.get_graph_args() - - if self.debug: - # Debug mode with tracing - trace = [] - for chunk in self.graph.stream(init_agent_state, **args): - if len(chunk["messages"]) == 0: - pass - else: - chunk["messages"][-1].pretty_print() - trace.append(chunk) - - final_state = trace[-1] - else: - # Standard mode without tracing - final_state = self.graph.invoke(init_agent_state, **args) - - # Store current state for reflection - self.curr_state = final_state - - # Log state - self._log_state(trade_date, final_state) - - # Return decision and processed signal - return final_state, self.process_signal(final_state["final_trade_decision"]) - - def _log_state(self, trade_date, final_state): - """Log the final state to a JSON file.""" - self.log_states_dict[str(trade_date)] = { - "company_of_interest": final_state["company_of_interest"], - "trade_date": final_state["trade_date"], - "market_report": final_state["market_report"], - "sentiment_report": final_state["sentiment_report"], - "news_report": final_state["news_report"], - "fundamentals_report": final_state["fundamentals_report"], - "investment_debate_state": { - "bull_history": final_state["investment_debate_state"]["bull_history"], - "bear_history": final_state["investment_debate_state"]["bear_history"], - "history": final_state["investment_debate_state"]["history"], - "current_response": final_state["investment_debate_state"][ - "current_response" - ], - "judge_decision": final_state["investment_debate_state"][ - "judge_decision" - ], - }, - "trader_investment_decision": final_state["trader_investment_plan"], - "risk_debate_state": { - "risky_history": final_state["risk_debate_state"]["risky_history"], - "safe_history": final_state["risk_debate_state"]["safe_history"], - "neutral_history": final_state["risk_debate_state"]["neutral_history"], - "history": final_state["risk_debate_state"]["history"], - "judge_decision": final_state["risk_debate_state"]["judge_decision"], - }, - "investment_plan": final_state["investment_plan"], - "final_trade_decision": final_state["final_trade_decision"], - } - - # Save to file - directory = Path(f"eval_results/{self.ticker}/TradingAgentsStrategy_logs/") - directory.mkdir(parents=True, exist_ok=True) - - with open( - f"eval_results/{self.ticker}/TradingAgentsStrategy_logs/full_states_log.json", - "w", - ) as f: - json.dump(self.log_states_dict, f, indent=4) - - def reflect_and_remember(self, returns_losses): - """Reflect on decisions and update memory based on returns.""" - self.reflector.reflect_bull_researcher( - self.curr_state, returns_losses, self.bull_memory - ) - self.reflector.reflect_bear_researcher( - self.curr_state, returns_losses, self.bear_memory - ) - self.reflector.reflect_trader( - self.curr_state, returns_losses, self.trader_memory - ) - self.reflector.reflect_invest_judge( - self.curr_state, returns_losses, self.invest_judge_memory - ) - self.reflector.reflect_risk_manager( - self.curr_state, returns_losses, self.risk_manager_memory - ) - - def process_signal(self, full_signal): - """Process a signal to extract the core decision.""" - return self.signal_processor.process_signal(full_signal) +# TradingAgents/graph/trading_graph.py + +import os +from pathlib import Path +import json +from datetime import date +from typing import Dict, Any, Tuple, List, Optional + +from langchain_openai import ChatOpenAI +from langgraph.prebuilt import ToolNode + +from tradingagents.agents import * +from tradingagents.default_config import DEFAULT_CONFIG +from tradingagents.agents.utils.memory import FinancialSituationMemory +from tradingagents.agents.utils.agent_states import ( + AgentState, + InvestDebateState, + RiskDebateState, +) +from tradingagents.dataflows.interface import set_config + +from .conditional_logic import ConditionalLogic +from .setup import GraphSetup +from .propagation import Propagator +from .reflection import Reflector +from .signal_processing import SignalProcessor + + +class TradingAgentsGraph: + """Main class that orchestrates the trading agents framework.""" + + def __init__( + self, + selected_analysts=["market", "social", "news", "fundamentals"], + debug=False, + config: Dict[str, Any] = None, + ): + """Initialize the trading agents graph and components. + + Args: + selected_analysts: List of analyst types to include + debug: Whether to run in debug mode + config: Configuration dictionary. If None, uses default config + """ + self.debug = debug + self.config = config or DEFAULT_CONFIG + + # Update the interface's config + set_config(self.config) + + # Create necessary directories + os.makedirs( + os.path.join(self.config["project_dir"], "dataflows/data_cache"), + exist_ok=True, + ) + + # Initialize LLMs + self.deep_thinking_llm = ChatOpenAI(model=self.config["deep_think_llm"]) + self.quick_thinking_llm = ChatOpenAI( + model=self.config["quick_think_llm"], temperature=0.1 + ) + self.toolkit = Toolkit(config=self.config) + + # Initialize memories + self.bull_memory = FinancialSituationMemory("bull_memory") + self.bear_memory = FinancialSituationMemory("bear_memory") + self.trader_memory = FinancialSituationMemory("trader_memory") + self.invest_judge_memory = FinancialSituationMemory("invest_judge_memory") + self.risk_manager_memory = FinancialSituationMemory("risk_manager_memory") + + # Create tool nodes + self.tool_nodes = self._create_tool_nodes() + + # Initialize components + self.conditional_logic = ConditionalLogic() + self.graph_setup = GraphSetup( + self.quick_thinking_llm, + self.deep_thinking_llm, + self.toolkit, + self.tool_nodes, + self.bull_memory, + self.bear_memory, + self.trader_memory, + self.invest_judge_memory, + self.risk_manager_memory, + self.conditional_logic, + ) + + self.propagator = Propagator() + self.reflector = Reflector(self.quick_thinking_llm) + self.signal_processor = SignalProcessor(self.quick_thinking_llm) + + # State tracking + self.curr_state = None + self.ticker = None + self.log_states_dict = {} # date to full state dict + + # Set up the graph + self.graph = self.graph_setup.setup_graph(selected_analysts) + + def _create_tool_nodes(self) -> Dict[str, ToolNode]: + """Create tool nodes for different data sources.""" + return { + "market": ToolNode( + [ + # online tools + self.toolkit.get_YFin_data_online, + self.toolkit.get_stockstats_indicators_report_online, + # offline tools + self.toolkit.get_YFin_data, + self.toolkit.get_stockstats_indicators_report, + ] + ), + "social": ToolNode( + [ + # online tools + self.toolkit.get_stock_news_openai, + # offline tools + self.toolkit.get_reddit_stock_info, + ] + ), + "news": ToolNode( + [ + # online tools + self.toolkit.get_global_news_openai, + self.toolkit.get_google_news, + # offline tools + self.toolkit.get_finnhub_news, + self.toolkit.get_reddit_news, + ] + ), + "fundamentals": ToolNode( + [ + # online tools + self.toolkit.get_fundamentals_openai, + # offline tools + self.toolkit.get_finnhub_company_insider_sentiment, + self.toolkit.get_finnhub_company_insider_transactions, + self.toolkit.get_simfin_balance_sheet, + self.toolkit.get_simfin_cashflow, + self.toolkit.get_simfin_income_stmt, + ] + ), + } + + def propagate(self, company_name, trade_date): + """Run the trading agents graph for a company on a specific date.""" + + self.ticker = company_name + + # Initialize state + init_agent_state = self.propagator.create_initial_state( + company_name, trade_date + ) + args = self.propagator.get_graph_args() + + if self.debug: + # Debug mode with tracing + trace = [] + for chunk in self.graph.stream(init_agent_state, **args): + if len(chunk["messages"]) == 0: + pass + else: + chunk["messages"][-1].pretty_print() + trace.append(chunk) + + final_state = trace[-1] + else: + # Standard mode without tracing + final_state = self.graph.invoke(init_agent_state, **args) + + # Store current state for reflection + self.curr_state = final_state + + # Log state + self._log_state(trade_date, final_state) + + # Return decision and processed signal + return final_state, self.process_signal(final_state["final_trade_decision"]) + + def _log_state(self, trade_date, final_state): + """Log the final state to a JSON file.""" + self.log_states_dict[str(trade_date)] = { + "company_of_interest": final_state["company_of_interest"], + "trade_date": final_state["trade_date"], + "market_report": final_state["market_report"], + "sentiment_report": final_state["sentiment_report"], + "news_report": final_state["news_report"], + "fundamentals_report": final_state["fundamentals_report"], + "investment_debate_state": { + "bull_history": final_state["investment_debate_state"]["bull_history"], + "bear_history": final_state["investment_debate_state"]["bear_history"], + "history": final_state["investment_debate_state"]["history"], + "current_response": final_state["investment_debate_state"][ + "current_response" + ], + "judge_decision": final_state["investment_debate_state"][ + "judge_decision" + ], + }, + "trader_investment_decision": final_state["trader_investment_plan"], + "risk_debate_state": { + "risky_history": final_state["risk_debate_state"]["risky_history"], + "safe_history": final_state["risk_debate_state"]["safe_history"], + "neutral_history": final_state["risk_debate_state"]["neutral_history"], + "history": final_state["risk_debate_state"]["history"], + "judge_decision": final_state["risk_debate_state"]["judge_decision"], + }, + "investment_plan": final_state["investment_plan"], + "final_trade_decision": final_state["final_trade_decision"], + } + + # Save to file + directory = Path(f"eval_results/{self.ticker}/TradingAgentsStrategy_logs/") + directory.mkdir(parents=True, exist_ok=True) + + with open( + f"eval_results/{self.ticker}/TradingAgentsStrategy_logs/full_states_log.json", + "w", + ) as f: + json.dump(self.log_states_dict, f, indent=4) + + def reflect_and_remember(self, returns_losses): + """Reflect on decisions and update memory based on returns.""" + self.reflector.reflect_bull_researcher( + self.curr_state, returns_losses, self.bull_memory + ) + self.reflector.reflect_bear_researcher( + self.curr_state, returns_losses, self.bear_memory + ) + self.reflector.reflect_trader( + self.curr_state, returns_losses, self.trader_memory + ) + self.reflector.reflect_invest_judge( + self.curr_state, returns_losses, self.invest_judge_memory + ) + self.reflector.reflect_risk_manager( + self.curr_state, returns_losses, self.risk_manager_memory + ) + + def process_signal(self, full_signal): + """Process a signal to extract the core decision.""" + return self.signal_processor.process_signal(full_signal) From fff3166d48a4fc13eaef336570ab1084130996f4 Mon Sep 17 00:00:00 2001 From: kimheesu Date: Fri, 13 Jun 2025 09:14:05 +0900 Subject: [PATCH 07/14] [add] debug setting --- .vscode/launch.json | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..b94a3003 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Python Debugger: main.py", + "type": "debugpy", + "request": "launch", + "program": "${workspaceFolder}/main.py", + "console": "integratedTerminal" + } + ] +} \ No newline at end of file From 9ba0b349ced92f70e37da95bb37276d1a6455884 Mon Sep 17 00:00:00 2001 From: kimheesu Date: Fri, 13 Jun 2025 14:23:04 +0900 Subject: [PATCH 08/14] be,fe --- .gitignore | 124 +- README.md | 295 + docker-compose.yml | 59 + .../full_states_log.json | 27 + .../full_states_log.json | 27 + requirements.txt | 21 +- scripts/docker-commands.sh | 104 + .../NVDA-YFin-data-2010-06-12-2025-06-12.csv | 3774 +++ .../PLTR-YFin-data-2010-06-12-2025-06-12.csv | 1181 + web/backend/apps/__init__.py | 1 + web/backend/apps/authentication/__init__.py | 1 + web/backend/apps/authentication/admin.py | 86 + web/backend/apps/authentication/apps.py | 10 + .../authentication/migrations/0001_initial.py | 88 + .../authentication/migrations/__init__.py | 0 web/backend/apps/authentication/models.py | 126 + .../apps/authentication/serializers.py | 148 + web/backend/apps/authentication/signals.py | 17 + web/backend/apps/authentication/urls.py | 24 + web/backend/apps/authentication/views.py | 180 + web/backend/apps/trading_api/__init__.py | 1 + web/backend/apps/trading_api/apps.py | 7 + web/backend/apps/trading_api/services.py | 233 + web/backend/apps/trading_api/urls.py | 20 + web/backend/apps/trading_api/views.py | 212 + web/backend/apps/websocket/__init__.py | 1 + web/backend/apps/websocket/apps.py | 7 + web/backend/apps/websocket/consumers.py | 178 + web/backend/apps/websocket/routing.py | 6 + web/backend/apps/websocket/urls.py | 8 + web/backend/manage.py | 22 + web/backend/tradingagents_web/__init__.py | 1 + web/backend/tradingagents_web/asgi.py | 25 + web/backend/tradingagents_web/settings.py | 180 + web/backend/tradingagents_web/urls.py | 19 + web/backend/tradingagents_web/wsgi.py | 16 + web/frontend/.gitignore | 1 + web/frontend/package-lock.json | 21962 ++++++++++++++++ web/frontend/package.json | 47 + web/frontend/public/index.html | 20 + web/frontend/src/App.js | 96 + web/frontend/src/components/Layout/Layout.js | 262 + .../src/components/Loading/Loading.js | 56 + web/frontend/src/contexts/AuthContext.js | 282 + web/frontend/src/contexts/WebSocketContext.js | 262 + web/frontend/src/index.css | 22 + web/frontend/src/index.js | 11 + web/frontend/src/pages/Analysis/Analysis.js | 33 + web/frontend/src/pages/Dashboard/Dashboard.js | 354 + web/frontend/src/pages/History/History.js | 33 + web/frontend/src/pages/Login/Login.js | 197 + web/frontend/src/pages/Profile/Profile.js | 33 + web/frontend/src/pages/Register/Register.js | 298 + web/frontend/src/services/api.js | 174 + web/frontend/src/styles/GlobalStyle.js | 338 + web/frontend/src/styles/theme.js | 211 + 56 files changed, 31914 insertions(+), 7 deletions(-) create mode 100644 docker-compose.yml create mode 100644 eval_results/NVDA/TradingAgentsStrategy_logs/full_states_log.json create mode 100644 eval_results/PLTR/TradingAgentsStrategy_logs/full_states_log.json create mode 100644 scripts/docker-commands.sh create mode 100644 tradingagents/dataflows/data_cache/NVDA-YFin-data-2010-06-12-2025-06-12.csv create mode 100644 tradingagents/dataflows/data_cache/PLTR-YFin-data-2010-06-12-2025-06-12.csv create mode 100644 web/backend/apps/__init__.py create mode 100644 web/backend/apps/authentication/__init__.py create mode 100644 web/backend/apps/authentication/admin.py create mode 100644 web/backend/apps/authentication/apps.py create mode 100644 web/backend/apps/authentication/migrations/0001_initial.py create mode 100644 web/backend/apps/authentication/migrations/__init__.py create mode 100644 web/backend/apps/authentication/models.py create mode 100644 web/backend/apps/authentication/serializers.py create mode 100644 web/backend/apps/authentication/signals.py create mode 100644 web/backend/apps/authentication/urls.py create mode 100644 web/backend/apps/authentication/views.py create mode 100644 web/backend/apps/trading_api/__init__.py create mode 100644 web/backend/apps/trading_api/apps.py create mode 100644 web/backend/apps/trading_api/services.py create mode 100644 web/backend/apps/trading_api/urls.py create mode 100644 web/backend/apps/trading_api/views.py create mode 100644 web/backend/apps/websocket/__init__.py create mode 100644 web/backend/apps/websocket/apps.py create mode 100644 web/backend/apps/websocket/consumers.py create mode 100644 web/backend/apps/websocket/routing.py create mode 100644 web/backend/apps/websocket/urls.py create mode 100644 web/backend/manage.py create mode 100644 web/backend/tradingagents_web/__init__.py create mode 100644 web/backend/tradingagents_web/asgi.py create mode 100644 web/backend/tradingagents_web/settings.py create mode 100644 web/backend/tradingagents_web/urls.py create mode 100644 web/backend/tradingagents_web/wsgi.py create mode 100644 web/frontend/.gitignore create mode 100644 web/frontend/package-lock.json create mode 100644 web/frontend/package.json create mode 100644 web/frontend/public/index.html create mode 100644 web/frontend/src/App.js create mode 100644 web/frontend/src/components/Layout/Layout.js create mode 100644 web/frontend/src/components/Loading/Loading.js create mode 100644 web/frontend/src/contexts/AuthContext.js create mode 100644 web/frontend/src/contexts/WebSocketContext.js create mode 100644 web/frontend/src/index.css create mode 100644 web/frontend/src/index.js create mode 100644 web/frontend/src/pages/Analysis/Analysis.js create mode 100644 web/frontend/src/pages/Dashboard/Dashboard.js create mode 100644 web/frontend/src/pages/History/History.js create mode 100644 web/frontend/src/pages/Login/Login.js create mode 100644 web/frontend/src/pages/Profile/Profile.js create mode 100644 web/frontend/src/pages/Register/Register.js create mode 100644 web/frontend/src/services/api.js create mode 100644 web/frontend/src/styles/GlobalStyle.js create mode 100644 web/frontend/src/styles/theme.js diff --git a/.gitignore b/.gitignore index 688d247b..8cedebdb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,120 @@ -env/ +# ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ํŒŒ์ผ +.env +web/backend/.env +*.env +env_local.txt + +# Python __pycache__/ -.DS_Store -*.csv -src/ -eval_results/ -eval_data/ +*.py[cod] +*$py.class +*.so +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ *.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# Django +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal +/staticfiles/ +/media/ + +# Virtual Environment +venv/ +env/ +ENV/ +env.bak/ +venv.bak/ + +# IDEs +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# Node.js (React) +web/frontend/node_modules/ +web/frontend/build/ +web/frontend/dist/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Docker +docker-compose.override.yml + +# Logs +logs/ +*.log + +# Coverage reports +htmlcov/ +.coverage +.coverage.* +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Trading specific +trading_data/ +analysis_results/ +temp_files/ \ No newline at end of file diff --git a/README.md b/README.md index bbb1fe75..74d5d3c0 100644 --- a/README.md +++ b/README.md @@ -211,3 +211,298 @@ Please reference our work if you find *TradingAgents* provides you with some hel url={https://arxiv.org/abs/2412.20138}, } ``` + +# TradingAgents Web Application + +CLI ๊ธฐ๋Šฅ์„ ์›น์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” React + Django ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค. + +## ์ฃผ์š” ๊ธฐ๋Šฅ + +1. **์‚ฌ์šฉ์ž ์ธ์ฆ** + - JWT ๊ธฐ๋ฐ˜ ๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž… + - OpenAI API ํ‚ค ๊ด€๋ฆฌ (์•”ํ˜ธํ™” ์ €์žฅ) + - ๊ฐœ๋ฐœ์ž ๊ธฐ๋ณธ ํ‚ค fallback + +2. **๊ฑฐ๋ž˜ ๋ถ„์„** + - CLI์˜ ๋ชจ๋“  ๋ถ„์„ ๊ธฐ๋Šฅ์„ ์›น์—์„œ ์‚ฌ์šฉ + - ์‹ค์‹œ๊ฐ„ ๋ถ„์„ ์ง„ํ–‰ ์ƒํ™ฉ (WebSocket) + - ๋ถ„์„ ๊ธฐ๋ก ๊ด€๋ฆฌ + +3. **์‚ฌ์šฉ์ž ๊ฒฝํ—˜** + - ํ˜„๋Œ€์ ์ธ React UI (Ant Design) + - ๋ฐ˜์‘ํ˜• ๋””์ž์ธ + - ์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ + +## ๊ธฐ์ˆ  ์Šคํƒ + +### ๋ฐฑ์—”๋“œ +- **Django 4.2** - ์›น ํ”„๋ ˆ์ž„์›Œํฌ +- **Django REST Framework** - API ๊ฐœ๋ฐœ +- **Django Channels** - WebSocket ์ง€์› +- **MySQL 8.0** - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (Docker) +- **Redis 7** - WebSocket ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค (Docker) +- **JWT** - ์ธ์ฆ + +### ํ”„๋ก ํŠธ์—”๋“œ +- **React 18** - UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ +- **Ant Design** - UI ์ปดํฌ๋„ŒํŠธ +- **Styled Components** - ์Šคํƒ€์ผ๋ง +- **Axios** - HTTP ํด๋ผ์ด์–ธํŠธ +- **WebSocket** - ์‹ค์‹œ๊ฐ„ ํ†ต์‹  + +## ์„ค์น˜ ๋ฐ ์‹คํ–‰ + +### 1. ํ™˜๊ฒฝ ์„ค์ • + +```bash +# ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ ๋ฐ ํ™œ์„ฑํ™” +python -m venv venv +source venv/bin/activate # Windows: venv\Scripts\activate + +# Python ์˜์กด์„ฑ ์„ค์น˜ +pip install -r requirements.txt + +# Node.js ์˜์กด์„ฑ ์„ค์น˜ +cd web/frontend +npm install +cd ../.. +``` + +### 2. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ Redis ์„ค์ • (Docker) + +Docker์™€ Docker Compose๋ฅผ ์ด์šฉํ•ด MySQL๊ณผ Redis๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. + +```bash +# Docker ๋ฐ Docker Compose ์„ค์น˜ ํ™•์ธ +docker --version +docker-compose --version + +# ํŽธ์˜ ์Šคํฌ๋ฆฝํŠธ ์‚ฌ์šฉ (๊ถŒ์žฅ) +chmod +x scripts/docker-commands.sh +./scripts/docker-commands.sh start + +# ๋˜๋Š” ์ง์ ‘ Docker Compose ๋ช…๋ น ์‚ฌ์šฉ +docker-compose up -d mysql redis + +# phpMyAdmin๋„ ํ•จ๊ป˜ ์‹œ์ž‘ (๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ์šฉ) +./scripts/docker-commands.sh start-all + +# ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ ํ™•์ธ +./scripts/docker-commands.sh status +``` + +### 3. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ • + +`web/backend/.env` ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. `env_example.txt`๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์„ค์ •ํ•˜์„ธ์š”: + +```bash +# ์˜ˆ์‹œ ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜์—ฌ ์‹œ์ž‘ +cp web/backend/env_example.txt web/backend/.env + +# .env ํŒŒ์ผ์„ ํŽธ์ง‘ํ•˜์—ฌ ์‹ค์ œ ๊ฐ’๋“ค๋กœ ๋ณ€๊ฒฝ +nano web/backend/.env # ๋˜๋Š” ๋‹ค๋ฅธ ํ…์ŠคํŠธ ์—๋””ํ„ฐ ์‚ฌ์šฉ +``` + +์ฃผ์š” ์„ค์ •๊ฐ’๋“ค: + +```env +# Django ์„ค์ • +SECRET_KEY=your-secret-key-here-change-this-to-a-random-string +DEBUG=True +ALLOWED_HOSTS=localhost,127.0.0.1 + +# MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์ • (Docker) +DB_NAME=tradingagents_web +DB_USER=root +DB_PASSWORD=your-mysql-password-here +DB_HOST=127.0.0.1 +DB_PORT=3306 + +# Redis ์„ค์ • (Docker) +REDIS_HOST=127.0.0.1 +REDIS_PORT=6379 + +# OpenAI API ํ‚ค (๊ฐœ๋ฐœ์ž ๊ธฐ๋ณธ ํ‚ค) +OPENAI_API_KEY=your-openai-api-key-here +``` + +### 4. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ + +```bash +cd web/backend +python manage.py makemigrations +python manage.py migrate +python manage.py createsuperuser # ๊ด€๋ฆฌ์ž ๊ณ„์ • ์ƒ์„ฑ +``` + +### 5. ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰ + +**ํ„ฐ๋ฏธ๋„ 1 - Docker ์ปจํ…Œ์ด๋„ˆ (MySQL + Redis):** +```bash +# ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰ +docker-compose up -d mysql redis + +# ๋˜๋Š” ํฌ๊ทธ๋ผ์šด๋“œ์—์„œ ๋กœ๊ทธ ํ™•์ธ +docker-compose up mysql redis +``` + +**ํ„ฐ๋ฏธ๋„ 2 - Django ๋ฐฑ์—”๋“œ:** +```bash +cd web/backend +python manage.py runserver +``` + +**ํ„ฐ๋ฏธ๋„ 3 - React ํ”„๋ก ํŠธ์—”๋“œ:** +```bash +cd web/frontend +npm start +``` + +## ์ ‘์† ์ •๋ณด + +- **ํ”„๋ก ํŠธ์—”๋“œ**: http://localhost:3000 +- **๋ฐฑ์—”๋“œ API**: http://localhost:8000 +- **Django Admin**: http://localhost:8000/admin +- **phpMyAdmin** (์„ ํƒ์‚ฌํ•ญ): http://localhost:8080 + +## API ์—”๋“œํฌ์ธํŠธ + +### ์ธ์ฆ +- `POST /api/auth/register/` - ํšŒ์›๊ฐ€์ž… +- `POST /api/auth/login/` - ๋กœ๊ทธ์ธ +- `GET /api/auth/user/` - ์‚ฌ์šฉ์ž ์ •๋ณด +- `PUT /api/auth/profile/` - ํ”„๋กœํ•„ ์ˆ˜์ • +- `POST /api/auth/check-api-key/` - API ํ‚ค ๊ฒ€์ฆ + +### ๊ฑฐ๋ž˜ ๋ถ„์„ +- `GET /api/trading/config/` - ๋ถ„์„ ์„ค์ • ์ •๋ณด +- `POST /api/trading/start/` - ๋ถ„์„ ์‹œ์ž‘ +- `GET /api/trading/status/{id}/` - ๋ถ„์„ ์ƒํƒœ ์กฐํšŒ +- `GET /api/trading/history/` - ๋ถ„์„ ๊ธฐ๋ก +- `GET /api/trading/report/{id}/` - ๋ถ„์„ ๋ณด๊ณ ์„œ + +### WebSocket +- `ws://localhost:8000/ws/trading-analysis/` - ์‹ค์‹œ๊ฐ„ ๋ถ„์„ ์—…๋ฐ์ดํŠธ + +## OpenAI API ํ‚ค ๊ด€๋ฆฌ + +1. **์‚ฌ์šฉ์ž ๊ฐœ๋ณ„ ํ‚ค**: ์‚ฌ์šฉ์ž๊ฐ€ ํ”„๋กœํ•„์—์„œ ์„ค์ •ํ•œ ๊ฐœ์ธ OpenAI API ํ‚ค +2. **๊ฐœ๋ฐœ์ž ๊ธฐ๋ณธ ํ‚ค**: `.env` ํŒŒ์ผ์˜ `OPENAI_API_KEY` (์‚ฌ์šฉ์ž ํ‚ค๊ฐ€ ์—†์„ ๋•Œ ์‚ฌ์šฉ) +3. **๋ณด์•ˆ**: ์‚ฌ์šฉ์ž ํ‚ค๋Š” ์•”ํ˜ธํ™”๋˜์–ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ + +## ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ + +``` +โ”œโ”€โ”€ cli/ # ๊ธฐ์กด CLI ์ฝ”๋“œ +โ”œโ”€โ”€ web/ +โ”‚ โ”œโ”€โ”€ backend/ # Django ๋ฐฑ์—”๋“œ +โ”‚ โ”‚ โ”œโ”€โ”€ tradingagents_web/ # ํ”„๋กœ์ ํŠธ ์„ค์ • +โ”‚ โ”‚ โ””โ”€โ”€ apps/ # Django ์•ฑ๋“ค +โ”‚ โ”‚ โ”œโ”€โ”€ authentication/ # ์‚ฌ์šฉ์ž ์ธ์ฆ +โ”‚ โ”‚ โ”œโ”€โ”€ trading_api/ # ๊ฑฐ๋ž˜ ๋ถ„์„ API +โ”‚ โ”‚ โ””โ”€โ”€ websocket/ # WebSocket ์ฒ˜๋ฆฌ +โ”‚ โ””โ”€โ”€ frontend/ # React ํ”„๋ก ํŠธ์—”๋“œ +โ”‚ โ”œโ”€โ”€ public/ +โ”‚ โ””โ”€โ”€ src/ +โ”‚ โ”œโ”€โ”€ components/ # ์žฌ์‚ฌ์šฉ ์ปดํฌ๋„ŒํŠธ +โ”‚ โ”œโ”€โ”€ contexts/ # React Context +โ”‚ โ”œโ”€โ”€ pages/ # ํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ +โ”‚ โ”œโ”€โ”€ services/ # API ์„œ๋น„์Šค +โ”‚ โ””โ”€โ”€ styles/ # ์Šคํƒ€์ผ ๊ด€๋ จ +โ””โ”€โ”€ requirements.txt # Python ์˜์กด์„ฑ +``` + +## ๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ + +### ์ƒˆ๋กœ์šด ๋ถ„์„ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ + +1. `apps/trading_api/services.py`์— ์ƒˆ๋กœ์šด ์„œ๋น„์Šค ์ถ”๊ฐ€ +2. `apps/trading_api/views.py`์— ์ƒˆ๋กœ์šด ๋ทฐ ์ถ”๊ฐ€ +3. `apps/trading_api/urls.py`์— URL ํŒจํ„ด ์ถ”๊ฐ€ +4. ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ํ•ด๋‹น API ํ˜ธ์ถœ + +### ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€ ์ถ”๊ฐ€ + +1. `src/pages/` ๋””๋ ‰ํ† ๋ฆฌ์— ์ƒˆ ํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ +2. `src/App.js`์— ๋ผ์šฐํŠธ ์ถ”๊ฐ€ +3. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ ˆ์ด์•„์›ƒ์˜ ๋ฉ”๋‰ด์— ์ถ”๊ฐ€ + +## ๋ฐฐํฌ + +### Docker Compose (๊ถŒ์žฅ) + +```bash +# ๋ชจ๋“  ์„œ๋น„์Šค๋ฅผ ํ•œ ๋ฒˆ์— ์‹œ์ž‘ (๊ฐœ๋ฐœ ํ™˜๊ฒฝ) +docker-compose up -d + +# ํŠน์ • ์„œ๋น„์Šค๋งŒ ์‹œ์ž‘ +docker-compose up -d mysql redis + +# ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ณ„๋„์˜ docker-compose.prod.yml ์‚ฌ์šฉ ๊ถŒ์žฅ +docker-compose -f docker-compose.prod.yml up -d +``` + +### ์ˆ˜๋™ ๋ฐฐํฌ + +1. **ํ”„๋ก ํŠธ์—”๋“œ ๋นŒ๋“œ**: + ```bash + cd web/frontend + npm run build + ``` + +2. **Django ์ •์  ํŒŒ์ผ ์ˆ˜์ง‘**: + ```bash + cd web/backend + python manage.py collectstatic + ``` + +3. **ํ”„๋กœ๋•์…˜ ์„œ๋ฒ„ ์„ค์ •** (Nginx + Gunicorn + Daphne) + +## ๋ฌธ์ œ ํ•ด๊ฒฐ + +### ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ + +1. **Docker ์ปจํ…Œ์ด๋„ˆ ๊ด€๋ จ** + ```bash + # ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ ํ™•์ธ + docker-compose ps + + # ์ปจํ…Œ์ด๋„ˆ ๋กœ๊ทธ ํ™•์ธ + docker-compose logs mysql + docker-compose logs redis + + # ์ปจํ…Œ์ด๋„ˆ ์žฌ์‹œ์ž‘ + docker-compose restart mysql redis + ``` + +2. **WebSocket ์—ฐ๊ฒฐ ์‹คํŒจ** + - Redis ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธ: `docker-compose ps` + - ๋ฐฉํ™”๋ฒฝ ์„ค์ • ํ™•์ธ + +3. **API ํ‚ค ๊ด€๋ จ ์˜ค๋ฅ˜** + - `.env` ํŒŒ์ผ์˜ `OPENAI_API_KEY` ํ™•์ธ + - ์‚ฌ์šฉ์ž ํ”„๋กœํ•„์—์„œ API ํ‚ค ์žฌ์„ค์ • + +4. **๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์˜ค๋ฅ˜** + - MySQL ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ ํ™•์ธ: `docker-compose logs mysql` + - `.env` ํŒŒ์ผ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ •๋ณด ํ™•์ธ + - ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ ์ถฉ๋Œ ํ™•์ธ: `docker port tradingagents_mysql` + +5. **MySQL ์ปจํ…Œ์ด๋„ˆ ์ดˆ๊ธฐํ™” ๋ฌธ์ œ** + ```bash + # ๋ณผ๋ฅจ ์‚ญ์ œ ํ›„ ์žฌ์‹œ์ž‘ (๋ฐ์ดํ„ฐ ์†์‹ค ์ฃผ์˜!) + docker-compose down -v + docker-compose up -d mysql redis + ``` + +## ๋ผ์ด์„ ์Šค + +์ด ํ”„๋กœ์ ํŠธ๋Š” ๊ธฐ์กด TradingAgents ํ”„๋กœ์ ํŠธ์˜ ๋ผ์ด์„ ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. + +## ๊ธฐ์—ฌ + +1. Fork the Project +2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`) +3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`) +4. Push to the Branch (`git push origin feature/AmazingFeature`) +5. Open a Pull Request diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..1988b48f --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,59 @@ +version: '3.8' + +services: + mysql: + image: mysql:8.0 + container_name: tradingagents_mysql + restart: unless-stopped + environment: + MYSQL_ROOT_PASSWORD: ${DB_PASSWORD:-password} + MYSQL_DATABASE: ${DB_NAME:-tradingagents_db} + MYSQL_USER: ${DB_USER:-tradinguser} + MYSQL_PASSWORD: ${DB_PASSWORD:-password} + ports: + - "3306:3306" + volumes: + - /home/hskim/mysql_data:/var/lib/mysql + - /home/hskim/docker/mysql/init:/docker-entrypoint-initdb.d + command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci + networks: + - tradingagents_network + + redis: + image: redis:7-alpine + container_name: tradingagents_redis + restart: unless-stopped + ports: + - "6379:6379" + volumes: + - redis_data:/data + command: redis-server --appendonly yes + networks: + - tradingagents_network + + # ๊ฐœ๋ฐœ์šฉ phpMyAdmin (์„ ํƒ์‚ฌํ•ญ) +# phpmyadmin: +# image: phpmyadmin/phpmyadmin +# container_name: tradingagents_phpmyadmin +# restart: unless-stopped +# environment: +# PMA_HOST: mysql +# PMA_PORT: 3306 +# PMA_USER: root +# PMA_PASSWORD: ${DB_PASSWORD:-password} +# ports: +# - "8080:80" +# depends_on: +# - mysql +# networks: +# - tradingagents_network + +volumes: + mysql_data: + driver: local + redis_data: + driver: local + +networks: + tradingagents_network: + driver: bridge \ No newline at end of file diff --git a/eval_results/NVDA/TradingAgentsStrategy_logs/full_states_log.json b/eval_results/NVDA/TradingAgentsStrategy_logs/full_states_log.json new file mode 100644 index 00000000..e50d5f0d --- /dev/null +++ b/eval_results/NVDA/TradingAgentsStrategy_logs/full_states_log.json @@ -0,0 +1,27 @@ +{ + "2025-06-12": { + "company_of_interest": "NVDA", + "trade_date": "2025-06-12", + "market_report": "FINAL TRANSACTION PROPOSAL: **HOLD**\n\nHere's a detailed analysis of NVDA based on the selected indicators:\n\n**Trend Analysis:**\n\n* **Close Price:** The closing price of NVDA on June 11, 2025, is $142.83.\n* **50 SMA:** The 50-day SMA is at $120.40 on June 11, 2025, indicating that the current price is well above its medium-term average, suggesting an upward trend.\n* **200 SMA:** The 200-day SMA is at $127.46 on June 11, 2025. The price being above this long-term average further confirms a long-term bullish trend.\n* **10 EMA:** The 10-day EMA is at $140.37 on June 11, 2025, which is very close to the current price, reflecting the recent price action.\n\n**Momentum:**\n\n* **MACD:** The MACD value is 6.12 on June 11, 2025, and the MACD signal line is 6.21. The MACD line is below the signal line, which indicates a potential decrease in bullish momentum, or a possible bearish crossover.\n* **RSI:** The RSI is at 66.99 on June 11, 2025. This value is below the overbought threshold of 70, suggesting that the stock is not currently overbought, but is approaching overbought conditions.\n\n**Volatility:**\n\n* **ATR:** The ATR is 4.34 on June 11, 2025, indicating the average true range of price fluctuations. This can be used to set stop-loss levels, reflecting the stock's volatility.\n\n**Volume:**\n\n* **VWMA:** The Volume Weighted Moving Average is at 138.42 on June 11, 2025, confirming the upward trend when considering volume.\n\n**Synthesis:**\n\nNVDA is in a confirmed uptrend, as the price is trading above both its 50-day and 200-day SMAs. The 10 EMA also supports this short-term upward momentum. However, the MACD indicates a possible decrease in bullish momentum as the MACD line is below the signal line. The RSI is approaching overbought territory, suggesting caution. The ATR indicates moderate volatility.\n\n**Trading Recommendation:**\n\nGiven the uptrend, but with signs of weakening momentum, a **HOLD** position is recommended. Traders should closely monitor the MACD for a bearish crossover and the RSI as it approaches overbought levels. If the MACD crosses bearishly and the RSI exceeds 70, consider taking profit or tightening stop-loss levels.\n\n| Indicator | Value (2025-06-11) | Trend/Signal ", + "sentiment_report": "FINAL TRANSACTION PROPOSAL: **HOLD**\n\nHere's a summary of my analysis of NVDA from June 5, 2025, to June 12, 2025:\n\n**Overall Sentiment:** Bullish with a strong undercurrent of caution.\n\n**Key Positives:**\n\n* **AI Dominance:** NVDA is perceived as a leader in AI, with strong demand for its chips.\n* **Strong Financials:** Recent Q1 fiscal 2026 results showed significant revenue growth.\n* **Bullish Options Activity:** High call option buying suggests bullish sentiment.\n\n**Key Negatives/Cautions:**\n\n* **Overvaluation Concerns:** Some analysts and investors believe the stock is \"overpriced\" or \"too hot.\"\n* **Potential Pullbacks:** Anticipation of short-term price corrections or consolidations.\n* **Insider Selling:** A director's sale of a significant number of shares created some cautious sentiment.\n\n**News Highlights:**\n\n* Presentations at major technology conferences.\n* Partnerships to enhance AI safety and security.\n* Strong Q1 fiscal 2026 financial results.\n* Director's stock sale.\n\n**Implications for Traders:**\n\n* **Long-Term Investors:** Should likely hold NVDA, given its strong position in the AI sector.\n* **Short-Term Traders:** Should be cautious due to potential volatility and overvaluation concerns. Consider setting stop-loss orders to manage risk. Look for potential dips to buy.\n\n**Markdown Table Summary:**\n\n| Category | Sentiment/Insight |\n| ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |\n| AI Dominance | Strong positive sentiment due to NVDA's leadership in AI and high demand for its chips. |\n| Valuation | Mixed sentiment; concerns about overvaluation and potential for pullbacks. |\n| Financials | Positive sentiment driven by strong Q1 fiscal 2026 results. |\n| Insider Activity | Negative sentiment due to a director's stock sale, raising concerns about the company's future prospects (though potentially personal planning). |\n| Options Activity | Bullish sentiment indicated by high call option buying, but also suggests potential volatility. |\n| Overall Outlook | Bullish long-term, but cautious short-term. |", + "news_report": "Nvidia (NVDA) is currently experiencing a dynamic period marked by both significant growth opportunities and potential challenges. Recent news highlights several key trends:\n\n**Positive Developments:**\n\n* **AI Leadership and Innovation:** NVDA is solidifying its dominance in the AI space through strategic partnerships and technological advancements. Collaborations with HPE in Germany to build supercomputers, partnerships with European nations to enhance AI infrastructure, and alliances with companies like Novo Nordisk for drug discovery showcase NVDA's expanding influence across various sectors. The launch of Europe's fastest supercomputer, JUPITER, powered by NVDA's Grace Hopper platform, further underscores its technological prowess.\n* **European Expansion:** NVDA is making significant strides in Europe, establishing AI factories and cloud services. These initiatives aim to modernize manufacturing and accelerate AI development in the region. CEO Jensen Huang's commitment to increasing investment in the UK's AI sector and partnerships with European model builders and cloud providers demonstrate a strong focus on European markets.\n* **Market Dominance and Financial Performance:** NVDA has, at times, reclaimed its position as the world's most valuable company, surpassing Microsoft. Analysts are generally bullish, citing AI strength and the potential upside from the Blackwell chip. Strong Q1 earnings and revenue growth reinforce the company's financial stability and market leadership.\n* **Quantum Computing Potential:** NVDA's CEO Jensen Huang has highlighted the potential of quantum computing, suggesting it is reaching an inflection point. This indicates a possible new revenue stream for NVDA in the future.\n* **Automotive Sector Growth:** NVDA is bullish on its auto chip business, identifying it as a key driver for future growth.\n\n**Challenges and Concerns:**\n\n* **China Market Uncertainty:** NVDA faces challenges in the Chinese market due to U.S. government restrictions. While there were reports of NVDA preparing to re-enter China with a new B40 chip, the company has denied these claims, stating that it is still evaluating the situation. Export curbs are expected to impact Q2 sales, potentially reducing revenue by $8 billion.\n* **Insider Selling:** Several NVDA directors, including Mark Stevens and Robert Burgess, have sold substantial amounts of stock, raising concerns among some investors.\n* **Competition:** NVDA faces increasing competition in the AI chip market, particularly from China's Huawei.\n* **Valuation Concerns:** Some analysts suggest that NVDA's stock rally may be overextended, and the stock could be overvalued. A few analysts have downgraded the stock to \"Hold\" due to concerns about near-term AI spending outlook and potential inventory write-offs.\n* **Data Center Project Delays:** NVDA is experiencing delays in building a data center in the UAE, which could impact AI development efforts in the region.\n\n**Overall Sentiment:**\n\nThe overall sentiment surrounding NVDA is largely positive, driven by its strong position in the AI market, strategic partnerships, and expansion into new sectors and geographies. However, investors should be aware of the challenges related to the Chinese market, increasing competition, and potential valuation concerns.\n\n**Key Points Summary Table:**\n\n| Category | Key Points that NVDA is a strong buy.\n\nGiven the mixed signals, I recommend a **HOLD** position. The company has strong fundamentals and growth prospects, but the challenges in China and insider selling warrant caution.", + "fundamentals_report": "I am unable to provide a comprehensive report of NVDA's fundamental information from 2025-05-12 to 2025-06-12 because the information is in the future. However, I can provide the most recent fundamental analysis data and discussions for NVIDIA (NVDA) up to today, June 12, 2025.", + "investment_debate_state": { + "bull_history": "\nBull Analyst: Okay, let's address the \"HOLD\" recommendation on NVDA. I understand the cautious stance, especially given the mixed signals we're seeing. However, I believe a closer look reveals that the bullish arguments outweigh the concerns, and a \"BUY\" recommendation is more appropriate.\n\nYou've correctly pointed out the uptrend confirmed by the 50-day and 200-day SMAs, and the 10-day EMA supporting short-term momentum. However, you're placing too much emphasis on the MACD potentially signaling a decrease in bullish momentum and the RSI approaching overbought territory. While these are valid points to monitor, they are lagging indicators and shouldn't overshadow the fundamental drivers of NVDA's growth.\n\n**Let's talk about the \"overvaluation\" concern.** Yes, NVDA's stock has seen significant gains, but is it truly *over*valued? I argue no, because the market is pricing in future growth based on NVDA's dominance in the exploding AI market. The demand for their chips is not just hype; it's driven by real-world applications across diverse sectors, from healthcare (Novo Nordisk partnership for drug discovery) to automotive. The Blackwell chip, as analysts note, offers significant upside potential. To call it \"overvalued\" is to underestimate the transformative power of AI and NVDA's central role in it. We need to consider future earnings potential, not just current multiples.\n\n**Now, about the insider selling.** I acknowledge that director stock sales can create negative sentiment. However, attributing this solely to a lack of confidence in the company is an oversimplification. Directors often sell shares for personal financial planning reasons \u2013 diversification, tax obligations, estate planning, etc. Without knowing the specific motivations behind these sales, it's premature to interpret them as a bearish signal. Furthermore, the sheer volume of shares traded daily in NVDA makes these sales a relatively small percentage of overall activity.\n\n**The China market uncertainty is a valid concern,** and the potential $8 billion revenue impact from export curbs is significant. However, NVDA is actively working to mitigate this by exploring compliant solutions and diversifying its market reach. Their expansion in Europe, with AI factories and cloud services, demonstrates a proactive approach to capturing new growth opportunities. The partnerships with HPE in Germany and other European nations are not just symbolic; they represent a strategic shift towards a less China-dependent future.\n\n**Regarding competition, particularly from Huawei,** it's crucial to remember that NVDA has a significant technological lead and a well-established ecosystem. While competition is always a factor, NVDA's R&D investments and its strong relationships with key players in the AI industry provide a substantial competitive advantage. They aren't standing still; they are constantly innovating and pushing the boundaries of AI technology.\n\n**Finally, the \"HOLD\" recommendation based on the technical indicators alone is too conservative.** The VWMA confirms the upward trend when considering volume, which is a strong signal. The fact that the price is trading well above both its 50-day and 200-day SMAs is a powerful indicator of sustained bullish momentum. While monitoring the MACD and RSI is prudent, they shouldn't be the sole determinants of our investment decision.\n\n**In conclusion,** while acknowledging the potential risks and uncertainties, I believe NVDA's strong fundamentals, its dominant position in the AI market, and its proactive approach to mitigating challenges warrant a \"BUY\" recommendation. The long-term growth potential far outweighs the short-term concerns. We should be focusing on the forest, not just the trees. Let's not miss out on this opportunity by being overly cautious.", + "bear_history": "\nBear Analyst: Okay, I appreciate your enthusiasm for NVDA, but I think you're painting an overly optimistic picture. While I agree that NVDA has a strong position in the AI market, I believe the risks are being downplayed, and a \"BUY\" recommendation is premature. Let's dissect your arguments.\n\nYou say I'm placing too much emphasis on the MACD and RSI. You call them lagging indicators, but that's precisely *why* they're important. They confirm the *strength* of the trend. The MACD signal line being *above* the MACD line suggests that the bullish momentum is *waning*. Ignoring this because of the \"fundamental drivers\" is like driving a car at full speed while ignoring the flashing red warning light on your dashboard. Yes, the engine might be powerful, but something is clearly amiss. The RSI approaching overbought territory further reinforces this caution. It suggests the stock is becoming increasingly sensitive to negative news or a market correction.\n\nNow, about the \"overvaluation\" concern. You argue that the market is pricing in future growth. But how much future growth is *already* priced in? That's the crucial question. The market can be irrational, and hype can drive valuations far beyond what's justifiable. While NVDA's partnerships are impressive, they don't guarantee sustained, exponential growth. The Blackwell chip's potential is just that \u2013 potential. It's not a guaranteed home run. We've seen companies with promising technologies fail to deliver on their promises before. Remember the dot-com bubble? Future earnings potential is important, but it needs to be grounded in reality, not just wishful thinking.\n\nRegarding insider selling, you dismiss it as potentially due to \"personal financial planning.\" While that's possible, it's also convenient. Directors have access to information we don't. To completely disregard their actions as meaningless is naive. Yes, the volume of shares traded daily is high, but insider selling, *especially by multiple directors*, should raise a red flag. It suggests that those with the most intimate knowledge of the company's prospects might be hedging their bets. We can't ignore this.\n\nThe China market uncertainty is, as you admit, a valid concern. But you downplay the potential impact by highlighting NVDA's diversification efforts in Europe. While these efforts are commendable, they are unlikely to fully offset the potential loss of $8 billion in revenue. Building AI factories and cloud services in Europe takes time and investment. It's not an immediate solution. Furthermore, relying heavily on Europe exposes NVDA to new geopolitical risks and economic uncertainties.\n\nYou also mention NVDA's technological lead over competitors like Huawei. While NVDA currently holds an advantage, technological leadership is not a static concept. Huawei is a formidable competitor with significant resources and government support. To assume that NVDA will maintain its dominance indefinitely is complacent. Competition is intensifying, and NVDA will need to constantly innovate to stay ahead. This requires significant R&D investment, which can strain profitability.\n\nFinally, you criticize the \"HOLD\" recommendation as being too conservative based on technical indicators alone. But I'm not relying solely on technical indicators. I'm using them to *confirm* the concerns raised by the fundamental challenges NVDA faces. The VWMA confirming the upward trend is less compelling when the MACD is signaling weakening momentum and the RSI is approaching overbought territory. It suggests that the upward trend might be losing steam.\n\nIn conclusion, while NVDA has undeniable strengths, the risks are significant and should not be ignored. The potential for overvaluation, the uncertainty surrounding the China market, the intensifying competition, and the concerning insider selling all warrant caution. A \"HOLD\" recommendation is not about being overly conservative; it's about being prudent and acknowledging the potential downsides. Let's not get caught up in the hype and overestimate NVDA's future prospects. It's better to be cautious and potentially miss out on some gains than to be overly optimistic and suffer significant losses.\n\n**Reflecting on past mistakes,** I've learned that it's crucial to avoid confirmation bias and to critically evaluate all available information, even if it contradicts my initial assumptions. In the past, I've been too quick to jump on the bandwagon of popular stocks, only to be burned when the market corrected. This time, I'm taking a more measured approach and focusing on the potential risks as well as the potential rewards.", + "history": "\nBull Analyst: Okay, let's address the \"HOLD\" recommendation on NVDA. I understand the cautious stance, especially given the mixed signals we're seeing. However, I believe a closer look reveals that the bullish arguments outweigh the concerns, and a \"BUY\" recommendation is more appropriate.\n\nYou've correctly pointed out the uptrend confirmed by the 50-day and 200-day SMAs, and the 10-day EMA supporting short-term momentum. However, you're placing too much emphasis on the MACD potentially signaling a decrease in bullish momentum and the RSI approaching overbought territory. While these are valid points to monitor, they are lagging indicators and shouldn't overshadow the fundamental drivers of NVDA's growth.\n\n**Let's talk about the \"overvaluation\" concern.** Yes, NVDA's stock has seen significant gains, but is it truly *over*valued? I argue no, because the market is pricing in future growth based on NVDA's dominance in the exploding AI market. The demand for their chips is not just hype; it's driven by real-world applications across diverse sectors, from healthcare (Novo Nordisk partnership for drug discovery) to automotive. The Blackwell chip, as analysts note, offers significant upside potential. To call it \"overvalued\" is to underestimate the transformative power of AI and NVDA's central role in it. We need to consider future earnings potential, not just current multiples.\n\n**Now, about the insider selling.** I acknowledge that director stock sales can create negative sentiment. However, attributing this solely to a lack of confidence in the company is an oversimplification. Directors often sell shares for personal financial planning reasons \u2013 diversification, tax obligations, estate planning, etc. Without knowing the specific motivations behind these sales, it's premature to interpret them as a bearish signal. Furthermore, the sheer volume of shares traded daily in NVDA makes these sales a relatively small percentage of overall activity.\n\n**The China market uncertainty is a valid concern,** and the potential $8 billion revenue impact from export curbs is significant. However, NVDA is actively working to mitigate this by exploring compliant solutions and diversifying its market reach. Their expansion in Europe, with AI factories and cloud services, demonstrates a proactive approach to capturing new growth opportunities. The partnerships with HPE in Germany and other European nations are not just symbolic; they represent a strategic shift towards a less China-dependent future.\n\n**Regarding competition, particularly from Huawei,** it's crucial to remember that NVDA has a significant technological lead and a well-established ecosystem. While competition is always a factor, NVDA's R&D investments and its strong relationships with key players in the AI industry provide a substantial competitive advantage. They aren't standing still; they are constantly innovating and pushing the boundaries of AI technology.\n\n**Finally, the \"HOLD\" recommendation based on the technical indicators alone is too conservative.** The VWMA confirms the upward trend when considering volume, which is a strong signal. The fact that the price is trading well above both its 50-day and 200-day SMAs is a powerful indicator of sustained bullish momentum. While monitoring the MACD and RSI is prudent, they shouldn't be the sole determinants of our investment decision.\n\n**In conclusion,** while acknowledging the potential risks and uncertainties, I believe NVDA's strong fundamentals, its dominant position in the AI market, and its proactive approach to mitigating challenges warrant a \"BUY\" recommendation. The long-term growth potential far outweighs the short-term concerns. We should be focusing on the forest, not just the trees. Let's not miss out on this opportunity by being overly cautious.\nBear Analyst: Okay, I appreciate your enthusiasm for NVDA, but I think you're painting an overly optimistic picture. While I agree that NVDA has a strong position in the AI market, I believe the risks are being downplayed, and a \"BUY\" recommendation is premature. Let's dissect your arguments.\n\nYou say I'm placing too much emphasis on the MACD and RSI. You call them lagging indicators, but that's precisely *why* they're important. They confirm the *strength* of the trend. The MACD signal line being *above* the MACD line suggests that the bullish momentum is *waning*. Ignoring this because of the \"fundamental drivers\" is like driving a car at full speed while ignoring the flashing red warning light on your dashboard. Yes, the engine might be powerful, but something is clearly amiss. The RSI approaching overbought territory further reinforces this caution. It suggests the stock is becoming increasingly sensitive to negative news or a market correction.\n\nNow, about the \"overvaluation\" concern. You argue that the market is pricing in future growth. But how much future growth is *already* priced in? That's the crucial question. The market can be irrational, and hype can drive valuations far beyond what's justifiable. While NVDA's partnerships are impressive, they don't guarantee sustained, exponential growth. The Blackwell chip's potential is just that \u2013 potential. It's not a guaranteed home run. We've seen companies with promising technologies fail to deliver on their promises before. Remember the dot-com bubble? Future earnings potential is important, but it needs to be grounded in reality, not just wishful thinking.\n\nRegarding insider selling, you dismiss it as potentially due to \"personal financial planning.\" While that's possible, it's also convenient. Directors have access to information we don't. To completely disregard their actions as meaningless is naive. Yes, the volume of shares traded daily is high, but insider selling, *especially by multiple directors*, should raise a red flag. It suggests that those with the most intimate knowledge of the company's prospects might be hedging their bets. We can't ignore this.\n\nThe China market uncertainty is, as you admit, a valid concern. But you downplay the potential impact by highlighting NVDA's diversification efforts in Europe. While these efforts are commendable, they are unlikely to fully offset the potential loss of $8 billion in revenue. Building AI factories and cloud services in Europe takes time and investment. It's not an immediate solution. Furthermore, relying heavily on Europe exposes NVDA to new geopolitical risks and economic uncertainties.\n\nYou also mention NVDA's technological lead over competitors like Huawei. While NVDA currently holds an advantage, technological leadership is not a static concept. Huawei is a formidable competitor with significant resources and government support. To assume that NVDA will maintain its dominance indefinitely is complacent. Competition is intensifying, and NVDA will need to constantly innovate to stay ahead. This requires significant R&D investment, which can strain profitability.\n\nFinally, you criticize the \"HOLD\" recommendation as being too conservative based on technical indicators alone. But I'm not relying solely on technical indicators. I'm using them to *confirm* the concerns raised by the fundamental challenges NVDA faces. The VWMA confirming the upward trend is less compelling when the MACD is signaling weakening momentum and the RSI is approaching overbought territory. It suggests that the upward trend might be losing steam.\n\nIn conclusion, while NVDA has undeniable strengths, the risks are significant and should not be ignored. The potential for overvaluation, the uncertainty surrounding the China market, the intensifying competition, and the concerning insider selling all warrant caution. A \"HOLD\" recommendation is not about being overly conservative; it's about being prudent and acknowledging the potential downsides. Let's not get caught up in the hype and overestimate NVDA's future prospects. It's better to be cautious and potentially miss out on some gains than to be overly optimistic and suffer significant losses.\n\n**Reflecting on past mistakes,** I've learned that it's crucial to avoid confirmation bias and to critically evaluate all available information, even if it contradicts my initial assumptions. In the past, I've been too quick to jump on the bandwagon of popular stocks, only to be burned when the market corrected. This time, I'm taking a more measured approach and focusing on the potential risks as well as the potential rewards.", + "current_response": "Alright team, let's cut through the noise and make a definitive call on NVDA. As your portfolio manager, my job is to critically weigh these arguments, learn from our past tendencies, and put forward an actionable plan.\n\nFirst off, I want to commend both analysts for a solid round. You both presented compelling points, but as always, we need to decide where the weight of the evidence truly lies.\n\n**Let's summarize the key points:**\n\nThe **Bull Analyst** paints a very compelling picture of NVDA's future. They rightly emphasize NVDA's undeniable dominance in the exploding AI market, driven by real-world applications and the significant upside potential of new technologies like the Blackwell chip. Their argument is that current valuations are simply pricing in this immense future growth, and dismissing technical \"lagging indicators\" like MACD and RSI shouldn't overshadow these fundamental drivers. They also downplay insider selling as personal financial planning and highlight NVDA's proactive diversification into Europe to mitigate China risks, along with its enduring competitive advantage.\n\nOn the other hand, the **Bear Analyst** brings a much-needed dose of caution, and frankly, a more immediate, actionable perspective. They argue that those \"lagging indicators\" like the MACD (signal line *above* the MACD line, indicating *waning* bullish momentum) and RSI approaching overbought territory are precisely what we need to pay attention to. They confirm that the powerful engine might be showing signs of overheating or losing steam. The bear makes a crucial point about how much future growth is *already priced in*, reminding us of past bubbles where hype outran reality. They rightly flag the insider selling, especially by *multiple directors*, as a significant red flag that shouldn't be easily dismissed. The potential $8 billion revenue impact from China is a quantifiable risk that isn't immediately offset by long-term European expansion plans. They also stress that technological leadership isn't static and competition from players like Huawei is intensifying.\n\n**My Recommendation: Sell.**\n\nThis isn't a decision I take lightly, especially with a company as transformative as NVDA. However, based on this debate, the immediate risks and warning signs presented by the Bear Analyst are simply too significant to ignore, and they outweigh the Bull's long-term optimism for the *current* valuation.\n\n**Rationale:**\n\n1. **Waning Momentum and Overvaluation:** The Bear's point about the MACD signaling *waning* bullish momentum, combined with an overbought RSI, is a critical technical warning. While NVDA's long-term AI story is strong, the stock has already seen an explosive run. The crucial question, as the Bear articulated, is how much of that future growth is *already priced in*? At these elevated levels, the stock becomes highly susceptible to any negative news or market corrections. We've seen this play out before \u2013 even great companies can become overvalued in the short term.\n2. **Concrete Risks vs. Future Potential:** The Bull's argument relies heavily on future potential, which is exciting but also speculative. The Bear, however, highlights *concrete, quantifiable risks* right now. The potential $8 billion revenue hit from China is a substantial near-term headwind that won't be immediately offset by European expansion, which takes time and significant investment.\n3. **Insider Selling as a Red Flag:** Dismissing insider selling by *multiple directors* as purely \"personal financial planning\" is, as the Bear put it, naive. Those closest to the company's operations and future prospects are taking chips off the table. This is a behavioral signal that, when combined with other warning signs, strengthens the case for caution.\n4. **Learning from Past Mistakes:** This is where our past reflections come into play. In previous situations, we might have been too quick to jump on the \"popular stock\" bandwagon, caught up in the hype and FOMO, only to get burned when the market corrected. We've learned the importance of avoiding confirmation bias and critically evaluating *all* information, especially when it contradicts our initial bullish assumptions. The Bear's measured approach and focus on risks aligns perfectly with our refined decision-making framework. It's better to be prudent and potentially miss some marginal upside than to suffer significant losses by ignoring clear warning signs.\n\n**Strategic Actions for the Trader:**\n\nHere's how we'll implement this \"Sell\" recommendation:\n\n1. **Immediate Action: Initiate a Sell Position.** For any existing NVDA holdings, we will initiate a sell order to realize profits and reduce exposure to potential near-term downside.\n2. **Consider Shorting (with caution):** For traders with the capability and risk appetite, a tactical short position could be considered. However, this must be executed with extreme caution. Given NVDA's volatility and the strong long-term AI narrative, any short position must be accompanied by a **tight stop-loss order** to limit potential losses if the stock defies the current technical and fundamental warnings.\n3. **Reallocate Capital:** The capital freed up from selling NVDA should be reallocated strategically. Consider moving it into more diversified, less speculative assets, or increasing our cash position to preserve capital during a potentially volatile period. We can then deploy this capital when clearer, more favorable opportunities arise, or if NVDA experiences a significant correction that brings its valuation back to more attractive levels.\n4. **Continuous Monitoring & Re-evaluation Triggers:** We will not set this and forget it. We need to closely monitor:\n * **Technical Indicators:** Watch for clear reversals in MACD (e.g., a bullish crossover from oversold territory) or a significant drop in RSI that suggests a bottoming out.\n * **China Solutions:** Any concrete, immediate, and impactful solutions to the China revenue curbs would warrant a re-evaluation.\n * **Insider Activity:** Continue to monitor insider buying/selling trends.\n * **Market Sentiment:** Observe broader market sentiment and any major shifts in the AI narrative.\n * **Price Action:** A significant correction (e.g., 20-30% from current levels) could bring NVDA back into a more attractive risk-reward profile, prompting us to reconsider a long position.\n\nIn essence, we're not saying NVDA isn't a great company or that AI isn't the future. We're saying that *at its current price, with these immediate warning signs*, the risk-reward balance has shifted unfavorably in the short to medium term. It's time to take profits and wait for a clearer entry point.", + "judge_decision": "Alright team, let's cut through the noise and make a definitive call on NVDA. As your portfolio manager, my job is to critically weigh these arguments, learn from our past tendencies, and put forward an actionable plan.\n\nFirst off, I want to commend both analysts for a solid round. You both presented compelling points, but as always, we need to decide where the weight of the evidence truly lies.\n\n**Let's summarize the key points:**\n\nThe **Bull Analyst** paints a very compelling picture of NVDA's future. They rightly emphasize NVDA's undeniable dominance in the exploding AI market, driven by real-world applications and the significant upside potential of new technologies like the Blackwell chip. Their argument is that current valuations are simply pricing in this immense future growth, and dismissing technical \"lagging indicators\" like MACD and RSI shouldn't overshadow these fundamental drivers. They also downplay insider selling as personal financial planning and highlight NVDA's proactive diversification into Europe to mitigate China risks, along with its enduring competitive advantage.\n\nOn the other hand, the **Bear Analyst** brings a much-needed dose of caution, and frankly, a more immediate, actionable perspective. They argue that those \"lagging indicators\" like the MACD (signal line *above* the MACD line, indicating *waning* bullish momentum) and RSI approaching overbought territory are precisely what we need to pay attention to. They confirm that the powerful engine might be showing signs of overheating or losing steam. The bear makes a crucial point about how much future growth is *already priced in*, reminding us of past bubbles where hype outran reality. They rightly flag the insider selling, especially by *multiple directors*, as a significant red flag that shouldn't be easily dismissed. The potential $8 billion revenue impact from China is a quantifiable risk that isn't immediately offset by long-term European expansion plans. They also stress that technological leadership isn't static and competition from players like Huawei is intensifying.\n\n**My Recommendation: Sell.**\n\nThis isn't a decision I take lightly, especially with a company as transformative as NVDA. However, based on this debate, the immediate risks and warning signs presented by the Bear Analyst are simply too significant to ignore, and they outweigh the Bull's long-term optimism for the *current* valuation.\n\n**Rationale:**\n\n1. **Waning Momentum and Overvaluation:** The Bear's point about the MACD signaling *waning* bullish momentum, combined with an overbought RSI, is a critical technical warning. While NVDA's long-term AI story is strong, the stock has already seen an explosive run. The crucial question, as the Bear articulated, is how much of that future growth is *already priced in*? At these elevated levels, the stock becomes highly susceptible to any negative news or market corrections. We've seen this play out before \u2013 even great companies can become overvalued in the short term.\n2. **Concrete Risks vs. Future Potential:** The Bull's argument relies heavily on future potential, which is exciting but also speculative. The Bear, however, highlights *concrete, quantifiable risks* right now. The potential $8 billion revenue hit from China is a substantial near-term headwind that won't be immediately offset by European expansion, which takes time and significant investment.\n3. **Insider Selling as a Red Flag:** Dismissing insider selling by *multiple directors* as purely \"personal financial planning\" is, as the Bear put it, naive. Those closest to the company's operations and future prospects are taking chips off the table. This is a behavioral signal that, when combined with other warning signs, strengthens the case for caution.\n4. **Learning from Past Mistakes:** This is where our past reflections come into play. In previous situations, we might have been too quick to jump on the \"popular stock\" bandwagon, caught up in the hype and FOMO, only to get burned when the market corrected. We've learned the importance of avoiding confirmation bias and critically evaluating *all* information, especially when it contradicts our initial bullish assumptions. The Bear's measured approach and focus on risks aligns perfectly with our refined decision-making framework. It's better to be prudent and potentially miss some marginal upside than to suffer significant losses by ignoring clear warning signs.\n\n**Strategic Actions for the Trader:**\n\nHere's how we'll implement this \"Sell\" recommendation:\n\n1. **Immediate Action: Initiate a Sell Position.** For any existing NVDA holdings, we will initiate a sell order to realize profits and reduce exposure to potential near-term downside.\n2. **Consider Shorting (with caution):** For traders with the capability and risk appetite, a tactical short position could be considered. However, this must be executed with extreme caution. Given NVDA's volatility and the strong long-term AI narrative, any short position must be accompanied by a **tight stop-loss order** to limit potential losses if the stock defies the current technical and fundamental warnings.\n3. **Reallocate Capital:** The capital freed up from selling NVDA should be reallocated strategically. Consider moving it into more diversified, less speculative assets, or increasing our cash position to preserve capital during a potentially volatile period. We can then deploy this capital when clearer, more favorable opportunities arise, or if NVDA experiences a significant correction that brings its valuation back to more attractive levels.\n4. **Continuous Monitoring & Re-evaluation Triggers:** We will not set this and forget it. We need to closely monitor:\n * **Technical Indicators:** Watch for clear reversals in MACD (e.g., a bullish crossover from oversold territory) or a significant drop in RSI that suggests a bottoming out.\n * **China Solutions:** Any concrete, immediate, and impactful solutions to the China revenue curbs would warrant a re-evaluation.\n * **Insider Activity:** Continue to monitor insider buying/selling trends.\n * **Market Sentiment:** Observe broader market sentiment and any major shifts in the AI narrative.\n * **Price Action:** A significant correction (e.g., 20-30% from current levels) could bring NVDA back into a more attractive risk-reward profile, prompting us to reconsider a long position.\n\nIn essence, we're not saying NVDA isn't a great company or that AI isn't the future. We're saying that *at its current price, with these immediate warning signs*, the risk-reward balance has shifted unfavorably in the short to medium term. It's time to take profits and wait for a clearer entry point." + }, + "trader_investment_decision": "Okay, I understand the comprehensive analysis and the recommendation to sell NVDA. The rationale is well-supported by technical indicators, insider selling, and potential revenue headwinds. I agree that the risk-reward balance has shifted unfavorably in the short to medium term.\n\nFINAL TRANSACTION PROPOSAL: **SELL**", + "risk_debate_state": { + "risky_history": "\nRisky Analyst: Alright, let's dissect this \"HOLD\" recommendation and the underlying caution. I hear the concerns about weakening momentum from the MACD and the RSI approaching overbought levels. But are we really going to let a couple of indicators overshadow the roaring AI revolution that NVDA is spearheading?\n\nFirst, to the conservative analyst: you're worried about insider selling? Please! Directors sell stock for all sorts of reasons \u2013 diversification, tax planning, buying a yacht. It doesn't automatically signal a lack of faith in the company's future. In fact, the social media sentiment analysis points out that it could be \"potentially personal planning.\" Are we going to let someone's personal financial decisions dictate our investment strategy when NVDA is building the future of AI? I think not.\n\nAnd to the neutral analyst: you acknowledge the strong fundamentals and growth prospects, but then you hedge with caution about China and insider selling. China is a challenge, yes, but NVDA is a global powerhouse. They're expanding aggressively in Europe, as the World Affairs Report clearly states, building AI factories and partnering with major players. They're not putting all their eggs in one basket. And as for the insider selling, I already addressed that.\n\nThe \"HOLD\" recommendation is essentially saying, \"Let's wait and see.\" But waiting is losing! NVDA is not a stock you passively hold; it's a rocket ship you ride. The Market Research Report confirms the uptrend, with the price well above the 50-day and 200-day SMAs. The VWMA also confirms the upward trend when considering volume. Yes, the MACD shows a potential decrease in bullish momentum, but that's a short-term blip in a long-term upward trajectory.\n\nWe need to be bold here. NVDA is dominating the AI space, forging strategic partnerships, and expanding into new markets. The potential upside is enormous, and we can't afford to be sidelined by short-term jitters. Let's not be paralyzed by fear of a potential pullback. Let's capitalize on the AI boom and ride NVDA to new heights. The trader's initial instinct to SELL was a mistake, but the HOLD recommendation is not much better. We need to be aggressive and stay in the game!", + "safe_history": "\nSafe Analyst: I appreciate the Risky Analyst's enthusiasm, but I believe it's crucial to temper that excitement with a dose of reality and a focus on risk mitigation. While NVDA's potential is undeniable, we can't ignore the warning signs that suggest a more cautious approach is warranted.\n\nFirst, regarding insider selling, dismissing it as \"personal planning\" is overly simplistic. While that may be a factor, substantial insider selling, as highlighted in the World Affairs Report, *always* raises a red flag. It suggests that those with the deepest understanding of the company's prospects may believe the current valuation is unsustainable. To ignore this is to ignore a potentially critical piece of information. It's not about letting someone's personal decisions dictate our strategy, it's about acknowledging that those decisions *might* reflect a less optimistic outlook than the market currently holds.\n\nSecondly, while NVDA's expansion in Europe is encouraging, it doesn't negate the significant challenges in the Chinese market. The World Affairs Report clearly states that export curbs are expected to impact Q2 sales, potentially reducing revenue by $8 billion. That's not a \"short-term blip,\" that's a substantial hit to revenue that could trigger a significant stock correction. To suggest that NVDA is not putting all its eggs in one basket is misleading; China remains a crucial market, and the restrictions there pose a real threat to NVDA's growth trajectory.\n\nFurthermore, the Market Research Report itself, while recommending a HOLD, explicitly states that traders should \"closely monitor the MACD for a bearish crossover and the RSI as it approaches overbought levels.\" This isn't a call to \"ride the rocket ship,\" it's a call to be vigilant and prepared to take profits or tighten stop-loss levels. The fact that the MACD indicates a possible decrease in bullish momentum and the RSI is approaching overbought territory are not \"short-term jitters,\" they are technical indicators suggesting a potential pullback is imminent.\n\nFinally, the Risky Analyst claims that \"waiting is losing.\" But in this case, waiting is prudent risk management. A HOLD position allows us to maintain our current gains while closely monitoring the situation. If the bearish signals intensify, we can sell and protect our profits. If NVDA continues its upward trajectory, we can continue to hold. It's a balanced approach that prioritizes capital preservation while still allowing us to participate in potential upside.\n\nTherefore, I maintain that a HOLD position is the most responsible course of action. It acknowledges NVDA's potential while mitigating the risks associated with overvaluation, market uncertainty, and weakening momentum. Let's not be blinded by the allure of quick gains and instead focus on securing long-term, sustainable growth.", + "neutral_history": "\nNeutral Analyst: Okay, let's re-evaluate this NVDA situation. I see valid points from both the Risky and Safe Analysts, but I think both are leaning too heavily in one direction.\n\nRisky Analyst, your enthusiasm is infectious, but dismissing the insider selling and the China risk as minor is, well, risky. Yes, directors sell for various reasons, but multiple directors selling *substantial* amounts of stock simultaneously *does* warrant a closer look. It's not about letting their personal lives dictate our strategy, but about acknowledging that they might have insights we don't. And while NVDA is diversifying, the potential $8 billion revenue hit from China is not a \"short-term blip.\" It's a significant headwind that could impact earnings and investor sentiment. You're right that waiting *can* be losing, but jumping in without considering the potential downsides can be even more costly.\n\nSafe Analyst, while I appreciate your focus on risk mitigation, I think you're being overly cautious. Treating insider selling as an automatic \"red flag\" is too simplistic. As the Risky Analyst pointed out, there *are* other explanations. And while the China situation is concerning, NVDA is actively working to mitigate the impact through expansion in other markets. A complete sell-off based on these factors alone seems premature, especially given NVDA's strong position in the AI market and its continued growth. You're right that waiting is prudent risk management, but waiting *too* long can mean missing out on significant gains.\n\nHere's my take: I propose a **partial sell-off** strategy. We sell a portion of our NVDA holdings \u2013 say, 25% \u2013 to lock in some profits and reduce our overall exposure. This addresses the overvaluation concerns and the potential for a pullback, as highlighted by the MACD and RSI indicators. It also acknowledges the risks associated with the China market and the insider selling.\n\nHowever, we *hold* the remaining 75% of our shares. This allows us to continue participating in NVDA's potential upside as it continues to dominate the AI space and expand into new markets. We closely monitor the MACD, RSI, and news related to the China situation. If the bearish signals intensify, we can sell more shares. If NVDA continues its upward trajectory, we can re-evaluate and potentially add to our position later.\n\nThis approach offers a balanced way to manage risk and reward. It's not as aggressive as the Risky Analyst's \"ride the rocket ship\" strategy, but it's not as conservative as the Safe Analyst's \"wait and see\" approach either. It's a moderate risk strategy that allows us to protect our capital while still participating in NVDA's potential growth. It's about being smart, not just bold or cautious.", + "history": "\nRisky Analyst: Alright, let's dissect this \"HOLD\" recommendation and the underlying caution. I hear the concerns about weakening momentum from the MACD and the RSI approaching overbought levels. But are we really going to let a couple of indicators overshadow the roaring AI revolution that NVDA is spearheading?\n\nFirst, to the conservative analyst: you're worried about insider selling? Please! Directors sell stock for all sorts of reasons \u2013 diversification, tax planning, buying a yacht. It doesn't automatically signal a lack of faith in the company's future. In fact, the social media sentiment analysis points out that it could be \"potentially personal planning.\" Are we going to let someone's personal financial decisions dictate our investment strategy when NVDA is building the future of AI? I think not.\n\nAnd to the neutral analyst: you acknowledge the strong fundamentals and growth prospects, but then you hedge with caution about China and insider selling. China is a challenge, yes, but NVDA is a global powerhouse. They're expanding aggressively in Europe, as the World Affairs Report clearly states, building AI factories and partnering with major players. They're not putting all their eggs in one basket. And as for the insider selling, I already addressed that.\n\nThe \"HOLD\" recommendation is essentially saying, \"Let's wait and see.\" But waiting is losing! NVDA is not a stock you passively hold; it's a rocket ship you ride. The Market Research Report confirms the uptrend, with the price well above the 50-day and 200-day SMAs. The VWMA also confirms the upward trend when considering volume. Yes, the MACD shows a potential decrease in bullish momentum, but that's a short-term blip in a long-term upward trajectory.\n\nWe need to be bold here. NVDA is dominating the AI space, forging strategic partnerships, and expanding into new markets. The potential upside is enormous, and we can't afford to be sidelined by short-term jitters. Let's not be paralyzed by fear of a potential pullback. Let's capitalize on the AI boom and ride NVDA to new heights. The trader's initial instinct to SELL was a mistake, but the HOLD recommendation is not much better. We need to be aggressive and stay in the game!\nSafe Analyst: I appreciate the Risky Analyst's enthusiasm, but I believe it's crucial to temper that excitement with a dose of reality and a focus on risk mitigation. While NVDA's potential is undeniable, we can't ignore the warning signs that suggest a more cautious approach is warranted.\n\nFirst, regarding insider selling, dismissing it as \"personal planning\" is overly simplistic. While that may be a factor, substantial insider selling, as highlighted in the World Affairs Report, *always* raises a red flag. It suggests that those with the deepest understanding of the company's prospects may believe the current valuation is unsustainable. To ignore this is to ignore a potentially critical piece of information. It's not about letting someone's personal decisions dictate our strategy, it's about acknowledging that those decisions *might* reflect a less optimistic outlook than the market currently holds.\n\nSecondly, while NVDA's expansion in Europe is encouraging, it doesn't negate the significant challenges in the Chinese market. The World Affairs Report clearly states that export curbs are expected to impact Q2 sales, potentially reducing revenue by $8 billion. That's not a \"short-term blip,\" that's a substantial hit to revenue that could trigger a significant stock correction. To suggest that NVDA is not putting all its eggs in one basket is misleading; China remains a crucial market, and the restrictions there pose a real threat to NVDA's growth trajectory.\n\nFurthermore, the Market Research Report itself, while recommending a HOLD, explicitly states that traders should \"closely monitor the MACD for a bearish crossover and the RSI as it approaches overbought levels.\" This isn't a call to \"ride the rocket ship,\" it's a call to be vigilant and prepared to take profits or tighten stop-loss levels. The fact that the MACD indicates a possible decrease in bullish momentum and the RSI is approaching overbought territory are not \"short-term jitters,\" they are technical indicators suggesting a potential pullback is imminent.\n\nFinally, the Risky Analyst claims that \"waiting is losing.\" But in this case, waiting is prudent risk management. A HOLD position allows us to maintain our current gains while closely monitoring the situation. If the bearish signals intensify, we can sell and protect our profits. If NVDA continues its upward trajectory, we can continue to hold. It's a balanced approach that prioritizes capital preservation while still allowing us to participate in potential upside.\n\nTherefore, I maintain that a HOLD position is the most responsible course of action. It acknowledges NVDA's potential while mitigating the risks associated with overvaluation, market uncertainty, and weakening momentum. Let's not be blinded by the allure of quick gains and instead focus on securing long-term, sustainable growth.\nNeutral Analyst: Okay, let's re-evaluate this NVDA situation. I see valid points from both the Risky and Safe Analysts, but I think both are leaning too heavily in one direction.\n\nRisky Analyst, your enthusiasm is infectious, but dismissing the insider selling and the China risk as minor is, well, risky. Yes, directors sell for various reasons, but multiple directors selling *substantial* amounts of stock simultaneously *does* warrant a closer look. It's not about letting their personal lives dictate our strategy, but about acknowledging that they might have insights we don't. And while NVDA is diversifying, the potential $8 billion revenue hit from China is not a \"short-term blip.\" It's a significant headwind that could impact earnings and investor sentiment. You're right that waiting *can* be losing, but jumping in without considering the potential downsides can be even more costly.\n\nSafe Analyst, while I appreciate your focus on risk mitigation, I think you're being overly cautious. Treating insider selling as an automatic \"red flag\" is too simplistic. As the Risky Analyst pointed out, there *are* other explanations. And while the China situation is concerning, NVDA is actively working to mitigate the impact through expansion in other markets. A complete sell-off based on these factors alone seems premature, especially given NVDA's strong position in the AI market and its continued growth. You're right that waiting is prudent risk management, but waiting *too* long can mean missing out on significant gains.\n\nHere's my take: I propose a **partial sell-off** strategy. We sell a portion of our NVDA holdings \u2013 say, 25% \u2013 to lock in some profits and reduce our overall exposure. This addresses the overvaluation concerns and the potential for a pullback, as highlighted by the MACD and RSI indicators. It also acknowledges the risks associated with the China market and the insider selling.\n\nHowever, we *hold* the remaining 75% of our shares. This allows us to continue participating in NVDA's potential upside as it continues to dominate the AI space and expand into new markets. We closely monitor the MACD, RSI, and news related to the China situation. If the bearish signals intensify, we can sell more shares. If NVDA continues its upward trajectory, we can re-evaluate and potentially add to our position later.\n\nThis approach offers a balanced way to manage risk and reward. It's not as aggressive as the Risky Analyst's \"ride the rocket ship\" strategy, but it's not as conservative as the Safe Analyst's \"wait and see\" approach either. It's a moderate risk strategy that allows us to protect our capital while still participating in NVDA's potential growth. It's about being smart, not just bold or cautious.", + "judge_decision": "Alright team, let's cut through the noise and make a definitive call on NVDA. As your portfolio manager and Risk Management Judge, my job is to critically weigh these arguments, learn from our past tendencies, and put forward an actionable plan that prioritizes both capital preservation and strategic participation.\n\nFirst off, I want to commend all three analysts for a robust and insightful debate. Each brought a valuable perspective, highlighting the complex nature of this decision.\n\n**Let's summarize the key points from the debate:**\n\nThe **Risky Analyst** passionately champions NVDA's undeniable dominance in the exploding AI market. They emphasize future growth driven by new technologies like the Blackwell chip and strategic global expansion (Europe) to mitigate China risks. They largely dismiss technical \"lagging indicators\" (MACD, RSI) and insider selling, viewing them as short-term blips or personal financial planning, arguing that waiting is losing and we must be bold to ride the \"rocket ship.\"\n\nThe **Safe Analyst** provides a much-needed dose of caution, focusing on immediate risks. They highlight substantial insider selling by *multiple directors* as a significant red flag, suggesting current valuation might be unsustainable. They stress the quantifiable $8 billion revenue impact from China export curbs, arguing it's a major headwind not immediately offset by long-term European plans. They also underscore the importance of technical indicators like MACD (waning bullish momentum) and RSI (approaching overbought), asserting that \"waiting is prudent risk management.\"\n\nThe **Neutral Analyst** skillfully bridges the gap, acknowledging the validity of points from both sides. They agree that while insider selling isn't always dire, *multiple* directors selling warrants closer inspection. They concur that the China revenue hit is significant, not a mere blip. Crucially, the Neutral Analyst proposes a **partial sell-off strategy**, suggesting we sell a portion (e.g., 25%) to lock in profits and reduce exposure, while holding the majority (e.g., 75%) to continue participating in NVDA's long-term AI upside. This approach emphasizes active monitoring of technicals and geopolitical developments.\n\n**My Recommendation: Sell (Strategically)**\n\nThis isn't a decision to fully liquidate or abandon NVDA's long-term potential. Instead, it's a strategic \"Sell\" that translates into a **partial reduction of exposure** to manage immediate risks and secure profits, aligning most closely with the Neutral Analyst's balanced and prudent approach. It's an active decision to reduce risk, rather than a passive hold.\n\n**Rationale:**\n\n1. **Waning Momentum and Overvaluation are Real Concerns:** The Safe and Neutral Analysts correctly highlighted that the MACD signaling *waning* bullish momentum and the RSI approaching overbought territory are critical technical warnings. While NVDA's long-term AI story is strong, the stock has already seen an explosive run. The crucial question, as the Safe Analyst articulated, is how much of that future growth is *already priced in*? At these elevated levels, the stock becomes highly susceptible to any negative news or market corrections. Dismissing these as \"short-term blips,\" as the Risky Analyst did, is a dangerous oversight.\n2. **Concrete Risks Outweigh Speculative Upside for Current Valuation:** The Risky Analyst's argument relies heavily on future potential, which is exciting but also speculative. The Safe Analyst, however, highlighted *concrete, quantifiable risks* right now. The potential $8 billion revenue hit from China is a substantial near-term headwind that won't be immediately offset by European expansion, which takes time and significant investment. The Neutral Analyst acknowledged this as a significant factor, not a minor one.\n3. **Insider Selling as a Red Flag, Not Just \"Personal Planning\":** Dismissing insider selling by *multiple directors* as purely \"personal financial planning\" is, as the Safe Analyst put it, overly simplistic and potentially naive. Those closest to the company's operations and future prospects are taking chips off the table. This is a behavioral signal that, when combined with other warning signs (like technicals and China risks), strengthens the case for caution, as the Neutral Analyst also conceded.\n4. **Learning from Past Mistakes & Adopting a Balanced Approach:** This is where our past reflections come into play. In previous situations, we might have been too quick to jump on the \"popular stock\" bandwagon, caught up in the hype and FOMO, only to get burned when the market corrected. We've learned the importance of avoiding confirmation bias and critically evaluating *all* information. The Neutral Analyst's measured approach\u2014selling a portion to lock in profits and reduce risk while holding the remainder to participate in long-term growth\u2014perfectly aligns with our refined decision-making framework. It's better to be prudent and secure gains than to suffer significant losses by ignoring clear warning signs, while still retaining exposure to potential upside. This is a far more sophisticated strategy than a full \"Sell\" or a passive \"Hold.\"\n\n**Strategic Actions for the Trader:**\n\nHere's how we'll implement this \"Sell (Strategically)\" recommendation:\n\n1. **Immediate Action: Initiate a Partial Sell Position.** For any existing NVDA holdings, we will initiate a sell order for a defined portion (e.g., 25% or 30%) of our shares. This action serves to realize profits, reduce our overall exposure to potential near-term downside, and de-risk the portfolio at current elevated valuations.\n2. **Maintain Core Position & Reallocate Capital:** The remaining portion of our NVDA holdings (e.g., 70% or 75%) will be maintained to continue participating in the company's long-term AI growth story. The capital freed up from the partial sell should be reallocated strategically \u2013 either into more diversified, less speculative assets, or increasing our cash position to preserve capital during a potentially volatile period. This allows us to deploy capital when clearer, more favorable opportunities arise, or if NVDA experiences a significant correction that brings its valuation back to more attractive levels.\n3. **Consider Tactical Shorting (with extreme caution):** For traders with high risk appetite and sophisticated capabilities, a *very tactical, small* short position could be considered *only* on a confirmed technical breakdown. However, this must be executed with extreme caution and accompanied by a **tight stop-loss order** to limit potential losses, given NVDA's volatility and strong long-term narrative. This is not a primary action but a highly speculative, managed risk option.\n4. **Continuous Monitoring & Re-evaluation Triggers:** We will not set this and forget it. We need to closely monitor:\n * **Technical Indicators:** Watch for clear reversals in MACD (e.g., a bullish crossover from oversold territory) or a significant drop in RSI that suggests a bottoming out.\n * **China Solutions/Impact:** Any concrete, immediate, and impactful solutions to the China revenue curbs, or clear signs of less impact than anticipated, would warrant a re-evaluation.\n * **Insider Activity:** Continue to monitor insider buying/selling trends. A shift to insider buying would be a strong positive signal.\n * **Competitive Landscape:** Observe any major shifts in AI competition (e.g., from Huawei, AMD, Intel).\n * **Price Action:** A significant correction (e.g., 20-30% from current levels) could bring NVDA back into a more attractive risk-reward profile, prompting us to reconsider adding to our long position.\n\nIn essence, we're not saying NVDA isn't a great company or that AI isn't the future. We're saying that *at its current price, with these immediate warning signs*, the risk-reward balance has shifted unfavorably in the short to medium term for *full* exposure. By strategically selling a portion, we secure profits, reduce downside risk, and position ourselves prudently while still benefiting from the long-term AI revolution. It's time to take smart profits and wait for a clearer entry point for larger exposure." + }, + "investment_plan": "Alright team, let's cut through the noise and make a definitive call on NVDA. As your portfolio manager, my job is to critically weigh these arguments, learn from our past tendencies, and put forward an actionable plan.\n\nFirst off, I want to commend both analysts for a solid round. You both presented compelling points, but as always, we need to decide where the weight of the evidence truly lies.\n\n**Let's summarize the key points:**\n\nThe **Bull Analyst** paints a very compelling picture of NVDA's future. They rightly emphasize NVDA's undeniable dominance in the exploding AI market, driven by real-world applications and the significant upside potential of new technologies like the Blackwell chip. Their argument is that current valuations are simply pricing in this immense future growth, and dismissing technical \"lagging indicators\" like MACD and RSI shouldn't overshadow these fundamental drivers. They also downplay insider selling as personal financial planning and highlight NVDA's proactive diversification into Europe to mitigate China risks, along with its enduring competitive advantage.\n\nOn the other hand, the **Bear Analyst** brings a much-needed dose of caution, and frankly, a more immediate, actionable perspective. They argue that those \"lagging indicators\" like the MACD (signal line *above* the MACD line, indicating *waning* bullish momentum) and RSI approaching overbought territory are precisely what we need to pay attention to. They confirm that the powerful engine might be showing signs of overheating or losing steam. The bear makes a crucial point about how much future growth is *already priced in*, reminding us of past bubbles where hype outran reality. They rightly flag the insider selling, especially by *multiple directors*, as a significant red flag that shouldn't be easily dismissed. The potential $8 billion revenue impact from China is a quantifiable risk that isn't immediately offset by long-term European expansion plans. They also stress that technological leadership isn't static and competition from players like Huawei is intensifying.\n\n**My Recommendation: Sell.**\n\nThis isn't a decision I take lightly, especially with a company as transformative as NVDA. However, based on this debate, the immediate risks and warning signs presented by the Bear Analyst are simply too significant to ignore, and they outweigh the Bull's long-term optimism for the *current* valuation.\n\n**Rationale:**\n\n1. **Waning Momentum and Overvaluation:** The Bear's point about the MACD signaling *waning* bullish momentum, combined with an overbought RSI, is a critical technical warning. While NVDA's long-term AI story is strong, the stock has already seen an explosive run. The crucial question, as the Bear articulated, is how much of that future growth is *already priced in*? At these elevated levels, the stock becomes highly susceptible to any negative news or market corrections. We've seen this play out before \u2013 even great companies can become overvalued in the short term.\n2. **Concrete Risks vs. Future Potential:** The Bull's argument relies heavily on future potential, which is exciting but also speculative. The Bear, however, highlights *concrete, quantifiable risks* right now. The potential $8 billion revenue hit from China is a substantial near-term headwind that won't be immediately offset by European expansion, which takes time and significant investment.\n3. **Insider Selling as a Red Flag:** Dismissing insider selling by *multiple directors* as purely \"personal financial planning\" is, as the Bear put it, naive. Those closest to the company's operations and future prospects are taking chips off the table. This is a behavioral signal that, when combined with other warning signs, strengthens the case for caution.\n4. **Learning from Past Mistakes:** This is where our past reflections come into play. In previous situations, we might have been too quick to jump on the \"popular stock\" bandwagon, caught up in the hype and FOMO, only to get burned when the market corrected. We've learned the importance of avoiding confirmation bias and critically evaluating *all* information, especially when it contradicts our initial bullish assumptions. The Bear's measured approach and focus on risks aligns perfectly with our refined decision-making framework. It's better to be prudent and potentially miss some marginal upside than to suffer significant losses by ignoring clear warning signs.\n\n**Strategic Actions for the Trader:**\n\nHere's how we'll implement this \"Sell\" recommendation:\n\n1. **Immediate Action: Initiate a Sell Position.** For any existing NVDA holdings, we will initiate a sell order to realize profits and reduce exposure to potential near-term downside.\n2. **Consider Shorting (with caution):** For traders with the capability and risk appetite, a tactical short position could be considered. However, this must be executed with extreme caution. Given NVDA's volatility and the strong long-term AI narrative, any short position must be accompanied by a **tight stop-loss order** to limit potential losses if the stock defies the current technical and fundamental warnings.\n3. **Reallocate Capital:** The capital freed up from selling NVDA should be reallocated strategically. Consider moving it into more diversified, less speculative assets, or increasing our cash position to preserve capital during a potentially volatile period. We can then deploy this capital when clearer, more favorable opportunities arise, or if NVDA experiences a significant correction that brings its valuation back to more attractive levels.\n4. **Continuous Monitoring & Re-evaluation Triggers:** We will not set this and forget it. We need to closely monitor:\n * **Technical Indicators:** Watch for clear reversals in MACD (e.g., a bullish crossover from oversold territory) or a significant drop in RSI that suggests a bottoming out.\n * **China Solutions:** Any concrete, immediate, and impactful solutions to the China revenue curbs would warrant a re-evaluation.\n * **Insider Activity:** Continue to monitor insider buying/selling trends.\n * **Market Sentiment:** Observe broader market sentiment and any major shifts in the AI narrative.\n * **Price Action:** A significant correction (e.g., 20-30% from current levels) could bring NVDA back into a more attractive risk-reward profile, prompting us to reconsider a long position.\n\nIn essence, we're not saying NVDA isn't a great company or that AI isn't the future. We're saying that *at its current price, with these immediate warning signs*, the risk-reward balance has shifted unfavorably in the short to medium term. It's time to take profits and wait for a clearer entry point.", + "final_trade_decision": "Alright team, let's cut through the noise and make a definitive call on NVDA. As your portfolio manager and Risk Management Judge, my job is to critically weigh these arguments, learn from our past tendencies, and put forward an actionable plan that prioritizes both capital preservation and strategic participation.\n\nFirst off, I want to commend all three analysts for a robust and insightful debate. Each brought a valuable perspective, highlighting the complex nature of this decision.\n\n**Let's summarize the key points from the debate:**\n\nThe **Risky Analyst** passionately champions NVDA's undeniable dominance in the exploding AI market. They emphasize future growth driven by new technologies like the Blackwell chip and strategic global expansion (Europe) to mitigate China risks. They largely dismiss technical \"lagging indicators\" (MACD, RSI) and insider selling, viewing them as short-term blips or personal financial planning, arguing that waiting is losing and we must be bold to ride the \"rocket ship.\"\n\nThe **Safe Analyst** provides a much-needed dose of caution, focusing on immediate risks. They highlight substantial insider selling by *multiple directors* as a significant red flag, suggesting current valuation might be unsustainable. They stress the quantifiable $8 billion revenue impact from China export curbs, arguing it's a major headwind not immediately offset by long-term European plans. They also underscore the importance of technical indicators like MACD (waning bullish momentum) and RSI (approaching overbought), asserting that \"waiting is prudent risk management.\"\n\nThe **Neutral Analyst** skillfully bridges the gap, acknowledging the validity of points from both sides. They agree that while insider selling isn't always dire, *multiple* directors selling warrants closer inspection. They concur that the China revenue hit is significant, not a mere blip. Crucially, the Neutral Analyst proposes a **partial sell-off strategy**, suggesting we sell a portion (e.g., 25%) to lock in profits and reduce exposure, while holding the majority (e.g., 75%) to continue participating in NVDA's long-term AI upside. This approach emphasizes active monitoring of technicals and geopolitical developments.\n\n**My Recommendation: Sell (Strategically)**\n\nThis isn't a decision to fully liquidate or abandon NVDA's long-term potential. Instead, it's a strategic \"Sell\" that translates into a **partial reduction of exposure** to manage immediate risks and secure profits, aligning most closely with the Neutral Analyst's balanced and prudent approach. It's an active decision to reduce risk, rather than a passive hold.\n\n**Rationale:**\n\n1. **Waning Momentum and Overvaluation are Real Concerns:** The Safe and Neutral Analysts correctly highlighted that the MACD signaling *waning* bullish momentum and the RSI approaching overbought territory are critical technical warnings. While NVDA's long-term AI story is strong, the stock has already seen an explosive run. The crucial question, as the Safe Analyst articulated, is how much of that future growth is *already priced in*? At these elevated levels, the stock becomes highly susceptible to any negative news or market corrections. Dismissing these as \"short-term blips,\" as the Risky Analyst did, is a dangerous oversight.\n2. **Concrete Risks Outweigh Speculative Upside for Current Valuation:** The Risky Analyst's argument relies heavily on future potential, which is exciting but also speculative. The Safe Analyst, however, highlighted *concrete, quantifiable risks* right now. The potential $8 billion revenue hit from China is a substantial near-term headwind that won't be immediately offset by European expansion, which takes time and significant investment. The Neutral Analyst acknowledged this as a significant factor, not a minor one.\n3. **Insider Selling as a Red Flag, Not Just \"Personal Planning\":** Dismissing insider selling by *multiple directors* as purely \"personal financial planning\" is, as the Safe Analyst put it, overly simplistic and potentially naive. Those closest to the company's operations and future prospects are taking chips off the table. This is a behavioral signal that, when combined with other warning signs (like technicals and China risks), strengthens the case for caution, as the Neutral Analyst also conceded.\n4. **Learning from Past Mistakes & Adopting a Balanced Approach:** This is where our past reflections come into play. In previous situations, we might have been too quick to jump on the \"popular stock\" bandwagon, caught up in the hype and FOMO, only to get burned when the market corrected. We've learned the importance of avoiding confirmation bias and critically evaluating *all* information. The Neutral Analyst's measured approach\u2014selling a portion to lock in profits and reduce risk while holding the remainder to participate in long-term growth\u2014perfectly aligns with our refined decision-making framework. It's better to be prudent and secure gains than to suffer significant losses by ignoring clear warning signs, while still retaining exposure to potential upside. This is a far more sophisticated strategy than a full \"Sell\" or a passive \"Hold.\"\n\n**Strategic Actions for the Trader:**\n\nHere's how we'll implement this \"Sell (Strategically)\" recommendation:\n\n1. **Immediate Action: Initiate a Partial Sell Position.** For any existing NVDA holdings, we will initiate a sell order for a defined portion (e.g., 25% or 30%) of our shares. This action serves to realize profits, reduce our overall exposure to potential near-term downside, and de-risk the portfolio at current elevated valuations.\n2. **Maintain Core Position & Reallocate Capital:** The remaining portion of our NVDA holdings (e.g., 70% or 75%) will be maintained to continue participating in the company's long-term AI growth story. The capital freed up from the partial sell should be reallocated strategically \u2013 either into more diversified, less speculative assets, or increasing our cash position to preserve capital during a potentially volatile period. This allows us to deploy capital when clearer, more favorable opportunities arise, or if NVDA experiences a significant correction that brings its valuation back to more attractive levels.\n3. **Consider Tactical Shorting (with extreme caution):** For traders with high risk appetite and sophisticated capabilities, a *very tactical, small* short position could be considered *only* on a confirmed technical breakdown. However, this must be executed with extreme caution and accompanied by a **tight stop-loss order** to limit potential losses, given NVDA's volatility and strong long-term narrative. This is not a primary action but a highly speculative, managed risk option.\n4. **Continuous Monitoring & Re-evaluation Triggers:** We will not set this and forget it. We need to closely monitor:\n * **Technical Indicators:** Watch for clear reversals in MACD (e.g., a bullish crossover from oversold territory) or a significant drop in RSI that suggests a bottoming out.\n * **China Solutions/Impact:** Any concrete, immediate, and impactful solutions to the China revenue curbs, or clear signs of less impact than anticipated, would warrant a re-evaluation.\n * **Insider Activity:** Continue to monitor insider buying/selling trends. A shift to insider buying would be a strong positive signal.\n * **Competitive Landscape:** Observe any major shifts in AI competition (e.g., from Huawei, AMD, Intel).\n * **Price Action:** A significant correction (e.g., 20-30% from current levels) could bring NVDA back into a more attractive risk-reward profile, prompting us to reconsider adding to our long position.\n\nIn essence, we're not saying NVDA isn't a great company or that AI isn't the future. We're saying that *at its current price, with these immediate warning signs*, the risk-reward balance has shifted unfavorably in the short to medium term for *full* exposure. By strategically selling a portion, we secure profits, reduce downside risk, and position ourselves prudently while still benefiting from the long-term AI revolution. It's time to take smart profits and wait for a clearer entry point for larger exposure." + } +} \ No newline at end of file diff --git a/eval_results/PLTR/TradingAgentsStrategy_logs/full_states_log.json b/eval_results/PLTR/TradingAgentsStrategy_logs/full_states_log.json new file mode 100644 index 00000000..730339b2 --- /dev/null +++ b/eval_results/PLTR/TradingAgentsStrategy_logs/full_states_log.json @@ -0,0 +1,27 @@ +{ + "2025-06-11": { + "company_of_interest": "PLTR", + "trade_date": "2025-06-11", + "market_report": "Based on the comprehensive data retrieved for PLTR from May 2024 to June 2025, I will now select the most relevant indicators to provide a nuanced analysis of the current market condition.\n\n### Selected Indicators:\n1. **close_50_sma** (50-day Simple Moving Average): \n - Usage: Identifies the medium-term trend and acts as dynamic support/resistance. \n - Current value (2025-06-11): approximately 112.10, which is significantly below the current price (~132.81), indicating a strong upward trend in the medium term.\n\n2. **close_200_sma** (200-day Simple Moving Average): \n - Usage: Confirms long-term trend direction. \n - Current value (2025-06-11): approximately 77.45, well below the current price, reinforcing a long-term bullish trend.\n\n3. **macd** (Moving Average Convergence Divergence): \n - Usage: Momentum indicator signaling trend strength and potential reversals. \n - Current value (2025-06-11): approximately 5.11, which is high and suggests strong upward momentum.\n\n4. **rsi** (Relative Strength Index): \n - Usage: Measures momentum and overbought/oversold conditions. \n - Current value (2025-06-11): approximately 63.22, indicating the stock is approaching overbought territory but not yet extreme.\n\n5. **boll** (Bollinger Middle Band): \n - Usage: Acts as a dynamic support/resistance level and helps identify breakouts. \n - Current value (2025-06-11): approximately 127.56, close to the recent price (~132.81), suggesting the price is near the upper Bollinger Band, indicating potential overextension but also a possible continuation of the trend.\n\n6. **atr** (Average True Range): \n - Usage: Measures market volatility, useful for setting stop-loss levels. \n - Current value (2025-06-11): approximately 6.90, indicating moderate volatility, which supports the current strong trend with manageable risk.\n\n7. **vwma** (Volume Weighted Moving Average): \n - Usage: Confirms trend direction with volume support. \n - Current value (2025-06-11): approximately 128.04, very close to the current price, indicating volume supports the upward move.\n\n8. **macds** (MACD Signal Line): \n - Usage: Confirms MACD momentum signals. \n - (Not explicitly provided but can be inferred from MACD): The MACD line is above the signal line, reinforcing bullish momentum.\n\n---\n\n### Fine-Grained Analysis:\n- **Trend Confirmation:** Both the 50 SMA and 200 SMA are well below the current price, confirming a strong bullish trend across medium and long-term horizons. The recent price action remains above these support levels, indicating sustained upward momentum.\n- **Momentum & Strength:** The MACD is high (~5.11), and the RSI (~63.22) suggests momentum is robust but not yet overbought, leaving room for continued upward movement.\n- **Volatility & Risk:** The ATR (~6.90) indicates moderate volatility, which is typical for a trending stock. The Bollinger Middle band (~127.56) is close to the current price, with the price near the upper band, hinting at potential overextension but also the possibility of a trend continuation.\n- **Volume Support:** The VWMA (~128.04) aligns closely with the current price, indicating volume supports the current bullish trend.\n- **Potential Reversal Signals:** The proximity to the upper Bollinger Band and RSI nearing overbought levels suggest traders should watch for signs of consolidation or a pullback, especially if other indicators show divergence.\n\n### Summary:\nPLTR is in a strong bullish phase with confirmed upward momentum across multiple timeframes. The indicators suggest the trend is healthy, with volume backing the move. However, the proximity to overbought levels and the upper Bollinger Band warrants caution for potential short-term corrections or consolidation phases.\n\n---\n\n| Indicator | Current Value / Observation | Interpretation |\n|--------------------|------------------------------|--------------------------------------------------------------|\n| 50 SMA | ~112.10 | Supports medium-term bullish trend |\n| 200 SMA | ~77.45 | Confirms long-term bullish trend |\n| MACD | ~5.11 | Strong upward momentum |\n| RSI | ~63.22 | Approaching overbought, but still room for upward move |\n| Bollinger Middle | ~127.56 | Price near upper band, potential overextension |\n| ATR | ~6.90 | Moderate volatility, manageable risk |\n| VWMA | ~128.04 | Volume supports current trend |\n| MACD Signal Line | Bullish (above MACD) | Reinforces bullish momentum |\n\nWould you like a specific trading strategy recommendation based on this analysis?", + "sentiment_report": "Based on the recent social media discussions, market data, and news summaries, here's a comprehensive analysis of Palantir Technologies (PLTR) as of June 11, 2025:\n\n### Market Performance & Sentiment\n- **Stock Price & Volatility:** PLTR is trading at approximately $136.39, with notable intraday fluctuations between $131.92 and $139.195. The recent price movement indicates active trading and some volatility, which could be driven by both company-specific news and broader market trends.\n- **Market Sentiment:** Social media sentiment is mixed. While some investors are optimistic about PLTR's growth prospects, especially given recent product launches and strategic partnerships, others remain cautious due to market volatility and sector-specific risks.\n\n### Recent Developments & News\n- **Product & Partnership Updates:** There have been positive discussions around new product launches and strategic alliances, which could bolster future revenue streams and market positioning.\n- **Financial Outlook:** Analysts' forecasts are divided; some see steady growth potential, while others highlight potential headwinds that could impact performance.\n\n### Investor & Social Media Insights\n- **Positive Signals:** Confidence in PLTR's technological innovation and strategic direction.\n- **Cautionary Notes:** Concerns about market volatility, sector risks, and the need for sustained execution.\n\n### Implications for Traders & Investors\n- The current price and volatility suggest a cautious approach might be prudent, especially considering mixed sentiment and analyst forecasts.\n- The positive developments in product offerings and partnerships could serve as catalysts for future gains, but investors should remain vigilant about broader market risks.\n\n### Summary Table\n\n| Aspect | Details |\n|----------------------------|----------------------------------------------------------------------------------------------|\n| Current Price | ~$136.39 USD |\n| Intraday Range | $131.92 - $139.195 |\n| Market Sentiment | Mixed: Optimism about growth vs. caution due to volatility and sector risks |\n| Recent News & Developments | Positive on product launches and partnerships |\n| Analyst Outlook | Divided: Some bullish, some cautious |\n| Social Media Sentiment | Varied: Confidence mixed with caution |\n| Key Risks | Market volatility, sector risks, execution challenges |\n| Key Opportunities | Product innovation, strategic partnerships, growth potential |\n\nWould you like a specific investment recommendation based on this analysis, or do you want to explore more detailed financial metrics?", + "news_report": "Recent news indicates that Palantir Technologies (PLTR) is experiencing a highly volatile but overall bullish phase. The stock has hit new all-time highs above $137, driven by strong AI momentum, expanding government and commercial contracts, and strategic partnerships such as with Fedrigoni. Investor enthusiasm is also reflected in increased insider buying and analyst upgrades, with some price targets as high as $140.\n\nHowever, there are cautionary signals as well. Some analysts and market observers warn that PLTR's valuation is extremely high, with Jim Cramer calling it \"ridiculously expensive.\" Insider sales and some market corrections suggest that while the fundamentals and growth prospects are strong, the stock's current valuation may be unsustainable in the short term.\n\nThe company's involvement in government contracts, AI platform expansion, and partnerships with major firms position it well within the AI boom, but the high retail investor interest and meme-stock-like volatility could lead to sharp corrections.\n\n### Summary for Trading and Macroeconomics:\n- **Bullish momentum** driven by AI adoption, government contracts, and strategic partnerships.\n- **Valuation concerns**: high price targets and insider sales suggest caution.\n- **Market sentiment** remains highly optimistic but volatile.\n- **Macro context**: AI growth aligns with broader tech and AI sector trends, which are still favored despite macro uncertainties.\n\nNext, I will synthesize this into a final trading recommendation.", + "fundamentals_report": "Based on the latest fundamental data as of June 11, 2025, Palantir Technologies (PLTR) exhibits a high-growth profile with notably elevated valuation multiples. Here are the key insights:\n\n### Financial Overview:\n- **Market Capitalization:** Approximately $314 billion, indicating a large-cap tech company with significant investor confidence.\n- **Valuation Ratios:**\n - **P/E Ratio:** 459.95, suggesting high growth expectations but also indicating the stock is highly valued relative to earnings.\n - **Forward P/E:** 156.52, still high but lower than the current P/E, implying expected earnings growth.\n - **P/S Ratio:** 67.61, reflecting premium valuation based on sales.\n - **P/B Ratio:** 40.25, indicating the stock trades at a substantial premium to its book value.\n - **EV/Sales:** 69.76 and **EV/EBITDA:** 584.52, both extremely high, emphasizing the premium placed on future cash flows.\n- **Profitability & Efficiency:**\n - **ROE:** 10.81%, showing moderate efficiency in generating returns on equity.\n - **ROA:** 3.57%, indicating modest asset utilization efficiency.\n - **ROIC & ROCE:** Around 4-6%, reflecting the company's ability to generate returns on invested capital, but still relatively modest compared to valuation multiples.\n- **Financial Leverage:**\n - **Debt-to-Equity:** 0.05, indicating minimal leverage and a conservative debt profile.\n\n### Insights:\n- The extremely high valuation multiples suggest that investors are optimistic about Palantir's future growth prospects, possibly driven by its advanced data analytics and AI capabilities.\n- The company's profitability metrics are moderate, which is typical for a high-growth tech firm reinvesting heavily into expansion.\n- The low debt-to-equity ratio indicates financial stability and low leverage risk.\n- The gap between current and forward P/E ratios suggests expectations of significant earnings growth.\n\n### Risks & Considerations:\n- The high valuation ratios pose risks if growth targets are not met, potentially leading to valuation corrections.\n- The company's moderate profitability margins imply that sustained revenue growth is crucial to justify current multiples.\n- Market sentiment and technological advancements in AI and data analytics will heavily influence future performance.\n\n### Summary Table:\n\n| **Aspect** | **Key Points** |\n|--------------|----------------|\n| **Market Cap** | ~$314 billion, large-cap |\n| **Valuation Ratios** | Extremely high P/E, P/S, EV/EBITDA ratios |\n| **Profitability** | Moderate ROE (10.81%), ROA (3.57%) |\n| **Leverage** | Very low debt-to-equity (0.05) |\n| **Growth Expectations** | High, reflected in high multiples and lower forward P/E |\n| **Risks** | Valuation correction if growth slows, high expectations |\n\nThis comprehensive view indicates that Palantir is a high-growth, high-valuation stock with solid financial stability but significant risk if growth targets are not achieved. Traders should weigh these factors carefully in their decision-making process.", + "investment_debate_state": { + "bull_history": "\nBull Analyst: Absolutely, let's dive into a robust, evidence-based bull case for PLTR, directly engaging with the bear's concerns and demonstrating why the current setup offers compelling growth opportunities.\n\n---\n\n**First, let's acknowledge the bear's points:**\n\n- **Valuation concerns:** The stock's high P/E (~460) and EV/EBITDA (~585) ratios suggest overvaluation.\n- **Market volatility and sentiment:** Mixed social media signals and insider sales raise caution.\n- **Potential short-term corrections:** Proximity to overbought levels and upper Bollinger Band hint at possible pullbacks.\n\n**Now, here's why the bull case remains strong and why these concerns, while valid, don't outweigh the fundamentals:**\n\n---\n\n### 1. **Growth Potential: Massive Market Opportunities & Scalability**\n\nPalantir operates at the intersection of AI, data analytics, and government & enterprise digital transformation\u2014sectors projected to grow exponentially. The recent market research indicates that PLTR's revenue is on a robust upward trajectory, supported by expanding government contracts and a rapidly growing commercial client base.\n\n- **Revenue Projections & Scalability:** The company\u2019s recent financials show a market cap of ~$314 billion, with forward P/E around 156, implying investors expect significant earnings growth. Given the company's technological edge and expanding pipeline, these expectations are not unfounded. The AI boom, in particular, is a catalyst\u2014Palantir's platforms are uniquely positioned to capitalize on this trend, with a proven track record of integrating AI into complex data environments.\n\n- **Market Penetration & Expansion:** The recent strategic partnerships, like with Fedrigoni and other major firms, demonstrate Palantir's ability to scale across sectors. Their platform's flexibility allows for rapid deployment and customization, enabling them to capture new revenue streams efficiently.\n\n**In essence:** The current valuation, while high, is reflective of the enormous, scalable market opportunity and Palantir\u2019s position as a leader in AI-driven data solutions.\n\n---\n\n### 2. **Competitive Advantages: Unique Products & Market Position**\n\n- **Technological Edge:** Palantir\u2019s platforms (Foundry, Gotham) are not just data tools\u2014they are integrated AI ecosystems that provide actionable insights at scale. Their ability to handle complex, unstructured data sets gives them a moat that many competitors can't match.\n\n- **Strong Branding & Government Ties:** Their established relationships with government agencies and large enterprises create high switching costs, reinforcing their market dominance.\n\n- **Insider Buying & Strategic Partnerships:** Recent insider buying signals confidence from leadership, and strategic alliances expand their reach and credibility.\n\n**So, despite some short-term overbought signals, Palantir\u2019s competitive moat and technological superiority underpin its long-term growth trajectory.**\n\n---\n\n### 3. **Positive Market Indicators & Financial Health**\n\n- **Technical Momentum:** The 50 SMA (~112) and 200 SMA (~77) are well below the current price (~132.81), confirming a strong upward trend. The MACD (~5.11) indicates robust momentum, and the VWMA (~128) supports volume-backed growth.\n\n- **Moderate Volatility & Manageable Risks:** ATR (~6.90) suggests volatility is within manageable bounds, and the stock's recent activity near the upper Bollinger Band indicates a healthy trend rather than an overextended bubble.\n\n- **Financial Stability:** The low debt-to-equity (~0.05) and steady cash flows provide a cushion against macro shocks, allowing Palantir to continue investing in innovation and expansion.\n\n**In sum:** The technical and financial indicators support a continuation of the bullish trend, especially as the AI and data analytics sectors accelerate.\n\n---\n\n### 4. **Refuting the Bear's Concerns with Data & Lessons Learned**\n\n- **Valuation Overreach?** Yes, the multiples are high, but this is typical for high-growth tech stocks in their hyper-expansion phase. Historically, such valuations have been justified when the growth outlook is compelling\u2014think of early Amazon or Tesla phases. The key is whether Palantir can meet or exceed these expectations, which current data suggests it can.\n\n- **Insider Sales & Sentiment:** While some insiders have sold, this is often a normal liquidity or diversification move, not necessarily a sign of fundamental weakness. Moreover, recent insider buying and analyst upgrades (some targets as high as $140) indicate confidence in future growth.\n\n- **Market Corrections & Overbought Conditions:** Overbought signals like RSI (~63) and proximity to the upper Bollinger Band are cautionary but not definitive. They often precede consolidation rather than reversals, especially in strong trending stocks.\n\n- **Lessons from Past Mistakes:** In previous cycles, overreacting to valuation concerns led to missed opportunities. The lesson is to differentiate between short-term noise and long-term fundamentals. Palantir\u2019s core strengths\u2014its technology, market position, and growth prospects\u2014are resilient.\n\n---\n\n### **Conclusion: Why the Bull Case Holds Strong**\n\nPalantir is not just riding a hype wave; it\u2019s building a sustainable, scalable platform at the forefront of AI and data analytics. The current technical momentum, financial stability, and strategic positioning strongly support continued growth. While valuation is high, it is justified by the enormous market potential and Palantir\u2019s unique competitive advantages.\n\n**In essence:** The risk-reward profile favors the bulls. The company\u2019s fundamentals, industry tailwinds, and technical momentum suggest that patience and strategic exposure could yield significant gains. The current overbought signals are typical in a strong trend and should be viewed as opportunities for disciplined entry points rather than reasons to dismiss the long-term story.\n\n---\n\n**Would you like me to outline specific tactical entry points or risk management strategies to complement this bullish outlook?**", + "bear_history": "\nBear Analyst: Certainly. Let\u2019s craft a compelling, well-reasoned bear argument that critically examines the bullish case, highlights the risks, and addresses lessons learned from past mistakes. I will also incorporate a dynamic engagement style, directly challenging the bull\u2019s points with specific data and logical reasoning.\n\n---\n\n**Bear Analyst:**\n\nThanks for the detailed bullish overview. While I appreciate the enthusiasm and the data supporting Palantir\u2019s growth prospects, I remain cautious\u2014and for good reason. Let me walk through the key risks, weaknesses, and lessons that temper the optimism.\n\n---\n\n### 1. **Valuation Risks: Overhyped Expectations and Unsustainable Multiples**\n\nYes, Palantir\u2019s current valuation is eye-watering: a P/E of around 460, EV/EBITDA near 585, and a market cap exceeding $300 billion. Historically, such multiples have often been a sign of a bubble rather than a sustainable valuation.\n\n**Lesson learned:** In past tech bubbles, stocks with sky-high valuations often saw sharp corrections when growth slowed or expectations weren\u2019t met. For example, during the 2000 dot-com bust, many companies traded at similar multiples before collapsing. The key question is: *Can Palantir justify these multiples?* \n\nGiven its moderate profitability (ROE ~10.81%, ROA ~3.57%) and high expenses, the company\u2019s earnings growth must be extraordinary to sustain this valuation. If growth stalls or misses targets, the stock could face a severe correction\u2014especially since the market is already pricing in near-perfection.\n\n**Counterpoint:** The current high valuation leaves little margin for error. Any slowdown in revenue growth, missed earnings targets, or macroeconomic shocks could trigger a rapid devaluation.\n\n---\n\n### 2. **Overreliance on Future Growth & Sector Risks**\n\nPalantir\u2019s prospects hinge heavily on AI adoption, government contracts, and enterprise digital transformation. But these are sectors fraught with risks:\n\n- **Government dependency:** A significant portion of revenue still comes from government contracts, which are subject to political shifts, budget cuts, and procurement delays. A sudden policy change or contract loss could impact revenue.\n\n- **Enterprise adoption challenges:** While the platform is flexible, large organizations often face internal resistance, lengthy deployment cycles, and integration issues. The assumption that growth will accelerate smoothly ignores these operational hurdles.\n\n- **Sector saturation & competition:** The AI and data analytics space is becoming crowded. Major tech giants like Microsoft, Google, and Amazon are investing heavily, and startups are emerging rapidly. Palantir\u2019s competitive moat may erode faster than anticipated.\n\n**Lesson learned:** Overestimating the ease of scaling and underestimating competitive pressures has historically led to overoptimistic valuations. The sector\u2019s rapid evolution can also render current technology obsolete quickly.\n\n---\n\n### 3. **Technical Overextension & Short-term Risks**\n\nThe technical indicators\u2014RSI (~63), proximity to the upper Bollinger Band (~127.56), and recent price near all-time highs (~136)\u2014suggest the stock is overbought. Such signals often precede consolidation or correction.\n\n**Lesson learned:** In previous cycles, chasing overbought stocks without regard for technical signals led to painful corrections. The recent momentum may be driven more by hype than fundamentals, increasing the risk of a sharp pullback.\n\n**Furthermore:** Insider sales, while not always negative, can sometimes signal insiders\u2019 lack of confidence in near-term prospects, especially if sales accelerate. The recent insider buying is encouraging but not enough to offset the broader overbought signals.\n\n---\n\n### 4. **Financials & Profitability: High Valuation vs. Modest Margins**\n\nWhile the low debt-to-equity (~0.05) indicates financial stability, the company\u2019s profitability margins are modest. The high valuation multiples imply expectations of exponential earnings growth, which is not yet visible in current margins or cash flows.\n\n**Lesson learned:** Relying solely on future growth expectations without current earnings or cash flow support has historically been risky. If Palantir fails to deliver on growth targets, the valuation could deflate rapidly.\n\n---\n\n### 5. **Behavioral Risks & Past Mistakes**\n\nIn previous investments, I\u2019ve seen how overconfidence in sector trends and hype can lead to significant losses. The lesson: valuations should be grounded in fundamentals, not just optimism.\n\n- **Hype-driven rallies:** The AI boom has led to speculative behavior, with retail investors driving prices beyond reasonable valuation. When sentiment shifts, the correction can be swift and severe.\n\n- **Confirmation bias:** It\u2019s tempting to focus on the positives\u2014AI leadership, partnerships, technical momentum\u2014while ignoring warning signs like valuation, sector saturation, and macro risks.\n\n**My takeaway:** Be cautious. The market can remain irrational longer than expected, and high valuations often revert to mean.\n\n---\n\n### **In Summary:**\n\nWhile Palantir\u2019s growth story is compelling, the current valuation, sector risks, technical overextension, and reliance on future expectations make it a risky bet. The lessons from past bubbles remind us that high multiples are dangerous if growth falters or if macro conditions turn adverse.\n\n**My advice:** Approach with caution. Prioritize risk management, avoid chasing overbought levels, and remember that fundamentals should anchor your investment thesis\u2014not hype.\n\n---\n\n**Would you like to discuss specific risk mitigation strategies or alternative scenarios?**", + "history": "\nBull Analyst: Absolutely, let's dive into a robust, evidence-based bull case for PLTR, directly engaging with the bear's concerns and demonstrating why the current setup offers compelling growth opportunities.\n\n---\n\n**First, let's acknowledge the bear's points:**\n\n- **Valuation concerns:** The stock's high P/E (~460) and EV/EBITDA (~585) ratios suggest overvaluation.\n- **Market volatility and sentiment:** Mixed social media signals and insider sales raise caution.\n- **Potential short-term corrections:** Proximity to overbought levels and upper Bollinger Band hint at possible pullbacks.\n\n**Now, here's why the bull case remains strong and why these concerns, while valid, don't outweigh the fundamentals:**\n\n---\n\n### 1. **Growth Potential: Massive Market Opportunities & Scalability**\n\nPalantir operates at the intersection of AI, data analytics, and government & enterprise digital transformation\u2014sectors projected to grow exponentially. The recent market research indicates that PLTR's revenue is on a robust upward trajectory, supported by expanding government contracts and a rapidly growing commercial client base.\n\n- **Revenue Projections & Scalability:** The company\u2019s recent financials show a market cap of ~$314 billion, with forward P/E around 156, implying investors expect significant earnings growth. Given the company's technological edge and expanding pipeline, these expectations are not unfounded. The AI boom, in particular, is a catalyst\u2014Palantir's platforms are uniquely positioned to capitalize on this trend, with a proven track record of integrating AI into complex data environments.\n\n- **Market Penetration & Expansion:** The recent strategic partnerships, like with Fedrigoni and other major firms, demonstrate Palantir's ability to scale across sectors. Their platform's flexibility allows for rapid deployment and customization, enabling them to capture new revenue streams efficiently.\n\n**In essence:** The current valuation, while high, is reflective of the enormous, scalable market opportunity and Palantir\u2019s position as a leader in AI-driven data solutions.\n\n---\n\n### 2. **Competitive Advantages: Unique Products & Market Position**\n\n- **Technological Edge:** Palantir\u2019s platforms (Foundry, Gotham) are not just data tools\u2014they are integrated AI ecosystems that provide actionable insights at scale. Their ability to handle complex, unstructured data sets gives them a moat that many competitors can't match.\n\n- **Strong Branding & Government Ties:** Their established relationships with government agencies and large enterprises create high switching costs, reinforcing their market dominance.\n\n- **Insider Buying & Strategic Partnerships:** Recent insider buying signals confidence from leadership, and strategic alliances expand their reach and credibility.\n\n**So, despite some short-term overbought signals, Palantir\u2019s competitive moat and technological superiority underpin its long-term growth trajectory.**\n\n---\n\n### 3. **Positive Market Indicators & Financial Health**\n\n- **Technical Momentum:** The 50 SMA (~112) and 200 SMA (~77) are well below the current price (~132.81), confirming a strong upward trend. The MACD (~5.11) indicates robust momentum, and the VWMA (~128) supports volume-backed growth.\n\n- **Moderate Volatility & Manageable Risks:** ATR (~6.90) suggests volatility is within manageable bounds, and the stock's recent activity near the upper Bollinger Band indicates a healthy trend rather than an overextended bubble.\n\n- **Financial Stability:** The low debt-to-equity (~0.05) and steady cash flows provide a cushion against macro shocks, allowing Palantir to continue investing in innovation and expansion.\n\n**In sum:** The technical and financial indicators support a continuation of the bullish trend, especially as the AI and data analytics sectors accelerate.\n\n---\n\n### 4. **Refuting the Bear's Concerns with Data & Lessons Learned**\n\n- **Valuation Overreach?** Yes, the multiples are high, but this is typical for high-growth tech stocks in their hyper-expansion phase. Historically, such valuations have been justified when the growth outlook is compelling\u2014think of early Amazon or Tesla phases. The key is whether Palantir can meet or exceed these expectations, which current data suggests it can.\n\n- **Insider Sales & Sentiment:** While some insiders have sold, this is often a normal liquidity or diversification move, not necessarily a sign of fundamental weakness. Moreover, recent insider buying and analyst upgrades (some targets as high as $140) indicate confidence in future growth.\n\n- **Market Corrections & Overbought Conditions:** Overbought signals like RSI (~63) and proximity to the upper Bollinger Band are cautionary but not definitive. They often precede consolidation rather than reversals, especially in strong trending stocks.\n\n- **Lessons from Past Mistakes:** In previous cycles, overreacting to valuation concerns led to missed opportunities. The lesson is to differentiate between short-term noise and long-term fundamentals. Palantir\u2019s core strengths\u2014its technology, market position, and growth prospects\u2014are resilient.\n\n---\n\n### **Conclusion: Why the Bull Case Holds Strong**\n\nPalantir is not just riding a hype wave; it\u2019s building a sustainable, scalable platform at the forefront of AI and data analytics. The current technical momentum, financial stability, and strategic positioning strongly support continued growth. While valuation is high, it is justified by the enormous market potential and Palantir\u2019s unique competitive advantages.\n\n**In essence:** The risk-reward profile favors the bulls. The company\u2019s fundamentals, industry tailwinds, and technical momentum suggest that patience and strategic exposure could yield significant gains. The current overbought signals are typical in a strong trend and should be viewed as opportunities for disciplined entry points rather than reasons to dismiss the long-term story.\n\n---\n\n**Would you like me to outline specific tactical entry points or risk management strategies to complement this bullish outlook?**\nBear Analyst: Certainly. Let\u2019s craft a compelling, well-reasoned bear argument that critically examines the bullish case, highlights the risks, and addresses lessons learned from past mistakes. I will also incorporate a dynamic engagement style, directly challenging the bull\u2019s points with specific data and logical reasoning.\n\n---\n\n**Bear Analyst:**\n\nThanks for the detailed bullish overview. While I appreciate the enthusiasm and the data supporting Palantir\u2019s growth prospects, I remain cautious\u2014and for good reason. Let me walk through the key risks, weaknesses, and lessons that temper the optimism.\n\n---\n\n### 1. **Valuation Risks: Overhyped Expectations and Unsustainable Multiples**\n\nYes, Palantir\u2019s current valuation is eye-watering: a P/E of around 460, EV/EBITDA near 585, and a market cap exceeding $300 billion. Historically, such multiples have often been a sign of a bubble rather than a sustainable valuation.\n\n**Lesson learned:** In past tech bubbles, stocks with sky-high valuations often saw sharp corrections when growth slowed or expectations weren\u2019t met. For example, during the 2000 dot-com bust, many companies traded at similar multiples before collapsing. The key question is: *Can Palantir justify these multiples?* \n\nGiven its moderate profitability (ROE ~10.81%, ROA ~3.57%) and high expenses, the company\u2019s earnings growth must be extraordinary to sustain this valuation. If growth stalls or misses targets, the stock could face a severe correction\u2014especially since the market is already pricing in near-perfection.\n\n**Counterpoint:** The current high valuation leaves little margin for error. Any slowdown in revenue growth, missed earnings targets, or macroeconomic shocks could trigger a rapid devaluation.\n\n---\n\n### 2. **Overreliance on Future Growth & Sector Risks**\n\nPalantir\u2019s prospects hinge heavily on AI adoption, government contracts, and enterprise digital transformation. But these are sectors fraught with risks:\n\n- **Government dependency:** A significant portion of revenue still comes from government contracts, which are subject to political shifts, budget cuts, and procurement delays. A sudden policy change or contract loss could impact revenue.\n\n- **Enterprise adoption challenges:** While the platform is flexible, large organizations often face internal resistance, lengthy deployment cycles, and integration issues. The assumption that growth will accelerate smoothly ignores these operational hurdles.\n\n- **Sector saturation & competition:** The AI and data analytics space is becoming crowded. Major tech giants like Microsoft, Google, and Amazon are investing heavily, and startups are emerging rapidly. Palantir\u2019s competitive moat may erode faster than anticipated.\n\n**Lesson learned:** Overestimating the ease of scaling and underestimating competitive pressures has historically led to overoptimistic valuations. The sector\u2019s rapid evolution can also render current technology obsolete quickly.\n\n---\n\n### 3. **Technical Overextension & Short-term Risks**\n\nThe technical indicators\u2014RSI (~63), proximity to the upper Bollinger Band (~127.56), and recent price near all-time highs (~136)\u2014suggest the stock is overbought. Such signals often precede consolidation or correction.\n\n**Lesson learned:** In previous cycles, chasing overbought stocks without regard for technical signals led to painful corrections. The recent momentum may be driven more by hype than fundamentals, increasing the risk of a sharp pullback.\n\n**Furthermore:** Insider sales, while not always negative, can sometimes signal insiders\u2019 lack of confidence in near-term prospects, especially if sales accelerate. The recent insider buying is encouraging but not enough to offset the broader overbought signals.\n\n---\n\n### 4. **Financials & Profitability: High Valuation vs. Modest Margins**\n\nWhile the low debt-to-equity (~0.05) indicates financial stability, the company\u2019s profitability margins are modest. The high valuation multiples imply expectations of exponential earnings growth, which is not yet visible in current margins or cash flows.\n\n**Lesson learned:** Relying solely on future growth expectations without current earnings or cash flow support has historically been risky. If Palantir fails to deliver on growth targets, the valuation could deflate rapidly.\n\n---\n\n### 5. **Behavioral Risks & Past Mistakes**\n\nIn previous investments, I\u2019ve seen how overconfidence in sector trends and hype can lead to significant losses. The lesson: valuations should be grounded in fundamentals, not just optimism.\n\n- **Hype-driven rallies:** The AI boom has led to speculative behavior, with retail investors driving prices beyond reasonable valuation. When sentiment shifts, the correction can be swift and severe.\n\n- **Confirmation bias:** It\u2019s tempting to focus on the positives\u2014AI leadership, partnerships, technical momentum\u2014while ignoring warning signs like valuation, sector saturation, and macro risks.\n\n**My takeaway:** Be cautious. The market can remain irrational longer than expected, and high valuations often revert to mean.\n\n---\n\n### **In Summary:**\n\nWhile Palantir\u2019s growth story is compelling, the current valuation, sector risks, technical overextension, and reliance on future expectations make it a risky bet. The lessons from past bubbles remind us that high multiples are dangerous if growth falters or if macro conditions turn adverse.\n\n**My advice:** Approach with caution. Prioritize risk management, avoid chasing overbought levels, and remember that fundamentals should anchor your investment thesis\u2014not hype.\n\n---\n\n**Would you like to discuss specific risk mitigation strategies or alternative scenarios?**", + "current_response": "Given the balanced yet cautious debate, I conclude that Palantir (PLTR) warrants a **Hold** at this juncture. While the bullish case highlights the company\u2019s impressive growth potential, technological moat, and sector tailwinds, the bearish arguments underscore significant valuation risks, sector saturation, dependence on future growth, and overbought technical signals that create downside risk.\n\nThe strongest points from the bear side\u2014particularly the high valuation multiples that are reminiscent of past bubbles\u2014cannot be dismissed lightly. Valuations pricing in extraordinary growth warrant skepticism, especially since earnings margins are still modest and sector risks are real. Short-term technical overextensions suggest a potential pullback or consolidation before upward continuation.\n\nTherefore, I recommend a **wait-and-see approach**. Enter gradually on dips, monitor sector developments, and only commit more capital once there are signs of sustained support and improved valuation metrics. This cautious stance helps protect against a possible correction while remaining positioned for future upside if the company can deliver on its growth expectations.\n\n---\n\n### investment plan:\n\n**Recommendation:** Hold. Do not rush into buying at current levels. Be patient and disciplined.\n\n**Rationale:** The high valuations and technical overbought signals pose notable risks. The company\u2019s growth prospects remain compelling, but uncertainty around macro conditions, sector competition, and sector-specific regulatory or political factors justifies a conservative approach.\n\n**Strategic Actions:**\n\n1. **Establish a partial position:** If already holding PLTR, consider trimming to reduce exposure and reallocating funds into more attractively valued opportunities or cash.\n\n2. **Wait for confirmation:** Look for a dip below key technical levels (e.g., back towards the 50-SMA or a retracement to support levels around $112\u2013$125) before adding more.\n\n3. **Monitor sector and macro developments:** Keep an eye on sector saturation signals, earnings reports, and any signs of slowing revenue growth or margin compression.\n\n4. **Set stop-loss levels:** If entering new positions, use prudent stop-losses (e.g., 10\u201315% below entry) to manage downside risk.\n\n5. **Reassess on pullbacks:** Revisit the thesis if a significant correction occurs and valuation metrics improve or growth prospects accelerate significantly.\n\n**Informed by past mistakes:** To avoid falling for hype or overestimating sector growth, keep a core focus on valuation discipline, sector reality checks, and technical signals. Patience and discipline are essential, especially in high-flying stocks like PLTR.\n\nBy adopting this balanced, cautious strategy, you position yourself to benefit from future upside while mitigating the risks from current overvaluation and technical overextension.", + "judge_decision": "Given the balanced yet cautious debate, I conclude that Palantir (PLTR) warrants a **Hold** at this juncture. While the bullish case highlights the company\u2019s impressive growth potential, technological moat, and sector tailwinds, the bearish arguments underscore significant valuation risks, sector saturation, dependence on future growth, and overbought technical signals that create downside risk.\n\nThe strongest points from the bear side\u2014particularly the high valuation multiples that are reminiscent of past bubbles\u2014cannot be dismissed lightly. Valuations pricing in extraordinary growth warrant skepticism, especially since earnings margins are still modest and sector risks are real. Short-term technical overextensions suggest a potential pullback or consolidation before upward continuation.\n\nTherefore, I recommend a **wait-and-see approach**. Enter gradually on dips, monitor sector developments, and only commit more capital once there are signs of sustained support and improved valuation metrics. This cautious stance helps protect against a possible correction while remaining positioned for future upside if the company can deliver on its growth expectations.\n\n---\n\n### investment plan:\n\n**Recommendation:** Hold. Do not rush into buying at current levels. Be patient and disciplined.\n\n**Rationale:** The high valuations and technical overbought signals pose notable risks. The company\u2019s growth prospects remain compelling, but uncertainty around macro conditions, sector competition, and sector-specific regulatory or political factors justifies a conservative approach.\n\n**Strategic Actions:**\n\n1. **Establish a partial position:** If already holding PLTR, consider trimming to reduce exposure and reallocating funds into more attractively valued opportunities or cash.\n\n2. **Wait for confirmation:** Look for a dip below key technical levels (e.g., back towards the 50-SMA or a retracement to support levels around $112\u2013$125) before adding more.\n\n3. **Monitor sector and macro developments:** Keep an eye on sector saturation signals, earnings reports, and any signs of slowing revenue growth or margin compression.\n\n4. **Set stop-loss levels:** If entering new positions, use prudent stop-losses (e.g., 10\u201315% below entry) to manage downside risk.\n\n5. **Reassess on pullbacks:** Revisit the thesis if a significant correction occurs and valuation metrics improve or growth prospects accelerate significantly.\n\n**Informed by past mistakes:** To avoid falling for hype or overestimating sector growth, keep a core focus on valuation discipline, sector reality checks, and technical signals. Patience and discipline are essential, especially in high-flying stocks like PLTR.\n\nBy adopting this balanced, cautious strategy, you position yourself to benefit from future upside while mitigating the risks from current overvaluation and technical overextension." + }, + "trader_investment_decision": "Analyzing the comprehensive investment plan and lessons from past experiences, the current outlook for PLTR suggests a cautious stance. The technical signals indicate overbought conditions, and valuation concerns highlight the risk of a correction. While the company's growth potential remains promising, the sector saturation and macroeconomic uncertainties reinforce the need for patience.\n\nGiven these factors, the prudent approach is to hold existing positions, avoid initiating new ones at current levels, and wait for clearer technical support signals or valuation improvements before increasing exposure. This strategy aligns with lessons learned about avoiding overenthusiastic entries during overextended periods and emphasizes disciplined risk management.\n\nFINAL TRANSACTION PROPOSAL: **HOLD**", + "risk_debate_state": { + "risky_history": "\nRisky Analyst: Let's start by addressing the conservative analyst's cautious stance. They argue that the technical signals indicate overbought conditions and that valuation concerns suggest a correction is imminent. While it's true that the RSI is approaching overbought levels and the price is near the upper Bollinger Band, these are often signs of strong momentum rather than imminent reversals. In fact, the current MACD momentum indicator is highly bullish, with a reading of around 5.11, signaling that the trend is still very much intact. Historically, stocks like PLTR, especially in a high-growth phase driven by AI and data analytics, tend to remain overextended for extended periods before a meaningful correction occurs. Waiting for technical support signals might mean missing out on a significant upside move, especially given the robust volume support indicated by the VWMA aligning with current prices.\n\nFurthermore, the valuation concerns, while valid in a traditional sense, overlook the sector's explosive growth potential. PLTR's valuation multiples\u2014like a P/E of over 459 and EV/EBITDA of nearly 585\u2014are high, but they are justified by the company's rapid revenue growth, expanding government and commercial contracts, and leadership in AI-driven data solutions. These are not typical tech valuations; they reflect a market that is pricing in transformative, disruptive potential. Waiting for valuation metrics to improve could mean missing the boat on a once-in-a-generation AI rally.\n\nNow, addressing the neutral analyst's position, which suggests holding and waiting for clearer signals or valuation improvements. While patience is a virtue, in high-growth sectors, excessive caution can lead to opportunity costs. The current technical landscape shows strong upward momentum supported by volume, and the fundamental outlook remains bullish. The recent social media sentiment, despite being mixed, is increasingly optimistic about PLTR's strategic positioning and AI advancements. The macro environment favors AI innovation, and the company's expanding pipeline of contracts and partnerships suggests that growth is accelerating.\n\nMoreover, the macroeconomic uncertainties cited are often the very catalysts that propel high-reward stocks higher, as investors seek alpha in volatile times. The sector saturation argument underestimates the company's unique competitive advantages\u2014its proprietary AI platform, government contracts, and strategic alliances position it to outperform sector averages. Waiting for a perfect technical or valuation signal might mean missing the early stages of a significant rally.\n\nIn essence, the conservative and neutral stances are overly cautious, potentially missing out on the substantial upside that PLTR offers. The current technical indicators, volume support, and sector momentum strongly suggest that now is the time to capitalize on the trend rather than delay for a better entry point that may never materialize. High risk, high reward is the mantra here\u2014embracing the volatility and overextension can lead to outsized gains, especially when the fundamentals and sector tailwinds are aligned. The opportunity cost of waiting could be the difference between riding a transformative wave and watching it pass by.", + "safe_history": "\nSafe Analyst: While I understand the enthusiasm for PLTR's recent momentum and sector prospects, I must emphasize that a cautious, risk-averse approach remains the most prudent for safeguarding our assets. The bullish arguments about overextension and sector growth often overlook the inherent risks of chasing high-flying stocks in a highly volatile environment. Just because the technical indicators show strong momentum doesn't mean a correction isn't imminent\u2014especially given how close the price is to the upper Bollinger Band and the RSI nearing overbought levels. These are classic signs of potential short-term pullbacks, and ignoring them could expose us to unnecessary losses.\n\nFurthermore, relying heavily on valuation multiples like a P/E of over 459 and EV/EBITDA of nearly 585 to justify continued buying is risky. While sector growth is compelling, such high valuations are often unsustainable and prone to sharp corrections if growth expectations are not met or if macroeconomic conditions shift unexpectedly. The market's willingness to assign such lofty multiples might be driven more by hype and sector momentum than by solid fundamentals, especially considering the moderate profitability margins and high expectations baked into the current price.\n\nAddressing the optimistic view that waiting might mean missing out, I believe that in a volatile market, patience and discipline are key. The opportunity cost of waiting is minimal compared to the potential downside of a sudden correction. The indicators show that the stock is overextended, and the recent social media sentiment, while positive, can quickly turn sour if macroeconomic headwinds or sector-specific risks materialize. The sector saturation argument also underestimates the risks of overvaluation and the possibility that the current rally is driven more by speculative interest than sustainable fundamentals.\n\nThe neutral analyst's call to \"wait for clearer signals\" is, in my view, the safest course. It prevents us from jumping into a potentially overbought situation that could reverse sharply. Our primary goal should be capital preservation and steady growth, not chasing after short-term gains that come with disproportionate risk. In high-growth, high-volatility sectors like AI and data analytics, the best strategy is to remain disciplined, avoid overextension, and wait for confirmed technical support or valuation normalization before increasing exposure. That way, we protect our assets from the inevitable corrections that tend to follow overextended rallies.", + "neutral_history": "\nNeutral Analyst: I appreciate the thorough perspectives from both the risky and safe analysts, and I think it's important to recognize that each has valid points but also some limitations. The risky analyst rightly points out that technical momentum indicators like MACD and volume support suggest the trend is still strong, and waiting for perfect support signals might cause us to miss out on significant upside, especially in a high-growth sector like AI and data analytics. However, they may be underestimating the risks of overextension; stocks can remain overbought for extended periods, and the proximity to the upper Bollinger Band and high RSI do signal caution, especially if macroeconomic headwinds or sector-specific corrections materialize unexpectedly.\n\nOn the other hand, the safe analyst emphasizes capital preservation and the dangers of chasing lofty valuations, which is a prudent stance. Yet, in high-growth sectors, valuations often become detached from fundamentals temporarily, driven by sector enthusiasm and future growth expectations. Waiting for valuation metrics to normalize might mean missing the early stages of a transformative rally, especially when the company's fundamentals\u2014such as expanding contracts, AI leadership, and strategic partnerships\u2014support continued growth.\n\nWhat I believe is missing from both perspectives is a nuanced, balanced approach. Instead of outright holding or rushing in, a moderate strategy could involve tightening risk controls\u2014like setting stop-loss levels based on ATR or recent support levels\u2014while maintaining exposure to the trend. This way, we can participate in the upside driven by strong momentum and sector tailwinds but also protect ourselves if signs of reversal or correction emerge. For example, we could consider gradually scaling into positions as the stock remains above key support levels, or wait for a slight pullback to confirm consolidation before increasing exposure.\n\nThis approach leverages the momentum and growth potential highlighted by the technical and fundamental data, while respecting the caution advised by valuation concerns and overbought signals. It\u2019s about balancing the desire to capitalize on a promising trend with the discipline to avoid overextension. In volatile sectors like AI, where news flow and macro factors can shift rapidly, a flexible, risk-managed stance can help us stay invested in the growth story without exposing ourselves to unnecessary downside. Ultimately, a moderate, phased approach aligns with the goal of achieving sustainable gains while safeguarding capital\u2014striking that middle ground between overconfidence and excessive caution.", + "history": "\nRisky Analyst: Let's start by addressing the conservative analyst's cautious stance. They argue that the technical signals indicate overbought conditions and that valuation concerns suggest a correction is imminent. While it's true that the RSI is approaching overbought levels and the price is near the upper Bollinger Band, these are often signs of strong momentum rather than imminent reversals. In fact, the current MACD momentum indicator is highly bullish, with a reading of around 5.11, signaling that the trend is still very much intact. Historically, stocks like PLTR, especially in a high-growth phase driven by AI and data analytics, tend to remain overextended for extended periods before a meaningful correction occurs. Waiting for technical support signals might mean missing out on a significant upside move, especially given the robust volume support indicated by the VWMA aligning with current prices.\n\nFurthermore, the valuation concerns, while valid in a traditional sense, overlook the sector's explosive growth potential. PLTR's valuation multiples\u2014like a P/E of over 459 and EV/EBITDA of nearly 585\u2014are high, but they are justified by the company's rapid revenue growth, expanding government and commercial contracts, and leadership in AI-driven data solutions. These are not typical tech valuations; they reflect a market that is pricing in transformative, disruptive potential. Waiting for valuation metrics to improve could mean missing the boat on a once-in-a-generation AI rally.\n\nNow, addressing the neutral analyst's position, which suggests holding and waiting for clearer signals or valuation improvements. While patience is a virtue, in high-growth sectors, excessive caution can lead to opportunity costs. The current technical landscape shows strong upward momentum supported by volume, and the fundamental outlook remains bullish. The recent social media sentiment, despite being mixed, is increasingly optimistic about PLTR's strategic positioning and AI advancements. The macro environment favors AI innovation, and the company's expanding pipeline of contracts and partnerships suggests that growth is accelerating.\n\nMoreover, the macroeconomic uncertainties cited are often the very catalysts that propel high-reward stocks higher, as investors seek alpha in volatile times. The sector saturation argument underestimates the company's unique competitive advantages\u2014its proprietary AI platform, government contracts, and strategic alliances position it to outperform sector averages. Waiting for a perfect technical or valuation signal might mean missing the early stages of a significant rally.\n\nIn essence, the conservative and neutral stances are overly cautious, potentially missing out on the substantial upside that PLTR offers. The current technical indicators, volume support, and sector momentum strongly suggest that now is the time to capitalize on the trend rather than delay for a better entry point that may never materialize. High risk, high reward is the mantra here\u2014embracing the volatility and overextension can lead to outsized gains, especially when the fundamentals and sector tailwinds are aligned. The opportunity cost of waiting could be the difference between riding a transformative wave and watching it pass by.\nSafe Analyst: While I understand the enthusiasm for PLTR's recent momentum and sector prospects, I must emphasize that a cautious, risk-averse approach remains the most prudent for safeguarding our assets. The bullish arguments about overextension and sector growth often overlook the inherent risks of chasing high-flying stocks in a highly volatile environment. Just because the technical indicators show strong momentum doesn't mean a correction isn't imminent\u2014especially given how close the price is to the upper Bollinger Band and the RSI nearing overbought levels. These are classic signs of potential short-term pullbacks, and ignoring them could expose us to unnecessary losses.\n\nFurthermore, relying heavily on valuation multiples like a P/E of over 459 and EV/EBITDA of nearly 585 to justify continued buying is risky. While sector growth is compelling, such high valuations are often unsustainable and prone to sharp corrections if growth expectations are not met or if macroeconomic conditions shift unexpectedly. The market's willingness to assign such lofty multiples might be driven more by hype and sector momentum than by solid fundamentals, especially considering the moderate profitability margins and high expectations baked into the current price.\n\nAddressing the optimistic view that waiting might mean missing out, I believe that in a volatile market, patience and discipline are key. The opportunity cost of waiting is minimal compared to the potential downside of a sudden correction. The indicators show that the stock is overextended, and the recent social media sentiment, while positive, can quickly turn sour if macroeconomic headwinds or sector-specific risks materialize. The sector saturation argument also underestimates the risks of overvaluation and the possibility that the current rally is driven more by speculative interest than sustainable fundamentals.\n\nThe neutral analyst's call to \"wait for clearer signals\" is, in my view, the safest course. It prevents us from jumping into a potentially overbought situation that could reverse sharply. Our primary goal should be capital preservation and steady growth, not chasing after short-term gains that come with disproportionate risk. In high-growth, high-volatility sectors like AI and data analytics, the best strategy is to remain disciplined, avoid overextension, and wait for confirmed technical support or valuation normalization before increasing exposure. That way, we protect our assets from the inevitable corrections that tend to follow overextended rallies.\nNeutral Analyst: I appreciate the thorough perspectives from both the risky and safe analysts, and I think it's important to recognize that each has valid points but also some limitations. The risky analyst rightly points out that technical momentum indicators like MACD and volume support suggest the trend is still strong, and waiting for perfect support signals might cause us to miss out on significant upside, especially in a high-growth sector like AI and data analytics. However, they may be underestimating the risks of overextension; stocks can remain overbought for extended periods, and the proximity to the upper Bollinger Band and high RSI do signal caution, especially if macroeconomic headwinds or sector-specific corrections materialize unexpectedly.\n\nOn the other hand, the safe analyst emphasizes capital preservation and the dangers of chasing lofty valuations, which is a prudent stance. Yet, in high-growth sectors, valuations often become detached from fundamentals temporarily, driven by sector enthusiasm and future growth expectations. Waiting for valuation metrics to normalize might mean missing the early stages of a transformative rally, especially when the company's fundamentals\u2014such as expanding contracts, AI leadership, and strategic partnerships\u2014support continued growth.\n\nWhat I believe is missing from both perspectives is a nuanced, balanced approach. Instead of outright holding or rushing in, a moderate strategy could involve tightening risk controls\u2014like setting stop-loss levels based on ATR or recent support levels\u2014while maintaining exposure to the trend. This way, we can participate in the upside driven by strong momentum and sector tailwinds but also protect ourselves if signs of reversal or correction emerge. For example, we could consider gradually scaling into positions as the stock remains above key support levels, or wait for a slight pullback to confirm consolidation before increasing exposure.\n\nThis approach leverages the momentum and growth potential highlighted by the technical and fundamental data, while respecting the caution advised by valuation concerns and overbought signals. It\u2019s about balancing the desire to capitalize on a promising trend with the discipline to avoid overextension. In volatile sectors like AI, where news flow and macro factors can shift rapidly, a flexible, risk-managed stance can help us stay invested in the growth story without exposing ourselves to unnecessary downside. Ultimately, a moderate, phased approach aligns with the goal of achieving sustainable gains while safeguarding capital\u2014striking that middle ground between overconfidence and excessive caution.", + "judge_decision": "**Recommendation:** HOLD\n\n**Rationale:**\n\nThe debate presents a nuanced picture:\n\n- **Risky Analyst** emphasizes strong technical momentum, with a high MACD (5.11) and volume support, suggesting the trend remains bullish. They argue that technical overextensions like the RSI approaching overbought levels and proximity to the upper Bollinger Band shouldn\u2019t preclude further upside, especially given sector tailwinds and PLTR\u2019s growth prospects. However, they risk underestimating the potential for a technical pullback after sustained overextension.\n\n- **Neutral Analyst** advocates a balanced approach\u2014acknowledging robust momentum but recommending caution with stop-loss levels, partial scaling in, and waiting for confirmation signals. They warn against overestimating the sustainability of high valuations and suggest a wait-and-see stance may mitigate downside risks.\n\n- **Safe Analyst** underscores valuation risks, sector saturation, macroeconomic uncertainties, and the danger of chasing high-flying stocks near technical overbought zones. They recommend patience, capital preservation, and avoiding overcommitment until clearer signs of sustained support or valuation normalization appear.\n\n**Supporting Arguments:**\n\n- **From the Debate:** The technical momentum (high MACD, volume support) indicates upward trend strength. But the proximity to overbought levels (RSI near 72, upper Bollinger Band) signals potential short-term correction. Valuation multiples (P/E over 459, EV/EBITDA near 585) are extreme, raising concerns about sustainability, especially if growth slows or macro risks materialize.\n\n- **Counterpoints:** While sector momentum and transformative growth justify some optimism, high valuations and technical overextensions warrant discipline. Waiting for a dip or consolidation reduces risk of abrupt reversals.\n\n**Actionable Strategic Refinement:**\n\n- **Partial Positioning:** If currently invested, consider trimming exposure to reduce overcommitment.\n- **Wait for Support:** Look for a retracement toward key support levels (e.g., $112\u2013$125) to confirm consolidation before adding.\n- **Risk Management:** Implement tight stops (e.g., 10\u201315% below entry) to protect against downside.\n- **Continual Monitoring:** Track sector developments, earnings, and macro indicators to reassess.\n\n**Conclusion:**\n\nGiven the strong momentum but significant overextension risks, valuation detachment, and macro uncertainties, a **Hold** position\u2014characterized by patience and disciplined entry\u2014is most prudent. This stance allows participation if the trend continues but protects capital from potential correction, aligning with risk-aware investment principles and lessons from past overestimations." + }, + "investment_plan": "Given the balanced yet cautious debate, I conclude that Palantir (PLTR) warrants a **Hold** at this juncture. While the bullish case highlights the company\u2019s impressive growth potential, technological moat, and sector tailwinds, the bearish arguments underscore significant valuation risks, sector saturation, dependence on future growth, and overbought technical signals that create downside risk.\n\nThe strongest points from the bear side\u2014particularly the high valuation multiples that are reminiscent of past bubbles\u2014cannot be dismissed lightly. Valuations pricing in extraordinary growth warrant skepticism, especially since earnings margins are still modest and sector risks are real. Short-term technical overextensions suggest a potential pullback or consolidation before upward continuation.\n\nTherefore, I recommend a **wait-and-see approach**. Enter gradually on dips, monitor sector developments, and only commit more capital once there are signs of sustained support and improved valuation metrics. This cautious stance helps protect against a possible correction while remaining positioned for future upside if the company can deliver on its growth expectations.\n\n---\n\n### investment plan:\n\n**Recommendation:** Hold. Do not rush into buying at current levels. Be patient and disciplined.\n\n**Rationale:** The high valuations and technical overbought signals pose notable risks. The company\u2019s growth prospects remain compelling, but uncertainty around macro conditions, sector competition, and sector-specific regulatory or political factors justifies a conservative approach.\n\n**Strategic Actions:**\n\n1. **Establish a partial position:** If already holding PLTR, consider trimming to reduce exposure and reallocating funds into more attractively valued opportunities or cash.\n\n2. **Wait for confirmation:** Look for a dip below key technical levels (e.g., back towards the 50-SMA or a retracement to support levels around $112\u2013$125) before adding more.\n\n3. **Monitor sector and macro developments:** Keep an eye on sector saturation signals, earnings reports, and any signs of slowing revenue growth or margin compression.\n\n4. **Set stop-loss levels:** If entering new positions, use prudent stop-losses (e.g., 10\u201315% below entry) to manage downside risk.\n\n5. **Reassess on pullbacks:** Revisit the thesis if a significant correction occurs and valuation metrics improve or growth prospects accelerate significantly.\n\n**Informed by past mistakes:** To avoid falling for hype or overestimating sector growth, keep a core focus on valuation discipline, sector reality checks, and technical signals. Patience and discipline are essential, especially in high-flying stocks like PLTR.\n\nBy adopting this balanced, cautious strategy, you position yourself to benefit from future upside while mitigating the risks from current overvaluation and technical overextension.", + "final_trade_decision": "**Recommendation:** HOLD\n\n**Rationale:**\n\nThe debate presents a nuanced picture:\n\n- **Risky Analyst** emphasizes strong technical momentum, with a high MACD (5.11) and volume support, suggesting the trend remains bullish. They argue that technical overextensions like the RSI approaching overbought levels and proximity to the upper Bollinger Band shouldn\u2019t preclude further upside, especially given sector tailwinds and PLTR\u2019s growth prospects. However, they risk underestimating the potential for a technical pullback after sustained overextension.\n\n- **Neutral Analyst** advocates a balanced approach\u2014acknowledging robust momentum but recommending caution with stop-loss levels, partial scaling in, and waiting for confirmation signals. They warn against overestimating the sustainability of high valuations and suggest a wait-and-see stance may mitigate downside risks.\n\n- **Safe Analyst** underscores valuation risks, sector saturation, macroeconomic uncertainties, and the danger of chasing high-flying stocks near technical overbought zones. They recommend patience, capital preservation, and avoiding overcommitment until clearer signs of sustained support or valuation normalization appear.\n\n**Supporting Arguments:**\n\n- **From the Debate:** The technical momentum (high MACD, volume support) indicates upward trend strength. But the proximity to overbought levels (RSI near 72, upper Bollinger Band) signals potential short-term correction. Valuation multiples (P/E over 459, EV/EBITDA near 585) are extreme, raising concerns about sustainability, especially if growth slows or macro risks materialize.\n\n- **Counterpoints:** While sector momentum and transformative growth justify some optimism, high valuations and technical overextensions warrant discipline. Waiting for a dip or consolidation reduces risk of abrupt reversals.\n\n**Actionable Strategic Refinement:**\n\n- **Partial Positioning:** If currently invested, consider trimming exposure to reduce overcommitment.\n- **Wait for Support:** Look for a retracement toward key support levels (e.g., $112\u2013$125) to confirm consolidation before adding.\n- **Risk Management:** Implement tight stops (e.g., 10\u201315% below entry) to protect against downside.\n- **Continual Monitoring:** Track sector developments, earnings, and macro indicators to reassess.\n\n**Conclusion:**\n\nGiven the strong momentum but significant overextension risks, valuation detachment, and macro uncertainties, a **Hold** position\u2014characterized by patience and disciplined entry\u2014is most prudent. This stance allows participation if the trend continues but protects capital from potential correction, aligning with risk-aware investment principles and lessons from past overestimations." + } +} \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 9c86f454..618ed54d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,22 @@ +# Backend dependencies - Django +Django==4.2.7 +django-cors-headers==4.3.1 +django-rest-framework==0.1.0 +djangorestframework==3.14.0 +djangorestframework-simplejwt==5.3.0 +python-decouple==3.8 +cryptography==41.0.7 +mysqlclient==2.2.0 +channels==4.0.0 +channels-redis + +# Existing CLI dependencies +typer + +questionary +pydantic +# OpenAI and other AI dependencies +openai typing-extensions langchain-openai langchain-experimental @@ -7,7 +26,6 @@ praw feedparser stockstats eodhd -langgraph chromadb setuptools backtrader @@ -22,3 +40,4 @@ redis chainlit rich questionary +langgraph==0.4.8 diff --git a/scripts/docker-commands.sh b/scripts/docker-commands.sh new file mode 100644 index 00000000..4aefd56e --- /dev/null +++ b/scripts/docker-commands.sh @@ -0,0 +1,104 @@ +#!/bin/bash + +# TradingAgents Docker ๊ด€๋ฆฌ ์Šคํฌ๋ฆฝํŠธ +# ์‚ฌ์šฉ๋ฒ•: ./scripts/docker-commands.sh [command] + +case "$1" in + "start") + echo "๐Ÿš€ MySQL๊ณผ Redis ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค..." + docker-compose up -d mysql redis + echo "โœ… ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค." + docker-compose ps + ;; + + "start-all") + echo "๐Ÿš€ ๋ชจ๋“  ์„œ๋น„์Šค(MySQL, Redis, phpMyAdmin)๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค..." + docker-compose up -d + echo "โœ… ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค." + docker-compose ps + ;; + + "stop") + echo "๐Ÿ›‘ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค..." + docker-compose down + echo "โœ… ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ค‘์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค." + ;; + + "restart") + echo "๐Ÿ”„ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์žฌ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค..." + docker-compose restart mysql redis + echo "โœ… ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์žฌ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค." + ;; + + "logs") + echo "๐Ÿ“‹ ์ปจํ…Œ์ด๋„ˆ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค..." + if [ -n "$2" ]; then + docker-compose logs -f "$2" + else + docker-compose logs -f + fi + ;; + + "status") + echo "๐Ÿ“Š ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค..." + docker-compose ps + echo "" + echo "๐Ÿ” ํฌํŠธ ์ •๋ณด:" + docker port tradingagents_mysql 2>/dev/null || echo "MySQL ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰ ์ค‘์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค." + docker port tradingagents_redis 2>/dev/null || echo "Redis ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰ ์ค‘์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค." + ;; + + "clean") + echo "๐Ÿงน ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” Docker ๋ฆฌ์†Œ์Šค๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค..." + docker system prune -f + echo "โœ… ์ •๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค." + ;; + + "reset") + echo "โš ๏ธ ๊ฒฝ๊ณ : ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค!" + read -p "์ •๋ง๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? (y/N): " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + echo "๐Ÿ—‘๏ธ ๋ณผ๋ฅจ๊ณผ ํ•จ๊ป˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค..." + docker-compose down -v + echo "๐Ÿš€ ์ƒˆ๋กœ์šด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค..." + docker-compose up -d mysql redis + echo "โœ… ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค." + else + echo "โŒ ์ทจ์†Œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค." + fi + ;; + + "mysql") + echo "๐Ÿ”— MySQL ์ปจํ…Œ์ด๋„ˆ์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค..." + docker-compose exec mysql mysql -u root -p tradingagents_web + ;; + + "redis") + echo "๐Ÿ”— Redis ์ปจํ…Œ์ด๋„ˆ์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค..." + docker-compose exec redis redis-cli + ;; + + *) + echo "๐Ÿณ TradingAgents Docker ๊ด€๋ฆฌ ์Šคํฌ๋ฆฝํŠธ" + echo "" + echo "์‚ฌ์šฉ๋ฒ•: $0 [command]" + echo "" + echo "๋ช…๋ น์–ด:" + echo " start - MySQL๊ณผ Redis ์ปจํ…Œ์ด๋„ˆ ์‹œ์ž‘" + echo " start-all - ๋ชจ๋“  ์„œ๋น„์Šค ์‹œ์ž‘ (phpMyAdmin ํฌํ•จ)" + echo " stop - ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ์ค‘์ง€" + echo " restart - MySQL๊ณผ Redis ์žฌ์‹œ์ž‘" + echo " logs - ์ปจํ…Œ์ด๋„ˆ ๋กœ๊ทธ ํ™•์ธ (logs [service_name])" + echo " status - ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ ํ™•์ธ" + echo " clean - ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” Docker ๋ฆฌ์†Œ์Šค ์ •๋ฆฌ" + echo " reset - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ดˆ๊ธฐํ™” (์ฃผ์˜: ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์‚ญ์ œ)" + echo " mysql - MySQL ์ปจํ…Œ์ด๋„ˆ์— ์ง์ ‘ ์—ฐ๊ฒฐ" + echo " redis - Redis ์ปจํ…Œ์ด๋„ˆ์— ์ง์ ‘ ์—ฐ๊ฒฐ" + echo "" + echo "์˜ˆ์‹œ:" + echo " $0 start" + echo " $0 logs mysql" + echo " $0 status" + ;; +esac \ No newline at end of file diff --git a/tradingagents/dataflows/data_cache/NVDA-YFin-data-2010-06-12-2025-06-12.csv b/tradingagents/dataflows/data_cache/NVDA-YFin-data-2010-06-12-2025-06-12.csv new file mode 100644 index 00000000..aee77e0f --- /dev/null +++ b/tradingagents/dataflows/data_cache/NVDA-YFin-data-2010-06-12-2025-06-12.csv @@ -0,0 +1,3774 @@ +Date,Close,High,Low,Open,Volume +2010-06-14,0.2604282796382904,0.2705152695878703,0.25974052411246495,0.2700567750135727,375080000 +2010-06-15,0.2732662260532379,0.27464170944574273,0.26294995030131835,0.2634084720942382,528632000 +2010-06-16,0.26982754468917847,0.2739540505658157,0.2661595333924436,0.2714322893832156,366480000 +2010-06-17,0.28014376759529114,0.28083152306048614,0.2695982566723156,0.27922677852753486,859068000 +2010-06-18,0.2819778323173523,0.28541658303722717,0.2796853318374357,0.2817485713378561,932832000 +2010-06-21,0.27532944083213806,0.288625943107738,0.27280770783441594,0.287938215135745,579836000 +2010-06-22,0.2650134265422821,0.28220718754910395,0.2636379147302271,0.2787684353477396,818164000 +2010-06-23,0.2679935693740845,0.27074456449363216,0.259969790338198,0.26753507474228677,614060000 +2010-06-24,0.25469690561294556,0.2677641736820045,0.253779916810686,0.2663886631498674,725028000 +2010-06-25,0.25400930643081665,0.25676030156079943,0.24988280007146163,0.2565310405796502,507220000 +2010-06-28,0.25446778535842896,0.2581357968578549,0.24988278464852645,0.25584329650290366,372008000 +2010-06-29,0.24025428295135498,0.24919505153884586,0.23864953802398864,0.24896579055118107,660808000 +2010-06-30,0.23406441509723663,0.24323441257170292,0.23406441509723663,0.24071265233472544,623072000 +2010-07-01,0.2379617989063263,0.23956654394507557,0.22764553199871615,0.23475230882882775,737008000 +2010-07-02,0.23498153686523438,0.23933730452733878,0.22695778453525448,0.2388788098599498,737096000 +2010-07-06,0.23245973885059357,0.2416297390014137,0.23039647241940533,0.23406448341123584,712020000 +2010-07-07,0.24369291961193085,0.24506843023590208,0.23291817748665475,0.23337667191839528,608412000 +2010-07-08,0.23635703325271606,0.24552703533578557,0.2333767771099661,0.24529780168096596,783272000 +2010-07-09,0.2372739315032959,0.2388787031151985,0.2342936765038715,0.23750319239892526,571516000 +2010-07-12,0.2416297197341919,0.2446099750113182,0.2370447200243834,0.23727395361262144,565396000 +2010-07-13,0.2503412067890167,0.25194595110721507,0.2441514630881078,0.2455269465056698,723316000 +2010-07-14,0.2528631389141083,0.2631793945233774,0.24919512598819324,0.2613453880604199,1355664000 +2010-07-15,0.24575622379779816,0.25332147874960975,0.24277596853450825,0.25309221783368213,953088000 +2010-07-16,0.23039652407169342,0.24644405526205934,0.22947953478253527,0.2457562996308096,1288604000 +2010-07-19,0.2397957742214203,0.24071276346069928,0.23200125637250588,0.23360602853438525,798440000 +2010-07-20,0.24575622379779816,0.24713170730710238,0.23154270290037773,0.23360596915746482,1160988000 +2010-07-21,0.23773236572742462,0.24827787233675078,0.23543986666702715,0.24804863882795772,624940000 +2010-07-22,0.2416297197341919,0.24415148050608815,0.23887872537405758,0.24025420888974777,462612000 +2010-07-23,0.23750320076942444,0.24162970573492615,0.23521070104734043,0.2414004448312168,817604000 +2010-07-26,0.24185898900032043,0.24277600547480843,0.23314748280085343,0.23681549404128943,683548000 +2010-07-27,0.2397957742214203,0.24300526388765747,0.23681551820062247,0.242546769268018,683472000 +2010-07-28,0.23223045468330383,0.24002497042900198,0.2315426992750432,0.23589846530819158,1320808000 +2010-07-29,0.20930543541908264,0.22008019303353196,0.20792993822653383,0.2154951932821179,2664476000 +2010-07-30,0.2106809765100479,0.21434897410468437,0.20449121775874352,0.20770072077819254,984288000 +2010-08-02,0.21045167744159698,0.21526593793101337,0.2095346747929283,0.2143489352823447,917020000 +2010-08-03,0.20494970679283142,0.20907621251546857,0.20334496215868295,0.20884696523407287,955444000 +2010-08-04,0.21366111934185028,0.21434887454958007,0.2058666195331943,0.20678362192204314,855496000 +2010-08-05,0.21641218662261963,0.21687068111221666,0.2104516762715988,0.21434893409067984,800504000 +2010-08-06,0.21893393993377686,0.22122643977637502,0.21366118483005034,0.21549519016987964,739904000 +2010-08-09,0.22099719941616058,0.22145570759760363,0.2157244441480182,0.22122644667469346,466456000 +2010-08-10,0.21182715892791748,0.21778765482271026,0.21091015640617058,0.21732916039402414,772560000 +2010-08-11,0.20357419550418854,0.2074714400142612,0.20288644004270381,0.2074714400142612,796148000 +2010-08-12,0.20540820062160492,0.20999320058564097,0.19830143974584688,0.1999061842675084,1343584000 +2010-08-13,0.2152659147977829,0.21824616966959326,0.21159790459728545,0.2120564127045352,1797392000 +2010-08-16,0.20976398885250092,0.21664148996354354,0.20701298020945585,0.21228573652700722,814008000 +2010-08-17,0.2125149369239807,0.2164121948919805,0.20976394255252664,0.21182719516330573,481224000 +2010-08-18,0.21366111934185028,0.21549512411954794,0.21045161781306573,0.21182712822852534,352920000 +2010-08-19,0.22649918496608734,0.22718694035451406,0.21480742534909106,0.21595367522021805,1615100000 +2010-08-20,0.22856242954730988,0.2340644451353263,0.22466518558626802,0.22489443281967475,1305308000 +2010-08-23,0.22512365877628326,0.2349814118604829,0.22443590347668813,0.2292501632451051,748620000 +2010-08-24,0.22283121943473816,0.22512371949924884,0.21732921654703688,0.21778771109418774,641332000 +2010-08-25,0.22741618752479553,0.2292501927837761,0.2191631775237593,0.22030944105890438,757532000 +2010-08-26,0.22466517984867096,0.2329181893555508,0.22466517984867096,0.23039642885935113,657596000 +2010-08-27,0.23200124502182007,0.2338352507394099,0.22030949614922932,0.22604074693622278,1060416000 +2010-08-30,0.22099719941616058,0.2310842154353797,0.22099719941616058,0.22925021003836216,602804000 +2010-08-31,0.2138904184103012,0.22466517449210896,0.21320266307966715,0.2177876621788938,931488000 +2010-09-01,0.21549521386623383,0.2198509667790144,0.21434896381889043,0.21709997213114163,851440000 +2010-09-02,0.21939249336719513,0.22008023526324716,0.21411973717556443,0.2161829901924799,596292000 +2010-09-03,0.22695772349834442,0.22764546531446994,0.22191421519153323,0.22466522344916973,566484000 +2010-09-07,0.22902093827724457,0.23429367931688747,0.22581143600803208,0.22626993047604418,899820000 +2010-09-08,0.23658624291419983,0.23819101497899894,0.22695774716920078,0.22947950841780584,1224156000 +2010-09-09,0.23337677121162415,0.2397957779732918,0.23039651514419687,0.23956651699550463,697748000 +2010-09-10,0.23085495829582214,0.23566921912579705,0.22879171927083583,0.23498146367454992,609292000 +2010-09-13,0.24392223358154297,0.24690248902962977,0.23498146723728253,0.23498146723728253,1015792000 +2010-09-14,0.2416297197341919,0.24483920859955627,0.2395664534675257,0.24185895332242993,698536000 +2010-09-15,0.24208815395832062,0.24231741481822558,0.23612764488826307,0.2393371602831968,555572000 +2010-09-16,0.24231746792793274,0.2443807068042973,0.23887871824815643,0.23887871824815643,365280000 +2010-09-17,0.24185898900032043,0.24483924471707993,0.24117126080540194,0.24461001109502642,416884000 +2010-09-20,0.2455269694328308,0.24644398579225457,0.23956645874721733,0.2418589586526449,443168000 +2010-09-21,0.2588234543800354,0.2629499593571674,0.24415146704884647,0.24415146704884647,1779624000 +2010-09-22,0.2611159384250641,0.2634084377759779,0.2563016788566459,0.257906422936536,999996000 +2010-09-23,0.2663886845111847,0.2746416937083083,0.2618036854747271,0.2640961849929559,1240872000 +2010-09-24,0.28106075525283813,0.28197777164474896,0.2702860107813631,0.27234924983784037,1086976000 +2010-09-27,0.2751002013683319,0.2833531828135082,0.27143219139575453,0.2831239492706899,999504000 +2010-09-28,0.27441251277923584,0.27830975724186946,0.26959825193619985,0.2753295018308831,723192000 +2010-09-29,0.2723492681980133,0.2803730460209378,0.26936901254871404,0.27189077363552666,974904000 +2010-09-30,0.26776424050331116,0.27899750644239585,0.26547174059681483,0.27578799017604827,787632000 +2010-10-01,0.2601989805698395,0.2721200017277985,0.258135741623368,0.2716614798919123,999120000 +2010-10-04,0.2576771080493927,0.2620328723002163,0.2524043551819442,0.2576771080493927,749500000 +2010-10-05,0.25951141119003296,0.26363791937004816,0.2588236552719015,0.2631794245342184,753588000 +2010-10-06,0.24713170528411865,0.2606574706517901,0.24460997187332653,0.2595112207390427,1057604000 +2010-10-07,0.24529778957366943,0.24850727921282645,0.2379617664062924,0.24827801824056073,761488000 +2010-10-08,0.24896575510501862,0.25102902171395974,0.24094200428179519,0.24438075463460524,706932000 +2010-10-11,0.24781948328018188,0.25217524974279537,0.24667323326298193,0.2501119833145818,442680000 +2010-10-12,0.2526337802410126,0.25378003042135705,0.24369301243706962,0.24575627915894568,605208000 +2010-10-13,0.25996968150138855,0.2636376916776736,0.25400919912586295,0.2567601930937017,968732000 +2010-10-14,0.25584331154823303,0.2606575461794845,0.25469703397458854,0.2601990515472836,599172000 +2010-10-15,0.2588234543800354,0.2629499593571674,0.25584322659592845,0.25996970424430804,639940000 +2010-10-18,0.2604282796382904,0.2615745297384135,0.25446776818614714,0.2590527685866395,448156000 +2010-10-19,0.2588234543800354,0.26065745962862213,0.2526337105787136,0.2546969494029034,866136000 +2010-10-20,0.2588234543800354,0.2659302144700268,0.2544677158273003,0.2590527152843909,763532000 +2010-10-21,0.25423842668533325,0.25951118094110665,0.25034118304541364,0.25905268651207186,1014428000 +2010-10-22,0.27051520347595215,0.2725784695491816,0.2530921952806326,0.25584321671160515,1322676000 +2010-10-25,0.27303704619407654,0.27510031288833786,0.27005679029931656,0.2725785515938272,673136000 +2010-10-26,0.2721199691295624,0.27624647385693046,0.2675349699499869,0.2698274695397746,675248000 +2010-10-27,0.27601727843284607,0.27693426755475437,0.2689105170874062,0.2695982725932161,496796000 +2010-10-28,0.27624648809432983,0.2806022266079155,0.2737247274840946,0.2796852376562403,704448000 +2010-10-29,0.275558739900589,0.2785389950643633,0.2728077456450869,0.2757879734801083,554664000 +2010-11-01,0.27601727843284607,0.2817485287666662,0.273724778299318,0.2773927894444658,473920000 +2010-11-02,0.2817484438419342,0.286333442726978,0.27555870081287487,0.2771634449568904,581036000 +2010-11-03,0.2838118076324463,0.2856458132848158,0.276246551396896,0.2835825466776157,671748000 +2010-11-04,0.2842702269554138,0.2895429815617784,0.28381173249589325,0.28656272658176785,700016000 +2010-11-05,0.2890845835208893,0.29160631755370414,0.28495807735138456,0.2863335611887126,735116000 +2010-11-08,0.29023075103759766,0.2927524843520399,0.2865627405254512,0.28885524026335463,605156000 +2010-11-09,0.28862592577934265,0.2925231964733154,0.28702118172645547,0.2902306971609773,633964000 +2010-11-10,0.2920647859573364,0.2920647859573364,0.2865627696303024,0.2906892750433891,521016000 +2010-11-11,0.2890845835208893,0.2938988179446778,0.28129006579432253,0.28518731099322575,1089980000 +2010-11-12,0.3039857745170593,0.3136142960727603,0.29871301921959326,0.3000885301071948,2142560000 +2010-11-15,0.30031776428222656,0.3097170249318825,0.2996300361658533,0.30536128599399603,733548000 +2010-11-16,0.29137691855430603,0.2994006653692058,0.2909184242020607,0.2952741615415084,739356000 +2010-11-17,0.2961912155151367,0.2996299645905778,0.2883967012135547,0.29114769500815785,551764000 +2010-11-18,0.3053613007068634,0.3083415562268428,0.30008854514517014,0.30008854514517014,993120000 +2010-11-19,0.31521907448768616,0.31636532457449107,0.30421506818860744,0.30467356275757784,716484000 +2010-11-22,0.3154483139514923,0.31728229210246245,0.3104047920500567,0.31315581393402375,462668000 +2010-11-23,0.3081122040748596,0.314989702163925,0.30581970471183784,0.31178021398719374,457832000 +2010-11-24,0.31567755341529846,0.31682380344530836,0.3110925532952588,0.31132181423276334,397784000 +2010-11-26,0.31178030371665955,0.3172822928398691,0.31178030371665955,0.3154483146846366,143104000 +2010-11-29,0.31521907448768616,0.31636532457449107,0.3090293294846912,0.3104048131916024,468192000 +2010-11-30,0.3120095133781433,0.3136142851339559,0.30627826376096656,0.3104047689510846,720936000 +2010-12-01,0.32576456665992737,0.3278278057608028,0.31774081653401337,0.31819931107545724,626536000 +2010-12-02,0.3296617865562439,0.33172505283129033,0.32553528133490506,0.32576454225282825,529316000 +2010-12-03,0.33906105160713196,0.33906105160713196,0.32736929120688607,0.3280570466413866,606044000 +2010-12-06,0.33264195919036865,0.340894967582333,0.3312664760108728,0.34020721232821144,438424000 +2010-12-07,0.34341683983802795,0.3514405899881962,0.3397488288378771,0.3404365843164999,1026812000 +2010-12-08,0.3463971018791199,0.3500650856195499,0.3404365907238806,0.3429583517500411,613252000 +2010-12-09,0.3406657874584198,0.3429583146250647,0.3333297934429188,0.3381440540339918,942408000 +2010-12-10,0.34272903203964233,0.34593852067825837,0.33974877697306916,0.3406657659187446,451900000 +2010-12-13,0.3340176045894623,0.34479235015952076,0.33310058810405324,0.3441046219564119,609108000 +2010-12-14,0.334476113319397,0.34662637046726447,0.3340176187216728,0.34043662507608957,755160000 +2010-12-15,0.32714006304740906,0.3392903181628512,0.3266815411976243,0.33516381281607305,624176000 +2010-12-16,0.3275986313819885,0.332412893259424,0.32668161480455454,0.33057888743331715,631872000 +2010-12-17,0.32943254709243774,0.33126655241685593,0.32393053111918313,0.3278277753531008,593156000 +2010-12-20,0.3280571699142456,0.332183676743097,0.327827908907012,0.3305789316787561,344088000 +2010-12-21,0.3408951163291931,0.3408951163291931,0.3310373595954232,0.3312666205564157,466952000 +2010-12-22,0.3445630967617035,0.3450215913137178,0.33699784100281927,0.34020733019567595,477988000 +2010-12-23,0.34204134345054626,0.3445631045366627,0.3406658324347087,0.3445631045366627,273784000 +2010-12-27,0.3438752293586731,0.34639698956720605,0.3349344655246682,0.3411242356131131,255500000 +2010-12-28,0.34249982237815857,0.3461678333671131,0.3404365832773442,0.3438753333312055,194260000 +2010-12-29,0.34249982237815857,0.3450215833491593,0.33929033325939045,0.3422705887718215,177660000 +2010-12-30,0.34364593029022217,0.3457091958665825,0.34089493685048655,0.3420411863944385,174488000 +2010-12-31,0.3530452251434326,0.3535037468729223,0.34341673341286055,0.34387522781360247,391252000 +2011-01-03,0.3626737892627716,0.3661125386887017,0.35533776862445327,0.3557962904109115,817448000 +2011-01-04,0.36152762174606323,0.3649663719547313,0.3535038712591711,0.36336162732310434,651384000 +2011-01-05,0.38926681876182556,0.38972534057538405,0.36450781596603543,0.36817579917323406,1428216000 +2011-01-06,0.4431407153606415,0.4433699763179927,0.39820767203423973,0.399353922163478,3493312000 +2011-01-07,0.4555201530456543,0.45689566389034564,0.42823938837013836,0.4380971432137491,2579984000 +2011-01-10,0.4729430377483368,0.4738600265163488,0.44382827542587494,0.44726702429904003,1750348000 +2011-01-11,0.4656071960926056,0.483947251743906,0.45552020647752606,0.4793622514954595,2711088000 +2011-01-12,0.5352991819381714,0.5357576490688878,0.46423163887189445,0.46583638314440684,3431896000 +2011-01-13,0.5362163782119751,0.5465326578474343,0.5130620847744544,0.5295681103281796,2695192000 +2011-01-14,0.5408011078834534,0.549741871793708,0.5238366235338646,0.5270461117095983,1595352000 +2011-01-18,0.5281926393508911,0.537133408428801,0.5151253908987685,0.533465396397541,1813348000 +2011-01-19,0.5137499570846558,0.5410307357782695,0.5126037338967703,0.5284220074238493,1197896000 +2011-01-20,0.5142083764076233,0.5171886326211751,0.4995363290001296,0.5087063859585758,1111408000 +2011-01-21,0.5093938112258911,0.5270461052924911,0.5084768224236316,0.5197100855594237,739244000 +2011-01-24,0.5669357776641846,0.5742717992117603,0.5268170020604259,0.5327774580781336,2056900000 +2011-01-25,0.5495127439498901,0.570374475762272,0.5458447333331785,0.5644139653423038,1086856000 +2011-01-26,0.5625801086425781,0.5731256209424394,0.5513468407877243,0.5552440858276698,1074660000 +2011-01-27,0.5609755516052246,0.5719795348520543,0.5502008020675889,0.5706040779393532,657396000 +2011-01-28,0.5446985363960266,0.5717500708565847,0.5318605246738561,0.5623508366749577,1094796000 +2011-01-31,0.5483665466308594,0.5559318025498121,0.5366748123277119,0.5456155792605677,750160000 +2011-02-01,0.5609755516052246,0.5651020316584016,0.54951304628247,0.5531810589172588,654104000 +2011-02-02,0.5864220261573792,0.5999477913272976,0.5577657514289088,0.5577657514289088,1606616000 +2011-02-03,0.5754179954528809,0.5873390162567784,0.5628092192443348,0.5873390162567784,1030776000 +2011-02-04,0.5884851217269897,0.5930701204072997,0.5811491566329912,0.5834416559731461,872900000 +2011-02-07,0.5639556646347046,0.5829834240837645,0.5618923978055228,0.5804616899531131,934236000 +2011-02-08,0.5472202897071838,0.5683113115161454,0.5446985014533876,0.564643300594042,1076584000 +2011-02-09,0.5339236259460449,0.5547854090343095,0.5240658729241996,0.549283366672351,1277520000 +2011-02-10,0.5231490135192871,0.5320897799120745,0.5181054916588019,0.522002736191104,1042352000 +2011-02-11,0.5380502343177795,0.5550147779765021,0.5128327344177999,0.5213149789184055,1359276000 +2011-02-14,0.5297971963882446,0.5616629577457962,0.5277339303173053,0.544469183136307,1287828000 +2011-02-15,0.5169591903686523,0.5325481661270797,0.5146666360609392,0.5307141882699128,886980000 +2011-02-16,0.535987138748169,0.5435523958234962,0.5220028475126279,0.5238368806973417,1318364000 +2011-02-17,0.588714599609375,0.5962798553352163,0.5183347433404742,0.5208565316874302,3470096000 +2011-02-18,0.5875681042671204,0.5949041236608418,0.5783981073537151,0.5855048385643563,1394412000 +2011-02-22,0.5320897698402405,0.5699160464340944,0.5302557370813659,0.5683113019310232,1396648000 +2011-02-23,0.5068721175193787,0.5371331329345654,0.4993068636655819,0.5320896668037008,1491604000 +2011-02-24,0.5192517042160034,0.5281924148360234,0.5057259395126978,0.509393895327319,1246120000 +2011-02-25,0.5300268530845642,0.5387383367983354,0.5259003176483992,0.5332363442076616,775652000 +2011-02-28,0.5194808840751648,0.5389671569485854,0.5075598649377782,0.5387378687407518,903696000 +2011-03-01,0.4963267743587494,0.5270463217841446,0.4963267743587494,0.520398054586277,988448000 +2011-03-02,0.4756942391395569,0.5050382734485174,0.46423173854797406,0.4956389847031595,1718140000 +2011-03-03,0.47844523191452026,0.4894492658617696,0.4640024749357985,0.48669824371057796,1593704000 +2011-03-04,0.4759235978126526,0.48371808933158583,0.4706508406892499,0.478903854215338,959760000 +2011-03-07,0.4692751467227936,0.4809669341092591,0.457354153079467,0.47936218969494176,1019140000 +2011-03-08,0.44818416237831116,0.4768404107874061,0.4383263801310775,0.4743186773246582,1947184000 +2011-03-09,0.43878498673439026,0.4511645048358832,0.43488771433486356,0.4468087378389885,1318976000 +2011-03-10,0.41081640124320984,0.4319073956120245,0.41035787938380186,0.4286979065687015,1722736000 +2011-03-11,0.413796603679657,0.42525913020722256,0.40485586523608535,0.4142551255106125,1486832000 +2011-03-14,0.41723543405532837,0.42755168465180016,0.41035790632892327,0.41700617311057053,1003360000 +2011-03-15,0.40485596656799316,0.41173346780865866,0.38995468655112403,0.3968321877917895,1256280000 +2011-03-16,0.40187564492225647,0.42067416710586686,0.39660288936657934,0.4011878894447758,1476520000 +2011-03-17,0.4094408452510834,0.4133380893257527,0.3943103361038348,0.4126503339411046,1238516000 +2011-03-18,0.40393877029418945,0.41723529957173683,0.4034802758812133,0.4158597890040599,886960000 +2011-03-21,0.4071483910083771,0.4167768854828965,0.40302188556822427,0.41265038004274374,751832000 +2011-03-22,0.4000415802001953,0.4098993343746561,0.3982075749746848,0.4060020903509164,718332000 +2011-03-23,0.40829458832740784,0.40944083817242016,0.3906423188512169,0.39935382313906076,782396000 +2011-03-24,0.44084814190864563,0.4458916635029308,0.41608913776205714,0.41700612678169763,1780592000 +2011-03-25,0.42709314823150635,0.44589166933896723,0.42640539279339723,0.4447454193850369,1196392000 +2011-03-28,0.4429115056991577,0.45024750145750086,0.4332829822295246,0.43718022741407314,1204284000 +2011-03-29,0.43947261571884155,0.44451610949479203,0.43351210568351267,0.4429113652018194,715764000 +2011-03-30,0.4229665994644165,0.4447453736796985,0.4174645838537262,0.4429113684761351,1176320000 +2011-03-31,0.42319589853286743,0.42823942045544605,0.4154014093723013,0.42365442040128803,655112000 +2011-04-01,0.41723543405532837,0.4291564292788332,0.4115041563951979,0.42869793471807477,850072000 +2011-04-04,0.4023340940475464,0.4183816198384933,0.39935383886738834,0.4172353699483366,924328000 +2011-04-05,0.40302175283432007,0.4115039945223514,0.40210473674477154,0.4082945065307979,821076000 +2011-04-06,0.4002707898616791,0.40646053279274946,0.396832013423586,0.40600203837725324,856984000 +2011-04-07,0.41494283080101013,0.41746459141769515,0.39958308818427546,0.4011878325181876,1021208000 +2011-04-08,0.4023340940475464,0.41815235892896074,0.4011878441573897,0.41815235892896074,746552000 +2011-04-11,0.3970613479614258,0.4060021137017267,0.3927056092129804,0.4039388474560786,546208000 +2011-04-12,0.3982076346874237,0.40095862927383547,0.3858281180554367,0.39316414005754285,840756000 +2011-04-13,0.4071483910083771,0.4096701245954803,0.39729063560377753,0.4023341301067396,749588000 +2011-04-14,0.4243420958518982,0.424571356757639,0.40118783752217785,0.4034803372645758,1254704000 +2011-04-15,0.42892709374427795,0.43419984826201896,0.419069312722142,0.4211325787484323,969720000 +2011-04-18,0.41471371054649353,0.42159121156716683,0.4080654431625868,0.4188402166246495,743584000 +2011-04-19,0.4131089150905609,0.416547665179004,0.4018756484043929,0.41494289327472544,659860000 +2011-04-20,0.42571765184402466,0.4344291572561305,0.41884015188637613,0.42823941275999794,650516000 +2011-04-21,0.4245714247226715,0.433053696990381,0.42365443561042254,0.43030267499612007,421300000 +2011-04-25,0.4312196373939514,0.43832637044511263,0.4261761159223971,0.42640537683610547,619612000 +2011-04-26,0.44245287775993347,0.4468086438404727,0.4305318840924776,0.43488762284426313,676000000 +2011-04-27,0.44245287775993347,0.4447454049219961,0.43328287842669766,0.4447454049219961,450004000 +2011-04-28,0.4472671151161194,0.4562078803990089,0.4374093608790243,0.44245285478465946,684000000 +2011-04-29,0.45850035548210144,0.46858734275148706,0.4495595906795202,0.4502473460226035,836000000 +2011-05-02,0.4523106515407562,0.4683581500795534,0.4500181517494995,0.4681289164976796,613824000 +2011-05-03,0.43076109886169434,0.4484133686700752,0.4252591104335967,0.44703788522742705,808000000 +2011-05-04,0.42755165696144104,0.4369509178276534,0.41952790701717624,0.4321366569295923,639356000 +2011-05-05,0.4277808368206024,0.4328243303640017,0.4183815777356876,0.42411282660972094,544000000 +2011-05-06,0.4429115056991577,0.4470380118534633,0.4332829822295246,0.4367217328033192,841080000 +2011-05-09,0.4527692496776581,0.4550617499936961,0.44314072648729086,0.44428697664530986,706328000 +2011-05-10,0.4534570276737213,0.45689577831791595,0.4488719994860344,0.4564372836977755,690976000 +2011-05-11,0.4555201530456543,0.4603343863445661,0.44933040890205117,0.45574941396268753,616000000 +2011-05-12,0.46996307373046875,0.47042159572662134,0.4527693187376547,0.45391556907050895,1224000000 +2011-05-13,0.4186108708381653,0.4413066360049175,0.4154013819436771,0.4401603860670639,2025192000 +2011-05-16,0.40577277541160583,0.41838154940956446,0.40554354186941477,0.4174645332545547,728188000 +2011-05-17,0.40416812896728516,0.40462662349120965,0.3924763682990576,0.40439738989362495,1420364000 +2011-05-18,0.413567453622818,0.41700620407699984,0.4043974524116665,0.4057729361960837,658844000 +2011-05-19,0.40760689973831177,0.4170061609389194,0.40141715502684755,0.4167769000008533,650884000 +2011-05-20,0.41471371054649353,0.4156306997510794,0.4048559536177765,0.406689959355708,575820000 +2011-05-23,0.4142550528049469,0.4172353075393259,0.4034802835861344,0.4087530377579205,588000000 +2011-05-24,0.4158599376678467,0.43259519468969665,0.41517218213814583,0.41631843224472787,720372000 +2011-05-25,0.42090335488319397,0.42365437649357657,0.4096700895174735,0.41379659460429424,545312000 +2011-05-26,0.43144890666007996,0.43511691761023896,0.4197571456691094,0.4209033956749396,706436000 +2011-05-27,0.4470379650592804,0.44772569323904243,0.4328244423124037,0.43328293687516417,658824000 +2011-05-31,0.4594174325466156,0.45964672080997687,0.44474544327953847,0.45574944889422436,1200716000 +2011-06-01,0.43878498673439026,0.45804200578268167,0.4378679702108948,0.45735425022224996,762208000 +2011-06-02,0.43672165274620056,0.4426821635796379,0.4314488973671991,0.4394726745639441,607592000 +2011-06-03,0.42319589853286743,0.43557541507634756,0.4211326594399988,0.4316781704960645,549300000 +2011-06-06,0.4142550528049469,0.4264053052889543,0.4137965310544663,0.42250806171111205,435988000 +2011-06-07,0.41402584314346313,0.41975709244591924,0.41219183790092667,0.4174645927249368,433956000 +2011-06-08,0.40279263257980347,0.4144843936692976,0.3995831434679356,0.4119626600324746,569288000 +2011-06-09,0.3982076346874237,0.40348039025315396,0.38376487894781697,0.4025634011672688,741632000 +2011-06-10,0.3924763798713684,0.4014171463309157,0.389266863451753,0.3988953853818433,493548000 +2011-06-13,0.38972535729408264,0.39751984585641165,0.38697433560972755,0.3924763516496838,574760000 +2011-06-14,0.3929349184036255,0.40164642490545377,0.3913301736785211,0.39316417936239423,534576000 +2011-06-15,0.3844525218009949,0.38995450936200754,0.37642874667066684,0.38766200999012757,935916000 +2011-06-16,0.37115609645843506,0.39064237389829,0.36565410735856824,0.38468186293280443,1024908000 +2011-06-17,0.36244451999664307,0.37574105026424165,0.35098202217500685,0.37551178937630875,1467884000 +2011-06-20,0.35808879137039185,0.3668002954144841,0.3553377699563355,0.35923504118333155,745960000 +2011-06-21,0.3658832907676697,0.36863431226895066,0.3560255365980852,0.3594642861459343,704276000 +2011-06-22,0.36083984375,0.36817583827220673,0.3601520882853778,0.3633616046773628,651720000 +2011-06-23,0.371614545583725,0.3741362787072416,0.35304526085237253,0.3562547766396898,744024000 +2011-06-24,0.36083984375,0.3729900991958064,0.3585473437537632,0.36978061013257707,529052000 +2011-06-27,0.35327470302581787,0.3631324616767836,0.34066592162294396,0.36083996093603643,1142152000 +2011-06-28,0.35533788800239563,0.35946439416558695,0.35075288722746306,0.3532746485851801,692200000 +2011-06-29,0.36083984375,0.3645078546754812,0.3452508383098383,0.35763032735801503,960544000 +2011-06-30,0.3654248118400574,0.3693220560276706,0.35625481265567177,0.3617568012348018,652300000 +2011-07-01,0.37023913860321045,0.3716146496585379,0.3580888820436781,0.3654248772383224,540804000 +2011-07-05,0.36404937505722046,0.3732193754178661,0.36083985853374045,0.36978062528262395,535296000 +2011-07-06,0.3592350482940674,0.36450780300370994,0.35487928252142714,0.3638200476365823,529580000 +2011-07-07,0.36061063408851624,0.36290313441068817,0.3541916277206828,0.36106915601595824,986136000 +2011-07-08,0.35373303294181824,0.35808879871761107,0.3507527779012762,0.35556703814590196,619516000 +2011-07-11,0.34135347604751587,0.3484602350851637,0.34043648722338316,0.34708475184896465,714388000 +2011-07-12,0.3367685377597809,0.3429583090851039,0.33103728825763246,0.3397487929666487,867604000 +2011-07-13,0.33608078956604004,0.3436460445369764,0.33287130070746285,0.3413535446869202,634368000 +2011-07-14,0.32278430461883545,0.33951956000872324,0.32117956009186116,0.3374563209495785,1088996000 +2011-07-15,0.32324281334877014,0.3266815634842217,0.31659457401839985,0.3246183243344535,827736000 +2011-07-18,0.3163653016090393,0.322555046162711,0.31223879613033956,0.3207210680199607,818200000 +2011-07-19,0.32599371671676636,0.32668144463064136,0.31728218674855213,0.31728218674855213,602224000 +2011-07-20,0.3218672275543213,0.32897395918183464,0.32095021141194185,0.3271399815545719,662956000 +2011-07-21,0.3369978070259094,0.33929030688360234,0.3175115309067655,0.3223257915394222,1143420000 +2011-07-22,0.3438752293586731,0.3450214790300521,0.3356222207932452,0.3399779859417341,737192000 +2011-07-25,0.3383733332157135,0.33997810518148036,0.33355909930468514,0.3386025941618966,566920000 +2011-07-26,0.330120325088501,0.33699782502898923,0.32530606419865704,0.32874481416890117,698276000 +2011-07-27,0.317740797996521,0.32714005852715516,0.3168237816383773,0.32553528673259235,652212000 +2011-07-28,0.31705302000045776,0.32370125831236557,0.3115510042293506,0.31659452551838696,648176000 +2011-07-29,0.31705302000045776,0.3200332751270467,0.31223875961683306,0.3138435039684571,677656000 +2011-08-01,0.3340176045894623,0.334934593746113,0.3216380870021276,0.3243890818008381,1019620000 +2011-08-02,0.33057883381843567,0.3525868455048304,0.33057883381843567,0.33172508385775296,1356432000 +2011-08-03,0.33951956033706665,0.34066581033297905,0.32805706037794263,0.3312665767637507,765236000 +2011-08-04,0.3071952760219574,0.33332979032685595,0.3071952760219574,0.33332979032685595,979732000 +2011-08-05,0.2968789041042328,0.318199178339623,0.28885515732540074,0.3143019353699393,1270588000 +2011-08-08,0.27349549531936646,0.29252327768911984,0.27166148989455546,0.2824362615170369,1084180000 +2011-08-09,0.29642054438591003,0.2968790389443389,0.275100287795773,0.2787682715919614,1329832000 +2011-08-10,0.2828947901725769,0.2959620633204623,0.2812900454805365,0.28770905157745663,1140052000 +2011-08-11,0.30742454528808594,0.3115510509024147,0.2828947725418705,0.2828947725418705,1078792000 +2011-08-12,0.2952742874622345,0.3406658215955356,0.2904600263887387,0.34020732704776374,3195784000 +2011-08-15,0.30650749802589417,0.3071952533859048,0.296649744075745,0.29825448836326895,864152000 +2011-08-16,0.2977960407733917,0.30719530173925264,0.2922940243560259,0.3030687962584172,716868000 +2011-08-17,0.2936694622039795,0.3037564761276454,0.289772218625432,0.29871295550143795,553328000 +2011-08-18,0.2737247049808502,0.28312396394218176,0.2705151892563407,0.28037296998456646,802564000 +2011-08-19,0.26891064643859863,0.2840411655294573,0.26707663998383235,0.26913990749373334,761332000 +2011-08-22,0.2737247049808502,0.27968521466297513,0.2707444501397878,0.2764756989384656,611876000 +2011-08-23,0.3032979965209961,0.3035272574281342,0.2799144771430224,0.2803729989572986,938312000 +2011-08-24,0.2989421784877777,0.3035271767823034,0.29114766498983674,0.3026101880548965,687500000 +2011-08-25,0.2861042320728302,0.29825448555615824,0.28564573761338885,0.2929817309507044,690968000 +2011-08-26,0.29825446009635925,0.3012347148214525,0.27991443732549687,0.2849579579350772,732660000 +2011-08-29,0.30627840757369995,0.3074246580353561,0.2996301658276009,0.3067369296213758,601528000 +2011-08-30,0.3136143982410431,0.31613613258482853,0.3021518675438989,0.3042151345474656,684760000 +2011-08-31,0.305132120847702,0.319116385749412,0.30261038652902156,0.31590689576972286,705808000 +2011-09-01,0.3044443130493164,0.31590684166933936,0.3042150794207464,0.30925857452315086,762312000 +2011-09-02,0.2961912155151367,0.30169320310434306,0.29389868880276104,0.29756669874806413,471356000 +2011-09-06,0.30215170979499817,0.30283946510378695,0.28381171398062766,0.28656270788703336,696248000 +2011-09-07,0.32668158411979675,0.3356223514339885,0.31774084413436354,0.32668158411979675,1606620000 +2011-09-08,0.3250766694545746,0.3312664387160617,0.3198039162049254,0.32347192559478855,880164000 +2011-09-09,0.3181993365287781,0.3310373486886779,0.31544834173130193,0.32232584238937145,869828000 +2011-09-12,0.32576456665992737,0.32851556123734665,0.31384354460985026,0.31384354460985026,916480000 +2011-09-13,0.3331005871295929,0.3347053591421745,0.3234720916978944,0.3285155867022357,853836000 +2011-09-14,0.350294291973114,0.35465005785510656,0.3415827875378814,0.3418120484422635,1547192000 +2011-09-15,0.35533788800239563,0.35992291610608845,0.35212839839144694,0.3580889103303634,752908000 +2011-09-16,0.35442087054252625,0.3690928882506603,0.3525868649129147,0.356025615220152,1391588000 +2011-09-19,0.34708479046821594,0.35098203439753906,0.3381440254587379,0.3484602738574616,968204000 +2011-09-20,0.33814412355422974,0.35281614193045724,0.3365393788035316,0.35144063081342486,792436000 +2011-09-21,0.33172500133514404,0.3459384928210634,0.3314957404528107,0.33997801049664556,715252000 +2011-09-22,0.30971693992614746,0.31911619799605806,0.3037564581380617,0.3186577036013972,1314632000 +2011-09-23,0.3161359429359436,0.32507670659700466,0.30604895695442313,0.3078829618589034,1011440000 +2011-09-26,0.3168238401412964,0.3209503461930342,0.3026103435886525,0.32003335699431895,972124000 +2011-09-27,0.3172822594642639,0.3275985358104134,0.31476052610170774,0.3248475415381917,781388000 +2011-09-28,0.3076537549495697,0.32599377988184175,0.3026102610743521,0.31797000360154964,1236532000 +2011-09-29,0.3000885248184204,0.3184285512386109,0.29229400880730744,0.3131557960340721,866416000 +2011-09-30,0.28679201006889343,0.2968789982879866,0.28633348824450006,0.29527425388886996,677784000 +2011-10-03,0.2707444727420807,0.2920647528475218,0.2707444727420807,0.28312398757794144,949896000 +2011-10-04,0.295732706785202,0.295732706785202,0.2629499313626622,0.2640961811049014,1361548000 +2011-10-05,0.30627840757369995,0.30902943054468807,0.2890846506488575,0.29504513665220955,856708000 +2011-10-06,0.3184286057949066,0.3193455949750842,0.3074245716602212,0.307883093579069,773192000 +2011-10-07,0.32438895106315613,0.3292032105171891,0.31315571544207566,0.3198039524702666,806976000 +2011-10-10,0.3388318419456482,0.3388318419456482,0.329203319840111,0.32989107532318596,534376000 +2011-10-11,0.33516377210617065,0.3415827766071831,0.3340175222784453,0.3360807610368503,816080000 +2011-10-12,0.3349345326423645,0.3418120593775773,0.33470529905940116,0.34158279846586065,612064000 +2011-10-13,0.35442087054252625,0.3551086260697253,0.3324128576447042,0.3333298467951309,854832000 +2011-10-14,0.3603813350200653,0.36427857939439334,0.35166982991178497,0.36061056861340546,702452000 +2011-10-17,0.34249982237815857,0.35625484992235995,0.3406658168836813,0.35625484992235995,611780000 +2011-10-18,0.3548792600631714,0.3557962762708928,0.33860250249580454,0.3406657411378651,590916000 +2011-10-19,0.3477725088596344,0.3615275336721178,0.3468555199588858,0.35533776294143754,557568000 +2011-10-20,0.33034950494766235,0.3397487642687505,0.31728223532352734,0.33837325357292014,990308000 +2011-10-21,0.33195430040359497,0.3399780775950945,0.3264523114292152,0.33447606129195956,628428000 +2011-10-24,0.34433379769325256,0.34960655277945674,0.3326420376033543,0.33332979301959903,535256000 +2011-10-25,0.3312665522098541,0.34227055682073354,0.3305787967975329,0.3395195351714485,577996000 +2011-10-26,0.33516377210617065,0.33951951052002644,0.32553525169027614,0.33768553265866713,503116000 +2011-10-27,0.34960654377937317,0.3530452934433175,0.33974878927698227,0.3475433049125078,577732000 +2011-10-28,0.35763028264045715,0.360839798631129,0.3457092896163599,0.34662627856869344,490156000 +2011-10-31,0.3392903506755829,0.3482311176718166,0.3392903506755829,0.34616785113633614,519984000 +2011-11-01,0.32232582569122314,0.3278278150011439,0.3191163091531386,0.3269108258924094,790824000 +2011-11-02,0.3168238401412964,0.32714011893502065,0.31017560012871187,0.3255353468441296,961608000 +2011-11-03,0.3358515501022339,0.3365393055109686,0.31178027476904,0.3202625186000922,749372000 +2011-11-04,0.339748740196228,0.34089498991862,0.327598487673123,0.332871241861876,654840000 +2011-11-07,0.3379148840904236,0.34295840695457863,0.33012039347470207,0.3372271284881514,613536000 +2011-11-08,0.34570932388305664,0.34777256289469144,0.3367685577322111,0.34227057397782873,549728000 +2011-11-09,0.32828643918037415,0.34204144407007847,0.32691092775989755,0.3376857034531783,532244000 +2011-11-10,0.33172500133514404,0.33974874961431223,0.32347199217364253,0.3363100003518116,990484000 +2011-11-11,0.34341683983802795,0.346167834423763,0.32255505118733174,0.34112433979512274,1751560000 +2011-11-14,0.3367685377597809,0.34685555328081413,0.3358515487709385,0.3434168035795251,500292000 +2011-11-15,0.3411242365837097,0.3436459694706699,0.33264196712837235,0.33355898326533345,505660000 +2011-11-16,0.3342466950416565,0.34364595285062255,0.33310044542245315,0.3347052167523351,512420000 +2011-11-17,0.32232582569122314,0.3344760816901181,0.31636531449817823,0.3335590925813836,657504000 +2011-11-18,0.319345623254776,0.3241598851989336,0.31590687253145244,0.3241598851989336,501352000 +2011-11-21,0.33539316058158875,0.33860265038855947,0.3094878718265219,0.31430213386573996,1330788000 +2011-11-22,0.34570932388305664,0.34754332929826254,0.3372270522538238,0.3390610576690297,1287480000 +2011-11-23,0.331037312746048,0.344563078968936,0.33080805181750117,0.34204131806994265,825340000 +2011-11-25,0.3218672275543213,0.33424671318208526,0.32095021141194185,0.32668145981900815,406620000 +2011-11-28,0.3399781286716461,0.34502162387732865,0.33241287219874266,0.33241287219874266,690616000 +2011-11-29,0.34181201457977295,0.3461677527015006,0.33630999937844624,0.3395194877493245,623440000 +2011-11-30,0.3583180010318756,0.3592350172183028,0.34914800314009997,0.3521282579206769,730324000 +2011-12-01,0.3626737892627716,0.36359077817818586,0.3537330243581028,0.35533776862445327,529760000 +2011-12-02,0.3603813350200653,0.3679465901753813,0.3569425851611721,0.3665710793003222,546464000 +2011-12-05,0.3548792600631714,0.36680027946229926,0.3518990052133894,0.36634178502281356,644696000 +2011-12-06,0.3498357832431793,0.3576302710721418,0.34616777289499034,0.3569425430445138,573832000 +2011-12-07,0.3477725088596344,0.350294269329819,0.34043651566739375,0.3475432752988226,510016000 +2011-12-08,0.3367685377597809,0.3500650420705159,0.3356222878593512,0.3443337925683675,491488000 +2011-12-09,0.3415828049182892,0.34433379926708807,0.3296617838589045,0.3342467835498205,555840000 +2011-12-12,0.3331005871295929,0.3356223482961426,0.3269108420184123,0.33424683723643217,573208000 +2011-12-13,0.3239305317401886,0.341582802276707,0.3218672928267337,0.3374562971210435,516596000 +2011-12-14,0.31132176518440247,0.3230135245799838,0.30788301563614345,0.3211795193551619,636020000 +2011-12-15,0.3085708022117615,0.31865781919718683,0.30788307403466475,0.3165945800083821,435148000 +2011-12-16,0.30971693992614746,0.31705295955571056,0.3083414567421649,0.3110924504388774,619116000 +2011-12-19,0.301693320274353,0.3147605936990242,0.300547070137365,0.31109258232915876,463276000 +2011-12-20,0.31865784525871277,0.3198040954192968,0.30857082744831765,0.30857082744831765,445208000 +2011-12-21,0.3145313560962677,0.3202626072067934,0.3083416103626522,0.31682385654047795,548424000 +2011-12-22,0.3280571699142456,0.3289741592856505,0.3154484157492225,0.3154484157492225,576560000 +2011-12-23,0.3248475193977356,0.3301202740018943,0.3220964979842606,0.32966175221381433,248948000 +2011-12-27,0.32232582569122314,0.32736932044677663,0.3214088092537317,0.3234720757415197,195712000 +2011-12-28,0.31430208683013916,0.32301359299664006,0.3140728258801952,0.3223258374755662,233960000 +2011-12-29,0.32026246190071106,0.3209502171876853,0.312926469273399,0.3175114680815626,211112000 +2011-12-30,0.317740797996521,0.3225550313939458,0.31728227615307186,0.31911628154060473,186956000 +2012-01-03,0.3218672275543213,0.33012023619199604,0.3211794722797237,0.3278277095004214,468044000 +2012-01-04,0.3255354166030884,0.3269109280246791,0.3191164088502742,0.32209666537787707,347372000 +2012-01-05,0.3372269868850708,0.33883175839277563,0.3225549737362311,0.3239304843631925,563548000 +2012-01-06,0.33332982659339905,0.33722707123965395,0.32943258194714414,0.33699783763031926,533252000 +2012-01-09,0.33332982659339905,0.3397488322436311,0.33103732652751305,0.3335590875314903,508244000 +2012-01-10,0.33195430040359497,0.33860256668712196,0.32966180044281085,0.33837330575954144,546328000 +2012-01-11,0.3253059685230255,0.3319542055786845,0.32393045800797665,0.3289739510152435,484272000 +2012-01-12,0.32324281334877014,0.32622306893191283,0.31613605213733426,0.3259938353201368,652364000 +2012-01-13,0.3147605061531067,0.32163800506216184,0.31315576187341077,0.32095024970550606,504300000 +2012-01-17,0.3099461793899536,0.3195746976568398,0.309487685026946,0.3195746976568398,627176000 +2012-01-18,0.3204917311668396,0.3230134915088782,0.31430198807944865,0.3159067322385871,632676000 +2012-01-19,0.32897403836250305,0.3294325602084283,0.31980403870407237,0.3232427885759839,608312000 +2012-01-20,0.32599371671676636,0.3324127200999922,0.32484746708864554,0.328515449501384,546272000 +2012-01-23,0.3349345326423645,0.33516379355408116,0.32209652281880546,0.32622302792843183,562792000 +2012-01-24,0.34249982237815857,0.3438753333312055,0.3324128331516678,0.3326420667580049,730920000 +2012-01-25,0.3404366374015808,0.34135362663022867,0.323701351684293,0.33332987522889806,1274152000 +2012-01-26,0.3372269868850708,0.3493772669894808,0.3353930091541218,0.34547999598934,799672000 +2012-01-27,0.34181201457977295,0.34364599231813214,0.3324127556913084,0.3351637496275969,449996000 +2012-01-30,0.3392903506755829,0.34089509531734047,0.3308080782443146,0.3358516004452063,399076000 +2012-01-31,0.33860263228416443,0.3404366380738423,0.33264212029990153,0.34020737710184734,357900000 +2012-02-01,0.3422705829143524,0.3461678274429483,0.337685582921003,0.3424998165167665,428020000 +2012-02-02,0.3551086485385895,0.35648413235126075,0.34066586353984163,0.34410464139341956,696236000 +2012-02-03,0.3626737892627716,0.36565404423099457,0.35969353429454864,0.3603812896454849,495232000 +2012-02-06,0.35992297530174255,0.36129845936318866,0.3567134578341721,0.36083996467603996,278868000 +2012-02-07,0.36083984375,0.3629030828151109,0.3544208382947857,0.3603813492165038,410296000 +2012-02-08,0.3739071190357208,0.38101385269226384,0.35900584159416576,0.3608398470737999,847612000 +2012-02-09,0.3736778199672699,0.3805553193174567,0.37299006456650063,0.37849208044390187,561944000 +2012-02-10,0.3645078241825104,0.3713853235958824,0.36244455796124675,0.37000981278170664,440268000 +2012-02-13,0.37023913860321045,0.3750533999680985,0.36267388245642557,0.373677888912771,610668000 +2012-02-14,0.3723022937774658,0.3755118097388135,0.36702953902784263,0.3702390549891903,453756000 +2012-02-15,0.37069758772850037,0.38743286997767035,0.36978059868988367,0.37574110942715644,1110856000 +2012-02-16,0.3771165907382965,0.3800968460891771,0.3438753146907878,0.34525082556927256,1888588000 +2012-02-17,0.3633615970611572,0.37986759122233904,0.35992284713887956,0.37734585767658846,1020360000 +2012-02-21,0.36519551277160645,0.374136249441647,0.3624444916465955,0.36313224692784823,518176000 +2012-02-22,0.3626737892627716,0.3723022821896256,0.3622152948050645,0.36336154461370784,492432000 +2012-02-23,0.36473706364631653,0.366800329900846,0.357630303206416,0.3633615801387174,323968000 +2012-02-24,0.361985981464386,0.366341746503383,0.3603812374305438,0.3658832247833591,366668000 +2012-02-27,0.3546500504016876,0.35900578886338635,0.34960652924129726,0.35740104455269484,745268000 +2012-02-28,0.35144051909446716,0.3587765396149228,0.3477725088342393,0.35465003490435415,699884000 +2012-02-29,0.3473140299320221,0.35854729477637753,0.347084796360965,0.35258678466886223,689196000 +2012-03-01,0.34960654377937317,0.35373304884185697,0.3473140440034103,0.34868955480048924,449944000 +2012-03-02,0.35258686542510986,0.3576303604172995,0.34846035958467897,0.34846035958467897,684076000 +2012-03-05,0.3406657874584198,0.35075280314239315,0.3381440540339918,0.3500650477252751,514848000 +2012-03-06,0.3374563455581665,0.33951958476777044,0.3314958342190212,0.33676859004537935,471400000 +2012-03-07,0.33951956033706665,0.34089507126366375,0.3347053267514879,0.33929032673513754,441984000 +2012-03-08,0.3406657874584198,0.3441045645440103,0.3386025485358192,0.34043655387188293,430852000 +2012-03-09,0.339748740196228,0.3441045055385671,0.337914735174651,0.341582745217805,367836000 +2012-03-12,0.334476113319397,0.34341688095443584,0.3335591241239486,0.3411243806370555,299948000 +2012-03-13,0.33906105160713196,0.34089505698954864,0.3342467908943826,0.3358515626844687,553288000 +2012-03-14,0.32943254709243774,0.33974879629744226,0.32828629718077057,0.33906104088469124,735708000 +2012-03-15,0.3342466950416565,0.33608069989813116,0.3292032021829111,0.33034945180211445,382380000 +2012-03-16,0.33470526337623596,0.33608074671363464,0.3326419973770124,0.334476002488961,428340000 +2012-03-19,0.3356224000453949,0.3381441616007723,0.33401765511413767,0.3365394166695151,405400000 +2012-03-20,0.330120325088501,0.3337883086595081,0.3271400696485383,0.3337883086595081,449616000 +2012-03-21,0.3314957618713379,0.3344760168904813,0.3264522680928845,0.3301202784747151,467840000 +2012-03-22,0.331037312746048,0.3337883072448328,0.32805705731871637,0.32897404637539285,425372000 +2012-03-23,0.3335590362548828,0.3344760252087698,0.32782775964245603,0.3301202866846781,315456000 +2012-03-26,0.3374563455581665,0.33906109020216485,0.33355910075738265,0.33676859004537935,288600000 +2012-03-27,0.339748740196228,0.343875244662589,0.33814399605062906,0.338831751349814,419968000 +2012-03-28,0.3475433886051178,0.35212838926116663,0.34158287682075056,0.34410463811308123,892448000 +2012-03-29,0.3491479754447937,0.35189896912836066,0.34272897196397256,0.34708473701430526,372700000 +2012-03-30,0.3530452251434326,0.35510849093989305,0.3470847432762917,0.3521282363419487,527240000 +2012-04-02,0.35144051909446716,0.355108529354695,0.3463970254832169,0.3521282744343537,407776000 +2012-04-03,0.34570932388305664,0.35442082910871836,0.3438753184678508,0.35396233458710563,430476000 +2012-04-04,0.3358515501022339,0.3447922884295247,0.3337882838760298,0.34043654972212734,495896000 +2012-04-05,0.33539316058158875,0.3404366562762979,0.3342468829890855,0.33631014986107693,369424000 +2012-04-09,0.331037312746048,0.33218356273127125,0.3246183073630465,0.3301203236893715,365504000 +2012-04-10,0.32461825013160706,0.3342467428441915,0.32301350590096806,0.32966174371165125,470360000 +2012-04-11,0.32874488830566406,0.3358516507783492,0.3278278717095451,0.3289741219581226,372960000 +2012-04-12,0.3365393579006195,0.3383733361710726,0.32782782447217873,0.3292033355037763,384868000 +2012-04-13,0.32461825013160706,0.33539301995607707,0.3243889892434798,0.3335590148373109,311324000 +2012-04-16,0.3207210600376129,0.32782779348578206,0.31544830468654866,0.32691080443722964,463468000 +2012-04-17,0.321408748626709,0.32553525349514933,0.3202624987926284,0.3216380095250258,460696000 +2012-04-18,0.31797006726264954,0.32095032293565184,0.3140728224573808,0.3193455782898068,400764000 +2012-04-19,0.3131558299064636,0.3257645806456471,0.3115510579493799,0.3138435580837769,667188000 +2012-04-20,0.30696606636047363,0.3159068335346888,0.3062783108349558,0.3149898170577457,509592000 +2012-04-23,0.3032979965209961,0.3046735073063191,0.2959620027663635,0.3016932521572878,706244000 +2012-04-24,0.2938988208770752,0.3067368614548848,0.29229407605313423,0.30421510006814856,730440000 +2012-04-25,0.29985928535461426,0.3021517854050829,0.2927525242666589,0.29825454078503744,727112000 +2012-04-26,0.3000885248184204,0.3026102856249946,0.2975667640118462,0.29963003030688534,539208000 +2012-04-27,0.2975667417049408,0.3014640130827179,0.29435725303603855,0.2996300078453085,475356000 +2012-04-30,0.2980252206325531,0.29962999221202713,0.2938987158958716,0.29596198192858775,262268000 +2012-05-01,0.3032979965209961,0.3065075125771654,0.29642049725188685,0.29642049725188685,408680000 +2012-05-02,0.2945865988731384,0.30329810657410455,0.2929818539271411,0.30215185627999747,684008000 +2012-05-03,0.2895430326461792,0.29710828821364427,0.28770902715577007,0.29527428272323514,419536000 +2012-05-04,0.28106075525283813,0.2893137661362582,0.28106075525283813,0.2877090216113586,545092000 +2012-05-07,0.2858750522136688,0.2909185746834284,0.28358255193787224,0.2861043131727521,604440000 +2012-05-08,0.28564581274986267,0.28747979107003907,0.2783097901541233,0.2833532851921253,462312000 +2012-05-09,0.28679201006889343,0.2890845098758467,0.2778512444245235,0.2806022387271168,520608000 +2012-05-10,0.2847287654876709,0.2900015209101973,0.2801437655252576,0.2895430263797071,597092000 +2012-05-11,0.30283957719802856,0.3136143505901881,0.3016933270353528,0.3083415943761278,1435140000 +2012-05-14,0.30100560188293457,0.3055906029968654,0.29412810021203833,0.3003178462500925,437472000 +2012-05-15,0.2980252206325531,0.3076537407943937,0.2966497372728265,0.3010054755717537,599940000 +2012-05-16,0.2920647859573364,0.3019225412972781,0.2911477695717864,0.2984837913411651,470484000 +2012-05-17,0.2900015413761139,0.2959620526793971,0.2900015413761139,0.2932110579735577,335364000 +2012-05-18,0.2769342362880707,0.2920647737213341,0.27555875276050434,0.29068926286501356,567288000 +2012-05-21,0.2817484438419342,0.283123954438947,0.27555870081287487,0.2773927058326422,416260000 +2012-05-22,0.2783096432685852,0.28197765263056246,0.2741831395685468,0.2815191582925013,410140000 +2012-05-23,0.2851872742176056,0.28564579609968105,0.27120301270446784,0.2753295183418492,496000000 +2012-05-24,0.2776220142841339,0.28725053640357223,0.2755587751606865,0.28679204185711243,520420000 +2012-05-25,0.2842702269554138,0.28656272658176785,0.2773927280763517,0.2773927280763517,391752000 +2012-05-29,0.29160627722740173,0.2934402827523077,0.28770903256744945,0.2888552826044211,310000000 +2012-05-30,0.28816747665405273,0.2904599763265451,0.28312398284032,0.2883967375528027,379792000 +2012-05-31,0.28495800495147705,0.2893137436561508,0.28128999432635454,0.2881674937518942,358192000 +2012-06-01,0.2746417224407196,0.2817484826222224,0.27418322795485717,0.2789974883782949,440984000 +2012-06-04,0.26891064643859863,0.27762215660216055,0.2666181452023334,0.276017411202529,432856000 +2012-06-05,0.2767050266265869,0.2773927821142225,0.2675350263347966,0.2675350263347966,365224000 +2012-06-06,0.28404101729393005,0.2847287727716374,0.2767050226321495,0.27876826173651537,368968000 +2012-06-07,0.27257853746414185,0.2897723163766719,0.27234927651152163,0.28816754436584663,526780000 +2012-06-08,0.27785128355026245,0.2787682726706686,0.27303702234623706,0.27349551690644014,370308000 +2012-06-11,0.28106075525283813,0.29183552705306864,0.2803730271198494,0.2867920325482033,839080000 +2012-06-12,0.28679201006889343,0.2895430043714867,0.2838117548541035,0.28427024934974343,496128000 +2012-06-13,0.27922672033309937,0.2872504686543594,0.27785120968938337,0.2865627133325014,494276000 +2012-06-14,0.27578800916671753,0.28106076478049014,0.2730370145552403,0.27876826471613303,589884000 +2012-06-15,0.2817484438419342,0.281977704717686,0.27532943993712305,0.2778512002553968,385288000 +2012-06-18,0.2842702269554138,0.28656272658176785,0.2773927280763517,0.27968522770270576,304424000 +2012-06-19,0.3035273253917694,0.3078830923014353,0.294586557942724,0.2959620690360414,960476000 +2012-06-20,0.30834153294563293,0.31407278261718197,0.3046735222243399,0.30650752758498645,972720000 +2012-06-21,0.2943572998046875,0.30811230027757847,0.29366954431529163,0.30811230027757847,516376000 +2012-06-22,0.2980252206325531,0.3014639973537468,0.2938987158958716,0.2980252206325531,865360000 +2012-06-25,0.28862592577934265,0.2991714335475969,0.2874796761231736,0.2982544447541607,494616000 +2012-06-26,0.2918355464935303,0.29389878568744904,0.2861042961451366,0.29023080186173156,437152000 +2012-06-27,0.30123472213745117,0.3032979607432987,0.2920647241936854,0.2920647241936854,506064000 +2012-06-28,0.3035273253917694,0.305361331073273,0.2959620690360414,0.2984838302642037,545896000 +2012-06-29,0.3168238401412964,0.3175115957047126,0.3104048337640109,0.3106340947280695,616508000 +2012-07-02,0.30834153294563293,0.31865778235442116,0.3058197721586497,0.3184285487648117,581684000 +2012-07-03,0.3163653016090393,0.31705305707694853,0.3081122906516398,0.30834155158386145,219284000 +2012-07-05,0.3131558299064636,0.31567756365704597,0.308341568692727,0.3143020799736621,280076000 +2012-07-06,0.3071952760219574,0.3117802756548778,0.30375652629726707,0.31086325933104164,382760000 +2012-07-09,0.30306878685951233,0.30673679769066886,0.30054702599699784,0.30536128679679647,306336000 +2012-07-10,0.2938988208770752,0.30880010089584314,0.29160632046322793,0.2998593328845824,512028000 +2012-07-11,0.2890845835208893,0.2984838460553855,0.2877090723548009,0.2948158344983235,485216000 +2012-07-12,0.2842702269554138,0.28633346568763196,0.2817484664349239,0.2858749712281114,472160000 +2012-07-13,0.28793826699256897,0.2893137505130245,0.28266551184227107,0.28449951719829913,324260000 +2012-07-16,0.2888551652431488,0.2911476643856543,0.2833531509038883,0.28610417173789127,334460000 +2012-07-17,0.2835824191570282,0.2913769328423929,0.2787681599005163,0.289772188866471,447476000 +2012-07-18,0.2994006872177124,0.3035271913465379,0.2815191875452998,0.2828946707024104,616008000 +2012-07-19,0.3023810386657715,0.30627828318688644,0.2994007832100639,0.30146404960036405,403036000 +2012-07-20,0.2936694622039795,0.3026102264087344,0.2904599465937794,0.3005469605174453,451000000 +2012-07-23,0.2975667417049408,0.2996300078453085,0.2826654935602117,0.28587498222911395,451584000 +2012-07-24,0.2943572998046875,0.2998592890623412,0.29091854968646474,0.2980252835335378,351164000 +2012-07-25,0.3000885248184204,0.30306878013652966,0.29206477521591706,0.2934402587505222,415044000 +2012-07-26,0.30146411061286926,0.309029367584237,0.299171582827861,0.3055905895711052,338440000 +2012-07-27,0.30902937054634094,0.30994635980612484,0.30031783593458683,0.3026103637415694,376516000 +2012-07-30,0.3055904507637024,0.3129264707544845,0.30306871780452616,0.30902922721484943,363552000 +2012-07-31,0.31040483713150024,0.31476060419455104,0.30513208085978605,0.3055905754641178,387788000 +2012-08-01,0.30696606636047363,0.315219078009171,0.305590555309438,0.3122388222844326,335912000 +2012-08-02,0.3081122040748596,0.31269720280090324,0.3003176898433367,0.3053612103049831,367912000 +2012-08-03,0.3145313560962677,0.31774087311541865,0.30559058796659105,0.31292661125107274,326548000 +2012-08-06,0.3211795687675476,0.3227843133378692,0.3170530632090376,0.31751155775359285,360324000 +2012-08-07,0.32438895106315613,0.3278277000078233,0.3225549461602509,0.325076706317839,407340000 +2012-08-08,0.3262230157852173,0.32966176536044417,0.3232427606876035,0.32415977697158205,517064000 +2012-08-09,0.3372269868850708,0.3379147421985515,0.3262229838556284,0.3266814782883657,822300000 +2012-08-10,0.33516377210617065,0.3489187700388752,0.3308080063635632,0.3461677759180846,1278744000 +2012-08-13,0.33951956033706665,0.33974882126775136,0.3342468048901185,0.3356223158167156,447244000 +2012-08-14,0.334476113319397,0.3411243806370555,0.33310060219746496,0.34066585871057187,388828000 +2012-08-15,0.33195430040359497,0.33837330575954144,0.33034955589679715,0.3356223112723516,594404000 +2012-08-16,0.3388318419456482,0.33997809197452106,0.3337883199556025,0.33493456998447535,371008000 +2012-08-17,0.3358515501022339,0.3388318053209153,0.3328712948835525,0.3388318053209153,309864000 +2012-08-20,0.3358515501022339,0.3363100445984726,0.3308080286573484,0.3347053001972605,314392000 +2012-08-21,0.3349345326423645,0.3390610377519908,0.33149578293913473,0.33699779886155434,340248000 +2012-08-22,0.3356224000453949,0.3369979113171939,0.33172515454698087,0.33287140483055927,313556000 +2012-08-23,0.3280571699142456,0.33516393319330995,0.32668165852837355,0.33493467218607637,379040000 +2012-08-24,0.33470526337623596,0.3363100076009096,0.32736924292844155,0.3280569982615161,347724000 +2012-08-27,0.32897403836250305,0.33539307091791015,0.3287448047682951,0.3344760545548143,340944000 +2012-08-28,0.3275986313819885,0.33080812108110486,0.3257646255558816,0.32645238115676684,310764000 +2012-08-29,0.32828643918037415,0.33034967898232365,0.32668166674689636,0.32736942245713463,250412000 +2012-08-30,0.32209664583206177,0.3287449141946255,0.32049190082343043,0.3275986638557797,307488000 +2012-08-31,0.3216380774974823,0.32668157236753886,0.31842858821528924,0.3243890722148988,485064000 +2012-09-04,0.3044443130493164,0.3175115863843646,0.30146408457659474,0.31636533625523816,694452000 +2012-09-05,0.3053613007068634,0.3099463007902913,0.3021517842512102,0.3055905343137811,480256000 +2012-09-06,0.3147605061531067,0.32301351577547344,0.3074244854537801,0.3076537463489158,657296000 +2012-09-07,0.3071952760219574,0.3092585149252702,0.29687899951913294,0.306736781524416,781064000 +2012-09-10,0.3044443130493164,0.3108633192381761,0.3037565848348476,0.3065075796789992,371108000 +2012-09-11,0.3081122040748596,0.31292646366870464,0.3030687109419613,0.3042149606234722,382808000 +2012-09-12,0.3115510940551758,0.3131558661982373,0.3076538488407988,0.3106341048266496,322608000 +2012-09-13,0.3136143982410431,0.3154484042457367,0.30765388555797973,0.31430215390889865,433836000 +2012-09-14,0.3172822594642639,0.3227842753374605,0.3133850153012203,0.3133850153012203,339468000 +2012-09-17,0.3085708022117615,0.31797006369133285,0.30513205201124866,0.31797006369133285,493348000 +2012-09-18,0.310634046792984,0.3143020576793399,0.30490279686352506,0.3051320304634502,359952000 +2012-09-19,0.31430208683013916,0.3186578262490107,0.30765381989810203,0.3113218311246575,451936000 +2012-09-20,0.3120095133781433,0.31521902956101466,0.30948777994383786,0.3136142851339559,320596000 +2012-09-21,0.3133850395679474,0.3152190450010277,0.31132180053620406,0.31246805051578486,340136000 +2012-09-24,0.3131558299064636,0.3136143244675916,0.30788307413159904,0.308341568692727,357832000 +2012-09-25,0.30742454528808594,0.31865781208980065,0.3069660507373287,0.3172823011087722,481544000 +2012-09-26,0.30215170979499817,0.30650747519816085,0.29848372702937376,0.3062782143189814,436812000 +2012-09-27,0.3044443130493164,0.30490283496397397,0.30031780711870953,0.30283956833429115,558888000 +2012-09-28,0.30581989884376526,0.3101756667957608,0.29917163007348746,0.30306890332757963,485508000 +2012-10-01,0.30077624320983887,0.3090292527161379,0.2996299934077835,0.3071952475670991,504236000 +2012-10-02,0.30192258954048157,0.30283957874379885,0.2984838390349021,0.30283957874379885,295492000 +2012-10-03,0.2989421784877777,0.3035271767823034,0.2973374345504428,0.3026101880548965,430872000 +2012-10-04,0.31223881244659424,0.31407281801393755,0.2980252897962514,0.2996300617481501,502608000 +2012-10-05,0.30490267276763916,0.31636516796130276,0.3037564232482728,0.31315568023857465,483068000 +2012-10-08,0.30192258954048157,0.3051320790808519,0.2996300892034286,0.3037565952758759,240596000 +2012-10-09,0.29550355672836304,0.3023810571250318,0.2945865402782195,0.30146406800364556,366360000 +2012-10-10,0.2904599606990814,0.2955034815702121,0.28931371092450636,0.2941279709092219,326568000 +2012-10-11,0.2920647859573364,0.2941280249995021,0.28977228598659444,0.2932110359427074,320516000 +2012-10-12,0.2895430326461792,0.2922940272174148,0.28770902715577007,0.29000152718659244,260696000 +2012-10-15,0.2932110130786896,0.2934402466606354,0.28656274728470327,0.29000149697266936,249580000 +2012-10-16,0.301693320274353,0.30261033678119886,0.2929818137674919,0.2957328086305115,367696000 +2012-10-17,0.2994006872177124,0.30077619770356984,0.29504492223166173,0.29802517673185497,391752000 +2012-10-18,0.2948157489299774,0.29871299299773096,0.29366949906718215,0.29871299299773096,254772000 +2012-10-19,0.2776220142841339,0.29252329200975125,0.27601726970714635,0.2904600255575474,709412000 +2012-10-22,0.27441251277923584,0.2803730236012085,0.27212001282136256,0.27876825176769304,480840000 +2012-10-23,0.28266555070877075,0.2844995563169745,0.27120302248968686,0.27189077800885797,573948000 +2012-10-24,0.2789974808692932,0.28564574638600065,0.2762464866994066,0.28449949653781853,332916000 +2012-10-25,0.27922672033309937,0.2842702138121414,0.27808047057291935,0.28128995896992337,307356000 +2012-10-26,0.27624648809432983,0.28128998198604804,0.27624648809432983,0.2796852376562403,389376000 +2012-10-31,0.2746417224407196,0.279685243771465,0.2739539943763023,0.2773927440133999,347112000 +2012-11-01,0.28770899772644043,0.28793825863757433,0.27578797692254287,0.27601723783367677,473220000 +2012-11-02,0.28633347153663635,0.2911477317818224,0.28449949366109095,0.29068923731293606,256700000 +2012-11-05,0.29848378896713257,0.2996300389433867,0.28564577830158416,0.28564577830158416,444840000 +2012-11-06,0.29825446009635925,0.2991714489369654,0.29321096681552783,0.2991714489369654,350804000 +2012-11-07,0.2890845835208893,0.29779609047234135,0.2877090723548009,0.29596208469381036,324620000 +2012-11-08,0.29068925976753235,0.29985925916861256,0.2900015043467006,0.2922940041969706,839024000 +2012-11-09,0.2794560492038727,0.29573281228155573,0.2785390600144649,0.2922940618281376,846280000 +2012-11-12,0.2732662260532379,0.28106071393035315,0.2705152046107252,0.2799144641055567,643624000 +2012-11-13,0.27120301127433777,0.2780805388528775,0.2709737776632657,0.2718907667650674,492120000 +2012-11-14,0.26455485820770264,0.27555886766034876,0.26432559719313614,0.2728078721293786,619300000 +2012-11-15,0.2657009959220886,0.27303699000259635,0.2638669905697732,0.266159490427979,466688000 +2012-11-16,0.2608868181705475,0.2666180696368465,0.25561406135579984,0.26570108033374373,624552000 +2012-11-19,0.2682226896286011,0.26913970583326935,0.26249144083223674,0.26570095655545073,404092000 +2012-11-20,0.2651079595088959,0.2683381554141269,0.2623391887271845,0.26718451009010524,336976000 +2012-11-21,0.2727219760417938,0.2734141411100534,0.2648771727191821,0.2651079127453148,422312000 +2012-11-23,0.2745678424835205,0.27779803815717163,0.2724912645461115,0.2738756498377175,276932000 +2012-11-26,0.2794131636619568,0.28010535637630185,0.27456786967169095,0.27502932231289606,364600000 +2012-11-27,0.2805667221546173,0.28471984964981306,0.2759521421610812,0.27825943215784926,451404000 +2012-11-28,0.28287404775619507,0.2842584329305323,0.2759521768946484,0.27941311232542176,398332000 +2012-11-29,0.2777980864048004,0.2847199590548684,0.2768751810534888,0.28333560102790095,488688000 +2012-11-30,0.27618294954299927,0.27964388538251406,0.2745678516522403,0.27756730737576135,460504000 +2012-12-03,0.27110686898231506,0.2796438654486332,0.2704147038678102,0.2796438654486332,391380000 +2012-12-04,0.27918243408203125,0.2796438866951179,0.2699532442949316,0.2715683696983448,528068000 +2012-12-05,0.2759522497653961,0.2787209933401433,0.27202986074241453,0.27687518262702987,633024000 +2012-12-06,0.27641358971595764,0.2782594271813738,0.2743370397580306,0.27525994473820575,412896000 +2012-12-07,0.2759522497653961,0.2780288280752643,0.2727220535123706,0.2766444425353522,338288000 +2012-12-10,0.28518131375312805,0.2872578913377619,0.27525996086227944,0.27595215339049073,513644000 +2012-12-11,0.2918725907802582,0.29556426743578496,0.2854121703856257,0.2861043631966718,816724000 +2012-12-12,0.2888730764389038,0.29441059083758814,0.287719431043979,0.29279549278570866,399404000 +2012-12-13,0.28910374641418457,0.2946412319649897,0.286335003638782,0.28841155384406664,377556000 +2012-12-14,0.29048800468444824,0.2934874864589045,0.28818071524333727,0.290257292243373,338660000 +2012-12-17,0.2893345355987549,0.29141111385933677,0.2849506940015427,0.2897960157711574,445232000 +2012-12-18,0.28979596495628357,0.29302616056623704,0.28841157969197684,0.28933448486480023,416436000 +2012-12-19,0.2918725907802582,0.29533352733041,0.2907189452635409,0.2918725907802582,458544000 +2012-12-20,0.2916416525840759,0.29325674955712555,0.2884114311329192,0.29302600963023673,334332000 +2012-12-21,0.28495046496391296,0.2877192062474854,0.28172024387886646,0.2877192062474854,462172000 +2012-12-24,0.28264331817626953,0.28564280086963634,0.28172038561404306,0.28471986830740986,127376000 +2012-12-26,0.2824125587940216,0.28656568627658463,0.28125891379914664,0.28195110629708486,196740000 +2012-12-27,0.2805667221546173,0.28333549215479203,0.2773365271611686,0.28287401215138536,299804000 +2012-12-28,0.27918243408203125,0.2835662751639645,0.27756730867861806,0.27802878879677795,220600000 +2012-12-31,0.28287404775619507,0.28402769289978613,0.277567274594662,0.27825946718183064,326460000 +2013-01-02,0.2934876084327698,0.29371834847480066,0.28864231509576177,0.2897959602957738,478836000 +2013-01-03,0.2937183380126953,0.29694853345564265,0.2902574025359359,0.29348759797888324,298888000 +2013-01-04,0.30340901017189026,0.3043319153907465,0.2932569152391067,0.2941798204579629,524968000 +2013-01-07,0.2946412265300751,0.3041011273020293,0.29256467636309424,0.303178222228942,610732000 +2013-01-08,0.2881808876991272,0.29625643308071564,0.2861043369614831,0.2953335002489257,466424000 +2013-01-09,0.281720370054245,0.2918724626476136,0.27987456004187494,0.2904880776332694,695020000 +2013-01-10,0.28218188881874084,0.2856428243248777,0.2805667635784873,0.2842584391203948,506368000 +2013-01-11,0.281720370054245,0.2835662075716817,0.27895162753062325,0.28333549507266875,513172000 +2013-01-14,0.2814897298812866,0.2835662804312858,0.2782595065195312,0.2835662804312858,305684000 +2013-01-15,0.27641358971595764,0.28010526464679003,0.2747984922481182,0.28010526464679003,375888000 +2013-01-16,0.27895161509513855,0.28125890501281026,0.27595213270115226,0.27595213270115226,337376000 +2013-01-17,0.28264331817626953,0.28379696325025155,0.27918238295432357,0.2798745754997264,580736000 +2013-01-18,0.28079745173454285,0.2826432891644624,0.27733651686784316,0.2826432891644624,397088000 +2013-01-22,0.2794131636619568,0.28310483980174733,0.2780288057383415,0.28056680901750697,308224000 +2013-01-23,0.2798745632171631,0.2805667282271214,0.2768750806554314,0.28033601572549094,421808000 +2013-01-24,0.2812589704990387,0.2824126157264807,0.2775672947691957,0.27895168004415477,396980000 +2013-01-25,0.2863349914550781,0.2865657039652544,0.2803360261094074,0.281720383685669,393920000 +2013-01-28,0.29094961285591125,0.2927954507236388,0.2870271970725883,0.28771938971112004,422492000 +2013-01-29,0.28471991419792175,0.2904881404975414,0.28356626893799786,0.2897959753456451,388872000 +2013-01-30,0.2842584252357483,0.28887300568519747,0.28333552014788604,0.28495061780417946,287592000 +2013-01-31,0.28287404775619507,0.28748865583562927,0.28102823753050515,0.2842584329305323,470544000 +2013-02-01,0.2854120433330536,0.2863349758386267,0.2828740133240606,0.2851813033303937,288816000 +2013-02-04,0.2805667221546173,0.28956516964505247,0.28033600965798033,0.2837969446531324,511744000 +2013-02-05,0.2870272099971771,0.28864233539483636,0.2810282710382753,0.28195117626116084,367296000 +2013-02-06,0.28471991419792175,0.2870272047177696,0.27849023529534706,0.28010533315822606,530688000 +2013-02-07,0.2835662066936493,0.28610423671039936,0.2807974641786007,0.28379694669701444,440000000 +2013-02-08,0.2854120433330536,0.28771933333938665,0.28356620582697384,0.2854120433330536,307232000 +2013-02-11,0.2886422872543335,0.2916417699860595,0.28495061196835253,0.287719354680304,408308000 +2013-02-12,0.2867964804172516,0.29002667601065124,0.28564283520459866,0.28610428778864555,277804000 +2013-02-13,0.2854120433330536,0.29233391335205283,0.28448913833254696,0.28702714083647346,856396000 +2013-02-14,0.2937183380126953,0.29394907804650733,0.27802875835037205,0.28148969382713146,882096000 +2013-02-15,0.2937183380126953,0.29510272320542713,0.2872579196217304,0.2930261454163294,733860000 +2013-02-19,0.28979596495628357,0.2941798057848021,0.28795012710556517,0.29394909324413204,433552000 +2013-02-20,0.28564295172691345,0.2953335699652773,0.28472001867725616,0.29071898723223905,713012000 +2013-02-21,0.2835662066936493,0.28841152672378434,0.2828740141886205,0.28518130420200544,580408000 +2013-02-22,0.2888730764389038,0.28910381651991907,0.28379704220225,0.28541214025412953,370148000 +2013-02-25,0.2837969660758972,0.2918724816741756,0.28333551354272357,0.28956519150323895,644444000 +2013-02-26,0.28716304898262024,0.288788055124863,0.2834487255085137,0.28437732021394546,487504000 +2013-02-27,0.29250234365463257,0.2945916607368922,0.28646657564873623,0.2871630146761561,476980000 +2013-02-28,0.29389530420303345,0.29830603982506504,0.29041313576233013,0.2915738585758979,591392000 +2013-03-01,0.29505589604377747,0.29598446281292284,0.2892522845521128,0.2918058570041638,389396000 +2013-03-04,0.29389530420303345,0.29668103342083313,0.2906452637207548,0.2929667093478903,353680000 +2013-03-05,0.2971452474594116,0.297609530941402,0.29412736331576145,0.295520241435541,366168000 +2013-03-06,0.2969132363796234,0.30178825636937406,0.29552035771179797,0.2990025267075424,342928000 +2013-03-07,0.2962166965007782,0.30155602601668635,0.2945916903891043,0.29853814170997217,314824000 +2013-03-08,0.2976095378398895,0.29900241599195554,0.29552024828559953,0.2969131264376655,246464000 +2013-03-11,0.29482391476631165,0.29598463775067435,0.2922703131311862,0.29459178677373044,299748000 +2013-03-12,0.2957524359226227,0.29668100300876576,0.2915738286873549,0.2943595576195961,310856000 +2013-03-13,0.2957524359226227,0.30085961024403357,0.2929666793165695,0.2957524359226227,485840000 +2013-03-14,0.29598456621170044,0.2985381672296248,0.2941274043508293,0.29760957246228315,383304000 +2013-03-15,0.29343095421791077,0.2959845272256754,0.2922702039931705,0.2959845272256754,355776000 +2013-03-18,0.2913416624069214,0.29412739123711995,0.2892523727027252,0.29157381800685916,298312000 +2013-03-19,0.2894844114780426,0.2929665783618611,0.28739512241727244,0.2915737282126151,355480000 +2013-03-20,0.2929667830467224,0.29389537813546324,0.2897167694206839,0.29227034364862226,340588000 +2013-03-21,0.2883238196372986,0.2918059880966454,0.2878595360441487,0.29134170450349545,339032000 +2013-03-22,0.2897166311740875,0.29087735372577517,0.2880916251364865,0.28925234768817415,232476000 +2013-03-25,0.2880917191505432,0.29157388794195543,0.2860024012714053,0.29134173228633425,362076000 +2013-03-26,0.2901809513568878,0.2904131069661076,0.28762735035071785,0.2887880730491929,232540000 +2013-03-27,0.29366305470466614,0.295288060589483,0.28832372593414846,0.2890201649344431,254944000 +2013-03-28,0.2978416681289673,0.2980738236925321,0.2908773333077013,0.2929666226845585,349276000 +2013-04-01,0.2880917191505432,0.29714534693868805,0.2860024012714053,0.29714534693868805,442828000 +2013-04-02,0.28507375717163086,0.2890202085369332,0.2832165954486033,0.2883237694315716,371524000 +2013-04-03,0.2815916836261749,0.28623457565178445,0.279502365610359,0.2846095413037656,353156000 +2013-04-04,0.2843772768974304,0.28530584378761203,0.27973438709891013,0.28066295398909175,294676000 +2013-04-05,0.2892524003982544,0.2892524003982544,0.27950230704828466,0.28019874624097013,551352000 +2013-04-08,0.28855597972869873,0.28948454692934406,0.28321664914044975,0.28948454692934406,326660000 +2013-04-09,0.2931987941265106,0.2952880836165147,0.28669874240655285,0.28878803189655694,380584000 +2013-04-10,0.2978416681289673,0.29830595158229034,0.29273449479480024,0.29343093381168817,384688000 +2013-04-11,0.29644888639450073,0.2983060484848855,0.28553809716498657,0.29366315709583135,969220000 +2013-04-12,0.3038775622844696,0.3071275754817017,0.2952881902975512,0.29784179186238935,770548000 +2013-04-15,0.2976095378398895,0.30387746185037756,0.29575240386888013,0.3029488671910639,430420000 +2013-04-16,0.30085960030555725,0.30294889001726844,0.29877028292003505,0.30039531677782266,468844000 +2013-04-17,0.2969132363796234,0.30132397270470535,0.29505607404712925,0.29853824304287363,532948000 +2013-04-18,0.2911095917224884,0.29946680832466177,0.2911095917224884,0.29760964600486556,402548000 +2013-04-19,0.2918059527873993,0.29273454753515177,0.2871630620700716,0.2908773857134584,303028000 +2013-04-22,0.2922701835632324,0.29482378406630677,0.2892523272808075,0.2915737722204,245568000 +2013-04-23,0.29993095993995667,0.3029488159695025,0.29435947594750933,0.2948237593617622,376948000 +2013-04-24,0.31014540791511536,0.3126990090454057,0.300627470255466,0.30085962587597,556556000 +2013-04-25,0.3126990497112274,0.3133954889894964,0.3089847253430042,0.31177048245608013,353224000 +2013-04-26,0.3113061487674713,0.312699027223842,0.3096811423509155,0.3122347436296568,324332000 +2013-04-29,0.31502044200897217,0.3161811647176376,0.31037755117431043,0.31177042949423384,269712000 +2013-04-30,0.319663405418396,0.319663405418396,0.31362763489348,0.31571695284771334,276712000 +2013-05-01,0.316877543926239,0.32175258944982893,0.31571682143717544,0.31966327236523023,341316000 +2013-05-02,0.32059189677238464,0.3215204637804595,0.3147882561135831,0.31664541780354244,323480000 +2013-05-03,0.3219846487045288,0.32430609318778386,0.32082392646290125,0.32268108758426556,293864000 +2013-05-06,0.3210562467575073,0.32384197603238224,0.31919908468298563,0.3219848139578605,217116000 +2013-05-07,0.316877543926239,0.32175258944982893,0.31385965991991227,0.3210561504216294,448068000 +2013-05-08,0.3226812481880188,0.3245384102337231,0.3161811948649612,0.31734191768429953,334032000 +2013-05-09,0.32291343808174133,0.32430628900843644,0.31641338406904385,0.3168776677112755,566800000 +2013-05-10,0.3375385105609894,0.33893138898764613,0.3296455789329585,0.3296455789329585,861136000 +2013-05-13,0.3305742144584656,0.33660998481836957,0.32918133586038995,0.33521710622029394,289812000 +2013-05-14,0.33544912934303284,0.3382348577647339,0.33127052287357783,0.3345205347532612,454140000 +2013-05-15,0.34125277400016785,0.3424134965917136,0.33382412727522737,0.33382412727522737,313172000 +2013-05-16,0.33962783217430115,0.34427072341905524,0.3384670816892979,0.34078855498548966,308368000 +2013-05-17,0.3451992869377136,0.3475207325354722,0.33869923372922667,0.3412528349562869,312116000 +2013-05-20,0.34450283646583557,0.3458957148484995,0.3426456745135548,0.3438063972745036,236380000 +2013-05-21,0.3481194078922272,0.34951936169767067,0.34251964829923015,0.34648614699546876,357784000 +2013-05-22,0.33598652482032776,0.34951930752262655,0.33458657123187524,0.34951930752262655,480404000 +2013-05-23,0.34135299921035767,0.34251961800692243,0.3310867371119562,0.3320200210234535,393884000 +2013-05-24,0.3392530679702759,0.34228628239780523,0.33551987670341116,0.3394864028548497,283304000 +2013-05-28,0.3390197455883026,0.3427529369928425,0.33575322397012053,0.34181965304890105,279300000 +2013-05-29,0.33691978454589844,0.3390196869638378,0.33551983105768407,0.33691978454589844,335052000 +2013-05-30,0.34135299921035767,0.34485285560005197,0.3355198774131478,0.3364531891390313,284504000 +2013-05-31,0.3376198410987854,0.3443862196577437,0.3376198410987854,0.33948643691951524,577508000 +2013-06-03,0.3371531069278717,0.3406529627045703,0.3301533675600933,0.3380863906759055,444468000 +2013-06-04,0.3376198410987854,0.34531953147530303,0.3355199103700685,0.3392531020115282,363676000 +2013-06-05,0.33038678765296936,0.33971973879898465,0.3294534758497348,0.3371531939224635,464520000 +2013-06-06,0.3324865698814392,0.33505314164098426,0.33015333294162674,0.33038666776135933,341044000 +2013-06-07,0.3371531069278717,0.33925300926813834,0.33341991630697404,0.33481984192902475,274584000 +2013-06-10,0.33691978454589844,0.3390196869638378,0.3343532124222995,0.3362198078017912,224148000 +2013-06-11,0.33062002062797546,0.33715308997893345,0.33062002062797546,0.3324865880302093,296336000 +2013-06-12,0.32782021164894104,0.33505325983975737,0.3259536158757251,0.3322533800871275,312588000 +2013-06-13,0.3352864980697632,0.3369197584700191,0.3264201915641711,0.3266534985845619,236256000 +2013-06-14,0.3348199725151062,0.33691990348876666,0.3324867344206338,0.33645326143275056,236012000 +2013-06-17,0.33808642625808716,0.341119640480002,0.3355198539593014,0.3373864494662016,255336000 +2013-06-18,0.33598652482032776,0.3434528790585113,0.3331866176434227,0.3397196880322274,486772000 +2013-06-19,0.3462527394294739,0.3611854749011821,0.3378530739882391,0.3390196926431671,1159588000 +2013-06-20,0.33691978454589844,0.34391949635820585,0.3345865472751293,0.34345285446692847,628696000 +2013-06-21,0.3364531099796295,0.33995296554589116,0.33085332438498316,0.33878634702380395,714228000 +2013-06-24,0.3294534385204315,0.33575320208169673,0.324553656412585,0.3315533689789817,580772000 +2013-06-25,0.3317866623401642,0.3336532298727964,0.3282867786805244,0.33295328095525023,457360000 +2013-06-26,0.32992008328437805,0.3359865115081341,0.3285201297513934,0.3355198417875504,579752000 +2013-06-27,0.3268868625164032,0.33132000225661473,0.323387006569589,0.330853360359916,808036000 +2013-06-28,0.3275868594646454,0.33085338075730264,0.3226870497112752,0.32688688266925187,431536000 +2013-07-01,0.3289867043495178,0.3306199924086365,0.3268868022940473,0.32992001578535385,199524000 +2013-07-02,0.3287534713745117,0.3336532532119857,0.3257202572002371,0.3271201829476367,256392000 +2013-07-03,0.3296867907047272,0.33365328913768927,0.32595359934759416,0.32595359934759416,140388000 +2013-07-05,0.3322533965110779,0.33295337343743364,0.3285202047801068,0.33062013555917413,184684000 +2013-07-08,0.33062002062797546,0.33481982509738145,0.32875342541136177,0.33318656471323693,262084000 +2013-07-09,0.3322533965110779,0.3343532994757557,0.33038680064559234,0.3313200846711404,157364000 +2013-07-10,0.3366864025592804,0.3376197140255602,0.33131995202490117,0.332253263491181,208468000 +2013-07-11,0.34135299921035767,0.34181964116610636,0.3378531150062773,0.33855309184709337,239832000 +2013-07-12,0.3415863513946533,0.34485290114508244,0.3394864484092551,0.3406530673598963,216360000 +2013-07-15,0.34088632464408875,0.3422862783060241,0.3355198726925175,0.3422862783060241,201332000 +2013-07-16,0.3427528738975525,0.3446194692562123,0.34065297150304896,0.34228623201148306,162560000 +2013-07-17,0.34088632464408875,0.3439195390353582,0.3399530407457223,0.3427529202552073,166100000 +2013-07-18,0.33948618173599243,0.3415860830718756,0.3350530165172631,0.34041946503763654,344488000 +2013-07-19,0.3322533965110779,0.3390197752322748,0.3287535396936886,0.337386514280371,480532000 +2013-07-22,0.3320200443267822,0.33785313871901057,0.33062011836128025,0.3348199240721742,292384000 +2013-07-23,0.3315533995628357,0.3362198750375551,0.3299201387095615,0.3362198750375551,246792000 +2013-07-24,0.3315533995628357,0.3355198981534696,0.3310867575782413,0.3345866141842809,284252000 +2013-07-25,0.332720011472702,0.3371531797695988,0.32898682004525076,0.331320057733811,243320000 +2013-07-26,0.33132001757621765,0.33341994793003243,0.3287534731185114,0.3287534731185114,227360000 +2013-07-29,0.33062002062797546,0.33481982509738145,0.3296867091124787,0.33062002062797546,179540000 +2013-07-30,0.336219847202301,0.34065301522490027,0.3315533721139137,0.3317867069940873,266076000 +2013-07-31,0.33691978454589844,0.34018630559922236,0.3343532124222995,0.3345865472751293,270160000 +2013-08-01,0.3415863513946533,0.342286328327916,0.33411999567342787,0.3380864945427298,277648000 +2013-08-02,0.34438619017601013,0.3450861670256598,0.33855309611957374,0.3408863337421483,209628000 +2013-08-05,0.3460194766521454,0.34718609545631474,0.3415863085076701,0.3434529041572183,185188000 +2013-08-06,0.34088632464408875,0.3469527534266277,0.34018634781312107,0.34625277659566,206608000 +2013-08-07,0.34065306186676025,0.34415291866224745,0.33878646601295587,0.3390197731106881,244380000 +2013-08-08,0.34298625588417053,0.34461951661706264,0.3385530878213083,0.3425196139339708,345696000 +2013-08-09,0.33808642625808716,0.34321954304127456,0.3292201184610994,0.3294534255154718,906224000 +2013-08-12,0.3352864980697632,0.34018627927053086,0.30588767179325677,0.3243202614943735,257568000 +2013-08-13,0.3364531099796295,0.33785303551750645,0.33365320327511655,0.33575313330350126,197468000 +2013-08-14,0.3506859540939331,0.35278585682900737,0.33551988172911607,0.33575321661718494,828508000 +2013-08-15,0.35301920771598816,0.3558190874277739,0.3455528247320427,0.3469527784951294,723616000 +2013-08-16,0.354419082403183,0.35931886385200074,0.35161917550170824,0.35231915222707694,660456000 +2013-08-19,0.3488192856311798,0.3534857599035358,0.34858595079180976,0.35231914133544684,393432000 +2013-08-20,0.3505779802799225,0.3529229812486484,0.34823297931119657,0.34870197391401847,234192000 +2013-08-21,0.348936527967453,0.35292302451205215,0.3475295160318909,0.3484675053525189,261540000 +2013-08-22,0.35081255435943604,0.35409554512151104,0.34870203633699787,0.34870203633699787,129016000 +2013-08-23,0.35081255435943604,0.35409554512151104,0.35010904835195666,0.3512815490462151,245120000 +2013-08-26,0.35151612758636475,0.35245414516851564,0.35010914314508224,0.3510471327726039,300152000 +2013-08-27,0.34706053137779236,0.3505780333634918,0.3458880307158926,0.3482330320396922,277464000 +2013-08-28,0.34706053137779236,0.3503435220492635,0.3456535194016643,0.3477640373658564,318824000 +2013-08-29,0.346357136964798,0.3496401566484779,0.34495012453541657,0.3458881421398808,276216000 +2013-08-30,0.34588801860809326,0.3475295138863683,0.3442465233298182,0.3465915245715311,378120000 +2013-09-03,0.3461226224899292,0.35104713799424053,0.3440121318192984,0.34682612869834933,284680000 +2013-09-04,0.3494056463241577,0.35151613702003554,0.34565363180411945,0.3461226266304667,222080000 +2013-09-05,0.3503434956073761,0.3517505074773112,0.3477640111186535,0.3479984944605635,174904000 +2013-09-06,0.348936527967453,0.3524540298517381,0.3463570154037959,0.35057802325586207,226756000 +2013-09-09,0.35479918122291565,0.35479918122291565,0.3508126829916352,0.35175067270912524,246408000 +2013-09-10,0.36230310797691345,0.36253761933515316,0.3557370974470891,0.3573786210455147,292132000 +2013-09-11,0.36840003728866577,0.3693380545468643,0.35925451578298256,0.36183402829975414,396164000 +2013-09-12,0.3681657016277313,0.3728557059362349,0.36652417775605045,0.36652417775605045,303808000 +2013-09-13,0.37051066756248474,0.3721521633190694,0.36675865330061,0.36933816659997737,159696000 +2013-09-16,0.3707450032234192,0.3761385110923197,0.3693380194019344,0.3735590267756225,231412000 +2013-09-17,0.3719176650047302,0.3749661732052243,0.3705106805730915,0.37215217638731785,168608000 +2013-09-18,0.37520065903663635,0.3761386485938517,0.37027614397468794,0.37215215104374577,268168000 +2013-09-19,0.3735591471195221,0.37754564449659056,0.3719176235337064,0.3768421383819018,227572000 +2013-09-20,0.37027597427368164,0.37684198202880664,0.36957246845088,0.37449698125587727,356036000 +2013-09-23,0.3667586147785187,0.37309011372011064,0.36464809649490465,0.37004160594686264,271244000 +2013-09-24,0.3681657016277313,0.36957268614750394,0.36488268183900036,0.3669932005506054,229732000 +2013-09-25,0.3686347007751465,0.371448697802204,0.3658206757934579,0.3674621996843199,233156000 +2013-09-26,0.3674621284008026,0.3702761248819765,0.365351610073953,0.3695726187730266,148816000 +2013-09-27,0.3653516471385956,0.3676966491032434,0.36324115655226397,0.3646481409582755,151920000 +2013-09-30,0.3648826479911804,0.36746216130342485,0.35948913794579646,0.3615996564616223,226640000 +2013-10-01,0.3646482229232788,0.36699325336966704,0.3625377318625546,0.3653517292617318,226976000 +2013-10-02,0.3644135892391205,0.3658205733814464,0.3608960869513708,0.3608960869513708,162036000 +2013-10-03,0.3606615662574768,0.3679310819786909,0.3590200708233834,0.36464806315588155,436768000 +2013-10-04,0.3655861020088196,0.36863460968258416,0.3592545753192222,0.3601925927328705,246228000 +2013-10-07,0.3655861020088196,0.3681656149530721,0.36230308299298686,0.3641790898656592,169952000 +2013-10-08,0.3625376224517822,0.3698071391641935,0.35972362590184526,0.36464811287557836,290712000 +2013-10-09,0.35690951347351074,0.36511704565041336,0.355033534872113,0.36488253434792894,275860000 +2013-10-10,0.36089611053466797,0.3618341000241796,0.35690958531768097,0.35948909834577547,223484000 +2013-10-11,0.35784757137298584,0.359723578142079,0.3540955578347995,0.35526805857115495,213704000 +2013-10-14,0.36324116587638855,0.36324116587638855,0.35690963804561116,0.35690963804561116,166628000 +2013-10-15,0.36136525869369507,0.3653517576484882,0.361130747244445,0.36324126642378507,208820000 +2013-10-16,0.36582058668136597,0.36722759882946904,0.3630065903397841,0.3634755850709437,210072000 +2013-10-17,0.3665240705013275,0.3674620878613178,0.36300656829926486,0.36300656829926486,213324000 +2013-10-18,0.3707450032234192,0.37191750371863164,0.36441350614019546,0.36582048996168026,255068000 +2013-10-21,0.37168312072753906,0.37543510655229045,0.3705106199158122,0.37520062316271974,195008000 +2013-10-22,0.3698072135448456,0.3719177043931323,0.3665241936140716,0.37168322094034045,179452000 +2013-10-23,0.36347559094429016,0.3691036116730205,0.3623030901201328,0.3691036116730205,252216000 +2013-10-24,0.36089611053466797,0.3667586147306782,0.3601926044402217,0.36441361305227415,236436000 +2013-10-25,0.35737866163253784,0.3630066553231934,0.35620616061743215,0.3627721718929498,330492000 +2013-10-28,0.3566751480102539,0.35855115518630976,0.35175063266743595,0.356909631435618,394024000 +2013-10-29,0.3571440279483795,0.3578475339074624,0.35292302014850196,0.3562060386393488,387952000 +2013-10-30,0.35690951347351074,0.35995802063271126,0.3538610063143102,0.35831652537917846,204032000 +2013-10-31,0.3562060594558716,0.3599580448658784,0.3555025534556761,0.3573785601379902,293368000 +2013-11-01,0.35784757137298584,0.35948906681295884,0.35526805857115495,0.35808205474748334,206136000 +2013-11-04,0.3475296199321747,0.35902014629557955,0.3468261137540677,0.35902014629557955,410264000 +2013-11-05,0.34706053137779236,0.34870202671352796,0.3416670227421291,0.3454190360420568,422368000 +2013-11-06,0.3494056463241577,0.3496401577146463,0.34354314110824163,0.34706064423779126,198044000 +2013-11-07,0.3411979675292969,0.3491709594337136,0.34049446166605635,0.3482329702524702,553076000 +2013-11-08,0.3648826479911804,0.36605514895954094,0.3503436136198076,0.35175062596369144,734532000 +2013-11-11,0.3679311275482178,0.36886911706826647,0.3627721292786978,0.3634756074414213,297624000 +2013-11-12,0.3686347007751465,0.37168320920222175,0.36441369125724465,0.3695726904659553,316032000 +2013-11-13,0.37871813774108887,0.37871813774108887,0.3669931292478703,0.36769660739376314,332792000 +2013-11-14,0.38035961985588074,0.3827046214713967,0.37731111216478513,0.37754562350818643,307980000 +2013-11-15,0.37918713688850403,0.3822356447230289,0.3754351229453002,0.38176664996878484,450332000 +2013-11-18,0.37004148960113525,0.3742624968866001,0.36910350040641693,0.3709795067504698,316948000 +2013-11-19,0.3640294671058655,0.37157410631305604,0.36355793242529466,0.3682733354430411,206716000 +2013-11-20,0.35860675573349,0.3652083257216418,0.3578994396443988,0.36426522823418034,204776000 +2013-11-21,0.3614359200000763,0.36214323594829806,0.35742783376817144,0.35907821891001296,213568000 +2013-11-22,0.3578994572162628,0.361907544443206,0.3571921410924444,0.361907544443206,158668000 +2013-11-25,0.36567988991737366,0.36615142464614053,0.3578994685216437,0.3578994685216437,248208000 +2013-11-26,0.36874496936798096,0.3727530573906022,0.3673303368395139,0.3696880389829413,753176000 +2013-11-27,0.3701596260070801,0.37133847715557916,0.3661515096173605,0.36850921191435865,181272000 +2013-11-29,0.3678017854690552,0.3711025845600745,0.36544408387804994,0.37015951516608037,116964000 +2013-12-02,0.3713383674621582,0.3739318223591321,0.3656798667572677,0.36638718285863153,373872000 +2013-12-03,0.3711026608943939,0.37628959984033383,0.3687449588184189,0.3713384423444017,290560000 +2013-12-04,0.37628957629203796,0.3769968924917716,0.3692164705067496,0.3701595681417358,493176000 +2013-12-05,0.3701596260070801,0.3769969514259634,0.36968806306285773,0.3769969514259634,271812000 +2013-12-06,0.36473673582077026,0.3746390752510724,0.36379363847606533,0.3746390752510724,281000000 +2013-12-09,0.35860675573349,0.36591564181073294,0.3578994396443988,0.3647367910309208,385220000 +2013-12-10,0.3668588399887085,0.3685092260386579,0.3581353467766651,0.35860688163293214,524268000 +2013-12-11,0.3633221983909607,0.3680376020233589,0.36261488222489646,0.36756606728132357,414156000 +2013-12-12,0.35624903440475464,0.3640294547409644,0.3555417183549141,0.362143287976729,258724000 +2013-12-13,0.3541271686553955,0.3595498888246024,0.353655633881122,0.35695643351308576,184588000 +2013-12-16,0.3545985817909241,0.35766359893133914,0.3541270471784021,0.35436282853767054,237620000 +2013-12-17,0.35624903440475464,0.3571921037338633,0.3512978501618889,0.3543628676405192,274104000 +2013-12-18,0.361200213432312,0.36190752952697797,0.3524767232141509,0.35695637307635564,426232000 +2013-12-19,0.36261478066444397,0.36308631527441276,0.3583709129626954,0.36072861411855406,258544000 +2013-12-20,0.36992377042770386,0.37015955185258065,0.3623791021039193,0.36332219969740376,382080000 +2013-12-23,0.37204569578170776,0.3751107138158065,0.36898070585363213,0.37204569578170776,168568000 +2013-12-24,0.3729887306690216,0.37416758139883194,0.3692163970912212,0.37416758139883194,79600000 +2013-12-26,0.36945223808288574,0.37558227410925826,0.3685091404832776,0.37440342318926534,168920000 +2013-12-27,0.37157416343688965,0.3722814796194945,0.36921646156555593,0.37133841011337027,210976000 +2013-12-30,0.376525342464447,0.37676112389014194,0.37133840405336493,0.37180993879873186,248180000 +2013-12-31,0.3777042627334595,0.3795904301672808,0.3748750256357415,0.37723272790151113,235776000 +2014-01-02,0.3739319145679474,0.3767611796710783,0.370631142755664,0.3753465471195128,260092000 +2014-01-03,0.36945223808288574,0.37534649268285053,0.36827338716289276,0.3746391765096502,259332000 +2014-01-06,0.3744034767150879,0.3772327137063425,0.36968804425496105,0.373224597520536,409492000 +2014-01-07,0.3805333077907562,0.3819479396787193,0.37558215239491305,0.378175606714827,333288000 +2014-01-08,0.3857204020023346,0.38760656911684793,0.38053343541091716,0.381948067773308,308192000 +2014-01-09,0.3713383674621582,0.3805333924618276,0.37015951666189184,0.3798260763604638,292172000 +2014-01-10,0.37086689472198486,0.37511076425476825,0.3675661229220572,0.3725173087279756,218492000 +2014-01-13,0.3621431887149811,0.37322437677178766,0.36143587285901246,0.3708666759892326,243332000 +2014-01-14,0.37346041202545166,0.37416772836235734,0.3623791883279983,0.364029602482788,241828000 +2014-01-15,0.37746837735176086,0.37888300956420184,0.3734602902245384,0.37511067573503937,175044000 +2014-01-16,0.3786473274230957,0.37935464371474026,0.37581809036254515,0.37746847630569735,220652000 +2014-01-17,0.37699687480926514,0.3831269107780706,0.37463917299142035,0.3786472604605519,340400000 +2014-01-21,0.3784113824367523,0.38076908347761573,0.37440329628848723,0.3774682851567989,246076000 +2014-01-22,0.37793999910354614,0.37959038487144175,0.37346034846951565,0.3791188500957608,337940000 +2014-01-23,0.376525342464447,0.3807692113847952,0.3736961058862225,0.37676112389014194,185028000 +2014-01-24,0.3668588399887085,0.3748750449693661,0.3668588399887085,0.37346041229453547,246696000 +2014-01-27,0.36450105905532837,0.37204569944790145,0.36237911050033933,0.3668587609346339,233812000 +2014-01-28,0.3680376410484314,0.3682734224974616,0.3623791392259377,0.3637937717080675,167996000 +2014-01-29,0.36450105905532837,0.36874492805928305,0.36426527762498845,0.366622979504294,162944000 +2014-01-30,0.37063103914260864,0.37133835522065517,0.3654440733076137,0.36662292406901814,202896000 +2014-01-31,0.3701596260070801,0.37228154683196707,0.3652084399409726,0.36544419330705535,335348000 +2014-02-03,0.36520838737487793,0.37322456278845595,0.36379375495788213,0.37275302801813215,431728000 +2014-02-04,0.3673301935195923,0.36803750950785485,0.36308632569603255,0.3649724922960608,280692000 +2014-02-05,0.3640294671058655,0.36591563393416787,0.36120020281040244,0.36473678317973124,214676000 +2014-02-06,0.36874496936798096,0.3696880389829413,0.36402956508112616,0.3645010998886063,168380000 +2014-02-07,0.3741675615310669,0.3746390961767495,0.3663871415062443,0.36968791213203966,157248000 +2014-02-10,0.37534645199775696,0.3802976365674606,0.37346028510901175,0.37369606650986237,324372000 +2014-02-11,0.3831268846988678,0.3840699541194025,0.37558224501652787,0.37746838385759723,235384000 +2014-02-12,0.396801620721817,0.39963088562889937,0.3843057944022869,0.3843057944022869,744528000 +2014-02-13,0.4092974066734314,0.4116551365654717,0.3996308462143708,0.4067039515724249,902836000 +2014-02-14,0.4222647249698639,0.4232077942863473,0.40528925242502123,0.40552503380715094,817536000 +2014-02-18,0.42202892899513245,0.42391509566889846,0.41849237702157743,0.42250049174308646,428988000 +2014-02-19,0.42768755555152893,0.43145989001513907,0.42014288662430865,0.4220290538561137,450340000 +2014-02-20,0.44277679920196533,0.4437198686240734,0.4279232731146279,0.4286305611281986,398088000 +2014-02-21,0.43947598338127136,0.4477279669895274,0.4366467471159943,0.4420694663529535,451052000 +2014-02-24,0.4458417594432831,0.4491425301006904,0.43452478730843097,0.43853287399414476,403112000 +2014-02-25,0.4438287317752838,0.44714443520065666,0.4390920367958332,0.44524975156229063,242184000 +2014-02-26,0.4431181252002716,0.44951265597333395,0.44169710581384836,0.442881279224894,360884000 +2014-02-27,0.43814465403556824,0.4476180428040371,0.43696048043950964,0.4431181944321846,388848000 +2014-02-28,0.4353026747703552,0.4400393694997334,0.42890811429935255,0.4357763385967075,321692000 +2014-03-03,0.43317118287086487,0.43317118287086487,0.4218031088852061,0.4255924762914024,375948000 +2014-03-04,0.4376710057258606,0.44051301681034916,0.4345921486206119,0.4353026584499657,260344000 +2014-03-05,0.4414602816104889,0.4416971275975473,0.4353025965091183,0.4371972514738954,241472000 +2014-03-06,0.4353026747703552,0.4445392181994716,0.434592164914363,0.4421708708347825,290144000 +2014-03-07,0.43482890725135803,0.4379077639377381,0.43151323280936277,0.4371972542050469,268452000 +2014-03-10,0.42843446135520935,0.43530268582701676,0.4265397777687477,0.4334080022405551,300888000 +2014-03-11,0.4326975345611572,0.4364869021036019,0.42914501307746444,0.43056600473118295,297220000 +2014-03-12,0.4338817000389099,0.43648689370331956,0.4289081587642845,0.43056599644484944,239428000 +2014-03-13,0.4201452434062958,0.4364868575011725,0.41801371379413194,0.43482899172518014,385172000 +2014-03-14,0.4220398962497711,0.42582926338254157,0.4158822099501792,0.4158822099501792,460048000 +2014-03-17,0.4220398962497711,0.42630292721590585,0.42156623241640684,0.4232240699496459,299656000 +2014-03-18,0.43198689818382263,0.4348289088923904,0.42180300059794235,0.4236976838146284,293904000 +2014-03-19,0.43956559896469116,0.44785484149414995,0.43411839535181146,0.43530259705566776,366168000 +2014-03-20,0.43980249762535095,0.44359186447934457,0.43530264919004374,0.4371973043841146,191800000 +2014-03-21,0.43909209966659546,0.44714449922439,0.43672375183776174,0.4435919774811394,566116000 +2014-03-24,0.43696045875549316,0.4428813264419651,0.4305658990677641,0.43932880583008194,306096000 +2014-03-25,0.43696045875549316,0.4421708166730036,0.43364475591131435,0.4416971529046707,304424000 +2014-03-26,0.42701345682144165,0.4492759403479444,0.4232240895135048,0.44098672406564565,557756000 +2014-03-27,0.4213292896747589,0.4296185031157902,0.41659256804696426,0.4260659830696339,540728000 +2014-03-28,0.42393454909324646,0.4265397423373415,0.41943470065300154,0.4206188742670582,398820000 +2014-03-31,0.4241713881492615,0.4284344187365012,0.4218030409600089,0.4246450519405269,273404000 +2014-04-01,0.44169721007347107,0.44690756866535747,0.4324606383473323,0.43767102517214646,656272000 +2014-04-02,0.43885523080825806,0.4426445699541362,0.43696054711885407,0.4416972422258991,239948000 +2014-04-03,0.44359198212623596,0.45424954746758894,0.4395657681887114,0.4398026142672482,599548000 +2014-04-04,0.42985549569129944,0.44856545792229197,0.4279608120405379,0.44596026437337866,368032000 +2014-04-07,0.43127650022506714,0.43956571674262923,0.4277239788603977,0.430092326436844,428576000 +2014-04-08,0.4466707408428192,0.4478549145068058,0.43056594513308905,0.43127645497806644,470692000 +2014-04-09,0.4461970925331116,0.4525916535318616,0.44264457119288597,0.448802286142449,421968000 +2014-04-10,0.4353026747703552,0.45046008661119435,0.43388165505837073,0.4443024004027593,372748000 +2014-04-11,0.42914482951164246,0.43861821608260143,0.4234607806293157,0.43198683983634634,353112000 +2014-04-14,0.4338817000389099,0.4355395377194749,0.4291450048184783,0.43198701630415115,290184000 +2014-04-15,0.43696045875549316,0.43932880583008194,0.4300922352994312,0.4343552656802758,304636000 +2014-04-16,0.437907874584198,0.4395657122240825,0.43246066956778034,0.43909204836024834,235136000 +2014-04-17,0.43956559896469116,0.44359181135220394,0.43530259705566776,0.4362499245392457,153532000 +2014-04-21,0.4431181252002716,0.44430229861131726,0.4369604121696657,0.4398024227095911,117004000 +2014-04-22,0.44690755009651184,0.44974958942211674,0.44146034569967135,0.44382869298239097,255120000 +2014-04-23,0.452117919921875,0.45330209351927736,0.446907533506964,0.4476180433119905,261580000 +2014-04-24,0.4561440944671631,0.46088078875252253,0.45519676690326116,0.45519676690326116,391492000 +2014-04-25,0.44359198212623596,0.45945993533193047,0.4426446260450223,0.4551969035488026,313600000 +2014-04-28,0.44169721007347107,0.4495127620777645,0.4362500054503012,0.4471444146966409,226788000 +2014-04-29,0.4426444470882416,0.4443023125018735,0.43767093554611186,0.4433549568036664,171300000 +2014-04-30,0.4374341070652008,0.4424076470392454,0.43648677956201287,0.44193398328765143,305740000 +2014-05-01,0.43980249762535095,0.4450128558748977,0.43624997678707916,0.4440655282778623,198104000 +2014-05-02,0.4364868402481079,0.4419340447310879,0.4338816469027484,0.4419340447310879,156376000 +2014-05-05,0.4412234425544739,0.4445391168156785,0.43553939323579594,0.4360130569541222,239260000 +2014-05-06,0.4322238862514496,0.4492759843410482,0.4310397123808812,0.44548664489498857,416188000 +2014-05-07,0.4326975345611572,0.43625005604484995,0.4279608392495669,0.4322238706765844,293900000 +2014-05-08,0.43814465403556824,0.4450128495995379,0.42890808304655575,0.43103961245921657,432728000 +2014-05-09,0.4274870753288269,0.4289080949767936,0.4194347059448189,0.4248819102847896,539532000 +2014-05-12,0.44003933668136597,0.44098666426341837,0.42819757250815793,0.4284344185201338,299856000 +2014-05-13,0.43293431401252747,0.44122355830599924,0.43151332248476293,0.43411848773546224,221104000 +2014-05-14,0.4286712408065796,0.43482895485344386,0.42843442302503915,0.43317111745095754,214320000 +2014-05-15,0.4263029396533966,0.4300923068967228,0.4220399085628869,0.42772395942787617,325896000 +2014-05-16,0.42535558342933655,0.42843444057891605,0.4229872361193411,0.4229872361193411,283960000 +2014-05-19,0.43909209966659546,0.4414604474954292,0.42796087051766357,0.4298555544273172,360076000 +2014-05-20,0.43397656083106995,0.44040054417260116,0.43183524250487926,0.4392109165773932,256200000 +2014-05-21,0.43397656083106995,0.43944885344161844,0.4313593687764288,0.4356420337917693,216712000 +2014-05-22,0.43588003516197205,0.43825929070449454,0.43302493418353777,0.43302493418353777,130364000 +2014-05-23,0.43992477655410767,0.44206612362169334,0.4356421107819005,0.4382593032990727,182656000 +2014-05-27,0.44777625799179077,0.44777625799179077,0.4411143376166698,0.4425419021123957,209680000 +2014-05-28,0.45158305764198303,0.45443815814341665,0.44515907442301766,0.44944173935664744,224676000 +2014-05-29,0.4508693218231201,0.4551519871974626,0.44991763101236026,0.45134516722850004,171884000 +2014-05-30,0.45205894112586975,0.45324856879871567,0.44849005810733195,0.4508693134530238,239128000 +2014-06-02,0.45063140988349915,0.4563416114306648,0.4468245899434145,0.45348651065708195,181500000 +2014-06-03,0.4487280547618866,0.45205900134438426,0.442779887242344,0.45158315588445097,243212000 +2014-06-04,0.44920387864112854,0.4525348250636006,0.4473004685298745,0.44753840542989254,161236000 +2014-06-05,0.4511072635650635,0.4525347997965758,0.447300443555107,0.4499176358573223,188696000 +2014-06-06,0.45277267694473267,0.4568174049448011,0.45158304939395033,0.453248522292454,161052000 +2014-06-09,0.4532485604286194,0.4575312256443694,0.449203832088229,0.45229686965310184,247456000 +2014-06-10,0.45562782883644104,0.4577691756873918,0.4496796904109577,0.4515831003797046,217608000 +2014-06-11,0.46157601475715637,0.46276564249156293,0.4539623745665842,0.4539623745665842,266228000 +2014-06-12,0.46443113684654236,0.46657245552103177,0.457531278654256,0.4615760358262352,337148000 +2014-06-13,0.4649069309234619,0.46942753303886586,0.46038632880805797,0.4691895961622275,227852000 +2014-06-16,0.46347928047180176,0.4665723174799234,0.4594345528594683,0.46276552670012056,198620000 +2014-06-17,0.4665723443031311,0.4684757539839371,0.4615759257993421,0.4639551808096103,157608000 +2014-06-18,0.46609652042388916,0.4682378670494516,0.4611000733272017,0.46538273821536835,215536000 +2014-06-19,0.45538997650146484,0.45991055091737876,0.4520590015544545,0.457531295253642,474592000 +2014-06-20,0.450393408536911,0.458244955812703,0.44682452599000166,0.45657948296340345,353148000 +2014-06-23,0.445158988237381,0.44539689668804733,0.43921082316347243,0.4444452061594757,414200000 +2014-06-24,0.4382592439651489,0.4480142019943324,0.4363558340615326,0.4444453190611619,275780000 +2014-06-25,0.44277989864349365,0.4430178355610693,0.4354042229171996,0.4394489519752274,215420000 +2014-06-26,0.43683168292045593,0.4430177580656616,0.43540414675361194,0.4427798211897074,256908000 +2014-06-27,0.4373075067996979,0.4399246703219182,0.43373859588220237,0.43635578776738,302820000 +2014-06-30,0.4411144256591797,0.4423040535220704,0.4356421318172892,0.4356421318172892,180512000 +2014-07-01,0.4461108446121216,0.44872803708309067,0.43921098644455014,0.44063855113107214,321180000 +2014-07-02,0.4444454312324524,0.44634884161646066,0.4418282384090701,0.4444454312324524,179284000 +2014-07-03,0.44849008321762085,0.44967971095707227,0.4404005975715737,0.4404005975715737,136892000 +2014-07-07,0.4449211657047272,0.4494417677839719,0.44420738344348215,0.44920383090923677,127496000 +2014-07-08,0.44135230779647827,0.4456349732439153,0.43706964234904117,0.4437315632269475,221940000 +2014-07-09,0.45467624068260193,0.4565796510810684,0.44182824176517893,0.4451592170532372,387668000 +2014-07-10,0.4522968530654907,0.45420026290968035,0.44254189534086846,0.4461107781626143,266308000 +2014-07-11,0.4532485604286194,0.4546761249548562,0.45110724200222463,0.4527727150408606,191188000 +2014-07-14,0.45895880460739136,0.4601484322956889,0.4534865115686304,0.4551519846596547,272636000 +2014-07-15,0.4608621895313263,0.46205181715496224,0.45657952441364497,0.45967256190769035,395440000 +2014-07-16,0.46038633584976196,0.4663345025900531,0.4577691719815134,0.46276561956365503,319728000 +2014-07-17,0.4591968357563019,0.46395537614322696,0.4551521062085329,0.4551521062085329,324832000 +2014-07-18,0.43873515725135803,0.453248628104286,0.438021374881663,0.44967974461877563,567816000 +2014-07-21,0.44135230779647827,0.4444453455286807,0.43706964234904117,0.43706964234904117,243364000 +2014-07-22,0.4394489824771881,0.4470625956495154,0.43849729146676003,0.44468333976047764,298816000 +2014-07-23,0.4301697611808777,0.4399247192602988,0.4296939157932631,0.4396868107479718,297352000 +2014-07-24,0.4308834969997406,0.43373859738064324,0.42779045976919716,0.43254896985835406,254576000 +2014-07-25,0.4232698380947113,0.43040760241166887,0.42255605599042473,0.42945588348496866,266132000 +2014-07-28,0.4216044545173645,0.42517333767008875,0.41446668821191607,0.42517333767008875,330352000 +2014-07-29,0.4230319857597351,0.4287422153715138,0.42160442126605047,0.42184235813598453,217972000 +2014-07-30,0.4301697611808777,0.4313593888313944,0.4244595598035817,0.4256491874540984,246184000 +2014-07-31,0.4163701832294464,0.42826646283367203,0.41565640078059934,0.424935515889676,401880000 +2014-08-01,0.4208906590938568,0.42326991429450495,0.41494249272927725,0.4163700571948498,219884000 +2014-08-04,0.41993895173072815,0.4239836800122652,0.41779763333549086,0.4204147971115631,241724000 +2014-08-05,0.4201769232749939,0.426362998825194,0.4151804754565275,0.4187493586517285,298136000 +2014-08-06,0.4197010397911072,0.4249353956634255,0.41422874704883633,0.4173217561804609,223456000 +2014-08-07,0.4154183268547058,0.4270766648812176,0.4125631981957623,0.4232698739408872,407696000 +2014-08-08,0.45205894112586975,0.4544381964715616,0.43350074375688097,0.43350074375688097,894348000 +2014-08-11,0.4496796727180481,0.4544381832712084,0.44849004507975804,0.4525347733773522,344624000 +2014-08-12,0.4496796727180481,0.4520589279946282,0.44468322529204574,0.4494417642081662,296152000 +2014-08-13,0.4522968530654907,0.45610367275387,0.44753834263649633,0.4503934432213011,256596000 +2014-08-14,0.447300523519516,0.45396244554641807,0.44539711317426295,0.45396244554641807,255992000 +2014-08-15,0.4530107080936432,0.45562787223234874,0.44444537659996464,0.4487280423468039,369796000 +2014-08-18,0.4591968357563019,0.45967270964907264,0.4503935941845768,0.45491416926214756,284076000 +2014-08-19,0.46290087699890137,0.46529065720995844,0.45764333774383403,0.4593162066823158,248260000 +2014-08-20,0.4600330889225006,0.4633787980998913,0.4588381988923808,0.46122797895262035,221468000 +2014-08-21,0.45573151111602783,0.46122801133820623,0.45501459983835774,0.45883823111016586,272796000 +2014-08-22,0.45597052574157715,0.45979418571319575,0.45238585520134555,0.45525358593584503,251224000 +2014-08-25,0.4566875398159027,0.46098915086141384,0.45573161042332594,0.4578824301902984,153380000 +2014-08-26,0.4648128151893616,0.46576871610118475,0.45620959302921726,0.4578824338691248,269636000 +2014-08-27,0.45955514907836914,0.4655295993650864,0.45883820934627784,0.461944929193056,182972000 +2014-08-28,0.4633788466453552,0.4643347473742249,0.4571654064424167,0.4585992860241498,179704000 +2014-08-29,0.4648128151893616,0.46576871610118475,0.4600332251649439,0.4650517761731004,207932000 +2014-09-02,0.46600762009620667,0.46600762009620667,0.46170600980515464,0.46600762009620667,192636000 +2014-09-03,0.47030919790267944,0.471982038320203,0.465290648161682,0.46839736807332677,259456000 +2014-09-04,0.47867342829704285,0.48154118728419676,0.46935326856564596,0.4695922579773844,491832000 +2014-09-05,0.47723960876464844,0.48034632906544755,0.47413288846384927,0.4781955095548496,253792000 +2014-09-08,0.47293803095817566,0.4777175922167773,0.47102620075704854,0.47676169136042984,319288000 +2014-09-09,0.4669634997844696,0.4738938795211213,0.4664855494377692,0.47078715953492756,198588000 +2014-09-10,0.46863627433776855,0.4703091430486054,0.464334664845546,0.4695922033851644,172376000 +2014-09-11,0.46385684609413147,0.46696356652434723,0.45883829551544203,0.46529072582759456,250720000 +2014-09-12,0.4569264352321625,0.4667245462916241,0.4564484848486733,0.4667245462916241,262536000 +2014-09-15,0.45071303844451904,0.45907727014668986,0.4488012083577653,0.45836033030310336,294152000 +2014-09-16,0.4574044346809387,0.45979421519432123,0.4480842735856883,0.44951815328909017,219936000 +2014-09-17,0.4576433598995209,0.46194497018536096,0.4540586894093922,0.4562095087965266,173584000 +2014-09-18,0.46457380056381226,0.4650517509938462,0.45907729939734077,0.46051117917587503,219604000 +2014-09-19,0.45597052574157715,0.4664855764193138,0.45525358593584503,0.46600762604496876,601316000 +2014-09-22,0.45142990350723267,0.4652906337295826,0.4509519246984001,0.4652906337295826,221464000 +2014-09-23,0.4495181441307068,0.45453666601350534,0.4473673246194243,0.44904016524702384,196144000 +2014-09-24,0.4521467387676239,0.4535806179763295,0.4488010585985389,0.44927900883863375,159592000 +2014-09-25,0.44234880805015564,0.45286385999137074,0.4413929071866054,0.4516689696677167,298440000 +2014-09-26,0.4433046877384186,0.446650368874458,0.4418708081152992,0.4437826381166486,241188000 +2014-09-29,0.4425877332687378,0.44569445335698504,0.43541839236744195,0.4397200026059051,208540000 +2014-09-30,0.4409148395061493,0.4440215592191931,0.4356573006894175,0.44067585010959787,277204000 +2014-10-01,0.43661338090896606,0.44473862436609596,0.43541849048948017,0.44163193206618057,350976000 +2014-10-02,0.43470144271850586,0.43804712366784315,0.4246643428936387,0.435896332841616,288996000 +2014-10-03,0.435657262802124,0.443304580965615,0.435657262802124,0.4373301314556517,239140000 +2014-10-06,0.43302854895591736,0.44091482849565455,0.4301607902226135,0.43733015856744895,199032000 +2014-10-07,0.4284880757331848,0.43541845672179696,0.4280101253001436,0.43111684584756055,301896000 +2014-10-08,0.4363742470741272,0.43852506621075704,0.4246643077438325,0.42801001690467044,260172000 +2014-10-09,0.4280100464820862,0.43494042619446877,0.424425376161745,0.4344624473610148,306956000 +2014-10-10,0.4026782810688019,0.42609815813353974,0.4024393201732985,0.42466427880682567,691376000 +2014-10-13,0.40124452114105225,0.41343241271427933,0.40076657075333216,0.405307142169318,397628000 +2014-10-14,0.4105646014213562,0.42179656152904355,0.40435116213365296,0.40674094209224276,376620000 +2014-10-15,0.4167781174182892,0.4189289370169562,0.4019614836328972,0.40459022515780385,404428000 +2014-10-16,0.41701704263687134,0.4217966030242512,0.40841382254421676,0.409369751714749,351116000 +2014-10-17,0.4163000285625458,0.42681507663067486,0.4146271884232863,0.42203551709654946,290716000 +2014-10-20,0.4198847711086273,0.42370843079511555,0.413432370315052,0.4163001008357047,200336000 +2014-10-21,0.43780818581581116,0.43828613619256535,0.4217966345313271,0.4229915247174271,351092000 +2014-10-22,0.4275321662425995,0.43852516842295197,0.4275321662425995,0.43709128866432095,239512000 +2014-10-23,0.43709126114845276,0.4401979814376237,0.43183374984516437,0.4349404701343353,214476000 +2014-10-24,0.44163182377815247,0.4442605649633937,0.4370912242043994,0.4397199938780684,210156000 +2014-10-27,0.4418708384037018,0.44354367908638775,0.43661332690593246,0.44139288799271026,145092000 +2014-10-28,0.4523857831954956,0.45286373349376574,0.44019789390327235,0.44067584420154243,192580000 +2014-10-29,0.4495181441307068,0.45310281482774734,0.4454554945499833,0.4504740449212121,168340000 +2014-10-30,0.4466502070426941,0.4502348763132541,0.4409147476051657,0.44832307549302397,170260000 +2014-10-31,0.4669634997844696,0.4672024892020335,0.45453661983969484,0.4569264000616242,256316000 +2014-11-03,0.4748498797416687,0.47939048020808755,0.4724600990188482,0.47771761091136655,308732000 +2014-11-04,0.4810633063316345,0.4827361470888577,0.470070303946855,0.47795658578911576,360196000 +2014-11-05,0.4810633063316345,0.48417002687415334,0.47747863535682805,0.48393106590222573,335652000 +2014-11-06,0.48321402072906494,0.48393096046550915,0.47461077238016125,0.4820191021760405,394088000 +2014-11-07,0.47293803095817566,0.4944460851103153,0.468158469699574,0.4887106229953662,450800000 +2014-11-10,0.4784345030784607,0.4815412232207754,0.4712651335639651,0.4724600237349762,293388000 +2014-11-11,0.47269901633262634,0.47819548836537235,0.46863636693321714,0.47556674706458707,212992000 +2014-11-12,0.46959230303764343,0.47222104437687606,0.4631398731858236,0.47102615418038046,204584000 +2014-11-13,0.4672025144100189,0.47198207511175966,0.4633788544532548,0.47126513530881275,225328000 +2014-11-14,0.47293803095817566,0.47293803095817566,0.4631399189826694,0.4676805192714003,160248000 +2014-11-17,0.47078704833984375,0.47580559701593655,0.46768032908742535,0.47078704833984375,158732000 +2014-11-18,0.4820191264152527,0.48321404502836585,0.4698312357480904,0.4710261258727758,207772000 +2014-11-19,0.48021915555000305,0.4838190246010575,0.47517939609650417,0.48237907698063576,240300000 +2014-11-20,0.4881388545036316,0.4886188561599528,0.4754194113999363,0.47685935915091743,220968000 +2014-11-21,0.4907788932323456,0.4931787876425137,0.48669907845685945,0.4924588135976637,198976000 +2014-11-24,0.4938987195491791,0.49605858428145894,0.49005887737691645,0.49197876985405214,136004000 +2014-11-25,0.49365851283073425,0.4972583814553401,0.4919785932119084,0.4929385391058131,190240000 +2014-11-26,0.5020584464073181,0.5025384482292955,0.4905389176418835,0.49077894716187337,219264000 +2014-11-28,0.503258228302002,0.5061381240148327,0.4991784141874828,0.5037382299934694,124832000 +2014-12-01,0.4938987195491791,0.5039782408811283,0.49317874556575536,0.5010984021654248,190060000 +2014-12-02,0.49461859464645386,0.4967784589469249,0.488858803930585,0.49341861917465457,245952000 +2014-12-03,0.5073381066322327,0.5075780788722829,0.49557860859995695,0.4970185564762336,284424000 +2014-12-04,0.5027782320976257,0.5085379657126811,0.4994183922570085,0.5066180735803228,185332000 +2014-12-05,0.5056581497192383,0.508298015821651,0.5027782541762545,0.5030182263988421,165680000 +2014-12-08,0.4991784393787384,0.5099779916288711,0.4950986250583297,0.5049382310950704,226944000 +2014-12-09,0.49749860167503357,0.49869857755419533,0.48861899759763333,0.4960586535072391,239448000 +2014-12-10,0.4864589273929596,0.49797845201373553,0.48597898296166586,0.4960585026346153,204364000 +2014-12-11,0.4862189292907715,0.49269863651210805,0.4852589832613103,0.48933879680000447,135652000 +2014-12-12,0.4710995554924011,0.4840589688931506,0.47061955390727284,0.4797391548899051,323964000 +2014-12-15,0.46965962648391724,0.4852589633913335,0.46821967888969784,0.4766193064350052,254696000 +2014-12-16,0.46437975764274597,0.4766192242563175,0.46413978549107754,0.46917957259289716,185308000 +2014-12-17,0.48333898186683655,0.48405895561579365,0.4583800730932364,0.4737394081713718,345596000 +2014-12-18,0.4852590560913086,0.4950986045015152,0.48069924024453553,0.4893388702423208,226156000 +2014-12-19,0.4900588393211365,0.49197873164918193,0.4840590756645176,0.48861889146610904,325528000 +2014-12-22,0.49869829416275024,0.49869829416275024,0.4878987462592671,0.4895786657610593,148976000 +2014-12-23,0.4955785572528839,0.5049381602609426,0.495098555604529,0.5025382664551313,109280000 +2014-12-24,0.49365851283073425,0.49749835362432365,0.49317856849276726,0.4967783798994025,45644000 +2014-12-26,0.4941387176513672,0.49677858425001076,0.4924587973415036,0.4936587158979801,52636000 +2014-12-29,0.49341854453086853,0.4967783837948663,0.49029867743773603,0.4926985708003017,82944000 +2014-12-30,0.4888589382171631,0.4924588084034436,0.488138964179907,0.4900589140185884,112120000 +2014-12-31,0.48117923736572266,0.49221876130138503,0.4797392609011234,0.48957883782677875,166300000 +2015-01-02,0.4830991327762604,0.48669900243823877,0.4754194489760312,0.4830991327762604,113680000 +2015-01-05,0.4749394953250885,0.4845391004681867,0.4727796020485131,0.4830991525444733,197952000 +2015-01-06,0.46054011583328247,0.4761394272036022,0.4600601427436868,0.4756594541140065,197764000 +2015-01-07,0.4593402147293091,0.467979845641791,0.4579002667075632,0.4639000024498432,321808000 +2015-01-08,0.47661933302879333,0.4794992283779208,0.46437986362197087,0.4646198644373948,283780000 +2015-01-09,0.4785391390323639,0.4821390073559825,0.4718194325099141,0.4782991668834446,209540000 +2015-01-12,0.47253966331481934,0.4799793475504186,0.46821984758476165,0.479739346661916,190732000 +2015-01-13,0.47181951999664307,0.48573890852935475,0.46845968041691427,0.4761393341770002,236720000 +2015-01-14,0.47373953461647034,0.4751794824987189,0.46557990624104584,0.46677985327325494,155260000 +2015-01-15,0.4703797698020935,0.4799793475991979,0.47013976891356646,0.4770994799818663,188932000 +2015-01-16,0.47901925444602966,0.47949922746697576,0.46821970412529795,0.4696596517971261,181512000 +2015-01-20,0.4804591238498688,0.48501888111055613,0.4744593619339541,0.4823790156208982,140308000 +2015-01-21,0.48717886209487915,0.4883788375126142,0.47445942020036896,0.47781928843025223,144780000 +2015-01-22,0.4955785572528839,0.4970185049799671,0.48309908657547235,0.4881388464022816,159712000 +2015-01-23,0.49701857566833496,0.4979785218835913,0.4919787579067569,0.49605857223508876,120416000 +2015-01-26,0.49485862255096436,0.4972585165466961,0.4917387546347145,0.49485862255096436,133240000 +2015-01-27,0.4710995554924011,0.48765883773667773,0.47013958093113156,0.4871788361515494,357948000 +2015-01-28,0.46341997385025024,0.4787793126776826,0.46317997300568364,0.4768593917481294,272728000 +2015-01-29,0.4746995270252228,0.4773393934286602,0.46150008057205555,0.4636600024755898,235340000 +2015-01-30,0.4607800841331482,0.4768593970645526,0.46006013880940827,0.47133963505892074,298200000 +2015-02-02,0.4708596169948578,0.4727795377624166,0.454540333384094,0.4636599355732553,259604000 +2015-02-03,0.48261916637420654,0.48309916810356685,0.47181964242552166,0.47421953663634053,183468000 +2015-02-04,0.4838191866874695,0.48933894960296836,0.4797393432657975,0.48117931997762103,181516000 +2015-02-05,0.4917387366294861,0.4919787088548767,0.48381908101175447,0.4842990254625357,140448000 +2015-02-06,0.48957884311676025,0.49701855471178213,0.4874189213100132,0.49125876322712325,210524000 +2015-02-09,0.48909878730773926,0.490538677633163,0.48357902653669615,0.48669889380806725,273944000 +2015-02-10,0.5027782320976257,0.5030182043096753,0.48741886616683694,0.48957878772922553,226204000 +2015-02-11,0.4994182884693146,0.5039780456405646,0.4960583921089606,0.5039780456405646,320832000 +2015-02-12,0.535176694393158,0.539976480755772,0.5248571479917413,0.527977014849237,676904000 +2015-02-13,0.5354169607162476,0.5361369347880066,0.5258173827167915,0.5339770125727294,310084000 +2015-02-17,0.5370967984199524,0.5397367220157968,0.5310970917033747,0.5344569320420973,203340000 +2015-02-18,0.5308569669723511,0.5373367314573279,0.5298970209361253,0.536376728203123,170948000 +2015-02-19,0.5322970151901245,0.5385367514312882,0.5298971210372146,0.5375768052137222,169432000 +2015-02-20,0.5361366271972656,0.5363765993441765,0.527977002022644,0.531816842463044,157752000 +2015-02-23,0.5318170189857483,0.5358968329272463,0.5291770956216144,0.5358968329272463,125008000 +2015-02-24,0.537478506565094,0.537478506565094,0.529046562966985,0.5338648328625638,149356000 +2015-02-25,0.5333829522132874,0.5377194293328247,0.5309738174040904,0.5353102370853231,123820000 +2015-02-26,0.534828245639801,0.5379601254705835,0.530491770133356,0.533864603562241,152864000 +2015-02-27,0.5314556956291199,0.5345875767916074,0.5295283532161926,0.5333829806037395,157492000 +2015-03-02,0.5444650053977966,0.5473559902587107,0.5292874497546115,0.53001019596984,301512000 +2015-03-03,0.5343464612960815,0.543019355932416,0.5326600730943346,0.5403693255351408,160344000 +2015-03-04,0.5403693914413452,0.5415739299730946,0.5302510035584832,0.5324192418415887,226840000 +2015-03-05,0.5507286787033081,0.551692321021897,0.5389239023452757,0.5403693945423078,323056000 +2015-03-06,0.5432603359222412,0.5502467852575625,0.5427784860819498,0.5475967547316921,257392000 +2015-03-09,0.5447058081626892,0.5488013884921152,0.5422966736715371,0.5435012696362617,222388000 +2015-03-10,0.5541015863418579,0.557715317687516,0.5461514348197212,0.547115077365793,527212000 +2015-03-11,0.5512105822563171,0.5613289137442274,0.549765089918529,0.5541015094935902,262120000 +2015-03-12,0.5461512804031372,0.5500059069358941,0.5357919967256071,0.545910384194307,406972000 +2015-03-13,0.5468741059303284,0.5483195982699334,0.5360329708215944,0.5435013287634523,359288000 +2015-03-16,0.5533786416053772,0.5567514754644398,0.5475967309642977,0.551210461013904,236956000 +2015-03-17,0.5601244568824768,0.5603653531611849,0.5483196776511092,0.5521743053019957,299900000 +2015-03-18,0.5509697198867798,0.5630153956341737,0.5459105533043681,0.5601244679177868,413844000 +2015-03-19,0.5594015717506409,0.5613288563785284,0.5488013914206653,0.5528969143336492,310756000 +2015-03-20,0.5654245615005493,0.5687973968437002,0.558679005690879,0.5639791262829884,462084000 +2015-03-23,0.5471148490905762,0.5557877432632135,0.5468739529141462,0.5485603410257303,426012000 +2015-03-24,0.5396468043327332,0.5492833451789457,0.53723766912118,0.5454287173527979,330480000 +2015-03-25,0.5068824291229248,0.539405775187557,0.5051959831957261,0.539405775187557,542552000 +2015-03-26,0.5051958560943604,0.5073640939367126,0.49290928986426896,0.4965230196015226,311920000 +2015-03-27,0.5150735378265381,0.517000822779586,0.49989598214678727,0.5080870293547018,318288000 +2015-03-30,0.5172416567802429,0.5198916873370053,0.5107369423328002,0.5174825529840503,253252000 +2015-03-31,0.5042322874069214,0.5162779592214637,0.5037504949973161,0.5157961668118584,357276000 +2015-04-01,0.506159782409668,0.5078461712297943,0.4974868845930819,0.506159782409668,330768000 +2015-04-02,0.5073642134666443,0.5104960941640087,0.5030277941986084,0.5090506019285637,192204000 +2015-04-06,0.522059977054596,0.5237463655244144,0.4998959158427541,0.5051959774798124,515864000 +2015-04-07,0.5266373157501221,0.5324192269045614,0.5191689587972713,0.5220599430936388,413964000 +2015-04-08,0.5304919481277466,0.5324192903678253,0.5220600053220975,0.527119171005487,366432000 +2015-04-09,0.542778491973877,0.5444648802757635,0.5261554477203325,0.5263963439239467,379432000 +2015-04-10,0.5483196973800659,0.5485605936674416,0.5413331881013487,0.543260530715295,258728000 +2015-04-13,0.5432603359222412,0.5502467852575625,0.540851144159077,0.5471149048914007,236724000 +2015-04-14,0.5386829972267151,0.5432603699622709,0.5333828784045823,0.5410921317025398,220276000 +2015-04-15,0.545187771320343,0.5492832950624774,0.5374785163714377,0.5401286050691727,243560000 +2015-04-16,0.5418149828910828,0.5466332527773862,0.5379603554943785,0.5420558791539056,155284000 +2015-04-17,0.534828245639801,0.540128363223806,0.5302508739735369,0.530491770133356,293636000 +2015-04-20,0.5321782231330872,0.540610163229471,0.5312145236035427,0.5372373871909175,231624000 +2015-04-21,0.5314556956291199,0.5386831004414049,0.5288056069911333,0.5386831004414049,230456000 +2015-04-22,0.537478506565094,0.5382012527932616,0.5263964743176012,0.5345875790907315,207420000 +2015-04-23,0.5353102087974548,0.5403694318362326,0.5215781468545181,0.5276010122783912,259380000 +2015-04-24,0.5307328104972839,0.5353101254735784,0.5247099460109018,0.5350692292743767,240960000 +2015-04-27,0.534828245639801,0.5442238851321485,0.5278417400604952,0.5324191117267594,248456000 +2015-04-28,0.537478506565094,0.5394058489863103,0.5288056092653906,0.5338648328625638,234484000 +2015-04-29,0.5333829522132874,0.5389239680182708,0.5312147136535187,0.5336238484627157,195156000 +2015-04-30,0.534828245639801,0.5374782757126619,0.5295281280557961,0.5307327237314585,218844000 +2015-05-01,0.5480786561965942,0.5497650446390191,0.5367556721087016,0.5391648066604939,256968000 +2015-05-04,0.5447058081626892,0.5512105229832674,0.5430194197627124,0.5475967925273907,200720000 +2015-05-05,0.5307328104972839,0.5435012280676531,0.5283236761903896,0.5427784820317556,292928000 +2015-05-06,0.5324192643165588,0.5386830257732995,0.5254327567349404,0.5336238028991553,316484000 +2015-05-07,0.5418149828910828,0.5435013716074583,0.5285647119845944,0.5302511007009699,534564000 +2015-05-08,0.5018234252929688,0.526155735765901,0.49363237550293515,0.5061599039618042,1146552000 +2015-05-11,0.49700507521629333,0.5020642995284391,0.49098226571482684,0.49483683622537367,544144000 +2015-05-12,0.5018234252929688,0.5059189501879856,0.49315052539362286,0.4933914791674416,388800000 +2015-05-13,0.5047141313552856,0.5092915038227956,0.4998958626857888,0.5054368773995395,308524000 +2015-05-14,0.5129052400588989,0.5155553283617783,0.5049550900268617,0.5061596860624069,293052000 +2015-05-15,0.5131461024284363,0.5174825210205891,0.510014222219213,0.5150733868164398,215824000 +2015-05-18,0.5124233365058899,0.5155552165933796,0.5095323525979647,0.5119414867084731,324972000 +2015-05-19,0.5092286467552185,0.5147953099382049,0.5082604862592649,0.513101057922369,253808000 +2015-05-20,0.5092286467552185,0.5155214014580871,0.5087445665072416,0.5094706580271239,196824000 +2015-05-21,0.5055983066558838,0.5116490514930284,0.5051142262954077,0.5094707764271549,239692000 +2015-05-22,0.50487220287323,0.5087446725517374,0.5036620885572964,0.5068084665645727,212592000 +2015-05-26,0.5017254948616028,0.5058399731562091,0.4978530277301674,0.5024515860552556,259732000 +2015-05-27,0.5285909175872803,0.531011203346395,0.5034198995291568,0.5051140937901206,432332000 +2015-05-28,0.5358518958091736,0.5375460904525259,0.5276229339116973,0.5285910368930162,327656000 +2015-05-29,0.535609781742096,0.5392401816516544,0.534883690219351,0.5358517930149556,335168000 +2015-06-01,0.5416605472564697,0.5469851999726403,0.5356098606148063,0.5389982497504718,372660000 +2015-06-02,0.5310112237930298,0.5411764474543898,0.5305271435409016,0.5382720813499536,224304000 +2015-06-03,0.5252025723457336,0.5365779105805637,0.5242344117989732,0.5324634302214232,250788000 +2015-06-04,0.5346415042877197,0.5363356980526034,0.5220559989438445,0.5220559989438445,323712000 +2015-06-05,0.5387561917304993,0.5411764777181549,0.5273807956547653,0.5329474591967901,313320000 +2015-06-08,0.5264125466346741,0.5406922473081329,0.5203618621976777,0.5370618481867658,342812000 +2015-06-09,0.529075026512146,0.5329474377733963,0.5259286490842546,0.5268967518995672,256888000 +2015-06-10,0.5196358561515808,0.5261706218063076,0.5167314902142964,0.5227822333489179,529460000 +2015-06-11,0.5252025723457336,0.528832972431494,0.5196359088706214,0.5196359088706214,283052000 +2015-06-12,0.5109230279922485,0.5249606678693693,0.5097128557816382,0.5218142893668068,323728000 +2015-06-15,0.5099546909332275,0.5123749765400913,0.5043880282670248,0.5082604390746783,306548000 +2015-06-16,0.5162473917007446,0.5169734831593422,0.5039039523129076,0.5089865348189297,256892000 +2015-06-17,0.5222980976104736,0.525202463239058,0.5147952300088401,0.5160053438846456,233544000 +2015-06-18,0.5310112237930298,0.5343996124454277,0.525202549288324,0.526654732340542,299404000 +2015-06-19,0.5293169617652893,0.5353676467700716,0.5244763906797999,0.5310111558747947,355656000 +2015-06-22,0.5271388292312622,0.533189573567456,0.5191518790218241,0.5302852070534151,514236000 +2015-06-23,0.5135852098464966,0.532221407579906,0.5094707291290561,0.5281069268624655,414064000 +2015-06-24,0.5085026621818542,0.5155215098807848,0.5060823758412759,0.512859154513224,253368000 +2015-06-25,0.5123750567436218,0.5155214342954723,0.508502587625639,0.508502587625639,350460000 +2015-06-26,0.5019676685333252,0.5087445026333252,0.49978945195132407,0.5082604224461257,421296000 +2015-06-29,0.4869619607925415,0.5012416635354886,0.48623586932220847,0.4961590232431571,391724000 +2015-06-30,0.48671993613243103,0.4920445881647829,0.4833315474319195,0.48986631355552523,315916000 +2015-07-01,0.49373891949653625,0.5058403522872977,0.4893824267735354,0.49882156166158437,302892000 +2015-07-02,0.494223028421402,0.4973694068990591,0.4910766499437448,0.4934969366416206,145764000 +2015-07-06,0.48817211389541626,0.4968851545335079,0.48454171395697526,0.4901083772061959,214776000 +2015-07-07,0.4789750874042511,0.4872040777668412,0.4637272786269431,0.48526787189525505,594252000 +2015-07-08,0.4755866527557373,0.47921708169560284,0.47171418367904694,0.47631274431412735,332492000 +2015-07-09,0.4697779715061188,0.4852678485503298,0.4668736339863721,0.4830895737714554,357588000 +2015-07-10,0.4780069887638092,0.4823635097182001,0.4746185707539108,0.47582871386057,216708000 +2015-07-13,0.4811533987522125,0.4838156964534498,0.47800702069430534,0.48284759344428885,212472000 +2015-07-14,0.4813953638076782,0.48236349557587366,0.47510263714879786,0.4818794441178193,249216000 +2015-07-15,0.4780069887638092,0.4833316126626925,0.4736504678094184,0.4801852348149609,265732000 +2015-07-16,0.48865607380867004,0.48865607380867004,0.479216943966615,0.4809111378812168,282848000 +2015-07-17,0.48575180768966675,0.48744600195053456,0.47945905317549264,0.4869619794212376,220372000 +2015-07-20,0.4767967760562897,0.48768809127844054,0.4755866331262822,0.48575182796792854,188412000 +2015-07-21,0.4789750874042511,0.4857518945110644,0.47582870958479273,0.47582870958479273,149720000 +2015-07-22,0.4697779715061188,0.4755866753976979,0.4639692964666255,0.4755866753976979,356472000 +2015-07-23,0.4755866527557373,0.48260547049864355,0.46977794914070176,0.4707460808359166,169916000 +2015-07-24,0.470020055770874,0.479459160809033,0.4680838209586113,0.47897510931898946,188844000 +2015-07-27,0.4673577547073364,0.47268237909148764,0.46203313032318516,0.4659055713061633,192420000 +2015-07-28,0.4775228500366211,0.48066919845735145,0.46372719805983387,0.4685677696019817,198308000 +2015-07-29,0.483331561088562,0.4872040301574929,0.4746185201095096,0.47655475464397506,232680000 +2015-07-30,0.4845416843891144,0.4893822558144305,0.4821213698243748,0.4821213698243748,190180000 +2015-07-31,0.4828476309776306,0.48672007216738145,0.4799432928722946,0.4864780608223236,218340000 +2015-08-03,0.4910765588283539,0.4915605814556105,0.480427282022334,0.48672000895798906,397132000 +2015-08-04,0.4930127263069153,0.4944649094838143,0.4874460625982502,0.48938232606883925,260100000 +2015-08-05,0.4980953633785248,0.505598232792639,0.49712720279901185,0.5051141525028826,234628000 +2015-08-06,0.4949491322040558,0.5005157975145844,0.48672011106836915,0.49688533852763617,655676000 +2015-08-07,0.5561824440956116,0.5656215219425765,0.5295592323814611,0.5435969300274086,1405248000 +2015-08-10,0.5755444765090942,0.5796589563077847,0.5489212768871845,0.5523097229309542,662304000 +2015-08-11,0.5726402401924133,0.5782069041683346,0.567073576216492,0.567073576216492,435008000 +2015-08-12,0.5740925073623657,0.5782069886931414,0.5634432581707005,0.5634432581707005,384048000 +2015-08-13,0.5692515969276428,0.576028429818092,0.5677994143293931,0.5748182584181677,276884000 +2015-08-14,0.5697358250617981,0.5731242135353469,0.5653792761350953,0.5687676646086441,214652000 +2015-08-17,0.5661054849624634,0.5687677825000564,0.5590866375951632,0.5687677825000564,273880000 +2015-08-18,0.5609528422355652,0.5682442497651768,0.5565779629496246,0.5643554874933261,287084000 +2015-08-19,0.5587656497955322,0.5665431777800819,0.5526894451925438,0.560223943536008,249248000 +2015-08-20,0.538592517375946,0.5551196850500275,0.5359189606457007,0.5524461862667397,426932000 +2015-08-21,0.5218222737312317,0.5436964974016075,0.5213361566931065,0.5347037667984822,382664000 +2015-08-24,0.5033506155014038,0.5305718904776967,0.4860942456740442,0.49265650593767824,682284000 +2015-08-25,0.49289965629577637,0.5274123424080781,0.49289965629577637,0.5254679322633675,622684000 +2015-08-26,0.5300857424736023,0.5305718594060123,0.5050519083668845,0.5089406699853259,614976000 +2015-08-27,0.5500158071517944,0.550258836731838,0.5325164025553866,0.5356760188838204,463764000 +2015-08-28,0.5524462461471558,0.5558488918668774,0.5461270138408363,0.5500157766406455,320944000 +2015-08-31,0.5463700890541077,0.553661556129771,0.5441827068783774,0.5497727930050734,219352000 +2015-09-01,0.5240094661712646,0.5395645104065553,0.5201207630593799,0.5305717830531805,353408000 +2015-09-02,0.5398078560829163,0.5400508856830409,0.5293568299669209,0.5383495625882244,344044000 +2015-09-03,0.5412660837173462,0.5505019027619488,0.5402939074881682,0.5478283456980034,262556000 +2015-09-04,0.5286273956298828,0.5405367087615344,0.5283843661619737,0.5320300399683717,287972000 +2015-09-08,0.5512308478355408,0.5534182872414185,0.5393215907242006,0.5415089721831285,238448000 +2015-09-09,0.5402938723564148,0.5575501876298946,0.5390786086887394,0.5529323363548265,289392000 +2015-09-10,0.5488004684448242,0.5556058172797966,0.5347037696281001,0.5371342389376704,357076000 +2015-09-11,0.5505018830299377,0.5541475582454218,0.5405369176838914,0.5427243575813595,301584000 +2015-09-14,0.5514740943908691,0.5548767402614923,0.5485575076749257,0.5531754173261807,192460000 +2015-09-15,0.5575502514839172,0.5604668382627946,0.5500158129011076,0.5517171358731301,327976000 +2015-09-16,0.5614387392997742,0.5645983541122626,0.5524460117361301,0.5565778023493212,173508000 +2015-09-17,0.5665428638458252,0.5762647394659095,0.5653276004198399,0.5711607142025006,268712000 +2015-09-18,0.5660569071769714,0.5709178463634909,0.5553628525560218,0.5587654983971923,326412000 +2015-09-21,0.5718900561332703,0.5731053199746169,0.5638695002106843,0.5667860870723408,281840000 +2015-09-22,0.5563348531723022,0.5633832301517142,0.5534182674023531,0.5594944684407646,228356000 +2015-09-23,0.5590085983276367,0.5624112445970544,0.554633775687953,0.5568211580343083,161632000 +2015-09-24,0.5697024464607239,0.5755355599079965,0.5468559937095743,0.5556056928539564,382440000 +2015-09-25,0.573834240436554,0.5850144084021203,0.5682441564537708,0.5767507682013018,369692000 +2015-09-28,0.5662999153137207,0.5774800866088594,0.5626542400353289,0.5738344113304676,395584000 +2015-09-29,0.5762647986412048,0.5772369747136539,0.5643554823995766,0.5723760364044532,380736000 +2015-09-30,0.5991111993789673,0.5998403459228104,0.5782091529806803,0.5816117982206442,556380000 +2015-10-01,0.5874449014663696,0.6008124513214168,0.5704315613740296,0.5991111289015726,489296000 +2015-10-02,0.6027569770812988,0.6027569770812988,0.5782091961318213,0.5842853984683225,386144000 +2015-10-05,0.6178256869316101,0.6253601217948874,0.6034859055928773,0.6066455203945282,482024000 +2015-10-06,0.6258466243743896,0.6285201239515565,0.6088333346209214,0.6112638045857025,453216000 +2015-10-07,0.6324087381362915,0.6387279701417811,0.6170967751795133,0.6273047697996859,310152000 +2015-10-08,0.6360543966293335,0.6377557192087507,0.619041054941253,0.6297351653646672,460068000 +2015-10-09,0.6336240172386169,0.638727985699542,0.6217146995494958,0.6326517831010442,423248000 +2015-10-12,0.6404292583465576,0.6440749912094303,0.6297352051937276,0.634353056224089,227588000 +2015-10-13,0.6416444778442383,0.645533182034722,0.6331378070469086,0.6353252466142711,298444000 +2015-10-14,0.6649770736694336,0.6754280978342061,0.6416445559514986,0.6423736446157505,612148000 +2015-10-15,0.6666783690452576,0.680289008650218,0.6593869611797744,0.6661922520087752,526048000 +2015-10-16,0.6771295070648193,0.6834487398708419,0.6671645407372574,0.6688659216786214,448396000 +2015-10-19,0.6759141683578491,0.6824764879695845,0.6681367009518403,0.6793168719166252,294712000 +2015-10-20,0.6749420166015625,0.678101632768868,0.6678936376170376,0.6729976641664348,264824000 +2015-10-21,0.666192352771759,0.6832056983114826,0.6649771469171888,0.6790738477438283,386280000 +2015-10-22,0.6902540922164917,0.6924415325207239,0.6729977732305892,0.6739699496057012,306884000 +2015-10-23,0.6948718428611755,0.699489752016215,0.6858791120492821,0.696330136062447,381776000 +2015-10-26,0.6917120814323425,0.6970591360634701,0.685392850853814,0.6953578136687814,247436000 +2015-10-27,0.6912261247634888,0.6956009461479301,0.6878234215234158,0.6883095385425567,208268000 +2015-10-28,0.6968163251876831,0.6968163251876831,0.685393065894122,0.6956010614119349,217036000 +2015-10-29,0.6727545857429504,0.6926844592336656,0.6715393799413153,0.6856361381008588,327168000 +2015-10-30,0.6895248293876648,0.6943858263389695,0.674942012374642,0.6800460388920747,301160000 +2015-11-02,0.6975456476211548,0.6982747945415024,0.6875807362880461,0.691712530205359,190088000 +2015-11-03,0.6926843523979187,0.6973022612152149,0.6849068858048976,0.6934134989452263,376768000 +2015-11-04,0.6812612414360046,0.6958440583798086,0.6781016253034841,0.6907400898335663,442264000 +2015-11-05,0.673483669757843,0.6866082504658871,0.671539317477297,0.6846638402383816,478800000 +2015-11-06,0.7668138146400452,0.7762926626174197,0.7247666885212841,0.7400786514282119,1172272000 +2015-11-09,0.7634112238883972,0.7655986638740969,0.7527171114785088,0.7592794314356079,492568000 +2015-11-10,0.7488284111022949,0.7575781131513861,0.7327873003367885,0.753446262726482,552260000 +2015-11-11,0.7415369749069214,0.7546614985207232,0.7388634179137668,0.7493144424813771,619896000 +2015-11-12,0.7388632297515869,0.7466407532923474,0.7357036144348372,0.7398354057074448,291080000 +2015-11-13,0.7242807745933533,0.7427523586731688,0.7206350405230713,0.7395927417945835,292940000 +2015-11-16,0.7388632297515869,0.7393493467029901,0.7279260908940767,0.7337592625231214,344280000 +2015-11-17,0.7388632297515869,0.7451824603850862,0.7357036144348372,0.7408076396102513,257048000 +2015-11-18,0.7570392489433289,0.7580151750065809,0.7338620810307431,0.7419130929670197,350216000 +2015-11-19,0.7592349052429199,0.7667979532501252,0.753623592796606,0.7597228682166434,254072000 +2015-11-20,0.7658220529556274,0.7702135450316877,0.7602107407475496,0.7648461852166136,239744000 +2015-11-23,0.7543553709983826,0.7721651728791573,0.7516717205484136,0.7721651728791573,242552000 +2015-11-24,0.7604547739028931,0.7670419540457092,0.7509399322890473,0.7543554985605815,195428000 +2015-11-25,0.7594788670539856,0.7680178411144105,0.7567952160827672,0.7589909622412198,138300000 +2015-11-27,0.7658220529556274,0.7682617513866613,0.7570391269705057,0.7609426560935596,86996000 +2015-11-30,0.7738731503486633,0.7772887750686135,0.7658221388070046,0.766554054235065,327244000 +2015-12-01,0.7990021109580994,0.7997340263861313,0.7799724261632778,0.7807043415913097,409496000 +2015-12-02,0.7929026484489441,0.8085167048480982,0.7911948655745829,0.8002217428392031,294240000 +2015-12-03,0.79119473695755,0.8075407059552199,0.7872912089505733,0.7992457452947579,246656000 +2015-12-04,0.8233990669250488,0.8248628977258637,0.7911950219751345,0.7911950219751345,458756000 +2015-12-07,0.8077848553657532,0.8231549595467265,0.8053451572126937,0.8231549595467265,333588000 +2015-12-08,0.8187635540962219,0.8221791202363877,0.7926587869292425,0.7977821361394913,314488000 +2015-12-09,0.7980261445045471,0.8233990562785941,0.7897311809631866,0.8185196591169701,372676000 +2015-12-10,0.8046132922172546,0.8090047259003138,0.7977821020617233,0.8004657527476485,236596000 +2015-12-11,0.7926586866378784,0.8021735266818997,0.7909509037838732,0.7965622152328865,227320000 +2015-12-14,0.7946103811264038,0.7990018723833361,0.7850955415700385,0.7933905612219146,275892000 +2015-12-15,0.8043690919876099,0.8099804025836747,0.7992457442043699,0.8036371768518639,307296000 +2015-12-16,0.8092488050460815,0.8119325143193941,0.7990021054581771,0.806077190935443,236356000 +2015-12-17,0.7970501184463501,0.8187634489543607,0.7965622137272657,0.8104684870600167,254160000 +2015-12-18,0.7841198444366455,0.7994899508425302,0.7831439766675578,0.7914389399553049,395896000 +2015-12-21,0.8026614785194397,0.8033933938094052,0.7855835908098969,0.7926587331682343,284216000 +2015-12-22,0.8033936023712158,0.8114446144838937,0.7985142046160784,0.8051013857688131,130012000 +2015-12-23,0.8065650463104248,0.809736659997838,0.803149480236902,0.8046133108875538,122524000 +2015-12-24,0.8092488050460815,0.8112005988964002,0.8029055768248046,0.8041254552521293,52448000 +2015-12-28,0.808516800403595,0.808516800403595,0.7894871760066801,0.8007098003648343,142024000 +2015-12-29,0.8216912746429443,0.824130973228371,0.8068090725549397,0.8090048187319245,203660000 +2015-12-30,0.8146161437034607,0.8280345152111994,0.8143721912913029,0.8209593717555916,180344000 +2015-12-31,0.8041254281997681,0.8170558366259806,0.8041254281997681,0.8133963178011295,148528000 +2016-01-04,0.7897310853004456,0.7948544342494419,0.7816800751423111,0.7877793499390171,358076000 +2016-01-05,0.8024174571037292,0.815835825375899,0.7929026173198447,0.8046132027847002,490272000 +2016-01-06,0.769237756729126,0.7929028281372629,0.7602108192518219,0.7892432510293012,449344000 +2016-01-07,0.7387415170669556,0.7550874929341714,0.728982663864775,0.7499640848238004,645304000 +2016-01-08,0.7228833436965942,0.7489881109027505,0.7214195130151839,0.7482561955620454,398472000 +2016-01-11,0.7241031527519226,0.7292265600585479,0.7111727455421023,0.723615247976909,409372000 +2016-01-12,0.736301600933075,0.7470363196842386,0.7311782520975155,0.737033516219154,469356000 +2016-01-13,0.7138564586639404,0.7467924160176329,0.7131245433301252,0.7419129610698657,481672000 +2016-01-14,0.6994622945785522,0.7075133059337633,0.6787248269867655,0.6992182839968462,600236000 +2016-01-15,0.6614027619361877,0.6794565739904933,0.64993618694919,0.6714055646307733,841452000 +2016-01-19,0.6667702794075012,0.6940949272555033,0.6640865702049452,0.6750652430933937,457140000 +2016-01-20,0.6704298257827759,0.6789688003984614,0.6453009231142234,0.6540838501521553,481180000 +2016-01-21,0.6782366037368774,0.6887273097146199,0.6638423697867453,0.6777486990946923,481456000 +2016-01-22,0.6940950751304626,0.6987305209524429,0.6897035817726869,0.6911674128919455,257996000 +2016-01-25,0.6933628916740417,0.7019018644591433,0.6918990611203679,0.6938508545809308,270728000 +2016-01-26,0.7001942992210388,0.7031219614817847,0.6877518509469008,0.6948269959656928,227944000 +2016-01-27,0.6918990612030029,0.7014139016360256,0.6787247025523521,0.6992181558052527,231700000 +2016-01-28,0.6843360066413879,0.6999500633196265,0.6709176376025784,0.6975103651459332,276776000 +2016-01-29,0.7145883440971375,0.7160521748226714,0.6875077083427602,0.6901913592282389,310504000 +2016-02-01,0.7148324251174927,0.718491944125014,0.7077572813580771,0.713856557259954,289884000 +2016-02-02,0.6845800876617432,0.7111728202026683,0.6797006903973718,0.7075133013378915,341908000 +2016-02-03,0.6879956126213074,0.6940948879174342,0.6721376015519777,0.689947406309548,326772000 +2016-02-04,0.6882394552230835,0.7038535100834256,0.6814082662318811,0.6889713122396902,348140000 +2016-02-05,0.6448127627372742,0.6911670824622009,0.6428610276226825,0.6836040361844231,600428000 +2016-02-08,0.615292489528656,0.6382256409212848,0.6062655538596067,0.6350540274520498,608852000 +2016-02-09,0.621879518032074,0.6477403242534228,0.6050455871237844,0.6079732475137406,425372000 +2016-02-10,0.620415985584259,0.643837105443126,0.61700041893478,0.625783346152731,335800000 +2016-02-11,0.617244303226471,0.6235875309707279,0.6045578477379568,0.6045578477379568,340144000 +2016-02-12,0.6277350187301636,0.6289548970776428,0.6038259382559799,0.6270031033550763,340816000 +2016-02-16,0.6584751009941101,0.6594510267450031,0.6348100357912502,0.6367617709590572,485352000 +2016-02-17,0.6748210787773132,0.6811643048394825,0.6640863616719567,0.6667700700317883,771468000 +2016-02-18,0.732886016368866,0.7558192256920223,0.7294704505655212,0.7302023658329511,1068660000 +2016-02-19,0.7426450252532959,0.7492322645779244,0.7233713866561089,0.7289826998953787,525628000 +2016-02-22,0.7689935564994812,0.7775325288675602,0.7519156699303137,0.7533795004124976,449668000 +2016-02-23,0.7709456086158752,0.7782647053163001,0.7592350189949896,0.7628945964287069,369380000 +2016-02-24,0.7763127088546753,0.7775325870701398,0.7465483667678772,0.7677737940144022,336852000 +2016-02-25,0.7780205011367798,0.7819240300392049,0.7641142266825743,0.7792403793668482,349616000 +2016-02-26,0.7728971838951111,0.7836318451921412,0.7650901257698176,0.7816801097443168,361964000 +2016-02-29,0.7678778171539307,0.7840385076962485,0.7673881346398822,0.7739993156110239,323344000 +2016-03-01,0.8019129037857056,0.8019129037857056,0.7686120557978298,0.7698363782936517,348700000 +2016-03-02,0.8065652847290039,0.8095036124065412,0.796036355056385,0.7975055188951538,233812000 +2016-03-03,0.7994644045829773,0.8090138525514992,0.7886905756058552,0.8055858425946495,302004000 +2016-03-04,0.7970157265663147,0.8063203322965142,0.7908942308757,0.805585750478484,175304000 +2016-03-07,0.7918736338615417,0.7979951293977143,0.7815895470474913,0.7926082156610388,239968000 +2016-03-08,0.7774272561073303,0.7884459289776401,0.7749786686226982,0.78379359524316,274940000 +2016-03-09,0.7769373059272766,0.7855073299810373,0.766898059834272,0.7842830658500332,222788000 +2016-03-10,0.7757130265235901,0.7859971143384983,0.7600420828266602,0.7815896231125746,286084000 +2016-03-11,0.7889353036880493,0.7891802032062301,0.7779166934949671,0.7872212989553233,277400000 +2016-03-14,0.7908942103385925,0.7940773786744295,0.7815895464710974,0.7852624554658738,190312000 +2016-03-15,0.7869765162467957,0.7918736896693017,0.7730195778305446,0.7867316750893439,226216000 +2016-03-16,0.8104830384254456,0.8131765249325292,0.7774270854497527,0.7810999950599042,363644000 +2016-03-17,0.8036268353462219,0.8114622767656205,0.7926081674035398,0.8075445852453735,353680000 +2016-03-18,0.8278681039810181,0.8386418756191499,0.8080345074696997,0.8131765812802232,545512000 +2016-03-21,0.8303165435791016,0.8305613847336051,0.8117072731218715,0.8205221968520238,337780000 +2016-03-22,0.8288474678993225,0.8347240648837501,0.8185633793923861,0.8276232036179041,242012000 +2016-03-23,0.8430494070053101,0.8491708458950119,0.8288475660342948,0.8325204760712555,429008000 +2016-03-24,0.844273567199707,0.8457427310331118,0.8327652144695644,0.8354586425781951,244956000 +2016-03-28,0.8528437614440918,0.8565166131258665,0.8418250896409181,0.8428045128641296,265388000 +2016-03-29,0.8665556311607361,0.8685144770860128,0.847211779538263,0.8491706254635397,261812000 +2016-03-30,0.8756155967712402,0.8876136913603466,0.8692492584840031,0.8697389992672225,376700000 +2016-03-31,0.8724323511123657,0.88149211696543,0.8655763310221283,0.8795332707621957,379884000 +2016-04-01,0.8851650357246399,0.8856547764699723,0.8604342664742621,0.8670454454521985,348292000 +2016-04-04,0.8765950202941895,0.8971631991345062,0.8731670099471109,0.8925108660183723,393940000 +2016-04-05,0.875370442867279,0.8834507834409219,0.8653311982394459,0.8687592657395534,339568000 +2016-04-06,0.8765950202941895,0.8770847610775961,0.8479465563695833,0.86435208449825,453376000 +2016-04-07,0.8675351142883301,0.8787986250870876,0.8638622633289906,0.8709631240847571,378104000 +2016-04-08,0.873167097568512,0.8802680185564037,0.8645970124618938,0.8746362616872383,255936000 +2016-04-11,0.8785540461540222,0.8930007298983248,0.8756157178063909,0.8783091465390991,387524000 +2016-04-12,0.8775743842124939,0.882716399043768,0.8604342180170838,0.8814920764388465,292764000 +2016-04-13,0.8996116518974304,0.8998564930630947,0.8814920629232531,0.8814920629232531,350716000 +2016-04-14,0.9020601511001587,0.9059779012649406,0.8934900689660163,0.8971629779889083,416564000 +2016-04-15,0.9091612100601196,0.917241552779716,0.8988771215863831,0.9018154492585699,436972000 +2016-04-18,0.9052433371543884,0.9074470826111983,0.8964284137060582,0.9074470826111983,307320000 +2016-04-19,0.8890827298164368,0.9103854292479577,0.8834509743096203,0.9086714243170458,309152000 +2016-04-20,0.892510712146759,0.8978976263198208,0.886634115653636,0.887613538672671,200172000 +2016-04-21,0.8915312886238098,0.8969182027938268,0.8876135381709713,0.8927555528021834,178280000 +2016-04-22,0.8881033062934875,0.9005910815172906,0.8851649787683976,0.8944696436785727,223540000 +2016-04-25,0.892510712146759,0.897407885620847,0.8858995337946316,0.8883481205316756,191972000 +2016-04-26,0.8932453393936157,0.9081817601137767,0.8893275887394929,0.8978976719440688,214536000 +2016-04-27,0.9135686159133911,0.9140583566371061,0.8893275884783576,0.8910415934429864,352396000 +2016-04-28,0.8863891363143921,0.9133236463759143,0.8841854493146861,0.9079367326878284,381224000 +2016-04-29,0.8699836730957031,0.8846751932187492,0.8604341675020496,0.8827163472205743,321904000 +2016-05-02,0.881492018699646,0.8868789327264015,0.8741462586880219,0.8783088501900511,256076000 +2016-05-03,0.8709632754325867,0.8751258678200006,0.8633726726530583,0.8714530162224274,224024000 +2016-05-04,0.8511297702789307,0.8611689606459276,0.8423148443664554,0.8604343786216443,525764000 +2016-05-05,0.8562716841697693,0.8663109317209761,0.8499053463028866,0.8582305887943817,246884000 +2016-05-06,0.8650866150856018,0.8672903609116143,0.8530885212047595,0.8548025262764628,183240000 +2016-05-09,0.863862156867981,0.8709630167486486,0.856761238608407,0.8672901662419455,333336000 +2016-05-10,0.8805127739906311,0.8819819379662097,0.8609240766600432,0.8692492613497584,269676000 +2016-05-11,0.882961094379425,0.8927554400854592,0.8783087626553873,0.8832059938873097,328176000 +2016-05-12,0.8709632754325867,0.8932454597391785,0.855292329083689,0.8893277085572231,670540000 +2016-05-13,1.0034321546554565,1.003921837141794,0.9549500857720928,0.9596023612869617,2110256000 +2016-05-16,1.0330599546432495,1.047996436723897,0.9926582341748073,0.9958414035680134,973032000 +2016-05-17,1.0352637767791748,1.0426094805760509,1.0151852784348097,1.028407638675472,628392000 +2016-05-18,1.0617080926895142,1.0737062422306263,1.0284072467939973,1.0284072467939973,541072000 +2016-05-19,1.0663609504699707,1.0739516131019293,1.0560769172972808,1.0575459648152052,398880000 +2016-05-20,1.0854593515396118,1.0898668418585988,1.0712575161280782,1.0729715206813837,391084000 +2016-05-23,1.0871731042861938,1.0942739619683866,1.0805619287178692,1.090111430484955,413636000 +2016-05-24,1.1135642528533936,1.1170012818074844,1.0875418196107773,1.0904877775365514,415788000 +2016-05-25,1.1089001893997192,1.1216658146627585,1.10006231376255,1.1170015168699294,458076000 +2016-05-26,1.1206839084625244,1.1287852359467658,1.107672689080593,1.1108641246671445,309964000 +2016-05-27,1.1268213987350464,1.1285398551927959,1.118228999385233,1.1219115064184673,277416000 +2016-05-31,1.1469513177871704,1.1494063211824543,1.1309941469008393,1.1317306947438264,412524000 +2016-06-01,1.1491608619689941,1.160208026235045,1.1381135806419365,1.1415504917995087,387132000 +2016-06-02,1.1572623252868652,1.1670821060792518,1.1440055158622247,1.1552982754795713,329208000 +2016-06-03,1.1410596370697021,1.1474425067319687,1.1209291201724176,1.1459696448662415,461076000 +2016-06-06,1.1351677179336548,1.1528433461175551,1.1292758028520158,1.1440054734950966,322512000 +2016-06-07,1.1373770236968994,1.1484243049356595,1.1368860698386007,1.142041436533754,193400000 +2016-06-08,1.1336950063705444,1.1417963329867395,1.124366177646188,1.1376228726434081,234616000 +2016-06-09,1.1631540060043335,1.1648724616163229,1.1273117980274021,1.1297668015079636,472168000 +2016-06-10,1.1341856718063354,1.1597171472668342,1.1327126930635363,1.1494064131282546,400024000 +2016-06-13,1.148669958114624,1.171010000949109,1.1354132654184315,1.1354132654184315,475588000 +2016-06-14,1.1508797407150269,1.156280586368335,1.1332041075047783,1.1459698491044605,298344000 +2016-06-15,1.1626628637313843,1.1727281188364633,1.1476877195218043,1.1604534546057053,301036000 +2016-06-16,1.1673271656036377,1.1692910976476085,1.1427777224015538,1.1540704779806104,246456000 +2016-06-17,1.1469513177871704,1.1690458801007064,1.1422869049849347,1.168800403173379,471000000 +2016-06-20,1.167573094367981,1.1825482429580096,1.1646271366313468,1.1653636845960176,293768000 +2016-06-21,1.1604535579681396,1.175674180429508,1.1587349854205493,1.1724827463742695,212508000 +2016-06-22,1.1594717502593994,1.170519033061538,1.157507817487269,1.162908661875883,202620000 +2016-06-23,1.1904038190841675,1.19163132070397,1.1697822367032773,1.1705187844995577,297880000 +2016-06-24,1.1226476430892944,1.162663319355866,1.1120914300552938,1.1415507762268289,1017684000 +2016-06-27,1.1106185913085938,1.1219113538066965,1.0941703430774687,1.1133189556256928,449088000 +2016-06-28,1.1268213987350464,1.1329586763349704,1.1113551735542355,1.1317312910516255,381920000 +2016-06-29,1.145233154296875,1.1540710283005617,1.133694916342924,1.1366408743441527,318932000 +2016-06-30,1.1540706157684326,1.1611899141756878,1.1378679696144784,1.1471966772023665,430940000 +2016-07-01,1.1454787254333496,1.162663403812232,1.1415508591495707,1.1476882526463892,218488000 +2016-07-05,1.1624175310134888,1.1643814634866838,1.1300122354922557,1.1390954670786593,371084000 +2016-07-06,1.169782280921936,1.1766562200160713,1.148424266998414,1.1543161813473863,273104000 +2016-07-07,1.2002240419387817,1.2043975021656663,1.1722376736076245,1.1776385188473804,395400000 +2016-07-08,1.2483408451080322,1.254232760464512,1.2083251736108207,1.212989587091197,481932000 +2016-07-11,1.2770634889602661,1.2863921969028982,1.2647887068964379,1.2662616854265372,448776000 +2016-07-12,1.2962125539779663,1.3079962693503633,1.2750998932217397,1.2913026628177142,436760000 +2016-07-13,1.2957212924957275,1.3060321443596672,1.2937573597324605,1.298667250171139,324604000 +2016-07-14,1.3089781999588013,1.3207620325958067,1.2917936391315699,1.3025954466951446,316892000 +2016-07-15,1.2937572002410889,1.29964911486557,1.2726446622513745,1.2922842215849686,428616000 +2016-07-18,1.30038583278656,1.3116785936029036,1.2954759418690642,1.309714660648112,252992000 +2016-07-19,1.3138881921768188,1.3190435603618627,1.29719446849915,1.299649472622146,382652000 +2016-07-20,1.3310723304748535,1.338191746523882,1.3129057505604746,1.3183065940320462,296460000 +2016-07-21,1.3065232038497925,1.3323001600008375,1.3021042669796339,1.3281267001132937,361308000 +2016-07-22,1.3421196937561035,1.3421196937561035,1.3016130725812523,1.3111873755008543,315768000 +2016-07-25,1.3669148683547974,1.3701063032403997,1.3443293471737692,1.3502212629813524,312528000 +2016-07-26,1.390236735343933,1.3973560350251277,1.376980043765977,1.3789439763958566,514508000 +2016-07-27,1.3762437105178833,1.4047211478062844,1.3678969077432919,1.40226614384027,446676000 +2016-07-28,1.3791896104812622,1.3895003457586552,1.3750161507388734,1.3794350874553392,221916000 +2016-07-29,1.4017754793167114,1.4054578689650583,1.3595503856950948,1.3843453221542499,409588000 +2016-08-01,1.392691731452942,1.41282236441102,1.383608498427134,1.4076669969540443,301120000 +2016-08-02,1.3757524490356445,1.4000564209737172,1.3624957583532422,1.3993198731241359,282748000 +2016-08-03,1.3794351816177368,1.3821356626389762,1.3664239646152776,1.3740343366362933,299828000 +2016-08-04,1.4049663543701172,1.4113492229799753,1.3833628621080643,1.38606322547769,272712000 +2016-08-05,1.428779125213623,1.429515555897251,1.4142949348867042,1.421168756177855,371588000 +2016-08-08,1.4420363903045654,1.4518561723765997,1.426815646150187,1.4484192603574912,305064000 +2016-08-09,1.4457184076309204,1.459711646163459,1.4420360195658861,1.44915531876642,372344000 +2016-08-10,1.4363901615142822,1.460694143259778,1.4317257467880493,1.4584847329414794,375740000 +2016-08-11,1.4656034708023071,1.4717408623983828,1.441054021479012,1.443999978810009,681064000 +2016-08-12,1.5475986003875732,1.5559454007151443,1.4884344502962916,1.519612242333718,1425744000 +2016-08-15,1.546125888824463,1.5588916269630313,1.5252588258718816,1.5493173233591049,573304000 +2016-08-16,1.5367971658706665,1.5463713523303069,1.5321327525866784,1.5439164657424809,287652000 +2016-08-17,1.5012001991271973,1.540233958107454,1.4891710099498408,1.5367970469139236,595212000 +2016-08-18,1.5245224237442017,1.526977310399652,1.4930990317150916,1.4989909469858047,331684000 +2016-08-19,1.5284503698349,1.5399886069644433,1.517157609677747,1.5237859561763991,291560000 +2016-08-22,1.5348329544067383,1.5370424808700898,1.5149479186026034,1.533114498858023,244748000 +2016-08-23,1.5472536087036133,1.5573374153965973,1.542826528712761,1.5504509247064373,339764000 +2016-08-24,1.523396372795105,1.5534019742976999,1.5162639543103371,1.552664186431023,298448000 +2016-08-25,1.5133124589920044,1.5246260264009939,1.494374615071122,1.5238882385876036,406032000 +2016-08-26,1.5256099700927734,1.534218081582789,1.5051963145287666,1.5172477878915118,300024000 +2016-08-29,1.5246262550354004,1.5379073758817952,1.522166844678569,1.5317587913513502,274652000 +2016-08-30,1.5157725811004639,1.5307753280174528,1.511591430020273,1.5226590725014737,285544000 +2016-08-31,1.5086398124694824,1.5229047691032425,1.5042128499750427,1.518723735938856,388544000 +2016-09-01,1.5531566143035889,1.5588133418516998,1.5086401129487426,1.5098698771206853,428492000 +2016-09-02,1.5379071235656738,1.5580748481111986,1.5204449727945666,1.5563532259608541,323148000 +2016-09-06,1.5524184703826904,1.5524184703826904,1.5354481730688365,1.543318498372634,306812000 +2016-09-07,1.5295453071594238,1.5551238335288258,1.5206912650267221,1.5474994380279292,397988000 +2016-09-08,1.540612816810608,1.543072344418608,1.5106073305640846,1.5280694840186153,315808000 +2016-09-09,1.463877558708191,1.5322508404579256,1.4510882948878452,1.5236427272237496,697760000 +2016-09-12,1.494128942489624,1.4970803290353192,1.409769082988346,1.4444476989851491,598260000 +2016-09-13,1.4724855422973633,1.5076560147067293,1.4641233591380196,1.490439672477443,471768000 +2016-09-14,1.485520601272583,1.4904395390009004,1.4636313694284246,1.475928655110855,319048000 +2016-09-15,1.5418426990509033,1.543564321598057,1.4845369445159198,1.4879803068869675,515212000 +2016-09-16,1.5455317497253418,1.5556155548765516,1.5278235497461956,1.5472533721346524,902444000 +2016-09-19,1.5659456253051758,1.6050512048481307,1.554632054773939,1.5617644747119317,417128000 +2016-09-20,1.5516808032989502,1.5838998950490937,1.5430726893004698,1.5838998950490937,331112000 +2016-09-21,1.5952131748199463,1.598164561158725,1.5561075990229691,1.5563535283384113,336212000 +2016-09-22,1.5991486310958862,1.6094784855597524,1.5900486580339408,1.6045595463358795,308732000 +2016-09-23,1.5974270105361938,1.6057891955011665,1.5902945896981542,1.6011163029169928,276132000 +2016-09-26,1.5824240446090698,1.5888186764525691,1.5625023610705129,1.5792267286873203,230040000 +2016-09-27,1.6365326642990112,1.638992192657005,1.5755378387080283,1.5762756268493663,402752000 +2016-09-28,1.6424351930618286,1.6436649570570274,1.6215296742504444,1.6389919476966712,319788000 +2016-09-29,1.6576836109161377,1.6628485954400374,1.624480809129532,1.6397294815654673,336684000 +2016-09-30,1.685229778289795,1.7017082142777298,1.656945797601596,1.6667836733339967,429932000 +2016-10-03,1.6835079193115234,1.7095784171591406,1.6805566506223468,1.6852296588555649,242596000 +2016-10-04,1.6798189878463745,1.7142515554372175,1.667275654319995,1.685967689949638,281624000 +2016-10-05,1.6780976057052612,1.7113005314529062,1.6729327374183178,1.6940841865530063,305440000 +2016-10-06,1.6562080383300781,1.6682593952637674,1.629645679571981,1.6579296607491767,360212000 +2016-10-07,1.6441566944122314,1.6717027725774505,1.6394836853967245,1.6672756928874848,286260000 +2016-10-10,1.650305151939392,1.6616187201738255,1.6348104339605432,1.652764562106848,287876000 +2016-10-11,1.6264485120773315,1.6473540295920934,1.613905178113126,1.644894619030985,388540000 +2016-10-12,1.6338269710540771,1.6424350838948192,1.6062808926869612,1.6198079439048045,419920000 +2016-10-13,1.6072642803192139,1.6183319187167173,1.5666830177128461,1.6146427450097887,390116000 +2016-10-14,1.6230052709579468,1.6380080155205339,1.6134133234646348,1.6269403747761937,330636000 +2016-10-17,1.6136596202850342,1.6380083885570216,1.6114461385427696,1.6227597111926861,195328000 +2016-10-18,1.6382535696029663,1.6475995856264993,1.6293995294015826,1.6360400888717994,269372000 +2016-10-19,1.6348108053207397,1.6424352013975694,1.6188242251322662,1.6271865265206602,199060000 +2016-10-20,1.6657999753952026,1.6712108895852649,1.6306296195434948,1.6539945470039803,312084000 +2016-10-21,1.6611270904541016,1.664078359606309,1.6453864410175432,1.6598973265625836,279508000 +2016-10-24,1.7390927076339722,1.7410602599384406,1.6721949910679161,1.6724410377231451,339836000 +2016-10-25,1.7676218748092651,1.7781976552246892,1.7277785151564073,1.7361406974066347,397460000 +2016-10-26,1.7747547626495361,1.7941845877496836,1.7511437869565383,1.7528654096061245,333792000 +2016-10-27,1.7383544445037842,1.79172497878092,1.7312220248890058,1.7882817336374586,388664000 +2016-10-28,1.7354027032852173,1.7732785068382957,1.7322053883392405,1.7467162702266186,290856000 +2016-10-31,1.7501603364944458,1.7617198381263808,1.7400764111213933,1.74106024590408,252388000 +2016-11-01,1.6982654333114624,1.7661468647701275,1.6795733939488902,1.7565549157198752,473224000 +2016-11-02,1.6911327838897705,1.7344195164505525,1.688181397102961,1.7113005154151335,295848000 +2016-11-03,1.6714568138122559,1.700478584696298,1.6389917978778004,1.699002891492301,309664000 +2016-11-04,1.6618646383285522,1.690394546650923,1.6375158797225837,1.6603889453272762,328780000 +2016-11-07,1.7528653144836426,1.7639329550742309,1.7093326573749237,1.7105624212798203,487580000 +2016-11-08,1.7501603364944458,1.7651630839506367,1.7339278248790877,1.7595062391845269,429884000 +2016-11-09,1.7206460237503052,1.743765136775912,1.690148679998336,1.7026918950589336,456532000 +2016-11-10,1.6667840480804443,1.758522383051363,1.641943423862674,1.7582764536942697,869280000 +2016-11-11,2.1635968685150146,2.183272619994256,1.9306849316898718,1.9555256676176342,2175344000 +2016-11-14,2.057102680206299,2.1690086494424112,2.0566108214056897,2.1665491208858136,1348796000 +2016-11-15,2.119818925857544,2.150808136523548,2.0642346679524657,2.0730888286656883,626092000 +2016-11-16,2.2536141872406006,2.2764871432830263,2.123754097543657,2.148102864361834,987984000 +2016-11-17,2.272306442260742,2.3313337187125796,2.2295114440072905,2.2703387725575954,832988000 +2016-11-18,2.2961628437042236,2.320019514203838,2.257795052147893,2.2723059386511144,576060000 +2016-11-21,2.2868168354034424,2.3205116178358436,2.272551760898735,2.3141169858811286,436436000 +2016-11-22,2.303295135498047,2.3055086168170984,2.272059881309554,2.2946870222831266,330368000 +2016-11-23,2.3146255016326904,2.346153696520464,2.285067686791548,2.3084674767253914,443236000 +2016-11-25,2.319305658340454,2.3424592697356044,2.3008318173145406,2.3257098637202605,195564000 +2016-11-28,2.3180742263793945,2.333592028491485,2.3055119947513236,2.3121626156020274,278736000 +2016-11-29,2.2968902587890625,2.326201888306266,2.279155667035027,2.3153638603800215,444568000 +2016-11-30,2.2710275650024414,2.3193053974421654,2.2685643551554526,2.3055115632418013,440500000 +2016-12-01,2.158707857131958,2.270288735077855,2.0880154202314705,2.2685645350291757,1035524000 +2016-12-02,2.178659677505493,2.187280678520027,2.0966366080163685,2.1244702262510033,478292000 +2016-12-05,2.263146162033081,2.2811271776151925,2.192207290039224,2.216592512605568,602284000 +2016-12-06,2.300339460372925,2.3087142816997765,2.2555100180741,2.2712742356333866,498796000 +2016-12-07,2.3417203426361084,2.3473855381983637,2.268564690674156,2.2867921173712236,480804000 +2016-12-08,2.302555799484253,2.379898851765317,2.2919644197815665,2.344675842962553,381544000 +2016-12-09,2.2616677284240723,2.3220149648614385,2.2343267077841453,2.3202907648176465,382312000 +2016-12-12,2.2067394256591797,2.2156068414602625,2.156244790946493,2.213143631253631,601332000 +2016-12-13,2.245657444000244,2.2732448838548818,2.2180702390502813,2.2190554292543014,387796000 +2016-12-14,2.3757119178771973,2.3919687289593776,2.255509799973862,2.279402421549892,983980000 +2016-12-15,2.431379556655884,2.461676388702711,2.3794068945867966,2.386796291335756,746548000 +2016-12-16,2.473252534866333,2.4803955146877037,2.407239872197899,2.458966105414343,1089528000 +2016-12-19,2.503303289413452,2.5235010965287312,2.438522222748842,2.455764459470852,744656000 +2016-12-20,2.590498924255371,2.614145131422076,2.564635686965986,2.575966312942621,848056000 +2016-12-21,2.6067557334899902,2.609711538746373,2.5545368988016435,2.6020757280761044,576136000 +2016-12-22,2.6382839679718018,2.6816353836323272,2.6239975378224005,2.6311407528971014,718612000 +2016-12-23,2.7040505409240723,2.7055285611979043,2.617593871854794,2.620303262483907,647692000 +2016-12-27,2.889772653579712,2.8907578438690376,2.739520093936904,2.760210734345605,1194272000 +2016-12-28,2.690995216369629,2.954059967835368,2.677201617055714,2.945931563253293,2295764000 +2016-12-29,2.744692087173462,2.7461701071846614,2.53212194309297,2.5838481802967355,2175368000 +2016-12-30,2.6291697025299072,2.7567611881796954,2.6183319091356143,2.7427211753183585,1212932000 +2017-01-03,2.5126631259918213,2.620056594681072,2.447882063823072,2.5715323430703494,1501996000 +2017-01-04,2.571286678314209,2.598627704723409,2.50084040680986,2.5469014575901676,1199220000 +2017-01-05,2.5060126781463623,2.606509353498511,2.489016856420168,2.574734740196662,984296000 +2017-01-06,2.5395116806030273,2.567837893031262,2.4927116266823632,2.5333536551373332,822856000 +2017-01-09,2.642470598220825,2.660205424769035,2.5493635810087807,2.5493635810087807,916248000 +2017-01-10,2.6225202083587646,2.6895178410275076,2.60182956952486,2.6555264295859655,880920000 +2017-01-11,2.5902531147003174,2.615869942995343,2.5653752966189156,2.6109437563488354,525664000 +2017-01-12,2.5478861331939697,2.5789219691667533,2.5030566967464556,2.5673451637819418,625616000 +2017-01-13,2.5476393699645996,2.5863107724162324,2.538525541818873,2.5518265442183647,457820000 +2017-01-17,2.490494728088379,2.5419745503593694,2.4771937225011595,2.537048365095968,580612000 +2017-01-18,2.5358171463012695,2.5427139476633154,2.4412320727715775,2.4690656932275523,654424000 +2017-01-19,2.5902531147003174,2.6222741500691,2.536556482239366,2.53877327797553,644872000 +2017-01-20,2.5619258880615234,2.6306479382870926,2.540003884550362,2.6129131095622804,492024000 +2017-01-23,2.5885276794433594,2.6084793013615815,2.5542898646694177,2.556753074270106,369904000 +2017-01-24,2.643702983856201,2.6498610094368327,2.583848337659472,2.598627364148331,428052000 +2017-01-25,2.6550328731536865,2.6922264916819163,2.6190708593997867,2.6860684678102675,522760000 +2017-01-26,2.700847864151001,2.7082372589155073,2.6281848167369213,2.65774263069957,458800000 +2017-01-27,2.7530677318573,2.7560235378601288,2.6811436672327895,2.707745686353538,471996000 +2017-01-30,2.709961175918579,2.7343463875096257,2.6579887681378715,2.7321295928021847,496004000 +2017-01-31,2.689271926879883,2.7107013430414515,2.665132885003894,2.68360673023015,362756000 +2017-02-01,2.8067636489868164,2.8109508240758223,2.7060205687022827,2.7237551638043684,590004000 +2017-02-02,2.8422324657440186,2.850853699558892,2.7602096511801517,2.7907526523057697,483240000 +2017-02-03,2.8173553943634033,2.854795439295257,2.8055324077307104,2.843711227830151,372744000 +2017-02-06,2.8895256519317627,2.89001824697642,2.8079951819724367,2.8079951819724367,506768000 +2017-02-07,2.9343554973602295,2.9784459311957443,2.9040586663101986,2.923763880262227,746224000 +2017-02-08,2.921546697616577,2.9387886988133984,2.8666182389536847,2.9163740972575307,449580000 +2017-02-09,2.8666188716888428,2.9326315556645426,2.847406486060097,2.927705134289695,842568000 +2017-02-10,2.798635244369507,2.973026330033305,2.773511019308627,2.9540601299359235,1651092000 +2017-02-13,2.6695661544799805,2.807502635358754,2.6651323291922826,2.792970024219749,1180724000 +2017-02-14,2.6794183254241943,2.7131635475877682,2.618085670619137,2.659959297102269,850632000 +2017-02-15,2.684837579727173,2.7045427915673805,2.6542945718462474,2.682374604425638,373020000 +2017-02-16,2.641732692718506,2.6956757301395724,2.602568447380235,2.6944441249818953,647176000 +2017-02-17,2.641240119934082,2.645673945914416,2.5811392857767115,2.6281855268198533,563740000 +2017-02-21,2.7358250617980957,2.7397660572102747,2.665624979903083,2.665871394887131,551952000 +2017-02-22,2.7316322326660156,2.7572813836958474,2.712641860152906,2.747909560419478,433772000 +2017-02-23,2.478346347808838,2.623855826807448,2.458369782184314,2.601906159609654,1592888000 +2017-02-24,2.502269744873047,2.5155875370336997,2.3602129815579427,2.394000796277025,1029904000 +2017-02-27,2.5750246047973633,2.5900687736645462,2.504736163027208,2.5205202745996447,715400000 +2017-02-28,2.502763032913208,2.5945081657027256,2.4854992713242905,2.584642890279217,625360000 +2017-03-01,2.535071611404419,2.5740385619113697,2.493638341639789,2.5597340983777546,504804000 +2017-03-02,2.4416003227233887,2.536305015662968,2.438887512398978,2.522247276779694,754332000 +2017-03-03,2.4275426864624023,2.4359278430077076,2.3730381105127005,2.4309954394871447,864692000 +2017-03-06,2.408799171447754,2.41940415713643,2.3471425951570324,2.391288679320267,883568000 +2017-03-07,2.435187339782715,2.454670928968403,2.3959739058537752,2.4087984813377177,603400000 +2017-03-08,2.430748462677002,2.4983241009050343,2.4285288695616982,2.483526421467783,638712000 +2017-03-09,2.4302546977996826,2.4526975850833974,2.402139230810365,2.4147173142955722,478060000 +2017-03-10,2.444559335708618,2.468482112251192,2.426309139831588,2.4566442045690673,499740000 +2017-03-13,2.5118885040283203,2.5217535447942168,2.45417790970732,2.454917852445072,774136000 +2017-03-14,2.510162115097046,2.5340846565526554,2.477853947991145,2.5247130677933396,522016000 +2017-03-15,2.5291521549224854,2.540003628725611,2.4741543727995414,2.5217534334749505,615036000 +2017-03-16,2.5602266788482666,2.5607201307380754,2.525699158627134,2.5397568926604914,523100000 +2017-03-17,2.615964889526367,2.6171980490802724,2.560227159615064,2.577737648958705,1119688000 +2017-03-20,2.699323892593384,2.7032700964963587,2.617444042424654,2.633474878377626,748568000 +2017-03-21,2.61201810836792,2.7119018933784242,2.604126171206138,2.682060050283338,913484000 +2017-03-22,2.6652908325195312,2.669976746039379,2.596975232593773,2.600921203136487,616764000 +2017-03-23,2.641120433807373,2.677374569880068,2.631502119143807,2.6573977626235017,533940000 +2017-03-24,2.6504924297332764,2.695378449879323,2.624596784572751,2.687486510935488,439500000 +2017-03-27,2.6697287559509277,2.673674724625355,2.554554310559216,2.6038795069922758,506644000 +2017-03-28,2.6559183597564697,2.685513484433273,2.6455601013997603,2.670962530493759,432444000 +2017-03-29,2.6472864151000977,2.6756483795102293,2.6450668219621014,2.663317019053304,349992000 +2017-03-30,2.6980903148651123,2.7128879892037787,2.648765125737982,2.6544374695673647,525532000 +2017-03-31,2.6864991188049316,2.71017539966368,2.6734280543484816,2.688472220610185,440808000 +2017-04-03,2.672935724258423,2.704257226398714,2.6492594355467087,2.686993461880715,445232000 +2017-04-04,2.485499143600464,2.5752711696518893,2.4746476704737916,2.55011523605709,1271280000 +2017-04-05,2.4670016765594482,2.524712251939985,2.453930378354012,2.4667549506607975,747048000 +2017-04-06,2.4850058555603027,2.4970904877046434,2.427048543094755,2.4721812807782415,635120000 +2017-04-07,2.474400758743286,2.5089285127556025,2.459356591946808,2.491418027415156,429068000 +2017-04-10,2.411264657974243,2.4817995837764153,2.407071963313,2.4751408056683455,756332000 +2017-04-11,2.4198970794677734,2.439133945863622,2.3762442174773253,2.3811766206756446,618148000 +2017-04-12,2.3999195098876953,2.434200536218569,2.3947403823298856,2.419896312754296,414092000 +2017-04-13,2.3550336360931396,2.397453327449566,2.3550336360931396,2.375750382700472,506892000 +2017-04-17,2.447272777557373,2.447519268373429,2.362679857820377,2.3678589873714793,497292000 +2017-04-18,2.448751926422119,2.454917723577843,2.40707217253432,2.432967814985023,370116000 +2017-04-19,2.45837140083313,2.490432617301038,2.451712384439807,2.4662633419203566,380828000 +2017-04-20,2.497337818145752,2.5020237306504143,2.451711852726791,2.4729218220007683,404016000 +2017-04-21,2.5076959133148193,2.5104087231981578,2.475141253910221,2.4869791622020805,341896000 +2017-04-24,2.5390169620513916,2.552088027568126,2.5183004498206008,2.539263452796372,371820000 +2017-04-25,2.5831637382507324,2.5977146930250106,2.532112151134531,2.553568611876106,388440000 +2017-04-26,2.5654056072235107,2.5991931790837284,2.563432505602008,2.596727096058164,327004000 +2017-04-27,2.6053595542907715,2.613744708845322,2.5548011954021836,2.5728048991000496,319700000 +2017-04-28,2.572312116622925,2.6053599941073764,2.566639535441862,2.5984544885316234,348248000 +2017-05-01,2.6300225257873535,2.6352018902596535,2.5760114046443503,2.5831636363431003,307732000 +2017-05-02,2.5520877838134766,2.6043727464898576,2.5293981717845075,2.60313958727946,629972000 +2017-05-03,2.5710785388946533,2.5806968528963354,2.530385219654642,2.5451826619958613,336904000 +2017-05-04,2.561213254928589,2.588342053437021,2.5533210825908617,2.577243855137871,209788000 +2017-05-05,2.561460256576538,2.568612487733962,2.534084726671744,2.5496223485103635,228428000 +2017-05-08,2.534578561782837,2.5747784393692026,2.523233633569854,2.5732987888376826,365240000 +2017-05-09,2.5387706756591797,2.5878493905332265,2.5318651703866544,2.5402505611896538,847672000 +2017-05-10,2.9913299083709717,3.0044012114819765,2.8120327898867115,2.818691569236701,2129096000 +2017-05-11,3.1198222637176514,3.2167465377888567,2.9572956869416043,2.9607484397155432,1939792000 +2017-05-12,3.1541028022766113,3.1962760068959337,3.102064792891476,3.123028032221316,962620000 +2017-05-15,3.312436819076538,3.314903137813007,3.1908500807416007,3.1952895015074647,1087540000 +2017-05-16,3.374094009399414,3.389631632193781,3.28900811383555,3.36348902500355,1120700000 +2017-05-17,3.1499102115631104,3.3260012734892697,3.1457175168313003,3.3072576277713632,1271368000 +2017-05-18,3.281855821609497,3.290734429442092,3.133386748413633,3.1938101564721633,1156032000 +2017-05-19,3.3576502799987793,3.412458776249995,3.3383931516866148,3.3830794652082665,1018372000 +2017-05-22,3.429246425628662,3.4435657167340294,3.3904851921445487,3.4013483299681746,836608000 +2017-05-23,3.3830788135528564,3.451219353966947,3.350489869678676,3.4489974233298586,681248000 +2017-05-24,3.4210989475250244,3.4828204395665896,3.4090013523766034,3.480104537578753,815996000 +2017-05-25,3.4134464263916016,3.4571452665761386,3.368513127758765,3.456404544417384,608228000 +2017-05-26,3.501830577850342,3.586759317034025,3.3850536203349795,3.405298215109814,779140000 +2017-05-30,3.576637029647827,3.611694649612243,3.5317037452187985,3.5477512290761943,989652000 +2017-05-31,3.5637993812561035,3.6292240181393094,3.5070154809313734,3.621570518518889,887316000 +2017-06-01,3.5640463829040527,3.580587841519134,3.5186193536210624,3.5796001336137855,503340000 +2017-06-02,3.5462703704833984,3.5872532989896584,3.5403450653996726,3.5610833977438894,487456000 +2017-06-05,3.6541595458984375,3.666997629018792,3.518372436173932,3.529976061057848,817376000 +2017-06-06,3.6376185417175293,3.6956366696172878,3.624286721592667,3.6494689176902693,758728000 +2017-06-07,3.681563138961792,3.700326523525285,3.6465055212416893,3.662059267969897,612612000 +2017-06-08,3.9486944675445557,3.9501756760584166,3.747482262193992,3.788712175606679,1161744000 +2017-06-09,3.6934144496917725,4.160029059327517,3.524297441576402,4.067200061955203,3692928000 +2017-06-12,3.7025492191314697,3.7452605793308584,3.5084969995049335,3.6015729842379103,1697532000 +2017-06-13,3.73785400390625,3.8210545568458723,3.5958943701371346,3.8119196131524307,1672504000 +2017-06-14,3.7457547187805176,3.8035260989389137,3.666257530617232,3.7408171207608096,1184640000 +2017-06-15,3.7618017196655273,3.792168494959733,3.616879443119767,3.6282363166471137,963824000 +2017-06-16,3.7432854175567627,3.819326444109943,3.7092152648288113,3.771430500359427,924960000 +2017-06-19,3.8840107917785645,3.8891953753798867,3.7837750379219757,3.787478177380722,778176000 +2017-06-20,3.8783318996429443,3.9931339218698336,3.874135024317476,3.9262278416461984,1095444000 +2017-06-21,3.9370908737182617,3.940794248426086,3.8440148888575543,3.905983373788341,682652000 +2017-06-22,3.90993332862854,3.9585699921218,3.8859853578814496,3.9452379379336686,469132000 +2017-06-23,3.7978484630584717,3.9333888611759176,3.7827882095352874,3.917588120858124,1088588000 +2017-06-26,3.7563700675964355,3.8662342487967836,3.662059634681819,3.8306826559659624,1063960000 +2017-06-27,3.6188549995422363,3.747482583416352,3.6131766799124816,3.7388416110561082,999492000 +2017-06-28,3.746495008468628,3.7511858555428037,3.598363317793061,3.6865017043533714,994948000 +2017-06-29,3.621323585510254,3.721065355020035,3.557133174623591,3.718102938008789,1064424000 +2017-06-30,3.568984031677246,3.6521845857842954,3.542814129341325,3.638605780689178,731060000 +2017-07-03,3.4398622512817383,3.5958941825632773,3.4213458499360705,3.58108115566627,709072000 +2017-07-05,3.5317039489746094,3.560589515763947,3.4843017456946357,3.503311882898414,820188000 +2017-07-06,3.5423202514648438,3.5892287236995033,3.4504787227564484,3.502571778430385,746284000 +2017-07-07,3.623297691345215,3.641567338044478,3.5761424841587344,3.5991029765463716,654972000 +2017-07-10,3.794638156890869,3.8020446716778977,3.670701408753094,3.6968713140861973,958492000 +2017-07-11,3.8484585285186768,3.856112027403214,3.756370027004459,3.798340660246315,757956000 +2017-07-12,4.012144565582275,4.024241927792125,3.8652475535649624,3.9082056681992845,1145208000 +2017-07-13,3.9657280445098877,4.105712206916238,3.9193135642822687,4.024239880793829,1369132000 +2017-07-14,4.072383403778076,4.073864376465109,3.975110103949658,3.982022879480864,941948000 +2017-07-17,4.055102825164795,4.135340972695592,3.993381318109637,4.106455164240868,930792000 +2017-07-18,4.097319602966309,4.111885878533647,3.9822703713904355,3.9941209804787112,776640000 +2017-07-19,4.0760884284973145,4.13287210261436,4.063991065718328,4.1064552106510135,687044000 +2017-07-20,4.135339736938477,4.1355864872744155,4.046707863884903,4.096578743804634,699596000 +2017-07-21,4.150152683258057,4.179779204421648,4.100528554620027,4.114848079090561,648332000 +2017-07-24,4.102010726928711,4.166941863791711,4.091394810029202,4.1573134192901025,652524000 +2017-07-25,4.082260608673096,4.0965801382909435,4.038561768559754,4.079050969622971,496556000 +2017-07-26,4.129413604736328,4.1953321903310234,4.094602507546716,4.139782767538023,640404000 +2017-07-27,3.9931342601776123,4.165954654981768,3.889935853704847,4.1543507940524975,782856000 +2017-07-28,4.058558464050293,4.0830004061228315,3.9324000415163414,3.9573352488681586,513348000 +2017-07-31,4.012144565582275,4.108183212058507,3.9654833113442844,4.072137875829814,559672000 +2017-08-01,4.061028480529785,4.062756675341591,3.9748654903703993,4.002763357790185,431384000 +2017-08-02,4.058558464050293,4.096085238882096,3.981530440576647,4.092135349466732,478444000 +2017-08-03,4.110158443450928,4.113861582888361,4.041030191600143,4.0580653864486385,442420000 +2017-08-04,4.128180980682373,4.198790203544708,4.110158313944947,4.132871592428813,589096000 +2017-08-07,4.2550787925720215,4.255572293153092,4.147683083104011,4.157311995204902,717412000 +2017-08-08,4.204469203948975,4.309642327338656,4.165214227759518,4.293101102936565,755336000 +2017-08-09,4.249154567718506,4.251623483942954,4.139537136020637,4.1583005226083465,530784000 +2017-08-10,4.067201137542725,4.262734849707773,4.057078718781587,4.250390264304756,1328088000 +2017-08-11,3.8504340648651123,3.9254873859096984,3.7751339934340216,3.879566620993848,1497196000 +2017-08-14,4.157559394836426,4.161262533362828,3.930424304231434,3.9420279268151512,1279020000 +2017-08-15,4.122503280639648,4.188915406293745,4.088186134516628,4.162745733443414,764532000 +2017-08-16,4.077322006225586,4.161016530784072,4.044980284094754,4.137562531072793,596632000 +2017-08-17,3.9864680767059326,4.085963104391966,3.984246381481298,4.06892838104496,525444000 +2017-08-18,3.987208366394043,4.057818052219547,3.9412876074759677,4.040782859822077,601204000 +2017-08-21,3.9291906356811523,4.023007342862921,3.8852450525003275,4.011650703775322,623672000 +2017-08-22,4.016664028167725,4.022594548982049,3.94648682694776,3.9657609017662754,450456000 +2017-08-23,4.096972942352295,4.108092610375723,3.97465659409458,3.9833056437236203,579520000 +2017-08-24,4.081900119781494,4.133545102062433,4.05546044525129,4.12909685705876,469700000 +2017-08-25,4.047800064086914,4.1162477969266815,4.04137513573927,4.106116469186,357200000 +2017-08-28,4.07646369934082,4.079676163387952,4.0112284332475685,4.066826778511638,389496000 +2017-08-29,4.069790840148926,4.09153623790673,4.009497768200317,4.017652410187519,324096000 +2017-08-30,4.094007968902588,4.105127637065653,4.059166216308404,4.089559724587621,384400000 +2017-08-31,4.186920642852783,4.190874011235851,4.10685927734689,4.114272078721341,612684000 +2017-09-01,4.212123394012451,4.247706523633182,4.190872397542756,4.199521448003297,445432000 +2017-09-05,4.099690914154053,4.165667546875775,4.041621956853304,4.160725367565706,695364000 +2017-09-06,4.0972208976745605,4.146394793459077,4.062379608430646,4.132557064816129,397672000 +2017-09-07,4.116248607635498,4.14861880942205,4.07597072766175,4.114024484774289,352868000 +2017-09-08,4.044835090637207,4.119460322553987,4.020619065021366,4.1046342517521675,498856000 +2017-09-11,4.176046848297119,4.186672583508916,4.085112800823464,4.090549387901223,567444000 +2017-09-12,4.1911187171936035,4.200755635483543,4.125883468289258,4.200755635483543,411488000 +2017-09-13,4.209900379180908,4.238811146140501,4.133545432223916,4.165915631365629,580960000 +2017-09-14,4.185931205749512,4.264015866637522,4.1463947043868945,4.170857696623088,513712000 +2017-09-15,4.4505791664123535,4.4505791664123535,4.2662399621754545,4.271429110845419,1364792000 +2017-09-18,4.63442325592041,4.724616396033959,4.567952675307166,4.574871539143307,1684460000 +2017-09-19,4.629481792449951,4.691257635012401,4.56202239515834,4.584014768553489,874280000 +2017-09-20,4.592168807983398,4.6806317629302345,4.551890933416672,4.63318805673767,724920000 +2017-09-21,4.466639995574951,4.51457810352965,4.388802312048656,4.488384927212378,1075600000 +2017-09-22,4.423150062561035,4.504941591679999,4.413266173214753,4.455273763389031,491232000 +2017-09-25,4.225467681884766,4.3934980473288325,4.204711089490155,4.392262266555475,874580000 +2017-09-26,4.249189853668213,4.4152435570952395,4.20940637972598,4.360139604489742,1125620000 +2017-09-27,4.34234619140625,4.35568998048311,4.268709326550694,4.339628134341886,713720000 +2017-09-28,4.341111183166504,4.353466160247002,4.293667015438143,4.349512322498917,435244000 +2017-09-29,4.41746711730957,4.441188735268767,4.379907299733836,4.425127355665471,619092000 +2017-10-02,4.423150062561035,4.496786947005479,4.37372967320511,4.467628742899948,503480000 +2017-10-03,4.432292938232422,4.4621925157710844,4.388061226622081,4.4293274415840935,390332000 +2017-10-04,4.469357967376709,4.491597305100446,4.401898580106414,4.4384700506839865,427848000 +2017-10-05,4.466887474060059,4.497281459620804,4.436987895068802,4.493822027571184,437364000 +2017-10-06,4.479984283447266,4.493328077744909,4.423150616480055,4.439212468905507,318800000 +2017-10-09,4.58104944229126,4.614161487433063,4.498022597451387,4.516802507076614,563492000 +2017-10-10,4.66852331161499,4.767858959777782,4.627257099118826,4.730299146558308,974876000 +2017-10-11,4.718191146850586,4.719673895089654,4.639118153346159,4.6850791069473035,529508000 +2017-10-12,4.720414161682129,4.771317283262212,4.693232649800362,4.721649470716706,528292000 +2017-10-13,4.808383464813232,4.8185147915335245,4.735735404678054,4.782684696635402,628728000 +2017-10-16,4.89091682434082,4.8938823211764655,4.775025377676239,4.8382839686308765,576640000 +2017-10-17,4.886468410491943,4.914885237780078,4.8518740940215555,4.870159593968444,478596000 +2017-10-18,4.882267951965332,4.896105679537642,4.777002246843906,4.895364776685337,567316000 +2017-10-19,4.887704849243164,4.892646558467038,4.755504583430939,4.804678007222489,570772000 +2017-10-20,4.865463733673096,4.931934293786602,4.856567717690011,4.90475325337545,451620000 +2017-10-23,4.858545780181885,4.913649716558175,4.838283126373257,4.887209573833711,428696000 +2017-10-24,4.909450054168701,4.911179770320396,4.841743685293581,4.867689427569,407244000 +2017-10-25,4.785403728485107,4.922793614836243,4.723875324191933,4.8699133195794735,828160000 +2017-10-26,4.835564613342285,4.84717821599986,4.789109260087687,4.813078310724984,322744000 +2017-10-27,4.988029479980469,4.988276447644695,4.861759249335433,4.887705464761543,572192000 +2017-10-30,5.036953926086426,5.0925517922717445,4.972212604236708,4.988027483351085,504056000 +2017-10-31,5.110344886779785,5.137032002517798,5.0631481454752105,5.068831700367828,411908000 +2017-11-01,5.11998176574707,5.1884295062684735,5.055734831621591,5.173109029133288,502576000 +2017-11-02,5.088846206665039,5.135054599628304,5.032259518552236,5.090328954918466,342308000 +2017-11-03,5.156799793243408,5.156799793243408,5.074020395452849,5.119981351830482,353640000 +2017-11-06,5.180028915405273,5.188677497540659,5.107627793154085,5.11998277582967,389944000 +2017-11-07,5.239332675933838,5.260831114619188,5.190653657624158,5.202761670291906,427700000 +2017-11-08,5.16841459274292,5.238592053495295,5.120970881398803,5.234885182155066,522988000 +2017-11-09,5.073526859283447,5.098484260973255,4.951210941368652,5.0722915496724905,978564000 +2017-11-10,5.340890884399414,5.4034080843228125,5.229447241663635,5.265277333808658,1253256000 +2017-11-13,5.2541584968566895,5.3663430600236115,5.238838021739248,5.340891728675032,582376000 +2017-11-14,5.292459011077881,5.307779485609824,5.219563508909573,5.263300810210557,529292000 +2017-11-15,5.188675880432129,5.238591144887047,5.134807720295307,5.237355364217206,501948000 +2017-11-16,5.2289533615112305,5.292953315895029,5.220057815127156,5.262806773913227,441768000 +2017-11-17,5.222776412963867,5.321370692723106,5.207703376069449,5.286034999809026,515664000 +2017-11-20,5.289989471435547,5.30209748444853,5.201526037784907,5.2383444834276185,396100000 +2017-11-21,5.338667869567871,5.350281945937201,5.297896061091217,5.3297723222342634,399176000 +2017-11-22,5.3146820068359375,5.365868117031924,5.282041711776382,5.365868117031924,356640000 +2017-11-24,5.364878177642822,5.365867677591191,5.306521262670689,5.3310017177803495,180752000 +2017-11-27,5.295147895812988,5.3747705876969984,5.291933199371897,5.3735344199487445,422896000 +2017-11-28,5.210331916809082,5.309736583962597,5.149255048882335,5.300340106463122,512752000 +2017-11-29,4.85697603225708,5.195742548354368,4.728640046784727,5.193022602347227,1396788000 +2017-11-30,4.963056564331055,5.011769866303854,4.862663346942954,4.925718267605678,823768000 +2017-12-01,4.888132572174072,4.948715160383721,4.7593023077166645,4.928438427370283,811548000 +2017-12-04,4.615637302398682,4.9529206323014305,4.5622259766404385,4.946738377228059,1240844000 +2017-12-05,4.6423420906066895,4.764990593975638,4.465293242976571,4.510297108398841,981488000 +2017-12-06,4.679926872253418,4.701686910358582,4.570630988465173,4.591896748226834,467032000 +2017-12-07,4.747432231903076,4.7872438020782555,4.701191742356513,4.746690342814147,542600000 +2017-12-08,4.735069751739502,4.816423356338265,4.726662302332996,4.797382789750694,466876000 +2017-12-11,4.813455581665039,4.816423138563607,4.733338619998979,4.749164017992392,372748000 +2017-12-12,4.718996047973633,4.793178831563081,4.695505092572108,4.7699350153313596,455016000 +2017-12-13,4.603766441345215,4.761280417830315,4.596348020775363,4.760044250221848,554280000 +2017-12-14,4.610937118530273,4.681905211192046,4.564696622084144,4.597336917029686,438164000 +2017-12-15,4.736799716949463,4.757076447130137,4.589918407636639,4.654951850396986,670036000 +2017-12-18,4.89357328414917,4.896540369571262,4.747680972336152,4.777353713115915,477704000 +2017-12-19,4.849310874938965,4.889369594079418,4.820874301640144,4.884176840824148,373100000 +2017-12-20,4.866372585296631,4.897776241922263,4.810735610139797,4.8886273753593645,288820000 +2017-12-21,4.843871593475342,4.894810103972342,4.835464142866382,4.869835363026742,300904000 +2017-12-22,4.82853889465332,4.8379353708004915,4.7291342418057365,4.807025996671043,466276000 +2017-12-26,4.882198333740234,4.889863894051759,4.743229691287104,4.77315004325922,355080000 +2017-12-27,4.875521659851074,4.944758839848784,4.854256368935231,4.868845599859197,329488000 +2017-12-28,4.8812079429626465,4.930168376623679,4.875026162924353,4.899259004792629,240248000 +2017-12-29,4.784772872924805,4.90742138379669,4.784772872924805,4.90742138379669,279964000 +2018-01-02,4.929427146911621,4.933136592742436,4.809499088880617,4.841149882372587,355616000 +2018-01-03,5.253851890563965,5.28426698740037,5.03822815348775,5.046882740805515,914704000 +2018-01-04,5.2815470695495605,5.391831990949807,5.259292279587528,5.335205987634807,583268000 +2018-01-05,5.326303005218506,5.363641295002851,5.219479944244544,5.296382662580423,580124000 +2018-01-08,5.489506244659424,5.563688570273852,5.404937940684841,5.449942274779766,881216000 +2018-01-09,5.488021373748779,5.534509005522464,5.40642064315888,5.494945043517642,497000000 +2018-01-10,5.531048774719238,5.534510610607651,5.341141607692441,5.395541953316022,582664000 +2018-01-11,5.5409393310546875,5.595092530864461,5.519425957343691,5.563688400804682,406032000 +2018-01-12,5.513739109039307,5.563441446562578,5.473186110545603,5.52907022994735,359916000 +2018-01-16,5.442769527435303,5.625752956774508,5.358201717868411,5.540196118972857,702348000 +2018-01-17,5.556765556335449,5.566656314155299,5.36339654814157,5.457360869809156,538408000 +2018-01-18,5.54984188079834,5.604242227871959,5.5063213201555765,5.537477843981758,408632000 +2018-01-19,5.690046310424805,5.714279160589362,5.613144034872421,5.640096831453852,609380000 +2018-01-22,5.778571128845215,5.7803020468328015,5.640344357442486,5.697959401160642,550944000 +2018-01-23,5.90764856338501,5.930397634663795,5.813436638514121,5.831981984779269,475228000 +2018-01-24,5.830745220184326,5.946717175925777,5.775108243804384,5.910862183187626,579972000 +2018-01-25,5.844345569610596,5.928419120116247,5.829509199415394,5.885145705557327,409884000 +2018-01-26,6.016941070556641,6.017188209660773,5.8752525433692275,5.888110851376799,516356000 +2018-01-29,6.1039838790893555,6.135140868143911,5.949684598815924,6.0023540170610215,455116000 +2018-01-30,6.001858711242676,6.093350669826824,5.895283245374639,5.962047609343641,570832000 +2018-01-31,6.0780205726623535,6.16382504325658,6.044638385070621,6.0772786833861305,478576000 +2018-02-01,5.946963787078857,6.105220113800898,5.886628813074644,5.898003346539769,519224000 +2018-02-02,5.774366855621338,5.884404650294186,5.716257538928636,5.860418939987758,718464000 +2018-02-05,5.284267902374268,5.767195844883345,5.069138406386627,5.613143692313274,1165204000 +2018-02-06,5.578030586242676,5.580997671705138,5.044410806966556,5.054302035120864,1114800000 +2018-02-07,5.657652378082275,5.810221212252587,5.605724849094463,5.676940082877521,802932000 +2018-02-08,5.378727436065674,5.816403944476759,5.378479825192144,5.783269364840672,1144000000 +2018-02-09,5.7387590408325195,5.907153278806874,5.37872674561961,5.891327880361345,1674604000 +2018-02-12,5.638611316680908,5.822831386662946,5.564429010386166,5.819863830292979,1093172000 +2018-02-13,5.752359390258789,5.798599890767439,5.569870195226973,5.602263353831807,625524000 +2018-02-14,5.969714641571045,5.998645967425087,5.700926673530473,5.712054070271278,744988000 +2018-02-15,6.095330238342285,6.141570743264873,5.972187456343108,6.053046319329772,698900000 +2018-02-16,6.0295538902282715,6.1818751002699495,6.020404552835836,6.06812882481201,637656000 +2018-02-20,6.159126281738281,6.228115844616961,6.048346615162287,6.052056061086709,686240000 +2018-02-21,5.971938610076904,6.230588628403107,5.968229635805804,6.223664958222568,892292000 +2018-02-22,5.991487503051758,6.0775926064209,5.925919032211783,6.005838510924252,534364000 +2018-02-23,6.085014343261719,6.085014343261719,6.000641251642441,6.051364118117525,415300000 +2018-02-26,6.101096153259277,6.135736014759475,6.038743930626205,6.131282385699838,469312000 +2018-02-27,6.088230133056641,6.158747266903938,6.065219164596439,6.074373715883196,455436000 +2018-02-28,5.98777437210083,6.138705549196051,5.976145004916738,6.099116997308836,523116000 +2018-03-01,5.745543003082275,6.039488281590964,5.644344549107937,5.985548713719279,1040120000 +2018-03-02,5.852678298950195,5.859111686774587,5.4892055729230735,5.637910179972821,913428000 +2018-03-05,5.830657482147217,5.87024603662688,5.678983472948252,5.8024505308955785,620776000 +2018-03-06,5.991733551025391,6.01103324338659,5.8729678833341135,5.916020426073882,636808000 +2018-03-07,5.983816623687744,6.036024197069715,5.887566859383961,5.888803795427659,581208000 +2018-03-08,5.967485427856445,6.0112803193301945,5.9231954788803955,6.0112803193301945,411912000 +2018-03-09,6.070169448852539,6.083035282591159,5.998909946051459,6.014992474191167,505524000 +2018-03-12,6.17978048324585,6.25994725184309,6.103324994918987,6.111490377833288,605060000 +2018-03-13,6.129055976867676,6.297060266597797,6.0877354314857275,6.222584084642584,619772000 +2018-03-14,6.154540538787842,6.199325065214888,6.092188317239327,6.1721077619766,505496000 +2018-03-15,6.169388771057129,6.250545186221125,6.127325862533631,6.168151834894488,401952000 +2018-03-16,6.197594165802002,6.216646092657637,6.148108236987829,6.185717505131977,399456000 +2018-03-19,5.9630327224731445,6.169635493640484,5.864061320957867,6.1406866595544685,713772000 +2018-03-20,6.1753249168396,6.214171116882688,5.966000091639307,5.966000091639307,554696000 +2018-03-21,6.150086879730225,6.235202303185911,6.1196528832909225,6.1688910384593525,438688000 +2018-03-22,5.984062194824219,6.13326183998283,5.946700696313178,6.086745318424108,551196000 +2018-03-23,5.764348030090332,6.000147418959587,5.753213717033503,5.997673074732191,735620000 +2018-03-26,6.049138069152832,6.05037500525246,5.836844250717034,5.888804061693365,611424000 +2018-03-27,5.58001184463501,6.185717268211936,5.439719916684064,6.130045718411473,1409000000 +2018-03-28,5.476833343505859,5.675765721925892,5.369202010555978,5.545618479498279,945904000 +2018-03-29,5.730201244354248,5.826945577141952,5.460751221889714,5.5451243087033655,916628000 +2018-04-02,5.469411373138428,5.805914560642204,5.381574296731509,5.659684295155108,922092000 +2018-04-03,5.575805187225342,5.699519525476505,5.47683381101096,5.636425420618821,667432000 +2018-04-04,5.597826957702637,5.608218917635553,5.294974003307055,5.319964260088515,789168000 +2018-04-05,5.477576732635498,5.669333882542056,5.406069947155247,5.656220285909689,701240000 +2018-04-06,5.301159858703613,5.483020109367171,5.271963263726679,5.374893696449812,662988000 +2018-04-09,5.329861640930176,5.492174899783266,5.309819599378557,5.364254214635455,499524000 +2018-04-10,5.6391472816467285,5.666116823463304,5.503061220984124,5.560217470287627,761676000 +2018-04-11,5.597826957702637,5.665622461978892,5.565166377361246,5.624301915026737,460244000 +2018-04-12,5.804676055908203,5.822491043769342,5.646569159480785,5.690859100427357,593920000 +2018-04-13,5.727972507476807,5.87667706783528,5.679724001674438,5.868264396521526,503036000 +2018-04-16,5.72772741317749,5.76113034661501,5.633456943604899,5.734655387051984,350792000 +2018-04-17,5.877420902252197,5.898699878616189,5.724262674850572,5.779934223272101,447224000 +2018-04-18,5.848471641540527,5.919731129606942,5.759397635407083,5.826945372265562,391364000 +2018-04-19,5.667107105255127,5.76756319722322,5.611683314890839,5.734160264166391,471996000 +2018-04-20,5.658942222595215,5.742820258868323,5.627766340366245,5.658447165064816,386200000 +2018-04-23,5.539433002471924,5.727973427605727,5.513453106240779,5.676755985311859,427508000 +2018-04-24,5.473124027252197,5.661169457471036,5.40780285391034,5.565167455876372,414596000 +2018-04-25,5.360790729522705,5.482525803034803,5.203426143140118,5.443431831258896,588492000 +2018-04-26,5.57258939743042,5.580754779157977,5.456545363308885,5.522608879730808,375824000 +2018-04-27,5.600053310394287,5.6982828121632085,5.557743122100233,5.67848853614771,400848000 +2018-04-30,5.564671993255615,5.666117733200139,5.545372771597006,5.616384506398466,327844000 +2018-05-01,5.6200947761535645,5.622816412138187,5.49786467412805,5.556505617866769,253788000 +2018-05-02,5.599559307098389,5.6611687203422845,5.573331640885994,5.616631948626047,268248000 +2018-05-03,5.764841556549072,5.791069222994096,5.586197994777888,5.631477589147079,443144000 +2018-05-04,5.9150309562683105,5.918247650411557,5.718820164455491,5.736140099176317,400660000 +2018-05-07,6.15305757522583,6.210213833772443,6.009796225611137,6.019693601194193,687616000 +2018-05-08,6.195614814758301,6.198336451147336,6.1043132817720185,6.153304152573014,506616000 +2018-05-09,6.328731536865234,6.330958587878234,6.188439593299769,6.215656903327681,596760000 +2018-05-10,6.436363220214844,6.4455177729910345,6.363866316728916,6.381681308622328,994080000 +2018-05-11,6.297802925109863,6.427950672094029,6.199079297268362,6.254503088337275,1214456000 +2018-05-14,6.318340301513672,6.3957859031986235,6.294587447645033,6.335908003034804,523140000 +2018-05-15,6.075860023498535,6.2574730039337565,5.975403921997549,6.254750895170489,963528000 +2018-05-16,6.086993217468262,6.149097683316127,6.000393080780603,6.037259997461729,553828000 +2018-05-17,6.129055976867676,6.222831377412699,6.072642077718933,6.088725074498952,519784000 +2018-05-18,6.085261344909668,6.244357910372381,6.080312657701838,6.181016507456749,483716000 +2018-05-21,6.043198585510254,6.1864599214987495,5.950412821942144,6.182748641974521,640624000 +2018-05-22,6.005093574523926,6.081796325489098,5.944473346354016,6.056558780107261,518264000 +2018-05-23,6.128636837005615,6.129875009851797,5.948149769558059,5.9488925788208515,442956000 +2018-05-24,6.132350921630859,6.174687747562662,6.071693669406307,6.124923772833757,437372000 +2018-05-25,6.171717643737793,6.188058035206896,6.1093273157056025,6.144978864263325,292112000 +2018-05-29,6.154633045196533,6.222718387710708,6.107840309798214,6.153642790214898,352684000 +2018-05-30,6.2635698318481445,6.272235154201632,6.1635469839823696,6.188305250231472,390996000 +2018-05-31,6.2437615394592285,6.318283762752327,6.2209842620937765,6.231630091610855,493868000 +2018-06-01,6.378199577331543,6.384389497647403,6.279909800524736,6.288575122297395,421968000 +2018-06-04,6.557202339172363,6.579236814928269,6.380181362581354,6.4123667800412285,642024000 +2018-06-05,6.562649250030518,6.600281780721255,6.515608586667097,6.560420821677238,391712000 +2018-06-06,6.564630031585693,6.567848715265154,6.456189291740624,6.472529683665562,371356000 +2018-06-07,6.508923530578613,6.572799469654841,6.4185557888160005,6.560915464193068,369448000 +2018-06-08,6.49357271194458,6.53615650943322,6.417317411787521,6.4361336730817795,360456000 +2018-06-11,6.4524736404418945,6.52253901601607,6.439599382091125,6.480945476217229,265372000 +2018-06-12,6.501001834869385,6.513133288452255,6.428708004900184,6.478967356253958,319160000 +2018-06-13,6.496543884277344,6.577503018722547,6.487383198744613,6.502485886754706,338208000 +2018-06-14,6.608204364776611,6.664900607157869,6.52674985340261,6.541605098133078,430016000 +2018-06-15,6.567351818084717,6.622314984655343,6.520063718067396,6.551011429975196,432260000 +2018-06-18,6.563143730163574,6.580721819982403,6.496049109552172,6.523282776485916,356268000 +2018-06-19,6.441333770751953,6.527244659313467,6.313829333838904,6.459902116741175,594932000 +2018-06-20,6.494317054748535,6.547299250375095,6.444057706791546,6.482433047732857,369780000 +2018-06-21,6.365574359893799,6.5445758558810185,6.357899291793022,6.526254954071764,359516000 +2018-06-22,6.213063716888428,6.399740752948227,6.197714052932373,6.386371127169921,434160000 +2018-06-25,5.9201741218566895,6.110316791776821,5.831539917142806,6.106603217169773,665816000 +2018-06-26,5.99122953414917,6.081844717769245,5.939732494156797,6.033566360832552,478884000 +2018-06-27,5.835996150970459,6.101155948923864,5.830549039832331,6.03480413800863,453892000 +2018-06-28,5.963253498077393,5.97513750390956,5.818417944362928,5.826093011786842,338012000 +2018-06-29,5.86521053314209,6.040993311313982,5.863972360211521,6.02836696965969,392300000 +2018-07-02,5.997419834136963,6.001133408836473,5.775091271337971,5.7956405994946225,357572000 +2018-07-03,5.863725185394287,6.038022825215759,5.855307309086149,6.032080822658521,222732000 +2018-07-05,6.009551048278809,6.01450232360777,5.880065635877546,5.918935862501563,306216000 +2018-07-06,6.123438358306885,6.13185623463385,5.9637480427013205,5.985040179226989,296352000 +2018-07-09,6.170973777770996,6.207368601783479,6.092243071748847,6.197713024892258,303880000 +2018-07-10,6.2700090408325195,6.2920435217674155,6.142999461263939,6.183355319608493,360016000 +2018-07-11,6.128390312194824,6.211825324475516,6.117744007461156,6.17716403516741,367508000 +2018-07-12,6.219995498657227,6.268026413919594,6.1637946244425805,6.173698120144979,345508000 +2018-07-13,6.172707557678223,6.238564483629255,6.130618644268097,6.238564483629255,246988000 +2018-07-16,6.144978046417236,6.197960706823715,6.13259914964639,6.144978046417236,197036000 +2018-07-17,6.280901908874512,6.296004601120178,6.070209860329813,6.09571094177095,362136000 +2018-07-18,6.231630802154541,6.287336773684666,6.180629131801741,6.273472260277092,277640000 +2018-07-19,6.239801406860352,6.273472911171791,6.197712970920293,6.212815186495634,235752000 +2018-07-20,6.211578369140625,6.2761971231198626,6.2006846178303485,6.2373268924378715,222352000 +2018-07-23,6.174935340881348,6.1868193459103535,6.02316753939255,6.1850862815196495,301584000 +2018-07-24,6.157604694366455,6.309619941496792,6.140026132536312,6.222966249773674,354620000 +2018-07-25,6.235840797424316,6.248467612372678,6.109078700955551,6.167013110063025,319112000 +2018-07-26,6.309373378753662,6.346263102502815,6.1989521254899005,6.21578788159411,325124000 +2018-07-27,6.239554405212402,6.35294687795857,6.185581488417233,6.346014620042186,295420000 +2018-07-30,6.044212818145752,6.259609131637959,6.009303609004274,6.253667128545268,340340000 +2018-07-31,6.062285423278809,6.137055106803109,5.994943360635259,6.033813584906176,283988000 +2018-08-01,6.102146625518799,6.148939839829609,6.03827068394019,6.093729220859545,283556000 +2018-08-02,6.204894065856934,6.208855086858804,5.971919636150451,6.0308438374634505,269668000 +2018-08-03,6.24153470993042,6.265302720418206,6.2125679784011485,6.229403258976132,214288000 +2018-08-06,6.289316654205322,6.292782782210383,6.182361577349431,6.228906859767254,207508000 +2018-08-07,6.361612319946289,6.3801811381283375,6.3113534491076875,6.338092226177068,258132000 +2018-08-08,6.398007869720459,6.443068027665095,6.327942466772266,6.362851681474033,262100000 +2018-08-09,6.349480628967285,6.4185557611067585,6.3418055618157165,6.415832441580327,204280000 +2018-08-10,6.308135032653809,6.340568368301257,6.256390540837833,6.267531737773424,256396000 +2018-08-13,6.341063022613525,6.461883119801381,6.315067054810953,6.316800119331125,375208000 +2018-08-14,6.472528457641602,6.486640890672755,6.363344928996258,6.446532491827146,466220000 +2018-08-15,6.4143476486206055,6.527244761793485,6.3356164626051905,6.493325808138851,591136000 +2018-08-16,6.373743534088135,6.486641113313834,6.313581169867081,6.48416523950015,801260000 +2018-08-17,6.061294078826904,6.263073257019428,6.034307391701274,6.262330447842404,1143188000 +2018-08-20,6.136065483093262,6.2687691120216,5.910270790668883,6.020692499111759,854388000 +2018-08-21,6.271740913391113,6.27619729788883,6.1325999054169715,6.1524064260260305,673988000 +2018-08-22,6.5069427490234375,6.511894496822788,6.235593486319353,6.239059615333967,749856000 +2018-08-23,6.606470108032227,6.6718316619333,6.454454864404823,6.468319379205098,720684000 +2018-08-24,6.7396697998046875,6.7542771254693905,6.610432297032093,6.614888681226894,531512000 +2018-08-27,6.830780029296875,6.905054360068318,6.737936879720231,6.769379487708773,505776000 +2018-08-28,6.793147563934326,6.847615847753925,6.673070271577135,6.824838090176259,475384000 +2018-08-29,6.898674964904785,6.923694354837925,6.764659899457396,6.785468048809754,420108000 +2018-08-30,6.881831169128418,6.978688773938898,6.84492126688502,6.8674634325045565,346608000 +2018-08-31,6.9529242515563965,6.965805553007864,6.851855433250143,6.861764344743381,306592000 +2018-09-04,7.027736663818359,7.065389308849383,6.911309285846382,6.9397967050889005,391720000 +2018-09-05,6.896939754486084,7.045570119555992,6.815936340180612,7.010146658672871,393156000 +2018-09-06,6.755740642547607,6.8830672177724335,6.722794411638065,6.880589990056118,322796000 +2018-09-07,6.734437942504883,6.860030516912524,6.618753807373963,6.663590546375625,295420000 +2018-09-10,6.8055338859558105,6.8352601550362335,6.71313557942957,6.7569815310213075,220140000 +2018-09-11,6.757723808288574,6.846901658178689,6.738401617949032,6.75920976717396,243112000 +2018-09-12,6.643772602081299,6.7374097309237015,6.488206197719895,6.717839962683944,419092000 +2018-09-13,6.721557140350342,6.812221421772524,6.692326509962645,6.709666634348066,305536000 +2018-09-14,6.8476457595825195,6.913786294233204,6.775064808974244,6.811974709509135,386936000 +2018-09-17,6.785714626312256,6.871177330631392,6.766392911194903,6.8221293547763215,205528000 +2018-09-18,6.713627815246582,6.892479569006768,6.70693982104134,6.789677231233378,299520000 +2018-09-19,6.737410545349121,6.755246303590079,6.645012255438305,6.695051032949413,224860000 +2018-09-20,6.596212387084961,6.657646040442325,6.5422099458977865,6.6152865246301396,430584000 +2018-09-21,6.5261077880859375,6.6536824346148995,6.492913971519654,6.608102477739378,435128000 +2018-09-24,6.581844806671143,6.5853128317606355,6.407947445065165,6.495143706950837,293912000 +2018-09-25,6.648976802825928,6.673996196701069,6.562275694381039,6.647986005912511,280388000 +2018-09-26,6.61206579208374,6.694308064383507,6.596212099161905,6.6539301439147955,268548000 +2018-09-27,6.623956680297852,6.668545843877897,6.592496873704649,6.647242058892301,214428000 +2018-09-28,6.96134614944458,6.983640727469489,6.727996768264487,6.755989017556347,709396000 +2018-10-01,7.167943477630615,7.234826747374432,7.000486540994957,7.03913044944934,622060000 +2018-10-02,7.0966010093688965,7.252166969557371,7.07430642832625,7.140446955755039,383964000 +2018-10-03,7.102792739868164,7.174382874655913,6.99875153533014,7.166951191302164,320552000 +2018-10-04,6.918491363525391,7.0909022600806955,6.841451138351294,7.066626089183661,391220000 +2018-10-05,6.684894561767578,6.955897071068789,6.627424100013318,6.8937202068026355,426636000 +2018-10-08,6.583578109741211,6.717097533781044,6.442627001674914,6.601661448970969,408612000 +2018-10-09,6.577881813049316,6.657646392455683,6.510007268240517,6.563018442957115,273500000 +2018-10-10,6.086162567138672,6.517685975318372,6.083932920071192,6.471857963522835,684940000 +2018-10-11,5.824573993682861,6.132486446434608,5.803022626150192,5.998966527687932,725436000 +2018-10-12,6.107218265533447,6.1815336917811585,5.936541358445349,6.081703713581902,608236000 +2018-10-15,5.830766201019287,6.093841877748437,5.829775404254054,6.093841877748437,449760000 +2018-10-16,6.089630603790283,6.1007778941832935,5.894181886550259,5.943477450852126,408712000 +2018-10-17,6.021013259887695,6.189956639762848,5.971965273307745,6.151807890767561,329668000 +2018-10-18,5.933567047119141,6.128768134233828,5.873124207614196,6.090372288905045,524020000 +2018-10-19,5.676933288574219,6.0083786381403606,5.640519030079795,5.988809340640399,613608000 +2018-10-22,5.727716445922852,5.8292804496938855,5.624914064171543,5.7292028774855925,368844000 +2018-10-23,5.4760355949401855,5.553570995617626,5.368278293439283,5.460429009890786,626436000 +2018-10-24,4.939727306365967,5.484209549060805,4.925855207505325,5.4376387964621,884288000 +2018-10-25,5.14855432510376,5.19586830599114,4.797786683136655,4.842128273109781,951720000 +2018-10-26,4.911983013153076,5.074237428443422,4.783913209754917,4.9124781752553695,664784000 +2018-10-29,4.598126411437988,5.0566508748500105,4.360070089344401,5.0531828494130835,758016000 +2018-10-30,5.028657913208008,5.038566825915497,4.598125767202992,4.621163564013239,807192000 +2018-10-31,5.222620487213135,5.266218851094466,5.053677122474815,5.193389857249629,745772000 +2018-11-01,5.402957916259766,5.412371192595548,5.13245060272311,5.259033962477948,566528000 +2018-11-02,5.323936939239502,5.499320720466473,5.207261999487489,5.393545489895391,452960000 +2018-11-05,5.245905876159668,5.334093400860997,5.085137410995759,5.310807551276593,379332000 +2018-11-06,5.2283172607421875,5.322201968480358,5.191159318287993,5.237978117887818,299012000 +2018-11-07,5.295945167541504,5.385618659787968,5.231291067234252,5.294954370704752,483812000 +2018-11-08,5.102725982666016,5.237483799491122,5.049218702179946,5.2367405837573315,511352000 +2018-11-09,5.094799518585205,5.185216239994432,4.980106617383403,5.01379607724619,413240000 +2018-11-12,4.6952314376831055,5.025438476300748,4.6734320164013035,5.003391473919815,617116000 +2018-11-13,4.93725061416626,5.058631964852557,4.78688621236767,4.793079519302232,644712000 +2018-11-14,4.884734153747559,5.124772023676531,4.77672975119814,5.110404289983636,526580000 +2018-11-15,5.013548374176025,5.085634168424886,4.8428709589547,4.8787900655195555,840708000 +2018-11-16,4.073212146759033,4.227539687409006,4.0033555597079005,4.045715535734159,1963520000 +2018-11-19,3.584467887878418,4.008559464210536,3.5827338750682705,4.007816720848805,1697820000 +2018-11-20,3.692966938018799,3.8212843232360005,3.302317110776272,3.3208958481062703,1692032000 +2018-11-21,3.5847151279449463,3.8470476170089585,3.557466324057746,3.8302028889927886,1025496000 +2018-11-23,3.5918986797332764,3.7056007610163793,3.537153259438614,3.5500345625951795,411968000 +2018-11-26,3.7913107872009277,3.8017148614039744,3.63054232668543,3.7130321771378147,814832000 +2018-11-27,3.8081557750701904,3.8894070171134008,3.72938176121987,3.7653006250508363,738060000 +2018-11-28,3.9652085304260254,3.970410568051565,3.7932927627349775,3.9258214041280914,804524000 +2018-11-29,3.901977300643921,4.004634702115506,3.871725634613067,3.96744004627284,549172000 +2018-11-30,4.052492618560791,4.063154933317636,3.8613113651870243,3.911648283689885,729564000 +2018-12-03,4.216398239135742,4.331454212778633,4.1494475525860635,4.279877429625327,890804000 +2018-12-04,3.8957786560058594,4.17672288832911,3.8806525850144715,4.171763474270711,812112000 +2018-12-06,3.9250378608703613,3.9299970375968476,3.7395600163341665,3.7551817422676783,692308000 +2018-12-07,3.6602113246917725,3.9394200179446996,3.6108664367261767,3.9292533620284655,681676000 +2018-12-10,3.7655961513519287,3.7903927439248406,3.6116098269958217,3.6153293868251084,629472000 +2018-12-11,3.674593687057495,3.8655266292364314,3.595492785243797,3.857343785479079,671912000 +2018-12-12,3.6921987533569336,3.7884090532190964,3.591029040229565,3.680296350702711,654136000 +2018-12-13,3.691950559616089,3.8032869241757226,3.655995760605997,3.7390640380845523,471384000 +2018-12-14,3.63144850730896,3.734105934970235,3.607891759810681,3.650293668829668,471820000 +2018-12-17,3.5602810382843018,3.6736009762459734,3.5022571834393594,3.6014433146691864,662868000 +2018-12-18,3.6435980796813965,3.727658159383367,3.5768954757792177,3.604171542961444,564372000 +2018-12-19,3.434563398361206,3.6634351915936723,3.382986629578919,3.6098746099821173,745364000 +2018-12-20,3.3500072956085205,3.516143868933268,3.290247685511563,3.426132592355907,749588000 +2018-12-21,3.2128825187683105,3.4095188228315685,3.185358388045778,3.376539384427769,863740000 +2018-12-24,3.151139497756958,3.223049343600206,3.0871644303403585,3.1365095578945557,463840000 +2018-12-26,3.3004138469696045,3.3014056349580083,3.0861720339381256,3.197260328885302,695100000 +2018-12-27,3.252556324005127,3.2825601563900175,3.1040253169790657,3.2480930416990343,637044000 +2018-12-28,3.314052104949951,3.4067911493899627,3.2312318873392365,3.273137890190489,628728000 +2018-12-31,3.310333013534546,3.3899295707126145,3.2795852157540843,3.357446261888724,465140000 +2019-01-02,3.377779006958008,3.433819052704614,3.2247847018464455,3.2394146399426385,508752000 +2019-01-03,3.17370343208313,3.3514943081669855,3.166264549585953,3.317523088243537,705552000 +2019-01-04,3.377035617828369,3.4152220633267434,3.216106282869077,3.2468538441957744,585620000 +2019-01-07,3.5558183193206787,3.5927651478264973,3.3829865806392716,3.4343155198740223,709160000 +2019-01-08,3.467294454574585,3.639630285844697,3.394640656623528,3.6373984079374995,786016000 +2019-01-09,3.535485029220581,3.5828463399884547,3.4680384722945203,3.5186232126306787,617260000 +2019-01-10,3.6011953353881836,3.6098740718264133,3.4556399190383114,3.516143481815704,523156000 +2019-01-11,3.690462827682495,3.713275607348856,3.5511064431715487,3.578878399385643,874764000 +2019-01-14,3.7303860187530518,3.7556785117395286,3.614586341991023,3.638143087246952,730168000 +2019-01-15,3.7162511348724365,3.80254283881734,3.697901638107247,3.7631163100631744,617012000 +2019-01-16,3.6907103061676025,3.77650610965775,3.6852552361306112,3.7435269147835166,470104000 +2019-01-17,3.76212477684021,3.802047202295177,3.630455334301824,3.657731634298138,493436000 +2019-01-18,3.89131498336792,3.91735143319712,3.7603894842803807,3.8119662533701066,651336000 +2019-01-22,3.6889755725860596,3.872717696216375,3.6587239044189133,3.861063357283856,661552000 +2019-01-23,3.701869487762451,3.833043043729244,3.6706260337428103,3.7442716222606327,591020000 +2019-01-24,3.9138801097869873,3.931485414933362,3.7817147514353553,3.786426100221504,708972000 +2019-01-25,3.971160411834717,3.9892618504439503,3.75171150642432,3.854368934828867,1154572000 +2019-01-28,3.4221646785736084,3.512175947568544,3.248341407112656,3.3859618133649354,2511528000 +2019-01-29,3.2632195949554443,3.424396998340246,3.248589655128127,3.3760436590858713,1153932000 +2019-01-30,3.4067914485931396,3.4211733230985906,3.259748091328944,3.3393448863930435,974228000 +2019-01-31,3.5644969940185547,3.6002039684535703,3.3817466675153294,3.403567662025022,842852000 +2019-02-01,3.5887975692749023,3.639878443900059,3.53548528949638,3.5830944325555603,625048000 +2019-02-04,3.699141502380371,3.7363361535411936,3.582597899477129,3.604666719526475,528592000 +2019-02-05,3.7182350158691406,3.754933775932104,3.677320801767023,3.7110439611245734,542424000 +2019-02-06,3.7938644886016846,3.8583354443589557,3.74600728407035,3.7514623550728396,702464000 +2019-02-07,3.6554996967315674,3.7497264189078314,3.612601907792327,3.747494777566621,637120000 +2019-02-08,3.674097776412964,3.6847600905958267,3.5739198389192794,3.5883017135125006,461604000 +2019-02-11,3.63144850730896,3.6842649037025814,3.5830951586042907,3.6299605882680606,495180000 +2019-02-12,3.7484865188598633,3.764108481009168,3.655499651139106,3.6698817600081273,591060000 +2019-02-13,3.790888547897339,3.864038234124336,3.7643562086631985,3.7779943579021453,605372000 +2019-02-14,3.8318026065826416,3.860070691941564,3.7467505217530412,3.789896609005559,827264000 +2019-02-15,3.9014813899993896,4.06340226945263,3.8786686079384642,4.040589723869558,1516748000 +2019-02-19,3.8841230869293213,3.9647118894231745,3.871725027909791,3.890818246900347,551892000 +2019-02-20,3.9314846992492676,3.998683187065061,3.9022250601115305,3.9133832668076223,540988000 +2019-02-21,3.862550735473633,3.9686796309901333,3.8479207966380438,3.944131338056296,448548000 +2019-02-22,3.947354793548584,3.966200186710098,3.9007374411830313,3.9143755919937884,401740000 +2019-02-25,3.934957265853882,4.0983660865468865,3.9262782909486287,4.030919755638271,656020000 +2019-02-26,3.8955304622650146,3.9862857028314913,3.862055127908238,3.930245650095509,488464000 +2019-02-27,3.853623867034912,3.9076800986647706,3.7965917983401463,3.881147995106965,500256000 +2019-02-28,3.829050064086914,3.8697583606252812,3.806710413731775,3.8474184735485815,324944000 +2019-03-01,3.883410930633545,3.925608209742704,3.8206110620456695,3.8789428107662443,357188000 +2019-03-04,3.891602039337158,3.944721176517837,3.8350075927558707,3.9218848831749247,409992000 +2019-03-05,3.885148763656616,3.923374567696612,3.8216041641193343,3.875964439002518,362924000 +2019-03-06,3.774193525314331,3.8846515966987245,3.7714631787438155,3.876212236061873,403524000 +2019-03-07,3.704939603805542,3.76029291359263,3.6587706166466516,3.750612185877795,450104000 +2019-03-08,3.739194393157959,3.7498679317152694,3.5942334463017036,3.615580523416325,422416000 +2019-03-11,3.9998252391815186,4.02266129048305,3.715612651446258,3.762774679277292,859728000 +2019-03-12,4.034080505371094,4.080497342102679,3.9514227815646,4.027626528786553,579576000 +2019-03-13,4.185494899749756,4.214784932972589,4.064114968162611,4.071561755292246,768900000 +2019-03-14,4.109539985656738,4.206594420949702,4.101845113357063,4.194679749424837,519384000 +2019-03-15,4.215034008026123,4.257727695191285,4.149255230581031,4.152730303646139,661484000 +2019-03-18,4.193686008453369,4.300420913134458,4.166629682568827,4.246556818989251,486992000 +2019-03-19,4.361483573913574,4.4059152695797685,4.271379761446527,4.288258484298324,854972000 +2019-03-20,4.328965663909912,4.443891592846721,4.294214471877571,4.390524147331407,719148000 +2019-03-21,4.565768718719482,4.592080321323037,4.347086751867949,4.352051276652491,824312000 +2019-03-22,4.405915260314941,4.587116168662094,4.392014968545097,4.53846514746764,747644000 +2019-03-25,4.313578128814697,4.429496927022115,4.247303172038223,4.3652080647820375,525212000 +2019-03-26,4.390276908874512,4.511408278972324,4.33393054894447,4.455310476682251,703508000 +2019-03-27,4.381092548370361,4.462260583700479,4.311591098396251,4.415843746800536,474372000 +2019-03-28,4.3997087478637695,4.465487033207768,4.346589383127301,4.407155060352184,480264000 +2019-03-29,4.457048416137695,4.481374399479685,4.416092268126456,4.466480824345446,456896000 +2019-04-01,4.524564743041992,4.5548475884213175,4.477154617603219,4.548890253033545,483824000 +2019-04-02,4.542435646057129,4.586867334364161,4.505699301942221,4.548641538247996,440920000 +2019-04-03,4.681935787200928,4.741012492657299,4.587115546816644,4.592080071330917,783504000 +2019-04-04,4.672998905181885,4.715444490717065,4.610199058067856,4.666544930166932,457376000 +2019-04-05,4.739772796630859,4.757148638559663,4.679703733215672,4.716192007035265,481744000 +2019-04-08,4.760622024536133,4.785692257812176,4.685162767072555,4.709240190136148,424192000 +2019-04-09,4.697822570800781,4.738282549493832,4.655625055724161,4.727112605107575,439972000 +2019-04-10,4.768317222595215,4.794132186225443,4.692610341672005,4.697078225099699,444772000 +2019-04-11,4.754415035247803,4.802321786129646,4.705019306112378,4.7707975835812455,374600000 +2019-04-12,4.7164387702941895,4.797110642459718,4.707751088484751,4.793138927871197,471708000 +2019-04-15,4.584634780883789,4.713709619723393,4.544919518693645,4.708745093588807,440092000 +2019-04-16,4.671760082244873,4.690624902412031,4.591088664718836,4.623853779021107,394964000 +2019-04-17,4.648922920227051,4.727608698103153,4.626583031810985,4.706758261832998,351004000 +2019-04-18,4.6243486404418945,4.6896307663251955,4.596548060029767,4.655624766848665,380988000 +2019-04-22,4.678212642669678,4.69385046883139,4.569244027924534,4.600767764441382,279936000 +2019-04-23,4.732820987701416,4.764097113438633,4.681687710760457,4.691368202169138,346856000 +2019-04-24,4.745232105255127,4.785940163102569,4.682432245594799,4.743246011461354,318204000 +2019-04-25,4.639490127563477,4.7273602217936554,4.559811546013233,4.705020335230517,499296000 +2019-04-26,4.420559406280518,4.490061324864115,4.301661750123045,4.485592969011008,868988000 +2019-04-29,4.451341152191162,4.479141744386749,4.356272311682809,4.428504613285267,391920000 +2019-04-30,4.492792129516602,4.51835853225463,4.399957505815495,4.419070405179102,362920000 +2019-05-01,4.4796366691589355,4.5873643960625055,4.479388111507241,4.545166881895001,354280000 +2019-05-02,4.547153472900391,4.588854354107428,4.446127785611975,4.489318119274477,394684000 +2019-05-03,4.542684555053711,4.5655206114381555,4.481125584300073,4.5555920353623955,336824000 +2019-05-06,4.464247703552246,4.476410460092936,4.319038404375974,4.356271400196506,422176000 +2019-05-07,4.296946048736572,4.415843712232229,4.248791202521124,4.415843712232229,555220000 +2019-05-08,4.317051410675049,4.397226628713527,4.257478541617423,4.269393210117564,419168000 +2019-05-09,4.224465847015381,4.257727598053425,4.1055686393655755,4.2480471052276485,660248000 +2019-05-10,4.190460681915283,4.259217902703507,4.0708182507468464,4.193687671317413,569500000 +2019-05-13,3.9330546855926514,4.081490705335074,3.9171685381800976,4.058406091894591,656912000 +2019-05-14,4.022165298461914,4.057412660444303,3.9340468935059416,3.9727690907885997,524880000 +2019-05-15,3.961104154586792,3.997592421631136,3.907240285561639,3.966564848398774,502320000 +2019-05-16,3.9762439727783203,4.018938118528293,3.9131962743562525,3.9556418625143652,781088000 +2019-05-17,3.88539719581604,4.06361969687564,3.8459302568907963,3.9342967811989062,1022068000 +2019-05-20,3.766746997833252,3.841709617370362,3.7419248474577116,3.786604623445056,572064000 +2019-05-21,3.848907947540283,3.8647940957895615,3.788838664001628,3.827561105973948,361848000 +2019-05-22,3.777916669845581,3.836248411290568,3.76699481084029,3.810185368322027,325868000 +2019-05-23,3.656785488128662,3.7156136414344476,3.596964287794492,3.7156136414344476,591844000 +2019-05-24,3.602922201156616,3.7108980327973,3.596220138706413,3.675650657313042,357584000 +2019-05-28,3.5577449798583984,3.653309942814529,3.555759122780061,3.6205448397120326,428356000 +2019-05-29,3.483527421951294,3.5450859198163482,3.4487764584867997,3.5100868721445884,559800000 +2019-05-30,3.456937074661255,3.522542075034952,3.418667412112686,3.4867575078318684,394300000 +2019-05-31,3.3662338256835938,3.47532707370354,3.364494305908508,3.4079825372774497,389720000 +2019-06-03,3.3244850635528564,3.4161828688993725,3.295161597313659,3.3774162284144906,478644000 +2019-06-04,3.553605318069458,3.5588238764849693,3.3664818432010337,3.3885986246274995,641836000 +2019-06-05,3.5108630657196045,3.6328785208222416,3.474581520082958,3.627411357441452,511616000 +2019-06-06,3.572988510131836,3.5975903862162792,3.5126020654707717,3.5150871609116434,408140000 +2019-06-07,3.6157312393188477,3.650024656621171,3.559817775574923,3.5789527265186276,348856000 +2019-06-10,3.688542604446411,3.7571296700661816,3.67189275045146,3.67189275045146,402780000 +2019-06-11,3.7461960315704346,3.7862052197557636,3.7066840521258,3.7484325229364672,383872000 +2019-06-12,3.633126974105835,3.7089207391207837,3.6179682685012025,3.70270799945214,358892000 +2019-06-13,3.6843183040618896,3.702707441931918,3.6375994093569863,3.655243208172432,308080000 +2019-06-14,3.594359874725342,3.615482712929414,3.5496293397574727,3.5911294401018217,394428000 +2019-06-17,3.6040518283843994,3.6410789481356645,3.569758171678047,3.5926205304850263,276040000 +2019-06-18,3.7991273403167725,3.8545435993309813,3.6544981372784355,3.6654322264627153,581920000 +2019-06-19,3.805091142654419,3.845845665409797,3.7789981143238776,3.834414605487586,331644000 +2019-06-20,3.8294448852539062,3.9097116298928856,3.8150317564083283,3.8957954728017374,350168000 +2019-06-21,3.771294355392456,3.8637379605367355,3.7648332495756986,3.814534209391829,434428000 +2019-06-24,3.7936604022979736,3.823232473812125,3.7454505860944267,3.7926664587654617,282948000 +2019-06-25,3.7643368244171143,3.8736786674971815,3.7616033612872335,3.798630482189459,311868000 +2019-06-26,3.9576730728149414,4.018805342032649,3.878897475808426,3.8918196901489974,584072000 +2019-06-27,4.056328296661377,4.07546300952276,4.007372913508341,4.043406085198907,445440000 +2019-06-28,4.081179141998291,4.1095086628184,4.034460482673977,4.10031385657454,397668000 +2019-07-01,4.129388809204102,4.322724783049094,4.091864483451066,4.288431128834214,709756000 +2019-07-02,4.031477451324463,4.133861190389598,4.018306873716316,4.112738118769522,400228000 +2019-07-03,4.044400691986084,4.060553577459751,3.9845114482214714,4.0548378098043925,246636000 +2019-07-05,3.9817774295806885,3.9904750265492153,3.9184086814002925,3.986002044391614,396552000 +2019-07-08,3.906729221343994,3.94102287631561,3.8766604183956743,3.9221365293452566,329788000 +2019-07-09,3.909214973449707,3.9372958942700698,3.8518105838267966,3.864484194058215,342860000 +2019-07-10,3.977552652359009,4.034956790007372,3.9387860186035635,3.952702173184985,452076000 +2019-07-11,4.13212251663208,4.172877042352044,4.013337504586905,4.050612991208622,682560000 +2019-07-12,4.165173530578613,4.236245941139104,4.159954971752688,4.159954971752688,506392000 +2019-07-15,4.156723976135254,4.202448691136602,4.128394929848876,4.186296281162248,289840000 +2019-07-16,4.152003288269043,4.179090028099605,4.096338182271511,4.141814537164038,341444000 +2019-07-17,4.21735954284668,4.224317621198795,4.124418954590809,4.153742420212878,348204000 +2019-07-18,4.229037761688232,4.291909290233416,4.171136423111195,4.227795451187897,442192000 +2019-07-19,4.185800075531006,4.273770487668284,4.179835939624781,4.267309616926987,344896000 +2019-07-22,4.2573676109313965,4.270289821475969,4.199714635118426,4.2071699206576385,315940000 +2019-07-23,4.365220069885254,4.367207957252126,4.280977062430895,4.296633215891825,428176000 +2019-07-24,4.439770221710205,4.445485989290337,4.332416740429885,4.40845886866737,366236000 +2019-07-25,4.308560371398926,4.410944139259118,4.285201039379807,4.398270292722599,392700000 +2019-07-26,4.350557327270508,4.397275987465649,4.335647227502245,4.335647227502245,274160000 +2019-07-29,4.344344139099121,4.360497021120779,4.256125391259245,4.34335019580268,248160000 +2019-07-30,4.3600006103515625,4.372177247432304,4.28346127471765,4.297874640112289,197772000 +2019-07-31,4.192756652832031,4.329434046901546,4.150510981789956,4.328439629620456,359416000 +2019-08-01,4.098326683044434,4.293650584510864,4.04614061476965,4.203195080422546,421212000 +2019-08-02,4.00563383102417,4.074966719270117,3.9581698316967517,4.00563383102417,428348000 +2019-08-05,3.747190237045288,3.823232365948057,3.7002229700783498,3.8219898180715823,589156000 +2019-08-06,3.785956382751465,3.8674656693604224,3.7382437799019708,3.821989557739536,361272000 +2019-08-07,3.8242263793945312,3.836154649633428,3.7076780881558538,3.7250732847610952,372560000 +2019-08-08,3.9328224658966064,3.9340650137381243,3.824474806229006,3.881879189353222,309300000 +2019-08-09,3.8314332962036133,3.8952987927704745,3.780986985978447,3.8918197532371384,341816000 +2019-08-12,3.7635912895202637,3.831432788421026,3.741722874643393,3.7792469653454175,279200000 +2019-08-13,3.8779027462005615,3.92387606605476,3.7230850374128925,3.7621000423066087,351956000 +2019-08-14,3.729297399520874,3.8008665373617525,3.685560809503336,3.789683844762131,419880000 +2019-08-15,3.6969919204711914,3.7680640875982334,3.6626985031530666,3.7481837975894,477200000 +2019-08-16,3.965127944946289,4.01433146424985,3.8985287560977477,3.9599093862778543,1007960000 +2019-08-19,4.2439494132995605,4.259853932231015,4.0622933114203885,4.078446197746273,815112000 +2019-08-20,4.171633720397949,4.238978231752971,4.150510649575913,4.238481023152223,463188000 +2019-08-21,4.25513219833374,4.3103000960193425,4.216117187317563,4.23773700068217,427244000 +2019-08-22,4.261345386505127,4.307318478861628,4.22208153215865,4.264824426207958,303488000 +2019-08-23,4.036696910858154,4.2392277064288795,4.016816619353168,4.184805390659598,568056000 +2019-08-26,4.111497402191162,4.139578561470948,4.073227965103645,4.1154736507386875,318208000 +2019-08-27,4.020792484283447,4.152499225215621,3.9914690215577684,4.1497657624163615,290968000 +2019-08-28,4.010345935821533,4.063080889532141,3.95512342610678,3.9944261467383586,255612000 +2019-08-29,4.154123306274414,4.186460582853173,4.098403100005271,4.101885583243795,357976000 +2019-08-30,4.166808128356934,4.250139565375853,4.148649402752277,4.200389411234471,290616000 +2019-09-03,4.08372688293457,4.127009310490012,4.06084212847083,4.093925719480421,296140000 +2019-09-04,4.197902202606201,4.205364868679219,4.144420948547923,4.144420948547923,227728000 +2019-09-05,4.471028804779053,4.477247454426828,4.298396395666302,4.300137636545782,695676000 +2019-09-06,4.4439167976379395,4.504611642699052,4.405858094235799,4.4476478942215945,376976000 +2019-09-09,4.489934921264648,4.57650024338145,4.473517433795505,4.475010062052532,417524000 +2019-09-10,4.556600093841553,4.583215941480277,4.447398636747331,4.457099771131248,352812000 +2019-09-11,4.585206031799316,4.633463562443223,4.542172225124945,4.571276101213888,361512000 +2019-09-12,4.583713054656982,4.68644675935465,4.575753162707502,4.631721968442757,327840000 +2019-09-13,4.5257568359375,4.55411441110418,4.4819766949194895,4.517050625288023,324592000 +2019-09-16,4.482722282409668,4.517298506082985,4.44018616378373,4.450633614868949,231832000 +2019-09-17,4.504114627838135,4.508343425576275,4.442922078945889,4.489438379612635,223048000 +2019-09-18,4.477000713348389,4.5128209511741915,4.390435850281906,4.497149775045204,258152000 +2019-09-19,4.401381015777588,4.501378586954369,4.390684477269207,4.4829707669921515,245476000 +2019-09-20,4.295661449432373,4.424016573367991,4.285463087720507,4.400385505594887,350244000 +2019-09-23,4.349141597747803,4.3946629545220395,4.29217786709974,4.295909436968199,249712000 +2019-09-24,4.291680812835693,4.4100856882690245,4.256109675014226,4.380484588023852,317268000 +2019-09-25,4.433469772338867,4.453121133503942,4.246409633036903,4.291184694140996,308432000 +2019-09-26,4.411329746246338,4.432473730654292,4.3603360449071165,4.42376752367828,234564000 +2019-09-27,4.272527694702148,4.420285075697802,4.211832384152225,4.36953998717179,362056000 +2019-09-30,4.329988956451416,4.340187792385558,4.267055173771648,4.298397995722028,186184000 +2019-10-01,4.328248023986816,4.502373138090576,4.3235219999826215,4.35312310806632,366008000 +2019-10-02,4.304369926452637,4.318299864796763,4.2319835901690315,4.3063597820866715,293372000 +2019-10-03,4.51008415222168,4.516302804260659,4.2784980772960255,4.308845497786547,450588000 +2019-10-04,4.526501178741455,4.555853668846923,4.447149915282378,4.512322160107603,265524000 +2019-10-07,4.585206031799316,4.684954488078263,4.582718476415822,4.591424683031715,480984000 +2019-10-08,4.408594131469727,4.493417744066732,4.390435401144945,4.493417744066732,444436000 +2019-10-09,4.495159149169922,4.544660704799519,4.4566032190159595,4.485458013318154,292412000 +2019-10-10,4.552870273590088,4.603863995078746,4.487698002124531,4.492921728374219,309124000 +2019-10-11,4.626498699188232,4.709829671336126,4.618041105588354,4.636946147357723,446404000 +2019-10-14,4.6399312019348145,4.660826099501941,4.586698556220997,4.617792289349046,200040000 +2019-10-15,4.884701728820801,4.9573371308885275,4.71629802965673,4.730228438232631,664124000 +2019-10-16,4.830971717834473,4.955595756256816,4.819529340033394,4.850623077711028,428944000 +2019-10-17,4.832961559295654,4.920521337360984,4.778484896092596,4.875497670479628,263436000 +2019-10-18,4.738436698913574,4.866045516567658,4.664060533412796,4.833459151256394,307440000 +2019-10-21,4.87574577331543,4.889178477784607,4.780971951312887,4.799876993071817,261868000 +2019-10-22,4.86579704284668,5.037931834764623,4.858085761716375,4.932710542609813,328720000 +2019-10-23,4.8528618812561035,4.8670404278582104,4.751869390014268,4.783709441008806,279916000 +2019-10-24,4.896889686584473,4.930470498367081,4.860074530882539,4.894153043526431,232020000 +2019-10-25,5.0879292488098145,5.108824143879773,4.969772982153656,4.977484261208425,423092000 +2019-10-28,5.143899440765381,5.1963853057561336,5.102357778187682,5.131710274242045,330792000 +2019-10-29,5.047631740570068,5.1364355213270745,5.028229473069884,5.129967782525233,211236000 +2019-10-30,5.049622058868408,5.080218565482427,4.981464554253025,5.0744971402055,205960000 +2019-10-31,5.000370025634766,5.049622491633122,4.920521524852951,5.028727592322199,209732000 +2019-11-01,5.039423942565918,5.071761217757975,4.939923612384464,4.965047308163988,283640000 +2019-11-04,5.236185550689697,5.248623331181981,5.097383431346628,5.120516801601931,376716000 +2019-11-05,5.214046478271484,5.262054929260456,5.166037552829756,5.235936305060283,300868000 +2019-11-06,5.164793491363525,5.215538106277653,5.077233244131984,5.189917185601682,269012000 +2019-11-07,5.182453632354736,5.266033681521491,5.137678589070667,5.251357438420718,280340000 +2019-11-08,5.1685261726379395,5.2001176158783995,5.127979906243309,5.1655413897375,189100000 +2019-11-11,5.1784749031066895,5.20160826865297,5.081462132826022,5.167778366615428,243436000 +2019-11-12,5.214046478271484,5.2700152975952514,5.18170872734986,5.216782647313489,283504000 +2019-11-13,5.18817663192749,5.210315072662682,5.121760360816376,5.182703819217081,300188000 +2019-11-14,5.2185235023498535,5.2207624447380505,5.137182379036172,5.197130903633725,518080000 +2019-11-15,5.079224109649658,5.268024993429491,4.990917538982779,5.2162849712701425,1053628000 +2019-11-18,5.280461311340332,5.307077154790715,5.068775257355988,5.071760038830307,574588000 +2019-11-19,5.173749923706055,5.2730011910341865,5.1155426240152595,5.249370117652386,414564000 +2019-11-20,5.25309944152832,5.336928116030888,5.13817703517415,5.150863425798844,472588000 +2019-11-21,5.22822380065918,5.304341187341711,5.206582592179884,5.2486214687569115,288388000 +2019-11-22,5.245886325836182,5.29737725806503,5.222254783893122,5.2508609627875344,224100000 +2019-11-25,5.5025954246521,5.507570535449033,5.361056701312303,5.373991704712721,506476000 +2019-11-26,5.397873401641846,5.489661992184072,5.391405660864476,5.484935493238638,385244000 +2019-11-27,5.432722091674805,5.477778973963019,5.406335403339309,5.443426519798096,215784000 +2019-11-29,5.395382881164551,5.4302334079582915,5.3714851057615185,5.401855393170712,141556000 +2019-12-02,5.208932399749756,5.401856208839138,5.193747728555124,5.388413589444422,372036000 +2019-12-03,5.169352054595947,5.1733347009969775,4.987879552169612,5.025219473595006,465232000 +2019-12-04,5.21316385269165,5.275397211411367,5.184536564656922,5.252993164288042,273424000 +2019-12-05,5.196236610412598,5.250752997982738,5.165617524707068,5.235070260095788,184884000 +2019-12-06,5.281620502471924,5.31448018339394,5.255482605514145,5.265440170909214,232236000 +2019-12-09,5.281620502471924,5.336386162539099,5.2500062294285685,5.258718861747828,211880000 +2019-12-10,5.3266777992248535,5.378455999077606,5.258967589908185,5.311741451326898,256388000 +2019-12-11,5.410318374633789,5.415795224748547,5.334642882493308,5.33713227349042,233796000 +2019-12-12,5.577850341796875,5.596022467788937,5.3724805808628355,5.38144200813465,404348000 +2019-12-13,5.575859069824219,5.700076968743973,5.521840284647246,5.58083785159959,454704000 +2019-12-16,5.604735374450684,5.677175085340945,5.595275878618879,5.623405569456365,320976000 +2019-12-17,5.682900428771973,5.705553268306525,5.613945773984214,5.623405269311124,321196000 +2019-12-18,5.713271141052246,5.7737619714608845,5.709288020094192,5.717751855378288,343548000 +2019-12-19,5.861384868621826,5.874827482984003,5.742892629188399,5.747871410419035,445360000 +2019-12-20,5.958719253540039,5.9841102834733535,5.908683583692581,5.927851373179798,603044000 +2019-12-23,5.9450273513793945,6.019458383551702,5.934323397683394,5.987346047660927,355060000 +2019-12-24,5.9400482177734375,5.9572246818426855,5.895240133210659,5.929593061349155,138864000 +2019-12-26,5.9542388916015625,5.982368111010766,5.924615467657204,5.943534461590414,182852000 +2019-12-27,5.896485805511475,5.982865729966805,5.870098639700798,5.969423112990972,254644000 +2019-12-30,5.7832207679748535,5.879807047585535,5.751855296687879,5.874579469037705,258056000 +2019-12-31,5.85740327835083,5.866862774471534,5.728704656657821,5.747872445564755,231004000 +2020-01-02,5.972160339355469,5.972160339355469,5.89275100764334,5.9432842618967605,237536000 +2020-01-03,5.8765716552734375,5.920384087732343,5.827531643498655,5.852425081823098,205384000 +2020-01-06,5.901215076446533,5.906442655101871,5.757082993633497,5.783220886910184,262636000 +2020-01-07,5.972659111022949,6.018462860706855,5.88453666408317,5.929593548989243,314856000 +2020-01-08,5.983860969543457,6.025184004233772,5.928348928870455,5.968427030697477,277108000 +2020-01-09,6.049579620361328,6.122019332386319,5.9958101036344775,6.070241138559637,255112000 +2020-01-10,6.081942081451416,6.18724101832403,6.067753071786166,6.156871200855873,316296000 +2020-01-13,6.2726240158081055,6.2977662482832395,6.142431664640482,6.165084980857148,319840000 +2020-01-14,6.155625343322754,6.255198609471692,6.142431523520895,6.229807106111832,359088000 +2020-01-15,6.113057613372803,6.190724906446036,6.087168515681725,6.168320861336342,263104000 +2020-01-16,6.196699619293213,6.202674063235496,6.1431788952956,6.166578602901696,284192000 +2020-01-17,6.2054123878479,6.22333572006965,6.157866106744991,6.215867546276545,253792000 +2020-01-21,6.172054767608643,6.205660832998418,6.137950634111181,6.1688185119156165,217916000 +2020-01-22,6.22607421875,6.312702949940994,6.1984425915801635,6.2173615862913,239240000 +2020-01-23,6.294530391693115,6.302994226877726,6.177283056528043,6.266152376360802,244516000 +2020-01-24,6.235283374786377,6.45982138950539,6.1810157954848854,6.410034523672277,373512000 +2020-01-27,5.979380130767822,6.0304114566319615,5.780979998993827,5.930588924326334,470536000 +2020-01-28,6.172801971435547,6.205163105735064,5.992075883242663,6.045347807566463,310976000 +2020-01-29,6.112311363220215,6.194459372234449,6.072481579489457,6.158363912642621,258848000 +2020-01-30,6.119030952453613,6.132473567013903,5.9594649525225805,6.014478919082946,290504000 +2020-01-31,5.885530948638916,6.0851755013730155,5.843710329286179,6.073226617328613,370420000 +2020-02-03,5.982616424560547,6.002033008760305,5.861136713178415,5.8673599529961455,255564000 +2020-02-04,6.151890277862549,6.171058538803068,6.074472268619914,6.124507929724017,271544000 +2020-02-05,6.242254257202148,6.283079226385113,6.158861317756116,6.272872865388671,208220000 +2020-02-06,6.329131603240967,6.329131603240967,6.195454676838319,6.276607019674868,218284000 +2020-02-07,6.26291561126709,6.311208752427656,6.237524107776993,6.28905350473973,189752000 +2020-02-10,6.546201705932617,6.546948095887716,6.280589439315649,6.285568221166267,529608000 +2020-02-11,6.668676376342773,6.783434777596909,6.592502820899374,6.654487370839691,638556000 +2020-02-12,6.784431457519531,6.79090396963494,6.682617588464696,6.721451236748671,374644000 +2020-02-13,6.740617275238037,6.807829396126115,6.699045449862739,6.726428271291815,528016000 +2020-02-14,7.213840484619141,7.342787888860641,7.119494805209288,7.150860274532229,1041924000 +2020-02-18,7.382618427276611,7.401039827252744,7.091117506539812,7.11053409323562,620164000 +2020-02-19,7.8339338302612305,7.8516083635339475,7.505093025636607,7.505093025636607,694332000 +2020-02-20,7.684574127197266,7.874261158038431,7.377141231849921,7.785889916597807,810052000 +2020-02-21,7.320383548736572,7.597446607559336,7.235497367865137,7.57230437883561,768180000 +2020-02-24,6.80285120010376,7.016685262573864,6.671414405623686,6.725930781752228,856916000 +2020-02-25,6.5233001708984375,6.940014657612786,6.421486304626946,6.8780301000612285,1055496000 +2020-02-26,6.662703514099121,6.856871772437385,6.52205645930819,6.523549714324081,747732000 +2020-02-27,6.291819095611572,6.6504977486511425,6.199409488033335,6.349107911870958,906416000 +2020-02-28,6.726964473724365,6.786495212665707,6.022560074873698,6.0392484453839925,1133252000 +2020-03-02,6.885383129119873,6.91427696219701,6.501049255802594,6.897090219696459,890744000 +2020-03-03,6.62285041809082,7.000957317371102,6.537415074077582,6.941177613639033,652792000 +2020-03-04,7.08664083480835,7.096105989166216,6.655479133187068,6.7302041110260316,597408000 +2020-03-05,6.807170867919922,7.054011254176982,6.762584919625369,6.887126080116027,540328000 +2020-03-06,6.626584529876709,6.685119013552407,6.426322178123175,6.627580786712856,515412000 +2020-03-09,6.113476753234863,6.461195656847714,5.932643026719614,5.9754849320614145,614160000 +2020-03-10,6.503040790557861,6.503040790557861,6.127175872348924,6.389957305900693,580648000 +2020-03-11,6.13913106918335,6.391451551692772,6.041989127680995,6.363056090692467,499964000 +2020-03-12,5.3878984451293945,5.881330146750417,5.375195101760593,5.615808463862766,816540000 +2020-03-13,5.998898506164551,6.003381900510445,5.470096942020882,5.741347288359107,634836000 +2020-03-16,4.891976356506348,5.63175111220886,4.832196659848322,5.290757088128604,726972000 +2020-03-17,5.411810398101807,5.501231223478114,4.757471536800723,5.004311876934305,833632000 +2020-03-18,5.051887512207031,5.229234097462733,4.500419555917958,4.984137280788348,874268000 +2020-03-19,5.30470609664917,5.3983609069742196,4.817002895403094,5.030466044188625,765512000 +2020-03-20,5.124868392944336,5.736863297109788,5.10942522229221,5.454902147690826,804636000 +2020-03-23,5.297731876373291,5.392134482741824,4.944782258783055,5.1238724206528605,643876000 +2020-03-24,6.2066330909729,6.293314107330515,5.680322405254976,5.70398505471387,1101644000 +2020-03-25,6.117959022521973,6.521472049595183,6.069138633451947,6.321708049869846,793432000 +2020-03-26,6.4073944091796875,6.531437214285928,6.227058561399177,6.325196780085828,696108000 +2020-03-27,6.295058250427246,6.5538546952893775,6.194179730206056,6.227058591970269,638828000 +2020-03-30,6.6153764724731445,6.6245926805334685,6.316477537666162,6.3605651139221555,602252000 +2020-03-31,6.56580924987793,6.859726425112722,6.420095864659736,6.655478550310058,949960000 +2020-04-01,6.054443359375,6.514249459309813,6.009857889253428,6.367789228140478,656912000 +2020-04-02,6.363305568695068,6.376506804819798,6.03551327444498,6.083585879611175,675764000 +2020-04-03,6.075366973876953,6.367291194451505,5.937873523633539,6.3256944931640025,663212000 +2020-04-06,6.685368061065674,6.722232415086235,6.300037574914859,6.357575802632936,727884000 +2020-04-07,6.451979160308838,6.930715589086109,6.408887836296941,6.907052465159574,784520000 +2020-04-08,6.649251937866211,6.674160262941182,6.491084619989947,6.561076780658091,542444000 +2020-04-09,6.549620151519775,6.7979551799719955,6.486602254866638,6.775039840327325,525564000 +2020-04-13,6.721485614776611,6.7302034567472955,6.401414916462178,6.489839013642981,398408000 +2020-04-14,7.072691440582275,7.1068154962349865,6.8221145381760495,6.849762686403946,530948000 +2020-04-15,6.995227336883545,7.078171789754281,6.859228516671217,6.904561298379728,366148000 +2020-04-16,7.340454578399658,7.447560034198243,7.137452863428311,7.1506540987695715,745620000 +2020-04-17,7.2811737060546875,7.44407335910978,7.147167405269901,7.422652171604382,539120000 +2020-04-20,7.149908065795898,7.310566278221043,7.105571537705695,7.154640880780786,449388000 +2020-04-21,6.713016986846924,7.09311633723642,6.653237293047611,7.031842495530036,735160000 +2020-04-22,7.1274895668029785,7.170331940494882,6.859726394032235,6.905308117972619,483356000 +2020-04-23,7.074186325073242,7.301598496548493,7.049029054031035,7.1695851787187115,424160000 +2020-04-24,7.213174343109131,7.215166857112754,6.989249310229326,7.063974286406707,352328000 +2020-04-27,7.3997368812561035,7.559647764396308,7.323019393606737,7.347678772706695,479388000 +2020-04-28,7.257261753082275,7.577083522460443,7.251782102156666,7.5471934376689775,442904000 +2020-04-29,7.434110641479492,7.486916063529084,7.3167927086062665,7.392015576110446,379160000 +2020-04-30,7.280178070068359,7.434110948500849,7.266229521224873,7.380059846645527,375916000 +2020-05-01,7.04355001449585,7.195988277040804,6.995227982233045,7.082655837227171,342096000 +2020-05-04,7.255518913269043,7.269218517045699,6.996224123851713,6.996224123851713,317556000 +2020-05-05,7.3165435791015625,7.479194289752949,7.255518206879686,7.359634900393483,368896000 +2020-05-06,7.417421340942383,7.522285342216522,7.358140014415435,7.396000628885586,323464000 +2020-05-07,7.593771934509277,7.657038766296395,7.505347832309202,7.556658630118783,373732000 +2020-05-08,7.783822059631348,7.790049022261694,7.631632755518658,7.665507869307592,339216000 +2020-05-11,8.035892486572266,8.082719885114322,7.750194806237749,7.778839210396345,469060000 +2020-05-12,7.773859024047852,8.142500745755706,7.764144923731901,8.093680823592695,493060000 +2020-05-13,7.751441955566406,8.048845829380504,7.566871676430131,7.888437040614922,625852000 +2020-05-14,8.001021385192871,8.00650103570767,7.659280087559185,7.812963998295279,602312000 +2020-05-15,8.459583282470703,8.469296907800649,7.845096949660704,7.860789067661687,987660000 +2020-05-18,8.718130111694336,8.883770081893816,8.648636311914329,8.72834257799141,774460000 +2020-05-19,8.773176193237305,9.054140597698307,8.730582765622733,8.757981968752405,717320000 +2020-05-20,8.93707275390625,9.00980473634849,8.85612082032211,8.957995574868523,587536000 +2020-05-21,8.743038177490234,9.019269784718198,8.705426507238712,9.018274002825928,761068000 +2020-05-22,8.99311637878418,9.059621877759398,8.681265611055084,8.792853995602819,1038764000 +2020-05-26,8.685746192932129,9.148043519308391,8.64016447849771,9.123134725764276,770780000 +2020-05-27,8.493955612182617,8.601060122818971,7.967395095749297,8.593339012702568,1175892000 +2020-05-28,8.45584487915039,8.728340357559803,8.348489537594565,8.381368387741542,734896000 +2020-05-29,8.842920303344727,8.842920303344727,8.453853648788746,8.523098503753154,745256000 +2020-06-01,8.773924827575684,8.808298311260515,8.657603613340257,8.80082614530249,389876000 +2020-06-02,8.792855262756348,8.804811298562834,8.626219498349856,8.763962380549906,391320000 +2020-06-03,8.737309455871582,8.833704572769488,8.668064600878465,8.789866411031502,365440000 +2020-06-04,8.73830795288086,8.914488767786045,8.649593471696994,8.699930983185242,424280000 +2020-06-05,8.891310691833496,8.968062702221557,8.67999265362139,8.766214611092508,481748000 +2020-06-08,8.776681900024414,8.861158553658532,8.657815132077493,8.848698945943744,387736000 +2020-06-09,9.016904830932617,9.080450057640956,8.723103574585048,8.771696703654069,468488000 +2020-06-10,9.336625099182129,9.469446785903406,9.124060778733396,9.138265701793136,632180000 +2020-06-11,8.767959594726562,9.23146325009369,8.757742469807551,9.12057113153188,583652000 +2020-06-12,8.90377140045166,9.15770233076544,8.675258754258273,9.133032174458457,570908000 +2020-06-15,9.144247055053711,9.1527198178345,8.71562963502627,8.786900466028952,400004000 +2020-06-16,9.03933334350586,9.23694649746912,8.810322587730733,9.195330819969957,535716000 +2020-06-17,9.20629596710205,9.269093077702948,9.041078537240452,9.084439533349283,408304000 +2020-06-18,9.1883544921875,9.252646909884222,9.085186992478928,9.197325372464938,254408000 +2020-06-19,9.231465339660645,9.414624551280685,9.19757523890359,9.21277640019517,524160000 +2020-06-22,9.496110916137695,9.500596831669908,9.2434262051228,9.270090738006576,398468000 +2020-06-23,9.41960620880127,9.611487193963281,9.377243355891153,9.52028119983212,375108000 +2020-06-24,9.205799102783203,9.525766870379229,9.115091202286816,9.445774215524738,449372000 +2020-06-25,9.459478378295898,9.474430478058899,9.152718403636332,9.32566046007241,376072000 +2020-06-26,9.125555038452148,9.469445701137108,9.095651791881695,9.469445701137108,592084000 +2020-06-29,9.170412063598633,9.174897979179185,8.87137669129066,9.140259752452296,342248000 +2020-06-30,9.467206001281738,9.49561395128113,9.236699879621224,9.284046779822662,367892000 +2020-07-01,9.499351501464844,9.544954986647193,9.382728143062696,9.490131561023686,326648000 +2020-07-02,9.581336975097656,9.706184029572597,9.547445924903947,9.608000558259423,364056000 +2020-07-06,9.807605743408203,9.876882195050138,9.681263389843593,9.710419463836537,315892000 +2020-07-07,9.840002059936523,10.037614299989889,9.819069687770009,9.91426254954942,357800000 +2020-07-08,10.183144569396973,10.192116400758481,9.93345046046877,9.96160934885514,365480000 +2020-07-09,10.475202560424805,10.53600625328091,10.200588280241728,10.346866776450545,494548000 +2020-07-10,10.44554615020752,10.620979734184157,10.3453692760623,10.554693903262878,497676000 +2020-07-13,10.01992130279541,10.75754119269287,9.992758651355837,10.560926145450688,457076000 +2020-07-14,10.3436279296875,10.369295278645593,9.754029883454939,10.042599101327085,542676000 +2020-07-15,10.194356918334961,10.399444692457333,10.023408296319051,10.38075575724131,403984000 +2020-07-16,10.102155685424805,10.173923675334947,9.863674962154512,9.9827907942497,344964000 +2020-07-17,10.168693542480469,10.215542329534061,10.05530983865121,10.192616529615805,266284000 +2020-07-20,10.476945877075195,10.49738012892285,10.124084295904627,10.241206704801446,284852000 +2020-07-21,10.295283317565918,10.52603943669131,10.25366763128037,10.479189706623767,277036000 +2020-07-22,10.405180931091309,10.568404033327852,10.258404288411878,10.334160097615126,367292000 +2020-07-23,10.097172737121582,10.513080531920828,9.998989264473964,10.416392364520581,411660000 +2020-07-24,10.161712646484375,10.331415031399883,9.745555856946444,9.843240245664335,473292000 +2020-07-27,10.387985229492188,10.4081694753929,10.184889869995407,10.199343854779485,292132000 +2020-07-28,10.182646751403809,10.348611377375835,10.176417421816467,10.34088674251749,271636000 +2020-07-29,10.431842803955078,10.482429371286324,10.3137241436091,10.357333253377416,284508000 +2020-07-30,10.579864501953125,10.58883538202943,10.26213925755088,10.341632833422555,308880000 +2020-07-31,10.580610275268555,10.731872772894086,10.399444531154126,10.529275592466844,386080000 +2020-08-03,10.974839210510254,11.063054601918072,10.680787905817526,10.697982487653372,412720000 +2020-08-04,11.191640853881836,11.191640853881836,10.870925928789,11.01446287126139,310336000 +2020-08-05,11.250450134277344,11.335176800869487,11.130338066331815,11.207838217205914,249924000 +2020-08-06,11.299043655395508,11.321471331155298,11.142798052946382,11.313247628235027,244316000 +2020-08-07,11.163480758666992,11.467749194740126,11.002002072323954,11.276117249528186,342516000 +2020-08-10,11.129091262817383,11.371558819486845,10.821583166729399,11.297797410313493,427796000 +2020-08-11,10.815107345581055,11.100935012820099,10.761031095897637,11.038136940705058,354512000 +2020-08-12,11.403458595275879,11.430122179530569,10.923008355606033,10.955404101900573,464412000 +2020-08-13,11.406200408935547,11.684054397814334,11.319231238709497,11.508868860447484,374460000 +2020-08-14,11.526809692382812,11.667106964479247,11.403707004210982,11.49291864273222,366436000 +2020-08-17,12.297325134277344,12.369841267625644,11.77924696419681,11.813137067888281,621300000 +2020-08-18,12.221318244934082,12.45581213323748,12.047379937885205,12.40995959388531,503448000 +2020-08-19,12.099461555480957,12.275393282226384,12.059091168815021,12.25695340371678,622624000 +2020-08-20,12.101953506469727,12.335201151761469,11.840546973679533,11.936487959422175,921388000 +2020-08-21,12.642709732055664,12.767556787011529,12.156029230192898,12.162508569332642,999868000 +2020-08-24,12.679340362548828,12.870972315704087,12.467274157202104,12.842314360697754,490564000 +2020-08-25,12.708993911743164,12.720207273609155,12.533310304318814,12.590127142685079,289076000 +2020-08-26,12.731919288635254,12.827112134281696,12.636975502052307,12.758084749408962,321244000 +2020-08-27,12.587636947631836,12.808674045517998,12.526085128500187,12.740393828304285,317604000 +2020-08-28,13.105466842651367,13.10571590176592,12.601841745411164,12.634237491842033,537160000 +2020-08-31,13.331486701965332,13.531341412382233,12.99581968925175,13.140352862145061,500840000 +2020-09-01,13.780673027038574,13.952918495863635,13.397294423464833,13.440667445417443,511316000 +2020-09-02,14.304641723632812,14.683782248331399,13.859443697297028,14.66084864018264,874012000 +2020-09-03,12.977522850036621,13.843986724990549,12.841171644805272,13.788399501378418,945128000 +2020-09-04,12.585671424865723,13.136559153164002,11.670598810155463,12.74645010480063,1463684000 +2020-09-08,11.878238677978516,12.51338003337962,11.670098026330473,11.700259355443837,795728000 +2020-09-09,12.677899360656738,12.771874077000696,12.196058807985507,12.363817959051502,736200000 +2020-09-10,12.27582836151123,13.027129855901366,12.131500105891673,12.95135138844914,698684000 +2020-09-11,12.129005432128906,12.61558141288369,11.861039427777566,12.449068884880385,636928000 +2020-09-14,12.83469009399414,13.276148185663597,12.594394075811492,13.042831711985079,1201744000 +2020-09-15,12.953093528747559,13.259945289075963,12.79031990895631,13.24124980982187,727556000 +2020-09-16,12.477982521057129,13.054545126798825,12.477235120332265,12.919440559635914,556384000 +2020-09-17,12.427133560180664,12.553015449497009,11.999634544799727,12.096849903540244,792512000 +2020-09-18,12.153684616088867,12.595641019737025,11.953770092159134,12.55700438744562,698460000 +2020-09-21,12.480727195739746,12.485961854454477,11.869765026058538,11.890205393675586,721044000 +2020-09-22,12.600874900817871,12.611095084373552,12.120032760929606,12.538308131409915,646452000 +2020-09-23,12.088375091552734,12.689865432542552,12.044005534485787,12.538806778942002,647012000 +2020-09-24,12.311969757080078,12.532823845196516,11.978944689670747,12.037025149940066,731240000 +2020-09-25,12.83618450164795,12.845906416570816,12.210017679828452,12.411178781347672,588016000 +2020-09-28,12.996965408325195,13.013666868711299,12.712797153507108,13.002200066684653,573808000 +2020-09-29,13.18716049194336,13.40352734705288,12.895514391254116,12.899751564802479,621460000 +2020-09-30,13.491021156311035,13.582752726579443,13.111880671502549,13.1191093501162,689184000 +2020-10-01,13.574776649475098,13.722593723676805,13.421474831630729,13.717858282737058,525004000 +2020-10-02,13.024136543273926,13.480052002064452,13.012918874543097,13.186411907767297,552496000 +2020-10-05,13.602693557739258,13.604438443946247,13.184168099894958,13.197379788701449,479820000 +2020-10-06,13.696419715881348,14.100736967285448,13.625128512043325,13.789647040474033,784420000 +2020-10-07,13.923253059387207,14.0780505905183,13.823046209998681,13.958899129522786,418084000 +2020-10-08,13.798372268676758,14.043405664638808,13.717858361537509,14.03393288092139,378900000 +2020-10-09,13.722593307495117,13.783914413129807,13.620891633818578,13.72683143191848,346892000 +2020-10-12,14.184490203857422,14.305137430572008,13.871905504040015,13.948680493281143,434744000 +2020-10-13,14.206676483154297,14.306634217269046,13.977846300513065,14.254785897155454,344604000 +2020-10-14,14.054121017456055,14.300898294489315,13.919265577728954,14.248800848206926,276100000 +2020-10-15,13.929238319396973,13.964883444400389,13.727577969263605,13.770452723605999,267224000 +2020-10-16,13.771200180053711,14.08029607546171,13.75225556530927,13.995793185410296,242392000 +2020-10-19,13.458366394042969,13.942698314099715,13.367631359550169,13.862433547837183,298068000 +2020-10-20,13.605681419372559,13.759481448908721,13.467585361493837,13.54386206694182,229212000 +2020-10-21,13.485285758972168,13.751257741305391,13.43817383559243,13.585243481964962,219596000 +2020-10-22,13.322015762329102,13.572033721212627,13.193142358953583,13.483044519972317,290480000 +2020-10-23,13.550594329833984,13.553585834623085,13.252467010222349,13.410753367087764,233484000 +2020-10-26,13.10290241241455,13.652793409683428,13.000452420305495,13.387818958442791,336896000 +2020-10-27,13.357659339904785,13.402777241599955,13.153007512204232,13.267173452039954,250520000 +2020-10-28,12.590154647827148,13.2213079455442,12.572207521215867,13.159488585829639,376520000 +2020-10-29,12.98599624633789,13.154253645097555,12.712795608646159,12.801037389221687,320080000 +2020-10-30,12.497427940368652,12.898752703035122,12.264110514178018,12.81250588144576,416820000 +2020-11-02,12.544038772583008,12.799291309346993,12.35883079916996,12.620813745363474,299652000 +2020-11-03,12.981511116027832,13.06676140590141,12.565977166544666,12.671418689898168,272900000 +2020-11-04,13.75400161743164,13.787155409213568,13.298086107721478,13.350183564962006,410228000 +2020-11-05,14.118682861328125,14.29716046437122,13.950176307836214,14.121176099161731,319028000 +2020-11-06,14.519510269165039,14.54618182821228,13.854456670190384,14.06857939605643,383348000 +2020-11-09,13.590977668762207,14.648632601948703,13.57103651956659,14.510038239373735,582976000 +2020-11-10,12.732738494873047,13.566796863191128,12.591401776686265,13.566796863191128,644068000 +2020-11-11,13.3788480758667,13.395798669653004,12.91046834790044,13.015660731924338,404744000 +2020-11-12,13.417486190795898,13.72583374815592,13.277146935639445,13.43967144533766,365812000 +2020-11-13,13.258200645446777,13.628865795252274,13.021144322381677,13.587486796722393,346312000 +2020-11-16,13.475815773010254,13.609673750084138,13.117613914518738,13.134065292013785,413776000 +2020-11-17,13.38308334350586,13.556575394285218,13.26492937280869,13.512953248024814,312028000 +2020-11-18,13.389566421508789,13.56605000060591,13.146528037574518,13.425959895699158,510924000 +2020-11-19,13.401033401489258,13.448145326416391,13.061776193866837,13.174197256504039,565936000 +2020-11-20,13.049562454223633,13.455125348358738,13.026877983117611,13.414743832829755,341088000 +2020-11-23,13.101661682128906,13.343453491755636,12.977524662700837,13.132820503808434,361356000 +2020-11-24,12.919941902160645,13.123595320692461,12.847404082477862,13.10415243884235,346500000 +2020-11-25,13.196131706237793,13.230780292918476,12.982008993757889,12.994472329441068,259916000 +2020-11-27,13.222555160522461,13.368379147144227,13.132070214358633,13.335973711129208,167276000 +2020-11-30,13.362397193908691,13.37336572978121,12.934399884436976,13.226296063485327,286952000 +2020-12-01,13.350930213928223,13.489275437100785,13.18965138643594,13.452881961765824,296948000 +2020-12-02,13.504980087280273,13.633603400861086,13.195635056027603,13.311545898778629,283360000 +2020-12-03,13.360857009887695,13.624164374715619,13.294033339943539,13.551854342027166,199520000 +2020-12-04,13.522680282592773,13.524425683848758,13.353624616744687,13.413217466602983,202244000 +2020-12-07,13.571054458618164,13.695228127223007,13.464584963909067,13.565569046763182,223244000 +2020-12-08,13.31497859954834,13.563075773818994,13.246657781885267,13.549361768847865,271920000 +2020-12-09,12.896828651428223,13.378810606682494,12.834492607705123,13.26560870892222,401300000 +2020-12-10,12.93822193145752,13.034469193945974,12.815793640586305,12.835243219818663,207764000 +2020-12-11,12.97911262512207,12.985845024344064,12.789361313226891,12.933232817765063,209264000 +2020-12-14,13.273835182189941,13.35362522931585,13.043192047492473,13.053664455508784,270156000 +2020-12-15,13.32545280456543,13.428680715377455,13.152158665126922,13.404494298023911,193016000 +2020-12-16,13.20776081085205,13.40199974925172,13.17783882601205,13.38728796402951,223116000 +2020-12-17,13.306251525878906,13.344401151947084,13.14392823410941,13.331683975809367,231384000 +2020-12-18,13.2371826171875,13.369833127376156,13.036211292099729,13.34390131281088,342064000 +2020-12-21,13.297276496887207,13.334927714623442,12.933483400051559,13.04045227501662,302332000 +2020-12-22,13.243417739868164,13.302262984082963,13.019756160642086,13.284310552386875,185580000 +2020-12-23,12.975122451782227,13.240175239878393,12.970884026955623,13.221225029416,179144000 +2020-12-24,12.959662437438965,13.09804852342096,12.904807368604905,13.003048268354469,97884000 +2020-12-28,12.86616039276123,13.028234503900824,12.729769845297538,13.028234503900824,212564000 +2020-12-29,12.909296035766602,13.038207502886355,12.808561153661778,12.891094397483993,170372000 +2020-12-30,13.1112642288208,13.17908568167089,12.862917844630886,12.956171747816942,225396000 +2020-12-31,13.020752906799316,13.116500786863334,12.881119828694374,13.102039159766056,192424000 +2021-01-04,13.079097747802734,13.616684247552554,12.928493857668233,13.069872326194028,560640000 +2021-01-05,13.369585037231445,13.408233079539716,13.052668617255039,13.065384842831413,322760000 +2021-01-06,12.58140754699707,13.210253352525344,12.552982708724837,13.18781234029951,580424000 +2021-01-07,13.30899429321289,13.342656288850517,12.852694956302209,12.933481843487463,461480000 +2021-01-08,13.241920471191406,13.385791973828983,13.007786500606592,13.327446099963366,292528000 +2021-01-11,13.58576774597168,13.924377586962526,13.327447336450863,13.383549399534646,518344000 +2021-01-12,13.449374198913574,13.718417136246744,13.309991287761786,13.716421576408365,291476000 +2021-01-13,13.49625301361084,13.589258672592168,13.349888472879313,13.454612578563953,210028000 +2021-01-14,13.165620803833008,13.564072669184723,13.145922972626082,13.539387840584494,283120000 +2021-01-15,12.825766563415527,13.290294537427819,12.81479573848984,13.193299661324813,277780000 +2021-01-19,12.991081237792969,13.059650314910332,12.810306141016198,12.98210407137599,226188000 +2021-01-20,13.330689430236816,13.395269297234076,13.0224999802658,13.077355058100677,258572000 +2021-01-21,13.831121444702148,13.962525929112546,13.218233427837582,13.38329895675612,337780000 +2021-01-22,13.676527976989746,13.805439443893087,13.591501710006616,13.703955989146737,246820000 +2021-01-25,13.617433547973633,13.792223872758743,13.201776842384673,13.745596442257005,251112000 +2021-01-26,13.400006294250488,13.608956084690638,13.352381082541706,13.544874635958216,163980000 +2021-01-27,12.88386344909668,13.198036696568142,12.760188188261171,13.195293514907451,371272000 +2021-01-28,13.016761779785156,13.304754922726918,12.92649931832804,12.962155920214768,228316000 +2021-01-29,12.955674171447754,13.29976940655163,12.877629511506997,13.04070043799861,271552000 +2021-02-01,13.202274322509766,13.235935363744511,12.868900749952136,13.019006222791049,217204000 +2021-02-02,13.521187782287598,13.536397032264457,13.250648611357782,13.36360226071687,220440000 +2021-02-03,13.495003700256348,13.895200923231927,13.481040489555985,13.600226194841973,245408000 +2021-02-04,13.62840461730957,13.637630039577589,13.302761193484542,13.49550393934747,201340000 +2021-02-05,13.55534553527832,13.701212591949396,13.510214303137671,13.688994781359979,169152000 +2021-02-08,14.400872230529785,14.435780260750432,13.691238583595812,13.691238583595812,434624000 +2021-02-09,14.225833892822266,14.544994139772516,14.185190289145298,14.303129980095962,287560000 +2021-02-10,14.725517272949219,14.865897960955252,14.303876794568637,14.425307273903554,485352000 +2021-02-11,15.210742950439453,15.232187136333499,14.885848077590166,14.940953310040186,450828000 +2021-02-12,14.922000885009766,15.251135085237093,14.736238809363154,15.010517943667557,374756000 +2021-02-16,15.290032386779785,15.33217217964681,14.910779958011238,15.024730417020098,321960000 +2021-02-17,14.866896629333496,15.183563832990215,14.74122676688984,15.131200835454731,274756000 +2021-02-18,14.790102005004883,14.834235467115235,14.536767619242058,14.690363938021383,233868000 +2021-02-19,14.887341499328613,15.137184052947557,14.807800658023885,14.985083975800366,271724000 +2021-02-22,14.31809139251709,15.093551969454566,14.28742178345262,14.735991924439366,325884000 +2021-02-23,14.104902267456055,14.201398727224001,13.354375726640503,14.038326844010633,391780000 +2021-02-24,14.460963249206543,14.468693427860899,13.719912388104134,14.085700979760459,448320000 +2021-02-25,13.272592544555664,14.337043257058737,13.181582438091127,14.00865658875913,824436000 +2021-02-26,13.678523063659668,13.81815519173923,13.325950037913707,13.716422533300882,500932000 +2021-03-01,13.805438995361328,13.888470650772712,13.517695986619382,13.838601625850457,353184000 +2021-03-02,13.371079444885254,13.883980140619556,13.360856243880576,13.8635337386102,264116000 +2021-03-03,12.771159172058105,13.416212021844284,12.765174394686703,13.391028778728382,377592000 +2021-03-04,12.337800979614258,12.940965273550628,12.052052529080719,12.767171752747092,573344000 +2021-03-05,12.428810119628906,12.517077981864157,11.648611779877376,12.517077981864157,542840000 +2021-03-08,11.562837600708008,12.43853364324281,11.53615721112077,12.41733961683344,543112000 +2021-03-09,12.491717338562012,12.587996864538763,12.031767491447203,12.102605785194852,521824000 +2021-03-10,12.439835548400879,12.950418556477446,12.429110229980283,12.811236807250063,384376000 +2021-03-11,12.963887214660645,13.016517582092941,12.70547765781812,12.920486405634026,299916000 +2021-03-12,12.826703071594238,12.859378568713046,12.561309450794752,12.619426182646466,243964000 +2021-03-15,13.161185264587402,13.176650006569224,12.738151829150855,12.835429461665072,221988000 +2021-03-16,13.26095962524414,13.481704980424471,13.086856844368391,13.32606036558166,272128000 +2021-03-17,13.310846328735352,13.422590598761918,12.959897577681296,13.010033113546163,243864000 +2021-03-18,12.693503379821777,13.153951720211557,12.688016074991149,13.10656032230986,293896000 +2021-03-19,12.816473960876465,12.89205167424167,12.58375588036706,12.720942322961571,299208000 +2021-03-22,13.156197547912598,13.363972980433424,12.877334536102579,12.88332137939055,297804000 +2021-03-23,13.040960311889648,13.31408575333248,12.991572664437872,13.224041429491782,222048000 +2021-03-24,12.61418628692627,13.129260363528369,12.60795110155996,13.121278222518455,245840000 +2021-03-25,12.506681442260742,12.685772934062374,12.244031999468016,12.47101348103624,295144000 +2021-03-26,12.809988975524902,12.82695043045627,12.345300678057612,12.525887935677616,363968000 +2021-03-29,12.918740272521973,13.032730075197993,12.671056035921035,12.791031730488832,273520000 +2021-03-30,12.842412948608398,12.945677419703516,12.676043046177861,12.812730883373508,200204000 +2021-03-31,13.317830085754395,13.43980108547059,12.952913308067277,12.985838094343524,314776000 +2021-04-01,13.7802734375,13.838390160541337,13.480457409128894,13.54131921224643,308276000 +2021-04-05,13.955621719360352,13.982061072848323,13.701701354086651,13.83589532176299,255672000 +2021-04-06,13.82990837097168,14.022219056182177,13.742109584317118,13.967843638827903,191744000 +2021-04-07,14.111268043518066,14.211039577939392,13.680252388675337,13.849116212600178,251284000 +2021-04-08,14.284370422363281,14.438518308041665,14.216524609947545,14.220266862559335,244416000 +2021-04-09,14.367180824279785,14.375162964604147,14.142694188854021,14.18160486312086,195172000 +2021-04-12,15.174337387084961,15.317510669064815,14.107025580672097,14.257182878772879,869324000 +2021-04-13,15.643767356872559,15.664220821773963,15.091279268784744,15.196788357104527,676212000 +2021-04-14,15.242182731628418,15.684671520263224,15.192795082369985,15.589389181199738,385500000 +2021-04-15,16.100473403930664,16.177297582654937,15.595875375534593,15.62680486220305,598480000 +2021-04-16,15.876236915588379,16.128909898495078,15.82909384902855,16.016415843006538,335208000 +2021-04-19,15.326739311218262,15.771473656524103,15.198282892338474,15.501091372928386,404420000 +2021-04-20,15.136674880981445,15.461681891457701,14.92889943956875,15.288327945921406,334132000 +2021-04-21,15.325493812561035,15.327489109940338,15.067832127378264,15.084294044383183,216776000 +2021-04-22,14.816407203674316,15.403316768706386,14.749808798640005,15.339961078862977,277788000 +2021-04-23,15.230459213256836,15.300050078745928,14.866291312184334,14.900213267194747,227500000 +2021-04-26,15.442724227905273,15.443722352270685,15.090529052039209,15.150392726443197,197796000 +2021-04-27,15.346694946289062,15.634786577704853,15.319506760052127,15.54299623900215,164572000 +2021-04-28,15.24193286895752,15.496851358886726,15.180822728255709,15.329483314677965,209416000 +2021-04-29,15.28982162475586,15.40131657289695,15.03714871287169,15.364899786894426,173196000 +2021-04-30,14.975292205810547,15.329982225607592,14.962820884189167,15.139917076615806,201912000 +2021-05-03,14.802934646606445,15.212000037199155,14.753797245576967,15.090527647186622,203912000 +2021-05-04,14.31854248046875,14.604140216611514,13.978320032313126,14.603890923390113,405324000 +2021-05-05,14.42554759979248,14.77973901550892,14.354709316649194,14.675476412223556,292024000 +2021-05-06,14.489899635314941,14.538039864129088,14.18559542378401,14.462212866566988,193380000 +2021-05-07,14.778493881225586,14.93663238730479,14.638314004041494,14.774503286249104,229328000 +2021-05-10,14.23323917388916,14.772257802640691,14.217525135668332,14.753550342425147,268904000 +2021-05-11,14.273645401000977,14.32203492946594,13.71866348603011,13.793492369290098,285584000 +2021-05-12,13.727144241333008,14.227750736859978,13.678006833080557,13.977571659960846,303408000 +2021-05-13,13.634105682373047,14.048659365726651,13.42832555148644,14.001765599303283,285404000 +2021-05-14,14.210540771484375,14.295347097755329,13.717167558452239,13.85834555724193,258616000 +2021-05-17,14.13321590423584,14.136957205584439,13.821927643121665,14.124735177145284,216980000 +2021-05-18,13.983808517456055,14.371423352403228,13.972085074555256,14.234486193734758,186256000 +2021-05-19,14.03369426727295,14.047413007132981,13.512385007094382,13.535581647339058,344000000 +2021-05-20,14.57919979095459,14.650287381400735,14.237979166512895,14.269905830723385,321592000 +2021-05-21,14.957584381103516,15.187310011640008,14.835613378029347,15.12919233394966,672992000 +2021-05-24,15.57641887664795,15.70911517546304,15.141411749928574,15.177828539291475,554816000 +2021-05-25,15.612088203430176,15.78244872406465,15.447214988276473,15.730068601519758,435408000 +2021-05-26,15.664220809936523,15.757757161450675,15.550730531546524,15.698393015831291,370440000 +2021-05-27,15.452701568603516,15.714104534109342,15.424765504557204,15.663969004454568,581476000 +2021-05-28,16.207481384277344,16.240407128055963,15.465676860639382,15.465676860639382,644536000 +2021-06-01,16.227432250976562,16.350900905100538,15.867005629586217,16.23292050791609,472804000 +2021-06-02,16.74001121520996,16.88019202823062,16.198498765123478,16.215210925909048,594168000 +2021-06-03,16.931074142456055,17.21966624490204,16.54520630492932,16.662688111475287,580008000 +2021-06-04,17.53818702697754,17.620746842193533,17.056537358178723,17.07349690716464,617120000 +2021-06-07,17.57884407043457,17.771903582760572,17.153566981858148,17.53120432837869,575756000 +2021-06-08,17.41721534729004,17.581339727964668,17.211683552862734,17.487304802500514,323848000 +2021-06-09,17.322660446166992,17.53896714503137,17.22037158933601,17.479838745757142,381656000 +2021-06-10,17.38927459716797,17.456138574148138,17.140786450879247,17.31442950382826,287772000 +2021-06-11,17.788700103759766,17.902466667525747,17.40798212256188,17.44365825407932,416308000 +2021-06-14,17.9818058013916,18.00251330381653,17.6265367051876,17.86928786859954,321376000 +2021-06-15,17.752025604248047,17.979309393443955,17.69165046284507,17.878267304909148,243032000 +2021-06-16,17.773731231689453,17.91793568012031,17.548444139459,17.754272386965212,307124000 +2021-06-17,18.618995666503906,18.796380852352936,17.71984395555316,17.738056049490442,809656000 +2021-06-18,18.60053253173828,19.335272822869825,18.545894351454166,18.74548502583953,968856000 +2021-06-21,18.389461517333984,18.49848850079661,17.786201336067244,18.397444533249804,672384000 +2021-06-22,18.84803009033203,18.924873803297125,18.34830707453563,18.433632509156674,580144000 +2021-06-23,19.018171310424805,19.113476427422203,18.868977973588915,18.968773299713472,332356000 +2021-06-24,19.166118621826172,19.380179214268757,19.04910860227057,19.18832412486223,320924000 +2021-06-25,18.991979598999023,19.305835565574505,18.855760067993472,19.24096830647944,278364000 +2021-06-28,19.944021224975586,20.03757898993622,19.2793864972352,19.321549543533276,495436000 +2021-06-29,19.985689163208008,20.057540138683486,19.616696297313815,19.841734055010626,367632000 +2021-06-30,19.96148681640625,20.12115859540737,19.82302123736521,19.958243358482186,326568000 +2021-07-01,20.170555114746094,20.414054274133893,19.977950070109877,20.083733615151363,480136000 +2021-07-02,20.44499397277832,20.463207970031252,20.24615323612554,20.398340709880483,342764000 +2021-07-06,20.65605926513672,20.799264406948467,20.308523883899067,20.69497885754218,446708000 +2021-07-07,20.329978942871094,20.832197183620792,20.290311300375325,20.810741633418665,418428000 +2021-07-08,19.861942291259766,20.09171960290555,19.660356798187884,19.815787729327422,503300000 +2021-07-09,20.009138107299805,20.039077280594753,19.71374549718663,19.92156854746717,296624000 +2021-07-12,20.470443725585938,20.490650623096794,20.14635866615761,20.19850144596285,321984000 +2021-07-13,20.208480834960938,20.419298007480663,20.072759999501244,20.358671605643057,290708000 +2021-07-14,19.80081558227539,20.375884094034173,19.712248624493125,20.316007653222723,380100000 +2021-07-15,18.927358627319336,19.806303278960396,18.81982963269541,19.771125849419136,550564000 +2021-07-16,18.123764038085938,19.117722241598095,18.035945118120942,18.991482425183538,688224000 +2021-07-19,18.741239547729492,19.002950751649657,17.82886305794626,17.878512315681533,749060000 +2021-07-20,18.57383918762207,18.799375650601363,18.126757771110505,18.69159728177998,434687000 +2021-07-21,19.370201110839844,19.486961789834456,18.703571525234402,18.843283856723506,371017000 +2021-07-22,19.553821563720703,19.846220024304472,19.236472843910477,19.601723472760458,323826000 +2021-07-23,19.517902374267578,19.65961144108396,19.210533278395555,19.615701026405628,195672000 +2021-07-26,19.254438400268555,19.402133739466528,18.87521652192213,19.271403739834394,203943000 +2021-07-27,19.168617248535156,19.58176796610266,18.70257379806693,19.22549958731467,248863000 +2021-07-28,19.463010787963867,19.605717226720746,18.95605298334581,19.279388051239483,202191000 +2021-07-29,19.621686935424805,19.812295305895738,19.288370209890534,19.478978580361467,190781000 +2021-07-30,19.459020614624023,19.589750632003597,19.223504438237402,19.378185414523912,183497000 +2021-08-02,19.709505081176758,19.920072893515012,19.321302738209415,19.65960836133373,217444000 +2021-08-03,19.774372100830078,20.180537181896543,19.180590863307074,19.699525118531906,301811000 +2021-08-04,20.232431411743164,20.276341820757914,19.7873448162624,19.949013314665788,231309000 +2021-08-05,20.594684600830078,20.690488430456615,20.300289398787864,20.457966376428395,211435000 +2021-08-06,20.324241638183594,20.527823837262428,20.16856135693953,20.481918625769893,178497000 +2021-08-09,20.253385543823242,20.465948136373385,20.10169679071814,20.404074992162744,146443000 +2021-08-10,19.89512825012207,20.388114938915336,19.794333583297004,20.280336557307983,179238000 +2021-08-11,19.658613204956055,20.007896027878846,19.39016559777533,20.001907811133897,185925000 +2021-08-12,19.86418914794922,19.987933553534155,19.57977364024572,19.829261061279524,151652000 +2021-08-13,20.1466064453125,20.1725541097233,19.810297533456417,19.86418766511711,183063000 +2021-08-16,19.909095764160156,20.245404680922952,19.413113156362577,20.09371591167451,210876000 +2021-08-17,19.41810417175293,19.729464731826763,19.22749580678188,19.644638023102544,204585000 +2021-08-18,19.000961303710938,19.593743229252496,18.96104240604806,19.460017206207215,285913000 +2021-08-19,19.75740623474121,20.45297759855377,18.723529260876187,19.454028707916844,766555000 +2021-08-20,20.773313522338867,20.822212826993088,19.892124830534584,19.950004552446828,675741000 +2021-08-23,21.912975311279297,21.951894900195178,20.907042793577777,20.92799964171999,575807000 +2021-08-24,21.748315811157227,21.91397581714338,21.490845382237715,21.70839881527599,297299000 +2021-08-25,22.167455673217773,22.423928711519626,21.67746315503596,21.692431791193993,347701000 +2021-08-26,22.02275276184082,22.29419441591644,21.745322892376493,22.154482079765433,237940000 +2021-08-27,22.589590072631836,22.675414192164936,22.12155178000806,22.138517123604025,304722000 +2021-08-30,22.6414794921875,22.99575113149389,22.50476126953537,22.783188528597606,262580000 +2021-08-31,22.34304428100586,22.652462718522884,22.078541576658544,22.652462718522884,259850000 +2021-09-01,22.39893341064453,22.65445404598005,22.315091237611284,22.442851555279045,201767000 +2021-09-02,22.35401725769043,22.55064847192109,22.253206755805778,22.47578830242912,187834000 +2021-09-03,22.800180435180664,22.942912026550225,22.158386110720752,22.28315179399334,280532000 +2021-09-07,22.619522094726562,22.856077365071243,22.47978322176614,22.790201093344027,198107000 +2021-09-08,22.29712677001953,22.56761869550648,21.935803914105733,22.47080039788564,254434000 +2021-09-09,22.135435104370117,22.495758565939447,22.089521791381827,22.27018231090485,196856000 +2021-09-10,22.435871124267578,22.583592546496956,22.22826078665181,22.306113711370834,248376000 +2021-09-13,22.1104793548584,22.92095763955937,21.81702979556362,22.641481778146552,297500000 +2021-09-14,22.2003116607666,22.36799604174789,22.04460391966671,22.23324884827066,199755000 +2021-09-15,22.299123764038086,22.325076004521907,21.9248266618489,22.267184155866353,166538000 +2021-09-16,22.2003116607666,22.23524590680437,21.885901542653063,22.14142223119242,156033000 +2021-09-17,21.858951568603516,22.27916199923843,21.78908307702213,22.258201451764013,294503000 +2021-09-20,21.073427200317383,21.392827095889,20.62327232997256,21.1063643864586,349440000 +2021-09-21,21.206178665161133,21.384842112502014,20.91073393353003,21.376857685741996,204688000 +2021-09-22,21.89987564086914,21.91883913030428,21.156271167832312,21.32595261044499,268726000 +2021-09-23,22.43985939025879,22.492759542814195,21.84896809396937,22.098499486193866,248555000 +2021-09-24,22.03960609436035,22.10747941279517,21.820019194095934,22.028627034913097,217655000 +2021-09-27,21.61939811706543,21.758137500255582,21.285026989314378,21.669303630416145,245215000 +2021-09-28,20.660200119018555,21.378851731817658,20.61228975766216,21.174236070678667,343069000 +2021-09-29,20.47854232788086,20.97760510825539,20.42863490757935,20.900749775141833,218394000 +2021-09-30,20.677173614501953,21.026518024203938,20.649226214027703,20.72907620163611,221009000 +2021-10-01,20.703123092651367,20.81990247026338,20.165131897885484,20.7111075192128,240978000 +2021-10-04,19.69501495361328,20.503496167398797,19.518346674353516,20.465567287478837,345635000 +2021-10-05,20.41266632080078,20.609297561414326,19.81678523146507,19.91260595666777,279282000 +2021-10-06,20.66119956970215,20.681160633760157,20.04236089334236,20.08228682900517,297202000 +2021-10-07,21.035499572753906,21.28203635803416,20.932691987531594,21.0524660036176,256919000 +2021-10-08,20.791955947875977,21.166253087457257,20.736061152048205,21.061450345280186,151258000 +2021-10-11,20.656208038330078,21.02351827271409,20.47255292113807,20.53643403794635,163388000 +2021-10-12,20.63225555419922,21.017531748620257,20.48952393159599,20.78896087546607,162134000 +2021-10-13,20.899749755859375,20.95065475212392,20.674173552471455,20.87878921100457,180652000 +2021-10-14,21.705238342285156,21.714220345136173,21.08240745531467,21.248096660937723,243589000 +2021-10-15,21.821022033691406,21.889892945838103,21.62139804997386,21.769119455245605,226994000 +2021-10-18,22.180347442626953,22.249218353447674,21.60342981922469,21.708234455215166,189494000 +2021-10-19,22.24822235107422,22.337054333529306,21.995696294779776,22.23424674868244,161473000 +2021-10-20,22.061573028564453,22.390954434037532,21.94079952926204,22.26319408528226,146276000 +2021-10-21,22.649465560913086,22.668430952513223,22.041607816544584,22.055581514029527,187590000 +2021-10-22,22.683401107788086,23.086643160322406,22.51871138181134,22.780219408090645,249384000 +2021-10-25,23.122575759887695,23.311220657458257,22.72731815221987,22.92993674590677,230235000 +2021-10-26,24.670669555664062,25.211655352856283,23.879156684477824,23.94403538165205,485898000 +2021-10-27,24.405168533325195,25.04297071184437,24.236484687501985,24.428126137261565,245990000 +2021-10-28,24.894248962402344,24.903232868960202,24.477033219667174,24.83136732781748,234204000 +2021-10-29,25.519071578979492,25.660805583997924,24.95313503979381,24.954132616908744,292503000 +2021-11-01,25.778589248657227,25.845463099594504,25.179713514581092,25.60092339643473,265740000 +2021-11-02,26.35151481628418,26.627996052602402,25.751641457702068,25.773601486490804,294112000 +2021-11-03,26.548145294189453,26.733797485295405,26.185826723233117,26.62001084272468,239910000 +2021-11-04,29.745141983032227,31.30620961912634,27.067170400192616,27.177962404141628,1153631000 +2021-11-05,29.696237564086914,31.34114758127291,29.354877604488976,30.130421724134788,851260000 +2021-11-08,30.74626350402832,31.041708225527604,29.850943528129683,30.092490515186665,503101000 +2021-11-09,30.599536895751953,32.249440336959736,29.90783694894827,32.22149294128175,646746000 +2021-11-10,29.403779983520508,30.79217335906481,28.724056732933512,29.30097431677463,636206000 +2021-11-11,30.333036422729492,30.53266230455437,29.721186464615332,30.410891240075124,332172000 +2021-11-12,30.333036422729492,30.622493760998218,29.574460737077853,29.95374953179042,413054000 +2021-11-15,29.96872329711914,30.586562578013904,29.192181636399926,30.494735959309306,384909000 +2021-11-16,30.14638328552246,30.333033026261162,29.650315175997722,29.703217228135042,264484000 +2021-11-17,29.206151962280273,30.45181376929014,28.746015633176018,30.360982834698927,428508000 +2021-11-18,31.615623474121094,32.6985886943481,31.262286966657477,32.306327639035906,781711000 +2021-11-19,32.92317581176758,33.0259833953756,31.84520016505162,32.182565986384056,533867000 +2021-11-22,31.89609718322754,34.58205283204877,31.840202400085218,33.45416997463953,754335000 +2021-11-23,31.686498641967773,32.299348139288455,30.822120661996482,31.475893678387237,532163000 +2021-11-24,32.612762451171875,32.793422978813275,30.870034500292675,31.402036500453686,435162000 +2021-11-26,31.443950653076172,32.648687064891426,31.29123755997602,32.538892641019984,283069000 +2021-11-29,33.313438415527344,33.34937023539346,31.975950001854695,32.305333266978955,454964000 +2021-11-30,32.61475372314453,33.29048676445909,31.80427729283025,33.10682971857124,622066000 +2021-12-01,31.379919052124023,33.23067246826559,31.325015118496538,33.160795426923904,484368000 +2021-12-02,32.069705963134766,32.421090351510074,30.970635382098994,31.15930528417701,472890000 +2021-12-03,30.639219284057617,32.07270388968225,30.077204165452407,31.943928314068653,544325000 +2021-12-06,29.98436737060547,30.18800847333297,27.98886963330003,29.827640986085843,658938000 +2021-12-07,32.370182037353516,32.39214665890669,30.59729473760389,30.902760248148258,593053000 +2021-12-08,31.770235061645508,32.233422746850074,31.36594401255075,31.94293226813798,475551000 +2021-12-09,30.436574935913086,32.14857195475035,30.37468329865997,31.6783946707129,488507000 +2021-12-10,30.14508819580078,31.250148903888093,29.80867878068913,31.095419803403907,488825000 +2021-12-13,28.11165428161621,30.24091806471552,28.06673305655488,30.19599683965419,598344000 +2021-12-14,28.287349700927734,28.627751827545833,27.202254376108797,27.65046707434762,667035000 +2021-12-15,30.405624389648438,30.446552908307495,27.789217045397717,28.350232491196547,698297000 +2021-12-16,28.33725929260254,31.105401144450823,28.043775720321822,31.097415740907646,707366000 +2021-12-17,27.752288818359375,28.871324937395045,27.711360291314012,27.93596643631338,713758000 +2021-12-20,27.67043113708496,28.094685698240124,27.09743748345742,27.257156982057477,461847000 +2021-12-21,29.024057388305664,29.068978618316375,27.352988774311232,28.324285422853343,524385000 +2021-12-22,29.348487854003906,29.50321696381351,28.39915388867012,28.840380800512104,395184000 +2021-12-23,29.58806610107422,30.006332580906882,29.37943266291663,29.70286437703643,343022000 +2021-12-27,30.890775680541992,31.032527056128416,29.58806208908035,29.608027500629184,403686000 +2021-12-28,30.268871307373047,31.27510454463421,29.95941310813058,31.257136433970018,420591000 +2021-12-29,29.94843292236328,30.49447537471948,29.314545314998263,30.219957599311112,343139000 +2021-12-30,29.53415870666504,30.403632796140236,29.48823978184023,29.774735640296466,308864000 +2021-12-31,29.359464645385742,29.97738140497539,29.279604899449346,29.622004297954177,266530000 +2022-01-03,30.068222045898438,30.65718839576648,29.732810345904568,29.76275846512053,391547000 +2022-01-04,29.23868179321289,30.414617312262283,28.299330538133866,30.2239519793228,527154000 +2022-01-05,27.55562973022461,29.364454845205913,27.484754996190166,28.89827220752066,498064000 +2022-01-06,28.12862777709961,28.38817244992483,27.017578941512586,27.59157032025487,454186000 +2022-01-07,27.19925880432129,28.37220116591778,27.009591180436384,28.091693384069224,409939000 +2022-01-10,27.351987838745117,27.42086717687943,25.599064280215813,26.534422691681613,594681000 +2022-01-11,27.768259048461914,28.01582560455743,26.791973944653037,27.27512514321652,404089000 +2022-01-12,27.94993782043457,28.54489221413085,27.559622224484315,28.01781755190002,383413000 +2022-01-13,26.528438568115234,28.430099589302795,26.451571911307685,28.32927671947222,540171000 +2022-01-14,26.89479637145996,27.149350671258752,26.164078503623852,26.253920973669672,395832000 +2022-01-18,25.857614517211914,26.591327312716324,25.724848128999263,26.213989357999964,424270000 +2022-01-19,25.02307891845703,26.496492614370172,25.00810580961453,26.03330680371319,488315000 +2022-01-20,24.107683181762695,25.534180093180137,24.03580883991224,25.259662338175847,435181000 +2022-01-21,23.333044052124023,24.779504484725948,23.222238488118958,23.465810427443177,718958000 +2022-01-24,23.3310489654541,23.339034369598377,20.851402002026376,22.290874867397406,913982000 +2022-01-25,22.28488540649414,22.902802239409883,21.96145368267217,22.506496560966628,664616000 +2022-01-26,22.732097625732422,24.01484586051624,22.260924555461028,23.199277994324547,755959000 +2022-01-27,21.905546188354492,23.952952667040794,21.63701657115856,23.52670088427018,573353000 +2022-01-28,22.799978256225586,22.817946364989552,21.258683139923846,21.973428117025183,543774000 +2022-01-31,24.443096160888672,24.466056576635847,23.01160877298067,23.141380151708606,564680000 +2022-02-01,24.594831466674805,25.100943105440315,23.848140964476304,25.060014577270604,518925000 +2022-02-02,25.197772979736328,25.771764354982583,24.509979124936994,25.748805842376743,543419000 +2022-02-03,23.906038284301758,25.033059761828103,23.73833338493086,24.41514489111472,410178000 +2022-02-04,24.27638816833496,24.59183445369835,23.590591664698938,23.92999606449557,354829000 +2022-02-07,24.684675216674805,25.137878340746738,24.159595835665748,24.3292980583028,376868000 +2022-02-08,25.064006805419922,25.185792784105224,23.937982972320302,24.316318617844477,410359000 +2022-02-09,26.658206939697266,26.678172352297,25.308576654463888,25.577104409106095,524282000 +2022-02-10,25.778749465942383,26.877820078131588,25.55514294337122,25.94945126409118,513200000 +2022-02-11,23.90703773498535,26.10617882145909,23.731347419157586,25.870592262319995,605472000 +2022-02-14,24.22447967529297,24.831414142549452,23.713375763493875,23.89206297353471,440424000 +2022-02-15,26.448577880859375,26.49848951224235,24.74057535116085,24.905285257930018,699869000 +2022-02-16,26.46454620361328,26.53542284600836,25.50722696162252,26.212988863297966,732676000 +2022-02-17,24.464059829711914,25.7398204497376,24.1226600121871,25.58509134880872,810595000 +2022-02-18,23.600576400756836,24.94222140437061,23.059526236621377,24.624777788834088,761255000 +2022-02-22,23.349018096923828,24.021836977646117,22.959702019783585,22.994640544449666,633422000 +2022-02-23,22.347774505615234,24.112678317780876,22.261926649888636,23.760296175065644,566511000 +2022-02-24,23.706388473510742,23.758297405959556,20.853396395775633,20.978177373546444,735801000 +2022-02-25,24.11467170715332,24.174566042065802,23.340032343064628,23.679436747579647,528866000 +2022-02-28,24.342269897460938,24.621779933213432,23.665458473296034,23.949958909684135,477319000 +2022-03-01,23.43586540222168,24.334290041937535,23.091470559668455,24.248440280185854,412056000 +2022-03-02,24.181676864624023,24.37037889826506,23.377952187304864,23.71841223895851,389642000 +2022-03-03,23.676483154296875,24.287514431211836,23.431869927038584,24.2236146029454,365095000 +2022-03-04,22.89971160888672,23.642533938176978,22.446429452930165,23.347002740032476,431415000 +2022-03-07,21.318220138549805,22.996562434970834,21.296255582695046,22.780902641587442,450821000 +2022-03-08,21.479965209960938,22.337605542188697,20.617331721210327,21.275289592142627,557467000 +2022-03-09,22.977590560913086,23.183264033281336,22.211803797860465,22.351581700991208,492742000 +2022-03-10,22.622150421142578,22.751943891294133,21.847377268799907,22.495350558912122,428066000 +2022-03-11,22.065038681030273,23.108385590853814,22.011123254667755,22.985579077175295,367209000 +2022-03-14,21.296253204345703,22.226777871939785,21.125524219940516,21.834399997336966,385354000 +2022-03-15,22.936655044555664,23.001552744251775,21.28826794519085,21.483957009446616,491996000 +2022-03-16,24.457244873046875,24.558084912150203,23.1353401835326,23.46282036717551,671422000 +2022-03-17,24.72681999206543,24.802698066127316,23.868179935405454,24.081842080055868,471941000 +2022-03-18,26.411144256591797,26.526961844707255,24.58503959627987,24.75976194344014,730719000 +2022-03-21,26.69170379638672,27.10904365797584,25.925917057437342,26.46506364568239,591727000 +2022-03-22,26.482036590576172,27.19490767313814,26.03075203419893,26.6847145409987,547007000 +2022-03-23,25.593446731567383,26.569898230749118,25.534540056766478,26.08466704185797,502120000 +2022-03-24,28.1054630279541,28.275194144251657,25.86601168572694,26.12460269441279,877379000 +2022-03-25,27.6481876373291,28.313134317487354,27.227854178048023,27.841880951681336,579016000 +2022-03-28,28.17435646057129,28.205307554645753,27.162958572961415,27.71208959715497,425494000 +2022-03-29,28.61066246032715,28.90020265076086,27.935731389818635,28.649600315235286,488984000 +2022-03-30,27.646190643310547,28.45091518210364,27.459486232193132,28.25921951967007,463487000 +2022-03-31,27.242828369140625,28.20330622061863,27.22685484159966,27.738043905197447,523440000 +2022-04-01,26.669740676879883,27.45250076054746,26.22544498544126,27.33169189686008,517235000 +2022-04-04,27.31671714782715,27.51440386654613,26.570899159220595,26.68571700094649,397120000 +2022-04-05,25.889972686767578,27.275777131993475,25.779148245925093,27.210879439377642,436615000 +2022-04-06,24.368385314941406,25.259972150743756,23.96502515298765,24.894551975696334,703833000 +2022-04-07,24.169702529907227,24.68288930829468,23.440857864946675,24.402333720111592,557992000 +2022-04-08,23.08242416381836,23.885153052088434,23.02551513263404,23.879162026385522,524781000 +2022-04-11,21.882322311401367,22.284684555047285,21.625728972293903,22.178853275805785,575207000 +2022-04-12,21.46997833251953,22.68904726444352,21.248329435806077,22.501344972589628,662258000 +2022-04-13,22.16787338256836,22.464404404314973,21.421057545807987,21.693626368608857,516943000 +2022-04-14,21.224367141723633,22.74096493748478,21.12951812677189,22.46939400417776,569097000 +2022-04-18,21.748537063598633,22.05305290950582,21.045650421935058,21.16645927175718,525701000 +2022-04-19,22.162878036499023,22.337600387857318,21.280275933977165,21.685633693459216,512781000 +2022-04-20,21.448013305664062,22.634133476038546,21.16645987408989,22.481375661869,468974000 +2022-04-21,20.151065826416016,22.356570250230074,19.968354816166205,21.674650369576106,656209000 +2022-04-22,19.48412322998047,20.453587607608277,19.46914757200327,20.27087658209677,624713000 +2022-04-25,19.870512008666992,19.91344324394148,19.06578748429904,19.17161876841651,641566000 +2022-04-26,18.758275985717773,19.756693905617453,18.640462640700314,19.686804955917445,653143000 +2022-04-27,18.385868072509766,19.136677298891684,18.26106582462468,18.568577222764382,499460000 +2022-04-28,19.75070571899414,20.00530339158863,18.460749763887293,18.936994464104153,570327000 +2022-04-29,18.517658233642578,20.09615635655,18.487705010179635,19.371305106860206,500435000 +2022-05-02,19.502098083496094,19.543031679322635,18.361904626208553,18.511666932632682,572049000 +2022-05-03,19.570985794067383,19.79363445026666,19.102727963969997,19.36930572544229,475751000 +2022-05-04,20.30182647705078,20.367722034335905,18.721330971525965,19.891477476244106,648855000 +2022-05-05,18.81418800354004,19.893477199554358,18.47073236054234,19.835570298208268,626331000 +2022-05-06,18.64545440673828,19.481130122104307,17.96153864595354,18.706358724203252,633297000 +2022-05-09,16.92318344116211,18.226117145161634,16.800376947832692,18.00546803272832,644455000 +2022-05-10,17.56715965270996,18.169206196741058,16.99806183902758,17.661010784242496,761474000 +2022-05-11,16.60369110107422,17.72491565241729,16.541790812948673,17.319557792682115,670167000 +2022-05-12,16.14940643310547,16.761437385587584,15.542369587991322,16.193337438966932,708728000 +2022-05-13,17.67798614501953,17.89963503357807,16.566748093964986,16.76143927351917,670437000 +2022-05-16,17.2366886138916,17.759859823271352,17.07893952672001,17.481301866378754,521446000 +2022-05-17,18.148242950439453,18.341936274653683,17.606102740003116,18.045405262711192,585830000 +2022-05-18,16.911203384399414,18.08933689945816,16.837321048409155,17.676990169187597,545161000 +2022-05-19,17.09691047668457,17.659019539624946,16.707526159547534,16.91020603540993,621310000 +2022-05-20,16.66758918762207,17.382456030278203,15.73007462070742,17.30458031525228,739105000 +2022-05-23,16.871267318725586,16.888240622010123,16.15340494623042,16.248253966391196,639889000 +2022-05-24,16.128440856933594,16.57074074512232,15.755032994513659,16.483878501085666,588550000 +2022-05-25,16.948144912719727,17.083929432634935,15.974687040333203,15.994655856173082,781132000 +2022-05-26,17.8227596282959,18.063377590380153,15.996652626042534,16.01063041716501,996575000 +2022-05-27,18.781234741210938,18.85112367017378,18.071359368988844,18.15722372642769,738379000 +2022-05-31,18.642459869384766,19.169624397490942,18.320968803583344,18.949971241226027,664100000 +2022-06-01,18.291017532348633,19.022857731380693,18.09333081321993,18.694379640054212,544514000 +2022-06-02,19.561002731323242,19.587960441440174,18.16920906482629,18.26306021117362,648656000 +2022-06-03,18.69038200378418,19.30141516237342,18.492695309504686,19.051810692697362,598779000 +2022-06-06,18.756282806396484,19.306411805342012,18.534633853549593,19.1087250558568,422406000 +2022-06-07,18.896055221557617,18.969937542043855,18.15922204233919,18.442773083805278,388914000 +2022-06-08,18.6224308013916,19.153700917925704,18.50958487708306,18.773222822485945,363252000 +2022-06-09,18.023258209228516,18.90704518527474,18.016267836051888,18.455665170383455,395574000 +2022-06-10,16.95073127746582,17.672739690299487,16.845873774339914,17.575872545670485,465248000 +2022-06-13,15.625547409057617,16.289635619144264,15.5846032566188,15.978063114136962,604153000 +2022-06-14,15.814288139343262,16.043972335554802,15.39086873500502,15.709431606714736,469680000 +2022-06-15,16.504343032836914,16.844875148826677,15.904166178242575,16.07293416311362,563936000 +2022-06-16,15.579609870910645,15.920142894443504,15.379884274081553,15.838254590231825,545749000 +2022-06-17,15.85822868347168,15.973070790259849,15.306985428048275,15.626546404282076,630334000 +2022-06-21,16.54328727722168,16.98468071216901,16.38450487696242,16.452412438369816,483089000 +2022-06-22,16.337570190429688,16.63915617828488,16.157816675124355,16.20375313433491,437135000 +2022-06-23,16.2027587890625,16.5622639978139,15.831268041636456,16.496354487323842,463680000 +2022-06-24,17.10251808166504,17.11649882538618,16.287636910270518,16.477376935581376,472153000 +2022-06-27,16.845870971679688,17.306239352209836,16.603204110211394,17.288264381866544,427968000 +2022-06-28,15.960089683532715,17.17841642783328,15.923139753787774,16.876830411741455,461149000 +2022-06-29,15.52069091796875,15.798309643448949,15.149201208571759,15.79231830404367,482352000 +2022-06-30,15.138216018676758,15.545656605686547,14.841623301451254,15.339938722941218,686070000 +2022-07-01,14.503087997436523,15.042347592073154,14.37226803933096,14.878572886252945,577610000 +2022-07-05,14.94348430633545,14.950474678954091,14.035731089261596,14.15556645659554,651397000 +2022-07-06,15.109256744384766,15.297997753159068,14.768723702355592,14.989421379778362,529066000 +2022-07-07,15.836258888244629,15.92313950679781,15.3679020124272,15.434810545701199,492903000 +2022-07-08,15.816285133361816,16.01501264654759,15.367900390156102,15.408844541588206,467972000 +2022-07-11,15.131227493286133,15.505713379636758,15.017383463840279,15.504714346802942,437321000 +2022-07-12,15.061321258544922,15.409842731268506,14.856602404665553,15.247066109475627,458483000 +2022-07-13,15.143209457397461,15.35392061472374,14.4451683925074,14.569997015391333,521918000 +2022-07-14,15.350924491882324,15.451785851708097,14.70780737248184,15.087286500905327,456235000 +2022-07-15,15.740389823913574,15.760361907974943,15.423824053568111,15.63753135293556,385935000 +2022-07-18,16.07892417907715,16.87383233225247,15.98006089057034,16.27964880664775,670517000 +2022-07-19,16.96870231628418,17.086540553268563,16.1498269486933,16.463395590625716,702366000 +2022-07-20,17.782583236694336,17.908411828651666,16.77796399475385,16.923763716222883,760538000 +2022-07-21,18.02525520324707,18.119126205204466,17.520948325961797,17.86048238571712,557049000 +2022-07-22,17.295251846313477,17.94236209828336,17.11350029849363,17.868464163858377,536671000 +2022-07-25,17.00065803527832,17.100521303135608,16.626172209363542,16.995663824282083,480748000 +2022-07-26,16.510332107543945,16.89580253265484,16.455407214753343,16.865842980750855,397865000 +2022-07-27,17.765607833862305,17.911407551893237,16.889809540674666,17.008645853583896,569776000 +2022-07-28,17.95934295654297,18.115129215664382,17.416090067566007,17.950356423261784,474646000 +2022-07-29,18.13809585571289,18.218984167571747,17.667740998284156,17.7885753782972,435460000 +2022-08-01,18.41571807861328,18.820163524797316,17.965336169045,18.15707238058243,476469000 +2022-08-02,18.500598907470703,18.912034688081537,18.067193930058075,18.09715348411525,489527000 +2022-08-03,18.867094039916992,18.941991963683982,18.112130130143015,18.15906656871344,418146000 +2022-08-04,19.188657760620117,19.24757689107455,18.734281609291912,18.823160297594526,409652000 +2022-08-05,18.96296501159668,19.202635725468195,18.640407913943744,18.784209580373243,386068000 +2022-08-08,17.768606185913086,18.213995799408384,17.218362882676377,17.47800666761525,981859000 +2022-08-09,17.06257438659668,17.42307949226524,16.70107120055864,17.228347155139414,668263000 +2022-08-10,18.072187423706055,18.093158539293153,17.293256191756413,17.673734322817726,597422000 +2022-08-11,17.917400360107422,18.681352814995762,17.851490863530667,18.10614231673798,509327000 +2022-08-12,18.683347702026367,18.692336139246862,17.92838373644259,18.13510064991279,478094000 +2022-08-15,19.005905151367188,19.13772413803564,18.58748091480707,18.67535960434154,457666000 +2022-08-16,18.85311508178711,19.115754975228306,18.47563309117103,18.894059233195584,451240000 +2022-08-17,18.309858322143555,18.66237493216147,18.120120219599034,18.497602168927198,446799000 +2022-08-18,18.747262954711914,18.83913587806954,18.15807169165651,18.275909944267593,415447000 +2022-08-19,17.82452964782715,18.49460922307441,17.74563748579289,18.38076519901237,441588000 +2022-08-22,17.010644912719727,17.53392661882778,16.942737355813545,17.4660190619216,409593000 +2022-08-23,17.157445907592773,17.441056961305907,16.946734730699763,16.965709688839496,369986000 +2022-08-24,17.19839096069336,17.382138735444496,16.87183957113937,16.98867785339594,522661000 +2022-08-25,17.888442993164062,17.92239677840363,16.809923652314456,16.820908252307532,770691000 +2022-08-26,16.237707138061523,17.899425287639172,16.214737955773558,17.832517711038342,769127000 +2022-08-29,15.779335975646973,16.31559943467692,15.745383146894872,15.998036535008664,496132000 +2022-08-30,15.446792602539062,16.01700886462623,15.161184478948519,15.938117659650224,530181000 +2022-08-31,15.073307037353516,15.518695701380755,14.938491884407778,15.36290942940349,573710000 +2022-09-01,13.917893409729004,14.360285920966438,13.251808013094072,14.189519872618684,1178865000 +2022-09-02,13.628290176391602,14.151570983840651,13.572366244236866,14.080669178676303,743157000 +2022-09-06,13.446537971496582,13.760107568170556,13.332693959605383,13.712173046876005,535751000 +2022-09-07,13.69926643371582,13.82313376594556,13.331661755414254,13.54842863416654,512657000 +2022-09-08,13.974970817565918,13.99295208288804,13.35463859857364,13.444541114584974,624873000 +2022-09-09,14.371543884277344,14.458450311996268,14.110824601120573,14.141790481823483,486612000 +2022-09-12,14.48941707611084,14.531371771685043,14.182746732868823,14.35356350397063,484159000 +2022-09-13,13.11689281463623,13.90704340206628,13.084927604067657,13.78717243345947,714956000 +2022-09-14,13.113897323608398,13.275722995641786,12.899128137907093,13.239761417639983,588507000 +2022-09-15,12.915108680725098,13.218781956934503,12.776258086547928,13.001016722341738,523625000 +2022-09-16,13.183820724487305,13.197805622661757,12.603444592298251,12.72831029894144,670751000 +2022-09-19,13.367624282836914,13.448537595855514,12.996024164991917,12.998021871678207,569685000 +2022-09-20,13.161845207214355,13.468515569793002,13.042973562258846,13.200803821739566,524818000 +2022-09-21,13.246753692626953,14.01592695660969,13.095915885590195,13.198805875239975,807679000 +2022-09-22,12.547505378723145,13.13487397774676,12.414648842051575,13.05595837624956,759162000 +2022-09-23,12.502554893493652,12.59745310961483,12.243833290999994,12.406658300315856,663309000 +2022-09-26,12.214863777160645,12.645401484838764,12.200878877608904,12.47758173756805,547343000 +2022-09-27,12.399665832519531,12.722318814218484,12.244832603128204,12.493564718799432,553854000 +2022-09-28,12.722318649291992,12.809225084459534,12.3407290361886,12.396668635349345,542414000 +2022-09-29,12.206872940063477,12.486571883512196,11.93316711671052,12.434627698749594,532763000 +2022-09-30,12.125959396362305,12.6194291422396,12.06202801997194,12.074015212585747,565638000 +2022-10-03,12.49855899810791,12.66438103750038,12.091995679020886,12.333736288383395,547478000 +2022-10-04,13.152854919433594,13.205798432836424,12.865164202159265,12.865164202159265,584182000 +2022-10-05,13.194808006286621,13.30668813941161,12.607440403491943,12.897128792057934,507131000 +2022-10-06,13.115893363952637,13.641328257289027,13.088921945715446,13.205796821210336,644157000 +2022-10-07,12.063028335571289,12.656390131527628,12.009086440725248,12.491567410428646,672478000 +2022-10-10,11.657463073730469,12.110974864449592,11.39574445473449,12.024068434661013,698699000 +2022-10-11,11.573554039001465,11.833274006789148,11.27087909082818,11.548580323969118,667482000 +2022-10-12,11.487645149230957,11.722392337587419,11.332811937874556,11.566560749292124,492590000 +2022-10-13,11.947153091430664,12.065026371103782,10.801384839817395,10.959215115007675,850103000 +2022-10-14,11.21493911743164,12.097989264666413,11.19196406249194,12.044047375714609,713432000 +2022-10-17,11.875227928161621,11.935163887669312,11.504627166759075,11.505625543705177,580774000 +2022-10-18,11.954143524169922,12.478579120897942,11.605518487513544,12.330738357702486,659362000 +2022-10-19,12.03805160522461,12.336731087909737,11.821284750365644,11.866236476926462,523131000 +2022-10-20,12.180900573730469,12.755282676924056,12.091995482769084,12.09998726203353,652398000 +2022-10-21,12.452606201171875,12.484572361651132,11.874228755754816,12.08500154788342,609494000 +2022-10-24,12.585464477539062,12.696345287738323,12.051039397189356,12.4945626379864,517457000 +2022-10-25,13.246753692626953,13.28571230644429,12.650394914056134,12.680363371654026,505482000 +2022-10-26,12.882146835327148,13.373617948238937,12.69434906206043,12.855176364987711,532953000 +2022-10-27,13.161845207214355,13.823134703279653,13.107903316267763,13.615357966211398,583113000 +2022-10-28,13.819137573242188,13.835121131094377,13.0469682542808,13.089922279790239,521040000 +2022-10-31,13.482501983642578,13.823136255984974,13.282717003501107,13.763200285617568,486341000 +2022-11-01,13.528450965881348,13.910040552507906,13.50447658143312,13.79616270270372,432817000 +2022-11-02,13.204798698425293,14.194734242960633,13.19680787203194,13.835121333715565,672628000 +2022-11-03,13.406580924987793,13.766194775358752,12.94208128934156,13.028987715807942,500065000 +2022-11-04,14.140792846679688,14.213714379632444,13.682285347325527,13.9709753954596,612576000 +2022-11-07,14.285636901855469,14.396517721923427,13.939010494664025,14.212715367274726,410061000 +2022-11-08,14.586313247680664,14.875002331764124,14.200727296506672,14.785098866709825,595292000 +2022-11-09,13.761201858520508,14.195735001155587,13.744219921750998,14.146786897646434,454414000 +2022-11-10,15.733080863952637,15.756055920385691,14.53137309508661,14.78410157379975,700819000 +2022-11-11,16.30946159362793,16.37139526908105,15.465369958229326,15.790020660509551,655487000 +2022-11-14,16.277494430541992,16.522232066468828,15.904894997972113,16.200577486630568,527852000 +2022-11-15,16.64809226989746,16.979734352692727,16.364397039756362,16.704031852409937,545876000 +2022-11-16,15.892908096313477,16.344422187657635,15.855948141798965,16.144638186290106,649547000 +2022-11-17,15.660158157348633,16.248526092519732,15.518310510588035,15.698117440433851,710894000 +2022-11-18,15.39244556427002,15.9848088796115,15.10375554404222,15.94884635246615,492072000 +2022-11-21,15.300544738769531,15.460372692111331,15.063798892210922,15.13072730018143,404739000 +2022-11-22,16.020767211914062,16.040746179106325,15.105751091739526,15.31153007163173,472866000 +2022-11-23,16.501253128051758,16.509245859928704,16.030760346892983,16.08070587095073,427241000 +2022-11-25,16.252521514892578,16.469287445678606,16.154627223569857,16.300470283585213,167934000 +2022-11-28,15.809996604919434,16.339427908021538,15.708106900644491,16.00878222333703,303741000 +2022-11-29,15.622199058532715,15.914884511468573,15.503327417734571,15.809996816938067,298384000 +2022-11-30,16.909143447875977,16.91613768564476,15.584228989487908,15.684146535771454,565298000 +2022-12-01,17.120969772338867,17.250862487377347,16.621379181628495,16.98508145183784,470977000 +2022-12-02,16.862184524536133,16.91913897652892,16.431537591027467,16.645363109002602,371389000 +2022-12-05,16.596403121948242,16.98108817708203,16.458515605368987,16.66534688023787,352255000 +2022-12-06,15.973912239074707,16.55943198225512,15.806049556125465,16.51646791728719,352694000 +2022-12-07,16.10680389404297,16.172749846641757,15.654173729604334,15.759088264862537,372388000 +2022-12-08,17.15494728088379,17.164939324276737,15.945936711360707,16.259680775379593,515456000 +2022-12-09,16.98708152770996,17.568605803357165,16.961103742717867,17.14595175825143,465338000 +2022-12-12,17.52064323425293,17.5236410372187,16.783248501431842,17.023051775036333,457328000 +2022-12-13,18.057205200195312,18.774617794918285,17.696500685046704,18.515829057167874,656589000 +2022-12-14,17.659530639648438,18.237058470762765,17.405738871124704,17.97227412197752,496888000 +2022-12-15,16.938119888305664,17.305818611715345,16.686327315889205,17.13196129101247,478542000 +2022-12-16,16.557432174682617,17.027048597052637,16.396564689566986,16.85019346435218,478232000 +2022-12-19,16.240692138671875,16.595401033569487,16.13178212686933,16.558432576626064,354039000 +2022-12-20,16.07183074951172,16.29664692951684,15.839022651133764,16.05084803309705,403260000 +2022-12-21,16.487489700317383,16.613387898119957,16.08881620314782,16.100807415218085,325025000 +2022-12-22,15.326440811157227,16.12478736252735,14.869815204882304,16.08082276280508,565045000 +2022-12-23,15.193551063537598,15.32644159609821,14.870815551756776,15.183559021916842,349326000 +2022-12-27,14.1094388961792,15.087637443556918,14.044491580502148,15.0616587078648,464902000 +2022-12-28,14.024507522583008,14.250322305233574,13.872631553851827,13.915596566363247,351066000 +2022-12-29,14.591043472290039,14.670977896009743,14.215351871386131,14.390208780608043,354923000 +2022-12-30,14.602034568786621,14.617021677131687,14.221346008211805,14.322263143028222,310490000 +2023-01-03,14.303278923034668,14.983722051275688,14.084458370348052,14.838840315183736,401277000 +2023-01-04,14.73692512512207,14.840840075575478,14.22934158563889,14.555074914722184,431324000 +2023-01-05,14.25331974029541,14.552074696828278,14.136414963987127,14.479134517120297,389168000 +2023-01-06,14.846833229064941,14.997709608789437,14.022508953382575,14.462148249448697,405044000 +2023-01-09,15.615204811096191,16.042853882336043,15.128603078053724,15.271486598821125,504231000 +2023-01-10,15.895976066589355,15.948932173589144,15.459333553934178,15.49430474778188,384101000 +2023-01-11,15.987899780273438,16.0148781028567,15.550258635785255,15.827032288803178,353285000 +2023-01-12,16.497480392456055,16.623376674174565,15.479314701266622,16.08681762259126,551409000 +2023-01-13,16.88516616821289,16.908148056338185,16.15176778844737,16.264674246702192,447287000 +2023-01-17,17.68750762939453,17.713487319827372,16.885165521758307,16.885165521758307,511102000 +2023-01-18,17.362775802612305,17.858368155388927,17.267852350964912,17.652537414377978,439624000 +2023-01-19,16.75127410888672,17.182921549244565,16.717303453615347,17.02205215333367,452932000 +2023-01-20,17.82439613342285,17.84138241393569,16.811226343623662,16.997072985244962,564967000 +2023-01-23,19.177288055419922,19.229245530307768,17.80341372696204,18.04921071798228,655163000 +2023-01-24,19.249223709106445,19.47903681560769,18.804588414658518,18.811582652021247,496204000 +2023-01-25,19.307180404663086,19.354142810511668,18.56478866094539,18.89751622008394,449537000 +2023-01-26,19.78578758239746,20.149489885366556,19.26221642846413,19.684870441693302,489535000 +2023-01-27,20.34832763671875,20.61111281542293,19.38911447092714,19.446067014153495,542142000 +2023-01-30,19.146312713623047,20.123510758938984,19.13432150128274,19.9336676842303,488611000 +2023-01-31,19.52100944519043,19.67088628768242,18.934490016699552,19.154309258635312,498017000 +2023-02-01,20.925853729248047,21.174648503788042,19.594943571300696,19.674877995136793,660477000 +2023-02-02,21.691225051879883,21.931028319443673,20.683052314586803,20.982805922594803,564276000 +2023-02-03,21.08272361755371,21.727195946386907,20.771977442286037,20.98280511679256,429366000 +2023-02-06,21.071735382080078,21.55234058671362,20.768982041999962,20.78896612562126,452197000 +2023-02-07,22.15484619140625,22.240776221047813,21.13268305609244,21.364493456754502,664150000 +2023-02-08,22.186819076538086,22.859268377946858,21.989979871627146,22.36866926710401,559651000 +2023-02-09,22.318714141845703,23.001155581267543,22.101892729953626,22.58749493647335,523876000 +2023-02-10,21.247587203979492,22.059921229694073,20.793960380960065,21.672240349373936,550737000 +2023-02-13,21.770158767700195,22.02994609258764,20.944834933269593,21.520363482899203,474919000 +2023-02-14,22.952192306518555,23.03012755681978,21.348505011824344,21.56033132218114,675474000 +2023-02-15,22.745361328125,22.8362864231292,22.087901043076933,22.53053721244562,420575000 +2023-02-16,21.98398780822754,22.531537591194823,21.909048448284622,22.114879171338252,412026000 +2023-02-17,21.370487213134766,21.72219826611611,20.957825285879114,21.613288266361437,465888000 +2023-02-21,20.63808822631836,21.47640004274012,20.601117866588783,20.982805051800373,410015000 +2023-02-22,20.737009048461914,21.08672289537773,20.40428148237051,20.690048547419124,513184000 +2023-02-23,23.64462661743164,23.868444166004814,23.00614980675236,23.420810974645615,1117995000 +2023-02-24,23.266931533813477,23.454779221175173,22.92821032876659,23.20598256621261,589716000 +2023-02-27,23.481761932373047,23.86045139974158,23.4348014272754,23.650624216946603,452994000 +2023-02-28,23.196990966796875,23.805493492684064,23.18699892583366,23.352863375406507,455963000 +2023-03-01,22.67941665649414,23.236960375063273,22.489571679600164,23.173011690631437,460026000 +2023-03-02,23.294912338256836,23.360858289754244,22.41363444953809,22.469590264985175,389415000 +2023-03-03,23.870437622070312,23.880429662498482,23.111059701611104,23.300904658172616,412393000 +2023-03-06,23.534717559814453,24.22814773094674,23.467771069999735,23.87144155642439,437429000 +2023-03-07,23.272886276245117,24.10934295943223,23.22591589464523,23.584684063816997,515154000 +2023-03-08,24.165306091308594,24.184294766581292,23.408797420933155,23.471756258943316,513573000 +2023-03-09,23.420793533325195,24.43813261674752,23.36782652138058,24.15931242075564,501257000 +2023-03-10,22.950096130371094,23.611667155651173,22.71125091840863,23.39380822343578,474866000 +2023-03-13,22.951093673706055,23.28287892325679,22.282529164620772,22.737233773647205,421890000 +2023-03-14,24.047380447387695,24.20327932512599,23.444771213854455,23.48074905093903,474910000 +2023-03-15,24.2122745513916,24.270235562421657,23.34483792874035,23.745576714518688,524486000 +2023-03-16,25.524423599243164,25.57139207335748,23.878491278999082,24.01140628522713,583253000 +2023-03-17,25.708301544189453,26.381863817929176,25.651337431359526,25.965134687603545,848547000 +2023-03-20,25.883190155029297,26.00711022624769,25.113689438376866,25.598375276520795,432747000 +2023-03-21,26.181997299194336,26.37487284283391,25.36452926173858,26.16301052912087,547408000 +2023-03-22,26.45081901550293,27.571091621041035,26.2199680667983,26.40784575429176,797295000 +2023-03-23,27.173351287841797,27.481151940364768,26.672677017823016,27.097400403214937,564889000 +2023-03-24,26.761619567871094,27.149368241079962,26.33789496036664,27.013456826272407,454920000 +2023-03-27,26.513782501220703,26.9824780003573,26.34788986309708,26.8195836745759,361026000 +2023-03-28,26.392860412597656,26.49579420860575,25.833224372418172,26.429837056217544,356104000 +2023-03-29,26.96648597717285,27.06042483163502,26.579738018819665,26.80759068169934,393694000 +2023-03-30,27.3652286529541,27.481154500758176,27.084410876510685,27.211329265409276,364516000 +2023-03-31,27.75897216796875,27.815934380003373,27.08740743538737,27.122384566656116,433933000 +2023-04-03,27.946849822998047,27.981826954201942,27.318258357219978,27.49114640923392,398716000 +2023-04-04,27.435182571411133,27.98182846186949,27.28927741449613,27.947850130837605,368592000 +2023-04-05,26.86355209350586,26.980474822292805,26.37786749452917,26.811585800897024,515015000 +2023-04-06,27.019454956054688,27.06242631919689,26.40985020646778,26.566747909374286,397654000 +2023-04-10,27.561100006103516,27.603072562534653,26.651690804540983,26.805590178121808,395279000 +2023-04-11,27.1513671875,27.771964430932886,27.108393921533427,27.70600728201999,314378000 +2023-04-12,26.477802276611328,27.45017025119376,26.430831901042534,27.352234292394773,446259000 +2023-04-13,26.44582176208496,26.86954632300793,26.31190987217555,26.716645759894465,353615000 +2023-04-14,26.74063491821289,26.86555379993831,26.20298394452447,26.486800040275686,395660000 +2023-04-17,26.98447608947754,26.988473203686386,26.415845135360854,26.547759434806412,321471000 +2023-04-18,27.649045944213867,28.091759262343043,27.339247645401258,27.51513402889549,604812000 +2023-04-19,27.912870407104492,27.98182586482497,27.214324706114123,27.343240685548253,358660000 +2023-04-20,27.086408615112305,28.01180820232442,26.982476023380784,27.653040047394537,427713000 +2023-04-21,27.101396560668945,27.165356100991744,26.70465489349958,26.93450514321989,345103000 +2023-04-24,27.024450302124023,27.348239440320924,26.653690781200147,26.99546979327811,339282000 +2023-04-25,26.223968505859375,27.2293161185349,26.207980048962167,27.06042517631063,378527000 +2023-04-26,26.938505172729492,27.312262999046098,26.687668618436636,26.984476752537656,406337000 +2023-04-27,27.208330154418945,27.477156579807456,26.607720371241534,27.345242278323862,377161000 +2023-04-28,27.73099136352539,27.739984394080437,27.05342998469089,27.20733127338207,292216000 +2023-05-01,28.891237258911133,29.039141923615947,27.76197146754515,27.82193199383704,570329000 +2023-05-02,28.19169044494629,28.81728552032771,28.0647739674423,28.661386629023887,402730000 +2023-05-03,27.78395652770996,28.348590376013785,27.45417077419222,27.821931972424778,383387000 +2023-05-04,27.544113159179688,27.840919391214324,27.22232162669159,27.63305419552841,321850000 +2023-05-05,28.66138458251953,28.736334757570592,27.713001157721607,27.807938808563854,361494000 +2023-05-08,29.132076263427734,29.201031717397843,28.33159752844978,28.503484856309754,344979000 +2023-05-09,28.552452087402344,28.954191553341325,28.431532251755662,28.880240185650283,314869000 +2023-05-10,28.866252899169922,29.094105560009464,28.44252830281305,28.986173947740745,369350000 +2023-05-11,28.559450149536133,28.931210344411994,28.227666813122973,28.87724453995884,322149000 +2023-05-12,28.32160758972168,28.761322564942308,28.02779776950865,28.510484105930274,274222000 +2023-05-15,28.934207916259766,28.95019827906706,28.133729096093575,28.48949703703172,293926000 +2023-05-16,29.194042205810547,29.850617354397016,28.81329083509019,28.82228386631905,449405000 +2023-05-17,30.158411026000977,30.179397303455694,29.410897359281257,29.56479672728252,432535000 +2023-05-18,31.657438278198242,31.807340536574944,30.30031991259901,30.39026164884716,748725000 +2023-05-19,31.24370765686035,31.55950253794087,30.89593395749169,31.515530471475522,473908000 +2023-05-22,31.155765533447266,31.499542119934745,30.660087176948643,30.880942499765002,372000000 +2023-05-23,30.668081283569336,31.267692227057807,30.61111907309606,30.979879050427765,356253000 +2023-05-24,30.51818084716797,30.58713630992968,29.786655566782457,30.19039269854062,721419000 +2023-05-25,37.95534896850586,39.454375407130364,36.61122070862838,38.497995807341425,1543911000 +2023-05-26,38.92072296142578,39.14457660817056,37.52562906518615,37.865408555661546,714397000 +2023-05-30,40.084964752197266,41.91077854478706,39.92307115381186,40.56865175565744,923401000 +2023-05-31,37.80944061279297,40.26884165058491,37.79744736537709,39.46236628795612,1002580000 +2023-06-01,39.74419021606445,40.02400727959351,38.31511796351833,38.46401952597585,635873000 +2023-06-02,39.30147171020508,40.47371062756024,39.03264531714134,40.070972345035095,482731000 +2023-06-05,39.14557647705078,39.539317935308446,38.681876946870204,38.88374549804094,396094000 +2023-06-06,38.6289176940918,39.134589881532925,38.123245506650676,38.80480599281515,388729000 +2023-06-07,37.45454788208008,39.47744543312822,37.33561334043707,38.893764495503234,511998000 +2023-06-08,38.488990783691406,38.842797765126164,37.48454176498526,37.703420255024895,417772000 +2023-06-09,38.74884796142578,39.68933264036205,38.545959600574975,39.0157005810381,427717000 +2023-06-12,39.4604606628418,39.50843481392578,38.59693356856273,39.17861681441675,388701000 +2023-06-13,40.99961853027344,41.0785778084364,39.71832028335553,40.164076100144555,613208000 +2023-06-14,42.973541259765625,42.97653797583017,40.5298718137659,40.80172657491871,740465000 +2023-06-15,42.629730224609375,43.265384836246646,42.12400575806211,42.57875935956908,568622000 +2023-06-16,42.668704986572266,43.69714280637508,42.637719859224546,43.42629077833163,655709000 +2023-06-20,43.78409194946289,43.9659956488173,42.65071191947433,42.97453641916343,451153000 +2023-06-21,43.021514892578125,43.591207435657196,42.05704501017966,43.47726740199492,551603000 +2023-06-22,43.001529693603516,43.40230809572924,42.21096084923493,42.22994767790135,417737000 +2023-06-23,42.185970306396484,42.78564141996851,41.99207590923577,42.440832245341774,358140000 +2023-06-26,40.60982894897461,42.74066558376808,40.078117742451454,42.43782951394114,594322000 +2023-06-27,41.8531494140625,41.91711366832996,40.42593102539138,40.77673742484644,462175000 +2023-06-28,41.094566345214844,41.82216977478574,40.49589414728599,40.637814961274316,582639000 +2023-06-29,40.79972457885742,41.577299950801056,40.577845588400876,41.53532305058581,380514000 +2023-06-30,42.2789192199707,42.526785015369995,41.47835753719588,41.657260733272246,501148000 +2023-07-03,42.389854431152344,42.87459038816099,42.178971032897955,42.493797772318985,198209000 +2023-07-05,42.293914794921875,43.15344240900505,42.062039108236945,42.112011067613764,323618000 +2023-07-06,42.08002471923828,42.15598345897762,41.323437850288094,41.8211671860052,303582000 +2023-07-07,42.47980880737305,43.19042323587049,42.156986987539184,42.298907804592,355881000 +2023-07-10,42.156986236572266,42.787642471608095,41.62627391492432,42.63372716743976,353908000 +2023-07-11,42.381866455078125,42.73467453078964,42.044053399323744,42.45782520987243,298244000 +2023-07-12,43.87804412841797,43.911027066615475,42.75365801470833,43.00951883998821,481277000 +2023-07-13,45.9519157409668,46.12981621305511,44.46772535978278,44.49371214998775,478204000 +2023-07-14,45.444190979003906,48.06176136683886,45.03541375901061,46.55758152341574,772075000 +2023-07-17,46.43564987182617,46.47063062366615,45.23730653549651,46.26374664142169,510488000 +2023-07-18,47.468082427978516,47.86986348716586,45.7090445218803,46.675515893049734,569164000 +2023-07-19,47.05131530761719,47.791912159998795,46.71649899256564,47.43810520447181,427502000 +2023-07-20,45.49516296386719,47.061309289375785,45.03741268358768,46.481623930021314,537865000 +2023-07-21,44.284820556640625,45.84097398700811,44.07593496513591,45.7630136202291,963769000 +2023-07-24,44.58765411376953,45.08438454090298,44.01596766528733,44.70658865527382,382516000 +2023-07-25,45.65407180786133,46.15779455675277,44.898483871908745,44.916475604061475,348081000 +2023-07-26,45.42720031738281,46.02787414060496,44.60565021693435,45.995890105777626,364237000 +2023-07-27,45.87495803833008,47.3691412842477,45.72503835474356,46.49361978738997,455976000 +2023-07-28,46.724491119384766,47.00134040286981,46.35569298072291,46.642535130211954,331194000 +2023-07-31,46.7035026550293,47.10428482748887,46.480624760835596,46.728490538955285,251055000 +2023-08-01,46.481624603271484,46.87441172832599,46.00188696062389,46.434649363103794,237858000 +2023-08-02,44.244850158691406,45.81499224934551,43.363331362198146,45.80599828780853,530142000 +2023-08-03,44.4907112121582,45.093382845124545,43.776101176403955,43.776101176403955,324176000 +2023-08-04,44.65562057495117,45.61709364469408,44.36877842760478,44.960454456109325,362666000 +2023-08-07,45.39221954345703,45.51515353063665,44.53868540861367,45.086386746173794,322154000 +2023-08-08,44.63963317871094,45.217316942470724,44.03196319010825,44.82852923844918,353843000 +2023-08-09,42.530784606933594,44.287824912823,42.111011764378375,44.24984363147646,586449000 +2023-08-10,42.36487579345703,43.550229596888094,41.81217607853569,42.13699953791343,492705000 +2023-08-11,40.832706451416016,41.99507385757675,40.61682471129046,41.728217445224736,533085000 +2023-08-14,43.7291259765625,43.77610121709491,40.28900646052013,40.4639102150388,690286000 +2023-08-15,43.91602325439453,45.24330157403039,43.68614920885437,44.535687703362775,676512000 +2023-08-16,43.46227264404297,44.65062306232533,43.38231446466475,44.49570885554983,527451000 +2023-08-17,43.320350646972656,44.037957367966825,42.97753549055958,43.94600851428991,452395000 +2023-08-18,43.2753791809082,43.55422630893718,41.63727335430421,42.61173994421543,583768000 +2023-08-21,46.941375732421875,47.03932184051733,44.197874362477556,44.46972532960602,692573000 +2023-08-22,45.6430778503418,48.16070421705832,45.308261577730654,48.108730641843266,755293000 +2023-08-23,47.09029769897461,47.174251508019,45.18333763432702,45.84097961779093,779046000 +2023-08-24,47.137264251708984,50.23857177595236,47.13326863032971,50.1885998204007,1156044000 +2023-08-25,45.992897033691406,47.77892090852691,44.999436003373106,46.9863542513935,925341000 +2023-08-28,46.809444427490234,46.9543657684175,44.863508175320256,46.45663639493685,685192000 +2023-08-29,48.75738525390625,49.05422410380392,46.365689250102406,46.640540743084706,701397000 +2023-08-30,49.237117767333984,49.89975418473673,48.39857488779277,49.01723659596874,735206000 +2023-08-31,49.32807159423828,49.71685929593791,48.93128883683363,49.353059479355466,528570000 +2023-09-01,48.48253631591797,49.772832417582066,48.11573594167944,49.73485494683887,463830000 +2023-09-05,48.52151107788086,48.82434715495617,47.83388674600478,48.19668764519063,382653000 +2023-09-06,47.03919982910156,48.526509476419605,46.55842365882449,48.418561612125444,468670000 +2023-09-07,46.219573974609375,46.322526887042805,45.13107789383709,45.50390615122535,433330000 +2023-09-08,45.55088806152344,46.584409473307375,45.250028806839694,45.92071940996517,473069000 +2023-09-11,45.157066345214844,46.14160670266933,44.29146651279777,46.1266142635962,473966000 +2023-09-12,44.849212646484375,45.65184205526837,44.51036898860746,44.71727382674797,349256000 +2023-09-13,45.463932037353516,45.908725609094766,44.48238464078705,44.57933983256991,398355000 +2023-09-14,45.55988693237305,45.965697093021376,45.110094621925995,45.92871548306057,370097000 +2023-09-15,43.879661560058594,45.577871869694,43.78770131863037,45.31999198709531,506831000 +2023-09-18,43.94562530517578,44.221498380036465,41.98053676641629,42.72819123361807,500271000 +2023-09-19,43.49983596801758,43.94562846497067,42.98207442166159,43.81269066855042,373064000 +2023-09-20,42.21943283081055,43.88266351133672,42.203441401322486,43.579802461208814,367108000 +2023-09-21,40.99799728393555,42.08049577030541,40.96101567472074,41.563736977268604,450736000 +2023-09-22,41.590721130371094,42.09548821247719,41.21189511865896,41.552736723974945,479236000 +2023-09-25,42.20244216918945,42.51629589542394,41.15792424834583,41.57173394062744,419091000 +2023-09-26,41.89158630371094,42.80016565537031,41.63570436324995,41.981544768615734,402282000 +2023-09-27,42.448326110839844,42.85214210831798,41.60971787103185,42.31039336126926,444935000 +2023-09-28,43.06903839111328,43.42587144415849,42.095490602814664,42.440328178113646,424663000 +2023-09-29,43.47884750366211,44.123549133326094,43.28693511492848,43.80669465697379,397830000 +2023-10-02,44.761253356933594,45.154069017187716,43.840678635675474,44.009599054426594,433298000 +2023-10-03,43.4968376159668,45.10909311668892,43.22596325710491,44.7872398839657,470850000 +2023-10-04,44.020599365234375,44.12255330566711,43.27194577354406,43.72173808377064,361821000 +2023-10-05,44.66729736328125,44.879200950918715,43.867668737435245,44.02959243795168,393483000 +2023-10-06,45.74079895019531,45.767786867817584,44.005603198940975,44.17252564280475,434436000 +2023-10-09,45.25202178955078,45.583868691074,44.34744233696588,44.82122173529832,409675000 +2023-10-10,45.77678298950195,46.23756795276768,45.06711283415853,45.289010107776726,368582000 +2023-10-11,46.7843132019043,46.837290048651624,46.02866295969664,46.1745952222244,378137000 +2023-10-12,46.92325210571289,47.586945967380146,46.30853914386971,46.75533066493349,481325000 +2023-10-13,45.43993377685547,47.094169510667186,45.25901788884397,46.93823975092536,474115000 +2023-10-16,46.07365036010742,46.20358739976767,44.8911958461008,45.04212688013775,375099000 +2023-10-17,43.91764450073242,44.73326836237256,42.46031976761086,43.97961605242817,812333000 +2023-10-18,42.176448822021484,43.19897746718347,41.805622331067,42.571266267488184,627294000 +2023-10-19,42.08149719238281,43.27694225554759,41.86259688147746,42.79116734856338,501233000 +2023-10-20,41.367828369140625,42.450326848741874,41.0589695927208,41.870593705500575,477266000 +2023-10-23,42.95509338378906,43.22796955938642,40.92603485604566,41.209903709929456,478530000 +2023-10-24,43.64277267456055,43.676757321663544,42.67122661422344,43.05704558498647,401463000 +2023-10-25,41.7596435546875,43.6297789361814,41.53574830765745,43.377892970342636,398379000 +2023-10-26,40.30731964111328,42.23642589504536,39.86152709976489,41.833612702341114,541001000 +2023-10-27,40.481239318847656,41.18691356194545,39.99646337372596,41.11094855365019,416784000 +2023-10-30,41.141929626464844,41.74664887563725,40.462244361806775,41.06796641155254,388028000 +2023-10-31,40.7611083984375,40.86006537582252,39.21182716227926,40.43126324594468,517969000 +2023-11-01,42.305397033691406,42.361370852066266,40.85007013008419,40.86506257244454,437593000 +2023-11-02,43.48583984375,43.863663031413026,42.874123932526324,43.307920925769054,409172000 +2023-11-03,44.98414993286133,45.28800612867796,43.70274239785865,43.99960568025811,424610000 +2023-11-06,45.729801177978516,45.91371784511654,44.87819475411046,45.264017491010264,400733000 +2023-11-07,45.933712005615234,46.19658683928955,45.137080351571434,45.69782127762116,343165000 +2023-11-08,46.552425384521484,46.84528891690733,45.946703314492126,46.07864213351029,346719000 +2023-11-09,46.92824935913086,48.207655129484806,46.728341254280565,47.44500813069146,540496000 +2023-11-10,48.31260681152344,48.44954438031616,47.261096034839866,47.4779945591138,421245000 +2023-11-13,48.59747314453125,49.0932455425318,48.07671461686158,48.29761289799248,384136000 +2023-11-14,49.632991790771484,49.81091072360735,49.0172798779873,49.656982745411305,416954000 +2023-11-15,48.86534881591797,49.93685071433626,48.17766786704911,49.91186458554616,475497000 +2023-11-16,49.45708084106445,49.50206198018349,48.30761579872143,48.656453168876766,339756000 +2023-11-17,49.27516555786133,49.69397019639206,48.98429998268991,49.501058800683616,325205000 +2023-11-20,50.38564682006836,50.52458236287964,49.15821508964933,49.28915491828104,414120000 +2023-11-21,49.920860290527344,50.4935928571012,49.19919468409959,50.10277517356445,565747000 +2023-11-22,48.69342803955078,50.311677390399474,47.66790243959162,49.828903283324706,899420000 +2023-11-24,47.753868103027344,48.898338123964756,47.72288042046281,48.447546842242424,294645000 +2023-11-27,48.21965026855469,48.50751503969105,47.629923460498674,47.777853703101385,395662000 +2023-11-28,47.7988395690918,48.300609664179134,47.45100125443084,48.2136481790491,401491000 +2023-11-29,48.117698669433594,48.739412176857265,47.837829598788915,48.35659018010254,382005000 +2023-11-30,46.74833297729492,48.08771233820332,46.400494624850445,48.00174983128795,526247000 +2023-12-01,46.74333190917969,47.178131734648986,46.165600596706255,46.50344524286752,369317000 +2023-12-04,45.48891067504883,46.055649290414806,44.98914235651732,46.055649290414806,437543000 +2023-12-05,46.548519134521484,46.58250295286297,45.25400334691917,45.448929830983346,371718000 +2023-12-06,45.48591613769531,47.36921155253726,45.39495069645239,47.197275238129286,380590000 +2023-12-07,46.57850646972656,46.61149502575525,45.58687833083044,45.68284295931475,350823000 +2023-12-08,47.48816680908203,47.72307920041658,46.53252440936205,46.57750949930058,359224000 +2023-12-11,46.6094970703125,47.51315707527434,45.81279915946564,47.47317498768805,509728000 +2023-12-12,47.63911056518555,47.64810605776617,46.028715290198626,46.028715290198626,372387000 +2023-12-13,48.06995391845703,48.57576453625137,47.59013451910957,47.61112654633229,447792000 +2023-12-14,48.33184814453125,48.65172771318974,47.40419892072773,48.37183404392987,391232000 +2023-12-15,48.871646881103516,49.38545387287282,48.10193546895566,48.175909002325604,479948000 +2023-12-18,50.05820083618164,50.414066187630915,49.13155069141953,49.381456841806674,412587000 +2023-12-19,49.58537673950195,49.68134136834579,48.87664329291069,49.40544401373602,464444000 +2023-12-20,48.092933654785156,49.98022517040364,48.07993804838336,49.636352578237826,397894000 +2023-12-21,48.97161102294922,49.076571148767,48.40082241502789,48.79267736467951,300425000 +2023-12-22,48.81167221069336,49.36446221767303,48.44880569619553,49.17653306295307,252507000 +2023-12-26,49.260498046875,49.581376676631486,48.94161756801922,48.949613984887115,244200000 +2023-12-27,49.3984489440918,49.661350703421,49.066572842938115,49.49241542635842,233648000 +2023-12-28,49.50341033935547,49.86527396770583,49.39345101981501,49.62436711615611,246587000 +2023-12-29,49.50341033935547,49.978234327074226,48.732699840316755,49.79430147307111,389293000 +2024-01-02,48.14991760253906,49.27649344260116,47.57713465197093,49.22551389912714,411254000 +2024-01-03,47.551143646240234,48.16591065021649,47.302236567517355,47.46717554449256,320896000 +2024-01-04,47.979984283447266,48.48179475152094,47.49016653492504,47.74906818641796,306535000 +2024-01-05,49.07856750488281,49.52839932284036,48.28786410604074,48.44380758245641,415039000 +2024-01-08,52.2333869934082,52.2553819091048,49.46042985737145,49.493418417650794,642510000 +2024-01-09,53.120052337646484,54.304608899415356,51.670595858503674,52.38133132087113,773100000 +2024-01-10,54.32959747314453,54.57950363229104,53.468920600031716,53.59587564392309,533796000 +2024-01-11,54.801422119140625,55.32522751933409,53.53989856479592,54.97835763768243,596759000 +2024-01-12,54.68946075439453,54.94936528488959,54.30960615330977,54.59949438818704,352994000 +2024-01-16,56.360836029052734,56.813665103138256,54.879393878712925,54.99734961591672,449580000 +2024-01-17,56.031959533691406,56.44980188752581,54.71945269845349,56.325847887071866,474394000 +2024-01-18,57.08556365966797,57.57837864545508,56.08593900392558,57.23850610997206,491650000 +2024-01-19,59.46866989135742,59.47766538428564,57.203517829580356,57.967230984594906,543501000 +2024-01-22,59.63161087036133,60.308358741109046,59.047830414692214,60.02646308238528,452955000 +2024-01-23,59.850528717041016,59.88751357892662,58.56301013401379,59.54764104000483,294654000 +2024-01-24,61.338966369628906,62.82540771389363,59.91550110281905,60.28136484798457,560271000 +2024-01-25,61.593868255615234,62.69545573126452,60.8271540987025,62.326590967001806,482777000 +2024-01-26,61.00809097290039,61.759811433716834,60.550266507965134,60.93711847607482,390309000 +2024-01-29,62.441551208496094,62.46554046020734,60.884137413565526,61.209012360122756,348733000 +2024-01-30,62.750431060791016,63.46916289646236,62.23662409247559,62.876387020851176,410735000 +2024-01-31,61.503902435302734,62.24562445900208,60.67721323683143,61.41693329631054,453795000 +2024-02-01,63.00334167480469,63.167281577618986,61.626859664228725,62.07668769492248,369146000 +2024-02-02,66.13516998291016,66.57499963939881,63.66609208338151,63.94998587832111,476578000 +2024-02-05,69.30597686767578,69.47091584987561,67.17977633836104,68.19939012424172,680078000 +2024-02-06,68.19739532470703,69.72781896754408,66.27512050871108,69.60386495591794,683111000 +2024-02-07,70.07267761230469,70.1936343745623,67.57461541049389,68.29334720317483,495575000 +2024-02-08,69.61485290527344,70.76741990227906,69.42892572649546,70.04768899799114,414422000 +2024-02-09,72.10592651367188,72.15790132018077,70.18564235653706,70.50652100790245,436637000 +2024-02-12,72.22087860107422,74.5829904741092,71.22325216031359,72.57274383383451,613710000 +2024-02-13,72.1009292602539,73.42243172037925,69.5938748865512,70.37358093821054,602580000 +2024-02-14,73.87226104736328,74.20813345586252,71.91099955356471,73.17452501401227,504917000 +2024-02-15,72.63072204589844,73.9472289995395,72.37282328939969,73.84127361084667,420122000 +2024-02-16,72.58573913574219,74.37406898709354,72.47378167003887,74.07218040927339,495327000 +2024-02-20,69.42593383789062,71.92899173506727,67.70857639129635,71.91999242878622,704833000 +2024-02-21,67.4466781616211,68.86214710879592,66.22313849991595,67.9804743369606,690298000 +2024-02-22,78.5085220336914,78.5455030813757,74.1921420425949,74.99684018330679,865100000 +2024-02-23,78.78740692138672,82.36305967089498,77.54087350099768,80.759665666911,829388000 +2024-02-26,79.06231689453125,80.61573447856021,78.47553160288044,79.67008277283831,503973000 +2024-02-27,78.67145538330078,79.4501699351413,77.1330392208547,79.35120044520698,391705000 +2024-02-28,77.63385009765625,78.90337002935253,77.09605003023249,77.59086697046706,393110000 +2024-02-29,79.08230590820312,79.95997471561954,78.32059087723945,79.0643149217093,507289000 +2024-03-01,82.24810791015625,82.26910374751212,79.40517391258761,79.96996422541928,479135000 +2024-03-04,85.20500183105469,87.66207928922401,83.6875739405617,84.09841513764894,615616000 +2024-03-05,85.93576049804688,86.06872004565462,83.38960003379123,85.24198821051228,520639000 +2024-03-06,88.67086029052734,89.69452599594824,87.00141069166892,87.99308922719804,582520000 +2024-03-07,92.6385498046875,92.73651717702312,89.57255620841083,90.12837327546654,608119000 +2024-03-08,87.49925231933594,97.36801162259309,86.47758481062256,95.10675351305797,1142269000 +2024-03-11,85.7458267211914,88.76782871199401,84.13835321441624,86.4006103441235,678364000 +2024-03-12,91.88280487060547,91.92978650047704,86.1216977613809,88.02007593748665,668075000 +2024-03-13,90.85814666748047,91.473941646385,88.40594947132757,91.02509163024045,635713000 +2024-03-14,87.91510772705078,90.61622350841212,86.57154750613068,89.54757446626068,602318000 +2024-03-15,87.80813598632812,89.51657406692517,86.22866094849327,86.90143633231817,642086000 +2024-03-18,88.42594146728516,92.37464071222252,87.05638881145386,90.35830507117406,668976000 +2024-03-19,89.36864471435547,90.51426446803778,84.98208522610015,86.67152505126207,672171000 +2024-03-20,90.34231567382812,90.38030520484318,88.19401951660328,89.76749997737916,479063000 +2024-03-21,91.40496063232422,92.61756721905257,90.37530021359187,92.26968196617385,480372000 +2024-03-22,94.2580337524414,94.74687156183035,90.80416666140296,91.11106503897344,586719000 +2024-03-25,94.97078704833984,96.7342074446901,93.47928046219188,93.91013861786189,552136000 +2024-03-26,92.53058624267578,96.34333614885402,92.47160751849903,95.8195062336972,513648000 +2024-03-27,90.22034454345703,93.20935991690288,89.09371596526927,93.08140362412708,586067000 +2024-03-28,90.3263168334961,91.2700069314821,89.163696917333,89.97043098866838,435212000 +2024-04-01,90.33331298828125,92.1947007975338,89.17469715880289,90.26933865065378,452441000 +2024-04-02,89.42261505126953,90.06440242112468,87.59121620163441,88.41893947358703,433064000 +2024-04-03,88.93477630615234,90.3443168469122,88.3709661913593,88.45493823513225,370067000 +2024-04-04,85.87677764892578,90.60422800372173,85.85178433643762,90.37629845117095,434965000 +2024-04-05,87.97908782958984,88.45193199631433,85.89777114739914,86.83745712010142,399678000 +2024-04-08,87.10437774658203,88.80081883400379,86.70350850941023,88.67085666122206,283220000 +2024-04-09,85.3259506225586,87.60620698800746,82.99472376686872,87.41326961083752,503547000 +2024-04-10,87.01040649414062,87.3712879556285,83.68149867040677,83.89843024698811,431929000 +2024-04-11,90.58622741699219,90.70918810631315,86.89744487180356,87.39127824687137,431637000 +2024-04-12,88.15703582763672,90.1453886602286,87.50125303417155,89.66953943111257,426805000 +2024-04-15,85.97274780273438,90.58323225547265,85.9007728583494,89.06873054875433,443077000 +2024-04-16,87.38628387451172,88.08904823109181,86.03572977127556,86.40460421758179,370453000 +2024-04-17,84.00739288330078,88.7458333599475,83.92241409948026,88.3109710984958,495400000 +2024-04-18,84.64318084716797,86.16168663370678,82.37492908333081,84.94208621726145,447260000 +2024-04-19,76.17497253417969,84.29630512599306,75.58117346384236,83.12269469975273,875198000 +2024-04-22,79.49188232421875,80.04670035538005,76.3749101252901,78.07834524781059,596341000 +2024-04-23,82.39592742919922,82.74181446817349,80.23763989778655,80.74247130165297,438559000 +2024-04-24,79.65082550048828,84.05437709629325,79.1569845005292,83.92241667959377,512208000 +2024-04-25,82.6048583984375,83.29562566305763,78.19730258611348,78.84208734175279,424641000 +2024-04-26,87.70618438720703,88.30198930446801,83.3596128981717,83.79047109382074,551011000 +2024-04-29,87.7281723022461,87.96308807915567,85.23798574736955,87.56622296271497,388971000 +2024-04-30,86.37361907958984,88.78982495986544,86.27165520822136,87.21134125053536,363709000 +2024-05-01,83.01371765136719,85.9717451202874,81.22830132116862,85.04905184528752,559863000 +2024-05-02,85.78881072998047,86.20867093085921,83.17266601309362,84.42125626969049,377898000 +2024-05-03,88.75983428955078,89.25166943381491,87.01140828668458,87.76016278941914,398341000 +2024-05-06,92.10973358154297,92.18970913389045,89.02574784622284,89.36063689142837,376203000 +2024-05-07,90.52425384521484,91.75084815179432,88.98176145323684,91.06807385977748,437342000 +2024-05-08,90.38230895996094,91.16404981267715,89.39063036492911,89.45361321300157,325721000 +2024-05-09,88.71784973144531,91.04208295679378,88.20202038816478,90.4992620554592,378013000 +2024-05-10,89.84847259521484,91.3709748992257,89.19768547851668,90.2753342742342,335325000 +2024-05-13,90.36931610107422,90.96811842024397,88.49992744150495,90.44828491109924,289680000 +2024-05-14,91.32598876953125,91.62089001998181,88.904779793576,89.5695622301617,296507000 +2024-05-15,94.59890747070312,94.83083350687552,91.5689050462718,92.44161932872312,417735000 +2024-05-16,94.3280029296875,95.78752238437566,94.07208269713682,94.87882442022669,323952000 +2024-05-17,92.4486083984375,94.70886703782735,91.77583301886031,94.33799437588382,359691000 +2024-05-20,94.74887084960938,95.16873108150425,93.40931459730984,93.71921034558147,318764000 +2024-05-21,95.35466766357422,95.36866300361463,93.14939104451075,93.56825212335475,328946000 +2024-05-22,94.91881561279297,95.98846392246197,93.21837781672151,95.42765114316352,548648000 +2024-05-23,103.76490783691406,106.2850758370863,101.48664948420172,101.99448585081109,835065000 +2024-05-24,106.43403625488281,106.44003098960508,102.96617374072069,104.41469537259921,429494000 +2024-05-28,113.86357879638672,114.90123977492766,109.84690116806794,110.20778262251307,652728000 +2024-05-29,114.78727722167969,115.45405793078952,110.86457027293942,113.01286640628571,557442000 +2024-05-30,110.46369171142578,115.78094422890767,109.62696874788826,114.61232962234554,487350000 +2024-05-31,109.59699249267578,112.67997913664935,106.90487625910878,112.48303762096089,613263000 +2024-06-03,114.96221923828125,114.96221923828125,111.96620219037665,113.58367447543728,438392000 +2024-06-04,116.39875030517578,116.56169877793198,114.00753771578134,115.67799408835361,403324000 +2024-06-05,122.3997802734375,122.40877237466783,117.42941347887506,118.33211671671947,528402000 +2024-06-06,120.958251953125,125.54574130546908,118.28113030159747,124.00724541916884,664696000 +2024-06-07,120.8482894897461,121.65202623467715,117.98323363858707,119.7306529022316,412386000 +2024-06-10,121.74999237060547,123.05955958930451,116.9715638416941,120.33046067723372,314162700 +2024-06-11,120.88021850585938,122.83973476114328,118.71074727008515,121.7399996348229,222551200 +2024-06-12,125.16914367675781,126.84872997628844,122.53979453852547,123.02967165119686,299595000 +2024-06-13,129.5780792236328,129.7680348697194,127.12868568021801,129.35813218658845,260704500 +2024-06-14,131.84750366210938,132.8072585317083,128.28838344854194,129.92797866788297,309320400 +2024-06-17,130.94773864746094,133.69706139159663,129.54808953427707,132.9572533982128,288504400 +2024-06-18,135.54660034179688,136.29641557179684,130.6578056523983,131.10769173939232,294335100 +2024-06-20,130.74777221679688,140.72530869246972,129.4880881954488,139.765553796689,517768400 +2024-06-21,126.53881072998047,130.5978154647857,124.26937345205326,127.08867825178737,655484700 +2024-06-24,118.08089447021484,124.42932809847615,118.0109120255889,123.2096275256971,476060900 +2024-06-25,126.05892944335938,126.46883208603107,119.29060083723321,121.17013488438512,425787500 +2024-06-26,126.36885833740234,128.08842814640124,122.56979155312732,126.09892059020918,362975900 +2024-06-27,123.9594497680664,126.37885933630702,122.8897136949346,124.06942327696439,252571700 +2024-06-28,123.50955963134766,127.67853027804634,122.71975337861936,124.54930428199576,315516700 +2024-07-01,124.26937866210938,124.80923890749885,118.8007251119183,123.4395813225982,284885500 +2024-07-02,122.6397705078125,123.37959365292392,121.00017523772506,121.10014907077634,218374000 +2024-07-03,128.24839782714844,128.24839782714844,121.33010435521813,121.63003350315482,215749000 +2024-07-05,125.79899597167969,128.81825608276083,125.64903140778242,127.34860945857926,214176700 +2024-07-08,128.16839599609375,130.73776982046533,127.0086858992603,127.4585719244731,237677300 +2024-07-09,131.34764099121094,133.78704236722226,128.61830251041144,130.3178959397844,285366600 +2024-07-10,134.87677001953125,135.0667256558596,132.38737791270125,133.99698191654937,248978600 +2024-07-11,127.36860656738281,136.11644269274476,127.01869434277064,135.7165473660534,374782700 +2024-07-12,129.20816040039062,131.88749271860638,127.18865386253758,128.22839089146464,252680500 +2024-07-15,128.40835571289062,131.35762580228223,127.14866403247436,130.52782847793975,208326200 +2024-07-16,126.32886505126953,129.00819736720675,124.54930487008038,128.40835436238444,214769500 +2024-07-17,117.96092224121094,121.81997165296215,116.6912385563928,121.32009486519661,390086200 +2024-07-18,121.06016540527344,122.36984786902624,116.53128260658956,121.81998031239168,320979500 +2024-07-19,117.90094757080078,121.57004161457283,117.34108797082892,120.32034955926778,217223800 +2024-07-22,123.50955963134766,124.03942781453529,119.8304661088677,120.3203432330864,258068900 +2024-07-23,122.5597915649414,124.65928025097237,122.06991443104106,122.74974719191928,173911000 +2024-07-24,114.22184753417969,119.92043994002134,113.41204956795865,119.1406333610656,327776900 +2024-07-25,112.25233459472656,116.60126129148769,106.27381225253961,113.01214947730902,460067000 +2024-07-26,113.03214263916016,116.17136841805404,111.55251154245995,116.16137637359374,293399100 +2024-07-29,111.5625,116.25134680115113,111.27257816967544,113.66198865142056,248152100 +2024-07-30,103.7044448852539,111.96240417731258,102.51473565355279,111.49251876218644,486833300 +2024-07-31,116.99116516113281,118.3108396333588,110.85267854952704,112.87218513169266,473174200 +2024-08-01,109.18309783935547,120.13040514788088,106.78368749587625,117.50104810323892,523462300 +2024-08-02,107.24356079101562,108.69320802636011,101.3450209019017,103.73443129488524,482027500 +2024-08-05,100.42524719238281,103.38452459369911,90.66765743904186,92.0373150047539,552842400 +2024-08-06,104.22430419921875,107.68345045446188,100.5252192354799,103.81440159583764,409012100 +2024-08-07,98.88563537597656,108.77319818362058,98.6656883565928,107.78343659639361,411440400 +2024-08-08,104.94413757324219,105.47400576569116,97.49596860854,101.97486813365401,391910000 +2024-08-09,104.72418975830078,106.57373239559361,103.40451530940655,105.6139698534446,290844200 +2024-08-12,108.99313354492188,111.04263146519123,106.23381911518737,106.29380189006847,325559900 +2024-08-13,116.11138153076172,116.20136332032301,111.55250759337807,112.41229629244809,312646700 +2024-08-14,118.05091094970703,118.57077948335262,114.04189674110647,118.5007970340635,339246400 +2024-08-15,122.82972717285156,123.2096307926781,117.44105591122558,118.73073896282733,318086700 +2024-08-16,124.54930114746094,124.9691958147952,121.15013749579563,121.90995234205361,302589900 +2024-08-19,129.9679718017578,129.9679718017578,123.38959109072681,124.2493798220781,318333600 +2024-08-20,127.2186508178711,129.8480077753235,125.85898525590325,128.36836140301475,300087400 +2024-08-21,128.46835327148438,129.31815003716036,126.62881008429083,127.2886435744744,257883600 +2024-08-22,123.70951080322266,130.717785815134,123.06966909662319,129.98796994394152,376189100 +2024-08-23,129.33811950683594,129.56807382051312,125.18914813175064,125.82898983127045,323230300 +2024-08-26,126.42884063720703,131.22765338990934,124.33935925298674,129.53808260280766,331964700 +2024-08-27,128.26840209960938,129.1681743229575,123.84948497148315,125.01920259136338,303134600 +2024-08-28,125.57905578613281,128.29838691719942,122.60978624415954,128.0884319398247,448101100 +2024-08-29,117.56102752685547,124.3993464291812,116.6812470646182,121.33010304223866,453023300 +2024-08-30,119.34059143066406,121.72000228172388,117.19111963899515,119.50054804230363,333751600 +2024-09-03,107.973388671875,116.18136480283337,107.26356453201906,115.9814171340765,477155100 +2024-09-04,106.18383026123047,113.24208832420429,104.09434887245212,105.38403194779274,372470300 +2024-09-05,107.18358612060547,109.6229874268856,104.73419276980215,104.96413183407385,306850700 +2024-09-06,102.8046646118164,108.12335346353827,100.92512296050285,108.01337995723738,413638100 +2024-09-09,106.44376373291016,106.52374584904946,103.6644500309421,104.85415159157789,273912000 +2024-09-10,108.0733642578125,109.37304700834024,104.92413884500664,107.78343479415585,268283700 +2024-09-11,116.88119506835938,117.16112485124165,107.39352807236727,109.3630438515934,441422400 +2024-09-12,119.12083435058594,120.77057045474369,115.3614370539407,116.82120128077001,367100500 +2024-09-13,119.0808334350586,119.94069565795841,117.58107480834963,119.06084000976254,238358300 +2024-09-16,116.7612075805664,118.16098383065176,114.34159881620232,116.77120810734208,248772300 +2024-09-17,115.57140350341797,118.7808938826076,114.81153124290536,118.15099033708098,231925900 +2024-09-18,113.35176086425781,117.68105834506785,113.20178347448297,115.87135202544096,310318900 +2024-09-19,117.85103607177734,119.64074895502783,117.2311330909559,117.3311154741421,293506400 +2024-09-20,115.98133850097656,118.6009197546388,115.37143602446805,117.041165532472,382462400 +2024-09-23,116.24130249023438,116.97118080282907,114.84152614526418,116.5312567610485,206228500 +2024-09-24,120.85055541992188,121.78040609310197,115.36143323881014,116.5012492087513,354966800 +2024-09-25,123.4901351928711,124.91990547833531,121.5904392877682,122.00036937142775,284692900 +2024-09-26,124.02005004882812,127.64946344549999,121.78041247124415,126.77960826024157,302582900 +2024-09-27,121.38047790527344,124.01005220096552,119.24082267160239,123.9500642912149,271009200 +2024-09-30,121.42046356201172,121.48045146740193,118.13099198549791,118.29096227592748,226553700 +2024-10-01,116.9811782836914,122.42030559533124,115.77137385100936,121.75040758040218,302094500 +2024-10-02,118.83087921142578,119.360792730428,115.12147695024304,116.42127087200362,221845900 +2024-10-03,122.83023834228516,124.33999759824167,120.32063993396463,120.90054847309592,277118000 +2024-10-04,124.89990234375,125.01988578554294,121.810403092212,124.91990339813242,243678100 +2024-10-07,127.69945526123047,130.61898369823507,124.92989659161151,124.96989107230341,346250200 +2024-10-08,132.86862182617188,133.45852325335272,129.39917881279587,130.23904002332463,285722500 +2024-10-09,132.628662109375,134.4983717641675,131.3588773259068,134.08843403580283,246191600 +2024-10-10,134.78831481933594,134.97828670089152,130.97893005790212,131.88878735570256,242311300 +2024-10-11,134.7783203125,135.75815840657205,133.63850429309608,133.98843884138304,170209500 +2024-10-14,138.0478057861328,139.57755854294567,136.27808612883217,136.44805696221857,232347700 +2024-10-15,131.57884216308594,138.547722466739,128.71930149862905,137.84782283581688,377831000 +2024-10-16,135.6981658935547,136.5980149944232,131.55883256815804,133.9584403413635,264879700 +2024-10-17,136.90797424316406,140.8673441853548,136.8479863322171,139.31759037510415,306435900 +2024-10-18,137.97779846191406,138.87764756674068,137.25791307551907,138.64768884107772,176090200 +2024-10-21,143.6868896484375,143.6868896484375,137.97780144123402,138.1077854115753,264554500 +2024-10-22,143.56690979003906,144.39677817254247,141.7572032447214,142.88702644418225,226311600 +2024-10-23,139.5375518798828,142.4070854107316,137.43789878035992,142.00715584596583,285930000 +2024-10-24,140.38742065429688,141.3272719093067,138.4377373361036,140.79735837298583,172354900 +2024-10-25,141.51722717285156,144.1068221770471,140.77735596279692,140.90732467853542,205122100 +2024-10-28,140.4973907470703,143.11696423513524,140.02746516246322,142.976987375231,173586700 +2024-10-29,141.22727966308594,142.23711171034327,138.87765156261756,140.26742736816374,157593600 +2024-10-30,139.3175811767578,140.30742741103543,136.78798938993828,139.51754595215704,179418100 +2024-10-31,132.7386474609375,137.5878737112806,132.08875807974474,137.57788081150406,270039600 +2024-11-01,135.3782196044922,137.2879161101812,134.5483665061615,134.67833522595924,207127800 +2024-11-04,136.0281219482422,138.9376575905799,135.54820341905642,137.18793904541485,187528200 +2024-11-05,139.8874969482422,140.3474144064953,137.30791015086248,137.4278859649573,160537400 +2024-11-06,145.58656311035156,146.46642634688735,141.93715671974996,142.93699575896497,242043900 +2024-11-07,148.85606384277344,148.9060435973239,146.14649291865044,146.3664587614797,207323300 +2024-11-08,147.6062469482422,149.74590195013883,146.236457046531,148.7460628790407,175665800 +2024-11-11,145.23663330078125,148.82606753959354,143.54691790764704,148.65608145399648,182325600 +2024-11-12,148.26612854003906,149.62591028148023,145.98649668767203,146.7563770410738,198634700 +2024-11-13,146.2464599609375,149.30596496785506,145.87650914358065,149.04601231096433,191903300 +2024-11-14,146.7363739013672,148.97601887199116,145.52657719098687,147.6162371498861,194463300 +2024-11-15,141.9571533203125,145.2166386002855,140.05746510375218,144.8466877533126,250132900 +2024-11-18,140.12744140625,141.52722527651324,137.1279241566863,139.47755210471132,221866000 +2024-11-19,146.98634338378906,147.10633445236968,140.96732287230222,141.2972716123141,227834900 +2024-11-20,145.8665313720703,147.53626090336707,142.70703603144835,147.38629113505743,309871700 +2024-11-21,146.6464080810547,152.8654088901037,140.67736706254192,149.32598496889756,400946600 +2024-11-22,141.92715454101562,147.13632286743956,141.07730047570033,145.90650981286518,236406200 +2024-11-25,135.9981231689453,142.02715192160386,135.79815839357323,141.9671640146257,344941900 +2024-11-26,136.89797973632812,139.277601884859,135.64818075181995,137.6778530821544,190287700 +2024-11-27,135.31822204589844,137.19792446250455,131.77879829463743,134.98827330747284,226370900 +2024-11-29,138.22776794433594,139.32759715528792,136.02812477876728,136.75800311530705,141863200 +2024-12-02,138.60769653320312,140.42739572538855,137.7978293194704,138.8076612979231,171682800 +2024-12-03,140.23744201660156,140.51739577472358,137.92781588392697,138.23776359782383,164414000 +2024-12-04,145.1166534423828,145.76654278655016,140.26742746830917,141.97715912549498,231224300 +2024-12-05,145.04666137695312,146.52652104015894,143.93676281520223,145.0966598316491,172621200 +2024-12-06,142.42689514160156,145.68658966441174,141.29699424160657,144.58670004061705,188505600 +2024-12-09,138.79722595214844,139.93712045292858,137.1173878488451,138.9572148926683,189308600 +2024-12-10,135.05758666992188,141.80696595909077,133.77769033829185,138.99721154250668,210020900 +2024-12-11,139.29718017578125,140.15710166074888,135.19756655561218,137.3473626393387,184905200 +2024-12-12,137.32736206054688,138.42726697152892,135.7875104425574,137.0673914713081,159211400 +2024-12-13,134.23765563964844,139.58716980719961,132.52780616182653,138.92722683278515,231514900 +2024-12-16,131.98785400390625,134.38762706465963,130.40799755691268,134.16764608739564,237951100 +2024-12-17,130.3780059814453,131.57789255271604,126.84833189511964,129.07812250532473,259410300 +2024-12-18,128.8981475830078,136.68742440979707,128.2682006428492,133.84768927135005,277444500 +2024-12-19,130.66796875,134.01766661792476,129.5380830968377,131.7478712095932,209719200 +2024-12-20,134.68760681152344,135.26755529215387,128.20820713472543,129.7980572196654,306528600 +2024-12-23,139.6571502685547,139.77713434768583,135.1075657604122,136.2674627166313,176053500 +2024-12-24,140.2071075439453,141.88694573903672,138.6372445869122,139.98712655305678,105157000 +2024-12-26,139.91712951660156,140.8370583714796,137.7173348045662,139.68715493157526,116205600 +2024-12-27,136.9973907470703,139.00721560881072,134.69761453351015,138.53725762424156,170582600 +2024-12-30,137.47735595703125,140.2570989672278,134.00767398793965,134.81759702407376,167734700 +2024-12-31,134.27764892578125,138.05731549303724,133.8176997545706,138.0173106258272,155659200 +2025-01-02,138.29727172851562,138.8672266066605,134.61761764692358,135.98748671158143,198247200 +2025-01-03,144.4567108154297,144.88666393436952,139.71714137538024,139.99711439640743,229322500 +2025-01-06,149.41624450683594,152.14600432101588,147.80640728049391,148.57632545203526,265377400 +2025-01-07,140.12710571289062,153.1159160516902,139.99711279126652,153.0159191493047,351782200 +2025-01-08,140.0971221923828,143.9367655713296,137.5473535279277,142.5668963792699,227349900 +2025-01-10,135.8975067138672,139.90713250101766,134.20765966847648,137.43735839735214,207602500 +2025-01-13,133.21774291992188,133.47772877314173,129.49808381781634,129.97805065881337,204808900 +2025-01-14,131.7478790283203,136.3674645891877,130.03804480886453,136.0374931021696,195590500 +2025-01-15,136.22747802734375,136.43745017340345,131.277920981104,133.63770458598145,185217300 +2025-01-16,133.55772399902344,138.73724031386243,133.47772952507327,138.6272498193542,209235600 +2025-01-17,137.6973419189453,138.48726255165812,135.44754884500142,136.67743145335606,201188800 +2025-01-21,140.81704711914062,141.8169551308445,137.07738566270945,139.14720257048143,197749000 +2025-01-22,147.05648803710938,147.77640781491758,143.65679142482674,144.64670591256592,237651400 +2025-01-23,147.2064666748047,147.2164602628041,143.706788444335,145.03666800279981,155915500 +2025-01-24,142.60687255859375,148.95629439391405,141.86695041120194,148.35634349735062,234657600 +2025-01-27,118.40910339355469,128.3881809500624,116.68926041493282,124.78852130861458,818830900 +2025-01-28,128.9781494140625,128.9881430022562,116.23931491482392,121.79880142784785,579666400 +2025-01-29,123.6886215209961,126.87833061040895,120.03896327722832,126.48836708502724,467120600 +2025-01-30,124.63853454589844,124.9885008224628,118.08913405132431,123.08867408422283,392925500 +2025-01-31,120.0589599609375,127.83824341487099,119.1790436181177,123.76861793270326,390372900 +2025-02-03,116.64927673339844,118.55909714130068,112.99961082645434,114.7394486968032,371235700 +2025-02-04,118.63909149169922,121.1888524384042,116.68926621972048,116.94924444838958,256550000 +2025-02-05,124.81851959228516,124.98850212428793,120.74889426826606,121.74880228526035,262230800 +2025-02-06,128.66815185546875,128.7581551695,125.19847756454047,127.40827329026631,251483600 +2025-02-07,129.8280487060547,130.35799871586244,124.9884977355082,129.20811063964976,228186300 +2025-02-10,133.55772399902344,134.98758517024453,129.94805537047182,130.0780330404282,216989100 +2025-02-11,132.7877960205078,134.4676342706669,131.0079608594355,132.56781502240796,178902400 +2025-02-12,131.12794494628906,132.22784993678553,129.0681367435288,130.00805277951918,160278600 +2025-02-13,135.27755737304688,136.487452862588,131.15794096754342,131.54790450828392,197430000 +2025-02-14,138.8372344970703,139.23719160158925,135.4875365315285,136.46744211776974,195479600 +2025-02-18,139.38717651367188,143.4268135927519,137.91731045487123,141.25701494818574,219176600 +2025-02-19,139.21719360351562,141.34700263351252,137.2073839146051,139.49716663707372,167536000 +2025-02-20,140.0971221923828,140.6470746897965,136.7774200315485,140.01712771481476,143903600 +2025-02-21,134.41763305664062,141.4470007486669,134.01767593596887,140.02711787829398,228217600 +2025-02-24,130.2680206298828,138.57725415414035,130.06804206967678,136.5474420161462,251381100 +2025-02-25,126.61835479736328,130.18802626376245,124.42856133510212,129.96804527013506,271428700 +2025-02-26,131.26792907714844,133.71770077604796,128.478192299153,129.97805439122038,322553800 +2025-02-27,120.13895416259766,134.99758082030266,119.99896764539281,134.9875872324259,443175800 +2025-02-28,124.90850830078125,125.07849083366686,116.38929530836823,118.00914142194866,389091100 +2025-03-03,114.04950714111328,123.68861991301428,112.26967207329028,123.49864257535764,411381400 +2025-03-04,115.97933197021484,119.29902637351395,110.09987541363249,110.63982667322061,398163300 +2025-03-05,117.28921508789062,118.26912068620358,114.49947076595478,117.56918811598004,284337900 +2025-03-06,110.55982971191406,115.3393888375433,110.209863429875,113.51955654224739,321181900 +2025-03-07,112.67964172363281,113.46957000648335,107.5501084934214,111.2397716760376,341755500 +2025-03-10,106.97016143798828,111.83970852661247,105.45029700249104,109.88989097369002,366487400 +2025-03-11,108.75,112.22967568900775,104.76036144852146,106.98015850635034,354865700 +2025-03-12,115.73999786376953,116.76000213623047,112.87999725341797,114.12000274658203,323857500 +2025-03-13,115.58000183105469,117.76000213623047,113.79000091552734,117.02999877929688,299033100 +2025-03-14,121.66999816894531,121.87999725341797,118.1500015258789,118.61000061035156,277593500 +2025-03-17,119.52999877929688,122.88999938964844,118.02999877929688,122.73999786376953,255501500 +2025-03-18,115.43000030517578,119.0199966430664,114.54000091552734,118.0,299686900 +2025-03-19,117.5199966430664,120.44999694824219,115.68000030517578,117.2699966430664,273426200 +2025-03-20,118.52999877929688,120.19999694824219,116.47000122070312,116.55000305175781,248829700 +2025-03-21,117.69999694824219,117.98999786376953,115.41999816894531,116.94000244140625,266498500 +2025-03-24,121.41000366210938,122.22000122070312,119.33999633789062,119.87999725341797,228452500 +2025-03-25,120.69000244140625,121.29000091552734,118.91999816894531,120.55000305175781,167447200 +2025-03-26,113.76000213623047,118.83999633789062,112.70999908447266,118.7300033569336,293463300 +2025-03-27,111.43000030517578,114.44999694824219,110.66000366210938,111.3499984741211,236902100 +2025-03-28,109.66999816894531,112.87000274658203,109.06999969482422,111.48999786376953,229872500 +2025-03-31,108.37999725341797,110.95999908447266,103.6500015258789,105.12999725341797,299212700 +2025-04-01,110.1500015258789,110.19999694824219,106.47000122070312,108.5199966430664,222614000 +2025-04-02,110.41999816894531,111.9800033569336,106.79000091552734,107.29000091552734,220601200 +2025-04-03,101.80000305175781,105.62999725341797,101.5999984741211,103.51000213623047,338769400 +2025-04-04,94.30999755859375,100.12999725341797,92.11000061035156,98.91000366210938,532273800 +2025-04-07,97.63999938964844,101.75,86.62000274658203,87.45999908447266,611041300 +2025-04-08,96.30000305175781,105.8499984741211,94.45999908447266,103.80999755859375,476243400 +2025-04-09,114.33000183105469,115.0999984741211,97.52999877929688,98.88999938964844,612918300 +2025-04-10,107.56999969482422,110.86000061035156,99.1500015258789,109.37000274658203,437812400 +2025-04-11,110.93000030517578,111.55000305175781,107.4800033569336,108.5,313417300 +2025-04-14,110.70999908447266,114.29000091552734,109.06999969482422,114.11000061035156,264705000 +2025-04-15,112.19999694824219,113.62000274658203,110.5,110.97000122070312,228966900 +2025-04-16,104.48999786376953,106.79000091552734,100.44999694824219,104.55000305175781,397016900 +2025-04-17,101.48999786376953,104.47000122070312,100.05000305175781,104.44999694824219,290833400 +2025-04-21,96.91000366210938,99.44000244140625,95.04000091552734,98.7699966430664,288501100 +2025-04-22,98.88999938964844,99.80999755859375,97.27999877929688,98.77999877929688,241004800 +2025-04-23,102.70999908447266,104.80000305175781,102.0199966430664,104.5199966430664,247526000 +2025-04-24,106.43000030517578,106.54000091552734,103.11000061035156,103.4800033569336,220815000 +2025-04-25,111.01000213623047,111.91999816894531,105.7300033569336,106.8499984741211,251064700 +2025-04-28,108.7300033569336,110.37000274658203,106.0199966430664,109.69000244140625,207708500 +2025-04-29,109.0199966430664,110.19999694824219,107.44000244140625,107.66999816894531,170444300 +2025-04-30,108.91999816894531,108.91999816894531,104.08000183105469,104.47000122070312,235044600 +2025-05-01,111.61000061035156,114.94000244140625,111.30000305175781,113.08000183105469,236121500 +2025-05-02,114.5,115.4000015258789,113.37000274658203,114.18000030517578,190194800 +2025-05-05,113.81999969482422,114.66999816894531,112.66000366210938,112.91000366210938,133163200 +2025-05-06,113.54000091552734,114.73999786376953,110.81999969482422,111.4800033569336,158525600 +2025-05-07,117.05999755859375,117.68000030517578,112.27999877929688,113.05000305175781,206758800 +2025-05-08,117.37000274658203,118.68000030517578,115.8499984741211,118.25,198428100 +2025-05-09,116.6500015258789,118.2300033569336,115.20999908447266,117.3499984741211,132972200 +2025-05-12,123.0,123.0,120.27999877929688,121.97000122070312,225023300 +2025-05-13,129.92999267578125,131.22000122070312,124.47000122070312,124.9800033569336,330430100 +2025-05-14,135.33999633789062,135.44000244140625,131.67999267578125,133.1999969482422,281180800 +2025-05-15,134.8300018310547,136.3000030517578,132.66000366210938,134.2899932861328,226632600 +2025-05-16,135.39999389648438,136.35000610351562,133.4600067138672,136.22000122070312,226542500 +2025-05-19,135.57000732421875,135.8699951171875,132.38999938964844,132.38999938964844,193154600 +2025-05-20,134.3800048828125,134.5800018310547,132.6199951171875,134.2899932861328,161514200 +2025-05-21,131.8000030517578,137.39999389648438,130.58999633789062,133.05999755859375,270608700 +2025-05-22,132.8300018310547,134.25,131.5500030517578,132.22999572753906,187344000 +2025-05-23,131.2899932861328,132.67999267578125,129.16000366210938,130.0,198821300 +2025-05-27,135.5,135.66000366210938,133.30999755859375,134.14999389648438,192953600 +2025-05-28,134.80999755859375,137.25,134.7899932861328,136.02999877929688,304021100 +2025-05-29,139.19000244140625,143.49000549316406,137.91000366210938,142.25,369241900 +2025-05-30,135.1300048828125,139.6199951171875,132.9199981689453,138.72000122070312,333170900 +2025-06-02,137.3800048828125,138.1199951171875,135.39999389648438,135.49000549316406,197663100 +2025-06-03,141.22000122070312,142.0,137.9499969482422,138.77999877929688,225578800 +2025-06-04,141.9199981689453,142.38999938964844,139.5399932861328,142.19000244140625,167120800 +2025-06-05,139.99000549316406,144.0,138.8300018310547,142.1699981689453,231397900 +2025-06-06,141.72000122070312,143.27000427246094,141.50999450683594,142.50999450683594,153986200 +2025-06-09,142.6300048828125,145.0,141.94000244140625,143.19000244140625,185114500 +2025-06-10,143.9600067138672,144.2899932861328,141.52999877929688,142.69000244140625,155881900 +2025-06-11,142.8300018310547,144.99000549316406,141.8699951171875,144.61000061035156,167009400 diff --git a/tradingagents/dataflows/data_cache/PLTR-YFin-data-2010-06-12-2025-06-12.csv b/tradingagents/dataflows/data_cache/PLTR-YFin-data-2010-06-12-2025-06-12.csv new file mode 100644 index 00000000..69f90990 --- /dev/null +++ b/tradingagents/dataflows/data_cache/PLTR-YFin-data-2010-06-12-2025-06-12.csv @@ -0,0 +1,1181 @@ +Date,Close,High,Low,Open,Volume +2020-09-30,9.5,11.40999984741211,9.109999656677246,10.0,338584400 +2020-10-01,9.460000038146973,10.100000381469727,9.229999542236328,9.6899995803833,124297600 +2020-10-02,9.199999809265137,9.279999732971191,8.9399995803833,9.0600004196167,55018300 +2020-10-05,9.029999732971191,9.489999771118164,8.920000076293945,9.430000305175781,36316900 +2020-10-06,9.899999618530273,10.180000305175781,8.899999618530273,9.039999961853027,90864000 +2020-10-07,10.0,10.489999771118164,9.989999771118164,10.039999961853027,54672400 +2020-10-08,10.0,10.399999618530273,9.989999771118164,10.289999961853027,34989200 +2020-10-09,9.949999809265137,10.1899995803833,9.890000343322754,10.130000114440918,19653500 +2020-10-12,9.890000343322754,10.050000190734863,9.65999984741211,10.039999961853027,20623600 +2020-10-13,9.470000267028809,9.880000114440918,9.40999984741211,9.880000114440918,21847200 +2020-10-14,9.34000015258789,9.65999984741211,9.289999961853027,9.600000381469727,13652600 +2020-10-15,9.90999984741211,9.90999984741211,9.180000305175781,9.270000457763672,12924100 +2020-10-16,9.710000038146973,9.949999809265137,9.65999984741211,9.9399995803833,11142500 +2020-10-19,9.569999694824219,9.819999694824219,9.529999732971191,9.789999961853027,9126400 +2020-10-20,9.270000457763672,9.65999984741211,9.270000457763672,9.600000381469727,11138200 +2020-10-21,9.199999809265137,9.479999542236328,9.199999809265137,9.300000190734863,9190000 +2020-10-22,9.680000305175781,9.75,9.220000267028809,9.369999885559082,17928600 +2020-10-23,9.489999771118164,9.829999923706055,9.470000267028809,9.710000038146973,12618000 +2020-10-26,9.949999809265137,9.970000267028809,9.600000381469727,9.720000267028809,23767300 +2020-10-27,10.949999809265137,11.039999961853027,9.920000076293945,10.0,53695900 +2020-10-28,10.850000381469727,10.984999656677246,10.100000381469727,10.65999984741211,30941700 +2020-10-29,10.75,11.100000381469727,10.5600004196167,10.899999618530273,20515700 +2020-10-30,10.130000114440918,10.680000305175781,9.850000381469727,10.609999656677246,19705500 +2020-11-02,10.539999961853027,10.569999694824219,10.229999542236328,10.229999542236328,11677800 +2020-11-03,10.5,10.9399995803833,10.4399995803833,10.569999694824219,21652800 +2020-11-04,10.720000267028809,10.920000076293945,10.550000190734863,10.819999694824219,15783400 +2020-11-05,11.880000114440918,12.130000114440918,10.850000381469727,10.899999618530273,48560400 +2020-11-06,13.829999923706055,14.960000038146973,12.050000190734863,12.220000267028809,89977600 +2020-11-09,14.670000076293945,15.899999618530273,14.109999656677246,14.960000038146973,60099000 +2020-11-10,14.0,15.010000228881836,13.180000305175781,14.989999771118164,38078700 +2020-11-11,15.960000038146973,15.970000267028809,14.399999618530273,14.569999694824219,47027900 +2020-11-12,14.579999923706055,17.059999465942383,14.40999984741211,16.65999984741211,97904000 +2020-11-13,15.800000190734863,16.0,14.489999771118164,14.489999771118164,76354800 +2020-11-16,15.930000305175781,16.100000381469727,15.010000228881836,15.960000038146973,65326000 +2020-11-17,17.850000381469727,18.75,16.18000030517578,16.290000915527344,116618500 +2020-11-18,17.899999618530273,19.25,17.540000915527344,18.280000686645508,89957900 +2020-11-19,18.979999542236328,18.979999542236328,17.959999084472656,18.5,56225400 +2020-11-20,18.149999618530273,19.65999984741211,18.0,19.030000686645508,72104000 +2020-11-23,21.040000915527344,21.450000762939453,18.56999969482422,18.6299991607666,84716300 +2020-11-24,23.81999969482422,24.270000457763672,20.6299991607666,22.350000381469727,115468800 +2020-11-25,29.049999237060547,29.75,23.690000534057617,23.959999084472656,202563700 +2020-11-27,27.65999984741211,33.5,26.1200008392334,31.190000534057617,207834000 +2020-11-30,27.110000610351562,30.149999618530273,24.110000610351562,28.239999771118164,137243000 +2020-12-01,25.670000076293945,28.139999389648438,24.450000762939453,28.09000015258789,84050000 +2020-12-02,22.510000228881836,23.399999618530273,21.149999618530273,22.239999771118164,149062100 +2020-12-03,24.030000686645508,25.6200008392334,23.5,23.549999237060547,85634300 +2020-12-04,23.850000381469727,25.239999771118164,23.510000228881836,24.8799991607666,56044100 +2020-12-07,28.940000534057617,29.0,24.440000534057617,24.440000534057617,118463700 +2020-12-08,28.59000015258789,31.239999771118164,27.25,30.6299991607666,124754300 +2020-12-09,26.6299991607666,28.850000381469727,25.329999923706055,28.68000030517578,79634700 +2020-12-10,27.040000915527344,28.040000915527344,25.149999618530273,25.541000366210938,57774800 +2020-12-11,27.200000762939453,28.270000457763672,26.059999465942383,27.149999618530273,52764400 +2020-12-14,27.239999771118164,28.260000228881836,26.729999542236328,28.260000228881836,44734500 +2020-12-15,26.43000030517578,27.100000381469727,25.520000457763672,26.81999969482422,49273200 +2020-12-16,25.920000076293945,26.15999984741211,25.110000610351562,25.709999084472656,44013400 +2020-12-17,27.229999542236328,27.450000762939453,26.049999237060547,26.520000457763672,53829800 +2020-12-18,25.969999313354492,26.850000381469727,25.799999237060547,26.270000457763672,71042900 +2020-12-21,28.510000228881836,28.700000762939453,25.399999618530273,26.190000534057617,76729100 +2020-12-22,28.040000915527344,29.420000076293945,26.81999969482422,29.030000686645508,66033100 +2020-12-23,28.690000534057617,29.389999389648438,28.049999237060547,28.950000762939453,58772200 +2020-12-24,27.75,29.15999984741211,27.520000457763672,28.79800033569336,26306800 +2020-12-28,25.6299991607666,28.59000015258789,25.399999618530273,28.389999389648438,55878700 +2020-12-29,24.65999984741211,26.18199920654297,24.34000015258789,25.75,47302400 +2020-12-30,25.100000381469727,25.90999984741211,24.6299991607666,24.969999313354492,34586700 +2020-12-31,23.549999237060547,24.719999313354492,23.520000457763672,24.6299991607666,39922500 +2021-01-04,23.3700008392334,24.5,22.5,23.90999984741211,44970400 +2021-01-05,24.600000381469727,24.670000076293945,22.889999389648438,23.18000030517578,29050400 +2021-01-06,23.540000915527344,24.459999084472656,23.25,24.1200008392334,32732900 +2021-01-07,25.0,25.190000534057617,23.670000076293945,24.020000457763672,32240000 +2021-01-08,25.200000762939453,26.440000534057617,24.700000762939453,25.700000762939453,41313800 +2021-01-11,25.93000030517578,26.600000381469727,24.309999465942383,24.610000610351562,32609000 +2021-01-12,26.18000030517578,26.420000076293945,25.510000228881836,26.34000015258789,26887200 +2021-01-13,25.5,27.43000030517578,25.1299991607666,25.709999084472656,51216600 +2021-01-14,24.920000076293945,25.6200008392334,24.3700008392334,25.450000762939453,32908000 +2021-01-15,25.639999389648438,28.0,25.459999084472656,26.260000228881836,92285500 +2021-01-19,26.6200008392334,27.540000915527344,26.0,26.809999465942383,48675800 +2021-01-20,26.34000015258789,27.299999237060547,25.700000762939453,27.290000915527344,37459000 +2021-01-21,25.979999542236328,26.68000030517578,25.299999237060547,26.420000076293945,29891400 +2021-01-22,32.58000183105469,32.650001525878906,25.81999969482422,25.850000381469727,156844700 +2021-01-25,36.22999954223633,39.58000183105469,29.559999465942383,34.459999084472656,191345300 +2021-01-26,35.369998931884766,36.869998931884766,34.31999969482422,35.13999938964844,65870000 +2021-01-27,39.0,45.0,32.25,32.970001220703125,170758800 +2021-01-28,35.65999984741211,42.0,33.099998474121094,39.540000915527344,85250700 +2021-01-29,35.18000030517578,38.0099983215332,34.65999984741211,36.61000061035156,42030900 +2021-02-01,33.959999084472656,35.619998931884766,32.58000183105469,35.33000183105469,43460900 +2021-02-02,31.020000457763672,34.20000076293945,30.5,34.099998474121094,69647900 +2021-02-03,31.760000228881836,32.95000076293945,31.3799991607666,32.38999938964844,35312000 +2021-02-04,32.04999923706055,33.18000030517578,31.049999237060547,32.58000183105469,31565000 +2021-02-05,34.04999923706055,35.20000076293945,31.75,32.61000061035156,62375300 +2021-02-08,36.04999923706055,39.220001220703125,35.88999938964844,37.220001220703125,72376000 +2021-02-09,38.16999816894531,38.255001068115234,36.130001068115234,36.900001525878906,44243200 +2021-02-10,35.70000076293945,38.2400016784668,35.0,38.150001525878906,45177200 +2021-02-11,33.11000061035156,35.97999954223633,32.61000061035156,35.790000915527344,52094900 +2021-02-12,31.90999984741211,33.650001525878906,31.34000015258789,33.36000061035156,60925600 +2021-02-16,27.84000015258789,30.440000534057617,27.299999237060547,30.020000457763672,180294300 +2021-02-17,27.079999923706055,29.729999542236328,27.0,27.989999771118164,151007000 +2021-02-18,25.170000076293945,26.309999465942383,24.5,24.989999771118164,313175100 +2021-02-19,29.0,29.959999084472656,26.899999618530273,27.020000457763672,320063700 +2021-02-22,28.0,30.190000534057617,27.535999298095703,29.959999084472656,183049500 +2021-02-23,26.75,27.459999084472656,23.899999618530273,25.959999084472656,145289400 +2021-02-24,26.389999389648438,27.229999542236328,25.75,26.709999084472656,90095700 +2021-02-25,23.959999084472656,26.440000534057617,23.149999618530273,25.81999969482422,161776400 +2021-02-26,23.899999618530273,24.5,22.700000762939453,24.200000762939453,119588600 +2021-03-01,24.809999465942383,25.899999618530273,24.6200008392334,25.190000534057617,85059900 +2021-03-02,24.479999542236328,25.59000015258789,24.260000228881836,25.0,73997000 +2021-03-03,23.59000015258789,25.167999267578125,23.43000030517578,24.989999771118164,79046200 +2021-03-04,24.729999542236328,25.559999465942383,23.049999237060547,24.850000381469727,161611200 +2021-03-05,23.950000762939453,24.68000030517578,20.18000030517578,24.360000610351562,173468600 +2021-03-08,22.520000457763672,24.579999923706055,22.399999618530273,23.770000457763672,94432800 +2021-03-09,24.260000228881836,24.739999771118164,23.100000381469727,23.3799991607666,99586500 +2021-03-10,24.75,26.239999771118164,24.270000457763672,25.030000686645508,103212800 +2021-03-11,26.729999542236328,26.84000015258789,25.579999923706055,25.950000762939453,84788700 +2021-03-12,26.920000076293945,26.920000076293945,25.18000030517578,25.739999771118164,58721900 +2021-03-15,26.790000915527344,27.469999313354492,26.309999465942383,27.350000381469727,56101500 +2021-03-16,25.610000610351562,27.100000381469727,25.229999542236328,26.75,73615100 +2021-03-17,25.209999084472656,25.729999542236328,24.299999237060547,24.520000457763672,77081700 +2021-03-18,23.979999542236328,25.18000030517578,23.780000686645508,24.729999542236328,57141400 +2021-03-19,24.31999969482422,24.56999969482422,23.389999389648438,24.010000228881836,57915900 +2021-03-22,24.219999313354492,24.920000076293945,23.860000610351562,24.889999389648438,46208100 +2021-03-23,23.260000228881836,24.104999542236328,23.100000381469727,24.0,50169700 +2021-03-24,21.8799991607666,23.485000610351562,21.75,23.299999237060547,69271900 +2021-03-25,22.579999923706055,22.799999237060547,21.049999237060547,21.200000762939453,74592600 +2021-03-26,22.579999923706055,23.049999237060547,21.760000228881836,22.6299991607666,57916400 +2021-03-29,21.729999542236328,22.5,21.389999389648438,22.479999542236328,57647400 +2021-03-30,22.040000915527344,22.09000015258789,20.860000610351562,21.360000610351562,52039700 +2021-03-31,23.290000915527344,23.850000381469727,22.3799991607666,22.5,61458500 +2021-04-01,23.06999969482422,23.950000762939453,22.729999542236328,23.950000762939453,51788800 +2021-04-05,23.440000534057617,24.450000762939453,23.34000015258789,23.780000686645508,65374300 +2021-04-06,23.270000457763672,23.610000610351562,22.829999923706055,23.549999237060547,41933500 +2021-04-07,22.899999618530273,23.549999237060547,22.809999465942383,23.0,32766200 +2021-04-08,23.40999984741211,23.600000381469727,22.739999771118164,23.200000762939453,35905500 +2021-04-09,24.040000915527344,24.350000381469727,23.3700008392334,23.459999084472656,54082700 +2021-04-12,23.34000015258789,24.549999237060547,22.729999542236328,24.520000457763672,68620800 +2021-04-13,25.420000076293945,25.659000396728516,23.1200008392334,23.190000534057617,83913500 +2021-04-14,23.700000762939453,26.200000762939453,23.649999618530273,25.350000381469727,108793800 +2021-04-15,23.149999618530273,24.059999465942383,22.690000534057617,24.010000228881836,58849300 +2021-04-16,22.469999313354492,23.260000228881836,22.299999237060547,22.860000610351562,46627700 +2021-04-19,21.940000534057617,22.329999923706055,21.530000686645508,22.149999618530273,45753900 +2021-04-20,21.780000686645508,22.549999237060547,21.239999771118164,21.959999084472656,47123100 +2021-04-21,22.6299991607666,22.639999389648438,21.43000030517578,21.649999618530273,42641400 +2021-04-22,22.860000610351562,23.510000228881836,22.510000228881836,22.940000534057617,51346400 +2021-04-23,23.40999984741211,23.549999237060547,22.739999771118164,22.889999389648438,32052800 +2021-04-26,24.110000610351562,24.260000228881836,23.459999084472656,23.690000534057617,33667600 +2021-04-27,23.8799991607666,24.260000228881836,23.56999969482422,24.170000076293945,27678300 +2021-04-28,23.850000381469727,24.170000076293945,23.420000076293945,23.670000076293945,22068100 +2021-04-29,23.3700008392334,24.139999389648438,22.809999465942383,23.8700008392334,36770100 +2021-04-30,23.040000915527344,23.549999237060547,22.84000015258789,23.18000030517578,24717300 +2021-05-03,22.299999237060547,23.079999923706055,22.209999084472656,23.010000228881836,33934400 +2021-05-04,21.639999389648438,22.200000762939453,20.8700008392334,21.940000534057617,63429600 +2021-05-05,21.149999618530273,21.940000534057617,20.969999313354492,21.809999465942383,39134700 +2021-05-06,20.09000015258789,21.020000457763672,19.40999984741211,21.020000457763672,92201100 +2021-05-07,19.75,20.75,19.579999923706055,20.299999237060547,63725500 +2021-05-10,18.469999313354492,19.299999237060547,18.18000030517578,19.280000686645508,104670500 +2021-05-11,20.209999084472656,20.299999237060547,17.05500030517578,17.200000762939453,203230500 +2021-05-12,18.889999389648438,20.0,18.510000228881836,20.0,128281500 +2021-05-13,18.3700008392334,19.469999313354492,17.81999969482422,19.139999389648438,87811600 +2021-05-14,20.079999923706055,20.200000762939453,18.530000686645508,18.81999969482422,79409500 +2021-05-17,20.459999084472656,20.489999771118164,19.6299991607666,19.729999542236328,50039600 +2021-05-18,21.239999771118164,21.6200008392334,20.260000228881836,20.520000457763672,59672400 +2021-05-19,20.670000076293945,21.03499984741211,19.940000534057617,20.100000381469727,45314000 +2021-05-20,20.610000610351562,20.809999465942383,20.280000686645508,20.75,46302400 +2021-05-21,20.75,21.15999984741211,20.469999313354492,20.84000015258789,35372900 +2021-05-24,21.219999313354492,21.520000457763672,20.674999237060547,21.059999465942383,46596800 +2021-05-25,21.479999542236328,22.110000610351562,21.280000686645508,21.420000076293945,49890800 +2021-05-26,22.1200008392334,22.239999771118164,21.489999771118164,21.579999923706055,42958300 +2021-05-27,22.700000762939453,22.700000762939453,21.649999618530273,22.010000228881836,76230500 +2021-05-28,22.950000762939453,24.75,22.760000228881836,23.0,111846000 +2021-06-01,23.059999465942383,23.350000381469727,22.360000610351562,23.190000534057617,52695500 +2021-06-02,24.450000762939453,24.84000015258789,22.81999969482422,23.020000457763672,86473200 +2021-06-03,23.6299991607666,24.260000228881836,23.34000015258789,24.139999389648438,48164200 +2021-06-04,24.030000686645508,24.489999771118164,23.5,23.709999084472656,42537600 +2021-06-07,24.459999084472656,24.760000228881836,23.790000915527344,24.0,49641000 +2021-06-08,24.3799991607666,25.229999542236328,23.93000030517578,24.850000381469727,53488600 +2021-06-09,24.170000076293945,24.739999771118164,24.170000076293945,24.450000762939453,36006200 +2021-06-10,24.139999389648438,24.389999389648438,23.440000534057617,24.0,35482900 +2021-06-11,24.670000076293945,24.709999084472656,24.030000686645508,24.1200008392334,33113100 +2021-06-14,25.0,25.149999618530273,24.469999313354492,24.729999542236328,51801500 +2021-06-15,24.40999984741211,25.549999237060547,24.389999389648438,25.030000686645508,46693200 +2021-06-16,24.799999237060547,24.940000534057617,23.860000610351562,24.09000015258789,58452600 +2021-06-17,25.450000762939453,25.459999084472656,24.549999237060547,24.68000030517578,64408400 +2021-06-18,25.3700008392334,25.940000534057617,25.020000457763672,25.59000015258789,65852600 +2021-06-21,25.420000076293945,25.549999237060547,24.510000228881836,25.100000381469727,54805000 +2021-06-22,25.399999618530273,25.520000457763672,24.959999084472656,25.389999389648438,46171100 +2021-06-23,26.270000457763672,26.350000381469727,25.34000015258789,25.459999084472656,53362200 +2021-06-24,26.530000686645508,26.709999084472656,26.170000076293945,26.489999771118164,48419400 +2021-06-25,26.780000686645508,27.010000228881836,26.2450008392334,26.579999923706055,140832700 +2021-06-28,27.3799991607666,27.5,26.860000610351562,26.979999542236328,42184600 +2021-06-29,26.6299991607666,27.440000534057617,26.440000534057617,27.3799991607666,38478900 +2021-06-30,26.360000610351562,26.920000076293945,26.209999084472656,26.479999542236328,28957100 +2021-07-01,24.719999313354492,26.1299991607666,24.59000015258789,26.100000381469727,55429800 +2021-07-02,24.440000534057617,25.34000015258789,24.329999923706055,25.0,29389500 +2021-07-06,24.68000030517578,25.200000762939453,24.469999313354492,24.600000381469727,28764500 +2021-07-07,22.889999389648438,24.260000228881836,22.719999313354492,24.229999542236328,66937300 +2021-07-08,23.079999923706055,23.209999084472656,22.25,22.43000030517578,34612600 +2021-07-09,23.290000915527344,23.389999389648438,22.760000228881836,22.959999084472656,22492400 +2021-07-12,22.950000762939453,23.4950008392334,22.8799991607666,23.260000228881836,23457200 +2021-07-13,22.450000762939453,22.989999771118164,22.420000076293945,22.979999542236328,24748800 +2021-07-14,21.559999465942383,22.6200008392334,21.510000228881836,22.489999771118164,33796200 +2021-07-15,21.469999313354492,22.05500030517578,21.010000228881836,21.719999313354492,31871000 +2021-07-16,21.3700008392334,21.709999084472656,21.239999771118164,21.600000381469727,19503100 +2021-07-19,21.540000915527344,21.690000534057617,20.549999237060547,20.969999313354492,30314400 +2021-07-20,22.18000030517578,22.350000381469727,21.219999313354492,21.6299991607666,22954000 +2021-07-21,22.520000457763672,22.68000030517578,22.1200008392334,22.270000457763672,20437300 +2021-07-22,22.06999969482422,22.670000076293945,21.8799991607666,22.549999237060547,17468900 +2021-07-23,21.809999465942383,22.079999923706055,21.510000228881836,22.010000228881836,17653300 +2021-07-26,22.1299991607666,22.299999237060547,21.479999542236328,21.799999237060547,16267900 +2021-07-27,21.68000030517578,22.110000610351562,21.09000015258789,21.959999084472656,23078700 +2021-07-28,22.559999465942383,22.614999771118164,21.690000534057617,21.75,25073600 +2021-07-29,22.18000030517578,22.850000381469727,22.139999389648438,22.780000686645508,19219100 +2021-07-30,21.709999084472656,22.4060001373291,21.709999084472656,21.850000381469727,15889200 +2021-08-02,22.100000381469727,22.3700008392334,21.479999542236328,21.90999984741211,21372900 +2021-08-03,22.239999771118164,22.270000457763672,21.709999084472656,22.030000686645508,17040100 +2021-08-04,22.299999237060547,22.540000915527344,22.06999969482422,22.200000762939453,15537400 +2021-08-05,22.520000457763672,22.770000457763672,22.020000457763672,22.219999313354492,18575200 +2021-08-06,21.81999969482422,22.690000534057617,21.790000915527344,22.639999389648438,24200700 +2021-08-09,22.93000030517578,23.280000686645508,21.799999237060547,21.850000381469727,35611100 +2021-08-10,22.920000076293945,23.520000457763672,22.780000686645508,23.010000228881836,25947900 +2021-08-11,22.350000381469727,23.190000534057617,22.09000015258789,23.06999969482422,34679000 +2021-08-12,24.889999389648438,25.760000228881836,23.584999084472656,24.450000762939453,189287200 +2021-08-13,24.899999618530273,25.100000381469727,24.309999465942383,25.0,52395100 +2021-08-16,24.5,24.899999618530273,23.770000457763672,24.899999618530273,45907300 +2021-08-17,23.969999313354492,24.59000015258789,23.739999771118164,23.899999618530273,35348300 +2021-08-18,25.280000686645508,25.940000534057617,23.68000030517578,24.06999969482422,92065600 +2021-08-19,24.15999984741211,25.639999389648438,24.139999389648438,25.010000228881836,67605600 +2021-08-20,24.010000228881836,24.479999542236328,23.65999984741211,24.219999313354492,52062300 +2021-08-23,24.81999969482422,24.93000030517578,23.899999618530273,24.020000457763672,35705300 +2021-08-24,25.100000381469727,25.350000381469727,24.760000228881836,25.0,37227400 +2021-08-25,24.350000381469727,25.190000534057617,24.06999969482422,25.1200008392334,54678500 +2021-08-26,24.8700008392334,25.40999984741211,24.360000610351562,24.399999618530273,46179400 +2021-08-27,25.709999084472656,26.09000015258789,24.90999984741211,25.049999237060547,52268500 +2021-08-30,25.760000228881836,26.600000381469727,25.6200008392334,25.739999771118164,44139300 +2021-08-31,26.34000015258789,26.360000610351562,25.65999984741211,25.790000915527344,93168600 +2021-09-01,26.200000762939453,26.510000228881836,26.030000686645508,26.459999084472656,34417200 +2021-09-02,26.510000228881836,26.8700008392334,26.09000015258789,26.209999084472656,38460100 +2021-09-03,26.639999389648438,26.75,26.219999313354492,26.489999771118164,26609500 +2021-09-07,26.700000762939453,26.8799991607666,26.270000457763672,26.790000915527344,35835100 +2021-09-08,25.579999923706055,26.610000610351562,24.959999084472656,26.600000381469727,54394400 +2021-09-09,26.1299991607666,26.239999771118164,25.290000915527344,25.389999389648438,34190800 +2021-09-10,26.280000686645508,26.729999542236328,26.170000076293945,26.18000030517578,37307800 +2021-09-13,25.829999923706055,26.23900032043457,25.030000686645508,26.149999618530273,42372300 +2021-09-14,26.260000228881836,26.700000762939453,25.899999618530273,25.969999313354492,34569000 +2021-09-15,27.079999923706055,27.149999618530273,26.030000686645508,26.299999237060547,49555500 +2021-09-16,28.6299991607666,28.790000915527344,27.020000457763672,27.200000762939453,109992000 +2021-09-17,28.709999084472656,29.290000915527344,28.06999969482422,28.65999984741211,182052600 +2021-09-20,26.549999237060547,28.100000381469727,26.059999465942383,27.56999969482422,89413500 +2021-09-21,26.6200008392334,27.14900016784668,26.079999923706055,26.889999389648438,50933600 +2021-09-22,27.43000030517578,27.770000457763672,26.582000732421875,26.610000610351562,44308100 +2021-09-23,28.770000457763672,29.190000534057617,27.670000076293945,27.709999084472656,60028600 +2021-09-24,28.559999465942383,28.760000228881836,27.900999069213867,28.270000457763672,40309700 +2021-09-27,27.469999313354492,28.3799991607666,27.229999542236328,28.229999542236328,44102800 +2021-09-28,25.34000015258789,27.1299991607666,25.209999084472656,27.020000457763672,64206200 +2021-09-29,24.520000457763672,25.700000762939453,24.420000076293945,25.610000610351562,46164500 +2021-09-30,24.040000915527344,25.049999237060547,23.8799991607666,24.690000534057617,59505600 +2021-10-01,24.329999923706055,24.360000610351562,23.719999313354492,24.209999084472656,32778000 +2021-10-04,23.170000076293945,24.049999237060547,23.020000457763672,24.010000228881836,46789700 +2021-10-05,23.209999084472656,23.8799991607666,23.06999969482422,23.209999084472656,56574800 +2021-10-06,23.579999923706055,25.010000228881836,23.350000381469727,24.90999984741211,125175700 +2021-10-07,23.729999542236328,24.1299991607666,23.540000915527344,23.709999084472656,38873700 +2021-10-08,23.5,24.09600067138672,23.110000610351562,23.860000610351562,39713400 +2021-10-11,23.530000686645508,23.979999542236328,23.260000228881836,23.260000228881836,23971700 +2021-10-12,23.690000534057617,23.809999465942383,23.290000915527344,23.549999237060547,26280000 +2021-10-13,24.1299991607666,24.309999465942383,23.790000915527344,23.829999923706055,28494000 +2021-10-14,24.350000381469727,24.709999084472656,24.204999923706055,24.43000030517578,26106700 +2021-10-15,24.0,24.520000457763672,23.829999923706055,24.5,24366100 +2021-10-18,24.260000228881836,24.389999389648438,23.920000076293945,24.0,25609900 +2021-10-19,24.690000534057617,25.200000762939453,24.360000610351562,24.5,29393900 +2021-10-20,24.219999313354492,24.959999084472656,24.170000076293945,24.790000915527344,24248000 +2021-10-21,24.780000686645508,24.93000030517578,24.079999923706055,24.1299991607666,23976600 +2021-10-22,24.43000030517578,24.850000381469727,24.25,24.489999771118164,20166800 +2021-10-25,25.40999984741211,25.540000915527344,24.479999542236328,24.5,33962100 +2021-10-26,25.520000457763672,26.75,25.25,25.989999771118164,56767000 +2021-10-27,25.059999465942383,25.899999618530273,25.020000457763672,25.639999389648438,24157200 +2021-10-28,25.639999389648438,25.795000076293945,25.1200008392334,25.299999237060547,21203000 +2021-10-29,25.8799991607666,26.1200008392334,25.450000762939453,25.5,21910300 +2021-11-01,26.559999465942383,26.645000457763672,25.882999420166016,26.110000610351562,26684700 +2021-11-02,25.920000076293945,26.719999313354492,25.55500030517578,26.559999465942383,30794600 +2021-11-03,26.1200008392334,26.235000610351562,25.170000076293945,25.889999389648438,25244200 +2021-11-04,26.469999313354492,26.56999969482422,25.8700008392334,26.260000228881836,25029700 +2021-11-05,26.0,26.6299991607666,25.719999313354492,26.450000762939453,26005000 +2021-11-08,26.75,27.110000610351562,26.1200008392334,26.25,41359600 +2021-11-09,24.25,25.979999542236328,23.950000762939453,25.899999618530273,117540200 +2021-11-10,22.520000457763672,23.639999389648438,22.1200008392334,23.600000381469727,94860100 +2021-11-11,22.989999771118164,23.1299991607666,22.665000915527344,23.040000915527344,43381500 +2021-11-12,22.829999923706055,23.225000381469727,22.3799991607666,23.020000457763672,53516200 +2021-11-15,23.40999984741211,23.520000457763672,22.950000762939453,23.0,33225700 +2021-11-16,23.1299991607666,23.290000915527344,22.610000610351562,23.290000915527344,31574800 +2021-11-17,22.489999771118164,23.2189998626709,22.399999618530273,23.049999237060547,27994100 +2021-11-18,21.5,22.549999237060547,21.341999053955078,22.5,51039900 +2021-11-19,21.40999984741211,21.959999084472656,21.299999237060547,21.600000381469727,30013100 +2021-11-22,20.649999618530273,21.56999969482422,20.18000030517578,21.530000686645508,59899100 +2021-11-23,20.59000015258789,21.049999237060547,20.049999237060547,20.59000015258789,44588000 +2021-11-24,21.110000610351562,21.200000762939453,20.059999465942383,20.350000381469727,35233900 +2021-11-26,21.030000686645508,21.09000015258789,20.349000930786133,20.40999984741211,20691200 +2021-11-29,21.06999969482422,21.399999618530273,20.559999465942383,21.190000534057617,29114000 +2021-11-30,20.649999618530273,21.25,20.110000610351562,20.950000762939453,38196400 +2021-12-01,19.3799991607666,20.889999389648438,19.290000915527344,20.530000686645508,48283700 +2021-12-02,19.690000534057617,19.90999984741211,19.059999465942383,19.299999237060547,45802900 +2021-12-03,18.979999542236328,19.530000686645508,18.399999618530273,19.5,56039600 +2021-12-06,18.799999237060547,18.969999313354492,18.075000762939453,18.540000915527344,56459800 +2021-12-07,19.459999084472656,19.854999542236328,19.06999969482422,19.260000228881836,35129000 +2021-12-08,19.81999969482422,19.825000762939453,19.030000686645508,19.510000228881836,28425900 +2021-12-09,19.209999084472656,20.149999618530273,19.040000915527344,19.950000762939453,30354700 +2021-12-10,18.940000534057617,19.579999923706055,18.700000762939453,19.280000686645508,27594500 +2021-12-13,18.399999618530273,19.075000762939453,18.170000076293945,18.799999237060547,38376000 +2021-12-14,18.639999389648438,18.858999252319336,17.90999984741211,18.0,38864800 +2021-12-15,18.860000610351562,18.940000534057617,17.9950008392334,18.3700008392334,39361900 +2021-12-16,18.34000015258789,19.1200008392334,18.149999618530273,18.959999084472656,33950000 +2021-12-17,19.059999465942383,19.100000381469727,17.809999465942383,18.030000686645508,44495200 +2021-12-20,17.959999084472656,18.670000076293945,17.834999084472656,18.59000015258789,42265900 +2021-12-21,18.899999618530273,18.979999542236328,18.100000381469727,18.15999984741211,33878600 +2021-12-22,18.8799991607666,19.450000762939453,18.649999618530273,18.649999618530273,33894200 +2021-12-23,18.93000030517578,19.135000228881836,18.719999313354492,18.850000381469727,24758300 +2021-12-27,18.940000534057617,19.25,18.780000686645508,18.780000686645508,21782000 +2021-12-28,18.56999969482422,19.06999969482422,18.440000534057617,18.889999389648438,20518800 +2021-12-29,18.170000076293945,18.600000381469727,17.90999984741211,18.530000686645508,28217500 +2021-12-30,18.690000534057617,18.9950008392334,18.06999969482422,18.100000381469727,29285200 +2021-12-31,18.209999084472656,18.920000076293945,18.209999084472656,18.610000610351562,23556000 +2022-01-03,18.530000686645508,18.569000244140625,17.860000610351562,18.360000610351562,34283600 +2022-01-04,18.170000076293945,18.84000015258789,17.790000915527344,18.610000610351562,39643200 +2022-01-05,16.959999084472656,18.56800079345703,16.8700008392334,18.030000686645508,58445900 +2022-01-06,16.739999771118164,17.18000030517578,16.05500030517578,16.8700008392334,49737100 +2022-01-07,16.559999465942383,17.329999923706055,16.475000381469727,16.700000762939453,37989300 +2022-01-10,16.5,16.56999969482422,15.350000381469727,16.190000534057617,77649400 +2022-01-11,16.889999389648438,17.25,16.31999969482422,16.399999618530273,47442600 +2022-01-12,16.719999313354492,17.459999084472656,16.399999618530273,17.15999984741211,39784200 +2022-01-13,16.010000228881836,16.81999969482422,15.9399995803833,16.799999237060547,35492200 +2022-01-14,16.010000228881836,16.249000549316406,15.619999885559082,15.9399995803833,35624900 +2022-01-18,14.970000267028809,15.75,14.920000076293945,15.449999809265137,49067700 +2022-01-19,14.5600004196167,15.25,14.539999961853027,14.899999618530273,48049100 +2022-01-20,14.619999885559082,15.550000190734863,14.569999694824219,14.890000343322754,44690400 +2022-01-21,13.529999732971191,14.477999687194824,13.5,14.25,73031300 +2022-01-24,13.399999618530273,13.40999984741211,11.75,12.789999961853027,110518900 +2022-01-25,13.0600004196167,13.600000381469727,12.829999923706055,13.119999885559082,47456600 +2022-01-26,12.75,13.819999694824219,12.680000305175781,13.600000381469727,69949700 +2022-01-27,12.279999732971191,13.0600004196167,12.199999809265137,13.010000228881836,52622900 +2022-01-28,12.710000038146973,12.880000114440918,11.890000343322754,12.300000190734863,54887500 +2022-01-31,13.710000038146973,13.739999771118164,12.760000228881836,12.770000457763672,51039300 +2022-02-01,14.199999809265137,14.369999885559082,13.5600004196167,14.229999542236328,69012900 +2022-02-02,13.319999694824219,14.199999809265137,13.1899995803833,14.09000015258789,47204300 +2022-02-03,12.449999809265137,13.319999694824219,12.420000076293945,12.949999809265137,47236900 +2022-02-04,12.9399995803833,13.09000015258789,12.265000343322754,12.470000267028809,38989200 +2022-02-07,12.979999542236328,13.600000381469727,12.9399995803833,13.024999618530273,45646100 +2022-02-08,13.149999618530273,13.189000129699707,12.619999885559082,12.75,30317100 +2022-02-09,13.869999885559082,13.890000343322754,13.260000228881836,13.289999961853027,34451900 +2022-02-10,13.5600004196167,14.164999961853027,13.369999885559082,13.5,41998200 +2022-02-11,13.130000114440918,13.920000076293945,12.970000267028809,13.449999809265137,41831600 +2022-02-14,13.260000228881836,13.795000076293945,12.979999542236328,13.100000381469727,40617900 +2022-02-15,14.170000076293945,14.1850004196167,13.40999984741211,13.520000457763672,48523700 +2022-02-16,13.970000267028809,14.260000228881836,13.65999984741211,13.90999984741211,58624400 +2022-02-17,11.770000457763672,12.699999809265137,11.699999809265137,12.390000343322754,151385400 +2022-02-18,11.020000457763672,12.010000228881836,10.569999694824219,11.920000076293945,137808100 +2022-02-22,10.479999542236328,11.1850004196167,10.300000190734863,10.699999809265137,104501500 +2022-02-23,10.430000305175781,11.260000228881836,10.399999618530273,10.829999923706055,93964500 +2022-02-24,11.829999923706055,11.869999885559082,9.739999771118164,9.75,118793000 +2022-02-25,11.470000267028809,11.890000343322754,11.0,11.59000015258789,75433700 +2022-02-28,11.850000381469727,12.180000305175781,11.390000343322754,11.960000038146973,75390500 +2022-03-01,12.180000305175781,12.520000457763672,11.710000038146973,11.989999771118164,64867200 +2022-03-02,12.0600004196167,12.210000038146973,11.420000076293945,12.210000038146973,56698300 +2022-03-03,11.34000015258789,12.055000305175781,11.234999656677246,12.010000228881836,46172000 +2022-03-04,10.960000038146973,11.770000457763672,10.739999771118164,11.699999809265137,43502200 +2022-03-07,11.109999656677246,11.75,11.100000381469727,11.430000305175781,63070600 +2022-03-08,11.039999961853027,11.390000343322754,10.718999862670898,10.930000305175781,49279600 +2022-03-09,11.649999618530273,12.020000457763672,11.270000457763672,11.40999984741211,43591400 +2022-03-10,11.869999885559082,11.970000267028809,11.319999694824219,11.380000114440918,52295400 +2022-03-11,11.390000343322754,12.005000114440918,11.369999885559082,11.859999656677246,37817400 +2022-03-14,10.5,11.40999984741211,10.40999984741211,11.170000076293945,49762600 +2022-03-15,10.770000457763672,10.850000381469727,10.270000457763672,10.470000267028809,40451200 +2022-03-16,11.789999961853027,11.819999694824219,10.9399995803833,10.949999809265137,62746600 +2022-03-17,12.319999694824219,12.369999885559082,11.65999984741211,11.720000267028809,43948900 +2022-03-18,12.819999694824219,13.020000457763672,12.21500015258789,12.279999732971191,59125500 +2022-03-21,12.59000015258789,13.050000190734863,12.420000076293945,12.720000267028809,39410900 +2022-03-22,13.270000457763672,13.479999542236328,12.520000457763672,12.520000457763672,46210700 +2022-03-23,13.180000305175781,13.550000190734863,13.020000457763672,13.15999984741211,33699400 +2022-03-24,13.390000343322754,13.420000076293945,12.829999923706055,13.25,29535300 +2022-03-25,12.970000267028809,13.395000457763672,12.710000038146973,13.359999656677246,24796900 +2022-03-28,13.420000076293945,13.4399995803833,12.854999542236328,13.010000228881836,27152000 +2022-03-29,14.199999809265137,14.279999732971191,13.350000381469727,13.649999618530273,46433700 +2022-03-30,13.880000114440918,14.359999656677246,13.739999771118164,14.039999961853027,32164000 +2022-03-31,13.729999542236328,14.0600004196167,13.630000114440918,13.899999618530273,22840000 +2022-04-01,13.829999923706055,14.0649995803833,13.5,13.770000457763672,23831600 +2022-04-04,14.630000114440918,14.65999984741211,14.020000457763672,14.029999732971191,40066800 +2022-04-05,13.890000343322754,14.859999656677246,13.795000076293945,14.609999656677246,37677300 +2022-04-06,13.0,13.539999961853027,12.850000381469727,13.520000457763672,40647700 +2022-04-07,12.84000015258789,13.34000015258789,12.479999542236328,12.949999809265137,34727400 +2022-04-08,12.699999809265137,13.050000190734863,12.569999694824219,12.699999809265137,24962500 +2022-04-11,12.65999984741211,12.819999694824219,12.130000114440918,12.449999809265137,26095800 +2022-04-12,12.460000038146973,13.199999809265137,12.425000190734863,12.880000114440918,26226500 +2022-04-13,12.899999618530273,12.9399995803833,12.230999946594238,12.350000381469727,21152900 +2022-04-14,12.420000076293945,12.920000076293945,12.40999984741211,12.920000076293945,23284100 +2022-04-18,12.149999618530273,12.414999961853027,11.880000114440918,12.350000381469727,25395600 +2022-04-19,12.90999984741211,13.020000457763672,12.069999694824219,12.079999923706055,31753900 +2022-04-20,12.789999961853027,13.170000076293945,12.739999771118164,13.079999923706055,31528600 +2022-04-21,12.329999923706055,13.329999923706055,12.225000381469727,13.020000457763672,32009000 +2022-04-22,11.960000038146973,12.729999542236328,11.859999656677246,12.329999923706055,30386100 +2022-04-25,12.109999656677246,12.15999984741211,11.680000305175781,11.829999923706055,31727600 +2022-04-26,11.119999885559082,12.050000190734863,11.100000381469727,11.9399995803833,38666500 +2022-04-27,10.5600004196167,11.194999694824219,10.529999732971191,11.010000228881836,54508500 +2022-04-28,10.949999809265137,11.045000076293945,10.369999885559082,10.6899995803833,40074500 +2022-04-29,10.399999618530273,11.229999542236328,10.359999656677246,10.899999618530273,30937500 +2022-05-02,10.739999771118164,10.755000114440918,10.180000305175781,10.380000114440918,41193800 +2022-05-03,10.550000190734863,10.979999542236328,10.4399995803833,10.6899995803833,31372700 +2022-05-04,10.979999542236328,11.010000228881836,10.079999923706055,10.529999732971191,43239900 +2022-05-05,10.119999885559082,10.800000190734863,9.979999542236328,10.800000190734863,40523600 +2022-05-06,9.479999542236328,10.050000190734863,9.420000076293945,10.0,69691300 +2022-05-09,7.460000038146973,7.849999904632568,7.320000171661377,7.78000020980835,170871700 +2022-05-10,7.289999961853027,7.703000068664551,6.929999828338623,7.559999942779541,86932400 +2022-05-11,6.710000038146973,7.539999961853027,6.659999847412109,7.28000020980835,72894900 +2022-05-12,7.340000152587891,7.380000114440918,6.440000057220459,6.550000190734863,82147300 +2022-05-13,8.34000015258789,8.350000381469727,7.519999980926514,7.519999980926514,69242700 +2022-05-16,8.039999961853027,8.430000305175781,8.010000228881836,8.170000076293945,46153200 +2022-05-17,8.359999656677246,8.460000038146973,8.010000228881836,8.100000381469727,38620800 +2022-05-18,8.010000228881836,8.430000305175781,7.920000076293945,8.210000038146973,29304600 +2022-05-19,8.3100004196167,8.581000328063965,7.945000171661377,7.96999979019165,35780900 +2022-05-20,8.079999923706055,8.399999618530273,7.710000038146973,8.260000228881836,40879100 +2022-05-23,8.010000228881836,8.170000076293945,7.800000190734863,8.010000228881836,27755200 +2022-05-24,7.550000190734863,7.989999771118164,7.369999885559082,7.980000019073486,47218700 +2022-05-25,7.960000038146973,8.017999649047852,7.510000228881836,7.519999980926514,35068900 +2022-05-26,8.359999656677246,8.399999618530273,7.769999980926514,7.840000152587891,39738900 +2022-05-27,8.850000381469727,8.850000381469727,8.434000015258789,8.5,37064000 +2022-05-31,8.680000305175781,9.100000381469727,8.5600004196167,8.970000267028809,41672300 +2022-06-01,8.460000038146973,8.979000091552734,8.380000114440918,8.720000267028809,34438100 +2022-06-02,9.300000190734863,9.390000343322754,8.461000442504883,8.539999961853027,41347000 +2022-06-03,8.9399995803833,9.25,8.859999656677246,9.039999961853027,36632300 +2022-06-06,8.979999542236328,9.210000038146973,8.779999732971191,9.109999656677246,35101100 +2022-06-07,9.130000114440918,9.140000343322754,8.729999542236328,8.890000343322754,28049400 +2022-06-08,9.180000305175781,9.420000076293945,9.09000015258789,9.180000305175781,29056300 +2022-06-09,8.680000305175781,9.15999984741211,8.670000076293945,9.130000114440918,30527400 +2022-06-10,8.260000228881836,8.579999923706055,8.140000343322754,8.479999542236328,30225800 +2022-06-13,7.639999866485596,8.0,7.5,7.989999771118164,40943000 +2022-06-14,7.820000171661377,7.980000019073486,7.585000038146973,7.735000133514404,30564100 +2022-06-15,8.119999885559082,8.300000190734863,7.815000057220459,7.920000076293945,38235300 +2022-06-16,7.670000076293945,7.985000133514404,7.579999923706055,7.840000152587891,36793500 +2022-06-17,8.239999771118164,8.329999923706055,7.690000057220459,7.699999809265137,45518000 +2022-06-21,8.710000038146973,9.050000190734863,8.5600004196167,8.59000015258789,48887600 +2022-06-22,9.010000228881836,9.28499984741211,8.449999809265137,8.520000457763672,43430600 +2022-06-23,9.460000038146973,9.5,8.84000015258789,9.020000457763672,44618000 +2022-06-24,10.1899995803833,10.199999809265137,9.479999542236328,9.529999732971191,67826000 +2022-06-27,9.619999885559082,10.15999984741211,9.510000228881836,10.149999618530273,44768000 +2022-06-28,9.3100004196167,9.880000114440918,9.1899995803833,9.569999694824219,45589000 +2022-06-29,9.229999542236328,9.420000076293945,9.069999694824219,9.350000381469727,40408700 +2022-06-30,9.069999694824219,9.1899995803833,8.720000267028809,9.020000457763672,33636400 +2022-07-01,9.270000457763672,9.430000305175781,9.031000137329102,9.109999656677246,33504400 +2022-07-05,10.069999694824219,10.100000381469727,9.0,9.140000343322754,55854800 +2022-07-06,9.800000190734863,10.3100004196167,9.739999771118164,10.010000228881836,54604300 +2022-07-07,10.180000305175781,10.279999732971191,9.75,9.760000228881836,35672500 +2022-07-08,10.170000076293945,10.380000114440918,9.829999923706055,9.920000076293945,36737100 +2022-07-11,9.5600004196167,9.994000434875488,9.529999732971191,9.979999542236328,34015100 +2022-07-12,9.489999771118164,9.960000038146973,9.270000457763672,9.65999984741211,42765800 +2022-07-13,9.279999732971191,9.550000190734863,9.050000190734863,9.220000267028809,32461300 +2022-07-14,8.899999618530273,9.279999732971191,8.850000381469727,9.229999542236328,26702100 +2022-07-15,9.039999961853027,9.119999885559082,8.649999618530273,9.010000228881836,34918100 +2022-07-18,9.029999732971191,9.449999809265137,9.005000114440918,9.25,32428400 +2022-07-19,9.34000015258789,9.369999885559082,8.890000343322754,9.149999618530273,29033800 +2022-07-20,10.109999656677246,10.199999809265137,9.4399995803833,9.4399995803833,40845200 +2022-07-21,10.489999771118164,10.760000228881836,10.220000267028809,10.369999885559082,51691200 +2022-07-22,9.84000015258789,10.569999694824219,9.729999542236328,10.350000381469727,38915500 +2022-07-25,9.680000305175781,9.850000381469727,9.520000457763672,9.829999923706055,21485000 +2022-07-26,9.399999618530273,9.65999984741211,9.380000114440918,9.65999984741211,21997800 +2022-07-27,10.020000457763672,10.029999732971191,9.5,9.670000076293945,29810900 +2022-07-28,10.130000114440918,10.199999809265137,9.739999771118164,10.029999732971191,27172900 +2022-07-29,10.350000381469727,10.350000381469727,9.920000076293945,10.010000228881836,31106600 +2022-08-01,10.470000267028809,10.699999809265137,10.121999740600586,10.25,31694700 +2022-08-02,10.920000076293945,11.229999542236328,10.260000228881836,10.319999694824219,40958800 +2022-08-03,11.199999809265137,11.34000015258789,11.039999961853027,11.079999923706055,35796500 +2022-08-04,11.319999694824219,11.40999984741211,11.029999732971191,11.1899995803833,32093400 +2022-08-05,11.449999809265137,11.619999885559082,10.850000381469727,11.010000228881836,50264800 +2022-08-08,9.819999694824219,10.399999618530273,9.710000038146973,9.770000457763672,125272600 +2022-08-09,9.25,9.569999694824219,9.010000228881836,9.539999961853027,58788900 +2022-08-10,9.59000015258789,9.65999984741211,9.319999694824219,9.510000228881836,46054900 +2022-08-11,9.420000076293945,10.050000190734863,9.399999618530273,9.760000228881836,44790900 +2022-08-12,9.90999984741211,9.970000267028809,9.420000076293945,9.550000190734863,30638200 +2022-08-15,9.90999984741211,10.100000381469727,9.760000228881836,9.819999694824219,33263400 +2022-08-16,9.739999771118164,9.880000114440918,9.359999656677246,9.850000381469727,40603900 +2022-08-17,9.430000305175781,9.619000434875488,9.329999923706055,9.5600004196167,33933600 +2022-08-18,9.149999618530273,9.470000267028809,9.119999885559082,9.420000076293945,26365600 +2022-08-19,8.510000228881836,9.010000228881836,8.479999542236328,9.0,40560200 +2022-08-22,8.069999694824219,8.399999618530273,8.0600004196167,8.319999694824219,37824900 +2022-08-23,8.010000228881836,8.279999732971191,8.0,8.100000381469727,25658500 +2022-08-24,8.100000381469727,8.359999656677246,7.980000019073486,8.039999961853027,26576400 +2022-08-25,8.420000076293945,8.430000305175781,8.050000190734863,8.220000267028809,25635600 +2022-08-26,7.940000057220459,8.430000305175781,7.929999828338623,8.420000076293945,34150400 +2022-08-29,7.809999942779541,7.998000144958496,7.760000228881836,7.820000171661377,28566200 +2022-08-30,7.789999961853027,7.974999904632568,7.679999828338623,7.929999828338623,27189200 +2022-08-31,7.71999979019165,8.0,7.699999809265137,7.949999809265137,28691500 +2022-09-01,7.489999771118164,7.619999885559082,7.21999979019165,7.610000133514404,39079700 +2022-09-02,7.400000095367432,7.670000076293945,7.349999904632568,7.670000076293945,25965000 +2022-09-06,7.28000020980835,7.460000038146973,7.170000076293945,7.449999809265137,30429400 +2022-09-07,7.389999866485596,7.429999828338623,7.179999828338623,7.269999980926514,30330000 +2022-09-08,7.53000020980835,7.53000020980835,7.269999980926514,7.329999923706055,26303600 +2022-09-09,7.789999961853027,7.820000171661377,7.639999866485596,7.679999828338623,27822300 +2022-09-12,8.010000228881836,8.029999732971191,7.820000171661377,7.860000133514404,30544800 +2022-09-13,7.480000019073486,7.659999847412109,7.449999809265137,7.630000114440918,29770700 +2022-09-14,7.630000114440918,7.630000114440918,7.329999923706055,7.449999809265137,29422500 +2022-09-15,8.010000228881836,8.100000381469727,7.449999809265137,7.46999979019165,51700600 +2022-09-16,7.78000020980835,7.929999828338623,7.639999866485596,7.75,42155500 +2022-09-19,7.860000133514404,7.860000133514404,7.579999923706055,7.639999866485596,29238800 +2022-09-20,7.619999885559082,7.914999961853027,7.599999904632568,7.78000020980835,30349600 +2022-09-21,7.690000057220459,8.069999694824219,7.65500020980835,7.71999979019165,36814500 +2022-09-22,7.369999885559082,7.739999771118164,7.239999771118164,7.739999771118164,49138300 +2022-09-23,7.400000095367432,7.420000076293945,7.130000114440918,7.199999809265137,34197300 +2022-09-26,7.53000020980835,7.829999923706055,7.349999904632568,7.349999904632568,45429800 +2022-09-27,7.630000114440918,7.835000038146973,7.460000038146973,7.690000057220459,31794700 +2022-09-28,7.940000057220459,8.0,7.619999885559082,7.630000114440918,31955900 +2022-09-29,8.079999923706055,8.329999923706055,7.78000020980835,8.050000190734863,57845800 +2022-09-30,8.130000114440918,8.5,7.9710001945495605,8.010000228881836,47454800 +2022-10-03,8.239999771118164,8.300000190734863,7.96999979019165,8.145000457763672,35524000 +2022-10-04,8.460000038146973,8.609999656677246,8.34000015258789,8.479999542236328,36313300 +2022-10-05,8.420000076293945,8.484999656677246,8.074999809265137,8.260000228881836,37790200 +2022-10-06,8.470000267028809,8.600000381469727,8.3149995803833,8.399999618530273,27653400 +2022-10-07,8.149999618530273,8.279999732971191,8.109999656677246,8.260000228881836,29550500 +2022-10-10,8.0600004196167,8.180000305175781,7.880000114440918,8.170000076293945,26923300 +2022-10-11,8.039999961853027,8.295000076293945,7.699999809265137,7.989999771118164,40775800 +2022-10-12,8.069999694824219,8.100000381469727,7.820000171661377,8.0600004196167,30201600 +2022-10-13,8.079999923706055,8.199999809265137,7.565000057220459,7.739999771118164,36040900 +2022-10-14,7.53000020980835,8.3100004196167,7.53000020980835,8.229999542236328,37430100 +2022-10-17,7.940000057220459,8.0600004196167,7.690000057220459,7.710000038146973,31751700 +2022-10-18,8.15999984741211,8.329999923706055,8.039999961853027,8.149999618530273,37120400 +2022-10-19,7.909999847412109,8.125,7.84499979019165,8.0600004196167,26594000 +2022-10-20,8.039999961853027,8.260000228881836,7.730000019073486,7.730000019073486,26689500 +2022-10-21,8.289999961853027,8.319999694824219,7.809999942779541,7.929999828338623,30705700 +2022-10-24,8.270000457763672,8.300000190734863,8.010000228881836,8.300000190734863,28062200 +2022-10-25,8.65999984741211,8.65999984741211,8.359999656677246,8.359999656677246,31001500 +2022-10-26,8.569999694824219,9.050000190734863,8.390000343322754,8.479999542236328,33530900 +2022-10-27,8.600000381469727,8.779999732971191,8.460000038146973,8.680000305175781,28940800 +2022-10-28,8.640000343322754,8.65999984741211,8.364999771118164,8.550000190734863,20697400 +2022-10-31,8.789999961853027,8.829999923706055,8.430000305175781,8.59000015258789,31376100 +2022-11-01,8.649999618530273,9.0600004196167,8.5600004196167,8.989999771118164,29800000 +2022-11-02,8.220000267028809,8.760000228881836,8.199999809265137,8.699999809265137,36042600 +2022-11-03,8.079999923706055,8.300000190734863,7.869999885559082,8.069999694824219,36419500 +2022-11-04,7.929999828338623,8.199999809265137,7.650000095367432,8.1899995803833,64338900 +2022-11-07,7.019999980926514,7.849999904632568,6.889999866485596,7.78000020980835,99332800 +2022-11-08,7.210000038146973,7.420000076293945,6.909999847412109,7.079999923706055,56353900 +2022-11-09,6.980000019073486,7.184999942779541,6.949999809265137,7.119999885559082,42517300 +2022-11-10,7.639999866485596,7.96999979019165,7.429999828338623,7.460000038146973,58579800 +2022-11-11,8.40999984741211,8.420000076293945,7.375,7.480000019073486,55324100 +2022-11-14,8.100000381469727,8.319999694824219,7.953000068664551,8.180000305175781,37402700 +2022-11-15,8.34000015258789,8.470000267028809,8.154999732971191,8.449999809265137,34454100 +2022-11-16,8.0600004196167,8.239999771118164,8.0,8.180000305175781,28436000 +2022-11-17,7.619999885559082,7.880000114440918,7.525000095367432,7.829999923706055,33746500 +2022-11-18,7.389999866485596,7.789999961853027,7.309999942779541,7.760000228881836,27245200 +2022-11-21,7.190000057220459,7.320000171661377,7.070000171661377,7.309999942779541,36605600 +2022-11-22,7.21999979019165,7.25,6.980000019073486,7.179999828338623,27327800 +2022-11-23,7.369999885559082,7.420000076293945,7.119999885559082,7.25,24182900 +2022-11-25,7.28000020980835,7.339000225067139,7.190000057220459,7.320000171661377,10824400 +2022-11-28,7.159999847412109,7.400000095367432,7.150000095367432,7.230000019073486,19438000 +2022-11-29,7.079999923706055,7.300000190734863,7.050000190734863,7.199999809265137,22150800 +2022-11-30,7.5,7.510000228881836,7.0329999923706055,7.139999866485596,32745700 +2022-12-01,7.860000133514404,7.880000114440918,7.46999979019165,7.510000228881836,34424400 +2022-12-02,7.659999847412109,7.760000228881836,7.5,7.614999771118164,18794000 +2022-12-05,7.190000057220459,7.695000171661377,7.105000019073486,7.619999885559082,32158200 +2022-12-06,6.989999771118164,7.195000171661377,6.880000114440918,7.190000057220459,32868100 +2022-12-07,7.070000171661377,7.349999904632568,7.019999980926514,7.079999923706055,28351600 +2022-12-08,7.119999885559082,7.269999980926514,6.940000057220459,7.099999904632568,23107700 +2022-12-09,7.110000133514404,7.190000057220459,7.03000020980835,7.059999942779541,23367300 +2022-12-12,7.289999961853027,7.309999942779541,7.090000152587891,7.110000133514404,22672400 +2022-12-13,7.5,7.96999979019165,7.489999771118164,7.730000019073486,41033800 +2022-12-14,7.349999904632568,7.599999904632568,7.264999866485596,7.5,22653800 +2022-12-15,7.010000228881836,7.297999858856201,7.010000228881836,7.170000076293945,25417100 +2022-12-16,6.900000095367432,7.079999923706055,6.760000228881836,7.019999980926514,32655600 +2022-12-19,6.349999904632568,6.829999923706055,6.320000171661377,6.800000190734863,41511600 +2022-12-20,6.309999942779541,6.539999961853027,6.199999809265137,6.289999961853027,30215600 +2022-12-21,6.5,6.519999980926514,6.039999961853027,6.239999771118164,34408600 +2022-12-22,6.320000171661377,6.380000114440918,6.179999828338623,6.369999885559082,28066000 +2022-12-23,6.289999961853027,6.300000190734863,6.070000171661377,6.269999980926514,20419000 +2022-12-27,6.0,6.21999979019165,5.920000076293945,6.150000095367432,34573300 +2022-12-28,6.070000171661377,6.170000076293945,5.949999809265137,5.980000019073486,30096800 +2022-12-29,6.400000095367432,6.525000095367432,6.099999904632568,6.099999904632568,42694200 +2022-12-30,6.420000076293945,6.420000076293945,6.190000057220459,6.190000057220459,27830900 +2023-01-03,6.389999866485596,6.639999866485596,6.275000095367432,6.579999923706055,29969900 +2023-01-04,6.579999923706055,6.675000190734863,6.369999885559082,6.480000019073486,31660500 +2023-01-05,6.320000171661377,6.489999771118164,6.25,6.449999809265137,34186000 +2023-01-06,6.400000095367432,6.449999809265137,6.090000152587891,6.400000095367432,30596400 +2023-01-09,6.5,6.670000076293945,6.400000095367432,6.489999771118164,31028900 +2023-01-10,6.699999809265137,6.71999979019165,6.489999771118164,6.5,28236600 +2023-01-11,6.980000019073486,6.989999771118164,6.760000228881836,6.840000152587891,25936700 +2023-01-12,7.010000228881836,7.050000190734863,6.78000020980835,7.010000228881836,30152500 +2023-01-13,6.960000038146973,7.010000228881836,6.809999942779541,6.840000152587891,20981000 +2023-01-17,7.070000171661377,7.150000095367432,6.730000019073486,6.989999771118164,30910300 +2023-01-18,6.900000095367432,7.300000190734863,6.880000114440918,7.15500020980835,32743400 +2023-01-19,6.730000019073486,6.894999980926514,6.670000076293945,6.800000190734863,24841700 +2023-01-20,7.019999980926514,7.059999942779541,6.71999979019165,6.760000228881836,28751700 +2023-01-23,7.380000114440918,7.409999847412109,6.991000175476074,7.03000020980835,31633300 +2023-01-24,7.019999980926514,7.420000076293945,7.0,7.0,22649500 +2023-01-25,7.21999979019165,7.269999980926514,6.690000057220459,6.920000076293945,37147900 +2023-01-26,7.239999771118164,7.449999809265137,7.039999961853027,7.369999885559082,28005600 +2023-01-27,7.550000190734863,7.730000019073486,7.139999866485596,7.190000057220459,37555200 +2023-01-30,7.369999885559082,7.610000133514404,7.360000133514404,7.5,28567800 +2023-01-31,7.78000020980835,7.820000171661377,7.380000114440918,7.409999847412109,40984000 +2023-02-01,8.199999809265137,8.220000267028809,7.679999828338623,7.730000019073486,50123700 +2023-02-02,8.989999771118164,9.210000038146973,8.470000267028809,8.510000228881836,71889700 +2023-02-03,8.40999984741211,8.899999618530273,8.373000144958496,8.539999961853027,64785500 +2023-02-06,8.3100004196167,8.53499984741211,8.239999771118164,8.3100004196167,38845500 +2023-02-07,8.329999923706055,8.40999984741211,8.0600004196167,8.329999923706055,42201800 +2023-02-08,8.220000267028809,8.569999694824219,8.170000076293945,8.25,35105500 +2023-02-09,7.949999809265137,8.430000305175781,7.940000057220459,8.34000015258789,33366700 +2023-02-10,7.510000228881836,7.860000133514404,7.460000038146973,7.789999961853027,43042400 +2023-02-13,7.610000133514404,7.775000095367432,7.449999809265137,7.579999923706055,87397100 +2023-02-14,9.220000267028809,9.295000076293945,8.229999542236328,8.59000015258789,216055200 +2023-02-15,10.109999656677246,10.229999542236328,9.109999656677246,9.15999984741211,153210400 +2023-02-16,9.710000038146973,10.3100004196167,9.600000381469727,9.649999618530273,88638800 +2023-02-17,9.199999809265137,9.710000038146973,9.085000038146973,9.569999694824219,62137800 +2023-02-21,8.470000267028809,9.100000381469727,8.399999618530273,9.010000228881836,65226600 +2023-02-22,8.359999656677246,8.625,8.15999984741211,8.479999542236328,55346000 +2023-02-23,8.170000076293945,8.479999542236328,7.909999847412109,8.420000076293945,60015500 +2023-02-24,8.09000015258789,8.199999809265137,7.869999885559082,7.940000057220459,41518600 +2023-02-27,8.029999732971191,8.229999542236328,7.960000038146973,8.119999885559082,35270000 +2023-02-28,7.840000152587891,8.097000122070312,7.800000190734863,7.960000038146973,32937000 +2023-03-01,7.690000057220459,7.909999847412109,7.690000057220459,7.829999923706055,27939100 +2023-03-02,7.96999979019165,8.029999732971191,7.559999942779541,7.590000152587891,36538700 +2023-03-03,8.329999923706055,8.5,8.0,8.0,43229100 +2023-03-06,8.279999732971191,8.449999809265137,8.199999809265137,8.34000015258789,28316200 +2023-03-07,8.279999732971191,8.425000190734863,8.1899995803833,8.274999618530273,26819600 +2023-03-08,8.130000114440918,8.579999923706055,8.0600004196167,8.359999656677246,38723600 +2023-03-09,7.690000057220459,8.260000228881836,7.679999828338623,8.069999694824219,29005900 +2023-03-10,7.349999904632568,7.679999828338623,7.28000020980835,7.590000152587891,41953600 +2023-03-13,7.869999885559082,8.149999618530273,7.190000057220459,7.289999961853027,63183500 +2023-03-14,7.889999866485596,8.140000343322754,7.78000020980835,8.050000190734863,33460100 +2023-03-15,7.900000095367432,7.989999771118164,7.699999809265137,7.809999942779541,28217400 +2023-03-16,7.980000019073486,8.079999923706055,7.860000133514404,8.010000228881836,20255400 +2023-03-17,7.880000114440918,8.029999732971191,7.840000152587891,7.929999828338623,20920800 +2023-03-20,8.079999923706055,8.095000267028809,7.71999979019165,7.764999866485596,25497400 +2023-03-21,8.449999809265137,8.510000228881836,8.170000076293945,8.199999809265137,27104500 +2023-03-22,8.210000038146973,8.619999885559082,8.199999809265137,8.4399995803833,34151000 +2023-03-23,8.329999923706055,8.5600004196167,8.15999984741211,8.319999694824219,22662200 +2023-03-24,8.199999809265137,8.350000381469727,8.0600004196167,8.289999961853027,17901200 +2023-03-27,8.039999961853027,8.319999694824219,7.940000057220459,8.149999618530273,20666800 +2023-03-28,8.0,8.119999885559082,7.96999979019165,8.0600004196167,14860500 +2023-03-29,8.220000267028809,8.25,8.050999641418457,8.09000015258789,15339700 +2023-03-30,8.149999618530273,8.380000114440918,8.050000190734863,8.329999923706055,21001600 +2023-03-31,8.449999809265137,8.479999542236328,8.079999923706055,8.149999618530273,26174800 +2023-04-03,8.380000114440918,8.529999732971191,8.210000038146973,8.369999885559082,22512000 +2023-04-04,8.350000381469727,8.539999961853027,8.229999542236328,8.529999732971191,23961200 +2023-04-05,7.980000019073486,8.649999618530273,7.840000152587891,8.630000114440918,54946900 +2023-04-06,8.09000015258789,8.140000343322754,7.789999961853027,7.880000114440918,23488600 +2023-04-10,8.390000343322754,8.4399995803833,7.900000095367432,8.0,29184700 +2023-04-11,8.609999656677246,8.789999961853027,8.34000015258789,8.350000381469727,35617900 +2023-04-12,8.329999923706055,8.774999618530273,8.300000190734863,8.75,28771300 +2023-04-13,8.579999923706055,8.699999809265137,8.430000305175781,8.5,27983300 +2023-04-14,8.8100004196167,8.90999984741211,8.470000267028809,8.529999732971191,42364500 +2023-04-17,8.800000190734863,9.039999961853027,8.779999732971191,8.8100004196167,26047500 +2023-04-18,8.729999542236328,9.020000457763672,8.720000267028809,8.930000305175781,21185300 +2023-04-19,8.489999771118164,8.657999992370605,8.479999542236328,8.579999923706055,18193700 +2023-04-20,8.149999618530273,8.5,8.130000114440918,8.289999961853027,23573000 +2023-04-21,8.180000305175781,8.220000267028809,8.09000015258789,8.140000343322754,14896700 +2023-04-24,8.100000381469727,8.25,7.940000057220459,8.15999984741211,20439300 +2023-04-25,7.739999771118164,8.020000457763672,7.730000019073486,8.0,21849100 +2023-04-26,7.739999771118164,7.909999847412109,7.650000095367432,7.869999885559082,21396700 +2023-04-27,7.820000171661377,7.909999847412109,7.71999979019165,7.829999923706055,21385500 +2023-04-28,7.75,8.0,7.619999885559082,7.769999980926514,24924400 +2023-05-01,7.78000020980835,7.820000171661377,7.659999847412109,7.75,19134200 +2023-05-02,7.590000152587891,7.909999847412109,7.429999828338623,7.71999979019165,38008000 +2023-05-03,7.559999942779541,7.679999828338623,7.449999809265137,7.619999885559082,24322400 +2023-05-04,7.380000114440918,7.519999980926514,7.28000020980835,7.46999979019165,29989300 +2023-05-05,7.409999847412109,7.550000190734863,7.320000171661377,7.440000057220459,45601300 +2023-05-08,7.739999771118164,7.855000019073486,7.590000152587891,7.639999866485596,105304000 +2023-05-09,9.550000190734863,9.6899995803833,8.654999732971191,9.220000267028809,223573300 +2023-05-10,9.9399995803833,10.300000190734863,9.460000038146973,9.729999542236328,149375000 +2023-05-11,9.880000114440918,10.159000396728516,9.710000038146973,10.140000343322754,73754100 +2023-05-12,9.5,10.010000228881836,9.470000267028809,9.859999656677246,62031700 +2023-05-15,9.520000457763672,9.600000381469727,9.020000457763672,9.210000038146973,53555500 +2023-05-16,9.470000267028809,9.630000114440918,9.350000381469727,9.399999618530273,42311900 +2023-05-17,10.25,10.28499984741211,9.460000038146973,9.539999961853027,63834500 +2023-05-18,11.739999771118164,11.8100004196167,10.390000343322754,10.460000038146973,171402300 +2023-05-19,11.710000038146973,12.40999984741211,11.520000457763672,11.970000267028809,148321300 +2023-05-22,11.84000015258789,12.104999542236328,11.390000343322754,11.619999885559082,76377100 +2023-05-23,12.640000343322754,13.420000076293945,11.869999885559082,11.949999809265137,148701800 +2023-05-24,12.229999542236328,12.430000305175781,11.819999694824219,12.050000190734863,90496900 +2023-05-25,12.84000015258789,13.220000267028809,12.34000015258789,13.180000305175781,106557800 +2023-05-26,13.649999618530273,14.194999694824219,12.819999694824219,12.84000015258789,127311200 +2023-05-30,14.710000038146973,15.005000114440918,14.239999771118164,14.4399995803833,159089300 +2023-05-31,14.710000038146973,14.789999961853027,13.819999694824219,14.1899995803833,130392200 +2023-06-01,14.539999961853027,15.220000267028809,14.199999809265137,14.460000038146973,126015100 +2023-06-02,14.520000457763672,15.029999732971191,14.15999984741211,14.649999618530273,79328400 +2023-06-05,15.239999771118164,15.699999809265137,14.364999771118164,14.364999771118164,109017800 +2023-06-06,15.460000038146973,15.579999923706055,14.920000076293945,15.300000190734863,74284300 +2023-06-07,14.6899995803833,17.15999984741211,14.520000457763672,16.010000228881836,227244100 +2023-06-08,15.1899995803833,15.59000015258789,14.390000343322754,14.4399995803833,115591600 +2023-06-09,15.020000457763672,15.979999542236328,14.819999694824219,15.359999656677246,93983400 +2023-06-12,15.649999618530273,16.030000686645508,15.329999923706055,15.4399995803833,89900400 +2023-06-13,16.0,16.270000457763672,15.163000106811523,16.18000030517578,112765900 +2023-06-14,15.90999984741211,16.190000534057617,15.4399995803833,15.930000305175781,70871900 +2023-06-15,16.600000381469727,16.790000915527344,15.489999771118164,15.65999984741211,91200900 +2023-06-16,16.299999237060547,16.90999984741211,16.010000228881836,16.8700008392334,90473900 +2023-06-20,15.789999961853027,16.889999389648438,15.579999923706055,15.989999771118164,81335000 +2023-06-21,14.640000343322754,15.755000114440918,14.369999885559082,15.65999984741211,97885000 +2023-06-22,14.050000190734863,14.4399995803833,13.859999656677246,14.300000190734863,103461000 +2023-06-23,14.029999732971191,14.140000343322754,13.5600004196167,13.640000343322754,74640600 +2023-06-26,13.9399995803833,14.420000076293945,13.829999923706055,13.869999885559082,50679900 +2023-06-27,14.609999656677246,14.760000228881836,13.960000038146973,14.220000267028809,55410500 +2023-06-28,15.279999732971191,15.430000305175781,14.46500015258789,14.529999732971191,66001000 +2023-06-29,15.199999809265137,15.569999694824219,15.0600004196167,15.399999618530273,46300900 +2023-06-30,15.329999923706055,15.800000190734863,15.229999542236328,15.479999542236328,42081000 +2023-07-03,15.520000457763672,15.59000015258789,15.1899995803833,15.489999771118164,26037400 +2023-07-05,15.699999809265137,15.770000457763672,15.229999542236328,15.425000190734863,39179900 +2023-07-06,15.130000114440918,15.383000373840332,14.619999885559082,15.319999694824219,56534000 +2023-07-07,15.34000015258789,15.899999618530273,15.1899995803833,15.229999542236328,48109800 +2023-07-10,16.299999237060547,16.329999923706055,14.944999694824219,15.369999885559082,62823600 +2023-07-11,16.489999771118164,16.93000030517578,16.149999618530273,16.469999313354492,63236600 +2023-07-12,16.59000015258789,16.940000534057617,16.40999984741211,16.780000686645508,50079400 +2023-07-13,16.739999771118164,17.260000228881836,16.631000518798828,16.700000762939453,58397800 +2023-07-14,16.399999618530273,17.0,16.270000457763672,16.760000228881836,45018700 +2023-07-17,17.399999618530273,17.59000015258789,16.31999969482422,16.420000076293945,63505000 +2023-07-18,18.079999923706055,18.1299991607666,17.190000534057617,17.8799991607666,87365700 +2023-07-19,18.049999237060547,18.9950008392334,17.760000228881836,18.020000457763672,89044600 +2023-07-20,17.1299991607666,18.0,16.979999542236328,17.540000915527344,62711600 +2023-07-21,16.43000030517578,17.489999771118164,16.0,17.469999313354492,63260300 +2023-07-24,16.31999969482422,16.690000534057617,16.1200008392334,16.610000610351562,36133600 +2023-07-25,16.549999237060547,16.860000610351562,16.350000381469727,16.350000381469727,36612900 +2023-07-26,16.43000030517578,16.690000534057617,16.1299991607666,16.399999618530273,35804800 +2023-07-27,16.149999618530273,17.190000534057617,16.0,16.799999237060547,50685200 +2023-07-28,17.809999465942383,17.969999313354492,16.739999771118164,17.209999084472656,106125600 +2023-07-31,19.84000015258789,19.9950008392334,18.3799991607666,18.81999969482422,142173800 +2023-08-01,19.989999771118164,20.239999771118164,19.229999542236328,19.459999084472656,99336200 +2023-08-02,18.969999313354492,19.6200008392334,18.149999618530273,19.260000228881836,98215800 +2023-08-03,18.709999084472656,19.299999237060547,18.610000610351562,18.6299991607666,54345900 +2023-08-04,18.200000762939453,19.079999923706055,18.079999923706055,18.874000549316406,71979800 +2023-08-07,17.989999771118164,18.389999389648438,17.010000228881836,18.25,133808400 +2023-08-08,17.040000915527344,17.489999771118164,16.100000381469727,17.489999771118164,143014200 +2023-08-09,15.25,16.920000076293945,15.100000381469727,16.760000228881836,126230400 +2023-08-10,15.40999984741211,15.869999885559082,15.25,15.4399995803833,73129100 +2023-08-11,15.40999984741211,15.579999923706055,14.90999984741211,15.050000190734863,56489900 +2023-08-14,15.720000267028809,15.739999771118164,14.949999809265137,15.199999809265137,47511400 +2023-08-15,15.369999885559082,15.869999885559082,15.289999961853027,15.609999656677246,44000400 +2023-08-16,15.449999809265137,15.725000381469727,15.119999885559082,15.210000038146973,40394600 +2023-08-17,14.149999618530273,15.437000274658203,14.03499984741211,15.390000343322754,91086700 +2023-08-18,14.399999618530273,14.600000381469727,13.680000305175781,13.880000114440918,70047000 +2023-08-21,14.5,14.779999732971191,14.34000015258789,14.420000076293945,43206200 +2023-08-22,14.670000076293945,15.130000114440918,14.630000114440918,14.760000228881836,52106900 +2023-08-23,15.300000190734863,15.470000267028809,14.420000076293945,14.5,53523300 +2023-08-24,14.140000343322754,15.710000038146973,13.875,15.699999809265137,93586200 +2023-08-25,14.529999732971191,14.649999618530273,14.010000228881836,14.140000343322754,55668900 +2023-08-28,14.640000343322754,14.880000114440918,14.5,14.6899995803833,35964700 +2023-08-29,15.399999618530273,15.630000114440918,14.5,14.600000381469727,47213200 +2023-08-30,16.329999923706055,16.350000381469727,15.329999923706055,15.460000038146973,65674100 +2023-08-31,14.979999542236328,15.850000381469727,14.649999618530273,15.600000381469727,101517200 +2023-09-01,15.180000305175781,15.364999771118164,14.829999923706055,15.15999984741211,45107800 +2023-09-05,15.210000038146973,15.420000076293945,14.899999618530273,15.079999923706055,33818400 +2023-09-06,15.300000190734863,15.619999885559082,15.079999923706055,15.170000076293945,38738100 +2023-09-07,15.210000038146973,15.239999771118164,14.289999961853027,14.880000114440918,51798800 +2023-09-08,15.130000114440918,15.609999656677246,15.085000038146973,15.119999885559082,33862000 +2023-09-11,15.789999961853027,16.100000381469727,15.359999656677246,15.40999984741211,55294700 +2023-09-12,15.59000015258789,16.149999618530273,15.430000305175781,15.460000038146973,39497900 +2023-09-13,15.600000381469727,15.850000381469727,15.420000076293945,15.630000114440918,34354400 +2023-09-14,15.829999923706055,16.040000915527344,15.470000267028809,15.6899995803833,38572500 +2023-09-15,15.329999923706055,15.899999618530273,15.170000076293945,15.770000457763672,56161900 +2023-09-18,15.460000038146973,15.630000114440918,15.069999694824219,15.180000305175781,37404100 +2023-09-19,15.149999618530273,15.519000053405762,14.949999809265137,15.34000015258789,37804800 +2023-09-20,14.739999771118164,15.425000190734863,14.732999801635742,15.25,37640500 +2023-09-21,14.0,14.598999977111816,13.680000305175781,14.34000015258789,72831500 +2023-09-22,14.130000114440918,14.414999961853027,14.029999732971191,14.229999542236328,47714500 +2023-09-25,14.220000267028809,14.239999771118164,13.819999694824219,14.0,39693900 +2023-09-26,13.960000038146973,14.170000076293945,13.880000114440918,13.949999809265137,37276200 +2023-09-27,14.850000381469727,14.960000038146973,14.15999984741211,14.199999809265137,62780600 +2023-09-28,15.770000457763672,15.960000038146973,14.824999809265137,15.140000343322754,66590800 +2023-09-29,16.0,16.809999465942383,15.960000038146973,16.110000610351562,77919600 +2023-10-02,15.880000114440918,16.440000534057617,15.770000457763672,16.030000686645508,41043900 +2023-10-03,14.899999618530273,15.770000457763672,14.819999694824219,15.609999656677246,51578100 +2023-10-04,15.729999542236328,15.850000381469727,15.15999984741211,15.460000038146973,52786200 +2023-10-05,15.8100004196167,15.899999618530273,15.40999984741211,15.5600004196167,49648100 +2023-10-06,16.610000610351562,16.69499969482422,15.510000228881836,15.5600004196167,65511400 +2023-10-09,17.610000610351562,17.829999923706055,16.219999313354492,16.25,106161200 +2023-10-10,17.799999237060547,18.399999618530273,17.6200008392334,18.059999465942383,99971500 +2023-10-11,17.920000076293945,18.440000534057617,17.729999542236328,17.8700008392334,55745600 +2023-10-12,17.940000534057617,18.239999771118164,17.551000595092773,17.920000076293945,57940900 +2023-10-13,17.360000610351562,18.15999984741211,17.270000457763672,18.059999465942383,54541600 +2023-10-16,17.360000610351562,17.459999084472656,16.670000076293945,17.209999084472656,44987300 +2023-10-17,17.84000015258789,18.030000686645508,16.90999984741211,17.0,54401300 +2023-10-18,17.200000762939453,18.219999313354492,17.190000534057617,17.809999465942383,44208300 +2023-10-19,17.059999465942383,17.579999923706055,16.969999313354492,17.440000534057617,46303200 +2023-10-20,16.110000610351562,16.940000534057617,15.8100004196167,16.850000381469727,63738300 +2023-10-23,16.200000762939453,16.34000015258789,15.210000038146973,15.899999618530273,55967200 +2023-10-24,16.639999389648438,16.93000030517578,16.299999237060547,16.3799991607666,39833800 +2023-10-25,15.59000015258789,16.6299991607666,15.579999923706055,16.56999969482422,46706500 +2023-10-26,15.289999961853027,15.90999984741211,15.050000190734863,15.600000381469727,49351800 +2023-10-27,15.069999694824219,15.600000381469727,14.960000038146973,15.479999542236328,39913600 +2023-10-30,14.6899995803833,15.289999961853027,14.5600004196167,15.270000457763672,46886400 +2023-10-31,14.800000190734863,15.010000228881836,14.550000190734863,14.579999923706055,40195400 +2023-11-01,14.920000076293945,14.960000038146973,14.479999542236328,14.800000190734863,54419100 +2023-11-02,17.969999313354492,18.299999237060547,17.209999084472656,17.479999542236328,170406800 +2023-11-03,18.889999389648438,19.07900047302246,17.760000228881836,18.020000457763672,109039500 +2023-11-06,18.540000915527344,19.079999923706055,17.93000030517578,18.989999771118164,79952600 +2023-11-07,18.799999237060547,19.170000076293945,18.530000686645508,18.860000610351562,56289100 +2023-11-08,18.489999771118164,18.93000030517578,18.149999618530273,18.850000381469727,46063100 +2023-11-09,18.270000457763672,18.8700008392334,18.15999984741211,18.65999984741211,48454200 +2023-11-10,19.670000076293945,19.719999313354492,18.059999465942383,18.155000686645508,92748000 +2023-11-13,19.709999084472656,19.8799991607666,19.299999237060547,19.59000015258789,74877500 +2023-11-14,19.940000534057617,20.100000381469727,19.5,20.0,83230500 +2023-11-15,19.950000762939453,20.3700008392334,19.611000061035156,19.899999618530273,75533500 +2023-11-16,19.770000457763672,19.875,19.290000915527344,19.799999237060547,49942800 +2023-11-17,20.489999771118164,20.579999923706055,19.659000396728516,19.68000030517578,69497400 +2023-11-20,21.34000015258789,21.600000381469727,20.559999465942383,20.649999618530273,90270000 +2023-11-21,19.799999237060547,21.850000381469727,19.719999313354492,21.110000610351562,106643300 +2023-11-22,19.690000534057617,20.440000534057617,19.329999923706055,20.260000228881836,68326000 +2023-11-24,19.200000762939453,19.600000381469727,18.93000030517578,19.3799991607666,39800400 +2023-11-27,19.079999923706055,19.5,18.6200008392334,19.1299991607666,58808200 +2023-11-28,19.709999084472656,19.799999237060547,19.030000686645508,19.110000610351562,54170700 +2023-11-29,19.84000015258789,20.309999465942383,19.780000686645508,19.94499969482422,62782100 +2023-11-30,20.049999237060547,20.229999542236328,19.68000030517578,19.940000534057617,55501000 +2023-12-01,20.270000457763672,20.290000915527344,19.549999237060547,19.93000030517578,61336000 +2023-12-04,18.399999618530273,19.899999618530273,18.270000457763672,19.75,104948500 +2023-12-05,18.299999237060547,18.549999237060547,17.959999084472656,18.25,54460800 +2023-12-06,17.1299991607666,17.829999923706055,17.049999237060547,17.690000534057617,96111000 +2023-12-07,17.219999313354492,17.479999542236328,17.079999923706055,17.219999313354492,56455000 +2023-12-08,17.770000457763672,17.920000076293945,17.09000015258789,17.18000030517578,57404600 +2023-12-11,17.770000457763672,18.280000686645508,17.700000762939453,17.969999313354492,50929600 +2023-12-12,17.5,17.8799991607666,17.229999542236328,17.690000534057617,46231900 +2023-12-13,17.8700008392334,17.899999618530273,17.219999313354492,17.649999618530273,52682600 +2023-12-14,18.209999084472656,18.579999923706055,17.719999313354492,18.170000076293945,67462800 +2023-12-15,18.200000762939453,19.149999618530273,18.040000915527344,18.670000076293945,93004400 +2023-12-18,17.84000015258789,18.575000762939453,17.770000457763672,18.209999084472656,60188100 +2023-12-19,17.950000762939453,18.190000534057617,17.84000015258789,17.979999542236328,43530300 +2023-12-20,17.25,17.920000076293945,17.190000534057617,17.8700008392334,58666900 +2023-12-21,17.59000015258789,17.739999771118164,17.420000076293945,17.530000686645508,30493600 +2023-12-22,17.40999984741211,17.700000762939453,17.325000762939453,17.700000762939453,33615000 +2023-12-26,17.68000030517578,17.7450008392334,17.329999923706055,17.440000534057617,31750700 +2023-12-27,17.469999313354492,17.90999984741211,17.450000762939453,17.780000686645508,32918400 +2023-12-28,17.559999465942383,17.84000015258789,17.420000076293945,17.459999084472656,38990000 +2023-12-29,17.170000076293945,17.639999389648438,17.100000381469727,17.520000457763672,38805000 +2024-01-02,16.579999923706055,16.950000762939453,16.5,16.950000762939453,41626700 +2024-01-03,16.09000015258789,16.3799991607666,16.010000228881836,16.1200008392334,46865200 +2024-01-04,16.25,16.579999923706055,15.949999809265137,16.049999237060547,39937700 +2024-01-05,15.979999542236328,16.128000259399414,15.663999557495117,15.699999809265137,57628800 +2024-01-08,16.670000076293945,16.889999389648438,16.139999389648438,16.219999313354492,49090000 +2024-01-09,16.389999389648438,16.6299991607666,16.280000686645508,16.510000228881836,35794500 +2024-01-10,16.790000915527344,17.030000686645508,16.399999618530273,16.5,41254400 +2024-01-11,16.68000030517578,16.93000030517578,16.170000076293945,16.809999465942383,39552400 +2024-01-12,16.760000228881836,17.059999465942383,16.6200008392334,16.68000030517578,33861400 +2024-01-16,16.530000686645508,16.739999771118164,16.290000915527344,16.59000015258789,32659300 +2024-01-17,16.389999389648438,16.40999984741211,16.049999237060547,16.260000228881836,30832800 +2024-01-18,16.399999618530273,16.809999465942383,16.100000381469727,16.75,35239700 +2024-01-19,16.780000686645508,16.780000686645508,16.149999618530273,16.56999969482422,40538700 +2024-01-22,17.600000381469727,18.350000381469727,17.43000030517578,17.459999084472656,85573900 +2024-01-23,17.329999923706055,17.729999542236328,17.200000762939453,17.639999389648438,37794300 +2024-01-24,16.75,17.649999618530273,16.735000610351562,17.510000228881836,42710700 +2024-01-25,16.459999084472656,17.0,16.309999465942383,16.920000076293945,44589000 +2024-01-26,16.350000381469727,16.75,16.34000015258789,16.399999618530273,28612200 +2024-01-29,17.09000015258789,17.110000610351562,16.43000030517578,16.450000762939453,35987800 +2024-01-30,16.739999771118164,17.239999771118164,16.65999984741211,17.040000915527344,36388200 +2024-01-31,16.09000015258789,16.760000228881836,16.06999969482422,16.40999984741211,43582500 +2024-02-01,16.329999923706055,16.48699951171875,16.030000686645508,16.209999084472656,40454400 +2024-02-02,17.020000457763672,17.020000457763672,16.145000457763672,16.34000015258789,56983900 +2024-02-05,16.719999313354492,17.8700008392334,16.479999542236328,17.559999465942383,167698300 +2024-02-06,21.8700008392334,22.18000030517578,19.760000228881836,20.299999237060547,420501900 +2024-02-07,23.600000381469727,23.8700008392334,21.3799991607666,21.600000381469727,254911100 +2024-02-08,24.510000228881836,25.059999465942383,23.31999969482422,23.959999084472656,212671100 +2024-02-09,24.3799991607666,25.110000610351562,23.56999969482422,25.040000915527344,149062000 +2024-02-12,25.049999237060547,25.524999618530273,23.81999969482422,23.90999984741211,108173000 +2024-02-13,24.010000228881836,24.65999984741211,23.309999465942383,23.530000686645508,102293300 +2024-02-14,25.190000534057617,25.5,23.7549991607666,24.149999618530273,97227900 +2024-02-15,25.40999984741211,25.459999084472656,24.709999084472656,25.040000915527344,70544300 +2024-02-16,24.440000534057617,25.4950008392334,24.389999389648438,24.959999084472656,65212100 +2024-02-20,23.399999618530273,24.0,22.71500015258789,23.84000015258789,93374300 +2024-02-21,22.739999771118164,22.93000030517578,22.290000915527344,22.299999237060547,60411500 +2024-02-22,23.59000015258789,23.950000762939453,23.049999237060547,23.770000457763672,64458200 +2024-02-23,22.969999313354492,24.06999969482422,22.81999969482422,23.530000686645508,48840800 +2024-02-26,23.559999465942383,23.8799991607666,22.940000534057617,23.030000686645508,46499500 +2024-02-27,24.530000686645508,24.6200008392334,23.719999313354492,23.760000228881836,64967400 +2024-02-28,24.420000076293945,24.84000015258789,24.2450008392334,24.520000457763672,47314000 +2024-02-29,25.079999923706055,25.292999267578125,24.360000610351562,24.809999465942383,62753300 +2024-03-01,24.93000030517578,25.690000534057617,24.53499984741211,25.299999237060547,63090500 +2024-03-04,24.040000915527344,24.579999923706055,23.530000686645508,24.399999618530273,64320000 +2024-03-05,23.809999465942383,24.409000396728516,23.43000030517578,23.959999084472656,49542300 +2024-03-06,26.15999984741211,26.75,24.530000686645508,25.75,207386900 +2024-03-07,26.459999084472656,27.5,26.3799991607666,27.010000228881836,117519300 +2024-03-08,26.040000915527344,27.280000686645508,25.809999465942383,27.190000534057617,83969300 +2024-03-11,25.350000381469727,26.829999923706055,25.290000915527344,25.889999389648438,60829300 +2024-03-12,24.700000762939453,25.639999389648438,24.350000381469727,25.56999969482422,75202600 +2024-03-13,25.0,25.440000534057617,24.600000381469727,24.700000762939453,59713000 +2024-03-14,24.43000030517578,24.969999313354492,24.139999389648438,24.829999923706055,49214800 +2024-03-15,23.489999771118164,24.100000381469727,23.420000076293945,23.850000381469727,61270500 +2024-03-18,24.0,24.18000030517578,23.31999969482422,23.770000457763672,44083000 +2024-03-19,23.799999237060547,23.829999923706055,22.920000076293945,23.5,43247200 +2024-03-20,24.56999969482422,24.649999618530273,23.670000076293945,23.770000457763672,40273800 +2024-03-21,24.489999771118164,25.329999923706055,24.440000534057617,25.299999237060547,37099600 +2024-03-22,24.18000030517578,24.475000381469727,24.020000457763672,24.200000762939453,25354300 +2024-03-25,24.510000228881836,24.6200008392334,24.049999237060547,24.1200008392334,29255900 +2024-03-26,24.889999389648438,25.469999313354492,24.469999313354492,24.760000228881836,43610500 +2024-03-27,24.510000228881836,25.479999542236328,24.260000228881836,25.0,38600100 +2024-03-28,23.010000228881836,24.280000686645508,22.940000534057617,24.170000076293945,70008200 +2024-04-01,22.860000610351562,23.209999084472656,22.399999618530273,22.979999542236328,41000000 +2024-04-02,22.719999313354492,22.790000915527344,21.719999313354492,22.0,39770600 +2024-04-03,22.700000762939453,23.010000228881836,22.3799991607666,22.440000534057617,30357400 +2024-04-04,22.479999542236328,24.100000381469727,22.399999618530273,23.81999969482422,64995300 +2024-04-05,22.959999084472656,23.31999969482422,22.30699920654297,22.420000076293945,38565800 +2024-04-08,23.0,23.200000762939453,22.670000076293945,23.079999923706055,25022700 +2024-04-09,22.809999465942383,23.086999893188477,22.459999084472656,23.010000228881836,27724500 +2024-04-10,22.420000076293945,22.709999084472656,22.010000228881836,22.219999313354492,28642900 +2024-04-11,22.84000015258789,22.90999984741211,22.25,22.649999618530273,26399400 +2024-04-12,22.670000076293945,23.200000762939453,22.40999984741211,22.700000762939453,36348800 +2024-04-15,21.899999618530273,23.1299991607666,21.829999923706055,22.790000915527344,38182100 +2024-04-16,21.8799991607666,21.989999771118164,21.270000457763672,21.59000015258789,33869200 +2024-04-17,21.309999465942383,22.110000610351562,21.219999313354492,22.010000228881836,30139800 +2024-04-18,21.1299991607666,21.43000030517578,20.700000762939453,21.25,34550500 +2024-04-19,20.469999313354492,21.43000030517578,20.329999923706055,20.979999542236328,39290300 +2024-04-22,20.969999313354492,21.079999923706055,20.360000610351562,20.719999313354492,31894500 +2024-04-23,21.639999389648438,22.059999465942383,21.229999542236328,21.25,36304600 +2024-04-24,21.59000015258789,22.25,21.299999237060547,22.049999237060547,34426500 +2024-04-25,21.709999084472656,21.739999771118164,20.65999984741211,20.81999969482422,26226700 +2024-04-26,22.520000457763672,22.670000076293945,21.90999984741211,22.049999237060547,33119800 +2024-04-29,22.829999923706055,23.09000015258789,22.545000076293945,22.75,30104900 +2024-04-30,21.969999313354492,22.8700008392334,21.950000762939453,22.770000457763672,30511900 +2024-05-01,22.1200008392334,22.829999923706055,21.6299991607666,21.93000030517578,34665900 +2024-05-02,22.549999237060547,22.71500015258789,22.100000381469727,22.600000381469727,30396100 +2024-05-03,23.329999923706055,23.639999389648438,22.90999984741211,23.479999542236328,55976400 +2024-05-06,25.209999084472656,25.354999542236328,24.030000686645508,24.3700008392334,175936600 +2024-05-07,21.399999618530273,22.700000762939453,21.350000381469727,21.989999771118164,161061600 +2024-05-08,21.559999465942383,21.729999542236328,21.059999465942383,21.579999923706055,67582900 +2024-05-09,21.139999389648438,21.579999923706055,20.940000534057617,21.489999771118164,54101900 +2024-05-10,20.600000381469727,21.3700008392334,20.5,21.270000457763672,59845400 +2024-05-13,20.940000534057617,21.190000534057617,20.600000381469727,20.600000381469727,37524800 +2024-05-14,21.440000534057617,22.06999969482422,20.93000030517578,20.950000762939453,57894400 +2024-05-15,21.670000076293945,21.809999465942383,21.184999465942383,21.729999542236328,39424000 +2024-05-16,21.649999618530273,21.8700008392334,21.53499984741211,21.739999771118164,27416700 +2024-05-17,21.760000228881836,22.16900062561035,21.559999465942383,21.780000686645508,30032300 +2024-05-20,21.6200008392334,21.770000457763672,21.219999313354492,21.770000457763672,35255300 +2024-05-21,21.239999771118164,21.450000762939453,21.1200008392334,21.34000015258789,27954000 +2024-05-22,21.170000076293945,21.420000076293945,21.079999923706055,21.229999542236328,25212500 +2024-05-23,20.719999313354492,21.520000457763672,20.6299991607666,21.389999389648438,36887600 +2024-05-24,21.010000228881836,21.149999618530273,20.649999618530273,20.719999313354492,22073800 +2024-05-28,21.049999237060547,21.219999313354492,20.729999542236328,21.059999465942383,26274200 +2024-05-29,20.940000534057617,20.989999771118164,20.639999389648438,20.770000457763672,24834200 +2024-05-30,21.729999542236328,21.959999084472656,21.020000457763672,21.280000686645508,47583100 +2024-05-31,21.68000030517578,22.200000762939453,21.309999465942383,21.790000915527344,44416100 +2024-06-03,21.31999969482422,21.790000915527344,21.0049991607666,21.700000762939453,33876100 +2024-06-04,22.100000381469727,22.260000228881836,21.040000915527344,21.049999237060547,41974000 +2024-06-05,22.959999084472656,22.979999542236328,22.219999313354492,22.479999542236328,39825400 +2024-06-06,23.790000915527344,23.950000762939453,22.979999542236328,22.979999542236328,60400400 +2024-06-07,23.309999465942383,23.56999969482422,23.059999465942383,23.239999771118164,37149900 +2024-06-10,23.1299991607666,23.15999984741211,22.65999984741211,22.75,31509300 +2024-06-11,23.850000381469727,23.950000762939453,22.889999389648438,23.059999465942383,30601900 +2024-06-12,23.770000457763672,24.329999923706055,23.56999969482422,24.200000762939453,38542700 +2024-06-13,23.270000457763672,24.139999389648438,23.149999618530273,23.850000381469727,26035100 +2024-06-14,23.56999969482422,23.719999313354492,22.84000015258789,23.149999618530273,26618300 +2024-06-17,25.020000457763672,25.059999465942383,23.450000762939453,23.469999313354492,54101500 +2024-06-18,25.81999969482422,26.024999618530273,24.829999923706055,25.149999618530273,54458600 +2024-06-20,25.559999465942383,26.56999969482422,25.155000686645508,26.440000534057617,66735000 +2024-06-21,23.84000015258789,26.09000015258789,23.530000686645508,24.709999084472656,69981600 +2024-06-24,24.15999984741211,24.386999130249023,23.299999237060547,23.440000534057617,36477400 +2024-06-25,24.559999465942383,24.6299991607666,23.920000076293945,24.15999984741211,29657200 +2024-06-26,24.100000381469727,24.65999984741211,24.024999618530273,24.469999313354492,24331400 +2024-06-27,25.219999313354492,25.399999618530273,24.049999237060547,24.100000381469727,37882900 +2024-06-28,25.329999923706055,25.56999969482422,25.030000686645508,25.280000686645508,38886400 +2024-07-01,25.8799991607666,26.020000457763672,25.142000198364258,25.479999542236328,33167900 +2024-07-02,25.829999923706055,26.43000030517578,25.75,25.84000015258789,32148200 +2024-07-03,25.850000381469727,26.270000457763672,25.760000228881836,25.959999084472656,18433800 +2024-07-05,27.229999542236328,27.25,25.975000381469727,26.0,46703700 +2024-07-08,27.700000762939453,27.986000061035156,26.84000015258789,27.93000030517578,59611200 +2024-07-09,27.389999389648438,28.3799991607666,27.229999542236328,27.93000030517578,53067100 +2024-07-10,28.420000076293945,28.469999313354492,27.3700008392334,27.5,43231000 +2024-07-11,27.639999389648438,28.59000015258789,26.899999618530273,28.489999771118164,61546100 +2024-07-12,28.06999969482422,28.1299991607666,27.280000686645508,27.31999969482422,30760300 +2024-07-15,28.670000076293945,29.299999237060547,27.899999618530273,28.420000076293945,49186300 +2024-07-16,28.670000076293945,28.84000015258789,27.469999313354492,28.18000030517578,59330700 +2024-07-17,28.219999313354492,28.8700008392334,27.600000381469727,28.0,45203500 +2024-07-18,28.639999389648438,29.829999923706055,28.149999618530273,28.420000076293945,76485600 +2024-07-19,28.579999923706055,29.600000381469727,28.270000457763672,28.309999465942383,49581600 +2024-07-22,28.459999084472656,28.969999313354492,27.690000534057617,28.93000030517578,38037800 +2024-07-23,28.809999465942383,29.190000534057617,28.309999465942383,28.34000015258789,31134300 +2024-07-24,26.600000381469727,28.684999465942383,26.579999923706055,28.440000534057617,49004100 +2024-07-25,26.6299991607666,27.288000106811523,25.420000076293945,26.040000915527344,45474600 +2024-07-26,27.18000030517578,27.34000015258789,26.770000457763672,27.0,27432200 +2024-07-29,27.079999923706055,27.799999237060547,26.729999542236328,27.559999465942383,26038800 +2024-07-30,26.3700008392334,27.440000534057617,25.889999389648438,27.25,31819900 +2024-07-31,26.889999389648438,27.389999389648438,26.8799991607666,27.020000457763672,29111600 +2024-08-01,26.079999923706055,27.53499984741211,25.829999923706055,27.020000457763672,31189600 +2024-08-02,24.739999771118164,24.8700008392334,23.75,24.75,56092600 +2024-08-05,24.09000015258789,24.420000076293945,21.229999542236328,21.739999771118164,88023500 +2024-08-06,26.59000015258789,27.420000076293945,25.56999969482422,27.049999237060547,99622700 +2024-08-07,26.31999969482422,28.360000610351562,26.239999771118164,27.06999969482422,75975400 +2024-08-08,29.280000686645508,29.375,26.690000534057617,27.040000915527344,96892900 +2024-08-09,30.010000228881836,30.360000610351562,29.100000381469727,29.280000686645508,88131100 +2024-08-12,29.3799991607666,31.200000762939453,29.270000457763672,30.219999313354492,67890300 +2024-08-13,30.389999389648438,30.850000381469727,29.559999465942383,29.788999557495117,57294200 +2024-08-14,31.0,31.3700008392334,30.329999923706055,30.6200008392334,49885600 +2024-08-15,31.219999313354492,31.4950008392334,30.829999923706055,31.309999465942383,43407600 +2024-08-16,32.08000183105469,32.75,30.979999542236328,31.040000915527344,64870600 +2024-08-19,32.5,32.59000015258789,31.81399917602539,32.41999816894531,52353600 +2024-08-20,32.31999969482422,32.720001220703125,31.6299991607666,32.5,40783000 +2024-08-21,32.540000915527344,32.66999816894531,31.969999313354492,32.31999969482422,38147600 +2024-08-22,31.920000076293945,33.125,31.850000381469727,32.54999923706055,43522200 +2024-08-23,31.780000686645508,32.54999923706055,31.621999740600586,31.989999771118164,34121200 +2024-08-26,30.850000381469727,31.739999771118164,30.790000915527344,31.43000030517578,35283600 +2024-08-27,30.84000015258789,31.1200008392334,30.3799991607666,30.549999237060547,23541300 +2024-08-28,30.360000610351562,30.799999237060547,29.75,30.6200008392334,33961400 +2024-08-29,31.0,31.81999969482422,30.483999252319336,30.649999618530273,39733000 +2024-08-30,31.479999542236328,31.5,30.700000762939453,31.049999237060547,42388000 +2024-09-03,30.510000228881836,31.589000701904297,30.165000915527344,31.350000381469727,34531600 +2024-09-04,30.59000015258789,30.850000381469727,29.309999465942383,30.0,33419500 +2024-09-05,30.15999984741211,30.739999771118164,30.010000228881836,30.239999771118164,24012300 +2024-09-06,30.329999923706055,31.040000915527344,29.5,30.600000381469727,50946800 +2024-09-09,34.599998474121094,34.70000076293945,32.470001220703125,32.70000076293945,140582500 +2024-09-10,34.7599983215332,35.20000076293945,33.709999084472656,34.810001373291016,91721000 +2024-09-11,34.849998474121094,34.869998931884766,33.619998931884766,34.0099983215332,68302300 +2024-09-12,34.90999984741211,35.400001525878906,34.53099822998047,34.86000061035156,54391800 +2024-09-13,35.59000015258789,36.0099983215332,34.88999938964844,34.970001220703125,49727200 +2024-09-16,36.310001373291016,36.91999816894531,35.560001373291016,35.779998779296875,74767300 +2024-09-17,36.45000076293945,37.04999923706055,35.869998931884766,37.0,64461800 +2024-09-18,36.380001068115234,37.11000061035156,35.87099838256836,35.900001525878906,66279800 +2024-09-19,36.83000183105469,37.349998474121094,36.20000076293945,37.0,59882000 +2024-09-20,37.20000076293945,37.290000915527344,35.709999084472656,36.0099983215332,450290500 +2024-09-23,37.95000076293945,38.189998626708984,36.56999969482422,36.86000061035156,79460700 +2024-09-24,36.900001525878906,37.97999954223633,36.43000030517578,37.970001220703125,79519200 +2024-09-25,37.119998931884766,37.18000030517578,36.382999420166016,36.88999938964844,46511700 +2024-09-26,37.099998474121094,37.439998626708984,36.599998474121094,37.2599983215332,48602000 +2024-09-27,36.84000015258789,37.470001220703125,36.59000015258789,36.90999984741211,43219100 +2024-09-30,37.20000076293945,37.31999969482422,36.150001525878906,36.58000183105469,42110200 +2024-10-01,36.459999084472656,37.560001373291016,36.04999923706055,37.209999084472656,52858000 +2024-10-02,37.4900016784668,37.68000030517578,36.14500045776367,36.29999923706055,34988900 +2024-10-03,39.2400016784668,39.290000915527344,37.369998931884766,37.45000076293945,57196400 +2024-10-04,40.0099983215332,40.290000915527344,39.400001525878906,39.650001525878906,62532500 +2024-10-07,38.88999938964844,40.150001525878906,38.775001525878906,39.900001525878906,44124800 +2024-10-08,41.45000076293945,41.4900016784668,39.01499938964844,39.290000915527344,62542900 +2024-10-09,43.130001068115234,43.34000015258789,41.209999084472656,41.54999923706055,86404700 +2024-10-10,43.52000045776367,43.87799835205078,42.40999984741211,42.91999816894531,62516300 +2024-10-11,43.5099983215332,44.380001068115234,42.619998931884766,43.400001525878906,66206900 +2024-10-14,43.400001525878906,44.38999938964844,43.279998779296875,43.720001220703125,41010900 +2024-10-15,42.43000030517578,43.68000030517578,41.51499938964844,43.474998474121094,48297000 +2024-10-16,41.93000030517578,42.4900016784668,40.36000061035156,42.400001525878906,59157900 +2024-10-17,42.0,42.70000076293945,41.61000061035156,42.150001525878906,34028400 +2024-10-18,42.970001220703125,42.9900016784668,41.650001525878906,42.01499938964844,33969000 +2024-10-21,42.70000076293945,43.400001525878906,42.40999984741211,42.86000061035156,30719800 +2024-10-22,42.939998626708984,43.4900016784668,42.29999923706055,42.689998626708984,27830700 +2024-10-23,42.59000015258789,43.68000030517578,42.05500030517578,42.849998474121094,35647000 +2024-10-24,43.560001373291016,43.72999954223633,42.65999984741211,42.88999938964844,34079600 +2024-10-25,44.86000061035156,45.06999969482422,43.64500045776367,43.849998474121094,50416500 +2024-10-28,44.970001220703125,45.13999938964844,44.68000030517578,45.04999923706055,36729700 +2024-10-29,44.93000030517578,45.06999969482422,44.040000915527344,44.900001525878906,26154700 +2024-10-30,43.689998626708984,44.79999923706055,43.61000061035156,44.58000183105469,31309200 +2024-10-31,41.560001373291016,43.31999969482422,40.900001525878906,42.790000915527344,50973400 +2024-11-01,41.91999816894531,42.56999969482422,41.59000015258789,41.93000030517578,33722500 +2024-11-04,41.40999984741211,42.040000915527344,41.03200149536133,41.08000183105469,75413300 +2024-11-05,51.130001068115234,51.57500076293945,46.86000061035156,47.86000061035156,208868200 +2024-11-06,55.529998779296875,55.689998626708984,51.61000061035156,53.439998626708984,114255900 +2024-11-07,55.880001068115234,56.470001220703125,53.54999923706055,55.81999969482422,121591200 +2024-11-08,58.38999938964844,58.47999954223633,55.29999923706055,55.56999969482422,84124000 +2024-11-11,60.2400016784668,62.08000183105469,58.689998626708984,60.132999420166016,108357800 +2024-11-12,59.849998474121094,60.09000015258789,58.56999969482422,59.0099983215332,59061300 +2024-11-13,60.70000076293945,63.38999938964844,59.849998474121094,61.52000045776367,85937400 +2024-11-14,59.18000030517578,61.16999816894531,58.529998779296875,61.04999923706055,59968200 +2024-11-15,65.7699966430664,66.0,60.90999984741211,61.0099983215332,155280400 +2024-11-18,61.2599983215332,64.91999816894531,58.849998474121094,64.91999816894531,137877600 +2024-11-19,62.97999954223633,63.0099983215332,59.26499938964844,59.5099983215332,75557800 +2024-11-20,62.119998931884766,63.08000183105469,59.959999084472656,62.59000015258789,59182200 +2024-11-21,61.36000061035156,63.400001525878906,60.89500045776367,62.040000915527344,56336700 +2024-11-22,64.3499984741211,64.44000244140625,61.369998931884766,61.599998474121094,61381700 +2024-11-25,64.6500015258789,67.87999725341797,64.08000183105469,66.9000015258789,80640500 +2024-11-26,65.73999786376953,65.8499984741211,63.88999938964844,64.56999969482422,46923600 +2024-11-27,66.05000305175781,67.55999755859375,64.23999786376953,66.23999786376953,53839900 +2024-11-29,67.08000183105469,67.16000366210938,65.47000122070312,65.88999938964844,30104000 +2024-12-02,66.38999938964844,67.87999725341797,65.95999908447266,67.44000244140625,46405000 +2024-12-03,70.95999908447266,71.37000274658203,66.1500015258789,66.41000366210938,100751400 +2024-12-04,69.8499984741211,71.18000030517578,67.27999877929688,71.12999725341797,86284800 +2024-12-05,71.87000274658203,72.9800033569336,69.88999938964844,70.11000061035156,66585800 +2024-12-06,76.33999633789062,76.81999969482422,72.27999877929688,72.94999694824219,93640900 +2024-12-09,72.45999908447266,80.91000366210938,71.05000305175781,80.58000183105469,168134800 +2024-12-10,70.88999938964844,75.55999755859375,70.7300033569336,71.98999786376953,89672500 +2024-12-11,72.51000213623047,73.0,68.06999969482422,72.9800033569336,89477700 +2024-12-12,73.19999694824219,75.37999725341797,71.9000015258789,72.30000305175781,73859700 +2024-12-13,76.06999969482422,76.0999984741211,72.44999694824219,73.48999786376953,76172800 +2024-12-16,75.75,77.81999969482422,71.16000366210938,75.05999755859375,126099600 +2024-12-17,74.38999938964844,75.31999969482422,71.69999694824219,73.27999877929688,75469400 +2024-12-18,71.51000213623047,77.5999984741211,70.2699966430664,74.30000305175781,109643400 +2024-12-19,74.20999908447266,76.58999633789062,73.37000274658203,73.98999786376953,99524300 +2024-12-20,80.55000305175781,80.66000366210938,71.5,72.63999938964844,281230800 +2024-12-23,80.69000244140625,82.0199966430664,77.41000366210938,80.6500015258789,93819500 +2024-12-24,82.37999725341797,84.7969970703125,81.0,81.08999633789062,64983300 +2024-12-26,82.13999938964844,83.48999786376953,81.30000305175781,83.16000366210938,60377100 +2024-12-27,79.08000183105469,82.0,77.93000030517578,81.41999816894531,66975900 +2024-12-30,77.18000030517578,79.23999786376953,76.11000061035156,77.04000091552734,60850900 +2024-12-31,75.62999725341797,77.9800033569336,73.6500015258789,77.58000183105469,56267900 +2025-01-02,75.19000244140625,76.52999877929688,72.41999816894531,76.19999694824219,72217200 +2025-01-03,79.88999938964844,79.9800033569336,75.19000244140625,75.38999938964844,62415000 +2025-01-06,75.91999816894531,80.05999755859375,74.61000061035156,78.69000244140625,105619500 +2025-01-07,69.98999786376953,75.38999938964844,69.75,75.19999694824219,91727300 +2025-01-08,68.2300033569336,69.52999877929688,66.51000213623047,68.12000274658203,91349500 +2025-01-10,67.26000213623047,68.19999694824219,65.04000091552734,66.01000213623047,78148600 +2025-01-13,64.9800033569336,65.68000030517578,63.400001525878906,64.29000091552734,69046300 +2025-01-14,65.91000366210938,68.2300033569336,65.19000244140625,67.18000030517578,56814900 +2025-01-15,68.13999938964844,68.8499984741211,67.08000183105469,68.55000305175781,56025800 +2025-01-16,69.23999786376953,71.43000030517578,68.36000061035156,69.08000183105469,62908700 +2025-01-17,71.7699966430664,72.33999633789062,69.94999694824219,70.9000015258789,54754000 +2025-01-21,73.06999969482422,73.63600158691406,70.60099792480469,73.23999786376953,56229000 +2025-01-22,76.87000274658203,77.16000366210938,73.80000305175781,74.5,66876400 +2025-01-23,78.9800033569336,79.0,75.83999633789062,76.04000091552734,55937900 +2025-01-24,78.9800033569336,82.23999786376953,78.44000244140625,79.05000305175781,77931900 +2025-01-27,75.44000244140625,76.72000122070312,72.66999816894531,74.06999969482422,76093300 +2025-01-28,80.2300033569336,80.73999786376953,74.04000091552734,75.54000091552734,65916700 +2025-01-29,79.76000213623047,80.81999969482422,77.80999755859375,79.94999694824219,49262200 +2025-01-30,81.22000122070312,81.83000183105469,79.37999725341797,80.0199966430664,46067500 +2025-01-31,82.48999786376953,85.22000122070312,80.87000274658203,81.0,79000200 +2025-02-03,83.73999786376953,84.25,78.47000122070312,80.125,126592700 +2025-02-04,103.83000183105469,106.91000366210938,100.51000213623047,102.80000305175781,230806800 +2025-02-05,101.36000061035156,103.56999969482422,99.31999969482422,101.77999877929688,90628300 +2025-02-06,111.27999877929688,111.54499816894531,100.26000213623047,101.08999633789062,128217500 +2025-02-07,110.8499984741211,116.30000305175781,110.44999694824219,111.66000366210938,143795400 +2025-02-10,116.6500015258789,116.76000213623047,108.72000122070312,112.02999877929688,99938100 +2025-02-11,112.62000274658203,118.66000366210938,112.0999984741211,116.5,94311700 +2025-02-12,117.38999938964844,117.58999633789062,110.0,110.29000091552734,75316900 +2025-02-13,117.91000366210938,118.38999938964844,115.1500015258789,117.30999755859375,60027000 +2025-02-14,119.16000366210938,120.66999816894531,116.80000305175781,117.9000015258789,65528900 +2025-02-18,124.62000274658203,125.0,118.43000030517578,120.94000244140625,84227200 +2025-02-19,112.05999755859375,125.41000366210938,108.55999755859375,123.86000061035156,147487300 +2025-02-20,106.2699966430664,107.4000015258789,95.80000305175781,102.91000366210938,243093900 +2025-02-21,101.3499984741211,109.06999969482422,100.0,107.68000030517578,129063200 +2025-02-24,90.68000030517578,99.01000213623047,89.30000305175781,95.87999725341797,184485000 +2025-02-25,87.83999633789062,91.69999694824219,85.25,90.6500015258789,132626300 +2025-02-26,89.30999755859375,91.69000244140625,87.58999633789062,89.16000366210938,94428700 +2025-02-27,84.7699966430664,93.62000274658203,84.16999816894531,91.91000366210938,99680500 +2025-02-28,84.91999816894531,85.18000030517578,78.58000183105469,79.9800033569336,125977400 +2025-03-03,83.41999816894531,90.4800033569336,82.52999877929688,88.55000305175781,114573900 +2025-03-04,84.4000015258789,88.5,79.30000305175781,80.16000366210938,116800300 +2025-03-05,90.12999725341797,90.30000305175781,82.5,86.3499984741211,116053000 +2025-03-06,80.45999908447266,88.33999633789062,80.01000213623047,87.50499725341797,117340600 +2025-03-07,84.91000366210938,85.16000366210938,79.1500015258789,80.0250015258789,105377100 +2025-03-10,76.37999725341797,82.69000244140625,74.56999969482422,82.0,136843800 +2025-03-11,78.05000305175781,80.74500274658203,75.52999877929688,75.78500366210938,109351500 +2025-03-12,83.6500015258789,84.55000305175781,79.86000061035156,83.4800033569336,116525100 +2025-03-13,79.62000274658203,83.73999786376953,78.31999969482422,82.84500122070312,100927200 +2025-03-14,86.23999786376953,87.2699966430664,82.16000366210938,82.97000122070312,113985000 +2025-03-17,87.3499984741211,88.81999969482422,84.5,88.44000244140625,99348900 +2025-03-18,83.88999938964844,86.16999816894531,81.80000305175781,85.77999877929688,93236500 +2025-03-19,86.0999984741211,87.98999786376953,82.86000061035156,84.55000305175781,89797400 +2025-03-20,87.38999938964844,89.80000305175781,85.12000274658203,85.54000091552734,105547400 +2025-03-21,90.95999908447266,91.06999969482422,84.45999908447266,85.8499984741211,116748700 +2025-03-24,96.75,97.38999938964844,92.27999877929688,93.4000015258789,112164700 +2025-03-25,96.5,98.16999816894531,95.08000183105469,97.22000122070312,78015300 +2025-03-26,92.27999877929688,97.30000305175781,90.81999969482422,96.29000091552734,81428600 +2025-03-27,90.08999633789062,93.6500015258789,89.66999816894531,91.01499938964844,82823000 +2025-03-28,85.8499984741211,89.37999725341797,84.0999984741211,89.33999633789062,91091700 +2025-03-31,84.4000015258789,84.6500015258789,78.75,80.0,108092900 +2025-04-01,84.68000030517578,85.27999877929688,81.81999969482422,83.88999938964844,78980700 +2025-04-02,87.44999694824219,88.40499877929688,82.30000305175781,82.4000015258789,96563100 +2025-04-03,83.5999984741211,85.68000030517578,81.01000213623047,81.25,93878200 +2025-04-04,74.01000213623047,80.9800033569336,71.93000030517578,80.06999969482422,147323200 +2025-04-07,77.83999633789062,81.80000305175781,66.12000274658203,66.6500015258789,169083700 +2025-04-08,77.31999969482422,86.11399841308594,75.22000122070312,83.29000091552734,135345600 +2025-04-09,92.01000213623047,93.33000183105469,77.2699966430664,78.19000244140625,187244300 +2025-04-10,88.58999633789062,90.77999877929688,84.13999938964844,88.4000015258789,124448200 +2025-04-11,88.55000305175781,89.55000305175781,85.47000122070312,87.9800033569336,95130700 +2025-04-14,92.62000274658203,97.33000183105469,91.45999908447266,95.80000305175781,122836900 +2025-04-15,98.4000015258789,98.98999786376953,93.05000305175781,93.52999877929688,118457700 +2025-04-16,92.70999908447266,97.30000305175781,89.62000274658203,96.27999877929688,121997600 +2025-04-17,93.77999877929688,95.11000061035156,92.2699966430664,94.70999908447266,83991800 +2025-04-21,90.80000305175781,96.4749984741211,89.30999755859375,92.83999633789062,83831100 +2025-04-22,93.98999786376953,96.33999633789062,91.3499984741211,93.01499938964844,91185400 +2025-04-23,100.81999969482422,103.76000213623047,97.83000183105469,98.86000061035156,112909500 +2025-04-24,107.77999877929688,108.0,100.91000366210938,101.52999877929688,103190700 +2025-04-25,112.77999877929688,112.87999725341797,106.55000305175781,108.05000305175781,103933800 +2025-04-28,114.6500015258789,114.86000061035156,108.87000274658203,113.77999877929688,111082900 +2025-04-29,116.08000183105469,117.2300033569336,113.23999786376953,113.9800033569336,79709000 +2025-04-30,118.44000244140625,118.77999877929688,110.54000091552734,111.61000061035156,109461700 +2025-05-01,116.19999694824219,120.19000244140625,116.0,120.04000091552734,90677600 +2025-05-02,124.27999877929688,124.41999816894531,118.62999725341797,118.66000366210938,103094300 +2025-05-05,123.7699966430664,125.25499725341797,121.36000061035156,123.69999694824219,135961300 +2025-05-06,108.86000061035156,113.91000366210938,105.31999969482422,112.70999908447266,201193400 +2025-05-07,110.4800033569336,111.8499984741211,107.0,107.97000122070312,95428800 +2025-05-08,119.1500015258789,120.37999725341797,112.06999969482422,112.27999877929688,126966200 +2025-05-09,117.30000305175781,119.16000366210938,114.9000015258789,118.97000122070312,81005300 +2025-05-12,118.45999908447266,120.93499755859375,115.01000213623047,120.77999877929688,94257300 +2025-05-13,128.10000610351562,130.60000610351562,119.30999755859375,119.91999816894531,147155400 +2025-05-14,130.17999267578125,133.49000549316406,127.55899810791016,129.00999450683594,96611500 +2025-05-15,128.1199951171875,130.1999969482422,125.73999786376953,128.3699951171875,69503000 +2025-05-16,129.52000427246094,130.3300018310547,126.76000213623047,129.22999572753906,57003700 +2025-05-19,126.33000183105469,127.7699966430664,124.31999969482422,124.71499633789062,72503900 +2025-05-20,125.58999633789062,128.1999969482422,124.6500015258789,127.22000122070312,61265300 +2025-05-21,120.58000183105469,127.11000061035156,119.41000366210938,125.16000366210938,80657700 +2025-05-22,122.29000091552734,126.33000183105469,121.375,121.94999694824219,75498300 +2025-05-23,123.30999755859375,125.54000091552734,120.68000030517578,120.87999725341797,65905800 +2025-05-27,123.38999938964844,127.87999725341797,120.87999725341797,126.81999969482422,86455200 +2025-05-28,123.76000213623047,125.6500015258789,122.91000366210938,124.2300033569336,64866000 +2025-05-29,122.31999969482422,126.47000122070312,121.52999877929688,125.3499984741211,63137900 +2025-05-30,131.77999877929688,131.94000244140625,122.75,123.52999877929688,185897600 +2025-06-02,132.0399932861328,134.47999572753906,128.86000061035156,131.43499755859375,93218700 +2025-06-03,133.1699981689453,135.27999877929688,130.10000610351562,133.07000732421875,91297700 +2025-06-04,130.00999450683594,132.9499969482422,125.58000183105469,132.8000030517578,97306300 +2025-06-05,119.91000366210938,132.85000610351562,118.93000030517578,129.27000427246094,131055900 +2025-06-06,127.72000122070312,128.1300048828125,121.91999816894531,123.7300033569336,87175100 +2025-06-09,132.05999755859375,132.22999572753906,124.80000305175781,127.07499694824219,74785600 +2025-06-10,132.80999755859375,134.07000732421875,129.41000366210938,131.02000427246094,69308900 +2025-06-11,136.38999938964844,140.0,132.99000549316406,133.9199981689453,97069100 diff --git a/web/backend/apps/__init__.py b/web/backend/apps/__init__.py new file mode 100644 index 00000000..84304876 --- /dev/null +++ b/web/backend/apps/__init__.py @@ -0,0 +1 @@ +# Apps package \ No newline at end of file diff --git a/web/backend/apps/authentication/__init__.py b/web/backend/apps/authentication/__init__.py new file mode 100644 index 00000000..833cd910 --- /dev/null +++ b/web/backend/apps/authentication/__init__.py @@ -0,0 +1 @@ +# Authentication app \ No newline at end of file diff --git a/web/backend/apps/authentication/admin.py b/web/backend/apps/authentication/admin.py new file mode 100644 index 00000000..4cbd7856 --- /dev/null +++ b/web/backend/apps/authentication/admin.py @@ -0,0 +1,86 @@ +from django.contrib import admin +from django.contrib.auth.admin import UserAdmin as BaseUserAdmin +from .models import User, UserProfile, AnalysisSession + + +class UserProfileInline(admin.StackedInline): + """์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ์ธ๋ผ์ธ""" + model = UserProfile + can_delete = False + verbose_name_plural = 'ํ”„๋กœํ•„' + fields = ('default_ticker', 'preferred_research_depth', 'preferred_shallow_thinker', 'preferred_deep_thinker', 'has_openai_api_key') + readonly_fields = ('has_openai_api_key',) + + def has_openai_api_key(self, obj): + return obj.has_openai_api_key() + has_openai_api_key.boolean = True + has_openai_api_key.short_description = 'OpenAI API ํ‚ค ๋ณด์œ ' + + +@admin.register(User) +class UserAdmin(BaseUserAdmin): + """์‚ฌ์šฉ์ž ๊ด€๋ฆฌ์ž""" + inlines = (UserProfileInline,) + list_display = ('email', 'username', 'first_name', 'last_name', 'is_staff', 'date_joined') + list_filter = ('is_staff', 'is_superuser', 'is_active', 'date_joined') + search_fields = ('email', 'username', 'first_name', 'last_name') + ordering = ('email',) + + fieldsets = ( + (None, {'fields': ('email', 'password')}), + ('๊ฐœ์ธ์ •๋ณด', {'fields': ('first_name', 'last_name', 'username')}), + ('๊ถŒํ•œ', { + 'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions'), + }), + ('์ค‘์š”ํ•œ ๋‚ ์งœ', {'fields': ('last_login', 'date_joined')}), + ) + + add_fieldsets = ( + (None, { + 'classes': ('wide',), + 'fields': ('email', 'username', 'password1', 'password2'), + }), + ) + + +@admin.register(UserProfile) +class UserProfileAdmin(admin.ModelAdmin): + """์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ๊ด€๋ฆฌ์ž""" + list_display = ('user', 'default_ticker', 'preferred_research_depth', 'has_openai_api_key', 'created_at') + list_filter = ('preferred_research_depth', 'created_at') + search_fields = ('user__email', 'user__username', 'default_ticker') + readonly_fields = ('created_at', 'updated_at', 'has_openai_api_key') + + fields = ( + 'user', 'default_ticker', 'preferred_research_depth', + 'preferred_shallow_thinker', 'preferred_deep_thinker', + 'has_openai_api_key', 'created_at', 'updated_at' + ) + + def has_openai_api_key(self, obj): + return obj.has_openai_api_key() + has_openai_api_key.boolean = True + has_openai_api_key.short_description = 'OpenAI API ํ‚ค ๋ณด์œ ' + + +@admin.register(AnalysisSession) +class AnalysisSessionAdmin(admin.ModelAdmin): + """๋ถ„์„ ์„ธ์…˜ ๊ด€๋ฆฌ์ž""" + list_display = ('user', 'ticker', 'analysis_date', 'status', 'created_at', 'duration') + list_filter = ('status', 'analysis_date', 'created_at') + search_fields = ('user__email', 'user__username', 'ticker') + readonly_fields = ('created_at', 'duration') + + fields = ( + 'user', 'ticker', 'analysis_date', + 'analysts_selected', 'research_depth', 'shallow_thinker', 'deep_thinker', + 'status', 'final_report', 'error_message', + 'created_at', 'started_at', 'completed_at', 'duration' + ) + + def duration(self, obj): + if obj.started_at and obj.completed_at: + duration = obj.completed_at - obj.started_at + return f"{int(duration.total_seconds())}์ดˆ" + return "๋ฏธ์™„๋ฃŒ" + duration.short_description = '์†Œ์š”์‹œ๊ฐ„' \ No newline at end of file diff --git a/web/backend/apps/authentication/apps.py b/web/backend/apps/authentication/apps.py new file mode 100644 index 00000000..668098fc --- /dev/null +++ b/web/backend/apps/authentication/apps.py @@ -0,0 +1,10 @@ +from django.apps import AppConfig + + +class AuthenticationConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'apps.authentication' + verbose_name = '์‚ฌ์šฉ์ž ์ธ์ฆ' + + def ready(self): + import apps.authentication.signals \ No newline at end of file diff --git a/web/backend/apps/authentication/migrations/0001_initial.py b/web/backend/apps/authentication/migrations/0001_initial.py new file mode 100644 index 00000000..214552d7 --- /dev/null +++ b/web/backend/apps/authentication/migrations/0001_initial.py @@ -0,0 +1,88 @@ +# Generated by Django 4.2.7 on 2025-06-13 05:07 + +from django.conf import settings +import django.contrib.auth.models +import django.contrib.auth.validators +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), + ] + + operations = [ + migrations.CreateModel( + name='User', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('password', models.CharField(max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), + ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), + ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), + ('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')), + ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), + ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), + ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), + ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), + ('email', models.EmailField(max_length=254, unique=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')), + ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')), + ], + options={ + 'verbose_name': 'user', + 'verbose_name_plural': 'users', + 'abstract': False, + }, + managers=[ + ('objects', django.contrib.auth.models.UserManager()), + ], + ), + migrations.CreateModel( + name='UserProfile', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('encrypted_openai_api_key', models.TextField(blank=True, null=True)), + ('default_ticker', models.CharField(default='SPY', max_length=10)), + ('preferred_research_depth', models.IntegerField(choices=[(1, 'Shallow'), (3, 'Medium'), (5, 'Deep')], default=3)), + ('preferred_shallow_thinker', models.CharField(default='gpt-4o-mini', max_length=50)), + ('preferred_deep_thinker', models.CharField(default='gpt-4o', max_length=50)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='profile', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'db_table': 'user_profiles', + }, + ), + migrations.CreateModel( + name='AnalysisSession', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('ticker', models.CharField(max_length=10)), + ('analysis_date', models.DateField()), + ('analysts_selected', models.JSONField()), + ('research_depth', models.IntegerField()), + ('shallow_thinker', models.CharField(max_length=50)), + ('deep_thinker', models.CharField(max_length=50)), + ('status', models.CharField(choices=[('pending', 'Pending'), ('running', 'Running'), ('completed', 'Completed'), ('failed', 'Failed'), ('cancelled', 'Cancelled')], default='pending', max_length=20)), + ('final_report', models.TextField(blank=True, null=True)), + ('error_message', models.TextField(blank=True, null=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('started_at', models.DateTimeField(blank=True, null=True)), + ('completed_at', models.DateTimeField(blank=True, null=True)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='analysis_sessions', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'db_table': 'analysis_sessions', + 'ordering': ['-created_at'], + }, + ), + ] diff --git a/web/backend/apps/authentication/migrations/__init__.py b/web/backend/apps/authentication/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/web/backend/apps/authentication/models.py b/web/backend/apps/authentication/models.py new file mode 100644 index 00000000..263f27ca --- /dev/null +++ b/web/backend/apps/authentication/models.py @@ -0,0 +1,126 @@ +from django.contrib.auth.models import AbstractUser +from django.db import models +from django.core.exceptions import ValidationError +from cryptography.fernet import Fernet +from django.conf import settings +import base64 +import os + + +class User(AbstractUser): + """ํ™•์žฅ๋œ ์‚ฌ์šฉ์ž ๋ชจ๋ธ""" + email = models.EmailField(unique=True) + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) + + USERNAME_FIELD = 'email' + REQUIRED_FIELDS = ['username'] + + +class UserProfile(models.Model): + """์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ๋ฐ API ํ‚ค ๊ด€๋ฆฌ""" + user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile') + + # ์•”ํ˜ธํ™”๋œ OpenAI API ํ‚ค ์ €์žฅ + encrypted_openai_api_key = models.TextField(blank=True, null=True) + + # ๊ธฐ๋ณธ ์„ค์ • + default_ticker = models.CharField(max_length=10, default='SPY') + preferred_research_depth = models.IntegerField(default=3, choices=[ + (1, 'Shallow'), + (3, 'Medium'), + (5, 'Deep') + ]) + preferred_shallow_thinker = models.CharField(max_length=50, default='gpt-4o-mini') + preferred_deep_thinker = models.CharField(max_length=50, default='gpt-4o') + + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) + + class Meta: + db_table = 'user_profiles' + + def __str__(self): + return f"{self.user.username}'s Profile" + + @staticmethod + def _get_cipher_key(): + """์•”ํ˜ธํ™”/๋ณตํ˜ธํ™”์šฉ ํ‚ค ์ƒ์„ฑ""" + # Django SECRET_KEY๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์•”ํ˜ธํ™” ํ‚ค ์ƒ์„ฑ + key = base64.urlsafe_b64encode(settings.SECRET_KEY[:32].encode()) + return Fernet(key) + + def set_openai_api_key(self, api_key): + """OpenAI API ํ‚ค๋ฅผ ์•”ํ˜ธํ™”ํ•˜์—ฌ ์ €์žฅ""" + if api_key: + cipher = self._get_cipher_key() + encrypted_key = cipher.encrypt(api_key.encode()) + self.encrypted_openai_api_key = base64.urlsafe_b64encode(encrypted_key).decode() + else: + self.encrypted_openai_api_key = None + + def get_openai_api_key(self): + """์ €์žฅ๋œ OpenAI API ํ‚ค๋ฅผ ๋ณตํ˜ธํ™”ํ•˜์—ฌ ๋ฐ˜ํ™˜""" + if not self.encrypted_openai_api_key: + return None + + try: + cipher = self._get_cipher_key() + encrypted_key = base64.urlsafe_b64decode(self.encrypted_openai_api_key.encode()) + decrypted_key = cipher.decrypt(encrypted_key) + return decrypted_key.decode() + except Exception: + return None + + def has_openai_api_key(self): + """์‚ฌ์šฉ์ž๊ฐ€ OpenAI API ํ‚ค๋ฅผ ์„ค์ •ํ–ˆ๋Š”์ง€ ํ™•์ธ""" + return bool(self.encrypted_openai_api_key) + + def get_effective_openai_api_key(self): + """ + ์‚ฌ์šฉ์ž API ํ‚ค๊ฐ€ ์žˆ์œผ๋ฉด ์‚ฌ์šฉ์ž ํ‚ค๋ฅผ, ์—†์œผ๋ฉด ๊ฐœ๋ฐœ์ž ๊ธฐ๋ณธ ํ‚ค๋ฅผ ๋ฐ˜ํ™˜ + """ + user_key = self.get_openai_api_key() + if user_key: + return user_key + + # ๊ฐœ๋ฐœ์ž๊ฐ€ ๋“ฑ๋กํ•œ ๊ธฐ๋ณธ ํ‚ค ์‚ฌ์šฉ + return getattr(settings, 'OPENAI_API_KEY', '') + + +class AnalysisSession(models.Model): + """๋ถ„์„ ์„ธ์…˜ ๊ด€๋ฆฌ""" + user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='analysis_sessions') + + # ๋ถ„์„ ํŒŒ๋ผ๋ฏธํ„ฐ + ticker = models.CharField(max_length=10) + analysis_date = models.DateField() + analysts_selected = models.JSONField() # ์„ ํƒ๋œ ๋ถ„์„๊ฐ€๋“ค + research_depth = models.IntegerField() + shallow_thinker = models.CharField(max_length=50) + deep_thinker = models.CharField(max_length=50) + + # ์„ธ์…˜ ์ƒํƒœ + status = models.CharField(max_length=20, choices=[ + ('pending', 'Pending'), + ('running', 'Running'), + ('completed', 'Completed'), + ('failed', 'Failed'), + ('cancelled', 'Cancelled'), + ], default='pending') + + # ๊ฒฐ๊ณผ ์ €์žฅ + final_report = models.TextField(blank=True, null=True) + error_message = models.TextField(blank=True, null=True) + + # ์‹œ๊ฐ„ ์ถ”์  + created_at = models.DateTimeField(auto_now_add=True) + started_at = models.DateTimeField(blank=True, null=True) + completed_at = models.DateTimeField(blank=True, null=True) + + class Meta: + db_table = 'analysis_sessions' + ordering = ['-created_at'] + + def __str__(self): + return f"{self.user.username} - {self.ticker} ({self.status})" \ No newline at end of file diff --git a/web/backend/apps/authentication/serializers.py b/web/backend/apps/authentication/serializers.py new file mode 100644 index 00000000..f0cb1d9d --- /dev/null +++ b/web/backend/apps/authentication/serializers.py @@ -0,0 +1,148 @@ +from rest_framework import serializers +from django.contrib.auth import authenticate +from django.contrib.auth.password_validation import validate_password +from .models import User, UserProfile, AnalysisSession + + +class UserRegistrationSerializer(serializers.ModelSerializer): + """์‚ฌ์šฉ์ž ํšŒ์›๊ฐ€์ž… ์‹œ๋ฆฌ์–ผ๋ผ์ด์ €""" + password = serializers.CharField(write_only=True, validators=[validate_password]) + password_confirm = serializers.CharField(write_only=True) + + class Meta: + model = User + fields = ('email', 'username', 'password', 'password_confirm', 'first_name', 'last_name') + + def validate(self, attrs): + if attrs['password'] != attrs['password_confirm']: + raise serializers.ValidationError("๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.") + return attrs + + def create(self, validated_data): + validated_data.pop('password_confirm') + user = User.objects.create_user(**validated_data) + + # ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ์ž๋™ ์ƒ์„ฑ + UserProfile.objects.create(user=user) + + return user + + +class UserLoginSerializer(serializers.Serializer): + """์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ ์‹œ๋ฆฌ์–ผ๋ผ์ด์ €""" + email = serializers.EmailField() + password = serializers.CharField(write_only=True) + + def validate(self, attrs): + email = attrs.get('email') + password = attrs.get('password') + + if email and password: + user = authenticate(username=email, password=password) + if not user: + raise serializers.ValidationError('์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ์ด๋ฉ”์ผ ๋˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค.') + if not user.is_active: + raise serializers.ValidationError('๋น„ํ™œ์„ฑํ™”๋œ ๊ณ„์ •์ž…๋‹ˆ๋‹ค.') + attrs['user'] = user + else: + raise serializers.ValidationError('์ด๋ฉ”์ผ๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ชจ๋‘ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.') + + return attrs + + +class UserProfileSerializer(serializers.ModelSerializer): + """์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ์‹œ๋ฆฌ์–ผ๋ผ์ด์ €""" + has_openai_api_key = serializers.SerializerMethodField() + openai_api_key = serializers.CharField(write_only=True, required=False, allow_blank=True) + + class Meta: + model = UserProfile + fields = ( + 'default_ticker', + 'preferred_research_depth', + 'preferred_shallow_thinker', + 'preferred_deep_thinker', + 'has_openai_api_key', + 'openai_api_key', + 'created_at', + 'updated_at' + ) + read_only_fields = ('created_at', 'updated_at') + + def get_has_openai_api_key(self, obj): + return obj.has_openai_api_key() + + def update(self, instance, validated_data): + openai_api_key = validated_data.pop('openai_api_key', None) + + # OpenAI API ํ‚ค ์—…๋ฐ์ดํŠธ + if openai_api_key is not None: + instance.set_openai_api_key(openai_api_key) + + # ๋‹ค๋ฅธ ํ•„๋“œ ์—…๋ฐ์ดํŠธ + for attr, value in validated_data.items(): + setattr(instance, attr, value) + + instance.save() + return instance + + +class UserSerializer(serializers.ModelSerializer): + """์‚ฌ์šฉ์ž ์ •๋ณด ์‹œ๋ฆฌ์–ผ๋ผ์ด์ €""" + profile = UserProfileSerializer(read_only=True) + + class Meta: + model = User + fields = ('id', 'email', 'username', 'first_name', 'last_name', 'profile', 'date_joined') + read_only_fields = ('id', 'email', 'date_joined') + + +class AnalysisSessionSerializer(serializers.ModelSerializer): + """๋ถ„์„ ์„ธ์…˜ ์‹œ๋ฆฌ์–ผ๋ผ์ด์ €""" + user_email = serializers.CharField(source='user.email', read_only=True) + duration = serializers.SerializerMethodField() + + class Meta: + model = AnalysisSession + fields = ( + 'id', 'user_email', 'ticker', 'analysis_date', + 'analysts_selected', 'research_depth', 'shallow_thinker', 'deep_thinker', + 'status', 'final_report', 'error_message', + 'created_at', 'started_at', 'completed_at', 'duration' + ) + read_only_fields = ('id', 'user_email', 'created_at', 'duration') + + def get_duration(self, obj): + if obj.started_at and obj.completed_at: + duration = obj.completed_at - obj.started_at + return int(duration.total_seconds()) + return None + + +class CreateAnalysisSessionSerializer(serializers.ModelSerializer): + """๋ถ„์„ ์„ธ์…˜ ์ƒ์„ฑ ์‹œ๋ฆฌ์–ผ๋ผ์ด์ €""" + class Meta: + model = AnalysisSession + fields = ( + 'ticker', 'analysis_date', + 'analysts_selected', 'research_depth', + 'shallow_thinker', 'deep_thinker' + ) + + def validate_analysts_selected(self, value): + """์„ ํƒ๋œ ๋ถ„์„๊ฐ€๋“ค ๊ฒ€์ฆ""" + if not isinstance(value, list) or len(value) == 0: + raise serializers.ValidationError("์ตœ์†Œ ํ•˜๋‚˜์˜ ๋ถ„์„๊ฐ€๋ฅผ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.") + + valid_analysts = ['market', 'social', 'news', 'fundamentals'] + for analyst in value: + if analyst not in valid_analysts: + raise serializers.ValidationError(f"์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ๋ถ„์„๊ฐ€: {analyst}") + + return value + + def validate_research_depth(self, value): + """์—ฐ๊ตฌ ๊นŠ์ด ๊ฒ€์ฆ""" + if value not in [1, 3, 5]: + raise serializers.ValidationError("์—ฐ๊ตฌ ๊นŠ์ด๋Š” 1, 3, 5 ์ค‘ ํ•˜๋‚˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.") + return value \ No newline at end of file diff --git a/web/backend/apps/authentication/signals.py b/web/backend/apps/authentication/signals.py new file mode 100644 index 00000000..0e3918d2 --- /dev/null +++ b/web/backend/apps/authentication/signals.py @@ -0,0 +1,17 @@ +from django.db.models.signals import post_save +from django.dispatch import receiver +from .models import User, UserProfile + + +@receiver(post_save, sender=User) +def create_user_profile(sender, instance, created, **kwargs): + """์‚ฌ์šฉ์ž ์ƒ์„ฑ ์‹œ ์ž๋™์œผ๋กœ ํ”„๋กœํ•„ ์ƒ์„ฑ""" + if created: + UserProfile.objects.create(user=instance) + + +@receiver(post_save, sender=User) +def save_user_profile(sender, instance, **kwargs): + """์‚ฌ์šฉ์ž ์ €์žฅ ์‹œ ํ”„๋กœํ•„๋„ ํ•จ๊ป˜ ์ €์žฅ""" + if hasattr(instance, 'profile'): + instance.profile.save() \ No newline at end of file diff --git a/web/backend/apps/authentication/urls.py b/web/backend/apps/authentication/urls.py new file mode 100644 index 00000000..93e5d4fb --- /dev/null +++ b/web/backend/apps/authentication/urls.py @@ -0,0 +1,24 @@ +from django.urls import path +from rest_framework_simplejwt.views import TokenRefreshView +from . import views + +app_name = 'authentication' + +urlpatterns = [ + # ์ธ์ฆ ๊ด€๋ จ + path('register/', views.UserRegistrationView.as_view(), name='register'), + path('login/', views.UserLoginView.as_view(), name='login'), + path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'), + + # ์‚ฌ์šฉ์ž ์ •๋ณด + path('user/', views.UserInfoView.as_view(), name='user_info'), + path('profile/', views.UserProfileView.as_view(), name='user_profile'), + + # OpenAI API ํ‚ค ๊ด€๋ฆฌ + path('check-api-key/', views.check_openai_api_key, name='check_api_key'), + path('remove-api-key/', views.remove_openai_api_key, name='remove_api_key'), + + # ๋ถ„์„ ์„ธ์…˜ ๊ด€๋ฆฌ + path('sessions/', views.AnalysisSessionListView.as_view(), name='analysis_sessions'), + path('sessions//', views.AnalysisSessionDetailView.as_view(), name='analysis_session_detail'), +] \ No newline at end of file diff --git a/web/backend/apps/authentication/views.py b/web/backend/apps/authentication/views.py new file mode 100644 index 00000000..49c73b34 --- /dev/null +++ b/web/backend/apps/authentication/views.py @@ -0,0 +1,180 @@ +from rest_framework import status, generics, permissions +from rest_framework.decorators import api_view, permission_classes +from rest_framework.response import Response +from rest_framework.views import APIView +from rest_framework_simplejwt.tokens import RefreshToken +from django.contrib.auth import authenticate +from django.shortcuts import get_object_or_404 + +from .models import User, UserProfile, AnalysisSession +from .serializers import ( + UserRegistrationSerializer, + UserLoginSerializer, + UserSerializer, + UserProfileSerializer, + AnalysisSessionSerializer, + CreateAnalysisSessionSerializer +) + + +class UserRegistrationView(APIView): + """์‚ฌ์šฉ์ž ํšŒ์›๊ฐ€์ž…""" + permission_classes = [permissions.AllowAny] + + def post(self, request): + serializer = UserRegistrationSerializer(data=request.data) + if serializer.is_valid(): + user = serializer.save() + + # JWT ํ† ํฐ ์ƒ์„ฑ + refresh = RefreshToken.for_user(user) + + return Response({ + 'message': 'ํšŒ์›๊ฐ€์ž…์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.', + 'user': UserSerializer(user).data, + 'tokens': { + 'refresh': str(refresh), + 'access': str(refresh.access_token), + } + }, status=status.HTTP_201_CREATED) + + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + +class UserLoginView(APIView): + """์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ""" + permission_classes = [permissions.AllowAny] + + def post(self, request): + serializer = UserLoginSerializer(data=request.data) + if serializer.is_valid(): + user = serializer.validated_data['user'] + + # JWT ํ† ํฐ ์ƒ์„ฑ + refresh = RefreshToken.for_user(user) + + return Response({ + 'message': '๋กœ๊ทธ์ธ์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.', + 'user': UserSerializer(user).data, + 'tokens': { + 'refresh': str(refresh), + 'access': str(refresh.access_token), + } + }, status=status.HTTP_200_OK) + + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + +class UserProfileView(APIView): + """์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ์กฐํšŒ ๋ฐ ์ˆ˜์ •""" + permission_classes = [permissions.IsAuthenticated] + + def get(self, request): + """ํ”„๋กœํ•„ ์กฐํšŒ""" + profile, created = UserProfile.objects.get_or_create(user=request.user) + serializer = UserProfileSerializer(profile) + return Response(serializer.data) + + def put(self, request): + """ํ”„๋กœํ•„ ์ˆ˜์ •""" + profile, created = UserProfile.objects.get_or_create(user=request.user) + serializer = UserProfileSerializer(profile, data=request.data, partial=True) + + if serializer.is_valid(): + serializer.save() + return Response({ + 'message': 'ํ”„๋กœํ•„์ด ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.', + 'profile': serializer.data + }) + + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + +class UserInfoView(APIView): + """์‚ฌ์šฉ์ž ์ •๋ณด ์กฐํšŒ""" + permission_classes = [permissions.IsAuthenticated] + + def get(self, request): + serializer = UserSerializer(request.user) + return Response(serializer.data) + + +class AnalysisSessionListView(generics.ListCreateAPIView): + """๋ถ„์„ ์„ธ์…˜ ๋ชฉ๋ก ์กฐํšŒ ๋ฐ ์ƒ์„ฑ""" + permission_classes = [permissions.IsAuthenticated] + + def get_queryset(self): + return AnalysisSession.objects.filter(user=self.request.user) + + def get_serializer_class(self): + if self.request.method == 'POST': + return CreateAnalysisSessionSerializer + return AnalysisSessionSerializer + + def perform_create(self, serializer): + serializer.save(user=self.request.user) + + +class AnalysisSessionDetailView(generics.RetrieveUpdateDestroyAPIView): + """๋ถ„์„ ์„ธ์…˜ ์ƒ์„ธ ์กฐํšŒ, ์ˆ˜์ •, ์‚ญ์ œ""" + permission_classes = [permissions.IsAuthenticated] + serializer_class = AnalysisSessionSerializer + + def get_queryset(self): + return AnalysisSession.objects.filter(user=self.request.user) + + +@api_view(['POST']) +@permission_classes([permissions.IsAuthenticated]) +def check_openai_api_key(request): + """OpenAI API ํ‚ค ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ""" + try: + profile = request.user.profile + api_key = profile.get_effective_openai_api_key() + + if not api_key: + return Response({ + 'valid': False, + 'message': 'OpenAI API ํ‚ค๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.' + }, status=status.HTTP_400_BAD_REQUEST) + + # ์‹ค์ œ OpenAI API ํ˜ธ์ถœ๋กœ ํ‚ค ๊ฒ€์ฆ (๊ฐ„๋‹จํ•œ ๋ชจ๋ธ ๋ชฉ๋ก ์š”์ฒญ) + import openai + openai.api_key = api_key + + try: + # ๊ฐ„๋‹จํ•œ API ํ˜ธ์ถœ๋กœ ํ‚ค ์œ ํšจ์„ฑ ํ™•์ธ + response = openai.models.list() + return Response({ + 'valid': True, + 'message': 'OpenAI API ํ‚ค๊ฐ€ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.', + 'using_user_key': profile.has_openai_api_key() + }) + except Exception as e: + return Response({ + 'valid': False, + 'message': f'OpenAI API ํ‚ค๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค: {str(e)}' + }, status=status.HTTP_400_BAD_REQUEST) + + except Exception as e: + return Response({ + 'error': str(e) + }, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + + +@api_view(['DELETE']) +@permission_classes([permissions.IsAuthenticated]) +def remove_openai_api_key(request): + """์‚ฌ์šฉ์ž์˜ OpenAI API ํ‚ค ์ œ๊ฑฐ""" + try: + profile = request.user.profile + profile.set_openai_api_key(None) + profile.save() + + return Response({ + 'message': 'OpenAI API ํ‚ค๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๊ธฐ๋ณธ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.' + }) + except Exception as e: + return Response({ + 'error': str(e) + }, status=status.HTTP_500_INTERNAL_SERVER_ERROR) \ No newline at end of file diff --git a/web/backend/apps/trading_api/__init__.py b/web/backend/apps/trading_api/__init__.py new file mode 100644 index 00000000..0519ecba --- /dev/null +++ b/web/backend/apps/trading_api/__init__.py @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/backend/apps/trading_api/apps.py b/web/backend/apps/trading_api/apps.py new file mode 100644 index 00000000..852f6581 --- /dev/null +++ b/web/backend/apps/trading_api/apps.py @@ -0,0 +1,7 @@ +from django.apps import AppConfig + + +class TradingApiConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'apps.trading_api' + verbose_name = '๊ฑฐ๋ž˜ ๋ถ„์„ API' \ No newline at end of file diff --git a/web/backend/apps/trading_api/services.py b/web/backend/apps/trading_api/services.py new file mode 100644 index 00000000..6ad9bb18 --- /dev/null +++ b/web/backend/apps/trading_api/services.py @@ -0,0 +1,233 @@ +import asyncio +import datetime +from typing import Dict, List, Optional +from django.conf import settings +from channels.layers import get_channel_layer +from asgiref.sync import async_to_sync + +# CLI ๋ชจ๋“ˆ import (๊ฒฝ๋กœ ์กฐ์ • ํ•„์š”) +import sys +import os +sys.path.append(os.path.join(settings.BASE_DIR.parent.parent)) + +from cli.models import AnalystType +from tradingagents.graph.trading_graph import TradingAgentsGraph +from tradingagents.default_config import DEFAULT_CONFIG +from apps.authentication.models import AnalysisSession, UserProfile + + +class TradingAnalysisService: + """๊ฑฐ๋ž˜ ๋ถ„์„ ์„œ๋น„์Šค""" + + def __init__(self, user, analysis_session: AnalysisSession): + self.user = user + self.session = analysis_session + self.channel_layer = get_channel_layer() + self.user_channel_group = f"user_{user.id}" + + async def run_analysis(self): + """๋ถ„์„ ์‹คํ–‰""" + try: + # ์„ธ์…˜ ์ƒํƒœ ์—…๋ฐ์ดํŠธ + self.session.status = 'running' + self.session.started_at = datetime.datetime.now() + self.session.save() + + # WebSocket์œผ๋กœ ์‹œ์ž‘ ์•Œ๋ฆผ + await self._send_websocket_message({ + 'type': 'analysis_started', + 'session_id': self.session.id, + 'message': '๋ถ„์„์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค...' + }) + + # ์‚ฌ์šฉ์ž ํ”„๋กœํ•„์—์„œ OpenAI API ํ‚ค ๊ฐ€์ ธ์˜ค๊ธฐ + profile = self.user.profile + api_key = profile.get_effective_openai_api_key() + + if not api_key: + raise Exception("OpenAI API ํ‚ค๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.") + + # CLI ์„ค์ • ์ค€๋น„ + config = self._prepare_analysis_config(api_key) + + # ๋ถ„์„ ์‹คํ–‰ + result = await self._execute_trading_analysis(config) + + # ๊ฒฐ๊ณผ ์ €์žฅ + self.session.final_report = result + self.session.status = 'completed' + self.session.completed_at = datetime.datetime.now() + self.session.save() + + # WebSocket์œผ๋กœ ์™„๋ฃŒ ์•Œ๋ฆผ + await self._send_websocket_message({ + 'type': 'analysis_completed', + 'session_id': self.session.id, + 'message': '๋ถ„์„์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.', + 'result': result + }) + + return result + + except Exception as e: + # ์—๋Ÿฌ ์ฒ˜๋ฆฌ + self.session.status = 'failed' + self.session.error_message = str(e) + self.session.completed_at = datetime.datetime.now() + self.session.save() + + # WebSocket์œผ๋กœ ์—๋Ÿฌ ์•Œ๋ฆผ + await self._send_websocket_message({ + 'type': 'analysis_failed', + 'session_id': self.session.id, + 'message': f'๋ถ„์„ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค: {str(e)}' + }) + + raise e + + def _prepare_analysis_config(self, api_key: str) -> Dict: + """๋ถ„์„ ์„ค์ • ์ค€๋น„""" + # AnalysisSession์˜ ์„ค์ •์„ CLI ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ + analysts = [] + for analyst_str in self.session.analysts_selected: + analysts.append(AnalystType(analyst_str)) + + config = { + 'ticker': self.session.ticker, + 'analysis_date': self.session.analysis_date.strftime('%Y-%m-%d'), + 'analysts': analysts, + 'research_depth': self.session.research_depth, + 'shallow_thinker': self.session.shallow_thinker, + 'deep_thinker': self.session.deep_thinker, + 'openai_api_key': api_key + } + + return config + + async def _execute_trading_analysis(self, config: Dict) -> str: + """์‹ค์ œ ๊ฑฐ๋ž˜ ๋ถ„์„ ์‹คํ–‰""" + try: + # ๊ธฐ๋ณธ ์„ค์ • ์—…๋ฐ์ดํŠธ + analysis_config = DEFAULT_CONFIG.copy() + analysis_config.update({ + 'openai_api_key': config['openai_api_key'], + 'shallow_thinking_model': config['shallow_thinker'], + 'deep_thinking_model': config['deep_thinker'], + }) + + # TradingAgentsGraph ์ดˆ๊ธฐํ™” + trading_graph = TradingAgentsGraph(analysis_config) + + # ๋ถ„์„ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ ์ค€๋น„ + input_data = { + 'ticker': config['ticker'], + 'date': config['analysis_date'], + 'selected_analysts': [analyst.value for analyst in config['analysts']], + 'research_depth': config['research_depth'], + } + + # ์ง„ํ–‰ ์ƒํ™ฉ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ + async def progress_callback(message_type: str, content: str, agent: str = None): + await self._send_websocket_message({ + 'type': 'analysis_progress', + 'session_id': self.session.id, + 'message_type': message_type, + 'content': content, + 'agent': agent + }) + + # ๋ถ„์„ ์‹คํ–‰ (์‹ค์ œ CLI ๋กœ์ง ํ˜ธ์ถœ) + # ์—ฌ๊ธฐ์„œ๋Š” ๊ฐ„๋‹จํ™”๋œ ๋ฒ„์ „์œผ๋กœ ๊ตฌํ˜„ + # ์‹ค์ œ๋กœ๋Š” trading_graph.invoke(input_data) ํ˜•ํƒœ๋กœ ํ˜ธ์ถœ + + # ๋ถ„์„ ์ง„ํ–‰ ์ƒํ™ฉ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ + analysis_steps = [ + ("Market Analyst", "์‹œ์žฅ ๋ฐ์ดํ„ฐ ๋ถ„์„ ์ค‘..."), + ("Social Analyst", "์†Œ์…œ ์„ผํ‹ฐ๋ฉ˜ํŠธ ๋ถ„์„ ์ค‘..."), + ("News Analyst", "๋‰ด์Šค ๋ถ„์„ ์ค‘..."), + ("Fundamentals Analyst", "๊ธฐ๋ณธ ๋ถ„์„ ์ค‘..."), + ("Research Manager", "์—ฐ๊ตฌ ๊ฒฐ๊ณผ ์ข…ํ•ฉ ์ค‘..."), + ("Trader", "๊ฑฐ๋ž˜ ์ „๋žต ์ˆ˜๋ฆฝ ์ค‘..."), + ("Portfolio Manager", "ํฌํŠธํด๋ฆฌ์˜ค ์ตœ์ ํ™” ์ค‘...") + ] + + final_report_parts = [] + + for agent, message in analysis_steps: + await progress_callback("agent_update", message, agent) + + # ์‹ค์ œ ๋ถ„์„ ๋กœ์ง ํ˜ธ์ถœ (์—ฌ๊ธฐ์„œ๋Š” ์‹œ๋ฎฌ๋ ˆ์ด์…˜) + await asyncio.sleep(2) # ์‹ค์ œ ๋ถ„์„ ์‹œ๊ฐ„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ + + # ๊ฐ ๋‹จ๊ณ„๋ณ„ ๊ฒฐ๊ณผ ์ƒ์„ฑ (์‹ค์ œ๋กœ๋Š” trading_graph์˜ ๊ฒฐ๊ณผ) + step_result = f"## {agent} ๋ถ„์„ ๊ฒฐ๊ณผ\n\n{config['ticker']} ์ข…๋ชฉ์— ๋Œ€ํ•œ {agent.lower()} ๋ถ„์„์„ ์™„๋ฃŒํ–ˆ์Šต๋‹ˆ๋‹ค.\n" + final_report_parts.append(step_result) + + # ์ตœ์ข… ๋ณด๊ณ ์„œ ์ƒ์„ฑ + final_report = "\n\n".join(final_report_parts) + + return final_report + + except Exception as e: + raise Exception(f"๋ถ„์„ ์‹คํ–‰ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}") + + async def _send_websocket_message(self, message: Dict): + """WebSocket์œผ๋กœ ๋ฉ”์‹œ์ง€ ์ „์†ก""" + try: + await self.channel_layer.group_send( + self.user_channel_group, + { + 'type': 'trading_analysis_message', + 'message': message + } + ) + except Exception as e: + print(f"WebSocket ๋ฉ”์‹œ์ง€ ์ „์†ก ์‹คํŒจ: {e}") + + +class TradingAnalysisManager: + """๊ฑฐ๋ž˜ ๋ถ„์„ ๊ด€๋ฆฌ์ž""" + + @staticmethod + def create_analysis_session(user, analysis_data: Dict) -> AnalysisSession: + """๋ถ„์„ ์„ธ์…˜ ์ƒ์„ฑ""" + session = AnalysisSession.objects.create( + user=user, + ticker=analysis_data['ticker'], + analysis_date=analysis_data['analysis_date'], + analysts_selected=analysis_data['analysts_selected'], + research_depth=analysis_data['research_depth'], + shallow_thinker=analysis_data['shallow_thinker'], + deep_thinker=analysis_data['deep_thinker'], + ) + return session + + @staticmethod + async def start_analysis(user, session_id: int): + """๋ถ„์„ ์‹œ์ž‘""" + try: + session = AnalysisSession.objects.get(id=session_id, user=user) + service = TradingAnalysisService(user, session) + result = await service.run_analysis() + return result + except AnalysisSession.DoesNotExist: + raise Exception("๋ถ„์„ ์„ธ์…˜์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.") + + @staticmethod + def get_user_analysis_sessions(user) -> List[AnalysisSession]: + """์‚ฌ์šฉ์ž์˜ ๋ถ„์„ ์„ธ์…˜ ๋ชฉ๋ก ์กฐํšŒ""" + return AnalysisSession.objects.filter(user=user).order_by('-created_at') + + @staticmethod + def cancel_analysis(user, session_id: int): + """๋ถ„์„ ์ทจ์†Œ""" + try: + session = AnalysisSession.objects.get(id=session_id, user=user) + if session.status == 'running': + session.status = 'cancelled' + session.completed_at = datetime.datetime.now() + session.save() + return True + return False + except AnalysisSession.DoesNotExist: + raise Exception("๋ถ„์„ ์„ธ์…˜์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.") \ No newline at end of file diff --git a/web/backend/apps/trading_api/urls.py b/web/backend/apps/trading_api/urls.py new file mode 100644 index 00000000..62d2bfab --- /dev/null +++ b/web/backend/apps/trading_api/urls.py @@ -0,0 +1,20 @@ +from django.urls import path +from . import views + +app_name = 'trading_api' + +urlpatterns = [ + # ๋ถ„์„ ์„ค์ • ๋ฐ ์˜ต์…˜ + path('config/', views.AnalysisConfigView.as_view(), name='analysis_config'), + path('options/', views.get_analysis_options, name='analysis_options'), + + # ๋ถ„์„ ์‹คํ–‰ + path('start/', views.StartAnalysisView.as_view(), name='start_analysis'), + path('status//', views.AnalysisStatusView.as_view(), name='analysis_status'), + path('cancel//', views.CancelAnalysisView.as_view(), name='cancel_analysis'), + + # ๋ถ„์„ ๊ธฐ๋ก ๋ฐ ๊ฒฐ๊ณผ + path('history/', views.AnalysisHistoryView.as_view(), name='analysis_history'), + path('report//', views.AnalysisReportView.as_view(), name='analysis_report'), + path('running/', views.get_running_analyses, name='running_analyses'), +] \ No newline at end of file diff --git a/web/backend/apps/trading_api/views.py b/web/backend/apps/trading_api/views.py new file mode 100644 index 00000000..58b0032a --- /dev/null +++ b/web/backend/apps/trading_api/views.py @@ -0,0 +1,212 @@ +from rest_framework import status, permissions +from rest_framework.decorators import api_view, permission_classes +from rest_framework.response import Response +from rest_framework.views import APIView +from django.shortcuts import get_object_or_404 +from asgiref.sync import sync_to_async +import asyncio +from datetime import datetime + +from apps.authentication.models import AnalysisSession +from apps.authentication.serializers import AnalysisSessionSerializer, CreateAnalysisSessionSerializer +from .services import TradingAnalysisManager, TradingAnalysisService + + +class AnalysisConfigView(APIView): + """๋ถ„์„ ์„ค์ • ์ •๋ณด ์กฐํšŒ""" + permission_classes = [permissions.IsAuthenticated] + + def get(self, request): + """๋ถ„์„ ์„ค์ • ์˜ต์…˜๋“ค ๋ฐ˜ํ™˜""" + config = { + 'analysts': [ + {'value': 'market', 'label': 'Market Analyst', 'description': '์‹œ์žฅ ๋ฐ์ดํ„ฐ ๋ถ„์„'}, + {'value': 'social', 'label': 'Social Analyst', 'description': '์†Œ์…œ ์„ผํ‹ฐ๋ฉ˜ํŠธ ๋ถ„์„'}, + {'value': 'news', 'label': 'News Analyst', 'description': '๋‰ด์Šค ๋ถ„์„'}, + {'value': 'fundamentals', 'label': 'Fundamentals Analyst', 'description': '๊ธฐ๋ณธ ๋ถ„์„'}, + ], + 'research_depths': [ + {'value': 1, 'label': 'Shallow', 'description': '๋น ๋ฅธ ๋ถ„์„, ์ ์€ ํ† ๋ก  ๋ผ์šด๋“œ'}, + {'value': 3, 'label': 'Medium', 'description': '์ค‘๊ฐ„ ์ •๋„ ๋ถ„์„, ๋ณดํ†ต ํ† ๋ก  ๋ผ์šด๋“œ'}, + {'value': 5, 'label': 'Deep', 'description': '๊นŠ์€ ๋ถ„์„, ๋งŽ์€ ํ† ๋ก  ๋ผ์šด๋“œ'}, + ], + 'shallow_thinkers': [ + {'value': 'gpt-4o-mini', 'label': 'GPT-4o-mini', 'description': '๋น ๋ฅด๊ณ  ํšจ์œจ์ '}, + {'value': 'gpt-4.1-nano', 'label': 'GPT-4.1-nano', 'description': '์ดˆ๊ฒฝ๋Ÿ‰ ๋ชจ๋ธ'}, + {'value': 'gpt-4.1-mini', 'label': 'GPT-4.1-mini', 'description': '์ปดํŒฉํŠธ ๋ชจ๋ธ'}, + {'value': 'gpt-4o', 'label': 'GPT-4o', 'description': 'ํ‘œ์ค€ ๋ชจ๋ธ'}, + ], + 'deep_thinkers': [ + {'value': 'gpt-4.1-nano', 'label': 'GPT-4.1-nano', 'description': '์ดˆ๊ฒฝ๋Ÿ‰ ๋ชจ๋ธ'}, + {'value': 'gpt-4.1-mini', 'label': 'GPT-4.1-mini', 'description': '์ปดํŒฉํŠธ ๋ชจ๋ธ'}, + {'value': 'gpt-4o', 'label': 'GPT-4o', 'description': 'ํ‘œ์ค€ ๋ชจ๋ธ'}, + {'value': 'o4-mini', 'label': 'o4-mini', 'description': '์ถ”๋ก  ํŠนํ™” ๋ชจ๋ธ (์ปดํŒฉํŠธ)'}, + {'value': 'o3-mini', 'label': 'o3-mini', 'description': '๊ณ ๊ธ‰ ์ถ”๋ก  ๋ชจ๋ธ (๊ฒฝ๋Ÿ‰)'}, + {'value': 'o3', 'label': 'o3', 'description': '์™„์ „ํ•œ ๊ณ ๊ธ‰ ์ถ”๋ก  ๋ชจ๋ธ'}, + {'value': 'o1', 'label': 'o1', 'description': '์ตœ๊ณ ๊ธ‰ ์ถ”๋ก  ๋ฐ ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ชจ๋ธ'}, + ] + } + + return Response(config) + + +class StartAnalysisView(APIView): + """๋ถ„์„ ์‹œ์ž‘""" + permission_classes = [permissions.IsAuthenticated] + + def post(self, request): + """์ƒˆ๋กœ์šด ๋ถ„์„ ์‹œ์ž‘""" + serializer = CreateAnalysisSessionSerializer(data=request.data) + + if serializer.is_valid(): + # ๋ถ„์„ ์„ธ์…˜ ์ƒ์„ฑ + session = serializer.save(user=request.user) + + # ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋ถ„์„ ์‹คํ–‰ + # ์‹ค์ œ ํ™˜๊ฒฝ์—์„œ๋Š” Celery๋‚˜ ๋‹ค๋ฅธ task queue๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค + asyncio.create_task(self._start_analysis_async(request.user, session.id)) + + return Response({ + 'message': '๋ถ„์„์ด ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค.', + 'session_id': session.id, + 'session': AnalysisSessionSerializer(session).data + }, status=status.HTTP_201_CREATED) + + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + async def _start_analysis_async(self, user, session_id): + """๋น„๋™๊ธฐ ๋ถ„์„ ์‹คํ–‰""" + try: + await TradingAnalysisManager.start_analysis(user, session_id) + except Exception as e: + print(f"๋ถ„์„ ์‹คํ–‰ ์ค‘ ์˜ค๋ฅ˜: {e}") + + +class AnalysisStatusView(APIView): + """๋ถ„์„ ์ƒํƒœ ์กฐํšŒ""" + permission_classes = [permissions.IsAuthenticated] + + def get(self, request, session_id): + """ํŠน์ • ๋ถ„์„ ์„ธ์…˜์˜ ์ƒํƒœ ์กฐํšŒ""" + session = get_object_or_404( + AnalysisSession, + id=session_id, + user=request.user + ) + + serializer = AnalysisSessionSerializer(session) + return Response(serializer.data) + + +class CancelAnalysisView(APIView): + """๋ถ„์„ ์ทจ์†Œ""" + permission_classes = [permissions.IsAuthenticated] + + def post(self, request, session_id): + """๋ถ„์„ ์ทจ์†Œ""" + try: + success = TradingAnalysisManager.cancel_analysis(request.user, session_id) + + if success: + return Response({ + 'message': '๋ถ„์„์ด ์ทจ์†Œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.', + 'session_id': session_id + }) + else: + return Response({ + 'message': '์ทจ์†Œํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค.', + 'session_id': session_id + }, status=status.HTTP_400_BAD_REQUEST) + + except Exception as e: + return Response({ + 'error': str(e) + }, status=status.HTTP_404_NOT_FOUND) + + +class AnalysisHistoryView(APIView): + """๋ถ„์„ ๊ธฐ๋ก ์กฐํšŒ""" + permission_classes = [permissions.IsAuthenticated] + + def get(self, request): + """์‚ฌ์šฉ์ž์˜ ๋ถ„์„ ๊ธฐ๋ก ์กฐํšŒ""" + sessions = TradingAnalysisManager.get_user_analysis_sessions(request.user) + serializer = AnalysisSessionSerializer(sessions, many=True) + + return Response({ + 'count': len(sessions), + 'results': serializer.data + }) + + +class AnalysisReportView(APIView): + """๋ถ„์„ ๋ณด๊ณ ์„œ ์กฐํšŒ""" + permission_classes = [permissions.IsAuthenticated] + + def get(self, request, session_id): + """ํŠน์ • ๋ถ„์„ ์„ธ์…˜์˜ ๋ณด๊ณ ์„œ ์กฐํšŒ""" + session = get_object_or_404( + AnalysisSession, + id=session_id, + user=request.user + ) + + if session.status != 'completed': + return Response({ + 'message': '๋ถ„์„์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.', + 'status': session.status + }, status=status.HTTP_400_BAD_REQUEST) + + return Response({ + 'session_id': session.id, + 'ticker': session.ticker, + 'analysis_date': session.analysis_date, + 'final_report': session.final_report, + 'completed_at': session.completed_at, + 'duration': (session.completed_at - session.started_at).total_seconds() if session.started_at and session.completed_at else None + }) + + +@api_view(['GET']) +@permission_classes([permissions.IsAuthenticated]) +def get_analysis_options(request): + """๋ถ„์„ ์˜ต์…˜ ์กฐํšŒ (๊ฐ„๋‹จํ•œ ๋ฒ„์ „)""" + options = { + 'default_values': { + 'ticker': 'SPY', + 'analysis_date': datetime.now().strftime('%Y-%m-%d'), + 'analysts_selected': ['market', 'social', 'news', 'fundamentals'], + 'research_depth': 3, + 'shallow_thinker': 'gpt-4o-mini', + 'deep_thinker': 'gpt-4o' + } + } + + # ์‚ฌ์šฉ์ž ํ”„๋กœํ•„์˜ ๊ธฐ๋ณธ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ์‚ฌ์šฉ + if hasattr(request.user, 'profile'): + profile = request.user.profile + options['user_preferences'] = { + 'default_ticker': profile.default_ticker, + 'preferred_research_depth': profile.preferred_research_depth, + 'preferred_shallow_thinker': profile.preferred_shallow_thinker, + 'preferred_deep_thinker': profile.preferred_deep_thinker, + } + + return Response(options) + + +@api_view(['GET']) +@permission_classes([permissions.IsAuthenticated]) +def get_running_analyses(request): + """์‹คํ–‰ ์ค‘์ธ ๋ถ„์„ ์กฐํšŒ""" + running_sessions = AnalysisSession.objects.filter( + user=request.user, + status='running' + ) + + serializer = AnalysisSessionSerializer(running_sessions, many=True) + + return Response({ + 'count': len(running_sessions), + 'results': serializer.data + }) \ No newline at end of file diff --git a/web/backend/apps/websocket/__init__.py b/web/backend/apps/websocket/__init__.py new file mode 100644 index 00000000..09e64722 --- /dev/null +++ b/web/backend/apps/websocket/__init__.py @@ -0,0 +1 @@ +# WebSocket app \ No newline at end of file diff --git a/web/backend/apps/websocket/apps.py b/web/backend/apps/websocket/apps.py new file mode 100644 index 00000000..3be36af2 --- /dev/null +++ b/web/backend/apps/websocket/apps.py @@ -0,0 +1,7 @@ +from django.apps import AppConfig + + +class WebsocketConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'apps.websocket' + verbose_name = 'WebSocket ํ†ต์‹ ' \ No newline at end of file diff --git a/web/backend/apps/websocket/consumers.py b/web/backend/apps/websocket/consumers.py new file mode 100644 index 00000000..38d355d4 --- /dev/null +++ b/web/backend/apps/websocket/consumers.py @@ -0,0 +1,178 @@ +import json +from channels.generic.websocket import AsyncWebsocketConsumer +from channels.db import database_sync_to_async +from django.contrib.auth.models import AnonymousUser +from rest_framework_simplejwt.tokens import UntypedToken +from rest_framework_simplejwt.exceptions import InvalidToken, TokenError +from django.contrib.auth import get_user_model +from django.conf import settings +import jwt + +User = get_user_model() + + +class TradingAnalysisConsumer(AsyncWebsocketConsumer): + """๊ฑฐ๋ž˜ ๋ถ„์„ ์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ WebSocket Consumer""" + + async def connect(self): + """WebSocket ์—ฐ๊ฒฐ""" + # JWT ํ† ํฐ ์ธ์ฆ + user = await self.get_user_from_token() + + if user and user.is_authenticated: + self.user = user + self.user_group_name = f"user_{user.id}" + + # ์‚ฌ์šฉ์ž ๊ทธ๋ฃน์— ์ถ”๊ฐ€ + await self.channel_layer.group_add( + self.user_group_name, + self.channel_name + ) + + await self.accept() + + # ์—ฐ๊ฒฐ ์„ฑ๊ณต ๋ฉ”์‹œ์ง€ ์ „์†ก + await self.send(text_data=json.dumps({ + 'type': 'connection_established', + 'message': 'WebSocket ์—ฐ๊ฒฐ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์„ค์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.', + 'user_id': user.id + })) + else: + await self.close() + + async def disconnect(self, close_code): + """WebSocket ์—ฐ๊ฒฐ ํ•ด์ œ""" + if hasattr(self, 'user_group_name'): + await self.channel_layer.group_discard( + self.user_group_name, + self.channel_name + ) + + async def receive(self, text_data): + """ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ฉ”์‹œ์ง€ ์ˆ˜์‹ """ + try: + text_data_json = json.loads(text_data) + message_type = text_data_json.get('type', '') + + if message_type == 'ping': + # ์—ฐ๊ฒฐ ์ƒํƒœ ํ™•์ธ์šฉ ping + await self.send(text_data=json.dumps({ + 'type': 'pong', + 'timestamp': text_data_json.get('timestamp') + })) + elif message_type == 'subscribe_analysis': + # ํŠน์ • ๋ถ„์„ ์„ธ์…˜ ๊ตฌ๋… + session_id = text_data_json.get('session_id') + if session_id: + await self.subscribe_to_analysis(session_id) + + except json.JSONDecodeError: + await self.send(text_data=json.dumps({ + 'type': 'error', + 'message': '์ž˜๋ชป๋œ JSON ํ˜•์‹์ž…๋‹ˆ๋‹ค.' + })) + + async def subscribe_to_analysis(self, session_id): + """ํŠน์ • ๋ถ„์„ ์„ธ์…˜ ๊ตฌ๋…""" + # ๋ถ„์„ ์„ธ์…˜์ด ์‚ฌ์šฉ์ž์˜ ๊ฒƒ์ธ์ง€ ํ™•์ธ + session_exists = await self.check_session_ownership(session_id) + + if session_exists: + analysis_group = f"analysis_{session_id}" + await self.channel_layer.group_add( + analysis_group, + self.channel_name + ) + + await self.send(text_data=json.dumps({ + 'type': 'subscription_confirmed', + 'session_id': session_id, + 'message': f'๋ถ„์„ ์„ธ์…˜ {session_id}์— ๊ตฌ๋…๋˜์—ˆ์Šต๋‹ˆ๋‹ค.' + })) + else: + await self.send(text_data=json.dumps({ + 'type': 'subscription_failed', + 'session_id': session_id, + 'message': 'ํ•ด๋‹น ๋ถ„์„ ์„ธ์…˜์— ๋Œ€ํ•œ ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค.' + })) + + # ๋ถ„์„ ๊ด€๋ จ ๋ฉ”์‹œ์ง€ ํ•ธ๋“ค๋Ÿฌ๋“ค + async def trading_analysis_message(self, event): + """๋ถ„์„ ๊ด€๋ จ ๋ฉ”์‹œ์ง€ ์ „์†ก""" + message = event['message'] + await self.send(text_data=json.dumps(message)) + + async def analysis_progress(self, event): + """๋ถ„์„ ์ง„ํ–‰ ์ƒํ™ฉ ์—…๋ฐ์ดํŠธ""" + await self.send(text_data=json.dumps(event)) + + async def analysis_started(self, event): + """๋ถ„์„ ์‹œ์ž‘ ์•Œ๋ฆผ""" + await self.send(text_data=json.dumps(event)) + + async def analysis_completed(self, event): + """๋ถ„์„ ์™„๋ฃŒ ์•Œ๋ฆผ""" + await self.send(text_data=json.dumps(event)) + + async def analysis_failed(self, event): + """๋ถ„์„ ์‹คํŒจ ์•Œ๋ฆผ""" + await self.send(text_data=json.dumps(event)) + + @database_sync_to_async + def get_user_from_token(self): + """JWT ํ† ํฐ์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด ์ถ”์ถœ""" + try: + # URL์—์„œ ํ† ํฐ ์ถ”์ถœ (query parameter ๋˜๋Š” header) + token = None + + # Query parameter์—์„œ ํ† ํฐ ์ถ”์ถœ + query_string = self.scope.get('query_string', b'').decode() + if 'token=' in query_string: + token = query_string.split('token=')[1].split('&')[0] + + # ํ—ค๋”์—์„œ ํ† ํฐ ์ถ”์ถœ + if not token: + headers = dict(self.scope['headers']) + auth_header = headers.get(b'authorization', b'').decode() + if auth_header.startswith('Bearer '): + token = auth_header.split(' ')[1] + + if not token: + return AnonymousUser() + + # JWT ํ† ํฐ ๊ฒ€์ฆ + try: + UntypedToken(token) # ํ† ํฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ + + # ํ† ํฐ์—์„œ ์‚ฌ์šฉ์ž ID ์ถ”์ถœ + decoded_token = jwt.decode( + token, + settings.SECRET_KEY, + algorithms=['HS256'] + ) + user_id = decoded_token.get('user_id') + + if user_id: + user = User.objects.get(id=user_id) + return user + + except (InvalidToken, TokenError, jwt.ExpiredSignatureError): + return AnonymousUser() + except User.DoesNotExist: + return AnonymousUser() + + except Exception as e: + print(f"WebSocket ์ธ์ฆ ์ค‘ ์˜ค๋ฅ˜: {e}") + return AnonymousUser() + + return AnonymousUser() + + @database_sync_to_async + def check_session_ownership(self, session_id): + """๋ถ„์„ ์„ธ์…˜ ์†Œ์œ ๊ถŒ ํ™•์ธ""" + try: + from apps.authentication.models import AnalysisSession + session = AnalysisSession.objects.get(id=session_id, user=self.user) + return True + except AnalysisSession.DoesNotExist: + return False \ No newline at end of file diff --git a/web/backend/apps/websocket/routing.py b/web/backend/apps/websocket/routing.py new file mode 100644 index 00000000..4ebd8396 --- /dev/null +++ b/web/backend/apps/websocket/routing.py @@ -0,0 +1,6 @@ +from django.urls import re_path +from . import consumers + +websocket_urlpatterns = [ + re_path(r'ws/trading-analysis/$', consumers.TradingAnalysisConsumer.as_asgi()), +] \ No newline at end of file diff --git a/web/backend/apps/websocket/urls.py b/web/backend/apps/websocket/urls.py new file mode 100644 index 00000000..ea324492 --- /dev/null +++ b/web/backend/apps/websocket/urls.py @@ -0,0 +1,8 @@ +from django.urls import path + +app_name = 'websocket' + +# WebSocket์€ ASGI routing์„ ํ†ตํ•ด ์ฒ˜๋ฆฌ๋˜๋ฏ€๋กœ HTTP URL์€ ์—†์Œ +urlpatterns = [ + # WebSocket ๊ด€๋ จ HTTP ์—”๋“œํฌ์ธํŠธ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์—ฌ๊ธฐ์— ์ถ”๊ฐ€ +] \ No newline at end of file diff --git a/web/backend/manage.py b/web/backend/manage.py new file mode 100644 index 00000000..a53db5b9 --- /dev/null +++ b/web/backend/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'tradingagents_web.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/web/backend/tradingagents_web/__init__.py b/web/backend/tradingagents_web/__init__.py new file mode 100644 index 00000000..f14c2cae --- /dev/null +++ b/web/backend/tradingagents_web/__init__.py @@ -0,0 +1 @@ +# This file makes Python treat the directory as a package \ No newline at end of file diff --git a/web/backend/tradingagents_web/asgi.py b/web/backend/tradingagents_web/asgi.py new file mode 100644 index 00000000..3a78e90a --- /dev/null +++ b/web/backend/tradingagents_web/asgi.py @@ -0,0 +1,25 @@ +""" +ASGI config for tradingagents_web project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.2/howto/deployment/asgi/ +""" + +import os +from django.core.asgi import get_asgi_application +from channels.routing import ProtocolTypeRouter, URLRouter +from channels.auth import AuthMiddlewareStack +import apps.websocket.routing + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'tradingagents_web.settings') + +application = ProtocolTypeRouter({ + "http": get_asgi_application(), + "websocket": AuthMiddlewareStack( + URLRouter( + apps.websocket.routing.websocket_urlpatterns + ) + ), +}) \ No newline at end of file diff --git a/web/backend/tradingagents_web/settings.py b/web/backend/tradingagents_web/settings.py new file mode 100644 index 00000000..6fb5c767 --- /dev/null +++ b/web/backend/tradingagents_web/settings.py @@ -0,0 +1,180 @@ +""" +Django settings for tradingagents_web project. +""" + +from pathlib import Path +from decouple import config +import os + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = config('SECRET_KEY', default='django-insecure-your-secret-key-here') + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = config('DEBUG', default=True, cast=bool) + +ALLOWED_HOSTS = config('ALLOWED_HOSTS', default='localhost,127.0.0.1').split(',') + +# Application definition +DJANGO_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', +] + +THIRD_PARTY_APPS = [ + 'rest_framework', + 'rest_framework_simplejwt', + 'corsheaders', + 'channels', +] + +LOCAL_APPS = [ + 'apps.authentication', + 'apps.trading_api', + 'apps.websocket', +] + +INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + LOCAL_APPS + +MIDDLEWARE = [ + 'corsheaders.middleware.CorsMiddleware', + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'tradingagents_web.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'tradingagents_web.wsgi.application' +ASGI_APPLICATION = 'tradingagents_web.asgi.application' + +# Database +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.mysql', + 'NAME': config('DB_NAME', default='tradingagents_web'), + 'USER': config('DB_USER', default='root'), + 'PASSWORD': config('DB_PASSWORD', default='password'), + 'HOST': config('DB_HOST', default='localhost'), + 'PORT': config('DB_PORT', default='3306'), + 'OPTIONS': { + 'charset': 'utf8mb4', + 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'", + }, + } +} + +# Password validation +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + +# Internationalization +LANGUAGE_CODE = 'ko-kr' +TIME_ZONE = 'Asia/Seoul' +USE_I18N = True +USE_TZ = True + +# Static files (CSS, JavaScript, Images) +STATIC_URL = '/static/' +STATIC_ROOT = BASE_DIR / 'staticfiles' + +# Media files +MEDIA_URL = '/media/' +MEDIA_ROOT = BASE_DIR / 'media' + +# Default primary key field type +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' + +# Custom User Model +AUTH_USER_MODEL = 'authentication.User' + +# REST Framework configuration +REST_FRAMEWORK = { + 'DEFAULT_AUTHENTICATION_CLASSES': [ + 'rest_framework_simplejwt.authentication.JWTAuthentication', + ], + 'DEFAULT_PERMISSION_CLASSES': [ + 'rest_framework.permissions.IsAuthenticated', + ], + 'DEFAULT_RENDERER_CLASSES': [ + 'rest_framework.renderers.JSONRenderer', + ], + 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', + 'PAGE_SIZE': 20, +} + +# JWT configuration +from datetime import timedelta + +SIMPLE_JWT = { + 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60), + 'REFRESH_TOKEN_LIFETIME': timedelta(days=7), + 'ROTATE_REFRESH_TOKENS': True, + 'BLACKLIST_AFTER_ROTATION': True, +} + +# CORS configuration for React frontend +CORS_ALLOWED_ORIGINS = [ + "http://localhost:3000", # React development server + "http://127.0.0.1:3000", +] + +CORS_ALLOW_CREDENTIALS = True + +# Channels configuration for WebSocket +CHANNEL_LAYERS = { + 'default': { + 'BACKEND': 'channels_redis.core.RedisChannelLayer', + 'CONFIG': { + "hosts": [(config('REDIS_HOST', default='127.0.0.1'), config('REDIS_PORT', default=6379, cast=int))], + }, + }, +} + +# OpenAI Configuration +OPENAI_API_KEY = config('OPENAI_API_KEY', default='') # ๊ฐœ๋ฐœ์ž๊ฐ€ ๋“ฑ๋กํ•œ ๊ธฐ๋ณธ API ํ‚ค + +# Trading Agents Configuration +TRADING_AGENTS_CONFIG = { + 'DEFAULT_TICKER': 'SPY', + 'MAX_CONCURRENT_ANALYSES': 5, + 'ANALYSIS_TIMEOUT': 300, # 5 minutes +} \ No newline at end of file diff --git a/web/backend/tradingagents_web/urls.py b/web/backend/tradingagents_web/urls.py new file mode 100644 index 00000000..8f757cda --- /dev/null +++ b/web/backend/tradingagents_web/urls.py @@ -0,0 +1,19 @@ +""" +tradingagents_web URL Configuration +""" +from django.contrib import admin +from django.urls import path, include +from django.conf import settings +from django.conf.urls.static import static + +urlpatterns = [ + path('admin/', admin.site.urls), + path('api/auth/', include('apps.authentication.urls')), + path('api/trading/', include('apps.trading_api.urls')), + path('ws/', include('apps.websocket.urls')), +] + +# Serve media files in development +if settings.DEBUG: + urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) \ No newline at end of file diff --git a/web/backend/tradingagents_web/wsgi.py b/web/backend/tradingagents_web/wsgi.py new file mode 100644 index 00000000..1518cfd0 --- /dev/null +++ b/web/backend/tradingagents_web/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for tradingagents_web project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.2/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'tradingagents_web.settings') + +application = get_wsgi_application() \ No newline at end of file diff --git a/web/frontend/.gitignore b/web/frontend/.gitignore new file mode 100644 index 00000000..b512c09d --- /dev/null +++ b/web/frontend/.gitignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/web/frontend/package-lock.json b/web/frontend/package-lock.json new file mode 100644 index 00000000..bc3e2f25 --- /dev/null +++ b/web/frontend/package-lock.json @@ -0,0 +1,21962 @@ +{ + "name": "tradingagents-web-frontend", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "tradingagents-web-frontend", + "version": "0.1.0", + "dependencies": { + "@ant-design/icons": "^5.2.6", + "@testing-library/jest-dom": "^5.16.4", + "@testing-library/react": "^13.3.0", + "@testing-library/user-event": "^13.5.0", + "antd": "^5.10.0", + "axios": "^1.5.0", + "dayjs": "^1.11.9", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-markdown": "^8.0.7", + "react-router-dom": "^6.4.0", + "react-scripts": "5.0.1", + "recharts": "^2.8.0", + "styled-components": "^6.0.8", + "websocket": "^1.0.34" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.3.tgz", + "integrity": "sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA==", + "license": "MIT" + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@ant-design/colors": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.2.1.tgz", + "integrity": "sha512-lCHDcEzieu4GA3n8ELeZ5VQ8pKQAWcGGLRTQ50aQM2iqPpq2evTxER84jfdPvsPAtEcZ7m44NI45edFMo8oOYQ==", + "license": "MIT", + "dependencies": { + "@ant-design/fast-color": "^2.0.6" + } + }, + "node_modules/@ant-design/cssinjs": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.23.0.tgz", + "integrity": "sha512-7GAg9bD/iC9ikWatU9ym+P9ugJhi/WbsTWzcKN6T4gU0aehsprtke1UAaaSxxkjjmkJb3llet/rbUSLPgwlY4w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "@emotion/hash": "^0.8.0", + "@emotion/unitless": "^0.7.5", + "classnames": "^2.3.1", + "csstype": "^3.1.3", + "rc-util": "^5.35.0", + "stylis": "^4.3.4" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/cssinjs-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs-utils/-/cssinjs-utils-1.1.3.tgz", + "integrity": "sha512-nOoQMLW1l+xR1Co8NFVYiP8pZp3VjIIzqV6D6ShYF2ljtdwWJn5WSsH+7kvCktXL/yhEtWURKOfH5Xz/gzlwsg==", + "license": "MIT", + "dependencies": { + "@ant-design/cssinjs": "^1.21.0", + "@babel/runtime": "^7.23.2", + "rc-util": "^5.38.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@ant-design/fast-color": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@ant-design/fast-color/-/fast-color-2.0.6.tgz", + "integrity": "sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@ant-design/icons": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.6.1.tgz", + "integrity": "sha512-0/xS39c91WjPAZOWsvi1//zjx6kAp4kxWwctR6kuU6p133w8RU0D2dSCvZC19uQyharg/sAvYxGYWl01BbZZfg==", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^7.0.0", + "@ant-design/icons-svg": "^4.4.0", + "@babel/runtime": "^7.24.8", + "classnames": "^2.2.6", + "rc-util": "^5.31.1" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/icons-svg": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", + "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==", + "license": "MIT" + }, + "node_modules/@ant-design/react-slick": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-1.1.2.tgz", + "integrity": "sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.4", + "classnames": "^2.2.5", + "json2mq": "^0.2.0", + "resize-observer-polyfill": "^1.5.1", + "throttle-debounce": "^5.0.0" + }, + "peerDependencies": { + "react": ">=16.9.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz", + "integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz", + "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.4", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.27.4", + "@babel/types": "^7.27.3", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/eslint-parser": { + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.27.5.tgz", + "integrity": "sha512-HLkYQfRICudzcOtjGwkPvGc5nF1b4ljLZh1IRDj50lRZ718NAKVgQpIAUX8bfg6u/yuSKY3L7E0YzIV+OxrB8Q==", + "license": "MIT", + "dependencies": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0", + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/@babel/eslint-parser/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", + "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.27.5", + "@babel/types": "^7.27.3", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", + "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.27.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", + "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz", + "integrity": "sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz", + "integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.1", + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", + "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", + "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz", + "integrity": "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.27.1.tgz", + "integrity": "sha512-DTxe4LBPrtFdsWzgpmbBKevg3e9PBy+dXRt19kSbucbZvL2uqtdqwwpluL1jfxYE0wIDTFp1nTy/q6gNLsxXrg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-decorators": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", + "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz", + "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.27.1.tgz", + "integrity": "sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.5.tgz", + "integrity": "sha512-JF6uE2s67f0y2RZcm2kpAUEbD50vH62TyWVebxwHAlbSdM49VqPz8t4a1uIjp4NIOIZ4xzLfjY5emt/RCyC7TQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz", + "integrity": "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz", + "integrity": "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.27.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.3.tgz", + "integrity": "sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", + "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz", + "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-flow": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", + "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", + "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.3.tgz", + "integrity": "sha512-7ZZtznF9g4l2JCImCo5LNKFHB5eXnN39lLtLY5Tg+VkR0jwOt7TBciMckuiQIOIW7L5tkQOCh3bVGYeXgMx52Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.27.3", + "@babel/plugin-transform-parameters": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", + "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.1.tgz", + "integrity": "sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz", + "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.27.1.tgz", + "integrity": "sha512-p9+Vl3yuHPmkirRrg021XiP+EETmPMQTLr6Ayjj85RLNEbb3Eya/4VI0vAdzQG9SEAl2Lnt7fy5lZyMzjYoZQQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", + "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.5.tgz", + "integrity": "sha512-uhB8yHerfe3MWnuLAhEbeQ4afVoqv8BQsPqrTv7e/jZ9y00kJL6l9a/f4OWaKxotmjzewfEyXE1vgDJenkQ2/Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.27.4.tgz", + "integrity": "sha512-D68nR5zxU64EUzV8i7T3R5XP0Xhrou/amNnddsRQssx6GrTLdZl1rLxyjtVZBd+v/NVX4AbTPOB5aU8thAZV1A==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.1.tgz", + "integrity": "sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.2.tgz", + "integrity": "sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.27.1", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.27.1", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.27.1", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.27.1", + "@babel/plugin-transform-classes": "^7.27.1", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.27.1", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.27.2", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.1", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.27.1", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.40.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.27.1.tgz", + "integrity": "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.27.1", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", + "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz", + "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", + "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.3", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", + "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "license": "MIT" + }, + "node_modules/@csstools/normalize.css": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.1.1.tgz", + "integrity": "sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ==", + "license": "CC0-1.0" + }, + "node_modules/@csstools/postcss-cascade-layers": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", + "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/selector-specificity": "^2.0.2", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-color-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", + "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", + "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-hwb-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", + "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", + "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", + "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-nested-calc": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", + "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", + "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", + "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", + "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", + "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", + "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", + "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", + "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", + "license": "CC0-1.0", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", + "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", + "license": "CC0-1.0", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss-selector-parser": "^6.0.10" + } + }, + "node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", + "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", + "license": "MIT" + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "license": "BSD-3-Clause" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/console/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/console/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/console/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/console/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", + "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "license": "MIT", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/reporters": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^27.5.1", + "jest-config": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-resolve-dependencies": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "jest-watcher": "^27.5.1", + "micromatch": "^4.0.4", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/core/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/environment": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", + "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/environment/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/environment/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", + "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@sinonjs/fake-timers": "^8.0.1", + "@types/node": "*", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/fake-timers/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", + "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/globals/node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", + "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-haste-map": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.1.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/reporters/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", + "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9", + "source-map": "^0.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/source-map/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "license": "MIT", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-result/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-result/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", + "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + "license": "MIT", + "dependencies": { + "@jest/test-result": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-runtime": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", + "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.5.1", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-util": "^27.5.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/transform/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/@jest/transform/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "license": "MIT" + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "license": "MIT", + "dependencies": { + "eslint-scope": "5.1.1" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.16.tgz", + "integrity": "sha512-kLQc9xz6QIqd2oIYyXRUiAp79kGpFBm3fEM9ahfG1HI0WI5gdZ2OVHWdmZYnwODt7ISck+QuQ6sBPrtvUBML7Q==", + "license": "MIT", + "dependencies": { + "ansi-html": "^0.0.9", + "core-js-pure": "^3.23.3", + "error-stack-parser": "^2.0.6", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.4", + "schema-utils": "^4.2.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "@types/webpack": "4.x || 5.x", + "react-refresh": ">=0.10.0 <1.0.0", + "sockjs-client": "^1.4.0", + "type-fest": ">=0.17.0 <5.0.0", + "webpack": ">=4.43.0 <6.0.0", + "webpack-dev-server": "3.x || 4.x || 5.x", + "webpack-hot-middleware": "2.x", + "webpack-plugin-serve": "0.x || 1.x" + }, + "peerDependenciesMeta": { + "@types/webpack": { + "optional": true + }, + "sockjs-client": { + "optional": true + }, + "type-fest": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + }, + "webpack-hot-middleware": { + "optional": true + }, + "webpack-plugin-serve": { + "optional": true + } + } + }, + "node_modules/@rc-component/async-validator": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-5.0.4.tgz", + "integrity": "sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.4" + }, + "engines": { + "node": ">=14.x" + } + }, + "node_modules/@rc-component/color-picker": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-2.0.1.tgz", + "integrity": "sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==", + "license": "MIT", + "dependencies": { + "@ant-design/fast-color": "^2.0.6", + "@babel/runtime": "^7.23.6", + "classnames": "^2.2.6", + "rc-util": "^5.38.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/context": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-1.4.0.tgz", + "integrity": "sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/mini-decimal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz", + "integrity": "sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@rc-component/mutate-observer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz", + "integrity": "sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/portal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.2.tgz", + "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/qrcode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-1.0.0.tgz", + "integrity": "sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7", + "classnames": "^2.3.2", + "rc-util": "^5.38.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/tour": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-1.15.1.tgz", + "integrity": "sha512-Tr2t7J1DKZUpfJuDZWHxyxWpfmj8EZrqSgyMZ+BCdvKZ6r1UDsfU46M/iWAAFBy961Ssfom2kv5f3UcjIL2CmQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "@rc-component/portal": "^1.0.0-9", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/trigger": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-2.2.6.tgz", + "integrity": "sha512-/9zuTnWwhQ3S3WT1T8BubuFTT46kvnXgaERR9f4BTKyn61/wpf/BvbImzYBubzJibU707FxwbKszLlHjcLiv1Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@rc-component/portal": "^1.1.0", + "classnames": "^2.3.2", + "rc-motion": "^2.0.0", + "rc-resize-observer": "^1.3.1", + "rc-util": "^5.44.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@remix-run/router": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.0.tgz", + "integrity": "sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", + "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "license": "MIT", + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/pluginutils/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "license": "MIT" + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "license": "MIT" + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.11.0.tgz", + "integrity": "sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ==", + "license": "MIT" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@surma/rollup-plugin-off-main-thread": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", + "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", + "license": "Apache-2.0", + "dependencies": { + "ejs": "^3.1.6", + "json5": "^2.2.0", + "magic-string": "^0.25.0", + "string.prototype.matchall": "^4.0.6" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/core": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "license": "MIT", + "dependencies": { + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.12.6" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", + "svg-parser": "^2.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@testing-library/dom": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", + "integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==", + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.0.1", + "@babel/runtime": "^7.9.2", + "@types/testing-library__jest-dom": "^5.9.1", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", + "lodash": "^4.17.15", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=8", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/react": { + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz", + "integrity": "sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^8.5.0", + "@types/react-dom": "^18.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@testing-library/react/node_modules/@testing-library/dom": { + "version": "8.20.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", + "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@testing-library/react/node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "license": "Apache-2.0", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/@testing-library/user-event": { + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", + "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.12", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", + "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==", + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz", + "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", + "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/express/node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/hast": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", + "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.16", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", + "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/jest/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@types/jest/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.0.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.1.tgz", + "integrity": "sha512-MX4Zioh39chHlDJbKmEgydJDS3tspMP/lnQC67G3SWsTnb9NeYVWOjkxpOSy4oMfPs4StcWHwBrvUb4ybfnuaw==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.8.0" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "license": "MIT" + }, + "node_modules/@types/q": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", + "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==", + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.23", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", + "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "license": "MIT" + }, + "node_modules/@types/semver": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz", + "integrity": "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==", + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.5", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", + "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", + "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "license": "MIT" + }, + "node_modules/@types/stylis": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz", + "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==", + "license": "MIT" + }, + "node_modules/@types/testing-library__jest-dom": { + "version": "5.14.9", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz", + "integrity": "sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==", + "license": "MIT", + "dependencies": { + "@types/jest": "*" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", + "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "license": "BSD-3-Clause" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "license": "MIT", + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.9.tgz", + "integrity": "sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/antd": { + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/antd/-/antd-5.26.0.tgz", + "integrity": "sha512-iMPYKFTo2HvIRGutUOuN5AG+Uf+B2QaqcGQbdPp/100fqV3FAil6vFZLVuV3C4XEUOlDNkkUlJKhLR9V5rzIEg==", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^7.2.1", + "@ant-design/cssinjs": "^1.23.0", + "@ant-design/cssinjs-utils": "^1.1.3", + "@ant-design/fast-color": "^2.0.6", + "@ant-design/icons": "^5.6.1", + "@ant-design/react-slick": "~1.1.2", + "@babel/runtime": "^7.26.0", + "@rc-component/color-picker": "~2.0.1", + "@rc-component/mutate-observer": "^1.1.0", + "@rc-component/qrcode": "~1.0.0", + "@rc-component/tour": "~1.15.1", + "@rc-component/trigger": "^2.2.6", + "classnames": "^2.5.1", + "copy-to-clipboard": "^3.3.3", + "dayjs": "^1.11.11", + "rc-cascader": "~3.34.0", + "rc-checkbox": "~3.5.0", + "rc-collapse": "~3.9.0", + "rc-dialog": "~9.6.0", + "rc-drawer": "~7.3.0", + "rc-dropdown": "~4.2.1", + "rc-field-form": "~2.7.0", + "rc-image": "~7.12.0", + "rc-input": "~1.8.0", + "rc-input-number": "~9.5.0", + "rc-mentions": "~2.20.0", + "rc-menu": "~9.16.1", + "rc-motion": "^2.9.5", + "rc-notification": "~5.6.4", + "rc-pagination": "~5.1.0", + "rc-picker": "~4.11.3", + "rc-progress": "~4.0.0", + "rc-rate": "~2.13.1", + "rc-resize-observer": "^1.4.3", + "rc-segmented": "~2.7.0", + "rc-select": "~14.16.8", + "rc-slider": "~11.1.8", + "rc-steps": "~6.0.1", + "rc-switch": "~4.1.0", + "rc-table": "~7.51.0", + "rc-tabs": "~15.6.1", + "rc-textarea": "~1.10.0", + "rc-tooltip": "~6.4.0", + "rc-tree": "~5.13.1", + "rc-tree-select": "~5.27.0", + "rc-upload": "~4.9.2", + "rc-util": "^5.44.4", + "scroll-into-view-if-needed": "^3.1.0", + "throttle-debounce": "^5.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.reduce": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.8.tgz", + "integrity": "sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-array-method-boxes-properly": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "is-string": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "license": "MIT" + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "license": "MIT" + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.10.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz", + "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==", + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", + "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/babel-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "license": "MIT", + "dependencies": { + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-jest/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/babel-jest/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/babel-loader": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.4.1.tgz", + "integrity": "sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==", + "license": "MIT", + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.4", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", + "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/babel-plugin-named-asset-import": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", + "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", + "license": "MIT", + "peerDependencies": { + "@babel/core": "^7.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz", + "integrity": "sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.4", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz", + "integrity": "sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.4" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==", + "license": "MIT" + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", + "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^27.5.1", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-react-app": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.1.0.tgz", + "integrity": "sha512-f9B1xMdnkCIqe+2dHrJsoQFRz7reChaAHE/65SdaykPklQqhme2WaC08oD3is77x9ff98/9EazAKFDZv5rFEQg==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.16.0", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-decorators": "^7.16.4", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", + "@babel/plugin-proposal-numeric-separator": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-private-methods": "^7.16.0", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", + "@babel/plugin-transform-flow-strip-types": "^7.16.0", + "@babel/plugin-transform-react-display-name": "^7.16.0", + "@babel/plugin-transform-runtime": "^7.16.4", + "@babel/preset-env": "^7.16.4", + "@babel/preset-react": "^7.16.0", + "@babel/preset-typescript": "^7.16.0", + "@babel/runtime": "^7.16.3", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-react-remove-prop-types": "^0.4.24" + } + }, + "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", + "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "license": "MIT" + }, + "node_modules/bfj": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz", + "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==", + "license": "MIT", + "dependencies": { + "bluebird": "^3.7.2", + "check-types": "^11.2.3", + "hoopy": "^0.1.4", + "jsonpath": "^1.1.1", + "tryer": "^1.0.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/bonjour-service": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "license": "BSD-2-Clause" + }, + "node_modules/browserslist": { + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", + "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001718", + "electron-to-chromium": "^1.5.160", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/bufferutil": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.9.tgz", + "integrity": "sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001723", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001723.tgz", + "integrity": "sha512-1R/elMjtehrFejxwmexeXAtae5UO9iSyFn6G/I806CYC/BLyyBk1EPhrKBkWhy6wM6Xnm47dSJQec+tLJ39WHw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/case-sensitive-paths-webpack-plugin": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", + "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/check-types": { + "version": "11.2.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz", + "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==", + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "license": "MIT" + }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "license": "MIT" + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "license": "MIT", + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/coa/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/coa/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/coa/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/coa/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "license": "MIT" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.0.tgz", + "integrity": "sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.0.2", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/compute-scroll-into-view": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz", + "integrity": "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "license": "MIT" + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "license": "MIT", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, + "node_modules/core-js": { + "version": "3.43.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.43.0.tgz", + "integrity": "sha512-N6wEbTTZSYOY2rYAn85CuvWWkCK6QweMn7/4Nr3w+gDBeBhk/x4EJeY6FPo4QzDoJZxVTv8U7CMvgWk6pOHHqA==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.43.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.43.0.tgz", + "integrity": "sha512-2GML2ZsCc5LR7hZYz4AXmjQw8zuy2T//2QntwdnpuYI7jteT6GVYJL7F6C2C57R7gSYrcqVW3lAALefdbhBLDA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.25.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.43.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.43.0.tgz", + "integrity": "sha512-i/AgxU2+A+BbJdMxh3v7/vxi2SbFqxiFmg6VsDwYB4jkucrd1BZNA9a9gphC0fYMG5IBSgQcbQnk865VCLe7xA==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/css-blank-pseudo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", + "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-blank-pseudo": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-declaration-sorter": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-has-pseudo": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", + "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-has-pseudo": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", + "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", + "license": "MIT", + "dependencies": { + "cssnano": "^5.0.6", + "jest-worker": "^27.0.2", + "postcss": "^8.3.5", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", + "license": "CC0-1.0", + "bin": { + "css-prefers-color-scheme": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "license": "MIT" + }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "license": "MIT", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "license": "MIT" + }, + "node_modules/cssdb": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.2.tgz", + "integrity": "sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ], + "license": "CC0-1.0" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-default": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "license": "MIT", + "dependencies": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "license": "MIT", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "license": "CC0-1.0" + }, + "node_modules/csso/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "license": "MIT", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/d": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "license": "ISC", + "dependencies": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "license": "BSD-2-Clause" + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "license": "MIT", + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", + "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", + "license": "MIT" + }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + "license": "MIT" + }, + "node_modules/decode-named-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.1.0.tgz", + "integrity": "sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "license": "MIT" + }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" + }, + "node_modules/detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port-alt/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/detect-port-alt/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "license": "Apache-2.0" + }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "license": "MIT" + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "license": "MIT" + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "deprecated": "Use your platform's native DOMException instead", + "license": "MIT", + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=10" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "license": "BSD-2-Clause" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.167", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.167.tgz", + "integrity": "sha512-LxcRvnYO5ez2bMOFpbuuVuAI5QNeY1ncVytE/KXaL6ZNfzX1yPlAO0nSOyIHx2fVAuUprMqPs/TdVhUFZy7SIQ==", + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "license": "MIT", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "hasInstallScript": true, + "license": "ISC", + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "license": "ISC", + "dependencies": { + "d": "^1.0.2", + "ext": "^1.7.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-react-app": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", + "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.16.0", + "@babel/eslint-parser": "^7.16.3", + "@rushstack/eslint-patch": "^1.1.0", + "@typescript-eslint/eslint-plugin": "^5.5.0", + "@typescript-eslint/parser": "^5.5.0", + "babel-preset-react-app": "^10.0.1", + "confusing-browser-globals": "^1.0.11", + "eslint-plugin-flowtype": "^8.0.3", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jest": "^25.3.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.27.1", + "eslint-plugin-react-hooks": "^4.3.0", + "eslint-plugin-testing-library": "^5.0.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-flowtype": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", + "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", + "license": "BSD-3-Clause", + "dependencies": { + "lodash": "^4.17.21", + "string-natural-compare": "^3.0.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@babel/plugin-syntax-flow": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.9", + "eslint": "^8.1.0" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "25.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", + "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/experimental-utils": "^5.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-testing-library": { + "version": "5.11.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz", + "integrity": "sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^5.58.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0", + "npm": ">=6" + }, + "peerDependencies": { + "eslint": "^7.5.0 || ^8.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", + "license": "MIT", + "dependencies": { + "@types/eslint": "^7.29.0 || ^8.4.1", + "jest-worker": "^28.0.2", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", + "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "license": "ISC", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-equals": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.2.2.tgz", + "integrity": "sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/filesize": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", + "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=10", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/form-data": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz", + "integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", + "license": "Unlicense" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "license": "ISC" + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "license": "MIT" + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "license": "MIT" + }, + "node_modules/harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", + "license": "(Apache-2.0 OR MPL-1.1)" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", + "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "license": "MIT" + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz", + "integrity": "sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==", + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "license": "MIT", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", + "license": "ISC" + }, + "node_modules/identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + "license": "MIT", + "dependencies": { + "harmony-reflect": "^1.4.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", + "license": "MIT" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "license": "MIT" + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "license": "MIT" + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", + "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "license": "MIT", + "dependencies": { + "@jest/core": "^27.5.1", + "import-local": "^3.0.2", + "jest-cli": "^27.5.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", + "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "execa": "^5.0.0", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-circus": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", + "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-circus/node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-cli": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", + "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + "license": "MIT", + "dependencies": { + "@jest/core": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "prompts": "^2.0.1", + "yargs": "^16.2.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-cli/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-cli/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-config": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", + "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.8.0", + "@jest/test-sequencer": "^27.5.1", + "@jest/types": "^27.5.1", + "babel-jest": "^27.5.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.9", + "jest-circus": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-jasmine2": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-config/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-config/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-config/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/jest-docblock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", + "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", + "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-each/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", + "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", + "jsdom": "^16.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-environment-jsdom/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", + "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-environment-node/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-haste-map/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-haste-map/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-haste-map/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", + "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-jasmine2/node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-leak-detector": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", + "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "license": "MIT", + "dependencies": { + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-leak-detector/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-mock/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-mock/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", + "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-resolve/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-resolve/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", + "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "license": "MIT", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-leak-detector": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-runner/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", + "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-runtime/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-serializer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", + "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", + "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^27.5.1", + "semver": "^7.3.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-snapshot/node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-validate/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-watch-typeahead": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", + "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "jest-regex-util": "^28.0.0", + "jest-watcher": "^28.0.0", + "slash": "^4.0.0", + "string-length": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "jest": "^27.0.0 || ^28.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/console": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", + "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "slash": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/console/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/schemas": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", + "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/test-result": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "license": "MIT", + "dependencies": { + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/types": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", + "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "license": "MIT" + }, + "node_modules/jest-watch-typeahead/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/emittery": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", + "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-message-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-message-util/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-regex-util": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "license": "MIT", + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", + "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", + "license": "MIT", + "dependencies": { + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "jest-util": "^28.1.3", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/pretty-format": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^28.1.3", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/jest-watch-typeahead/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/string-length": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", + "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", + "license": "MIT", + "dependencies": { + "char-regex": "^2.0.0", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/string-length/node_modules/char-regex": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.2.tgz", + "integrity": "sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/jest-watcher": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", + "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "license": "MIT", + "dependencies": { + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.5.1", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-watcher/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-watcher/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-watcher/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "license": "MIT", + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/form-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.3.tgz", + "integrity": "sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "license": "MIT" + }, + "node_modules/json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "license": "MIT", + "dependencies": { + "string-convert": "^0.2.0" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonpath": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", + "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", + "license": "MIT", + "dependencies": { + "esprima": "1.2.2", + "static-eval": "2.0.2", + "underscore": "1.12.1" + } + }, + "node_modules/jsonpath/node_modules/esprima": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", + "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/launch-editor": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.10.0.tgz", + "integrity": "sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==", + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "license": "MIT" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "license": "MIT", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-definitions": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", + "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", + "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", + "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-definitions": "^5.0.0", + "micromark-util-sanitize-uri": "^1.1.0", + "trim-lines": "^3.0.0", + "unist-util-generated": "^2.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "license": "Unlicense", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", + "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-factory-destination": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", + "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", + "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", + "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", + "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", + "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", + "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", + "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", + "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", + "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "license": "MIT" + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "license": "ISC" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.20", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.20.tgz", + "integrity": "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==", + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz", + "integrity": "sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==", + "license": "MIT", + "dependencies": { + "array.prototype.reduce": "^1.0.6", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "gopd": "^1.0.1", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "license": "MIT" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.5.tgz", + "integrity": "sha512-d/jtm+rdNT8tpXuHY5MMtcbJFBkhXE6593XVR9UoGCH8jSFGci7jGvMGH5RYd5PBJW+00NZQt6gf7CbagJCrhg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", + "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-browser-comments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", + "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", + "license": "CC0-1.0", + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "browserslist": ">=4", + "postcss": ">=8" + } + }, + "node_modules/postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", + "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", + "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", + "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-colormin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-custom-media": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", + "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-custom-properties": { + "version": "12.1.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", + "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", + "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", + "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", + "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-env-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", + "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-flexbugs-fixes": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", + "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", + "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-within": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", + "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", + "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", + "license": "CC0-1.0", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-image-set-function": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", + "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-initial": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-lab-function": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", + "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-load-config/node_modules/yaml": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", + "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, + "node_modules/postcss-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-logical": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", + "license": "CC0-1.0", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-media-minmax": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "license": "MIT", + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-nesting": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", + "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-normalize": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz", + "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/normalize.css": "*", + "postcss-browser-comments": "^4", + "sanitize.css": "*" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "browserslist": ">= 4", + "postcss": ">= 8" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "license": "MIT", + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-opacity-percentage": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", + "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==", + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "license": "MIT", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", + "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", + "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-preset-env": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", + "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-cascade-layers": "^1.1.1", + "@csstools/postcss-color-function": "^1.1.1", + "@csstools/postcss-font-format-keywords": "^1.0.1", + "@csstools/postcss-hwb-function": "^1.0.2", + "@csstools/postcss-ic-unit": "^1.0.1", + "@csstools/postcss-is-pseudo-class": "^2.0.7", + "@csstools/postcss-nested-calc": "^1.0.0", + "@csstools/postcss-normalize-display-values": "^1.0.1", + "@csstools/postcss-oklab-function": "^1.1.1", + "@csstools/postcss-progressive-custom-properties": "^1.3.0", + "@csstools/postcss-stepped-value-functions": "^1.0.1", + "@csstools/postcss-text-decoration-shorthand": "^1.0.0", + "@csstools/postcss-trigonometric-functions": "^1.0.2", + "@csstools/postcss-unset-value": "^1.0.2", + "autoprefixer": "^10.4.13", + "browserslist": "^4.21.4", + "css-blank-pseudo": "^3.0.3", + "css-has-pseudo": "^3.0.4", + "css-prefers-color-scheme": "^6.0.3", + "cssdb": "^7.1.0", + "postcss-attribute-case-insensitive": "^5.0.2", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^4.2.4", + "postcss-color-hex-alpha": "^8.0.4", + "postcss-color-rebeccapurple": "^7.1.1", + "postcss-custom-media": "^8.0.2", + "postcss-custom-properties": "^12.1.10", + "postcss-custom-selectors": "^6.0.3", + "postcss-dir-pseudo-class": "^6.0.5", + "postcss-double-position-gradients": "^3.1.2", + "postcss-env-function": "^4.0.6", + "postcss-focus-visible": "^6.0.4", + "postcss-focus-within": "^5.0.4", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^3.0.5", + "postcss-image-set-function": "^4.0.7", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.2.1", + "postcss-logical": "^5.0.4", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.2.0", + "postcss-opacity-percentage": "^1.1.2", + "postcss-overflow-shorthand": "^3.0.4", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.5", + "postcss-pseudo-class-any-link": "^7.1.6", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", + "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-selector-not": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", + "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/postcss-svgo/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/postcss-svgo/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "license": "CC0-1.0" + }, + "node_modules/postcss-svgo/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-svgo/node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "license": "MIT", + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "license": "MIT", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "license": "MIT", + "dependencies": { + "performance-now": "^2.1.0" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rc-cascader": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.34.0.tgz", + "integrity": "sha512-KpXypcvju9ptjW9FaN2NFcA2QH9E9LHKq169Y0eWtH4e/wHQ5Wh5qZakAgvb8EKZ736WZ3B0zLLOBsrsja5Dag==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.7", + "classnames": "^2.3.1", + "rc-select": "~14.16.2", + "rc-tree": "~5.13.0", + "rc-util": "^5.43.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-checkbox": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-3.5.0.tgz", + "integrity": "sha512-aOAQc3E98HteIIsSqm6Xk2FPKIER6+5vyEFMZfo73TqM+VVAIqOkHoPjgKLqSNtVLWScoaM7vY2ZrGEheI79yg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.3.2", + "rc-util": "^5.25.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-collapse": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.9.0.tgz", + "integrity": "sha512-swDdz4QZ4dFTo4RAUMLL50qP0EY62N2kvmk2We5xYdRwcRn8WcYtuetCJpwpaCbUfUt5+huLpVxhvmnK+PHrkA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.3.4", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dialog": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.6.0.tgz", + "integrity": "sha512-ApoVi9Z8PaCQg6FsUzS8yvBEQy0ZL2PkuvAgrmohPkN3okps5WZ5WQWPc1RNuiOKaAYv8B97ACdsFU5LizzCqg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.0.0-8", + "classnames": "^2.2.6", + "rc-motion": "^2.3.0", + "rc-util": "^5.21.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-drawer": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-7.3.0.tgz", + "integrity": "sha512-DX6CIgiBWNpJIMGFO8BAISFkxiuKitoizooj4BDyee8/SnBn0zwO2FHrNDpqqepj0E/TFTDpmEBCyFuTgC7MOg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@rc-component/portal": "^1.1.1", + "classnames": "^2.2.6", + "rc-motion": "^2.6.1", + "rc-util": "^5.38.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dropdown": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.2.1.tgz", + "integrity": "sha512-YDAlXsPv3I1n42dv1JpdM7wJ+gSUBfeyPK59ZpBD9jQhK9jVuxpjj3NmWQHOBceA1zEPVX84T2wbdb2SD0UjmA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.6", + "rc-util": "^5.44.1" + }, + "peerDependencies": { + "react": ">=16.11.0", + "react-dom": ">=16.11.0" + } + }, + "node_modules/rc-field-form": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-2.7.0.tgz", + "integrity": "sha512-hgKsCay2taxzVnBPZl+1n4ZondsV78G++XVsMIJCAoioMjlMQR9YwAp7JZDIECzIu2Z66R+f4SFIRrO2DjDNAA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "@rc-component/async-validator": "^5.0.3", + "rc-util": "^5.32.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-image": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-7.12.0.tgz", + "integrity": "sha512-cZ3HTyyckPnNnUb9/DRqduqzLfrQRyi+CdHjdqgsyDpI3Ln5UX1kXnAhPBSJj9pVRzwRFgqkN7p9b6HBDjmu/Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/portal": "^1.0.2", + "classnames": "^2.2.6", + "rc-dialog": "~9.6.0", + "rc-motion": "^2.6.2", + "rc-util": "^5.34.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-input": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.8.0.tgz", + "integrity": "sha512-KXvaTbX+7ha8a/k+eg6SYRVERK0NddX8QX7a7AnRvUa/rEH0CNMlpcBzBkhI0wp2C8C4HlMoYl8TImSN+fuHKA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.18.1" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-input-number": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-9.5.0.tgz", + "integrity": "sha512-bKaEvB5tHebUURAEXw35LDcnRZLq3x1k7GxfAqBMzmpHkDGzjAtnUL8y4y5N15rIFIg5IJgwr211jInl3cipag==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/mini-decimal": "^1.0.1", + "classnames": "^2.2.5", + "rc-input": "~1.8.0", + "rc-util": "^5.40.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-mentions": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.20.0.tgz", + "integrity": "sha512-w8HCMZEh3f0nR8ZEd466ATqmXFCMGMN5UFCzEUL0bM/nGw/wOS2GgRzKBcm19K++jDyuWCOJOdgcKGXU3fXfbQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.22.5", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.6", + "rc-input": "~1.8.0", + "rc-menu": "~9.16.0", + "rc-textarea": "~1.10.0", + "rc-util": "^5.34.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-menu": { + "version": "9.16.1", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.16.1.tgz", + "integrity": "sha512-ghHx6/6Dvp+fw8CJhDUHFHDJ84hJE3BXNCzSgLdmNiFErWSOaZNsihDAsKq9ByTALo/xkNIwtDFGIl6r+RPXBg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^2.0.0", + "classnames": "2.x", + "rc-motion": "^2.4.3", + "rc-overflow": "^1.3.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-motion": { + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.5.tgz", + "integrity": "sha512-w+XTUrfh7ArbYEd2582uDrEhmBHwK1ZENJiSJVb7uRxdE7qJSYjbO2eksRXmndqyKqKoYPc9ClpPh5242mV1vA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.44.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-notification": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-5.6.4.tgz", + "integrity": "sha512-KcS4O6B4qzM3KH7lkwOB7ooLPZ4b6J+VMmQgT51VZCeEcmghdeR4IrMcFq0LG+RPdnbe/ArT086tGM8Snimgiw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.9.0", + "rc-util": "^5.20.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-overflow": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.4.1.tgz", + "integrity": "sha512-3MoPQQPV1uKyOMVNd6SZfONi+f3st0r8PksexIdBTeIYbMX0Jr+k7pHEDvsXtR4BpCv90/Pv2MovVNhktKrwvw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.37.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-pagination": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-5.1.0.tgz", + "integrity": "sha512-8416Yip/+eclTFdHXLKTxZvn70duYVGTvUUWbckCCZoIl3jagqke3GLsFrMs0bsQBikiYpZLD9206Ej4SOdOXQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.3.2", + "rc-util": "^5.38.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-picker": { + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.11.3.tgz", + "integrity": "sha512-MJ5teb7FlNE0NFHTncxXQ62Y5lytq6sh5nUw0iH8OkHL/TjARSEvSHpr940pWgjGANpjCwyMdvsEV55l5tYNSg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.1", + "rc-overflow": "^1.3.2", + "rc-resize-observer": "^1.4.0", + "rc-util": "^5.43.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "date-fns": ">= 2.x", + "dayjs": ">= 1.x", + "luxon": ">= 3.x", + "moment": ">= 2.x", + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + }, + "peerDependenciesMeta": { + "date-fns": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + } + } + }, + "node_modules/rc-progress": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-4.0.0.tgz", + "integrity": "sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-util": "^5.16.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-rate": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.13.1.tgz", + "integrity": "sha512-QUhQ9ivQ8Gy7mtMZPAjLbxBt5y9GRp65VcUyGUMF3N3fhiftivPHdpuDIaWIMOTEprAjZPC08bls1dQB+I1F2Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.0.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-resize-observer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.4.3.tgz", + "integrity": "sha512-YZLjUbyIWox8E9i9C3Tm7ia+W7euPItNWSPX5sCcQTYbnwDb5uNpnLHQCG1f22oZWUhLw4Mv2tFmeWe68CDQRQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.7", + "classnames": "^2.2.1", + "rc-util": "^5.44.1", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-segmented": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.7.0.tgz", + "integrity": "sha512-liijAjXz+KnTRVnxxXG2sYDGd6iLL7VpGGdR8gwoxAXy2KglviKCxLWZdjKYJzYzGSUwKDSTdYk8brj54Bn5BA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-motion": "^2.4.4", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-select": { + "version": "14.16.8", + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.16.8.tgz", + "integrity": "sha512-NOV5BZa1wZrsdkKaiK7LHRuo5ZjZYMDxPP6/1+09+FB4KoNi8jcG1ZqLE3AVCxEsYMBe65OBx71wFoHRTP3LRg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^2.1.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-overflow": "^1.3.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-slider": { + "version": "11.1.8", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-11.1.8.tgz", + "integrity": "sha512-2gg/72YFSpKP+Ja5AjC5DPL1YnV8DEITDQrcc1eASrUYjl0esptaBVJBh5nLTXCCp15eD8EuGjwezVGSHhs9tQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.36.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-steps": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-6.0.1.tgz", + "integrity": "sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.16.7", + "classnames": "^2.2.3", + "rc-util": "^5.16.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-switch": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-4.1.0.tgz", + "integrity": "sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.21.0", + "classnames": "^2.2.1", + "rc-util": "^5.30.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-table": { + "version": "7.51.0", + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.51.0.tgz", + "integrity": "sha512-7ZlvW6lB0IDKaSFInD6OfJsCepSJJtfsQv2PZLtzEeZd/PLzQnKliXPaoZqkqDdLdJ3jxE2x4sane4DjxcAg+g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/context": "^1.4.0", + "classnames": "^2.2.5", + "rc-resize-observer": "^1.1.0", + "rc-util": "^5.44.3", + "rc-virtual-list": "^3.14.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tabs": { + "version": "15.6.1", + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-15.6.1.tgz", + "integrity": "sha512-/HzDV1VqOsUWyuC0c6AkxVYFjvx9+rFPKZ32ejxX0Uc7QCzcEjTA9/xMgv4HemPKwzBNX8KhGVbbumDjnj92aA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.2", + "classnames": "2.x", + "rc-dropdown": "~4.2.0", + "rc-menu": "~9.16.0", + "rc-motion": "^2.6.2", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.34.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-textarea": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.10.0.tgz", + "integrity": "sha512-ai9IkanNuyBS4x6sOL8qu/Ld40e6cEs6pgk93R+XLYg0mDSjNBGey6/ZpDs5+gNLD7urQ14po3V6Ck2dJLt9SA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-input": "~1.8.0", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tooltip": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.4.0.tgz", + "integrity": "sha512-kqyivim5cp8I5RkHmpsp1Nn/Wk+1oeloMv9c7LXNgDxUpGm+RbXJGL+OPvDlcRnx9DBeOe4wyOIl4OKUERyH1g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.3.1", + "rc-util": "^5.44.3" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tree": { + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.13.1.tgz", + "integrity": "sha512-FNhIefhftobCdUJshO7M8uZTA9F4OPGVXqGfZkkD/5soDeOhwO06T/aKTrg0WD8gRg/pyfq+ql3aMymLHCTC4A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.1" + }, + "engines": { + "node": ">=10.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-tree-select": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.27.0.tgz", + "integrity": "sha512-2qTBTzwIT7LRI1o7zLyrCzmo5tQanmyGbSaGTIf7sYimCklAToVVfpMC6OAldSKolcnjorBYPNSKQqJmN3TCww==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.7", + "classnames": "2.x", + "rc-select": "~14.16.2", + "rc-tree": "~5.13.0", + "rc-util": "^5.43.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-upload": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.9.2.tgz", + "integrity": "sha512-nHx+9rbd1FKMiMRYsqQ3NkXUv7COHPBo3X1Obwq9SWS6/diF/A0aJ5OHubvwUAIDs+4RMleljV0pcrNUc823GQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.5", + "rc-util": "^5.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util": { + "version": "5.44.4", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.44.4.tgz", + "integrity": "sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "react-is": "^18.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/rc-virtual-list": { + "version": "3.18.6", + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.18.6.tgz", + "integrity": "sha512-TQ5SsutL3McvWmmxqQtMIbfeoE3dGjJrRSfKekgby7WQMpPIFvv4ghytp5Z0s3D8Nik9i9YNOCqHBfk86AwgAA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.0", + "classnames": "^2.2.6", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.36.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-app-polyfill": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", + "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==", + "license": "MIT", + "dependencies": { + "core-js": "^3.19.2", + "object-assign": "^4.1.1", + "promise": "^8.1.0", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.9", + "whatwg-fetch": "^3.6.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-dev-utils": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.11", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-dev-utils/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/loader-utils": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/react-dev-utils/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-error-overlay": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.1.0.tgz", + "integrity": "sha512-SN/U6Ytxf1QGkw/9ve5Y+NxBbZM6Ht95tuXNMKs8EJyFa/Vy/+Co3stop3KBHARfn/giv+Lj1uUnTfOJ3moFEQ==", + "license": "MIT" + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "license": "MIT" + }, + "node_modules/react-markdown": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.7.tgz", + "integrity": "sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/prop-types": "^15.0.0", + "@types/unist": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^2.0.0", + "prop-types": "^15.0.0", + "property-information": "^6.0.0", + "react-is": "^18.0.0", + "remark-parse": "^10.0.0", + "remark-rehype": "^10.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.0", + "unified": "^10.0.0", + "unist-util-visit": "^4.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/react-markdown/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/react-refresh": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", + "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "6.30.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.1.tgz", + "integrity": "sha512-X1m21aEmxGXqENEPG3T6u0Th7g0aS4ZmoNynhbs+Cn+q+QGTLt+d5IQ2bHAXKzKcxGJjxACpVbnYQSCRcfxHlQ==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.30.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.1.tgz", + "integrity": "sha512-llKsgOkZdbPU1Eg3zK8lCn+sjD9wMRZZPuzmdWWX5SUs8OFkN5HnFVC0u5KMeMaC9aoancFI/KoLuKPqN+hxHw==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.0", + "react-router": "6.30.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-scripts": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", + "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.16.0", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", + "@svgr/webpack": "^5.5.0", + "babel-jest": "^27.4.2", + "babel-loader": "^8.2.3", + "babel-plugin-named-asset-import": "^0.3.8", + "babel-preset-react-app": "^10.0.1", + "bfj": "^7.0.2", + "browserslist": "^4.18.1", + "camelcase": "^6.2.1", + "case-sensitive-paths-webpack-plugin": "^2.4.0", + "css-loader": "^6.5.1", + "css-minimizer-webpack-plugin": "^3.2.0", + "dotenv": "^10.0.0", + "dotenv-expand": "^5.1.0", + "eslint": "^8.3.0", + "eslint-config-react-app": "^7.0.1", + "eslint-webpack-plugin": "^3.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^10.0.0", + "html-webpack-plugin": "^5.5.0", + "identity-obj-proxy": "^3.0.0", + "jest": "^27.4.3", + "jest-resolve": "^27.4.2", + "jest-watch-typeahead": "^1.0.0", + "mini-css-extract-plugin": "^2.4.5", + "postcss": "^8.4.4", + "postcss-flexbugs-fixes": "^5.0.2", + "postcss-loader": "^6.2.1", + "postcss-normalize": "^10.0.1", + "postcss-preset-env": "^7.0.1", + "prompts": "^2.4.2", + "react-app-polyfill": "^3.0.0", + "react-dev-utils": "^12.0.1", + "react-refresh": "^0.11.0", + "resolve": "^1.20.0", + "resolve-url-loader": "^4.0.0", + "sass-loader": "^12.3.0", + "semver": "^7.3.5", + "source-map-loader": "^3.0.0", + "style-loader": "^3.3.1", + "tailwindcss": "^3.0.2", + "terser-webpack-plugin": "^5.2.5", + "webpack": "^5.64.4", + "webpack-dev-server": "^4.6.0", + "webpack-manifest-plugin": "^4.0.2", + "workbox-webpack-plugin": "^6.4.1" + }, + "bin": { + "react-scripts": "bin/react-scripts.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + }, + "peerDependencies": { + "react": ">= 16", + "typescript": "^3.2.1 || ^4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/react-smooth": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.4.tgz", + "integrity": "sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==", + "license": "MIT", + "dependencies": { + "fast-equals": "^5.0.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recharts": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.3.tgz", + "integrity": "sha512-EdOPzTwcFSuqtvkDoaM5ws/Km1+WTAO2eizL7rqiG0V2UVhTnz0m7J2i0CjVPUCdEkZImaWvXLbZDS2H5t6GFQ==", + "license": "MIT", + "dependencies": { + "clsx": "^2.0.0", + "eventemitter3": "^4.0.1", + "lodash": "^4.17.21", + "react-is": "^18.3.1", + "react-smooth": "^4.0.4", + "recharts-scale": "^0.4.4", + "tiny-invariant": "^1.3.1", + "victory-vendor": "^36.6.8" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/recharts-scale": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", + "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", + "license": "MIT", + "dependencies": { + "decimal.js-light": "^2.4.1" + } + }, + "node_modules/recharts/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "license": "MIT" + }, + "node_modules/regex-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.1.tgz", + "integrity": "sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==", + "license": "MIT" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-parse": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", + "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", + "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-to-hast": "^12.1.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-url-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", + "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", + "license": "MIT", + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^7.0.35", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=8.9" + }, + "peerDependencies": { + "rework": "1.0.1", + "rework-visit": "1.0.0" + }, + "peerDependenciesMeta": { + "rework": { + "optional": true + }, + "rework-visit": { + "optional": true + } + } + }, + "node_modules/resolve-url-loader/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/resolve-url-loader/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "license": "ISC" + }, + "node_modules/resolve-url-loader/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve.exports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", + "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", + "license": "MIT", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "license": "MIT", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sanitize.css": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", + "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==", + "license": "CC0-1.0" + }, + "node_modules/sass-loader": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", + "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "license": "MIT", + "dependencies": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "license": "ISC" + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/schema-utils": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/scroll-into-view-if-needed": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", + "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==", + "license": "MIT", + "dependencies": { + "compute-scroll-into-view": "^3.0.2" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "license": "ISC" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz", + "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==", + "license": "MIT", + "dependencies": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "license": "MIT" + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "license": "MIT" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "license": "MIT" + }, + "node_modules/static-eval": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", + "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", + "license": "MIT", + "dependencies": { + "escodegen": "^1.8.1" + } + }, + "node_modules/static-eval/node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/static-eval/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/static-eval/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "license": "MIT", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-eval/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==", + "license": "MIT" + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-natural-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==", + "license": "MIT" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-loader": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/style-to-object": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", + "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/styled-components": { + "version": "6.1.19", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.19.tgz", + "integrity": "sha512-1v/e3Dl1BknC37cXMhwGomhO8AkYmN41CqyX9xhUDxry1ns3BFQy2lLDRQXJRdVVWB9OHemv/53xaStimvWyuA==", + "license": "MIT", + "dependencies": { + "@emotion/is-prop-valid": "1.2.2", + "@emotion/unitless": "0.8.1", + "@types/stylis": "4.2.5", + "css-to-react-native": "3.2.0", + "csstype": "3.1.3", + "postcss": "8.4.49", + "shallowequal": "1.1.0", + "stylis": "4.3.2", + "tslib": "2.6.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0" + } + }, + "node_modules/styled-components/node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==", + "license": "MIT" + }, + "node_modules/styled-components/node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/styled-components/node_modules/stylis": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", + "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==", + "license": "MIT" + }, + "node_modules/styled-components/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "license": "0BSD" + }, + "node_modules/stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/stylis": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "license": "MIT" + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "license": "MIT" + }, + "node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", + "license": "MIT", + "dependencies": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/svgo/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/svgo/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/svgo/node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/svgo/node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/svgo/node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/svgo/node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "license": "BSD-2-Clause" + }, + "node_modules/svgo/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/svgo/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/svgo/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "license": "MIT" + }, + "node_modules/tailwindcss": { + "version": "3.4.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.6", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/tapable": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", + "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tempy": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", + "license": "MIT", + "dependencies": { + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.42.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.42.0.tgz", + "integrity": "sha512-UYCvU9YQW2f/Vwl+P0GfhxJxbUGLwd+5QrrGgLajzWAtC/23AX0vcise32kkP7Eu0Wu9VlzzHAXkLObgjQfFlQ==", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.14.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "license": "MIT" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throat": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", + "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==", + "license": "MIT" + }, + "node_modules/throttle-debounce": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz", + "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", + "license": "MIT", + "engines": { + "node": ">=12.22" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "license": "MIT" + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==", + "license": "MIT" + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "license": "MIT" + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "license": "Apache-2.0" + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/type": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", + "license": "ISC" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", + "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "license": "MIT", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/unist-util-generated": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", + "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", + "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==", + "license": "MIT" + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "license": "MIT", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/uvu": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", + "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0", + "diff": "^5.0.0", + "kleur": "^4.0.3", + "sade": "^1.7.3" + }, + "bin": { + "uvu": "bin.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/uvu/node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/v8-to-istanbul": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", + "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "license": "ISC", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/victory-vendor": { + "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz", + "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==", + "license": "MIT AND ISC", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "license": "MIT", + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "license": "MIT", + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=10.4" + } + }, + "node_modules/webpack": { + "version": "5.99.9", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.9.tgz", + "integrity": "sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==", + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.4", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", + "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-manifest-plugin": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", + "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==", + "license": "MIT", + "dependencies": { + "tapable": "^2.0.0", + "webpack-sources": "^2.2.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "peerDependencies": { + "webpack": "^4.44.2 || ^5.47.0" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/webpack-sources": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", + "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", + "license": "MIT", + "dependencies": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.2.tgz", + "integrity": "sha512-ykKKus8lqlgXX/1WjudpIEjqsafjOTcOJqxnAbMLAu/KCsDCJ6GBtvscewvTkrn24HsnvFwrSCbenFrhtcCsAA==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/websocket": { + "version": "1.0.35", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.35.tgz", + "integrity": "sha512-/REy6amwPZl44DDzvRCkaI1q1bIiQB0mEFQLUrhz3z2EK91cp3n72rAjUlrTP0zV22HJIUOVHQGPxhFRjxjt+Q==", + "license": "Apache-2.0", + "dependencies": { + "bufferutil": "^4.0.1", + "debug": "^2.2.0", + "es5-ext": "^0.10.63", + "typedarray-to-buffer": "^3.1.5", + "utf-8-validate": "^5.0.2", + "yaeti": "^0.0.6" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/websocket/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", + "license": "MIT" + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "license": "MIT" + }, + "node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "license": "MIT", + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workbox-background-sync": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz", + "integrity": "sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==", + "license": "MIT", + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-broadcast-update": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz", + "integrity": "sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-build": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz", + "integrity": "sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==", + "license": "MIT", + "dependencies": { + "@apideck/better-ajv-errors": "^0.3.1", + "@babel/core": "^7.11.1", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^11.2.1", + "@rollup/plugin-replace": "^2.4.1", + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + "ajv": "^8.6.0", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "lodash": "^4.17.20", + "pretty-bytes": "^5.3.0", + "rollup": "^2.43.1", + "rollup-plugin-terser": "^7.0.0", + "source-map": "^0.8.0-beta.0", + "stringify-object": "^3.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", + "upath": "^1.2.0", + "workbox-background-sync": "6.6.0", + "workbox-broadcast-update": "6.6.0", + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-google-analytics": "6.6.0", + "workbox-navigation-preload": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-range-requests": "6.6.0", + "workbox-recipes": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0", + "workbox-streams": "6.6.0", + "workbox-sw": "6.6.0", + "workbox-window": "6.6.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", + "license": "MIT", + "dependencies": { + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "ajv": ">=8" + } + }, + "node_modules/workbox-build/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/workbox-build/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/workbox-build/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/workbox-build/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "license": "BSD-3-Clause", + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/workbox-build/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "license": "MIT", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/workbox-build/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "license": "BSD-2-Clause" + }, + "node_modules/workbox-build/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/workbox-cacheable-response": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz", + "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==", + "deprecated": "workbox-background-sync@6.6.0", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-core": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz", + "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==", + "license": "MIT" + }, + "node_modules/workbox-expiration": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz", + "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==", + "license": "MIT", + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-google-analytics": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz", + "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==", + "deprecated": "It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained", + "license": "MIT", + "dependencies": { + "workbox-background-sync": "6.6.0", + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "node_modules/workbox-navigation-preload": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz", + "integrity": "sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-precaching": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz", + "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "node_modules/workbox-range-requests": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz", + "integrity": "sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-recipes": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz", + "integrity": "sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==", + "license": "MIT", + "dependencies": { + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "node_modules/workbox-routing": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz", + "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-strategies": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz", + "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-streams": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz", + "integrity": "sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0" + } + }, + "node_modules/workbox-sw": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz", + "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==", + "license": "MIT" + }, + "node_modules/workbox-webpack-plugin": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.0.tgz", + "integrity": "sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==", + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "^2.1.0", + "pretty-bytes": "^5.4.1", + "upath": "^1.2.0", + "webpack-sources": "^1.4.3", + "workbox-build": "6.6.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "webpack": "^4.4.0 || ^5.9.0" + } + }, + "node_modules/workbox-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workbox-webpack-plugin/node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "license": "MIT", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/workbox-window": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz", + "integrity": "sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==", + "license": "MIT", + "dependencies": { + "@types/trusted-types": "^2.0.2", + "workbox-core": "6.6.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "license": "Apache-2.0" + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "license": "MIT" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "license": "MIT", + "engines": { + "node": ">=0.10.32" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/web/frontend/package.json b/web/frontend/package.json new file mode 100644 index 00000000..a0a92303 --- /dev/null +++ b/web/frontend/package.json @@ -0,0 +1,47 @@ +{ + "name": "tradingagents-web-frontend", + "version": "0.1.0", + "private": true, + "dependencies": { + "@testing-library/jest-dom": "^5.16.4", + "@testing-library/react": "^13.3.0", + "@testing-library/user-event": "^13.5.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-scripts": "5.0.1", + "react-router-dom": "^6.4.0", + "axios": "^1.5.0", + "antd": "^5.10.0", + "@ant-design/icons": "^5.2.6", + "styled-components": "^6.0.8", + "dayjs": "^1.11.9", + "react-markdown": "^8.0.7", + "websocket": "^1.0.34", + "recharts": "^2.8.0" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "proxy": "http://localhost:8000" +} \ No newline at end of file diff --git a/web/frontend/public/index.html b/web/frontend/public/index.html new file mode 100644 index 00000000..e3c457ca --- /dev/null +++ b/web/frontend/public/index.html @@ -0,0 +1,20 @@ + + + + + + + + + + + TradingAgents - AI ๊ฑฐ๋ž˜ ๋ถ„์„ ํ”Œ๋žซํผ + + + +
+ + \ No newline at end of file diff --git a/web/frontend/src/App.js b/web/frontend/src/App.js new file mode 100644 index 00000000..2c896455 --- /dev/null +++ b/web/frontend/src/App.js @@ -0,0 +1,96 @@ +import React from 'react'; +import { BrowserRouter as Router, Routes, Route, Navigate } from 'react-router-dom'; +import { ConfigProvider } from 'antd'; +import koKR from 'antd/locale/ko_KR'; +import { AuthProvider, useAuth } from './contexts/AuthContext'; +import { WebSocketProvider } from './contexts/WebSocketContext'; +import { ThemeProvider } from 'styled-components'; +import GlobalStyle from './styles/GlobalStyle'; +import theme from './styles/theme'; + +// Components +import Layout from './components/Layout/Layout'; +import Login from './pages/Login/Login'; +import Register from './pages/Register/Register'; +import Dashboard from './pages/Dashboard/Dashboard'; +import Analysis from './pages/Analysis/Analysis'; +import History from './pages/History/History'; +import Profile from './pages/Profile/Profile'; +import Loading from './components/Loading/Loading'; + +// Protected Route Component +const ProtectedRoute = ({ children }) => { + const { user, loading } = useAuth(); + + if (loading) { + return ; + } + + return user ? children : ; +}; + +// Public Route Component (redirect to dashboard if already logged in) +const PublicRoute = ({ children }) => { + const { user, loading } = useAuth(); + + if (loading) { + return ; + } + + return !user ? children : ; +}; + +function App() { + return ( + + + + + + + {/* Public Routes */} + + + + } + /> + + + + } + /> + + {/* Protected Routes */} + + + + + } /> + } /> + } /> + } /> + } /> + + + + + } + /> + + + + + + ); +} + +export default App; \ No newline at end of file diff --git a/web/frontend/src/components/Layout/Layout.js b/web/frontend/src/components/Layout/Layout.js new file mode 100644 index 00000000..c687ec37 --- /dev/null +++ b/web/frontend/src/components/Layout/Layout.js @@ -0,0 +1,262 @@ +import React, { useState } from 'react'; +import { Layout as AntLayout, Menu, Avatar, Dropdown, Button, Badge, Typography } from 'antd'; +import { + DashboardOutlined, + LineChartOutlined, + HistoryOutlined, + UserOutlined, + LogoutOutlined, + MenuFoldOutlined, + MenuUnfoldOutlined, + BellOutlined, + WifiOutlined, + DisconnectOutlined +} from '@ant-design/icons'; +import { useLocation, useNavigate } from 'react-router-dom'; +import { useAuth } from '../../contexts/AuthContext'; +import { useWebSocket } from '../../contexts/WebSocketContext'; +import styled from 'styled-components'; + +const { Header, Sider, Content } = AntLayout; +const { Title } = Typography; + +const StyledLayout = styled(AntLayout)` + min-height: 100vh; +`; + +const StyledHeader = styled(Header)` + background: ${props => props.theme.colors.background}; + border-bottom: 1px solid ${props => props.theme.colors.borderLight}; + padding: 0 ${props => props.theme.spacing.lg}; + display: flex; + align-items: center; + justify-content: space-between; + position: sticky; + top: 0; + z-index: ${props => props.theme.zIndex.sticky}; +`; + +const StyledSider = styled(Sider)` + background: ${props => props.theme.colors.background}; + border-right: 1px solid ${props => props.theme.colors.borderLight}; + + .ant-layout-sider-trigger { + background: ${props => props.theme.colors.backgroundSecondary}; + border-top: 1px solid ${props => props.theme.colors.borderLight}; + color: ${props => props.theme.colors.text}; + } +`; + +const StyledContent = styled(Content)` + background: ${props => props.theme.colors.backgroundSecondary}; + padding: ${props => props.theme.spacing.lg}; + overflow-y: auto; +`; + +const HeaderLeft = styled.div` + display: flex; + align-items: center; + gap: ${props => props.theme.spacing.md}; +`; + +const HeaderRight = styled.div` + display: flex; + align-items: center; + gap: ${props => props.theme.spacing.md}; +`; + +const Logo = styled.div` + display: flex; + align-items: center; + gap: ${props => props.theme.spacing.sm}; + font-weight: ${props => props.theme.typography.fontWeight.bold}; + font-size: ${props => props.theme.typography.fontSize.lg}; + color: ${props => props.theme.colors.primary}; +`; + +const ConnectionStatus = styled.div` + display: flex; + align-items: center; + gap: ${props => props.theme.spacing.xs}; + font-size: ${props => props.theme.typography.fontSize.sm}; + color: ${props => props.connected ? props.theme.colors.success : props.theme.colors.error}; +`; + +const UserInfo = styled.div` + display: flex; + align-items: center; + gap: ${props => props.theme.spacing.sm}; +`; + +const MainLayout = ({ children }) => { + const [collapsed, setCollapsed] = useState(false); + const { user, logout } = useAuth(); + const { connected, reconnectAttempts, maxReconnectAttempts } = useWebSocket(); + const location = useLocation(); + const navigate = useNavigate(); + + // ๋ฉ”๋‰ด ์•„์ดํ…œ ์ •์˜ + const menuItems = [ + { + key: '/dashboard', + icon: , + label: '๋Œ€์‹œ๋ณด๋“œ', + }, + { + key: '/analysis', + icon: , + label: '๋ถ„์„ ์‹œ์ž‘', + }, + { + key: '/history', + icon: , + label: '๋ถ„์„ ๊ธฐ๋ก', + }, + { + key: '/profile', + icon: , + label: 'ํ”„๋กœํ•„', + }, + ]; + + // ์‚ฌ์šฉ์ž ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด + const userMenuItems = [ + { + key: 'profile', + icon: , + label: 'ํ”„๋กœํ•„', + onClick: () => navigate('/profile'), + }, + { + type: 'divider', + }, + { + key: 'logout', + icon: , + label: '๋กœ๊ทธ์•„์›ƒ', + onClick: logout, + }, + ]; + + const handleMenuClick = ({ key }) => { + navigate(key); + }; + + const toggleCollapsed = () => { + setCollapsed(!collapsed); + }; + + return ( + + +
+ {!collapsed ? ( + + + TradingAgents + + ) : ( +
+ +
+ )} +
+ + + + + + + + + + ) + } + ]; + + if (loading) { + return ; + } + + return ( + + {/* ํ™˜์˜ ๋ฉ”์‹œ์ง€ */} + + + + + ์•ˆ๋…•ํ•˜์„ธ์š”, {user?.first_name || user?.username}๋‹˜! ๐Ÿ‘‹ + + + AI ๊ธฐ๋ฐ˜ ๊ฑฐ๋ž˜ ๋ถ„์„์œผ๋กœ ๋” ๋‚˜์€ ํˆฌ์ž ๊ฒฐ์ •์„ ๋‚ด๋ ค๋ณด์„ธ์š”. + + + + + + + + + + + {/* ํ†ต๊ณ„ ์นด๋“œ๋“ค */} + + + + } + /> + + + + + } + valueStyle={{ color: '#1890ff' }} + /> + + + + + } + valueStyle={{ color: '#52c41a' }} + /> + + + + + } + /> + + + + + {/* ์ตœ๊ทผ ๋ถ„์„ */} + navigate('/history')}> + ๋ชจ๋‘ ๋ณด๊ธฐ + + } + > + {recentAnalyses.length > 0 ? ( + + ) : ( +
+ ์•„์ง ๋ถ„์„ ๊ธฐ๋ก์ด ์—†์Šต๋‹ˆ๋‹ค. +
+ +
+ )} + + + {/* WebSocket ์—ฐ๊ฒฐ ์ƒํƒœ ์ •๋ณด */} + {!connected && ( + + + ์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ ์—ฐ๊ฒฐ์ด ๋Š์–ด์กŒ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ๊ธฐ๋Šฅ์ด ์ œํ•œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + + + )} + + ); +}; + +export default Dashboard; \ No newline at end of file diff --git a/web/frontend/src/pages/History/History.js b/web/frontend/src/pages/History/History.js new file mode 100644 index 00000000..a0c6fde8 --- /dev/null +++ b/web/frontend/src/pages/History/History.js @@ -0,0 +1,33 @@ +import React from 'react'; +import { Card, Typography } from 'antd'; +import styled from 'styled-components'; + +const { Title, Text } = Typography; + +const HistoryContainer = styled.div` + max-width: 1200px; + margin: 0 auto; +`; + +const PlaceholderCard = styled(Card)` + text-align: center; + padding: ${props => props.theme.spacing.xl}; + background: linear-gradient(135deg, #f0f2f5 0%, #e6f7ff 100%); +`; + +const History = () => { + return ( + + + ๋ถ„์„ ๊ธฐ๋ก ํŽ˜์ด์ง€ + + ์—ฌ๊ธฐ์— ์‚ฌ์šฉ์ž์˜ ๋ชจ๋“  ๋ถ„์„ ๊ธฐ๋ก์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. +
+ ํ…Œ์ด๋ธ” ํ˜•ํƒœ๋กœ ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๊ณ  ํ•„ํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +
+
+
+ ); +}; + +export default History; \ No newline at end of file diff --git a/web/frontend/src/pages/Login/Login.js b/web/frontend/src/pages/Login/Login.js new file mode 100644 index 00000000..8f6d5f7c --- /dev/null +++ b/web/frontend/src/pages/Login/Login.js @@ -0,0 +1,197 @@ +import React, { useState } from 'react'; +import { Form, Input, Button, Card, Typography, Alert, Divider } from 'antd'; +import { UserOutlined, LockOutlined, LineChartOutlined } from '@ant-design/icons'; +import { Link, useNavigate } from 'react-router-dom'; +import { useAuth } from '../../contexts/AuthContext'; +import styled from 'styled-components'; + +const { Title, Text } = Typography; + +const LoginContainer = styled.div` + min-height: 100vh; + display: flex; + align-items: center; + justify-content: center; + background: linear-gradient(135deg, #1890ff 0%, #722ed1 100%); + padding: ${props => props.theme.spacing.lg}; +`; + +const LoginCard = styled(Card)` + width: 100%; + max-width: 400px; + box-shadow: ${props => props.theme.shadows.xl}; + border: none; + border-radius: ${props => props.theme.borderRadius.lg}; +`; + +const LogoSection = styled.div` + text-align: center; + margin-bottom: ${props => props.theme.spacing.xl}; +`; + +const Logo = styled.div` + display: flex; + align-items: center; + justify-content: center; + gap: ${props => props.theme.spacing.sm}; + margin-bottom: ${props => props.theme.spacing.md}; +`; + +const LogoIcon = styled(LineChartOutlined)` + font-size: 32px; + color: ${props => props.theme.colors.primary}; +`; + +const LogoText = styled(Title)` + margin: 0; + color: ${props => props.theme.colors.primary}; + font-weight: ${props => props.theme.typography.fontWeight.bold}; +`; + +const SubTitle = styled(Text)` + color: ${props => props.theme.colors.textSecondary}; + font-size: ${props => props.theme.typography.fontSize.base}; +`; + +const StyledForm = styled(Form)` + .ant-form-item { + margin-bottom: ${props => props.theme.spacing.lg}; + } +`; + +const LoginButton = styled(Button)` + width: 100%; + height: 44px; + font-size: ${props => props.theme.typography.fontSize.base}; + font-weight: ${props => props.theme.typography.fontWeight.medium}; +`; + +const RegisterLink = styled.div` + text-align: center; + margin-top: ${props => props.theme.spacing.lg}; + color: ${props => props.theme.colors.textSecondary}; +`; + +const Login = () => { + const [form] = Form.useForm(); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(''); + const { login } = useAuth(); + const navigate = useNavigate(); + + const handleSubmit = async (values) => { + setLoading(true); + setError(''); + + try { + const result = await login(values.email, values.password); + + if (result.success) { + navigate('/dashboard'); + } else { + setError(result.error || '๋กœ๊ทธ์ธ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.'); + } + } catch (error) { + setError('๋กœ๊ทธ์ธ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.'); + } finally { + setLoading(false); + } + }; + + const handleFormChange = () => { + if (error) { + setError(''); + } + }; + + return ( + + + + + + TradingAgents + + AI ๊ฑฐ๋ž˜ ๋ถ„์„ ํ”Œ๋žซํผ์— ๋กœ๊ทธ์ธํ•˜์„ธ์š” + + + {error && ( + + )} + + + + } + placeholder="์ด๋ฉ”์ผ์„ ์ž…๋ ฅํ•˜์„ธ์š”" + autoComplete="email" + /> + + + + } + placeholder="๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”" + autoComplete="current-password" + /> + + + + + ๋กœ๊ทธ์ธ + + + + + ๋˜๋Š” + + + ๊ณ„์ •์ด ์—†์œผ์‹ ๊ฐ€์š”?{' '} + + ํšŒ์›๊ฐ€์ž… + + + + + ); +}; + +export default Login; \ No newline at end of file diff --git a/web/frontend/src/pages/Profile/Profile.js b/web/frontend/src/pages/Profile/Profile.js new file mode 100644 index 00000000..12349a5f --- /dev/null +++ b/web/frontend/src/pages/Profile/Profile.js @@ -0,0 +1,33 @@ +import React from 'react'; +import { Card, Typography } from 'antd'; +import styled from 'styled-components'; + +const { Title, Text } = Typography; + +const ProfileContainer = styled.div` + max-width: 800px; + margin: 0 auto; +`; + +const PlaceholderCard = styled(Card)` + text-align: center; + padding: ${props => props.theme.spacing.xl}; + background: linear-gradient(135deg, #f0f2f5 0%, #e6f7ff 100%); +`; + +const Profile = () => { + return ( + + + ํ”„๋กœํ•„ ์„ค์ • ํŽ˜์ด์ง€ + + ์—ฌ๊ธฐ์— ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ์„ค์ • ๊ธฐ๋Šฅ์ด ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. +
+ ๊ฐœ์ธ์ •๋ณด ์ˆ˜์ •, OpenAI API ํ‚ค ์„ค์ •, ๊ธฐ๋ณธ ๋ถ„์„ ์˜ต์…˜ ์„ค์ • ๋“ฑ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. +
+
+
+ ); +}; + +export default Profile; \ No newline at end of file diff --git a/web/frontend/src/pages/Register/Register.js b/web/frontend/src/pages/Register/Register.js new file mode 100644 index 00000000..4311a8f8 --- /dev/null +++ b/web/frontend/src/pages/Register/Register.js @@ -0,0 +1,298 @@ +import React, { useState } from 'react'; +import { Form, Input, Button, Card, Typography, Alert, Divider } from 'antd'; +import { UserOutlined, LockOutlined, MailOutlined, LineChartOutlined } from '@ant-design/icons'; +import { Link, useNavigate } from 'react-router-dom'; +import { useAuth } from '../../contexts/AuthContext'; +import styled from 'styled-components'; + +const { Title, Text } = Typography; + +const RegisterContainer = styled.div` + min-height: 100vh; + display: flex; + align-items: center; + justify-content: center; + background: linear-gradient(135deg, #1890ff 0%, #722ed1 100%); + padding: ${props => props.theme.spacing.lg}; +`; + +const RegisterCard = styled(Card)` + width: 100%; + max-width: 450px; + box-shadow: ${props => props.theme.shadows.xl}; + border: none; + border-radius: ${props => props.theme.borderRadius.lg}; +`; + +const LogoSection = styled.div` + text-align: center; + margin-bottom: ${props => props.theme.spacing.xl}; +`; + +const Logo = styled.div` + display: flex; + align-items: center; + justify-content: center; + gap: ${props => props.theme.spacing.sm}; + margin-bottom: ${props => props.theme.spacing.md}; +`; + +const LogoIcon = styled(LineChartOutlined)` + font-size: 32px; + color: ${props => props.theme.colors.primary}; +`; + +const LogoText = styled(Title)` + margin: 0; + color: ${props => props.theme.colors.primary}; + font-weight: ${props => props.theme.typography.fontWeight.bold}; +`; + +const SubTitle = styled(Text)` + color: ${props => props.theme.colors.textSecondary}; + font-size: ${props => props.theme.typography.fontSize.base}; +`; + +const StyledForm = styled(Form)` + .ant-form-item { + margin-bottom: ${props => props.theme.spacing.md}; + } +`; + +const RegisterButton = styled(Button)` + width: 100%; + height: 44px; + font-size: ${props => props.theme.typography.fontSize.base}; + font-weight: ${props => props.theme.typography.fontWeight.medium}; +`; + +const LoginLink = styled.div` + text-align: center; + margin-top: ${props => props.theme.spacing.lg}; + color: ${props => props.theme.colors.textSecondary}; +`; + +const Register = () => { + const [form] = Form.useForm(); + const [loading, setLoading] = useState(false); + const [errors, setErrors] = useState({}); + const { register } = useAuth(); + const navigate = useNavigate(); + + const handleSubmit = async (values) => { + setLoading(true); + setErrors({}); + + try { + const result = await register({ + email: values.email, + username: values.username, + first_name: values.firstName, + last_name: values.lastName, + password: values.password, + password_confirm: values.confirmPassword, + }); + + if (result.success) { + navigate('/dashboard'); + } else { + if (result.error && typeof result.error === 'object') { + setErrors(result.error); + } else { + setErrors({ general: result.error || 'ํšŒ์›๊ฐ€์ž…์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.' }); + } + } + } catch (error) { + setErrors({ general: 'ํšŒ์›๊ฐ€์ž… ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.' }); + } finally { + setLoading(false); + } + }; + + const handleFormChange = () => { + if (Object.keys(errors).length > 0) { + setErrors({}); + } + }; + + // ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ํฌ๋งทํŒ… + const getErrorMessage = (fieldName) => { + const error = errors[fieldName]; + if (Array.isArray(error)) { + return error[0]; + } + return error; + }; + + return ( + + + + + + TradingAgents + + AI ๊ฑฐ๋ž˜ ๋ถ„์„ ํ”Œ๋žซํผ์— ๊ฐ€์ž…ํ•˜์„ธ์š” + + + {errors.general && ( + + )} + + + + } + placeholder="์ด๋ฉ”์ผ์„ ์ž…๋ ฅํ•˜์„ธ์š”" + autoComplete="email" + /> + + + + } + placeholder="์‚ฌ์šฉ์ž๋ช…์„ ์ž…๋ ฅํ•˜์„ธ์š”" + autoComplete="username" + /> + + +
+ + + + + + + +
+ + + } + placeholder="๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”" + autoComplete="new-password" + /> + + + ({ + validator(_, value) { + if (!value || getFieldValue('password') === value) { + return Promise.resolve(); + } + return Promise.reject(new Error('๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.')); + }, + }), + ]} + > + } + placeholder="๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋‹ค์‹œ ์ž…๋ ฅํ•˜์„ธ์š”" + autoComplete="new-password" + /> + + + + + ํšŒ์›๊ฐ€์ž… + + +
+ + ๋˜๋Š” + + + ์ด๋ฏธ ๊ณ„์ •์ด ์žˆ์œผ์‹ ๊ฐ€์š”?{' '} + + ๋กœ๊ทธ์ธ + + +
+
+ ); +}; + +export default Register; \ No newline at end of file diff --git a/web/frontend/src/services/api.js b/web/frontend/src/services/api.js new file mode 100644 index 00000000..07bd8311 --- /dev/null +++ b/web/frontend/src/services/api.js @@ -0,0 +1,174 @@ +import axios from 'axios'; +import { message } from 'antd'; + +// API ๋ฒ ์ด์Šค URL +const BASE_URL = process.env.REACT_APP_API_URL || 'http://localhost:8000'; + +// Axios ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ +const api = axios.create({ + baseURL: BASE_URL, + timeout: 30000, + headers: { + 'Content-Type': 'application/json', + }, +}); + +// ์š”์ฒญ ์ธํ„ฐ์…‰ํ„ฐ +api.interceptors.request.use( + (config) => { + // ํ† ํฐ์ด ์žˆ์œผ๋ฉด ํ—ค๋”์— ์ถ”๊ฐ€ + const token = localStorage.getItem('access_token'); + if (token) { + config.headers.Authorization = `Bearer ${token}`; + } + + console.log(`API ์š”์ฒญ: ${config.method?.toUpperCase()} ${config.url}`); + return config; + }, + (error) => { + console.error('API ์š”์ฒญ ์˜ค๋ฅ˜:', error); + return Promise.reject(error); + } +); + +// ์‘๋‹ต ์ธํ„ฐ์…‰ํ„ฐ +api.interceptors.response.use( + (response) => { + console.log(`API ์‘๋‹ต: ${response.config.method?.toUpperCase()} ${response.config.url} - ${response.status}`); + return response; + }, + async (error) => { + const originalRequest = error.config; + + console.error('API ์‘๋‹ต ์˜ค๋ฅ˜:', error.response?.status, error.response?.data); + + // 401 ์˜ค๋ฅ˜ (์ธ์ฆ ์‹คํŒจ) ์ฒ˜๋ฆฌ + if (error.response?.status === 401 && !originalRequest._retry) { + originalRequest._retry = true; + + const refreshToken = localStorage.getItem('refresh_token'); + + if (refreshToken) { + try { + // ํ† ํฐ ๊ฐฑ์‹  ์‹œ๋„ + const response = await axios.post( + `${BASE_URL}/api/auth/token/refresh/`, + { refresh: refreshToken } + ); + + const newToken = response.data.access; + localStorage.setItem('access_token', newToken); + + // ์›๋ž˜ ์š”์ฒญ์— ์ƒˆ ํ† ํฐ ์ ์šฉ + originalRequest.headers.Authorization = `Bearer ${newToken}`; + api.defaults.headers.common['Authorization'] = `Bearer ${newToken}`; + + return api(originalRequest); + + } catch (refreshError) { + console.error('ํ† ํฐ ๊ฐฑ์‹  ์‹คํŒจ:', refreshError); + + // ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ๋„ ๋งŒ๋ฃŒ๋œ ๊ฒฝ์šฐ ๋กœ๊ทธ์•„์›ƒ ์ฒ˜๋ฆฌ + localStorage.removeItem('access_token'); + localStorage.removeItem('refresh_token'); + delete api.defaults.headers.common['Authorization']; + + // ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋””๋ ‰์…˜ + window.location.href = '/login'; + + message.error('์„ธ์…˜์ด ๋งŒ๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋กœ๊ทธ์ธํ•ด์ฃผ์„ธ์š”.'); + } + } else { + // ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์ด ์—†๋Š” ๊ฒฝ์šฐ ๋กœ๊ทธ์•„์›ƒ ์ฒ˜๋ฆฌ + localStorage.removeItem('access_token'); + localStorage.removeItem('refresh_token'); + delete api.defaults.headers.common['Authorization']; + + window.location.href = '/login'; + message.error('์ธ์ฆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ์ธํ•ด์ฃผ์„ธ์š”.'); + } + } + + // ๋‹ค๋ฅธ ์˜ค๋ฅ˜๋“ค ์ฒ˜๋ฆฌ + if (error.response?.status >= 500) { + message.error('์„œ๋ฒ„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž ์‹œ ํ›„ ๋‹ค์‹œ ์‹œ๋„ํ•ด์ฃผ์„ธ์š”.'); + } else if (error.response?.status === 403) { + message.error('์ ‘๊ทผ ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค.'); + } else if (error.response?.status === 404) { + message.error('์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.'); + } + + return Promise.reject(error); + } +); + +// API ํ•จ์ˆ˜๋“ค +export const authAPI = { + // ๋กœ๊ทธ์ธ + login: (email, password) => + api.post('/api/auth/login/', { email, password }), + + // ํšŒ์›๊ฐ€์ž… + register: (userData) => + api.post('/api/auth/register/', userData), + + // ์‚ฌ์šฉ์ž ์ •๋ณด ์กฐํšŒ + getUser: () => + api.get('/api/auth/user/'), + + // ํ”„๋กœํ•„ ์กฐํšŒ + getProfile: () => + api.get('/api/auth/profile/'), + + // ํ”„๋กœํ•„ ์—…๋ฐ์ดํŠธ + updateProfile: (profileData) => + api.put('/api/auth/profile/', profileData), + + // OpenAI API ํ‚ค ๊ฒ€์ฆ + checkApiKey: () => + api.post('/api/auth/check-api-key/'), + + // OpenAI API ํ‚ค ์ œ๊ฑฐ + removeApiKey: () => + api.delete('/api/auth/remove-api-key/'), + + // ๋ถ„์„ ์„ธ์…˜ ๋ชฉ๋ก + getAnalysisSessions: () => + api.get('/api/auth/sessions/'), +}; + +export const tradingAPI = { + // ๋ถ„์„ ์„ค์ • ์ •๋ณด ์กฐํšŒ + getAnalysisConfig: () => + api.get('/api/trading/config/'), + + // ๋ถ„์„ ์˜ต์…˜ ์กฐํšŒ + getAnalysisOptions: () => + api.get('/api/trading/options/'), + + // ๋ถ„์„ ์‹œ์ž‘ + startAnalysis: (analysisData) => + api.post('/api/trading/start/', analysisData), + + // ๋ถ„์„ ์ƒํƒœ ์กฐํšŒ + getAnalysisStatus: (sessionId) => + api.get(`/api/trading/status/${sessionId}/`), + + // ๋ถ„์„ ์ทจ์†Œ + cancelAnalysis: (sessionId) => + api.post(`/api/trading/cancel/${sessionId}/`), + + // ๋ถ„์„ ๊ธฐ๋ก ์กฐํšŒ + getAnalysisHistory: () => + api.get('/api/trading/history/'), + + // ๋ถ„์„ ๋ณด๊ณ ์„œ ์กฐํšŒ + getAnalysisReport: (sessionId) => + api.get(`/api/trading/report/${sessionId}/`), + + // ์‹คํ–‰ ์ค‘์ธ ๋ถ„์„ ์กฐํšŒ + getRunningAnalyses: () => + api.get('/api/trading/running/'), +}; + +export default api; \ No newline at end of file diff --git a/web/frontend/src/styles/GlobalStyle.js b/web/frontend/src/styles/GlobalStyle.js new file mode 100644 index 00000000..56be736b --- /dev/null +++ b/web/frontend/src/styles/GlobalStyle.js @@ -0,0 +1,338 @@ +import { createGlobalStyle } from 'styled-components'; + +const GlobalStyle = createGlobalStyle` + /* Reset and Base Styles */ + * { + margin: 0; + padding: 0; + box-sizing: border-box; + } + + html { + font-size: 16px; + line-height: 1.5; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } + + body { + font-family: ${props => props.theme.typography.fontFamily}; + color: ${props => props.theme.colors.text}; + background-color: ${props => props.theme.colors.background}; + font-size: ${props => props.theme.typography.fontSize.base}; + line-height: ${props => props.theme.typography.lineHeight.normal}; + } + + /* Link Styles */ + a { + color: ${props => props.theme.colors.primary}; + text-decoration: none; + transition: color ${props => props.theme.transitions.fast}; + + &:hover { + color: ${props => props.theme.colors.primaryHover}; + } + + &:active { + color: ${props => props.theme.colors.primaryActive}; + } + } + + /* Button Reset */ + button { + border: none; + background: none; + cursor: pointer; + font-family: inherit; + } + + /* Input Reset */ + input, textarea, select { + font-family: inherit; + font-size: inherit; + line-height: inherit; + } + + /* Remove outline on focus for non-keyboard users */ + :focus:not(:focus-visible) { + outline: none; + } + + /* Scrollbar Styles */ + ::-webkit-scrollbar { + width: 8px; + height: 8px; + } + + ::-webkit-scrollbar-track { + background: ${props => props.theme.colors.backgroundTertiary}; + border-radius: ${props => props.theme.borderRadius.sm}; + } + + ::-webkit-scrollbar-thumb { + background: ${props => props.theme.colors.border}; + border-radius: ${props => props.theme.borderRadius.sm}; + + &:hover { + background: ${props => props.theme.colors.textSecondary}; + } + } + + /* Ant Design Customizations */ + .ant-layout { + min-height: 100vh; + } + + .ant-layout-header { + background: ${props => props.theme.colors.background}; + border-bottom: 1px solid ${props => props.theme.colors.borderLight}; + padding: 0 ${props => props.theme.spacing.lg}; + display: flex; + align-items: center; + justify-content: space-between; + } + + .ant-layout-sider { + background: ${props => props.theme.colors.background}; + border-right: 1px solid ${props => props.theme.colors.borderLight}; + } + + .ant-layout-content { + background: ${props => props.theme.colors.backgroundSecondary}; + padding: ${props => props.theme.spacing.lg}; + min-height: calc(100vh - 64px); + } + + .ant-menu { + background: transparent; + border-right: none; + } + + .ant-menu-item { + margin: 0; + border-radius: ${props => props.theme.borderRadius.base}; + margin-bottom: ${props => props.theme.spacing.xs}; + + &:hover { + background-color: ${props => props.theme.colors.primaryLight}; + } + } + + .ant-menu-item-selected { + background-color: ${props => props.theme.colors.primaryLight} !important; + + &::after { + display: none; + } + } + + .ant-card { + border-radius: ${props => props.theme.borderRadius.md}; + box-shadow: ${props => props.theme.shadows.sm}; + border: 1px solid ${props => props.theme.colors.borderLight}; + } + + .ant-card-head { + border-bottom: 1px solid ${props => props.theme.colors.borderLight}; + } + + .ant-btn { + border-radius: ${props => props.theme.borderRadius.base}; + font-weight: ${props => props.theme.typography.fontWeight.medium}; + transition: all ${props => props.theme.transitions.fast}; + } + + .ant-btn-primary { + background-color: ${props => props.theme.colors.primary}; + border-color: ${props => props.theme.colors.primary}; + + &:hover, &:focus { + background-color: ${props => props.theme.colors.primaryHover}; + border-color: ${props => props.theme.colors.primaryHover}; + } + + &:active { + background-color: ${props => props.theme.colors.primaryActive}; + border-color: ${props => props.theme.colors.primaryActive}; + } + } + + .ant-input, .ant-input-password, .ant-select-selector { + border-radius: ${props => props.theme.borderRadius.base}; + transition: all ${props => props.theme.transitions.fast}; + + &:hover { + border-color: ${props => props.theme.colors.primaryHover}; + } + + &:focus, &.ant-input-focused, &.ant-select-focused .ant-select-selector { + border-color: ${props => props.theme.colors.primary}; + box-shadow: 0 0 0 2px ${props => props.theme.colors.primaryLight}; + } + } + + .ant-form-item-label > label { + font-weight: ${props => props.theme.typography.fontWeight.medium}; + color: ${props => props.theme.colors.text}; + } + + .ant-table { + border-radius: ${props => props.theme.borderRadius.md}; + } + + .ant-table-thead > tr > th { + background-color: ${props => props.theme.colors.backgroundTertiary}; + border-bottom: 1px solid ${props => props.theme.colors.borderLight}; + font-weight: ${props => props.theme.typography.fontWeight.semibold}; + } + + .ant-table-tbody > tr:hover > td { + background-color: ${props => props.theme.colors.backgroundSecondary}; + } + + .ant-progress-line { + .ant-progress-bg { + transition: all ${props => props.theme.transitions.base}; + } + } + + .ant-tag { + border-radius: ${props => props.theme.borderRadius.base}; + font-weight: ${props => props.theme.typography.fontWeight.medium}; + } + + .ant-notification { + .ant-notification-notice { + border-radius: ${props => props.theme.borderRadius.md}; + box-shadow: ${props => props.theme.shadows.lg}; + } + } + + .ant-message { + .ant-message-notice-content { + border-radius: ${props => props.theme.borderRadius.md}; + box-shadow: ${props => props.theme.shadows.md}; + } + } + + /* Custom Status Colors */ + .status-pending { + color: ${props => props.theme.colors.pending}; + } + + .status-running { + color: ${props => props.theme.colors.running}; + } + + .status-completed { + color: ${props => props.theme.colors.completed}; + } + + .status-failed { + color: ${props => props.theme.colors.failed}; + } + + .status-cancelled { + color: ${props => props.theme.colors.cancelled}; + } + + /* Trading Colors */ + .bullish { + color: ${props => props.theme.colors.bullish}; + } + + .bearish { + color: ${props => props.theme.colors.bearish}; + } + + .neutral { + color: ${props => props.theme.colors.neutral}; + } + + /* Utility Classes */ + .text-center { + text-align: center; + } + + .text-right { + text-align: right; + } + + .text-left { + text-align: left; + } + + .mb-0 { margin-bottom: 0 !important; } + .mb-1 { margin-bottom: ${props => props.theme.spacing.xs} !important; } + .mb-2 { margin-bottom: ${props => props.theme.spacing.sm} !important; } + .mb-3 { margin-bottom: ${props => props.theme.spacing.md} !important; } + .mb-4 { margin-bottom: ${props => props.theme.spacing.lg} !important; } + .mb-5 { margin-bottom: ${props => props.theme.spacing.xl} !important; } + + .mt-0 { margin-top: 0 !important; } + .mt-1 { margin-top: ${props => props.theme.spacing.xs} !important; } + .mt-2 { margin-top: ${props => props.theme.spacing.sm} !important; } + .mt-3 { margin-top: ${props => props.theme.spacing.md} !important; } + .mt-4 { margin-top: ${props => props.theme.spacing.lg} !important; } + .mt-5 { margin-top: ${props => props.theme.spacing.xl} !important; } + + .ml-0 { margin-left: 0 !important; } + .ml-1 { margin-left: ${props => props.theme.spacing.xs} !important; } + .ml-2 { margin-left: ${props => props.theme.spacing.sm} !important; } + .ml-3 { margin-left: ${props => props.theme.spacing.md} !important; } + .ml-4 { margin-left: ${props => props.theme.spacing.lg} !important; } + + .mr-0 { margin-right: 0 !important; } + .mr-1 { margin-right: ${props => props.theme.spacing.xs} !important; } + .mr-2 { margin-right: ${props => props.theme.spacing.sm} !important; } + .mr-3 { margin-right: ${props => props.theme.spacing.md} !important; } + .mr-4 { margin-right: ${props => props.theme.spacing.lg} !important; } + + .p-0 { padding: 0 !important; } + .p-1 { padding: ${props => props.theme.spacing.xs} !important; } + .p-2 { padding: ${props => props.theme.spacing.sm} !important; } + .p-3 { padding: ${props => props.theme.spacing.md} !important; } + .p-4 { padding: ${props => props.theme.spacing.lg} !important; } + + /* Loading Animation */ + @keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } + } + + .animate-spin { + animation: spin 1s linear infinite; + } + + /* Fade Animations */ + @keyframes fadeIn { + from { opacity: 0; } + to { opacity: 1; } + } + + @keyframes fadeOut { + from { opacity: 1; } + to { opacity: 0; } + } + + .animate-fade-in { + animation: fadeIn ${props => props.theme.transitions.base}; + } + + .animate-fade-out { + animation: fadeOut ${props => props.theme.transitions.base}; + } + + /* Responsive Utilities */ + @media (max-width: ${props => props.theme.breakpoints.sm}) { + .ant-layout-content { + padding: ${props => props.theme.spacing.md}; + } + + .ant-card { + margin-bottom: ${props => props.theme.spacing.md}; + } + } +`; + +export default GlobalStyle; \ No newline at end of file diff --git a/web/frontend/src/styles/theme.js b/web/frontend/src/styles/theme.js new file mode 100644 index 00000000..1010b3d2 --- /dev/null +++ b/web/frontend/src/styles/theme.js @@ -0,0 +1,211 @@ +// ํ…Œ๋งˆ ์„ค์ • +const theme = { + colors: { + // Primary Colors + primary: '#1890ff', + primaryHover: '#40a9ff', + primaryActive: '#096dd9', + primaryLight: '#e6f7ff', + + // Secondary Colors + secondary: '#722ed1', + secondaryHover: '#9254de', + secondaryActive: '#531dab', + + // Success Colors + success: '#52c41a', + successHover: '#73d13d', + successActive: '#389e0d', + successLight: '#f6ffed', + + // Warning Colors + warning: '#fa8c16', + warningHover: '#ffa940', + warningActive: '#d46b08', + warningLight: '#fff7e6', + + // Error Colors + error: '#ff4d4f', + errorHover: '#ff7875', + errorActive: '#d9363e', + errorLight: '#fff2f0', + + // Info Colors + info: '#1890ff', + infoHover: '#40a9ff', + infoActive: '#096dd9', + infoLight: '#e6f7ff', + + // Neutral Colors + text: '#262626', + textSecondary: '#8c8c8c', + textLight: '#bfbfbf', + textDisabled: '#d9d9d9', + + // Background Colors + background: '#ffffff', + backgroundSecondary: '#fafafa', + backgroundTertiary: '#f5f5f5', + + // Border Colors + border: '#d9d9d9', + borderLight: '#f0f0f0', + borderSecondary: '#e6f7ff', + + // Card & Surface Colors + cardBg: '#ffffff', + surfaceBg: '#fafafa', + + // Trading Specific Colors + bullish: '#52c41a', + bearish: '#ff4d4f', + neutral: '#fa8c16', + + // Analysis Status Colors + pending: '#faad14', + running: '#1890ff', + completed: '#52c41a', + failed: '#ff4d4f', + cancelled: '#8c8c8c', + }, + + typography: { + fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif', + + // Font Sizes + fontSize: { + xs: '12px', + sm: '14px', + base: '16px', + lg: '18px', + xl: '20px', + '2xl': '24px', + '3xl': '28px', + '4xl': '32px', + '5xl': '36px', + }, + + // Font Weights + fontWeight: { + light: 300, + normal: 400, + medium: 500, + semibold: 600, + bold: 700, + }, + + // Line Heights + lineHeight: { + tight: 1.2, + normal: 1.5, + relaxed: 1.75, + }, + }, + + spacing: { + xs: '4px', + sm: '8px', + md: '16px', + lg: '24px', + xl: '32px', + '2xl': '48px', + '3xl': '64px', + '4xl': '96px', + }, + + borderRadius: { + none: '0', + sm: '2px', + base: '6px', + md: '8px', + lg: '12px', + xl: '16px', + '2xl': '24px', + full: '50%', + }, + + shadows: { + none: 'none', + sm: '0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)', + base: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)', + md: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)', + lg: '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)', + xl: '0 25px 50px -12px rgba(0, 0, 0, 0.25)', + }, + + breakpoints: { + xs: '480px', + sm: '576px', + md: '768px', + lg: '992px', + xl: '1200px', + xxl: '1600px', + }, + + zIndex: { + dropdown: 1000, + sticky: 1020, + fixed: 1030, + modalBackdrop: 1040, + modal: 1050, + popover: 1060, + tooltip: 1070, + notification: 1080, + }, + + transitions: { + fast: '150ms ease-in-out', + base: '250ms ease-in-out', + slow: '350ms ease-in-out', + }, + + // Component Specific Themes + components: { + button: { + height: { + sm: '24px', + base: '32px', + lg: '40px', + }, + padding: { + sm: '4px 15px', + base: '4px 15px', + lg: '6px 15px', + }, + }, + + input: { + height: { + sm: '24px', + base: '32px', + lg: '40px', + }, + }, + + card: { + padding: '24px', + borderRadius: '8px', + boxShadow: '0 1px 2px 0 rgba(0, 0, 0, 0.03), 0 1px 6px -1px rgba(0, 0, 0, 0.02), 0 2px 4px 0 rgba(0, 0, 0, 0.02)', + }, + + layout: { + header: { + height: '64px', + background: '#ffffff', + borderBottom: '1px solid #f0f0f0', + }, + sidebar: { + width: '200px', + collapsedWidth: '80px', + background: '#001529', + }, + content: { + padding: '24px', + background: '#fafafa', + minHeight: 'calc(100vh - 64px)', + }, + }, + }, +}; + +export default theme; \ No newline at end of file From 10a8e18005212c142a0bd914773fc9e3cb97e362 Mon Sep 17 00:00:00 2001 From: kimheesu Date: Fri, 13 Jun 2025 15:04:28 +0900 Subject: [PATCH 09/14] =?UTF-8?q?[add]=20=ED=9A=8C=EC=9B=90=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../full_states_log.json | 27 ----- .../full_states_log.json | 27 ----- scripts/docker-commands.sh | 104 ------------------ .../apps/authentication/serializers.py | 3 - web/backend/apps/authentication/views.py | 3 +- web/backend/reset_and_run.sh | 30 +++++ 6 files changed, 32 insertions(+), 162 deletions(-) delete mode 100644 eval_results/NVDA/TradingAgentsStrategy_logs/full_states_log.json delete mode 100644 eval_results/PLTR/TradingAgentsStrategy_logs/full_states_log.json delete mode 100644 scripts/docker-commands.sh create mode 100644 web/backend/reset_and_run.sh diff --git a/eval_results/NVDA/TradingAgentsStrategy_logs/full_states_log.json b/eval_results/NVDA/TradingAgentsStrategy_logs/full_states_log.json deleted file mode 100644 index e50d5f0d..00000000 --- a/eval_results/NVDA/TradingAgentsStrategy_logs/full_states_log.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "2025-06-12": { - "company_of_interest": "NVDA", - "trade_date": "2025-06-12", - "market_report": "FINAL TRANSACTION PROPOSAL: **HOLD**\n\nHere's a detailed analysis of NVDA based on the selected indicators:\n\n**Trend Analysis:**\n\n* **Close Price:** The closing price of NVDA on June 11, 2025, is $142.83.\n* **50 SMA:** The 50-day SMA is at $120.40 on June 11, 2025, indicating that the current price is well above its medium-term average, suggesting an upward trend.\n* **200 SMA:** The 200-day SMA is at $127.46 on June 11, 2025. The price being above this long-term average further confirms a long-term bullish trend.\n* **10 EMA:** The 10-day EMA is at $140.37 on June 11, 2025, which is very close to the current price, reflecting the recent price action.\n\n**Momentum:**\n\n* **MACD:** The MACD value is 6.12 on June 11, 2025, and the MACD signal line is 6.21. The MACD line is below the signal line, which indicates a potential decrease in bullish momentum, or a possible bearish crossover.\n* **RSI:** The RSI is at 66.99 on June 11, 2025. This value is below the overbought threshold of 70, suggesting that the stock is not currently overbought, but is approaching overbought conditions.\n\n**Volatility:**\n\n* **ATR:** The ATR is 4.34 on June 11, 2025, indicating the average true range of price fluctuations. This can be used to set stop-loss levels, reflecting the stock's volatility.\n\n**Volume:**\n\n* **VWMA:** The Volume Weighted Moving Average is at 138.42 on June 11, 2025, confirming the upward trend when considering volume.\n\n**Synthesis:**\n\nNVDA is in a confirmed uptrend, as the price is trading above both its 50-day and 200-day SMAs. The 10 EMA also supports this short-term upward momentum. However, the MACD indicates a possible decrease in bullish momentum as the MACD line is below the signal line. The RSI is approaching overbought territory, suggesting caution. The ATR indicates moderate volatility.\n\n**Trading Recommendation:**\n\nGiven the uptrend, but with signs of weakening momentum, a **HOLD** position is recommended. Traders should closely monitor the MACD for a bearish crossover and the RSI as it approaches overbought levels. If the MACD crosses bearishly and the RSI exceeds 70, consider taking profit or tightening stop-loss levels.\n\n| Indicator | Value (2025-06-11) | Trend/Signal ", - "sentiment_report": "FINAL TRANSACTION PROPOSAL: **HOLD**\n\nHere's a summary of my analysis of NVDA from June 5, 2025, to June 12, 2025:\n\n**Overall Sentiment:** Bullish with a strong undercurrent of caution.\n\n**Key Positives:**\n\n* **AI Dominance:** NVDA is perceived as a leader in AI, with strong demand for its chips.\n* **Strong Financials:** Recent Q1 fiscal 2026 results showed significant revenue growth.\n* **Bullish Options Activity:** High call option buying suggests bullish sentiment.\n\n**Key Negatives/Cautions:**\n\n* **Overvaluation Concerns:** Some analysts and investors believe the stock is \"overpriced\" or \"too hot.\"\n* **Potential Pullbacks:** Anticipation of short-term price corrections or consolidations.\n* **Insider Selling:** A director's sale of a significant number of shares created some cautious sentiment.\n\n**News Highlights:**\n\n* Presentations at major technology conferences.\n* Partnerships to enhance AI safety and security.\n* Strong Q1 fiscal 2026 financial results.\n* Director's stock sale.\n\n**Implications for Traders:**\n\n* **Long-Term Investors:** Should likely hold NVDA, given its strong position in the AI sector.\n* **Short-Term Traders:** Should be cautious due to potential volatility and overvaluation concerns. Consider setting stop-loss orders to manage risk. Look for potential dips to buy.\n\n**Markdown Table Summary:**\n\n| Category | Sentiment/Insight |\n| ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |\n| AI Dominance | Strong positive sentiment due to NVDA's leadership in AI and high demand for its chips. |\n| Valuation | Mixed sentiment; concerns about overvaluation and potential for pullbacks. |\n| Financials | Positive sentiment driven by strong Q1 fiscal 2026 results. |\n| Insider Activity | Negative sentiment due to a director's stock sale, raising concerns about the company's future prospects (though potentially personal planning). |\n| Options Activity | Bullish sentiment indicated by high call option buying, but also suggests potential volatility. |\n| Overall Outlook | Bullish long-term, but cautious short-term. |", - "news_report": "Nvidia (NVDA) is currently experiencing a dynamic period marked by both significant growth opportunities and potential challenges. Recent news highlights several key trends:\n\n**Positive Developments:**\n\n* **AI Leadership and Innovation:** NVDA is solidifying its dominance in the AI space through strategic partnerships and technological advancements. Collaborations with HPE in Germany to build supercomputers, partnerships with European nations to enhance AI infrastructure, and alliances with companies like Novo Nordisk for drug discovery showcase NVDA's expanding influence across various sectors. The launch of Europe's fastest supercomputer, JUPITER, powered by NVDA's Grace Hopper platform, further underscores its technological prowess.\n* **European Expansion:** NVDA is making significant strides in Europe, establishing AI factories and cloud services. These initiatives aim to modernize manufacturing and accelerate AI development in the region. CEO Jensen Huang's commitment to increasing investment in the UK's AI sector and partnerships with European model builders and cloud providers demonstrate a strong focus on European markets.\n* **Market Dominance and Financial Performance:** NVDA has, at times, reclaimed its position as the world's most valuable company, surpassing Microsoft. Analysts are generally bullish, citing AI strength and the potential upside from the Blackwell chip. Strong Q1 earnings and revenue growth reinforce the company's financial stability and market leadership.\n* **Quantum Computing Potential:** NVDA's CEO Jensen Huang has highlighted the potential of quantum computing, suggesting it is reaching an inflection point. This indicates a possible new revenue stream for NVDA in the future.\n* **Automotive Sector Growth:** NVDA is bullish on its auto chip business, identifying it as a key driver for future growth.\n\n**Challenges and Concerns:**\n\n* **China Market Uncertainty:** NVDA faces challenges in the Chinese market due to U.S. government restrictions. While there were reports of NVDA preparing to re-enter China with a new B40 chip, the company has denied these claims, stating that it is still evaluating the situation. Export curbs are expected to impact Q2 sales, potentially reducing revenue by $8 billion.\n* **Insider Selling:** Several NVDA directors, including Mark Stevens and Robert Burgess, have sold substantial amounts of stock, raising concerns among some investors.\n* **Competition:** NVDA faces increasing competition in the AI chip market, particularly from China's Huawei.\n* **Valuation Concerns:** Some analysts suggest that NVDA's stock rally may be overextended, and the stock could be overvalued. A few analysts have downgraded the stock to \"Hold\" due to concerns about near-term AI spending outlook and potential inventory write-offs.\n* **Data Center Project Delays:** NVDA is experiencing delays in building a data center in the UAE, which could impact AI development efforts in the region.\n\n**Overall Sentiment:**\n\nThe overall sentiment surrounding NVDA is largely positive, driven by its strong position in the AI market, strategic partnerships, and expansion into new sectors and geographies. However, investors should be aware of the challenges related to the Chinese market, increasing competition, and potential valuation concerns.\n\n**Key Points Summary Table:**\n\n| Category | Key Points that NVDA is a strong buy.\n\nGiven the mixed signals, I recommend a **HOLD** position. The company has strong fundamentals and growth prospects, but the challenges in China and insider selling warrant caution.", - "fundamentals_report": "I am unable to provide a comprehensive report of NVDA's fundamental information from 2025-05-12 to 2025-06-12 because the information is in the future. However, I can provide the most recent fundamental analysis data and discussions for NVIDIA (NVDA) up to today, June 12, 2025.", - "investment_debate_state": { - "bull_history": "\nBull Analyst: Okay, let's address the \"HOLD\" recommendation on NVDA. I understand the cautious stance, especially given the mixed signals we're seeing. However, I believe a closer look reveals that the bullish arguments outweigh the concerns, and a \"BUY\" recommendation is more appropriate.\n\nYou've correctly pointed out the uptrend confirmed by the 50-day and 200-day SMAs, and the 10-day EMA supporting short-term momentum. However, you're placing too much emphasis on the MACD potentially signaling a decrease in bullish momentum and the RSI approaching overbought territory. While these are valid points to monitor, they are lagging indicators and shouldn't overshadow the fundamental drivers of NVDA's growth.\n\n**Let's talk about the \"overvaluation\" concern.** Yes, NVDA's stock has seen significant gains, but is it truly *over*valued? I argue no, because the market is pricing in future growth based on NVDA's dominance in the exploding AI market. The demand for their chips is not just hype; it's driven by real-world applications across diverse sectors, from healthcare (Novo Nordisk partnership for drug discovery) to automotive. The Blackwell chip, as analysts note, offers significant upside potential. To call it \"overvalued\" is to underestimate the transformative power of AI and NVDA's central role in it. We need to consider future earnings potential, not just current multiples.\n\n**Now, about the insider selling.** I acknowledge that director stock sales can create negative sentiment. However, attributing this solely to a lack of confidence in the company is an oversimplification. Directors often sell shares for personal financial planning reasons \u2013 diversification, tax obligations, estate planning, etc. Without knowing the specific motivations behind these sales, it's premature to interpret them as a bearish signal. Furthermore, the sheer volume of shares traded daily in NVDA makes these sales a relatively small percentage of overall activity.\n\n**The China market uncertainty is a valid concern,** and the potential $8 billion revenue impact from export curbs is significant. However, NVDA is actively working to mitigate this by exploring compliant solutions and diversifying its market reach. Their expansion in Europe, with AI factories and cloud services, demonstrates a proactive approach to capturing new growth opportunities. The partnerships with HPE in Germany and other European nations are not just symbolic; they represent a strategic shift towards a less China-dependent future.\n\n**Regarding competition, particularly from Huawei,** it's crucial to remember that NVDA has a significant technological lead and a well-established ecosystem. While competition is always a factor, NVDA's R&D investments and its strong relationships with key players in the AI industry provide a substantial competitive advantage. They aren't standing still; they are constantly innovating and pushing the boundaries of AI technology.\n\n**Finally, the \"HOLD\" recommendation based on the technical indicators alone is too conservative.** The VWMA confirms the upward trend when considering volume, which is a strong signal. The fact that the price is trading well above both its 50-day and 200-day SMAs is a powerful indicator of sustained bullish momentum. While monitoring the MACD and RSI is prudent, they shouldn't be the sole determinants of our investment decision.\n\n**In conclusion,** while acknowledging the potential risks and uncertainties, I believe NVDA's strong fundamentals, its dominant position in the AI market, and its proactive approach to mitigating challenges warrant a \"BUY\" recommendation. The long-term growth potential far outweighs the short-term concerns. We should be focusing on the forest, not just the trees. Let's not miss out on this opportunity by being overly cautious.", - "bear_history": "\nBear Analyst: Okay, I appreciate your enthusiasm for NVDA, but I think you're painting an overly optimistic picture. While I agree that NVDA has a strong position in the AI market, I believe the risks are being downplayed, and a \"BUY\" recommendation is premature. Let's dissect your arguments.\n\nYou say I'm placing too much emphasis on the MACD and RSI. You call them lagging indicators, but that's precisely *why* they're important. They confirm the *strength* of the trend. The MACD signal line being *above* the MACD line suggests that the bullish momentum is *waning*. Ignoring this because of the \"fundamental drivers\" is like driving a car at full speed while ignoring the flashing red warning light on your dashboard. Yes, the engine might be powerful, but something is clearly amiss. The RSI approaching overbought territory further reinforces this caution. It suggests the stock is becoming increasingly sensitive to negative news or a market correction.\n\nNow, about the \"overvaluation\" concern. You argue that the market is pricing in future growth. But how much future growth is *already* priced in? That's the crucial question. The market can be irrational, and hype can drive valuations far beyond what's justifiable. While NVDA's partnerships are impressive, they don't guarantee sustained, exponential growth. The Blackwell chip's potential is just that \u2013 potential. It's not a guaranteed home run. We've seen companies with promising technologies fail to deliver on their promises before. Remember the dot-com bubble? Future earnings potential is important, but it needs to be grounded in reality, not just wishful thinking.\n\nRegarding insider selling, you dismiss it as potentially due to \"personal financial planning.\" While that's possible, it's also convenient. Directors have access to information we don't. To completely disregard their actions as meaningless is naive. Yes, the volume of shares traded daily is high, but insider selling, *especially by multiple directors*, should raise a red flag. It suggests that those with the most intimate knowledge of the company's prospects might be hedging their bets. We can't ignore this.\n\nThe China market uncertainty is, as you admit, a valid concern. But you downplay the potential impact by highlighting NVDA's diversification efforts in Europe. While these efforts are commendable, they are unlikely to fully offset the potential loss of $8 billion in revenue. Building AI factories and cloud services in Europe takes time and investment. It's not an immediate solution. Furthermore, relying heavily on Europe exposes NVDA to new geopolitical risks and economic uncertainties.\n\nYou also mention NVDA's technological lead over competitors like Huawei. While NVDA currently holds an advantage, technological leadership is not a static concept. Huawei is a formidable competitor with significant resources and government support. To assume that NVDA will maintain its dominance indefinitely is complacent. Competition is intensifying, and NVDA will need to constantly innovate to stay ahead. This requires significant R&D investment, which can strain profitability.\n\nFinally, you criticize the \"HOLD\" recommendation as being too conservative based on technical indicators alone. But I'm not relying solely on technical indicators. I'm using them to *confirm* the concerns raised by the fundamental challenges NVDA faces. The VWMA confirming the upward trend is less compelling when the MACD is signaling weakening momentum and the RSI is approaching overbought territory. It suggests that the upward trend might be losing steam.\n\nIn conclusion, while NVDA has undeniable strengths, the risks are significant and should not be ignored. The potential for overvaluation, the uncertainty surrounding the China market, the intensifying competition, and the concerning insider selling all warrant caution. A \"HOLD\" recommendation is not about being overly conservative; it's about being prudent and acknowledging the potential downsides. Let's not get caught up in the hype and overestimate NVDA's future prospects. It's better to be cautious and potentially miss out on some gains than to be overly optimistic and suffer significant losses.\n\n**Reflecting on past mistakes,** I've learned that it's crucial to avoid confirmation bias and to critically evaluate all available information, even if it contradicts my initial assumptions. In the past, I've been too quick to jump on the bandwagon of popular stocks, only to be burned when the market corrected. This time, I'm taking a more measured approach and focusing on the potential risks as well as the potential rewards.", - "history": "\nBull Analyst: Okay, let's address the \"HOLD\" recommendation on NVDA. I understand the cautious stance, especially given the mixed signals we're seeing. However, I believe a closer look reveals that the bullish arguments outweigh the concerns, and a \"BUY\" recommendation is more appropriate.\n\nYou've correctly pointed out the uptrend confirmed by the 50-day and 200-day SMAs, and the 10-day EMA supporting short-term momentum. However, you're placing too much emphasis on the MACD potentially signaling a decrease in bullish momentum and the RSI approaching overbought territory. While these are valid points to monitor, they are lagging indicators and shouldn't overshadow the fundamental drivers of NVDA's growth.\n\n**Let's talk about the \"overvaluation\" concern.** Yes, NVDA's stock has seen significant gains, but is it truly *over*valued? I argue no, because the market is pricing in future growth based on NVDA's dominance in the exploding AI market. The demand for their chips is not just hype; it's driven by real-world applications across diverse sectors, from healthcare (Novo Nordisk partnership for drug discovery) to automotive. The Blackwell chip, as analysts note, offers significant upside potential. To call it \"overvalued\" is to underestimate the transformative power of AI and NVDA's central role in it. We need to consider future earnings potential, not just current multiples.\n\n**Now, about the insider selling.** I acknowledge that director stock sales can create negative sentiment. However, attributing this solely to a lack of confidence in the company is an oversimplification. Directors often sell shares for personal financial planning reasons \u2013 diversification, tax obligations, estate planning, etc. Without knowing the specific motivations behind these sales, it's premature to interpret them as a bearish signal. Furthermore, the sheer volume of shares traded daily in NVDA makes these sales a relatively small percentage of overall activity.\n\n**The China market uncertainty is a valid concern,** and the potential $8 billion revenue impact from export curbs is significant. However, NVDA is actively working to mitigate this by exploring compliant solutions and diversifying its market reach. Their expansion in Europe, with AI factories and cloud services, demonstrates a proactive approach to capturing new growth opportunities. The partnerships with HPE in Germany and other European nations are not just symbolic; they represent a strategic shift towards a less China-dependent future.\n\n**Regarding competition, particularly from Huawei,** it's crucial to remember that NVDA has a significant technological lead and a well-established ecosystem. While competition is always a factor, NVDA's R&D investments and its strong relationships with key players in the AI industry provide a substantial competitive advantage. They aren't standing still; they are constantly innovating and pushing the boundaries of AI technology.\n\n**Finally, the \"HOLD\" recommendation based on the technical indicators alone is too conservative.** The VWMA confirms the upward trend when considering volume, which is a strong signal. The fact that the price is trading well above both its 50-day and 200-day SMAs is a powerful indicator of sustained bullish momentum. While monitoring the MACD and RSI is prudent, they shouldn't be the sole determinants of our investment decision.\n\n**In conclusion,** while acknowledging the potential risks and uncertainties, I believe NVDA's strong fundamentals, its dominant position in the AI market, and its proactive approach to mitigating challenges warrant a \"BUY\" recommendation. The long-term growth potential far outweighs the short-term concerns. We should be focusing on the forest, not just the trees. Let's not miss out on this opportunity by being overly cautious.\nBear Analyst: Okay, I appreciate your enthusiasm for NVDA, but I think you're painting an overly optimistic picture. While I agree that NVDA has a strong position in the AI market, I believe the risks are being downplayed, and a \"BUY\" recommendation is premature. Let's dissect your arguments.\n\nYou say I'm placing too much emphasis on the MACD and RSI. You call them lagging indicators, but that's precisely *why* they're important. They confirm the *strength* of the trend. The MACD signal line being *above* the MACD line suggests that the bullish momentum is *waning*. Ignoring this because of the \"fundamental drivers\" is like driving a car at full speed while ignoring the flashing red warning light on your dashboard. Yes, the engine might be powerful, but something is clearly amiss. The RSI approaching overbought territory further reinforces this caution. It suggests the stock is becoming increasingly sensitive to negative news or a market correction.\n\nNow, about the \"overvaluation\" concern. You argue that the market is pricing in future growth. But how much future growth is *already* priced in? That's the crucial question. The market can be irrational, and hype can drive valuations far beyond what's justifiable. While NVDA's partnerships are impressive, they don't guarantee sustained, exponential growth. The Blackwell chip's potential is just that \u2013 potential. It's not a guaranteed home run. We've seen companies with promising technologies fail to deliver on their promises before. Remember the dot-com bubble? Future earnings potential is important, but it needs to be grounded in reality, not just wishful thinking.\n\nRegarding insider selling, you dismiss it as potentially due to \"personal financial planning.\" While that's possible, it's also convenient. Directors have access to information we don't. To completely disregard their actions as meaningless is naive. Yes, the volume of shares traded daily is high, but insider selling, *especially by multiple directors*, should raise a red flag. It suggests that those with the most intimate knowledge of the company's prospects might be hedging their bets. We can't ignore this.\n\nThe China market uncertainty is, as you admit, a valid concern. But you downplay the potential impact by highlighting NVDA's diversification efforts in Europe. While these efforts are commendable, they are unlikely to fully offset the potential loss of $8 billion in revenue. Building AI factories and cloud services in Europe takes time and investment. It's not an immediate solution. Furthermore, relying heavily on Europe exposes NVDA to new geopolitical risks and economic uncertainties.\n\nYou also mention NVDA's technological lead over competitors like Huawei. While NVDA currently holds an advantage, technological leadership is not a static concept. Huawei is a formidable competitor with significant resources and government support. To assume that NVDA will maintain its dominance indefinitely is complacent. Competition is intensifying, and NVDA will need to constantly innovate to stay ahead. This requires significant R&D investment, which can strain profitability.\n\nFinally, you criticize the \"HOLD\" recommendation as being too conservative based on technical indicators alone. But I'm not relying solely on technical indicators. I'm using them to *confirm* the concerns raised by the fundamental challenges NVDA faces. The VWMA confirming the upward trend is less compelling when the MACD is signaling weakening momentum and the RSI is approaching overbought territory. It suggests that the upward trend might be losing steam.\n\nIn conclusion, while NVDA has undeniable strengths, the risks are significant and should not be ignored. The potential for overvaluation, the uncertainty surrounding the China market, the intensifying competition, and the concerning insider selling all warrant caution. A \"HOLD\" recommendation is not about being overly conservative; it's about being prudent and acknowledging the potential downsides. Let's not get caught up in the hype and overestimate NVDA's future prospects. It's better to be cautious and potentially miss out on some gains than to be overly optimistic and suffer significant losses.\n\n**Reflecting on past mistakes,** I've learned that it's crucial to avoid confirmation bias and to critically evaluate all available information, even if it contradicts my initial assumptions. In the past, I've been too quick to jump on the bandwagon of popular stocks, only to be burned when the market corrected. This time, I'm taking a more measured approach and focusing on the potential risks as well as the potential rewards.", - "current_response": "Alright team, let's cut through the noise and make a definitive call on NVDA. As your portfolio manager, my job is to critically weigh these arguments, learn from our past tendencies, and put forward an actionable plan.\n\nFirst off, I want to commend both analysts for a solid round. You both presented compelling points, but as always, we need to decide where the weight of the evidence truly lies.\n\n**Let's summarize the key points:**\n\nThe **Bull Analyst** paints a very compelling picture of NVDA's future. They rightly emphasize NVDA's undeniable dominance in the exploding AI market, driven by real-world applications and the significant upside potential of new technologies like the Blackwell chip. Their argument is that current valuations are simply pricing in this immense future growth, and dismissing technical \"lagging indicators\" like MACD and RSI shouldn't overshadow these fundamental drivers. They also downplay insider selling as personal financial planning and highlight NVDA's proactive diversification into Europe to mitigate China risks, along with its enduring competitive advantage.\n\nOn the other hand, the **Bear Analyst** brings a much-needed dose of caution, and frankly, a more immediate, actionable perspective. They argue that those \"lagging indicators\" like the MACD (signal line *above* the MACD line, indicating *waning* bullish momentum) and RSI approaching overbought territory are precisely what we need to pay attention to. They confirm that the powerful engine might be showing signs of overheating or losing steam. The bear makes a crucial point about how much future growth is *already priced in*, reminding us of past bubbles where hype outran reality. They rightly flag the insider selling, especially by *multiple directors*, as a significant red flag that shouldn't be easily dismissed. The potential $8 billion revenue impact from China is a quantifiable risk that isn't immediately offset by long-term European expansion plans. They also stress that technological leadership isn't static and competition from players like Huawei is intensifying.\n\n**My Recommendation: Sell.**\n\nThis isn't a decision I take lightly, especially with a company as transformative as NVDA. However, based on this debate, the immediate risks and warning signs presented by the Bear Analyst are simply too significant to ignore, and they outweigh the Bull's long-term optimism for the *current* valuation.\n\n**Rationale:**\n\n1. **Waning Momentum and Overvaluation:** The Bear's point about the MACD signaling *waning* bullish momentum, combined with an overbought RSI, is a critical technical warning. While NVDA's long-term AI story is strong, the stock has already seen an explosive run. The crucial question, as the Bear articulated, is how much of that future growth is *already priced in*? At these elevated levels, the stock becomes highly susceptible to any negative news or market corrections. We've seen this play out before \u2013 even great companies can become overvalued in the short term.\n2. **Concrete Risks vs. Future Potential:** The Bull's argument relies heavily on future potential, which is exciting but also speculative. The Bear, however, highlights *concrete, quantifiable risks* right now. The potential $8 billion revenue hit from China is a substantial near-term headwind that won't be immediately offset by European expansion, which takes time and significant investment.\n3. **Insider Selling as a Red Flag:** Dismissing insider selling by *multiple directors* as purely \"personal financial planning\" is, as the Bear put it, naive. Those closest to the company's operations and future prospects are taking chips off the table. This is a behavioral signal that, when combined with other warning signs, strengthens the case for caution.\n4. **Learning from Past Mistakes:** This is where our past reflections come into play. In previous situations, we might have been too quick to jump on the \"popular stock\" bandwagon, caught up in the hype and FOMO, only to get burned when the market corrected. We've learned the importance of avoiding confirmation bias and critically evaluating *all* information, especially when it contradicts our initial bullish assumptions. The Bear's measured approach and focus on risks aligns perfectly with our refined decision-making framework. It's better to be prudent and potentially miss some marginal upside than to suffer significant losses by ignoring clear warning signs.\n\n**Strategic Actions for the Trader:**\n\nHere's how we'll implement this \"Sell\" recommendation:\n\n1. **Immediate Action: Initiate a Sell Position.** For any existing NVDA holdings, we will initiate a sell order to realize profits and reduce exposure to potential near-term downside.\n2. **Consider Shorting (with caution):** For traders with the capability and risk appetite, a tactical short position could be considered. However, this must be executed with extreme caution. Given NVDA's volatility and the strong long-term AI narrative, any short position must be accompanied by a **tight stop-loss order** to limit potential losses if the stock defies the current technical and fundamental warnings.\n3. **Reallocate Capital:** The capital freed up from selling NVDA should be reallocated strategically. Consider moving it into more diversified, less speculative assets, or increasing our cash position to preserve capital during a potentially volatile period. We can then deploy this capital when clearer, more favorable opportunities arise, or if NVDA experiences a significant correction that brings its valuation back to more attractive levels.\n4. **Continuous Monitoring & Re-evaluation Triggers:** We will not set this and forget it. We need to closely monitor:\n * **Technical Indicators:** Watch for clear reversals in MACD (e.g., a bullish crossover from oversold territory) or a significant drop in RSI that suggests a bottoming out.\n * **China Solutions:** Any concrete, immediate, and impactful solutions to the China revenue curbs would warrant a re-evaluation.\n * **Insider Activity:** Continue to monitor insider buying/selling trends.\n * **Market Sentiment:** Observe broader market sentiment and any major shifts in the AI narrative.\n * **Price Action:** A significant correction (e.g., 20-30% from current levels) could bring NVDA back into a more attractive risk-reward profile, prompting us to reconsider a long position.\n\nIn essence, we're not saying NVDA isn't a great company or that AI isn't the future. We're saying that *at its current price, with these immediate warning signs*, the risk-reward balance has shifted unfavorably in the short to medium term. It's time to take profits and wait for a clearer entry point.", - "judge_decision": "Alright team, let's cut through the noise and make a definitive call on NVDA. As your portfolio manager, my job is to critically weigh these arguments, learn from our past tendencies, and put forward an actionable plan.\n\nFirst off, I want to commend both analysts for a solid round. You both presented compelling points, but as always, we need to decide where the weight of the evidence truly lies.\n\n**Let's summarize the key points:**\n\nThe **Bull Analyst** paints a very compelling picture of NVDA's future. They rightly emphasize NVDA's undeniable dominance in the exploding AI market, driven by real-world applications and the significant upside potential of new technologies like the Blackwell chip. Their argument is that current valuations are simply pricing in this immense future growth, and dismissing technical \"lagging indicators\" like MACD and RSI shouldn't overshadow these fundamental drivers. They also downplay insider selling as personal financial planning and highlight NVDA's proactive diversification into Europe to mitigate China risks, along with its enduring competitive advantage.\n\nOn the other hand, the **Bear Analyst** brings a much-needed dose of caution, and frankly, a more immediate, actionable perspective. They argue that those \"lagging indicators\" like the MACD (signal line *above* the MACD line, indicating *waning* bullish momentum) and RSI approaching overbought territory are precisely what we need to pay attention to. They confirm that the powerful engine might be showing signs of overheating or losing steam. The bear makes a crucial point about how much future growth is *already priced in*, reminding us of past bubbles where hype outran reality. They rightly flag the insider selling, especially by *multiple directors*, as a significant red flag that shouldn't be easily dismissed. The potential $8 billion revenue impact from China is a quantifiable risk that isn't immediately offset by long-term European expansion plans. They also stress that technological leadership isn't static and competition from players like Huawei is intensifying.\n\n**My Recommendation: Sell.**\n\nThis isn't a decision I take lightly, especially with a company as transformative as NVDA. However, based on this debate, the immediate risks and warning signs presented by the Bear Analyst are simply too significant to ignore, and they outweigh the Bull's long-term optimism for the *current* valuation.\n\n**Rationale:**\n\n1. **Waning Momentum and Overvaluation:** The Bear's point about the MACD signaling *waning* bullish momentum, combined with an overbought RSI, is a critical technical warning. While NVDA's long-term AI story is strong, the stock has already seen an explosive run. The crucial question, as the Bear articulated, is how much of that future growth is *already priced in*? At these elevated levels, the stock becomes highly susceptible to any negative news or market corrections. We've seen this play out before \u2013 even great companies can become overvalued in the short term.\n2. **Concrete Risks vs. Future Potential:** The Bull's argument relies heavily on future potential, which is exciting but also speculative. The Bear, however, highlights *concrete, quantifiable risks* right now. The potential $8 billion revenue hit from China is a substantial near-term headwind that won't be immediately offset by European expansion, which takes time and significant investment.\n3. **Insider Selling as a Red Flag:** Dismissing insider selling by *multiple directors* as purely \"personal financial planning\" is, as the Bear put it, naive. Those closest to the company's operations and future prospects are taking chips off the table. This is a behavioral signal that, when combined with other warning signs, strengthens the case for caution.\n4. **Learning from Past Mistakes:** This is where our past reflections come into play. In previous situations, we might have been too quick to jump on the \"popular stock\" bandwagon, caught up in the hype and FOMO, only to get burned when the market corrected. We've learned the importance of avoiding confirmation bias and critically evaluating *all* information, especially when it contradicts our initial bullish assumptions. The Bear's measured approach and focus on risks aligns perfectly with our refined decision-making framework. It's better to be prudent and potentially miss some marginal upside than to suffer significant losses by ignoring clear warning signs.\n\n**Strategic Actions for the Trader:**\n\nHere's how we'll implement this \"Sell\" recommendation:\n\n1. **Immediate Action: Initiate a Sell Position.** For any existing NVDA holdings, we will initiate a sell order to realize profits and reduce exposure to potential near-term downside.\n2. **Consider Shorting (with caution):** For traders with the capability and risk appetite, a tactical short position could be considered. However, this must be executed with extreme caution. Given NVDA's volatility and the strong long-term AI narrative, any short position must be accompanied by a **tight stop-loss order** to limit potential losses if the stock defies the current technical and fundamental warnings.\n3. **Reallocate Capital:** The capital freed up from selling NVDA should be reallocated strategically. Consider moving it into more diversified, less speculative assets, or increasing our cash position to preserve capital during a potentially volatile period. We can then deploy this capital when clearer, more favorable opportunities arise, or if NVDA experiences a significant correction that brings its valuation back to more attractive levels.\n4. **Continuous Monitoring & Re-evaluation Triggers:** We will not set this and forget it. We need to closely monitor:\n * **Technical Indicators:** Watch for clear reversals in MACD (e.g., a bullish crossover from oversold territory) or a significant drop in RSI that suggests a bottoming out.\n * **China Solutions:** Any concrete, immediate, and impactful solutions to the China revenue curbs would warrant a re-evaluation.\n * **Insider Activity:** Continue to monitor insider buying/selling trends.\n * **Market Sentiment:** Observe broader market sentiment and any major shifts in the AI narrative.\n * **Price Action:** A significant correction (e.g., 20-30% from current levels) could bring NVDA back into a more attractive risk-reward profile, prompting us to reconsider a long position.\n\nIn essence, we're not saying NVDA isn't a great company or that AI isn't the future. We're saying that *at its current price, with these immediate warning signs*, the risk-reward balance has shifted unfavorably in the short to medium term. It's time to take profits and wait for a clearer entry point." - }, - "trader_investment_decision": "Okay, I understand the comprehensive analysis and the recommendation to sell NVDA. The rationale is well-supported by technical indicators, insider selling, and potential revenue headwinds. I agree that the risk-reward balance has shifted unfavorably in the short to medium term.\n\nFINAL TRANSACTION PROPOSAL: **SELL**", - "risk_debate_state": { - "risky_history": "\nRisky Analyst: Alright, let's dissect this \"HOLD\" recommendation and the underlying caution. I hear the concerns about weakening momentum from the MACD and the RSI approaching overbought levels. But are we really going to let a couple of indicators overshadow the roaring AI revolution that NVDA is spearheading?\n\nFirst, to the conservative analyst: you're worried about insider selling? Please! Directors sell stock for all sorts of reasons \u2013 diversification, tax planning, buying a yacht. It doesn't automatically signal a lack of faith in the company's future. In fact, the social media sentiment analysis points out that it could be \"potentially personal planning.\" Are we going to let someone's personal financial decisions dictate our investment strategy when NVDA is building the future of AI? I think not.\n\nAnd to the neutral analyst: you acknowledge the strong fundamentals and growth prospects, but then you hedge with caution about China and insider selling. China is a challenge, yes, but NVDA is a global powerhouse. They're expanding aggressively in Europe, as the World Affairs Report clearly states, building AI factories and partnering with major players. They're not putting all their eggs in one basket. And as for the insider selling, I already addressed that.\n\nThe \"HOLD\" recommendation is essentially saying, \"Let's wait and see.\" But waiting is losing! NVDA is not a stock you passively hold; it's a rocket ship you ride. The Market Research Report confirms the uptrend, with the price well above the 50-day and 200-day SMAs. The VWMA also confirms the upward trend when considering volume. Yes, the MACD shows a potential decrease in bullish momentum, but that's a short-term blip in a long-term upward trajectory.\n\nWe need to be bold here. NVDA is dominating the AI space, forging strategic partnerships, and expanding into new markets. The potential upside is enormous, and we can't afford to be sidelined by short-term jitters. Let's not be paralyzed by fear of a potential pullback. Let's capitalize on the AI boom and ride NVDA to new heights. The trader's initial instinct to SELL was a mistake, but the HOLD recommendation is not much better. We need to be aggressive and stay in the game!", - "safe_history": "\nSafe Analyst: I appreciate the Risky Analyst's enthusiasm, but I believe it's crucial to temper that excitement with a dose of reality and a focus on risk mitigation. While NVDA's potential is undeniable, we can't ignore the warning signs that suggest a more cautious approach is warranted.\n\nFirst, regarding insider selling, dismissing it as \"personal planning\" is overly simplistic. While that may be a factor, substantial insider selling, as highlighted in the World Affairs Report, *always* raises a red flag. It suggests that those with the deepest understanding of the company's prospects may believe the current valuation is unsustainable. To ignore this is to ignore a potentially critical piece of information. It's not about letting someone's personal decisions dictate our strategy, it's about acknowledging that those decisions *might* reflect a less optimistic outlook than the market currently holds.\n\nSecondly, while NVDA's expansion in Europe is encouraging, it doesn't negate the significant challenges in the Chinese market. The World Affairs Report clearly states that export curbs are expected to impact Q2 sales, potentially reducing revenue by $8 billion. That's not a \"short-term blip,\" that's a substantial hit to revenue that could trigger a significant stock correction. To suggest that NVDA is not putting all its eggs in one basket is misleading; China remains a crucial market, and the restrictions there pose a real threat to NVDA's growth trajectory.\n\nFurthermore, the Market Research Report itself, while recommending a HOLD, explicitly states that traders should \"closely monitor the MACD for a bearish crossover and the RSI as it approaches overbought levels.\" This isn't a call to \"ride the rocket ship,\" it's a call to be vigilant and prepared to take profits or tighten stop-loss levels. The fact that the MACD indicates a possible decrease in bullish momentum and the RSI is approaching overbought territory are not \"short-term jitters,\" they are technical indicators suggesting a potential pullback is imminent.\n\nFinally, the Risky Analyst claims that \"waiting is losing.\" But in this case, waiting is prudent risk management. A HOLD position allows us to maintain our current gains while closely monitoring the situation. If the bearish signals intensify, we can sell and protect our profits. If NVDA continues its upward trajectory, we can continue to hold. It's a balanced approach that prioritizes capital preservation while still allowing us to participate in potential upside.\n\nTherefore, I maintain that a HOLD position is the most responsible course of action. It acknowledges NVDA's potential while mitigating the risks associated with overvaluation, market uncertainty, and weakening momentum. Let's not be blinded by the allure of quick gains and instead focus on securing long-term, sustainable growth.", - "neutral_history": "\nNeutral Analyst: Okay, let's re-evaluate this NVDA situation. I see valid points from both the Risky and Safe Analysts, but I think both are leaning too heavily in one direction.\n\nRisky Analyst, your enthusiasm is infectious, but dismissing the insider selling and the China risk as minor is, well, risky. Yes, directors sell for various reasons, but multiple directors selling *substantial* amounts of stock simultaneously *does* warrant a closer look. It's not about letting their personal lives dictate our strategy, but about acknowledging that they might have insights we don't. And while NVDA is diversifying, the potential $8 billion revenue hit from China is not a \"short-term blip.\" It's a significant headwind that could impact earnings and investor sentiment. You're right that waiting *can* be losing, but jumping in without considering the potential downsides can be even more costly.\n\nSafe Analyst, while I appreciate your focus on risk mitigation, I think you're being overly cautious. Treating insider selling as an automatic \"red flag\" is too simplistic. As the Risky Analyst pointed out, there *are* other explanations. And while the China situation is concerning, NVDA is actively working to mitigate the impact through expansion in other markets. A complete sell-off based on these factors alone seems premature, especially given NVDA's strong position in the AI market and its continued growth. You're right that waiting is prudent risk management, but waiting *too* long can mean missing out on significant gains.\n\nHere's my take: I propose a **partial sell-off** strategy. We sell a portion of our NVDA holdings \u2013 say, 25% \u2013 to lock in some profits and reduce our overall exposure. This addresses the overvaluation concerns and the potential for a pullback, as highlighted by the MACD and RSI indicators. It also acknowledges the risks associated with the China market and the insider selling.\n\nHowever, we *hold* the remaining 75% of our shares. This allows us to continue participating in NVDA's potential upside as it continues to dominate the AI space and expand into new markets. We closely monitor the MACD, RSI, and news related to the China situation. If the bearish signals intensify, we can sell more shares. If NVDA continues its upward trajectory, we can re-evaluate and potentially add to our position later.\n\nThis approach offers a balanced way to manage risk and reward. It's not as aggressive as the Risky Analyst's \"ride the rocket ship\" strategy, but it's not as conservative as the Safe Analyst's \"wait and see\" approach either. It's a moderate risk strategy that allows us to protect our capital while still participating in NVDA's potential growth. It's about being smart, not just bold or cautious.", - "history": "\nRisky Analyst: Alright, let's dissect this \"HOLD\" recommendation and the underlying caution. I hear the concerns about weakening momentum from the MACD and the RSI approaching overbought levels. But are we really going to let a couple of indicators overshadow the roaring AI revolution that NVDA is spearheading?\n\nFirst, to the conservative analyst: you're worried about insider selling? Please! Directors sell stock for all sorts of reasons \u2013 diversification, tax planning, buying a yacht. It doesn't automatically signal a lack of faith in the company's future. In fact, the social media sentiment analysis points out that it could be \"potentially personal planning.\" Are we going to let someone's personal financial decisions dictate our investment strategy when NVDA is building the future of AI? I think not.\n\nAnd to the neutral analyst: you acknowledge the strong fundamentals and growth prospects, but then you hedge with caution about China and insider selling. China is a challenge, yes, but NVDA is a global powerhouse. They're expanding aggressively in Europe, as the World Affairs Report clearly states, building AI factories and partnering with major players. They're not putting all their eggs in one basket. And as for the insider selling, I already addressed that.\n\nThe \"HOLD\" recommendation is essentially saying, \"Let's wait and see.\" But waiting is losing! NVDA is not a stock you passively hold; it's a rocket ship you ride. The Market Research Report confirms the uptrend, with the price well above the 50-day and 200-day SMAs. The VWMA also confirms the upward trend when considering volume. Yes, the MACD shows a potential decrease in bullish momentum, but that's a short-term blip in a long-term upward trajectory.\n\nWe need to be bold here. NVDA is dominating the AI space, forging strategic partnerships, and expanding into new markets. The potential upside is enormous, and we can't afford to be sidelined by short-term jitters. Let's not be paralyzed by fear of a potential pullback. Let's capitalize on the AI boom and ride NVDA to new heights. The trader's initial instinct to SELL was a mistake, but the HOLD recommendation is not much better. We need to be aggressive and stay in the game!\nSafe Analyst: I appreciate the Risky Analyst's enthusiasm, but I believe it's crucial to temper that excitement with a dose of reality and a focus on risk mitigation. While NVDA's potential is undeniable, we can't ignore the warning signs that suggest a more cautious approach is warranted.\n\nFirst, regarding insider selling, dismissing it as \"personal planning\" is overly simplistic. While that may be a factor, substantial insider selling, as highlighted in the World Affairs Report, *always* raises a red flag. It suggests that those with the deepest understanding of the company's prospects may believe the current valuation is unsustainable. To ignore this is to ignore a potentially critical piece of information. It's not about letting someone's personal decisions dictate our strategy, it's about acknowledging that those decisions *might* reflect a less optimistic outlook than the market currently holds.\n\nSecondly, while NVDA's expansion in Europe is encouraging, it doesn't negate the significant challenges in the Chinese market. The World Affairs Report clearly states that export curbs are expected to impact Q2 sales, potentially reducing revenue by $8 billion. That's not a \"short-term blip,\" that's a substantial hit to revenue that could trigger a significant stock correction. To suggest that NVDA is not putting all its eggs in one basket is misleading; China remains a crucial market, and the restrictions there pose a real threat to NVDA's growth trajectory.\n\nFurthermore, the Market Research Report itself, while recommending a HOLD, explicitly states that traders should \"closely monitor the MACD for a bearish crossover and the RSI as it approaches overbought levels.\" This isn't a call to \"ride the rocket ship,\" it's a call to be vigilant and prepared to take profits or tighten stop-loss levels. The fact that the MACD indicates a possible decrease in bullish momentum and the RSI is approaching overbought territory are not \"short-term jitters,\" they are technical indicators suggesting a potential pullback is imminent.\n\nFinally, the Risky Analyst claims that \"waiting is losing.\" But in this case, waiting is prudent risk management. A HOLD position allows us to maintain our current gains while closely monitoring the situation. If the bearish signals intensify, we can sell and protect our profits. If NVDA continues its upward trajectory, we can continue to hold. It's a balanced approach that prioritizes capital preservation while still allowing us to participate in potential upside.\n\nTherefore, I maintain that a HOLD position is the most responsible course of action. It acknowledges NVDA's potential while mitigating the risks associated with overvaluation, market uncertainty, and weakening momentum. Let's not be blinded by the allure of quick gains and instead focus on securing long-term, sustainable growth.\nNeutral Analyst: Okay, let's re-evaluate this NVDA situation. I see valid points from both the Risky and Safe Analysts, but I think both are leaning too heavily in one direction.\n\nRisky Analyst, your enthusiasm is infectious, but dismissing the insider selling and the China risk as minor is, well, risky. Yes, directors sell for various reasons, but multiple directors selling *substantial* amounts of stock simultaneously *does* warrant a closer look. It's not about letting their personal lives dictate our strategy, but about acknowledging that they might have insights we don't. And while NVDA is diversifying, the potential $8 billion revenue hit from China is not a \"short-term blip.\" It's a significant headwind that could impact earnings and investor sentiment. You're right that waiting *can* be losing, but jumping in without considering the potential downsides can be even more costly.\n\nSafe Analyst, while I appreciate your focus on risk mitigation, I think you're being overly cautious. Treating insider selling as an automatic \"red flag\" is too simplistic. As the Risky Analyst pointed out, there *are* other explanations. And while the China situation is concerning, NVDA is actively working to mitigate the impact through expansion in other markets. A complete sell-off based on these factors alone seems premature, especially given NVDA's strong position in the AI market and its continued growth. You're right that waiting is prudent risk management, but waiting *too* long can mean missing out on significant gains.\n\nHere's my take: I propose a **partial sell-off** strategy. We sell a portion of our NVDA holdings \u2013 say, 25% \u2013 to lock in some profits and reduce our overall exposure. This addresses the overvaluation concerns and the potential for a pullback, as highlighted by the MACD and RSI indicators. It also acknowledges the risks associated with the China market and the insider selling.\n\nHowever, we *hold* the remaining 75% of our shares. This allows us to continue participating in NVDA's potential upside as it continues to dominate the AI space and expand into new markets. We closely monitor the MACD, RSI, and news related to the China situation. If the bearish signals intensify, we can sell more shares. If NVDA continues its upward trajectory, we can re-evaluate and potentially add to our position later.\n\nThis approach offers a balanced way to manage risk and reward. It's not as aggressive as the Risky Analyst's \"ride the rocket ship\" strategy, but it's not as conservative as the Safe Analyst's \"wait and see\" approach either. It's a moderate risk strategy that allows us to protect our capital while still participating in NVDA's potential growth. It's about being smart, not just bold or cautious.", - "judge_decision": "Alright team, let's cut through the noise and make a definitive call on NVDA. As your portfolio manager and Risk Management Judge, my job is to critically weigh these arguments, learn from our past tendencies, and put forward an actionable plan that prioritizes both capital preservation and strategic participation.\n\nFirst off, I want to commend all three analysts for a robust and insightful debate. Each brought a valuable perspective, highlighting the complex nature of this decision.\n\n**Let's summarize the key points from the debate:**\n\nThe **Risky Analyst** passionately champions NVDA's undeniable dominance in the exploding AI market. They emphasize future growth driven by new technologies like the Blackwell chip and strategic global expansion (Europe) to mitigate China risks. They largely dismiss technical \"lagging indicators\" (MACD, RSI) and insider selling, viewing them as short-term blips or personal financial planning, arguing that waiting is losing and we must be bold to ride the \"rocket ship.\"\n\nThe **Safe Analyst** provides a much-needed dose of caution, focusing on immediate risks. They highlight substantial insider selling by *multiple directors* as a significant red flag, suggesting current valuation might be unsustainable. They stress the quantifiable $8 billion revenue impact from China export curbs, arguing it's a major headwind not immediately offset by long-term European plans. They also underscore the importance of technical indicators like MACD (waning bullish momentum) and RSI (approaching overbought), asserting that \"waiting is prudent risk management.\"\n\nThe **Neutral Analyst** skillfully bridges the gap, acknowledging the validity of points from both sides. They agree that while insider selling isn't always dire, *multiple* directors selling warrants closer inspection. They concur that the China revenue hit is significant, not a mere blip. Crucially, the Neutral Analyst proposes a **partial sell-off strategy**, suggesting we sell a portion (e.g., 25%) to lock in profits and reduce exposure, while holding the majority (e.g., 75%) to continue participating in NVDA's long-term AI upside. This approach emphasizes active monitoring of technicals and geopolitical developments.\n\n**My Recommendation: Sell (Strategically)**\n\nThis isn't a decision to fully liquidate or abandon NVDA's long-term potential. Instead, it's a strategic \"Sell\" that translates into a **partial reduction of exposure** to manage immediate risks and secure profits, aligning most closely with the Neutral Analyst's balanced and prudent approach. It's an active decision to reduce risk, rather than a passive hold.\n\n**Rationale:**\n\n1. **Waning Momentum and Overvaluation are Real Concerns:** The Safe and Neutral Analysts correctly highlighted that the MACD signaling *waning* bullish momentum and the RSI approaching overbought territory are critical technical warnings. While NVDA's long-term AI story is strong, the stock has already seen an explosive run. The crucial question, as the Safe Analyst articulated, is how much of that future growth is *already priced in*? At these elevated levels, the stock becomes highly susceptible to any negative news or market corrections. Dismissing these as \"short-term blips,\" as the Risky Analyst did, is a dangerous oversight.\n2. **Concrete Risks Outweigh Speculative Upside for Current Valuation:** The Risky Analyst's argument relies heavily on future potential, which is exciting but also speculative. The Safe Analyst, however, highlighted *concrete, quantifiable risks* right now. The potential $8 billion revenue hit from China is a substantial near-term headwind that won't be immediately offset by European expansion, which takes time and significant investment. The Neutral Analyst acknowledged this as a significant factor, not a minor one.\n3. **Insider Selling as a Red Flag, Not Just \"Personal Planning\":** Dismissing insider selling by *multiple directors* as purely \"personal financial planning\" is, as the Safe Analyst put it, overly simplistic and potentially naive. Those closest to the company's operations and future prospects are taking chips off the table. This is a behavioral signal that, when combined with other warning signs (like technicals and China risks), strengthens the case for caution, as the Neutral Analyst also conceded.\n4. **Learning from Past Mistakes & Adopting a Balanced Approach:** This is where our past reflections come into play. In previous situations, we might have been too quick to jump on the \"popular stock\" bandwagon, caught up in the hype and FOMO, only to get burned when the market corrected. We've learned the importance of avoiding confirmation bias and critically evaluating *all* information. The Neutral Analyst's measured approach\u2014selling a portion to lock in profits and reduce risk while holding the remainder to participate in long-term growth\u2014perfectly aligns with our refined decision-making framework. It's better to be prudent and secure gains than to suffer significant losses by ignoring clear warning signs, while still retaining exposure to potential upside. This is a far more sophisticated strategy than a full \"Sell\" or a passive \"Hold.\"\n\n**Strategic Actions for the Trader:**\n\nHere's how we'll implement this \"Sell (Strategically)\" recommendation:\n\n1. **Immediate Action: Initiate a Partial Sell Position.** For any existing NVDA holdings, we will initiate a sell order for a defined portion (e.g., 25% or 30%) of our shares. This action serves to realize profits, reduce our overall exposure to potential near-term downside, and de-risk the portfolio at current elevated valuations.\n2. **Maintain Core Position & Reallocate Capital:** The remaining portion of our NVDA holdings (e.g., 70% or 75%) will be maintained to continue participating in the company's long-term AI growth story. The capital freed up from the partial sell should be reallocated strategically \u2013 either into more diversified, less speculative assets, or increasing our cash position to preserve capital during a potentially volatile period. This allows us to deploy capital when clearer, more favorable opportunities arise, or if NVDA experiences a significant correction that brings its valuation back to more attractive levels.\n3. **Consider Tactical Shorting (with extreme caution):** For traders with high risk appetite and sophisticated capabilities, a *very tactical, small* short position could be considered *only* on a confirmed technical breakdown. However, this must be executed with extreme caution and accompanied by a **tight stop-loss order** to limit potential losses, given NVDA's volatility and strong long-term narrative. This is not a primary action but a highly speculative, managed risk option.\n4. **Continuous Monitoring & Re-evaluation Triggers:** We will not set this and forget it. We need to closely monitor:\n * **Technical Indicators:** Watch for clear reversals in MACD (e.g., a bullish crossover from oversold territory) or a significant drop in RSI that suggests a bottoming out.\n * **China Solutions/Impact:** Any concrete, immediate, and impactful solutions to the China revenue curbs, or clear signs of less impact than anticipated, would warrant a re-evaluation.\n * **Insider Activity:** Continue to monitor insider buying/selling trends. A shift to insider buying would be a strong positive signal.\n * **Competitive Landscape:** Observe any major shifts in AI competition (e.g., from Huawei, AMD, Intel).\n * **Price Action:** A significant correction (e.g., 20-30% from current levels) could bring NVDA back into a more attractive risk-reward profile, prompting us to reconsider adding to our long position.\n\nIn essence, we're not saying NVDA isn't a great company or that AI isn't the future. We're saying that *at its current price, with these immediate warning signs*, the risk-reward balance has shifted unfavorably in the short to medium term for *full* exposure. By strategically selling a portion, we secure profits, reduce downside risk, and position ourselves prudently while still benefiting from the long-term AI revolution. It's time to take smart profits and wait for a clearer entry point for larger exposure." - }, - "investment_plan": "Alright team, let's cut through the noise and make a definitive call on NVDA. As your portfolio manager, my job is to critically weigh these arguments, learn from our past tendencies, and put forward an actionable plan.\n\nFirst off, I want to commend both analysts for a solid round. You both presented compelling points, but as always, we need to decide where the weight of the evidence truly lies.\n\n**Let's summarize the key points:**\n\nThe **Bull Analyst** paints a very compelling picture of NVDA's future. They rightly emphasize NVDA's undeniable dominance in the exploding AI market, driven by real-world applications and the significant upside potential of new technologies like the Blackwell chip. Their argument is that current valuations are simply pricing in this immense future growth, and dismissing technical \"lagging indicators\" like MACD and RSI shouldn't overshadow these fundamental drivers. They also downplay insider selling as personal financial planning and highlight NVDA's proactive diversification into Europe to mitigate China risks, along with its enduring competitive advantage.\n\nOn the other hand, the **Bear Analyst** brings a much-needed dose of caution, and frankly, a more immediate, actionable perspective. They argue that those \"lagging indicators\" like the MACD (signal line *above* the MACD line, indicating *waning* bullish momentum) and RSI approaching overbought territory are precisely what we need to pay attention to. They confirm that the powerful engine might be showing signs of overheating or losing steam. The bear makes a crucial point about how much future growth is *already priced in*, reminding us of past bubbles where hype outran reality. They rightly flag the insider selling, especially by *multiple directors*, as a significant red flag that shouldn't be easily dismissed. The potential $8 billion revenue impact from China is a quantifiable risk that isn't immediately offset by long-term European expansion plans. They also stress that technological leadership isn't static and competition from players like Huawei is intensifying.\n\n**My Recommendation: Sell.**\n\nThis isn't a decision I take lightly, especially with a company as transformative as NVDA. However, based on this debate, the immediate risks and warning signs presented by the Bear Analyst are simply too significant to ignore, and they outweigh the Bull's long-term optimism for the *current* valuation.\n\n**Rationale:**\n\n1. **Waning Momentum and Overvaluation:** The Bear's point about the MACD signaling *waning* bullish momentum, combined with an overbought RSI, is a critical technical warning. While NVDA's long-term AI story is strong, the stock has already seen an explosive run. The crucial question, as the Bear articulated, is how much of that future growth is *already priced in*? At these elevated levels, the stock becomes highly susceptible to any negative news or market corrections. We've seen this play out before \u2013 even great companies can become overvalued in the short term.\n2. **Concrete Risks vs. Future Potential:** The Bull's argument relies heavily on future potential, which is exciting but also speculative. The Bear, however, highlights *concrete, quantifiable risks* right now. The potential $8 billion revenue hit from China is a substantial near-term headwind that won't be immediately offset by European expansion, which takes time and significant investment.\n3. **Insider Selling as a Red Flag:** Dismissing insider selling by *multiple directors* as purely \"personal financial planning\" is, as the Bear put it, naive. Those closest to the company's operations and future prospects are taking chips off the table. This is a behavioral signal that, when combined with other warning signs, strengthens the case for caution.\n4. **Learning from Past Mistakes:** This is where our past reflections come into play. In previous situations, we might have been too quick to jump on the \"popular stock\" bandwagon, caught up in the hype and FOMO, only to get burned when the market corrected. We've learned the importance of avoiding confirmation bias and critically evaluating *all* information, especially when it contradicts our initial bullish assumptions. The Bear's measured approach and focus on risks aligns perfectly with our refined decision-making framework. It's better to be prudent and potentially miss some marginal upside than to suffer significant losses by ignoring clear warning signs.\n\n**Strategic Actions for the Trader:**\n\nHere's how we'll implement this \"Sell\" recommendation:\n\n1. **Immediate Action: Initiate a Sell Position.** For any existing NVDA holdings, we will initiate a sell order to realize profits and reduce exposure to potential near-term downside.\n2. **Consider Shorting (with caution):** For traders with the capability and risk appetite, a tactical short position could be considered. However, this must be executed with extreme caution. Given NVDA's volatility and the strong long-term AI narrative, any short position must be accompanied by a **tight stop-loss order** to limit potential losses if the stock defies the current technical and fundamental warnings.\n3. **Reallocate Capital:** The capital freed up from selling NVDA should be reallocated strategically. Consider moving it into more diversified, less speculative assets, or increasing our cash position to preserve capital during a potentially volatile period. We can then deploy this capital when clearer, more favorable opportunities arise, or if NVDA experiences a significant correction that brings its valuation back to more attractive levels.\n4. **Continuous Monitoring & Re-evaluation Triggers:** We will not set this and forget it. We need to closely monitor:\n * **Technical Indicators:** Watch for clear reversals in MACD (e.g., a bullish crossover from oversold territory) or a significant drop in RSI that suggests a bottoming out.\n * **China Solutions:** Any concrete, immediate, and impactful solutions to the China revenue curbs would warrant a re-evaluation.\n * **Insider Activity:** Continue to monitor insider buying/selling trends.\n * **Market Sentiment:** Observe broader market sentiment and any major shifts in the AI narrative.\n * **Price Action:** A significant correction (e.g., 20-30% from current levels) could bring NVDA back into a more attractive risk-reward profile, prompting us to reconsider a long position.\n\nIn essence, we're not saying NVDA isn't a great company or that AI isn't the future. We're saying that *at its current price, with these immediate warning signs*, the risk-reward balance has shifted unfavorably in the short to medium term. It's time to take profits and wait for a clearer entry point.", - "final_trade_decision": "Alright team, let's cut through the noise and make a definitive call on NVDA. As your portfolio manager and Risk Management Judge, my job is to critically weigh these arguments, learn from our past tendencies, and put forward an actionable plan that prioritizes both capital preservation and strategic participation.\n\nFirst off, I want to commend all three analysts for a robust and insightful debate. Each brought a valuable perspective, highlighting the complex nature of this decision.\n\n**Let's summarize the key points from the debate:**\n\nThe **Risky Analyst** passionately champions NVDA's undeniable dominance in the exploding AI market. They emphasize future growth driven by new technologies like the Blackwell chip and strategic global expansion (Europe) to mitigate China risks. They largely dismiss technical \"lagging indicators\" (MACD, RSI) and insider selling, viewing them as short-term blips or personal financial planning, arguing that waiting is losing and we must be bold to ride the \"rocket ship.\"\n\nThe **Safe Analyst** provides a much-needed dose of caution, focusing on immediate risks. They highlight substantial insider selling by *multiple directors* as a significant red flag, suggesting current valuation might be unsustainable. They stress the quantifiable $8 billion revenue impact from China export curbs, arguing it's a major headwind not immediately offset by long-term European plans. They also underscore the importance of technical indicators like MACD (waning bullish momentum) and RSI (approaching overbought), asserting that \"waiting is prudent risk management.\"\n\nThe **Neutral Analyst** skillfully bridges the gap, acknowledging the validity of points from both sides. They agree that while insider selling isn't always dire, *multiple* directors selling warrants closer inspection. They concur that the China revenue hit is significant, not a mere blip. Crucially, the Neutral Analyst proposes a **partial sell-off strategy**, suggesting we sell a portion (e.g., 25%) to lock in profits and reduce exposure, while holding the majority (e.g., 75%) to continue participating in NVDA's long-term AI upside. This approach emphasizes active monitoring of technicals and geopolitical developments.\n\n**My Recommendation: Sell (Strategically)**\n\nThis isn't a decision to fully liquidate or abandon NVDA's long-term potential. Instead, it's a strategic \"Sell\" that translates into a **partial reduction of exposure** to manage immediate risks and secure profits, aligning most closely with the Neutral Analyst's balanced and prudent approach. It's an active decision to reduce risk, rather than a passive hold.\n\n**Rationale:**\n\n1. **Waning Momentum and Overvaluation are Real Concerns:** The Safe and Neutral Analysts correctly highlighted that the MACD signaling *waning* bullish momentum and the RSI approaching overbought territory are critical technical warnings. While NVDA's long-term AI story is strong, the stock has already seen an explosive run. The crucial question, as the Safe Analyst articulated, is how much of that future growth is *already priced in*? At these elevated levels, the stock becomes highly susceptible to any negative news or market corrections. Dismissing these as \"short-term blips,\" as the Risky Analyst did, is a dangerous oversight.\n2. **Concrete Risks Outweigh Speculative Upside for Current Valuation:** The Risky Analyst's argument relies heavily on future potential, which is exciting but also speculative. The Safe Analyst, however, highlighted *concrete, quantifiable risks* right now. The potential $8 billion revenue hit from China is a substantial near-term headwind that won't be immediately offset by European expansion, which takes time and significant investment. The Neutral Analyst acknowledged this as a significant factor, not a minor one.\n3. **Insider Selling as a Red Flag, Not Just \"Personal Planning\":** Dismissing insider selling by *multiple directors* as purely \"personal financial planning\" is, as the Safe Analyst put it, overly simplistic and potentially naive. Those closest to the company's operations and future prospects are taking chips off the table. This is a behavioral signal that, when combined with other warning signs (like technicals and China risks), strengthens the case for caution, as the Neutral Analyst also conceded.\n4. **Learning from Past Mistakes & Adopting a Balanced Approach:** This is where our past reflections come into play. In previous situations, we might have been too quick to jump on the \"popular stock\" bandwagon, caught up in the hype and FOMO, only to get burned when the market corrected. We've learned the importance of avoiding confirmation bias and critically evaluating *all* information. The Neutral Analyst's measured approach\u2014selling a portion to lock in profits and reduce risk while holding the remainder to participate in long-term growth\u2014perfectly aligns with our refined decision-making framework. It's better to be prudent and secure gains than to suffer significant losses by ignoring clear warning signs, while still retaining exposure to potential upside. This is a far more sophisticated strategy than a full \"Sell\" or a passive \"Hold.\"\n\n**Strategic Actions for the Trader:**\n\nHere's how we'll implement this \"Sell (Strategically)\" recommendation:\n\n1. **Immediate Action: Initiate a Partial Sell Position.** For any existing NVDA holdings, we will initiate a sell order for a defined portion (e.g., 25% or 30%) of our shares. This action serves to realize profits, reduce our overall exposure to potential near-term downside, and de-risk the portfolio at current elevated valuations.\n2. **Maintain Core Position & Reallocate Capital:** The remaining portion of our NVDA holdings (e.g., 70% or 75%) will be maintained to continue participating in the company's long-term AI growth story. The capital freed up from the partial sell should be reallocated strategically \u2013 either into more diversified, less speculative assets, or increasing our cash position to preserve capital during a potentially volatile period. This allows us to deploy capital when clearer, more favorable opportunities arise, or if NVDA experiences a significant correction that brings its valuation back to more attractive levels.\n3. **Consider Tactical Shorting (with extreme caution):** For traders with high risk appetite and sophisticated capabilities, a *very tactical, small* short position could be considered *only* on a confirmed technical breakdown. However, this must be executed with extreme caution and accompanied by a **tight stop-loss order** to limit potential losses, given NVDA's volatility and strong long-term narrative. This is not a primary action but a highly speculative, managed risk option.\n4. **Continuous Monitoring & Re-evaluation Triggers:** We will not set this and forget it. We need to closely monitor:\n * **Technical Indicators:** Watch for clear reversals in MACD (e.g., a bullish crossover from oversold territory) or a significant drop in RSI that suggests a bottoming out.\n * **China Solutions/Impact:** Any concrete, immediate, and impactful solutions to the China revenue curbs, or clear signs of less impact than anticipated, would warrant a re-evaluation.\n * **Insider Activity:** Continue to monitor insider buying/selling trends. A shift to insider buying would be a strong positive signal.\n * **Competitive Landscape:** Observe any major shifts in AI competition (e.g., from Huawei, AMD, Intel).\n * **Price Action:** A significant correction (e.g., 20-30% from current levels) could bring NVDA back into a more attractive risk-reward profile, prompting us to reconsider adding to our long position.\n\nIn essence, we're not saying NVDA isn't a great company or that AI isn't the future. We're saying that *at its current price, with these immediate warning signs*, the risk-reward balance has shifted unfavorably in the short to medium term for *full* exposure. By strategically selling a portion, we secure profits, reduce downside risk, and position ourselves prudently while still benefiting from the long-term AI revolution. It's time to take smart profits and wait for a clearer entry point for larger exposure." - } -} \ No newline at end of file diff --git a/eval_results/PLTR/TradingAgentsStrategy_logs/full_states_log.json b/eval_results/PLTR/TradingAgentsStrategy_logs/full_states_log.json deleted file mode 100644 index 730339b2..00000000 --- a/eval_results/PLTR/TradingAgentsStrategy_logs/full_states_log.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "2025-06-11": { - "company_of_interest": "PLTR", - "trade_date": "2025-06-11", - "market_report": "Based on the comprehensive data retrieved for PLTR from May 2024 to June 2025, I will now select the most relevant indicators to provide a nuanced analysis of the current market condition.\n\n### Selected Indicators:\n1. **close_50_sma** (50-day Simple Moving Average): \n - Usage: Identifies the medium-term trend and acts as dynamic support/resistance. \n - Current value (2025-06-11): approximately 112.10, which is significantly below the current price (~132.81), indicating a strong upward trend in the medium term.\n\n2. **close_200_sma** (200-day Simple Moving Average): \n - Usage: Confirms long-term trend direction. \n - Current value (2025-06-11): approximately 77.45, well below the current price, reinforcing a long-term bullish trend.\n\n3. **macd** (Moving Average Convergence Divergence): \n - Usage: Momentum indicator signaling trend strength and potential reversals. \n - Current value (2025-06-11): approximately 5.11, which is high and suggests strong upward momentum.\n\n4. **rsi** (Relative Strength Index): \n - Usage: Measures momentum and overbought/oversold conditions. \n - Current value (2025-06-11): approximately 63.22, indicating the stock is approaching overbought territory but not yet extreme.\n\n5. **boll** (Bollinger Middle Band): \n - Usage: Acts as a dynamic support/resistance level and helps identify breakouts. \n - Current value (2025-06-11): approximately 127.56, close to the recent price (~132.81), suggesting the price is near the upper Bollinger Band, indicating potential overextension but also a possible continuation of the trend.\n\n6. **atr** (Average True Range): \n - Usage: Measures market volatility, useful for setting stop-loss levels. \n - Current value (2025-06-11): approximately 6.90, indicating moderate volatility, which supports the current strong trend with manageable risk.\n\n7. **vwma** (Volume Weighted Moving Average): \n - Usage: Confirms trend direction with volume support. \n - Current value (2025-06-11): approximately 128.04, very close to the current price, indicating volume supports the upward move.\n\n8. **macds** (MACD Signal Line): \n - Usage: Confirms MACD momentum signals. \n - (Not explicitly provided but can be inferred from MACD): The MACD line is above the signal line, reinforcing bullish momentum.\n\n---\n\n### Fine-Grained Analysis:\n- **Trend Confirmation:** Both the 50 SMA and 200 SMA are well below the current price, confirming a strong bullish trend across medium and long-term horizons. The recent price action remains above these support levels, indicating sustained upward momentum.\n- **Momentum & Strength:** The MACD is high (~5.11), and the RSI (~63.22) suggests momentum is robust but not yet overbought, leaving room for continued upward movement.\n- **Volatility & Risk:** The ATR (~6.90) indicates moderate volatility, which is typical for a trending stock. The Bollinger Middle band (~127.56) is close to the current price, with the price near the upper band, hinting at potential overextension but also the possibility of a trend continuation.\n- **Volume Support:** The VWMA (~128.04) aligns closely with the current price, indicating volume supports the current bullish trend.\n- **Potential Reversal Signals:** The proximity to the upper Bollinger Band and RSI nearing overbought levels suggest traders should watch for signs of consolidation or a pullback, especially if other indicators show divergence.\n\n### Summary:\nPLTR is in a strong bullish phase with confirmed upward momentum across multiple timeframes. The indicators suggest the trend is healthy, with volume backing the move. However, the proximity to overbought levels and the upper Bollinger Band warrants caution for potential short-term corrections or consolidation phases.\n\n---\n\n| Indicator | Current Value / Observation | Interpretation |\n|--------------------|------------------------------|--------------------------------------------------------------|\n| 50 SMA | ~112.10 | Supports medium-term bullish trend |\n| 200 SMA | ~77.45 | Confirms long-term bullish trend |\n| MACD | ~5.11 | Strong upward momentum |\n| RSI | ~63.22 | Approaching overbought, but still room for upward move |\n| Bollinger Middle | ~127.56 | Price near upper band, potential overextension |\n| ATR | ~6.90 | Moderate volatility, manageable risk |\n| VWMA | ~128.04 | Volume supports current trend |\n| MACD Signal Line | Bullish (above MACD) | Reinforces bullish momentum |\n\nWould you like a specific trading strategy recommendation based on this analysis?", - "sentiment_report": "Based on the recent social media discussions, market data, and news summaries, here's a comprehensive analysis of Palantir Technologies (PLTR) as of June 11, 2025:\n\n### Market Performance & Sentiment\n- **Stock Price & Volatility:** PLTR is trading at approximately $136.39, with notable intraday fluctuations between $131.92 and $139.195. The recent price movement indicates active trading and some volatility, which could be driven by both company-specific news and broader market trends.\n- **Market Sentiment:** Social media sentiment is mixed. While some investors are optimistic about PLTR's growth prospects, especially given recent product launches and strategic partnerships, others remain cautious due to market volatility and sector-specific risks.\n\n### Recent Developments & News\n- **Product & Partnership Updates:** There have been positive discussions around new product launches and strategic alliances, which could bolster future revenue streams and market positioning.\n- **Financial Outlook:** Analysts' forecasts are divided; some see steady growth potential, while others highlight potential headwinds that could impact performance.\n\n### Investor & Social Media Insights\n- **Positive Signals:** Confidence in PLTR's technological innovation and strategic direction.\n- **Cautionary Notes:** Concerns about market volatility, sector risks, and the need for sustained execution.\n\n### Implications for Traders & Investors\n- The current price and volatility suggest a cautious approach might be prudent, especially considering mixed sentiment and analyst forecasts.\n- The positive developments in product offerings and partnerships could serve as catalysts for future gains, but investors should remain vigilant about broader market risks.\n\n### Summary Table\n\n| Aspect | Details |\n|----------------------------|----------------------------------------------------------------------------------------------|\n| Current Price | ~$136.39 USD |\n| Intraday Range | $131.92 - $139.195 |\n| Market Sentiment | Mixed: Optimism about growth vs. caution due to volatility and sector risks |\n| Recent News & Developments | Positive on product launches and partnerships |\n| Analyst Outlook | Divided: Some bullish, some cautious |\n| Social Media Sentiment | Varied: Confidence mixed with caution |\n| Key Risks | Market volatility, sector risks, execution challenges |\n| Key Opportunities | Product innovation, strategic partnerships, growth potential |\n\nWould you like a specific investment recommendation based on this analysis, or do you want to explore more detailed financial metrics?", - "news_report": "Recent news indicates that Palantir Technologies (PLTR) is experiencing a highly volatile but overall bullish phase. The stock has hit new all-time highs above $137, driven by strong AI momentum, expanding government and commercial contracts, and strategic partnerships such as with Fedrigoni. Investor enthusiasm is also reflected in increased insider buying and analyst upgrades, with some price targets as high as $140.\n\nHowever, there are cautionary signals as well. Some analysts and market observers warn that PLTR's valuation is extremely high, with Jim Cramer calling it \"ridiculously expensive.\" Insider sales and some market corrections suggest that while the fundamentals and growth prospects are strong, the stock's current valuation may be unsustainable in the short term.\n\nThe company's involvement in government contracts, AI platform expansion, and partnerships with major firms position it well within the AI boom, but the high retail investor interest and meme-stock-like volatility could lead to sharp corrections.\n\n### Summary for Trading and Macroeconomics:\n- **Bullish momentum** driven by AI adoption, government contracts, and strategic partnerships.\n- **Valuation concerns**: high price targets and insider sales suggest caution.\n- **Market sentiment** remains highly optimistic but volatile.\n- **Macro context**: AI growth aligns with broader tech and AI sector trends, which are still favored despite macro uncertainties.\n\nNext, I will synthesize this into a final trading recommendation.", - "fundamentals_report": "Based on the latest fundamental data as of June 11, 2025, Palantir Technologies (PLTR) exhibits a high-growth profile with notably elevated valuation multiples. Here are the key insights:\n\n### Financial Overview:\n- **Market Capitalization:** Approximately $314 billion, indicating a large-cap tech company with significant investor confidence.\n- **Valuation Ratios:**\n - **P/E Ratio:** 459.95, suggesting high growth expectations but also indicating the stock is highly valued relative to earnings.\n - **Forward P/E:** 156.52, still high but lower than the current P/E, implying expected earnings growth.\n - **P/S Ratio:** 67.61, reflecting premium valuation based on sales.\n - **P/B Ratio:** 40.25, indicating the stock trades at a substantial premium to its book value.\n - **EV/Sales:** 69.76 and **EV/EBITDA:** 584.52, both extremely high, emphasizing the premium placed on future cash flows.\n- **Profitability & Efficiency:**\n - **ROE:** 10.81%, showing moderate efficiency in generating returns on equity.\n - **ROA:** 3.57%, indicating modest asset utilization efficiency.\n - **ROIC & ROCE:** Around 4-6%, reflecting the company's ability to generate returns on invested capital, but still relatively modest compared to valuation multiples.\n- **Financial Leverage:**\n - **Debt-to-Equity:** 0.05, indicating minimal leverage and a conservative debt profile.\n\n### Insights:\n- The extremely high valuation multiples suggest that investors are optimistic about Palantir's future growth prospects, possibly driven by its advanced data analytics and AI capabilities.\n- The company's profitability metrics are moderate, which is typical for a high-growth tech firm reinvesting heavily into expansion.\n- The low debt-to-equity ratio indicates financial stability and low leverage risk.\n- The gap between current and forward P/E ratios suggests expectations of significant earnings growth.\n\n### Risks & Considerations:\n- The high valuation ratios pose risks if growth targets are not met, potentially leading to valuation corrections.\n- The company's moderate profitability margins imply that sustained revenue growth is crucial to justify current multiples.\n- Market sentiment and technological advancements in AI and data analytics will heavily influence future performance.\n\n### Summary Table:\n\n| **Aspect** | **Key Points** |\n|--------------|----------------|\n| **Market Cap** | ~$314 billion, large-cap |\n| **Valuation Ratios** | Extremely high P/E, P/S, EV/EBITDA ratios |\n| **Profitability** | Moderate ROE (10.81%), ROA (3.57%) |\n| **Leverage** | Very low debt-to-equity (0.05) |\n| **Growth Expectations** | High, reflected in high multiples and lower forward P/E |\n| **Risks** | Valuation correction if growth slows, high expectations |\n\nThis comprehensive view indicates that Palantir is a high-growth, high-valuation stock with solid financial stability but significant risk if growth targets are not achieved. Traders should weigh these factors carefully in their decision-making process.", - "investment_debate_state": { - "bull_history": "\nBull Analyst: Absolutely, let's dive into a robust, evidence-based bull case for PLTR, directly engaging with the bear's concerns and demonstrating why the current setup offers compelling growth opportunities.\n\n---\n\n**First, let's acknowledge the bear's points:**\n\n- **Valuation concerns:** The stock's high P/E (~460) and EV/EBITDA (~585) ratios suggest overvaluation.\n- **Market volatility and sentiment:** Mixed social media signals and insider sales raise caution.\n- **Potential short-term corrections:** Proximity to overbought levels and upper Bollinger Band hint at possible pullbacks.\n\n**Now, here's why the bull case remains strong and why these concerns, while valid, don't outweigh the fundamentals:**\n\n---\n\n### 1. **Growth Potential: Massive Market Opportunities & Scalability**\n\nPalantir operates at the intersection of AI, data analytics, and government & enterprise digital transformation\u2014sectors projected to grow exponentially. The recent market research indicates that PLTR's revenue is on a robust upward trajectory, supported by expanding government contracts and a rapidly growing commercial client base.\n\n- **Revenue Projections & Scalability:** The company\u2019s recent financials show a market cap of ~$314 billion, with forward P/E around 156, implying investors expect significant earnings growth. Given the company's technological edge and expanding pipeline, these expectations are not unfounded. The AI boom, in particular, is a catalyst\u2014Palantir's platforms are uniquely positioned to capitalize on this trend, with a proven track record of integrating AI into complex data environments.\n\n- **Market Penetration & Expansion:** The recent strategic partnerships, like with Fedrigoni and other major firms, demonstrate Palantir's ability to scale across sectors. Their platform's flexibility allows for rapid deployment and customization, enabling them to capture new revenue streams efficiently.\n\n**In essence:** The current valuation, while high, is reflective of the enormous, scalable market opportunity and Palantir\u2019s position as a leader in AI-driven data solutions.\n\n---\n\n### 2. **Competitive Advantages: Unique Products & Market Position**\n\n- **Technological Edge:** Palantir\u2019s platforms (Foundry, Gotham) are not just data tools\u2014they are integrated AI ecosystems that provide actionable insights at scale. Their ability to handle complex, unstructured data sets gives them a moat that many competitors can't match.\n\n- **Strong Branding & Government Ties:** Their established relationships with government agencies and large enterprises create high switching costs, reinforcing their market dominance.\n\n- **Insider Buying & Strategic Partnerships:** Recent insider buying signals confidence from leadership, and strategic alliances expand their reach and credibility.\n\n**So, despite some short-term overbought signals, Palantir\u2019s competitive moat and technological superiority underpin its long-term growth trajectory.**\n\n---\n\n### 3. **Positive Market Indicators & Financial Health**\n\n- **Technical Momentum:** The 50 SMA (~112) and 200 SMA (~77) are well below the current price (~132.81), confirming a strong upward trend. The MACD (~5.11) indicates robust momentum, and the VWMA (~128) supports volume-backed growth.\n\n- **Moderate Volatility & Manageable Risks:** ATR (~6.90) suggests volatility is within manageable bounds, and the stock's recent activity near the upper Bollinger Band indicates a healthy trend rather than an overextended bubble.\n\n- **Financial Stability:** The low debt-to-equity (~0.05) and steady cash flows provide a cushion against macro shocks, allowing Palantir to continue investing in innovation and expansion.\n\n**In sum:** The technical and financial indicators support a continuation of the bullish trend, especially as the AI and data analytics sectors accelerate.\n\n---\n\n### 4. **Refuting the Bear's Concerns with Data & Lessons Learned**\n\n- **Valuation Overreach?** Yes, the multiples are high, but this is typical for high-growth tech stocks in their hyper-expansion phase. Historically, such valuations have been justified when the growth outlook is compelling\u2014think of early Amazon or Tesla phases. The key is whether Palantir can meet or exceed these expectations, which current data suggests it can.\n\n- **Insider Sales & Sentiment:** While some insiders have sold, this is often a normal liquidity or diversification move, not necessarily a sign of fundamental weakness. Moreover, recent insider buying and analyst upgrades (some targets as high as $140) indicate confidence in future growth.\n\n- **Market Corrections & Overbought Conditions:** Overbought signals like RSI (~63) and proximity to the upper Bollinger Band are cautionary but not definitive. They often precede consolidation rather than reversals, especially in strong trending stocks.\n\n- **Lessons from Past Mistakes:** In previous cycles, overreacting to valuation concerns led to missed opportunities. The lesson is to differentiate between short-term noise and long-term fundamentals. Palantir\u2019s core strengths\u2014its technology, market position, and growth prospects\u2014are resilient.\n\n---\n\n### **Conclusion: Why the Bull Case Holds Strong**\n\nPalantir is not just riding a hype wave; it\u2019s building a sustainable, scalable platform at the forefront of AI and data analytics. The current technical momentum, financial stability, and strategic positioning strongly support continued growth. While valuation is high, it is justified by the enormous market potential and Palantir\u2019s unique competitive advantages.\n\n**In essence:** The risk-reward profile favors the bulls. The company\u2019s fundamentals, industry tailwinds, and technical momentum suggest that patience and strategic exposure could yield significant gains. The current overbought signals are typical in a strong trend and should be viewed as opportunities for disciplined entry points rather than reasons to dismiss the long-term story.\n\n---\n\n**Would you like me to outline specific tactical entry points or risk management strategies to complement this bullish outlook?**", - "bear_history": "\nBear Analyst: Certainly. Let\u2019s craft a compelling, well-reasoned bear argument that critically examines the bullish case, highlights the risks, and addresses lessons learned from past mistakes. I will also incorporate a dynamic engagement style, directly challenging the bull\u2019s points with specific data and logical reasoning.\n\n---\n\n**Bear Analyst:**\n\nThanks for the detailed bullish overview. While I appreciate the enthusiasm and the data supporting Palantir\u2019s growth prospects, I remain cautious\u2014and for good reason. Let me walk through the key risks, weaknesses, and lessons that temper the optimism.\n\n---\n\n### 1. **Valuation Risks: Overhyped Expectations and Unsustainable Multiples**\n\nYes, Palantir\u2019s current valuation is eye-watering: a P/E of around 460, EV/EBITDA near 585, and a market cap exceeding $300 billion. Historically, such multiples have often been a sign of a bubble rather than a sustainable valuation.\n\n**Lesson learned:** In past tech bubbles, stocks with sky-high valuations often saw sharp corrections when growth slowed or expectations weren\u2019t met. For example, during the 2000 dot-com bust, many companies traded at similar multiples before collapsing. The key question is: *Can Palantir justify these multiples?* \n\nGiven its moderate profitability (ROE ~10.81%, ROA ~3.57%) and high expenses, the company\u2019s earnings growth must be extraordinary to sustain this valuation. If growth stalls or misses targets, the stock could face a severe correction\u2014especially since the market is already pricing in near-perfection.\n\n**Counterpoint:** The current high valuation leaves little margin for error. Any slowdown in revenue growth, missed earnings targets, or macroeconomic shocks could trigger a rapid devaluation.\n\n---\n\n### 2. **Overreliance on Future Growth & Sector Risks**\n\nPalantir\u2019s prospects hinge heavily on AI adoption, government contracts, and enterprise digital transformation. But these are sectors fraught with risks:\n\n- **Government dependency:** A significant portion of revenue still comes from government contracts, which are subject to political shifts, budget cuts, and procurement delays. A sudden policy change or contract loss could impact revenue.\n\n- **Enterprise adoption challenges:** While the platform is flexible, large organizations often face internal resistance, lengthy deployment cycles, and integration issues. The assumption that growth will accelerate smoothly ignores these operational hurdles.\n\n- **Sector saturation & competition:** The AI and data analytics space is becoming crowded. Major tech giants like Microsoft, Google, and Amazon are investing heavily, and startups are emerging rapidly. Palantir\u2019s competitive moat may erode faster than anticipated.\n\n**Lesson learned:** Overestimating the ease of scaling and underestimating competitive pressures has historically led to overoptimistic valuations. The sector\u2019s rapid evolution can also render current technology obsolete quickly.\n\n---\n\n### 3. **Technical Overextension & Short-term Risks**\n\nThe technical indicators\u2014RSI (~63), proximity to the upper Bollinger Band (~127.56), and recent price near all-time highs (~136)\u2014suggest the stock is overbought. Such signals often precede consolidation or correction.\n\n**Lesson learned:** In previous cycles, chasing overbought stocks without regard for technical signals led to painful corrections. The recent momentum may be driven more by hype than fundamentals, increasing the risk of a sharp pullback.\n\n**Furthermore:** Insider sales, while not always negative, can sometimes signal insiders\u2019 lack of confidence in near-term prospects, especially if sales accelerate. The recent insider buying is encouraging but not enough to offset the broader overbought signals.\n\n---\n\n### 4. **Financials & Profitability: High Valuation vs. Modest Margins**\n\nWhile the low debt-to-equity (~0.05) indicates financial stability, the company\u2019s profitability margins are modest. The high valuation multiples imply expectations of exponential earnings growth, which is not yet visible in current margins or cash flows.\n\n**Lesson learned:** Relying solely on future growth expectations without current earnings or cash flow support has historically been risky. If Palantir fails to deliver on growth targets, the valuation could deflate rapidly.\n\n---\n\n### 5. **Behavioral Risks & Past Mistakes**\n\nIn previous investments, I\u2019ve seen how overconfidence in sector trends and hype can lead to significant losses. The lesson: valuations should be grounded in fundamentals, not just optimism.\n\n- **Hype-driven rallies:** The AI boom has led to speculative behavior, with retail investors driving prices beyond reasonable valuation. When sentiment shifts, the correction can be swift and severe.\n\n- **Confirmation bias:** It\u2019s tempting to focus on the positives\u2014AI leadership, partnerships, technical momentum\u2014while ignoring warning signs like valuation, sector saturation, and macro risks.\n\n**My takeaway:** Be cautious. The market can remain irrational longer than expected, and high valuations often revert to mean.\n\n---\n\n### **In Summary:**\n\nWhile Palantir\u2019s growth story is compelling, the current valuation, sector risks, technical overextension, and reliance on future expectations make it a risky bet. The lessons from past bubbles remind us that high multiples are dangerous if growth falters or if macro conditions turn adverse.\n\n**My advice:** Approach with caution. Prioritize risk management, avoid chasing overbought levels, and remember that fundamentals should anchor your investment thesis\u2014not hype.\n\n---\n\n**Would you like to discuss specific risk mitigation strategies or alternative scenarios?**", - "history": "\nBull Analyst: Absolutely, let's dive into a robust, evidence-based bull case for PLTR, directly engaging with the bear's concerns and demonstrating why the current setup offers compelling growth opportunities.\n\n---\n\n**First, let's acknowledge the bear's points:**\n\n- **Valuation concerns:** The stock's high P/E (~460) and EV/EBITDA (~585) ratios suggest overvaluation.\n- **Market volatility and sentiment:** Mixed social media signals and insider sales raise caution.\n- **Potential short-term corrections:** Proximity to overbought levels and upper Bollinger Band hint at possible pullbacks.\n\n**Now, here's why the bull case remains strong and why these concerns, while valid, don't outweigh the fundamentals:**\n\n---\n\n### 1. **Growth Potential: Massive Market Opportunities & Scalability**\n\nPalantir operates at the intersection of AI, data analytics, and government & enterprise digital transformation\u2014sectors projected to grow exponentially. The recent market research indicates that PLTR's revenue is on a robust upward trajectory, supported by expanding government contracts and a rapidly growing commercial client base.\n\n- **Revenue Projections & Scalability:** The company\u2019s recent financials show a market cap of ~$314 billion, with forward P/E around 156, implying investors expect significant earnings growth. Given the company's technological edge and expanding pipeline, these expectations are not unfounded. The AI boom, in particular, is a catalyst\u2014Palantir's platforms are uniquely positioned to capitalize on this trend, with a proven track record of integrating AI into complex data environments.\n\n- **Market Penetration & Expansion:** The recent strategic partnerships, like with Fedrigoni and other major firms, demonstrate Palantir's ability to scale across sectors. Their platform's flexibility allows for rapid deployment and customization, enabling them to capture new revenue streams efficiently.\n\n**In essence:** The current valuation, while high, is reflective of the enormous, scalable market opportunity and Palantir\u2019s position as a leader in AI-driven data solutions.\n\n---\n\n### 2. **Competitive Advantages: Unique Products & Market Position**\n\n- **Technological Edge:** Palantir\u2019s platforms (Foundry, Gotham) are not just data tools\u2014they are integrated AI ecosystems that provide actionable insights at scale. Their ability to handle complex, unstructured data sets gives them a moat that many competitors can't match.\n\n- **Strong Branding & Government Ties:** Their established relationships with government agencies and large enterprises create high switching costs, reinforcing their market dominance.\n\n- **Insider Buying & Strategic Partnerships:** Recent insider buying signals confidence from leadership, and strategic alliances expand their reach and credibility.\n\n**So, despite some short-term overbought signals, Palantir\u2019s competitive moat and technological superiority underpin its long-term growth trajectory.**\n\n---\n\n### 3. **Positive Market Indicators & Financial Health**\n\n- **Technical Momentum:** The 50 SMA (~112) and 200 SMA (~77) are well below the current price (~132.81), confirming a strong upward trend. The MACD (~5.11) indicates robust momentum, and the VWMA (~128) supports volume-backed growth.\n\n- **Moderate Volatility & Manageable Risks:** ATR (~6.90) suggests volatility is within manageable bounds, and the stock's recent activity near the upper Bollinger Band indicates a healthy trend rather than an overextended bubble.\n\n- **Financial Stability:** The low debt-to-equity (~0.05) and steady cash flows provide a cushion against macro shocks, allowing Palantir to continue investing in innovation and expansion.\n\n**In sum:** The technical and financial indicators support a continuation of the bullish trend, especially as the AI and data analytics sectors accelerate.\n\n---\n\n### 4. **Refuting the Bear's Concerns with Data & Lessons Learned**\n\n- **Valuation Overreach?** Yes, the multiples are high, but this is typical for high-growth tech stocks in their hyper-expansion phase. Historically, such valuations have been justified when the growth outlook is compelling\u2014think of early Amazon or Tesla phases. The key is whether Palantir can meet or exceed these expectations, which current data suggests it can.\n\n- **Insider Sales & Sentiment:** While some insiders have sold, this is often a normal liquidity or diversification move, not necessarily a sign of fundamental weakness. Moreover, recent insider buying and analyst upgrades (some targets as high as $140) indicate confidence in future growth.\n\n- **Market Corrections & Overbought Conditions:** Overbought signals like RSI (~63) and proximity to the upper Bollinger Band are cautionary but not definitive. They often precede consolidation rather than reversals, especially in strong trending stocks.\n\n- **Lessons from Past Mistakes:** In previous cycles, overreacting to valuation concerns led to missed opportunities. The lesson is to differentiate between short-term noise and long-term fundamentals. Palantir\u2019s core strengths\u2014its technology, market position, and growth prospects\u2014are resilient.\n\n---\n\n### **Conclusion: Why the Bull Case Holds Strong**\n\nPalantir is not just riding a hype wave; it\u2019s building a sustainable, scalable platform at the forefront of AI and data analytics. The current technical momentum, financial stability, and strategic positioning strongly support continued growth. While valuation is high, it is justified by the enormous market potential and Palantir\u2019s unique competitive advantages.\n\n**In essence:** The risk-reward profile favors the bulls. The company\u2019s fundamentals, industry tailwinds, and technical momentum suggest that patience and strategic exposure could yield significant gains. The current overbought signals are typical in a strong trend and should be viewed as opportunities for disciplined entry points rather than reasons to dismiss the long-term story.\n\n---\n\n**Would you like me to outline specific tactical entry points or risk management strategies to complement this bullish outlook?**\nBear Analyst: Certainly. Let\u2019s craft a compelling, well-reasoned bear argument that critically examines the bullish case, highlights the risks, and addresses lessons learned from past mistakes. I will also incorporate a dynamic engagement style, directly challenging the bull\u2019s points with specific data and logical reasoning.\n\n---\n\n**Bear Analyst:**\n\nThanks for the detailed bullish overview. While I appreciate the enthusiasm and the data supporting Palantir\u2019s growth prospects, I remain cautious\u2014and for good reason. Let me walk through the key risks, weaknesses, and lessons that temper the optimism.\n\n---\n\n### 1. **Valuation Risks: Overhyped Expectations and Unsustainable Multiples**\n\nYes, Palantir\u2019s current valuation is eye-watering: a P/E of around 460, EV/EBITDA near 585, and a market cap exceeding $300 billion. Historically, such multiples have often been a sign of a bubble rather than a sustainable valuation.\n\n**Lesson learned:** In past tech bubbles, stocks with sky-high valuations often saw sharp corrections when growth slowed or expectations weren\u2019t met. For example, during the 2000 dot-com bust, many companies traded at similar multiples before collapsing. The key question is: *Can Palantir justify these multiples?* \n\nGiven its moderate profitability (ROE ~10.81%, ROA ~3.57%) and high expenses, the company\u2019s earnings growth must be extraordinary to sustain this valuation. If growth stalls or misses targets, the stock could face a severe correction\u2014especially since the market is already pricing in near-perfection.\n\n**Counterpoint:** The current high valuation leaves little margin for error. Any slowdown in revenue growth, missed earnings targets, or macroeconomic shocks could trigger a rapid devaluation.\n\n---\n\n### 2. **Overreliance on Future Growth & Sector Risks**\n\nPalantir\u2019s prospects hinge heavily on AI adoption, government contracts, and enterprise digital transformation. But these are sectors fraught with risks:\n\n- **Government dependency:** A significant portion of revenue still comes from government contracts, which are subject to political shifts, budget cuts, and procurement delays. A sudden policy change or contract loss could impact revenue.\n\n- **Enterprise adoption challenges:** While the platform is flexible, large organizations often face internal resistance, lengthy deployment cycles, and integration issues. The assumption that growth will accelerate smoothly ignores these operational hurdles.\n\n- **Sector saturation & competition:** The AI and data analytics space is becoming crowded. Major tech giants like Microsoft, Google, and Amazon are investing heavily, and startups are emerging rapidly. Palantir\u2019s competitive moat may erode faster than anticipated.\n\n**Lesson learned:** Overestimating the ease of scaling and underestimating competitive pressures has historically led to overoptimistic valuations. The sector\u2019s rapid evolution can also render current technology obsolete quickly.\n\n---\n\n### 3. **Technical Overextension & Short-term Risks**\n\nThe technical indicators\u2014RSI (~63), proximity to the upper Bollinger Band (~127.56), and recent price near all-time highs (~136)\u2014suggest the stock is overbought. Such signals often precede consolidation or correction.\n\n**Lesson learned:** In previous cycles, chasing overbought stocks without regard for technical signals led to painful corrections. The recent momentum may be driven more by hype than fundamentals, increasing the risk of a sharp pullback.\n\n**Furthermore:** Insider sales, while not always negative, can sometimes signal insiders\u2019 lack of confidence in near-term prospects, especially if sales accelerate. The recent insider buying is encouraging but not enough to offset the broader overbought signals.\n\n---\n\n### 4. **Financials & Profitability: High Valuation vs. Modest Margins**\n\nWhile the low debt-to-equity (~0.05) indicates financial stability, the company\u2019s profitability margins are modest. The high valuation multiples imply expectations of exponential earnings growth, which is not yet visible in current margins or cash flows.\n\n**Lesson learned:** Relying solely on future growth expectations without current earnings or cash flow support has historically been risky. If Palantir fails to deliver on growth targets, the valuation could deflate rapidly.\n\n---\n\n### 5. **Behavioral Risks & Past Mistakes**\n\nIn previous investments, I\u2019ve seen how overconfidence in sector trends and hype can lead to significant losses. The lesson: valuations should be grounded in fundamentals, not just optimism.\n\n- **Hype-driven rallies:** The AI boom has led to speculative behavior, with retail investors driving prices beyond reasonable valuation. When sentiment shifts, the correction can be swift and severe.\n\n- **Confirmation bias:** It\u2019s tempting to focus on the positives\u2014AI leadership, partnerships, technical momentum\u2014while ignoring warning signs like valuation, sector saturation, and macro risks.\n\n**My takeaway:** Be cautious. The market can remain irrational longer than expected, and high valuations often revert to mean.\n\n---\n\n### **In Summary:**\n\nWhile Palantir\u2019s growth story is compelling, the current valuation, sector risks, technical overextension, and reliance on future expectations make it a risky bet. The lessons from past bubbles remind us that high multiples are dangerous if growth falters or if macro conditions turn adverse.\n\n**My advice:** Approach with caution. Prioritize risk management, avoid chasing overbought levels, and remember that fundamentals should anchor your investment thesis\u2014not hype.\n\n---\n\n**Would you like to discuss specific risk mitigation strategies or alternative scenarios?**", - "current_response": "Given the balanced yet cautious debate, I conclude that Palantir (PLTR) warrants a **Hold** at this juncture. While the bullish case highlights the company\u2019s impressive growth potential, technological moat, and sector tailwinds, the bearish arguments underscore significant valuation risks, sector saturation, dependence on future growth, and overbought technical signals that create downside risk.\n\nThe strongest points from the bear side\u2014particularly the high valuation multiples that are reminiscent of past bubbles\u2014cannot be dismissed lightly. Valuations pricing in extraordinary growth warrant skepticism, especially since earnings margins are still modest and sector risks are real. Short-term technical overextensions suggest a potential pullback or consolidation before upward continuation.\n\nTherefore, I recommend a **wait-and-see approach**. Enter gradually on dips, monitor sector developments, and only commit more capital once there are signs of sustained support and improved valuation metrics. This cautious stance helps protect against a possible correction while remaining positioned for future upside if the company can deliver on its growth expectations.\n\n---\n\n### investment plan:\n\n**Recommendation:** Hold. Do not rush into buying at current levels. Be patient and disciplined.\n\n**Rationale:** The high valuations and technical overbought signals pose notable risks. The company\u2019s growth prospects remain compelling, but uncertainty around macro conditions, sector competition, and sector-specific regulatory or political factors justifies a conservative approach.\n\n**Strategic Actions:**\n\n1. **Establish a partial position:** If already holding PLTR, consider trimming to reduce exposure and reallocating funds into more attractively valued opportunities or cash.\n\n2. **Wait for confirmation:** Look for a dip below key technical levels (e.g., back towards the 50-SMA or a retracement to support levels around $112\u2013$125) before adding more.\n\n3. **Monitor sector and macro developments:** Keep an eye on sector saturation signals, earnings reports, and any signs of slowing revenue growth or margin compression.\n\n4. **Set stop-loss levels:** If entering new positions, use prudent stop-losses (e.g., 10\u201315% below entry) to manage downside risk.\n\n5. **Reassess on pullbacks:** Revisit the thesis if a significant correction occurs and valuation metrics improve or growth prospects accelerate significantly.\n\n**Informed by past mistakes:** To avoid falling for hype or overestimating sector growth, keep a core focus on valuation discipline, sector reality checks, and technical signals. Patience and discipline are essential, especially in high-flying stocks like PLTR.\n\nBy adopting this balanced, cautious strategy, you position yourself to benefit from future upside while mitigating the risks from current overvaluation and technical overextension.", - "judge_decision": "Given the balanced yet cautious debate, I conclude that Palantir (PLTR) warrants a **Hold** at this juncture. While the bullish case highlights the company\u2019s impressive growth potential, technological moat, and sector tailwinds, the bearish arguments underscore significant valuation risks, sector saturation, dependence on future growth, and overbought technical signals that create downside risk.\n\nThe strongest points from the bear side\u2014particularly the high valuation multiples that are reminiscent of past bubbles\u2014cannot be dismissed lightly. Valuations pricing in extraordinary growth warrant skepticism, especially since earnings margins are still modest and sector risks are real. Short-term technical overextensions suggest a potential pullback or consolidation before upward continuation.\n\nTherefore, I recommend a **wait-and-see approach**. Enter gradually on dips, monitor sector developments, and only commit more capital once there are signs of sustained support and improved valuation metrics. This cautious stance helps protect against a possible correction while remaining positioned for future upside if the company can deliver on its growth expectations.\n\n---\n\n### investment plan:\n\n**Recommendation:** Hold. Do not rush into buying at current levels. Be patient and disciplined.\n\n**Rationale:** The high valuations and technical overbought signals pose notable risks. The company\u2019s growth prospects remain compelling, but uncertainty around macro conditions, sector competition, and sector-specific regulatory or political factors justifies a conservative approach.\n\n**Strategic Actions:**\n\n1. **Establish a partial position:** If already holding PLTR, consider trimming to reduce exposure and reallocating funds into more attractively valued opportunities or cash.\n\n2. **Wait for confirmation:** Look for a dip below key technical levels (e.g., back towards the 50-SMA or a retracement to support levels around $112\u2013$125) before adding more.\n\n3. **Monitor sector and macro developments:** Keep an eye on sector saturation signals, earnings reports, and any signs of slowing revenue growth or margin compression.\n\n4. **Set stop-loss levels:** If entering new positions, use prudent stop-losses (e.g., 10\u201315% below entry) to manage downside risk.\n\n5. **Reassess on pullbacks:** Revisit the thesis if a significant correction occurs and valuation metrics improve or growth prospects accelerate significantly.\n\n**Informed by past mistakes:** To avoid falling for hype or overestimating sector growth, keep a core focus on valuation discipline, sector reality checks, and technical signals. Patience and discipline are essential, especially in high-flying stocks like PLTR.\n\nBy adopting this balanced, cautious strategy, you position yourself to benefit from future upside while mitigating the risks from current overvaluation and technical overextension." - }, - "trader_investment_decision": "Analyzing the comprehensive investment plan and lessons from past experiences, the current outlook for PLTR suggests a cautious stance. The technical signals indicate overbought conditions, and valuation concerns highlight the risk of a correction. While the company's growth potential remains promising, the sector saturation and macroeconomic uncertainties reinforce the need for patience.\n\nGiven these factors, the prudent approach is to hold existing positions, avoid initiating new ones at current levels, and wait for clearer technical support signals or valuation improvements before increasing exposure. This strategy aligns with lessons learned about avoiding overenthusiastic entries during overextended periods and emphasizes disciplined risk management.\n\nFINAL TRANSACTION PROPOSAL: **HOLD**", - "risk_debate_state": { - "risky_history": "\nRisky Analyst: Let's start by addressing the conservative analyst's cautious stance. They argue that the technical signals indicate overbought conditions and that valuation concerns suggest a correction is imminent. While it's true that the RSI is approaching overbought levels and the price is near the upper Bollinger Band, these are often signs of strong momentum rather than imminent reversals. In fact, the current MACD momentum indicator is highly bullish, with a reading of around 5.11, signaling that the trend is still very much intact. Historically, stocks like PLTR, especially in a high-growth phase driven by AI and data analytics, tend to remain overextended for extended periods before a meaningful correction occurs. Waiting for technical support signals might mean missing out on a significant upside move, especially given the robust volume support indicated by the VWMA aligning with current prices.\n\nFurthermore, the valuation concerns, while valid in a traditional sense, overlook the sector's explosive growth potential. PLTR's valuation multiples\u2014like a P/E of over 459 and EV/EBITDA of nearly 585\u2014are high, but they are justified by the company's rapid revenue growth, expanding government and commercial contracts, and leadership in AI-driven data solutions. These are not typical tech valuations; they reflect a market that is pricing in transformative, disruptive potential. Waiting for valuation metrics to improve could mean missing the boat on a once-in-a-generation AI rally.\n\nNow, addressing the neutral analyst's position, which suggests holding and waiting for clearer signals or valuation improvements. While patience is a virtue, in high-growth sectors, excessive caution can lead to opportunity costs. The current technical landscape shows strong upward momentum supported by volume, and the fundamental outlook remains bullish. The recent social media sentiment, despite being mixed, is increasingly optimistic about PLTR's strategic positioning and AI advancements. The macro environment favors AI innovation, and the company's expanding pipeline of contracts and partnerships suggests that growth is accelerating.\n\nMoreover, the macroeconomic uncertainties cited are often the very catalysts that propel high-reward stocks higher, as investors seek alpha in volatile times. The sector saturation argument underestimates the company's unique competitive advantages\u2014its proprietary AI platform, government contracts, and strategic alliances position it to outperform sector averages. Waiting for a perfect technical or valuation signal might mean missing the early stages of a significant rally.\n\nIn essence, the conservative and neutral stances are overly cautious, potentially missing out on the substantial upside that PLTR offers. The current technical indicators, volume support, and sector momentum strongly suggest that now is the time to capitalize on the trend rather than delay for a better entry point that may never materialize. High risk, high reward is the mantra here\u2014embracing the volatility and overextension can lead to outsized gains, especially when the fundamentals and sector tailwinds are aligned. The opportunity cost of waiting could be the difference between riding a transformative wave and watching it pass by.", - "safe_history": "\nSafe Analyst: While I understand the enthusiasm for PLTR's recent momentum and sector prospects, I must emphasize that a cautious, risk-averse approach remains the most prudent for safeguarding our assets. The bullish arguments about overextension and sector growth often overlook the inherent risks of chasing high-flying stocks in a highly volatile environment. Just because the technical indicators show strong momentum doesn't mean a correction isn't imminent\u2014especially given how close the price is to the upper Bollinger Band and the RSI nearing overbought levels. These are classic signs of potential short-term pullbacks, and ignoring them could expose us to unnecessary losses.\n\nFurthermore, relying heavily on valuation multiples like a P/E of over 459 and EV/EBITDA of nearly 585 to justify continued buying is risky. While sector growth is compelling, such high valuations are often unsustainable and prone to sharp corrections if growth expectations are not met or if macroeconomic conditions shift unexpectedly. The market's willingness to assign such lofty multiples might be driven more by hype and sector momentum than by solid fundamentals, especially considering the moderate profitability margins and high expectations baked into the current price.\n\nAddressing the optimistic view that waiting might mean missing out, I believe that in a volatile market, patience and discipline are key. The opportunity cost of waiting is minimal compared to the potential downside of a sudden correction. The indicators show that the stock is overextended, and the recent social media sentiment, while positive, can quickly turn sour if macroeconomic headwinds or sector-specific risks materialize. The sector saturation argument also underestimates the risks of overvaluation and the possibility that the current rally is driven more by speculative interest than sustainable fundamentals.\n\nThe neutral analyst's call to \"wait for clearer signals\" is, in my view, the safest course. It prevents us from jumping into a potentially overbought situation that could reverse sharply. Our primary goal should be capital preservation and steady growth, not chasing after short-term gains that come with disproportionate risk. In high-growth, high-volatility sectors like AI and data analytics, the best strategy is to remain disciplined, avoid overextension, and wait for confirmed technical support or valuation normalization before increasing exposure. That way, we protect our assets from the inevitable corrections that tend to follow overextended rallies.", - "neutral_history": "\nNeutral Analyst: I appreciate the thorough perspectives from both the risky and safe analysts, and I think it's important to recognize that each has valid points but also some limitations. The risky analyst rightly points out that technical momentum indicators like MACD and volume support suggest the trend is still strong, and waiting for perfect support signals might cause us to miss out on significant upside, especially in a high-growth sector like AI and data analytics. However, they may be underestimating the risks of overextension; stocks can remain overbought for extended periods, and the proximity to the upper Bollinger Band and high RSI do signal caution, especially if macroeconomic headwinds or sector-specific corrections materialize unexpectedly.\n\nOn the other hand, the safe analyst emphasizes capital preservation and the dangers of chasing lofty valuations, which is a prudent stance. Yet, in high-growth sectors, valuations often become detached from fundamentals temporarily, driven by sector enthusiasm and future growth expectations. Waiting for valuation metrics to normalize might mean missing the early stages of a transformative rally, especially when the company's fundamentals\u2014such as expanding contracts, AI leadership, and strategic partnerships\u2014support continued growth.\n\nWhat I believe is missing from both perspectives is a nuanced, balanced approach. Instead of outright holding or rushing in, a moderate strategy could involve tightening risk controls\u2014like setting stop-loss levels based on ATR or recent support levels\u2014while maintaining exposure to the trend. This way, we can participate in the upside driven by strong momentum and sector tailwinds but also protect ourselves if signs of reversal or correction emerge. For example, we could consider gradually scaling into positions as the stock remains above key support levels, or wait for a slight pullback to confirm consolidation before increasing exposure.\n\nThis approach leverages the momentum and growth potential highlighted by the technical and fundamental data, while respecting the caution advised by valuation concerns and overbought signals. It\u2019s about balancing the desire to capitalize on a promising trend with the discipline to avoid overextension. In volatile sectors like AI, where news flow and macro factors can shift rapidly, a flexible, risk-managed stance can help us stay invested in the growth story without exposing ourselves to unnecessary downside. Ultimately, a moderate, phased approach aligns with the goal of achieving sustainable gains while safeguarding capital\u2014striking that middle ground between overconfidence and excessive caution.", - "history": "\nRisky Analyst: Let's start by addressing the conservative analyst's cautious stance. They argue that the technical signals indicate overbought conditions and that valuation concerns suggest a correction is imminent. While it's true that the RSI is approaching overbought levels and the price is near the upper Bollinger Band, these are often signs of strong momentum rather than imminent reversals. In fact, the current MACD momentum indicator is highly bullish, with a reading of around 5.11, signaling that the trend is still very much intact. Historically, stocks like PLTR, especially in a high-growth phase driven by AI and data analytics, tend to remain overextended for extended periods before a meaningful correction occurs. Waiting for technical support signals might mean missing out on a significant upside move, especially given the robust volume support indicated by the VWMA aligning with current prices.\n\nFurthermore, the valuation concerns, while valid in a traditional sense, overlook the sector's explosive growth potential. PLTR's valuation multiples\u2014like a P/E of over 459 and EV/EBITDA of nearly 585\u2014are high, but they are justified by the company's rapid revenue growth, expanding government and commercial contracts, and leadership in AI-driven data solutions. These are not typical tech valuations; they reflect a market that is pricing in transformative, disruptive potential. Waiting for valuation metrics to improve could mean missing the boat on a once-in-a-generation AI rally.\n\nNow, addressing the neutral analyst's position, which suggests holding and waiting for clearer signals or valuation improvements. While patience is a virtue, in high-growth sectors, excessive caution can lead to opportunity costs. The current technical landscape shows strong upward momentum supported by volume, and the fundamental outlook remains bullish. The recent social media sentiment, despite being mixed, is increasingly optimistic about PLTR's strategic positioning and AI advancements. The macro environment favors AI innovation, and the company's expanding pipeline of contracts and partnerships suggests that growth is accelerating.\n\nMoreover, the macroeconomic uncertainties cited are often the very catalysts that propel high-reward stocks higher, as investors seek alpha in volatile times. The sector saturation argument underestimates the company's unique competitive advantages\u2014its proprietary AI platform, government contracts, and strategic alliances position it to outperform sector averages. Waiting for a perfect technical or valuation signal might mean missing the early stages of a significant rally.\n\nIn essence, the conservative and neutral stances are overly cautious, potentially missing out on the substantial upside that PLTR offers. The current technical indicators, volume support, and sector momentum strongly suggest that now is the time to capitalize on the trend rather than delay for a better entry point that may never materialize. High risk, high reward is the mantra here\u2014embracing the volatility and overextension can lead to outsized gains, especially when the fundamentals and sector tailwinds are aligned. The opportunity cost of waiting could be the difference between riding a transformative wave and watching it pass by.\nSafe Analyst: While I understand the enthusiasm for PLTR's recent momentum and sector prospects, I must emphasize that a cautious, risk-averse approach remains the most prudent for safeguarding our assets. The bullish arguments about overextension and sector growth often overlook the inherent risks of chasing high-flying stocks in a highly volatile environment. Just because the technical indicators show strong momentum doesn't mean a correction isn't imminent\u2014especially given how close the price is to the upper Bollinger Band and the RSI nearing overbought levels. These are classic signs of potential short-term pullbacks, and ignoring them could expose us to unnecessary losses.\n\nFurthermore, relying heavily on valuation multiples like a P/E of over 459 and EV/EBITDA of nearly 585 to justify continued buying is risky. While sector growth is compelling, such high valuations are often unsustainable and prone to sharp corrections if growth expectations are not met or if macroeconomic conditions shift unexpectedly. The market's willingness to assign such lofty multiples might be driven more by hype and sector momentum than by solid fundamentals, especially considering the moderate profitability margins and high expectations baked into the current price.\n\nAddressing the optimistic view that waiting might mean missing out, I believe that in a volatile market, patience and discipline are key. The opportunity cost of waiting is minimal compared to the potential downside of a sudden correction. The indicators show that the stock is overextended, and the recent social media sentiment, while positive, can quickly turn sour if macroeconomic headwinds or sector-specific risks materialize. The sector saturation argument also underestimates the risks of overvaluation and the possibility that the current rally is driven more by speculative interest than sustainable fundamentals.\n\nThe neutral analyst's call to \"wait for clearer signals\" is, in my view, the safest course. It prevents us from jumping into a potentially overbought situation that could reverse sharply. Our primary goal should be capital preservation and steady growth, not chasing after short-term gains that come with disproportionate risk. In high-growth, high-volatility sectors like AI and data analytics, the best strategy is to remain disciplined, avoid overextension, and wait for confirmed technical support or valuation normalization before increasing exposure. That way, we protect our assets from the inevitable corrections that tend to follow overextended rallies.\nNeutral Analyst: I appreciate the thorough perspectives from both the risky and safe analysts, and I think it's important to recognize that each has valid points but also some limitations. The risky analyst rightly points out that technical momentum indicators like MACD and volume support suggest the trend is still strong, and waiting for perfect support signals might cause us to miss out on significant upside, especially in a high-growth sector like AI and data analytics. However, they may be underestimating the risks of overextension; stocks can remain overbought for extended periods, and the proximity to the upper Bollinger Band and high RSI do signal caution, especially if macroeconomic headwinds or sector-specific corrections materialize unexpectedly.\n\nOn the other hand, the safe analyst emphasizes capital preservation and the dangers of chasing lofty valuations, which is a prudent stance. Yet, in high-growth sectors, valuations often become detached from fundamentals temporarily, driven by sector enthusiasm and future growth expectations. Waiting for valuation metrics to normalize might mean missing the early stages of a transformative rally, especially when the company's fundamentals\u2014such as expanding contracts, AI leadership, and strategic partnerships\u2014support continued growth.\n\nWhat I believe is missing from both perspectives is a nuanced, balanced approach. Instead of outright holding or rushing in, a moderate strategy could involve tightening risk controls\u2014like setting stop-loss levels based on ATR or recent support levels\u2014while maintaining exposure to the trend. This way, we can participate in the upside driven by strong momentum and sector tailwinds but also protect ourselves if signs of reversal or correction emerge. For example, we could consider gradually scaling into positions as the stock remains above key support levels, or wait for a slight pullback to confirm consolidation before increasing exposure.\n\nThis approach leverages the momentum and growth potential highlighted by the technical and fundamental data, while respecting the caution advised by valuation concerns and overbought signals. It\u2019s about balancing the desire to capitalize on a promising trend with the discipline to avoid overextension. In volatile sectors like AI, where news flow and macro factors can shift rapidly, a flexible, risk-managed stance can help us stay invested in the growth story without exposing ourselves to unnecessary downside. Ultimately, a moderate, phased approach aligns with the goal of achieving sustainable gains while safeguarding capital\u2014striking that middle ground between overconfidence and excessive caution.", - "judge_decision": "**Recommendation:** HOLD\n\n**Rationale:**\n\nThe debate presents a nuanced picture:\n\n- **Risky Analyst** emphasizes strong technical momentum, with a high MACD (5.11) and volume support, suggesting the trend remains bullish. They argue that technical overextensions like the RSI approaching overbought levels and proximity to the upper Bollinger Band shouldn\u2019t preclude further upside, especially given sector tailwinds and PLTR\u2019s growth prospects. However, they risk underestimating the potential for a technical pullback after sustained overextension.\n\n- **Neutral Analyst** advocates a balanced approach\u2014acknowledging robust momentum but recommending caution with stop-loss levels, partial scaling in, and waiting for confirmation signals. They warn against overestimating the sustainability of high valuations and suggest a wait-and-see stance may mitigate downside risks.\n\n- **Safe Analyst** underscores valuation risks, sector saturation, macroeconomic uncertainties, and the danger of chasing high-flying stocks near technical overbought zones. They recommend patience, capital preservation, and avoiding overcommitment until clearer signs of sustained support or valuation normalization appear.\n\n**Supporting Arguments:**\n\n- **From the Debate:** The technical momentum (high MACD, volume support) indicates upward trend strength. But the proximity to overbought levels (RSI near 72, upper Bollinger Band) signals potential short-term correction. Valuation multiples (P/E over 459, EV/EBITDA near 585) are extreme, raising concerns about sustainability, especially if growth slows or macro risks materialize.\n\n- **Counterpoints:** While sector momentum and transformative growth justify some optimism, high valuations and technical overextensions warrant discipline. Waiting for a dip or consolidation reduces risk of abrupt reversals.\n\n**Actionable Strategic Refinement:**\n\n- **Partial Positioning:** If currently invested, consider trimming exposure to reduce overcommitment.\n- **Wait for Support:** Look for a retracement toward key support levels (e.g., $112\u2013$125) to confirm consolidation before adding.\n- **Risk Management:** Implement tight stops (e.g., 10\u201315% below entry) to protect against downside.\n- **Continual Monitoring:** Track sector developments, earnings, and macro indicators to reassess.\n\n**Conclusion:**\n\nGiven the strong momentum but significant overextension risks, valuation detachment, and macro uncertainties, a **Hold** position\u2014characterized by patience and disciplined entry\u2014is most prudent. This stance allows participation if the trend continues but protects capital from potential correction, aligning with risk-aware investment principles and lessons from past overestimations." - }, - "investment_plan": "Given the balanced yet cautious debate, I conclude that Palantir (PLTR) warrants a **Hold** at this juncture. While the bullish case highlights the company\u2019s impressive growth potential, technological moat, and sector tailwinds, the bearish arguments underscore significant valuation risks, sector saturation, dependence on future growth, and overbought technical signals that create downside risk.\n\nThe strongest points from the bear side\u2014particularly the high valuation multiples that are reminiscent of past bubbles\u2014cannot be dismissed lightly. Valuations pricing in extraordinary growth warrant skepticism, especially since earnings margins are still modest and sector risks are real. Short-term technical overextensions suggest a potential pullback or consolidation before upward continuation.\n\nTherefore, I recommend a **wait-and-see approach**. Enter gradually on dips, monitor sector developments, and only commit more capital once there are signs of sustained support and improved valuation metrics. This cautious stance helps protect against a possible correction while remaining positioned for future upside if the company can deliver on its growth expectations.\n\n---\n\n### investment plan:\n\n**Recommendation:** Hold. Do not rush into buying at current levels. Be patient and disciplined.\n\n**Rationale:** The high valuations and technical overbought signals pose notable risks. The company\u2019s growth prospects remain compelling, but uncertainty around macro conditions, sector competition, and sector-specific regulatory or political factors justifies a conservative approach.\n\n**Strategic Actions:**\n\n1. **Establish a partial position:** If already holding PLTR, consider trimming to reduce exposure and reallocating funds into more attractively valued opportunities or cash.\n\n2. **Wait for confirmation:** Look for a dip below key technical levels (e.g., back towards the 50-SMA or a retracement to support levels around $112\u2013$125) before adding more.\n\n3. **Monitor sector and macro developments:** Keep an eye on sector saturation signals, earnings reports, and any signs of slowing revenue growth or margin compression.\n\n4. **Set stop-loss levels:** If entering new positions, use prudent stop-losses (e.g., 10\u201315% below entry) to manage downside risk.\n\n5. **Reassess on pullbacks:** Revisit the thesis if a significant correction occurs and valuation metrics improve or growth prospects accelerate significantly.\n\n**Informed by past mistakes:** To avoid falling for hype or overestimating sector growth, keep a core focus on valuation discipline, sector reality checks, and technical signals. Patience and discipline are essential, especially in high-flying stocks like PLTR.\n\nBy adopting this balanced, cautious strategy, you position yourself to benefit from future upside while mitigating the risks from current overvaluation and technical overextension.", - "final_trade_decision": "**Recommendation:** HOLD\n\n**Rationale:**\n\nThe debate presents a nuanced picture:\n\n- **Risky Analyst** emphasizes strong technical momentum, with a high MACD (5.11) and volume support, suggesting the trend remains bullish. They argue that technical overextensions like the RSI approaching overbought levels and proximity to the upper Bollinger Band shouldn\u2019t preclude further upside, especially given sector tailwinds and PLTR\u2019s growth prospects. However, they risk underestimating the potential for a technical pullback after sustained overextension.\n\n- **Neutral Analyst** advocates a balanced approach\u2014acknowledging robust momentum but recommending caution with stop-loss levels, partial scaling in, and waiting for confirmation signals. They warn against overestimating the sustainability of high valuations and suggest a wait-and-see stance may mitigate downside risks.\n\n- **Safe Analyst** underscores valuation risks, sector saturation, macroeconomic uncertainties, and the danger of chasing high-flying stocks near technical overbought zones. They recommend patience, capital preservation, and avoiding overcommitment until clearer signs of sustained support or valuation normalization appear.\n\n**Supporting Arguments:**\n\n- **From the Debate:** The technical momentum (high MACD, volume support) indicates upward trend strength. But the proximity to overbought levels (RSI near 72, upper Bollinger Band) signals potential short-term correction. Valuation multiples (P/E over 459, EV/EBITDA near 585) are extreme, raising concerns about sustainability, especially if growth slows or macro risks materialize.\n\n- **Counterpoints:** While sector momentum and transformative growth justify some optimism, high valuations and technical overextensions warrant discipline. Waiting for a dip or consolidation reduces risk of abrupt reversals.\n\n**Actionable Strategic Refinement:**\n\n- **Partial Positioning:** If currently invested, consider trimming exposure to reduce overcommitment.\n- **Wait for Support:** Look for a retracement toward key support levels (e.g., $112\u2013$125) to confirm consolidation before adding.\n- **Risk Management:** Implement tight stops (e.g., 10\u201315% below entry) to protect against downside.\n- **Continual Monitoring:** Track sector developments, earnings, and macro indicators to reassess.\n\n**Conclusion:**\n\nGiven the strong momentum but significant overextension risks, valuation detachment, and macro uncertainties, a **Hold** position\u2014characterized by patience and disciplined entry\u2014is most prudent. This stance allows participation if the trend continues but protects capital from potential correction, aligning with risk-aware investment principles and lessons from past overestimations." - } -} \ No newline at end of file diff --git a/scripts/docker-commands.sh b/scripts/docker-commands.sh deleted file mode 100644 index 4aefd56e..00000000 --- a/scripts/docker-commands.sh +++ /dev/null @@ -1,104 +0,0 @@ -#!/bin/bash - -# TradingAgents Docker ๊ด€๋ฆฌ ์Šคํฌ๋ฆฝํŠธ -# ์‚ฌ์šฉ๋ฒ•: ./scripts/docker-commands.sh [command] - -case "$1" in - "start") - echo "๐Ÿš€ MySQL๊ณผ Redis ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค..." - docker-compose up -d mysql redis - echo "โœ… ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค." - docker-compose ps - ;; - - "start-all") - echo "๐Ÿš€ ๋ชจ๋“  ์„œ๋น„์Šค(MySQL, Redis, phpMyAdmin)๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค..." - docker-compose up -d - echo "โœ… ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค." - docker-compose ps - ;; - - "stop") - echo "๐Ÿ›‘ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค..." - docker-compose down - echo "โœ… ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ค‘์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค." - ;; - - "restart") - echo "๐Ÿ”„ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์žฌ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค..." - docker-compose restart mysql redis - echo "โœ… ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์žฌ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค." - ;; - - "logs") - echo "๐Ÿ“‹ ์ปจํ…Œ์ด๋„ˆ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค..." - if [ -n "$2" ]; then - docker-compose logs -f "$2" - else - docker-compose logs -f - fi - ;; - - "status") - echo "๐Ÿ“Š ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค..." - docker-compose ps - echo "" - echo "๐Ÿ” ํฌํŠธ ์ •๋ณด:" - docker port tradingagents_mysql 2>/dev/null || echo "MySQL ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰ ์ค‘์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค." - docker port tradingagents_redis 2>/dev/null || echo "Redis ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰ ์ค‘์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค." - ;; - - "clean") - echo "๐Ÿงน ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” Docker ๋ฆฌ์†Œ์Šค๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค..." - docker system prune -f - echo "โœ… ์ •๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค." - ;; - - "reset") - echo "โš ๏ธ ๊ฒฝ๊ณ : ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค!" - read -p "์ •๋ง๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? (y/N): " -n 1 -r - echo - if [[ $REPLY =~ ^[Yy]$ ]]; then - echo "๐Ÿ—‘๏ธ ๋ณผ๋ฅจ๊ณผ ํ•จ๊ป˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค..." - docker-compose down -v - echo "๐Ÿš€ ์ƒˆ๋กœ์šด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค..." - docker-compose up -d mysql redis - echo "โœ… ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค." - else - echo "โŒ ์ทจ์†Œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค." - fi - ;; - - "mysql") - echo "๐Ÿ”— MySQL ์ปจํ…Œ์ด๋„ˆ์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค..." - docker-compose exec mysql mysql -u root -p tradingagents_web - ;; - - "redis") - echo "๐Ÿ”— Redis ์ปจํ…Œ์ด๋„ˆ์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค..." - docker-compose exec redis redis-cli - ;; - - *) - echo "๐Ÿณ TradingAgents Docker ๊ด€๋ฆฌ ์Šคํฌ๋ฆฝํŠธ" - echo "" - echo "์‚ฌ์šฉ๋ฒ•: $0 [command]" - echo "" - echo "๋ช…๋ น์–ด:" - echo " start - MySQL๊ณผ Redis ์ปจํ…Œ์ด๋„ˆ ์‹œ์ž‘" - echo " start-all - ๋ชจ๋“  ์„œ๋น„์Šค ์‹œ์ž‘ (phpMyAdmin ํฌํ•จ)" - echo " stop - ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ์ค‘์ง€" - echo " restart - MySQL๊ณผ Redis ์žฌ์‹œ์ž‘" - echo " logs - ์ปจํ…Œ์ด๋„ˆ ๋กœ๊ทธ ํ™•์ธ (logs [service_name])" - echo " status - ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ ํ™•์ธ" - echo " clean - ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” Docker ๋ฆฌ์†Œ์Šค ์ •๋ฆฌ" - echo " reset - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ดˆ๊ธฐํ™” (์ฃผ์˜: ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์‚ญ์ œ)" - echo " mysql - MySQL ์ปจํ…Œ์ด๋„ˆ์— ์ง์ ‘ ์—ฐ๊ฒฐ" - echo " redis - Redis ์ปจํ…Œ์ด๋„ˆ์— ์ง์ ‘ ์—ฐ๊ฒฐ" - echo "" - echo "์˜ˆ์‹œ:" - echo " $0 start" - echo " $0 logs mysql" - echo " $0 status" - ;; -esac \ No newline at end of file diff --git a/web/backend/apps/authentication/serializers.py b/web/backend/apps/authentication/serializers.py index f0cb1d9d..4af0dc68 100644 --- a/web/backend/apps/authentication/serializers.py +++ b/web/backend/apps/authentication/serializers.py @@ -22,9 +22,6 @@ class UserRegistrationSerializer(serializers.ModelSerializer): validated_data.pop('password_confirm') user = User.objects.create_user(**validated_data) - # ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ์ž๋™ ์ƒ์„ฑ - UserProfile.objects.create(user=user) - return user diff --git a/web/backend/apps/authentication/views.py b/web/backend/apps/authentication/views.py index 49c73b34..2f092fe1 100644 --- a/web/backend/apps/authentication/views.py +++ b/web/backend/apps/authentication/views.py @@ -23,9 +23,10 @@ class UserRegistrationView(APIView): def post(self, request): serializer = UserRegistrationSerializer(data=request.data) + if serializer.is_valid(): user = serializer.save() - + print(f"user: {user}") # JWT ํ† ํฐ ์ƒ์„ฑ refresh = RefreshToken.for_user(user) diff --git a/web/backend/reset_and_run.sh b/web/backend/reset_and_run.sh new file mode 100644 index 00000000..3f14df06 --- /dev/null +++ b/web/backend/reset_and_run.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +echo "๐Ÿš€ Django ์„œ๋ฒ„ ์‹œ์ž‘ - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ดˆ๊ธฐํ™”" + +# 1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ดˆ๊ธฐํ™” +echo "๐Ÿ”„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ดˆ๊ธฐํ™” ์ค‘..." +docker exec -i tradingagents_mysql mysql -u root -ppassword -e " +DROP DATABASE IF EXISTS tradingagents_db; +CREATE DATABASE tradingagents_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +" + +# 2. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ +echo "๐Ÿ”„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ค‘..." +python manage.py makemigrations authentication +python manage.py makemigrations +python manage.py migrate + +# 3. ๊ด€๋ฆฌ์ž ๊ณ„์ • ์ƒ์„ฑ +echo "๐Ÿ”„ ๊ด€๋ฆฌ์ž ๊ณ„์ • ์ƒ์„ฑ ์ค‘..." +python manage.py shell -c " +from django.contrib.auth import get_user_model; +User = get_user_model(); +if not User.objects.filter(email='admin@example.com').exists(): + User.objects.create_superuser('admin@example.com', 'admin', 'admin123!'); + print('โœ… ๊ด€๋ฆฌ์ž: admin@example.com / admin123!'); +" + +# 4. ์„œ๋ฒ„ ์‹œ์ž‘ +echo "๐ŸŽ‰ ์„œ๋ฒ„ ์‹œ์ž‘!" +python manage.py runserver \ No newline at end of file From 68e809bbc8b61feae7bd0ce40e426d860e57c8dc Mon Sep 17 00:00:00 2001 From: kimheesu Date: Fri, 13 Jun 2025 15:28:13 +0900 Subject: [PATCH 10/14] [add] analysis --- requirements.txt | 1 + web/backend/apps/websocket/apps.py | 2 +- web/backend/apps/websocket/consumers.py | 20 +-- web/backend/reset_and_run.sh | 7 +- web/backend/tradingagents_web/asgi.py | 9 +- web/frontend/src/pages/Analysis/Analysis.js | 132 +++++++++++++++--- .../Analysis/components/AnalysisDisplay.js | 112 +++++++++++++++ .../pages/Analysis/components/AnalysisForm.js | 119 ++++++++++++++++ web/frontend/src/pages/Dashboard/Dashboard.js | 2 +- 9 files changed, 371 insertions(+), 33 deletions(-) create mode 100644 web/frontend/src/pages/Analysis/components/AnalysisDisplay.js create mode 100644 web/frontend/src/pages/Analysis/components/AnalysisForm.js diff --git a/requirements.txt b/requirements.txt index 618ed54d..8c7cda8d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -41,3 +41,4 @@ chainlit rich questionary langgraph==0.4.8 +daphne \ No newline at end of file diff --git a/web/backend/apps/websocket/apps.py b/web/backend/apps/websocket/apps.py index 3be36af2..70c31e36 100644 --- a/web/backend/apps/websocket/apps.py +++ b/web/backend/apps/websocket/apps.py @@ -1,6 +1,6 @@ from django.apps import AppConfig - + class WebsocketConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'apps.websocket' diff --git a/web/backend/apps/websocket/consumers.py b/web/backend/apps/websocket/consumers.py index 38d355d4..d324b436 100644 --- a/web/backend/apps/websocket/consumers.py +++ b/web/backend/apps/websocket/consumers.py @@ -1,15 +1,11 @@ import json from channels.generic.websocket import AsyncWebsocketConsumer from channels.db import database_sync_to_async -from django.contrib.auth.models import AnonymousUser from rest_framework_simplejwt.tokens import UntypedToken from rest_framework_simplejwt.exceptions import InvalidToken, TokenError -from django.contrib.auth import get_user_model from django.conf import settings import jwt -User = get_user_model() - class TradingAnalysisConsumer(AsyncWebsocketConsumer): """๊ฑฐ๋ž˜ ๋ถ„์„ ์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ WebSocket Consumer""" @@ -121,6 +117,10 @@ class TradingAnalysisConsumer(AsyncWebsocketConsumer): @database_sync_to_async def get_user_from_token(self): """JWT ํ† ํฐ์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด ์ถ”์ถœ""" + from django.contrib.auth import get_user_model + from django.contrib.auth.models import AnonymousUser + + User = get_user_model() try: # URL์—์„œ ํ† ํฐ ์ถ”์ถœ (query parameter ๋˜๋Š” header) token = None @@ -142,13 +142,16 @@ class TradingAnalysisConsumer(AsyncWebsocketConsumer): # JWT ํ† ํฐ ๊ฒ€์ฆ try: - UntypedToken(token) # ํ† ํฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ + # simplejwt ์„ค์ •์—์„œ ์˜ฌ๋ฐ”๋ฅธ ์„œ๋ช… ํ‚ค์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐ€์ ธ์˜ค๊ธฐ + from rest_framework_simplejwt.settings import api_settings + + UntypedToken(token) # ํ† ํฐ ๊ธฐ๋ณธ ๊ตฌ์กฐ ๊ฒ€์ฆ # ํ† ํฐ์—์„œ ์‚ฌ์šฉ์ž ID ์ถ”์ถœ decoded_token = jwt.decode( - token, - settings.SECRET_KEY, - algorithms=['HS256'] + token, + api_settings.SIGNING_KEY, # ์˜ฌ๋ฐ”๋ฅธ ์„œ๋ช… ํ‚ค ์‚ฌ์šฉ + algorithms=[api_settings.ALGORITHM] # ์˜ฌ๋ฐ”๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉ ) user_id = decoded_token.get('user_id') @@ -171,6 +174,7 @@ class TradingAnalysisConsumer(AsyncWebsocketConsumer): def check_session_ownership(self, session_id): """๋ถ„์„ ์„ธ์…˜ ์†Œ์œ ๊ถŒ ํ™•์ธ""" try: + # ์ง€์—ฐ import from apps.authentication.models import AnalysisSession session = AnalysisSession.objects.get(id=session_id, user=self.user) return True diff --git a/web/backend/reset_and_run.sh b/web/backend/reset_and_run.sh index 3f14df06..36023437 100644 --- a/web/backend/reset_and_run.sh +++ b/web/backend/reset_and_run.sh @@ -2,6 +2,9 @@ echo "๐Ÿš€ Django ์„œ๋ฒ„ ์‹œ์ž‘ - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ดˆ๊ธฐํ™”" +# Django ์„ค์ • ๋ชจ๋“ˆ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ • +export DJANGO_SETTINGS_MODULE=tradingagents_web.settings + # 1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ดˆ๊ธฐํ™” echo "๐Ÿ”„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ดˆ๊ธฐํ™” ์ค‘..." docker exec -i tradingagents_mysql mysql -u root -ppassword -e " @@ -25,6 +28,6 @@ if not User.objects.filter(email='admin@example.com').exists(): print('โœ… ๊ด€๋ฆฌ์ž: admin@example.com / admin123!'); " -# 4. ์„œ๋ฒ„ ์‹œ์ž‘ +# 4. ์„œ๋ฒ„ ์‹œ์ž‘ (ํ™˜๊ฒฝ ๋ณ€์ˆ˜์™€ ํ•จ๊ป˜) echo "๐ŸŽ‰ ์„œ๋ฒ„ ์‹œ์ž‘!" -python manage.py runserver \ No newline at end of file +daphne -b 0.0.0.0 -p 8000 tradingagents_web.asgi:application \ No newline at end of file diff --git a/web/backend/tradingagents_web/asgi.py b/web/backend/tradingagents_web/asgi.py index 3a78e90a..3844394b 100644 --- a/web/backend/tradingagents_web/asgi.py +++ b/web/backend/tradingagents_web/asgi.py @@ -8,12 +8,15 @@ https://docs.djangoproject.com/en/4.2/howto/deployment/asgi/ """ import os +import django from django.core.asgi import get_asgi_application -from channels.routing import ProtocolTypeRouter, URLRouter -from channels.auth import AuthMiddlewareStack -import apps.websocket.routing os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'tradingagents_web.settings') +django.setup() + +from channels.auth import AuthMiddlewareStack +from channels.routing import ProtocolTypeRouter, URLRouter +import apps.websocket.routing application = ProtocolTypeRouter({ "http": get_asgi_application(), diff --git a/web/frontend/src/pages/Analysis/Analysis.js b/web/frontend/src/pages/Analysis/Analysis.js index d60b797f..e49cd6bb 100644 --- a/web/frontend/src/pages/Analysis/Analysis.js +++ b/web/frontend/src/pages/Analysis/Analysis.js @@ -1,33 +1,129 @@ -import React from 'react'; -import { Card, Typography } from 'antd'; -import styled from 'styled-components'; +// web/frontend/src/pages/Analysis/Analysis.js -const { Title, Text } = Typography; +import React, { useState, useEffect } from 'react'; +import { Card, Divider, Spin, Alert, Typography } from 'antd'; +import styled from 'styled-components'; +import api from '../../services/api'; +import { useWebSocket } from '../../contexts/WebSocketContext'; +import AnalysisForm from './components/AnalysisForm'; +import AnalysisDisplay from './components/AnalysisDisplay'; + +const { Title, Paragraph } = Typography; const AnalysisContainer = styled.div` - max-width: 800px; + max-width: 900px; margin: 0 auto; + padding: ${props => props.theme.spacing.lg}; `; -const PlaceholderCard = styled(Card)` - text-align: center; - padding: ${props => props.theme.spacing.xl}; - background: linear-gradient(135deg, #f0f2f5 0%, #e6f7ff 100%); +const CustomPageHeader = styled(Card)` + border: none; + background-color: transparent; + .ant-card-body { + padding: 0; + } `; const Analysis = () => { + const [currentSessionId, setCurrentSessionId] = useState(null); + const [analysisStatus, setAnalysisStatus] = useState('idle'); // idle, running, completed, failed + const [error, setError] = useState(null); + const [finalReport, setFinalReport] = useState(null); + + const { subscribeToAnalysis, analysisProgress, messages, clearMessages, clearAnalysisProgress } = useWebSocket(); + + // WebSocket ๋ฉ”์‹œ์ง€๋กœ๋ถ€ํ„ฐ ์ƒํƒœ ์—…๋ฐ์ดํŠธ + useEffect(() => { + if (currentSessionId && analysisProgress[currentSessionId]) { + const progress = analysisProgress[currentSessionId]; + setAnalysisStatus(progress.status); + if (progress.status === 'completed') { + setFinalReport(progress.result); + } else if (progress.status === 'failed') { + setError(progress.error || '๋ถ„์„ ์ค‘ ์•Œ ์ˆ˜ ์—†๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.'); + } + } + }, [analysisProgress, currentSessionId]); + + // ๋ถ„์„ ์‹œ์ž‘ ํ•ธ๋“ค๋Ÿฌ + const handleStartAnalysis = async (values) => { + setAnalysisStatus('starting'); + setError(null); + setFinalReport(null); + clearMessages(); + if(currentSessionId) clearAnalysisProgress(currentSessionId); + + try { + const response = await api.post('/api/trading/start-analysis/', values); + const { session_id } = response.data; + + setCurrentSessionId(session_id); + subscribeToAnalysis(session_id); + setAnalysisStatus('running'); + + } catch (err) { + const errorMessage = err.response?.data?.error || '๋ถ„์„ ์‹œ์ž‘์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.'; + setError(errorMessage); + setAnalysisStatus('failed'); + } + }; + + // ์ƒˆ ๋ถ„์„ ์‹œ์ž‘ ํ•ธ๋“ค๋Ÿฌ (Display ์ปดํฌ๋„ŒํŠธ์—์„œ ํ˜ธ์ถœ) + const handleNewAnalysis = () => { + if(currentSessionId) clearAnalysisProgress(currentSessionId); + setCurrentSessionId(null); + setAnalysisStatus('idle'); + setError(null); + setFinalReport(null); + clearMessages(); + }; + + const renderContent = () => { + if (analysisStatus === 'starting') { + return
; + } + + if (currentSessionId && (analysisStatus === 'running' || analysisStatus === 'completed' || analysisStatus === 'failed')) { + return ( + m.sessionId === currentSessionId)} + finalReport={finalReport} + onNewAnalysis={handleNewAnalysis} + /> + ); + } + + return ; + }; + return ( - - ๋ถ„์„ ์‹œ์ž‘ ํŽ˜์ด์ง€ - - ์—ฌ๊ธฐ์— ๊ฑฐ๋ž˜ ๋ถ„์„์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ํผ์ด ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. -
- ์ข…๋ชฉ ์„ ํƒ, ๋ถ„์„ ์˜ต์…˜ ์„ค์ •, ๋ถ„์„๊ฐ€ ์„ ํƒ ๋“ฑ์˜ ๊ธฐ๋Šฅ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. -
-
+ + AI ๊ธฐ๋ฐ˜ ์ฃผ์‹ ๋ถ„์„ + + ๊ด€์‹ฌ ์žˆ๋Š” ์ข…๋ชฉ์— ๋Œ€ํ•œ ์‹ฌ์ธต ๋ถ„์„์„ ์‹œ์ž‘ํ•˜์„ธ์š”. + + + + + {error && !currentSessionId && ( // Show top-level error only when no session is active + setError(null)} + style={{ marginBottom: '24px' }} + /> + )} + + {renderContent()}
); }; -export default Analysis; \ No newline at end of file +export default Analysis; \ No newline at end of file diff --git a/web/frontend/src/pages/Analysis/components/AnalysisDisplay.js b/web/frontend/src/pages/Analysis/components/AnalysisDisplay.js new file mode 100644 index 00000000..5a33abc4 --- /dev/null +++ b/web/frontend/src/pages/Analysis/components/AnalysisDisplay.js @@ -0,0 +1,112 @@ +import React, { useRef, useEffect } from 'react'; +import { Card, Progress, Timeline, Button, Result, Typography, Empty, Tag } from 'antd'; +import { FileDoneOutlined, RedoOutlined } from '@ant-design/icons'; +import styled from 'styled-components'; +import ReactMarkdown from 'react-markdown'; + +const { Title, Paragraph, Text } = Typography; + +const DisplayCard = styled(Card)` + border-radius: ${props => props.theme.borderRadius.lg}; + box-shadow: ${props => props.theme.shadows.lg}; + margin-top: ${props => props.theme.spacing.lg}; +`; + +const TimelineContainer = styled.div` + max-height: 400px; + overflow-y: auto; + padding: ${props => props.theme.spacing.md}; + border: 1px solid ${props => props.theme.colors.border}; + border-radius: ${props => props.theme.borderRadius.md}; + background-color: ${props => props.theme.colors.backgroundSecondary}; +`; + +const ReportContainer = styled.div` + margin-top: ${props => props.theme.spacing.lg}; + padding: ${props => props.theme.spacing.lg}; + background-color: #fafafa; + border-radius: ${props => props.theme.borderRadius.md}; +`; + +const agentTagColors = { + market: 'blue', + social: 'cyan', + news: 'green', + fundamentals: 'purple', +}; + +const AnalysisDisplay = ({ sessionId, status, progress, messages, finalReport, onNewAnalysis }) => { + const timelineEndRef = useRef(null); + + useEffect(() => { + timelineEndRef.current?.scrollIntoView({ behavior: 'smooth' }); + }, [messages]); + + const renderRunningState = () => ( + <> + ๋ถ„์„ ์ง„ํ–‰ ์ค‘... + AI ๋ถ„์„๊ฐ€๋“ค์ด ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ๋ถ„์„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. (์„ธ์…˜ ID: {sessionId}) + + {progress?.message} + + + + {messages.length > 0 ? messages.map(msg => ( + + + {msg.agent} + {new Date(msg.timestamp).toLocaleTimeString()} + + {msg.content} + + )) : } + +
+ + + ); + + const renderCompletedState = () => ( + } + subTitle="์•„๋ž˜์—์„œ ์ƒ์„ฑ๋œ ์ตœ์ข… ๋ณด๊ณ ์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”." + extra={[ + + ]} + /> + ); + + const renderFailedState = () => ( + } onClick={onNewAnalysis}> + ๋‹ค์‹œ ์‹œ๋„ + + ]} + /> + ); + + return ( + + {status === 'running' && renderRunningState()} + {status === 'completed' && renderCompletedState()} + {status === 'failed' && renderFailedState()} + + {status === 'completed' && finalReport && ( + + ์ตœ์ข… ๋ถ„์„ ๋ณด๊ณ ์„œ + {finalReport} + + )} + + ); +}; + +export default AnalysisDisplay; \ No newline at end of file diff --git a/web/frontend/src/pages/Analysis/components/AnalysisForm.js b/web/frontend/src/pages/Analysis/components/AnalysisForm.js new file mode 100644 index 00000000..f75ac69e --- /dev/null +++ b/web/frontend/src/pages/Analysis/components/AnalysisForm.js @@ -0,0 +1,119 @@ +import React from 'react'; +import { Form, Input, Button, Card, Select, Slider, Checkbox, Row, Col, Typography } from 'antd'; +import { FundOutlined, SendOutlined } from '@ant-design/icons'; +import styled from 'styled-components'; + +const { Title } = Typography; +const { Option } = Select; + +const FormCard = styled(Card)` + border-radius: ${props => props.theme.borderRadius.lg}; + box-shadow: ${props => props.theme.shadows.lg}; +`; + +const analystsOptions = [ + { label: '์‹œ์žฅ ๋ถ„์„๊ฐ€ (Market)', value: 'market' }, + { label: '์†Œ์…œ ๋ถ„์„๊ฐ€ (Social)', value: 'social' }, + { label: '๋‰ด์Šค ๋ถ„์„๊ฐ€ (News)', value: 'news' }, + { label: '์žฌ๋ฌด ๋ถ„์„๊ฐ€ (Fundamentals)', value: 'fundamentals' }, +]; + +const AnalysisForm = ({ onStartAnalysis, loading }) => { + const [form] = Form.useForm(); + + const handleSubmit = (values) => { + onStartAnalysis(values); + }; + + return ( + + ์ƒˆ ๋ถ„์„ ์‹œ์ž‘ +
+ + } + placeholder="์˜ˆ: AAPL, GOOGL, MSFT" + size="large" + /> + + + + + + {analystsOptions.map(option => ( +
+ {option.label} + + ))} + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; + +export default AnalysisForm; \ No newline at end of file diff --git a/web/frontend/src/pages/Dashboard/Dashboard.js b/web/frontend/src/pages/Dashboard/Dashboard.js index 9b34368d..c296ca56 100644 --- a/web/frontend/src/pages/Dashboard/Dashboard.js +++ b/web/frontend/src/pages/Dashboard/Dashboard.js @@ -97,7 +97,7 @@ const Dashboard = () => { }); const [recentAnalyses, setRecentAnalyses] = useState([]); const { user } = useAuth(); - const { connected, analysisProgress } = useWebSocket(); + const { connected, messages } = useWebSocket(); const navigate = useNavigate(); useEffect(() => { From 7de2592ab237ed165cb99d61fa3ff442db74faa7 Mon Sep 17 00:00:00 2001 From: kimheesu Date: Fri, 13 Jun 2025 16:01:31 +0900 Subject: [PATCH 11/14] =?UTF-8?q?[add]=20ai=20=EB=B6=84=EC=84=9D=20?= =?UTF-8?q?=EB=90=A8.=20=ED=94=84=EB=A1=A0=ED=8A=B8=EC=97=94=EB=93=9C?= =?UTF-8?q?=EB=A7=8C=20=EB=8B=A4=EB=93=AC=EC=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AAPL-YFin-data-2010-06-13-2025-06-13.csv | 3775 +++++++++++++++++ tradingagents/graph/reflection.py | 44 + tradingagents/graph/setup.py | 6 +- tradingagents/graph/trading_graph.py | 64 +- .../apps/authentication/serializers.py | 11 +- web/backend/apps/trading_api/services.py | 158 +- web/backend/apps/trading_api/views.py | 16 +- .../full_states_log.json | 27 + web/backend/reset_and_run.sh | 48 +- web/frontend/src/contexts/WebSocketContext.js | 5 +- web/frontend/src/pages/Analysis/Analysis.js | 19 +- .../pages/Analysis/components/AnalysisForm.js | 37 +- 12 files changed, 4075 insertions(+), 135 deletions(-) create mode 100644 tradingagents/dataflows/data_cache/AAPL-YFin-data-2010-06-13-2025-06-13.csv create mode 100644 web/backend/eval_results/AAPL/TradingAgentsStrategy_logs/full_states_log.json diff --git a/tradingagents/dataflows/data_cache/AAPL-YFin-data-2010-06-13-2025-06-13.csv b/tradingagents/dataflows/data_cache/AAPL-YFin-data-2010-06-13-2025-06-13.csv new file mode 100644 index 00000000..ee7b019b --- /dev/null +++ b/tradingagents/dataflows/data_cache/AAPL-YFin-data-2010-06-13-2025-06-13.csv @@ -0,0 +1,3775 @@ +Date,Close,High,Low,Open,Volume +2010-06-14,7.642179012298584,7.788542648843472,7.634064596944096,7.6926704020748256,602960400 +2010-06-15,7.804769039154053,7.809577817375942,7.678841968334121,7.683049649278273,585074000 +2010-06-16,8.031982421875,8.047009057696604,7.8330231507215515,7.847148541508566,783678000 +2010-06-17,8.1708345413208,8.201790669881838,8.099605671633846,8.132665240761042,872855200 +2010-06-18,8.236950874328613,8.264902310294405,8.157307459207733,8.182252605038066,784621600 +2010-06-21,8.119739532470703,8.385418198702922,8.076461316388826,8.34574656750565,776490400 +2010-06-22,8.230340003967285,8.29405473915925,8.159713048221507,8.179548464825253,717262000 +2010-06-23,8.143778800964355,8.254679227700748,8.051512387372318,8.252274838907928,768457200 +2010-06-24,8.084576606750488,8.21080386871957,8.057527219871378,8.144683947770657,714277200 +2010-06-25,8.01545238494873,8.12274629578587,7.98870394411966,8.116435172513148,549942400 +2010-06-28,8.063538551330566,8.107117719740785,7.949933529014378,8.022363772971488,584948000 +2010-06-29,7.698980808258057,7.946026251331022,7.642779398468302,7.937911034198449,1133344800 +2010-06-30,7.559528827667236,7.753077383524344,7.513847028384988,7.715209048242166,739452000 +2010-07-01,7.4678635597229,7.657806335673893,7.30977894768559,7.642778899865552,1022896000 +2010-07-02,7.421579360961914,7.54149546881603,7.309175765894551,7.528270525090688,693842800 +2010-07-06,7.472372055053711,7.597697256003138,7.398137727318269,7.543600093149185,615235600 +2010-07-07,7.774117469787598,7.77712376040769,7.506035155268454,7.528274162041912,654556000 +2010-07-08,7.756690502166748,7.901251745942857,7.66051724064931,7.888628689370949,738144400 +2010-07-09,7.802669525146484,7.8110840887347255,7.668627172379451,7.720620909259886,433322400 +2010-07-12,7.732641696929932,7.869688714435511,7.659610358271487,7.769908938754551,562878400 +2010-07-13,7.567644119262695,7.705893333059973,7.406253053161084,7.70348974561194,1190924000 +2010-07-14,7.5955939292907715,7.6878603882543715,7.483492055565415,7.494913710480827,812047600 +2010-07-15,7.557127475738525,7.723026419236545,7.432402518647975,7.460353158909147,824866000 +2010-07-16,7.510538101196289,7.662912636677817,7.465757561632627,7.609115638718884,1039858400 +2010-07-19,7.3807053565979,7.5099388850344,7.200982056100408,7.5099388850344,1024478000 +2010-07-20,7.570350170135498,7.600705198452405,7.213307014386482,7.300163613495045,1074950800 +2010-07-21,7.640974521636963,7.968865500309025,7.633762156007265,7.967062208268307,1185671200 +2010-07-22,7.784635066986084,7.81408804008706,7.6731334941324,7.7443623395704675,645318800 +2010-07-23,7.812286853790283,7.825511001517677,7.702288396203947,7.726632448708061,533388800 +2010-07-26,7.792449474334717,7.8170936681841425,7.745264526523821,7.814088180820391,420551600 +2010-07-27,7.936710357666016,7.958349066060188,7.823105332896437,7.840236211114068,584771600 +2010-07-28,7.842942237854004,7.994115485420554,7.821604475438018,7.924389764259663,519985200 +2010-07-29,7.757290363311768,7.893736361984631,7.696882037112321,7.835431476944828,643806800 +2010-07-30,7.731441020965576,7.80507347158041,7.660813255855939,7.690567988706028,448210000 +2010-08-02,7.869690418243408,7.89193022764188,7.802670039971331,7.827314239848939,428055600 +2010-08-03,7.872092247009277,7.912064021917111,7.796656526608295,7.844442568030426,417653600 +2010-08-04,7.903648853302002,7.9427185778053415,7.823404359672513,7.8994411716560275,420375200 +2010-08-05,7.865179061889648,7.909659463282324,7.8306163655111485,7.866080306648583,289097200 +2010-08-06,7.816793441772461,7.858869461906722,7.742859255904163,7.807476029772255,444897600 +2010-08-09,7.866681098937988,7.878703045478778,7.801163095356976,7.858565883756381,303128000 +2010-08-10,7.796356201171875,7.8276132697329714,7.740454938778641,7.809580345563108,451920000 +2010-08-11,7.519255638122559,7.684554209828448,7.507835590274197,7.675838698961744,620054400 +2010-08-12,7.567342281341553,7.606712954692129,7.3969347908763625,7.4140656644003835,534920400 +2010-08-13,7.486497402191162,7.570047535699912,7.486196452215505,7.563135316659004,354869200 +2010-08-16,7.442620277404785,7.513849138547119,7.411964300087721,7.440816984621429,318430000 +2010-08-17,7.572755336761475,7.652699714279963,7.489504521102382,7.5159528160930895,422640400 +2010-08-18,7.6058125495910645,7.653899546326506,7.561031990322037,7.5844747924655795,339696000 +2010-08-19,7.5099406242370605,7.618135769538192,7.47387557580335,7.5989006490224,426706000 +2010-08-20,7.502726078033447,7.631357712757991,7.483490961045401,7.495212761726617,384230000 +2010-08-23,7.387316703796387,7.573652859712424,7.370787731350938,7.567341739139933,414041600 +2010-08-24,7.210901737213135,7.303167400982093,7.172432297084012,7.293250495345802,602565600 +2010-08-25,7.299860000610352,7.332920357404249,7.128852205309278,7.154097493418652,596867600 +2010-08-26,7.2214202880859375,7.385816848512324,7.2214202880859375,7.3768003857064715,466505200 +2010-08-27,7.261691570281982,7.291445490336927,7.0795630706161905,7.265599104651437,548391200 +2010-08-30,7.288139343261719,7.385815668384591,7.2334402801795985,7.235844669876979,383289200 +2010-08-31,7.306172847747803,7.350052160685612,7.223523951652617,7.268604657001502,420786800 +2010-09-01,7.523464679718018,7.557425484507151,7.4017452454111625,7.437509342691758,697037600 +2010-09-02,7.57876443862915,7.57876443862915,7.470569291113368,7.55141490235264,415427600 +2010-09-03,7.777120113372803,7.7774202607739396,7.648788641124448,7.666520611253068,520788800 +2010-09-07,7.748269557952881,7.7999623325009555,7.701384760370551,7.7131057591328105,342557600 +2010-09-08,7.901846408843994,7.946025867066293,7.787038402396994,7.8074757154413,526551200 +2010-09-09,7.906352519989014,8.010038997414442,7.901844691416822,7.965559401404977,438575200 +2010-09-10,7.916571617126465,7.949331021187349,7.856162537707678,7.909959546326426,387542400 +2010-09-13,8.025670051574707,8.062937294095743,7.987201416585295,7.989003906554549,388780000 +2010-09-14,8.056325912475586,8.089685622835068,7.979988128384352,8.000725592676332,408150400 +2010-09-15,8.121243476867676,8.126053060195883,8.049714467613594,8.059632979269411,429368800 +2010-09-16,8.312088012695312,8.315093500859037,8.099605215988053,8.12184582839962,652103200 +2010-09-17,8.276022911071777,8.35386304019568,8.22523137011395,8.34574782171908,634477200 +2010-09-20,8.512248992919922,8.528778775546161,8.2904487951568,8.297361016245299,658677600 +2010-09-21,8.528475761413574,8.636069797476551,8.499022788865977,8.53118110120807,668074400 +2010-09-22,8.648091316223145,8.65500353529484,8.487601515022774,8.496617976333642,585289600 +2010-09-23,8.683257102966309,8.798665437246246,8.59549925892858,8.605416968292174,786116800 +2010-09-24,8.785438537597656,8.821804530583464,8.732243421759918,8.778827268448673,649488000 +2010-09-27,8.750574111938477,8.857867174210172,8.746066283325309,8.835327228611204,482834800 +2010-09-28,8.621343612670898,8.768909430560885,8.26490163984933,8.768909430560885,1035042400 +2010-09-29,8.636672019958496,8.710004313421251,8.595498043026845,8.632464337255978,469644000 +2010-09-30,8.527875900268555,8.715714449211912,8.452740320184542,8.685660377684977,673391600 +2010-10-01,8.490909576416016,8.612929166032385,8.455745771843421,8.600005970281233,448142800 +2010-10-04,8.37430191040039,8.502331704117202,8.348153759942294,8.463261959818155,435302000 +2010-10-05,8.683857917785645,8.69918470122578,8.469871206627692,8.475281887010633,501967200 +2010-10-06,8.691370964050293,8.775523019559895,8.57325809932251,8.70339291556123,670868800 +2010-10-07,8.692272186279297,8.730140527409366,8.62284742922977,8.725932844780091,408399600 +2010-10-08,8.838031768798828,8.85095495985932,8.715712076079015,8.767103890395651,658403200 +2010-10-11,8.876801490783691,8.933303837046259,8.853961397400656,8.858169078693955,427753200 +2010-10-12,8.972379684448242,9.001232373293066,8.790551246358733,8.878309903194491,558544000 +2010-10-13,9.020463943481445,9.075162210987816,9.010245285967784,9.022267235983856,630092400 +2010-10-14,9.08568000793457,9.090487984449492,9.028275609313999,9.067045989123026,435296400 +2010-10-15,9.45925235748291,9.467066623069664,9.163819830100374,9.239856638900065,922194000 +2010-10-18,9.557231903076172,9.587285172827519,9.445730323834479,9.571357292973989,1093010800 +2010-10-19,9.301471710205078,9.430103386079008,9.016858819007325,9.118441905497201,1232784000 +2010-10-20,9.332725524902344,9.444527241116887,9.222727903540683,9.286742774552803,721624400 +2010-10-21,9.302374839782715,9.459257318483267,9.220627161991203,9.387728301049096,551460000 +2010-10-22,9.240760803222656,9.317999824423197,9.205597803826313,9.288846997398855,372778000 +2010-10-25,9.281935691833496,9.364884746098276,9.269913740838552,9.289449812472059,392462000 +2010-10-26,9.258193016052246,9.30898455231801,9.186062116716965,9.222729065166877,392929600 +2010-10-27,9.251579284667969,9.313790860042312,9.184558127497956,9.246169407997753,399002800 +2010-10-28,9.17374324798584,9.256692319475405,9.043308262739007,9.25518917402218,551051200 +2010-10-29,9.045707702636719,9.19297335523697,9.042401265676085,9.143384023626668,430511200 +2010-11-01,9.14188289642334,9.184560018631378,9.082375845864764,9.082976943396334,423889200 +2010-11-02,9.297562599182129,9.322507744012674,9.226635502216629,9.226635502216629,433930000 +2010-11-03,9.400951385498047,9.40335577589817,9.272619856758796,9.357973308362613,508348400 +2010-11-04,9.56534481048584,9.622748408541375,9.467968636488715,9.480591681922888,642488000 +2010-11-05,9.531087875366211,9.604420196513773,9.519667820538578,9.55693507886822,361253200 +2010-11-08,9.575865745544434,9.610427650032367,9.519964477281501,9.533188623061285,281758400 +2010-11-09,9.499527931213379,9.656411177295722,9.452042831142037,9.648897056861577,383544000 +2010-11-10,9.558135032653809,9.5803748418709,9.423491574520906,9.516359149686297,384227200 +2010-11-11,9.516657829284668,9.569252649803206,9.444526941324073,9.46706769333677,361284000 +2010-11-12,9.257591247558594,9.512150030020402,9.125353804920511,9.497123394450956,795846800 +2010-11-15,9.227837562561035,9.333027215281831,9.204695710557123,9.270514681643574,403606000 +2010-11-16,9.064041137695312,9.244666499421992,8.995817783966523,9.188164946711467,657650000 +2010-11-17,9.03128433227539,9.136173044659467,8.948935573953147,9.052321943746474,479449600 +2010-11-18,9.269614219665527,9.306881467734506,9.157212180401727,9.172538965155724,494491200 +2010-11-19,9.218518257141113,9.268708678874907,9.173737711213326,9.255785487938237,384843200 +2010-11-22,9.417779922485352,9.417779922485352,9.192674140226508,9.217017383551703,393075200 +2010-11-23,9.278627395629883,9.369392304928992,9.213410330878228,9.330320972021008,519447600 +2010-11-24,9.46105670928955,9.479089631894263,9.369392161582041,9.3769046755341,413725200 +2010-11-26,9.46706485748291,9.548211379914575,9.405153446754412,9.429196533850336,237585600 +2010-11-29,9.523272514343262,9.541604788452933,9.35827482455419,9.482097727517068,445785200 +2010-11-30,9.351357460021973,9.447831571271259,9.34294209774067,9.423186581733155,501858000 +2010-12-01,9.50914478302002,9.54971765970009,9.467068761351783,9.475183176181124,461750800 +2010-12-02,9.561738967895508,9.587284405646665,9.463761688895477,9.543104946999398,462837200 +2010-12-03,9.540403366088867,9.57676856917743,9.507343798723426,9.52748016821331,342092800 +2010-12-06,9.621849060058594,9.687367084682304,9.569854525836949,9.57646659855801,448481600 +2010-12-07,9.563544273376465,9.73725665729087,9.560839735556634,9.73154743413055,391454000 +2010-12-08,9.647693634033203,9.647994584028313,9.530482840071112,9.60621871204047,321935600 +2010-12-09,9.610124588012695,9.692472517794206,9.587883985946279,9.68135342056077,294151200 +2010-12-10,9.634171485900879,9.648897975604557,9.575264724552666,9.606821946793975,262511200 +2010-12-13,9.667529106140137,9.769413921901778,9.647393545012015,9.74867646077979,439815600 +2010-12-14,9.626055717468262,9.693677983114577,9.587285329585686,9.66933393538057,351008000 +2010-12-15,9.62816047668457,9.707502944159287,9.592996671952134,9.617339918459095,417312000 +2010-12-16,9.65490436553955,9.695778179754269,9.620342474295102,9.65009558709863,322030800 +2010-12-17,9.635672569274902,9.671136516999876,9.624251717496804,9.666327737303837,386929200 +2010-12-20,9.683755874633789,9.71501293334095,9.564140725482972,9.665422808774018,385610400 +2010-12-21,9.743568420410156,9.749278446008617,9.678952438532425,9.707503369058193,256354000 +2010-12-22,9.772420883178711,9.789251615994605,9.724033730133286,9.748377781689518,265921600 +2010-12-23,9.725536346435547,9.772120204145603,9.712613149992984,9.76761237365328,223157200 +2010-12-27,9.757993698120117,9.780835404969206,9.663022693032124,9.70299527875131,249816000 +2010-12-28,9.781737327575684,9.81750142746384,9.769415229252312,9.79496067094381,175924000 +2010-12-29,9.776327133178711,9.811189986893359,9.770616305457585,9.804276964129198,163139200 +2010-12-30,9.727337837219238,9.78293734561453,9.709004766061877,9.7820361006964,157494400 +2010-12-31,9.6942777633667,9.721927442361036,9.656709575601255,9.705998761878071,193508000 +2011-01-03,9.904956817626953,9.92569427671763,9.76280089353376,9.786843987066948,445138400 +2011-01-04,9.956650733947754,9.993015924198609,9.862280043709006,9.99121263193163,309080800 +2011-01-05,10.038098335266113,10.048316993185876,9.902854602344075,9.90435774742251,255519600 +2011-01-06,10.029982566833496,10.075664363825304,10.00503742618671,10.059735684111073,300428800 +2011-01-07,10.101815223693848,10.108727444887132,9.974986036592734,10.037799532538068,311931200 +2011-01-10,10.292057991027832,10.315499994617841,10.13337223916696,10.18326173431153,448560000 +2011-01-11,10.267712593078613,10.36749156248203,10.202494721699471,10.365087975147008,444108000 +2011-01-12,10.351263999938965,10.351564949999332,10.278533599483456,10.316101797419183,302590400 +2011-01-13,10.38912582397461,10.417978490050812,10.334127435599324,10.373498099049657,296780400 +2011-01-14,10.473280906677246,10.473280906677246,10.351862444717026,10.39544080144566,308840000 +2011-01-18,10.237959861755371,10.361482606440227,9.797665913001165,9.903456680219014,1880998000 +2011-01-19,10.18355941772461,10.476887726170503,10.124653477582044,10.469373607402725,1135612800 +2011-01-20,9.998428344726562,10.167332750705425,9.921489460161062,10.111131331219433,764789200 +2011-01-21,9.819306373596191,10.064548593879216,9.816601032939502,10.031188076003845,754401200 +2011-01-24,10.1417875289917,10.1417875289917,9.819305494361698,9.82381412754128,574683200 +2011-01-25,10.26050090789795,10.261703905633597,10.055231293601333,10.108127079961733,546868000 +2011-01-26,10.334136962890625,10.386731813447685,10.26350998194467,10.307388513655598,506875600 +2011-01-27,10.31489372253418,10.35937411956236,10.303473676531274,10.332024594071637,285026000 +2011-01-28,10.101214408874512,10.350665126642285,10.023976167172084,10.34375290470632,592057200 +2011-01-31,10.197989463806152,10.219628979781573,10.04711796231218,10.092198682193777,377246800 +2011-02-01,10.369597434997559,10.388230656873146,10.247877987644276,10.257495548629592,426633200 +2011-02-02,10.348257064819336,10.376206892749428,10.32511521400841,10.35216459955364,258955200 +2011-02-03,10.321808815002441,10.34585271335402,10.17484409772837,10.33262856926065,393797600 +2011-02-04,10.413775444030762,10.419786418805039,10.323913377488688,10.327820109825295,321840400 +2011-02-07,10.575469017028809,10.616642193979374,10.448038740596262,10.455552058906942,485021600 +2011-02-08,10.67524528503418,10.684862843644702,10.583580738394062,10.629563486700725,381040800 +2011-02-09,10.764206886291504,10.789452979495037,10.665329163444285,10.674945920226596,482745200 +2011-02-10,10.655410766601562,10.81950716402329,10.458855908680297,10.74106595136052,928550000 +2011-02-11,10.724837303161621,10.753388231498999,10.625357670152955,10.661723668766625,367572800 +2011-02-14,10.79486083984375,10.80387649815473,10.720627318559492,10.723031708117947,310416400 +2011-02-15,10.816502571105957,10.818606813825244,10.745875614389394,10.795164009068156,284174800 +2011-02-16,10.91357707977295,10.96677219978962,10.834533965889026,10.84354962544891,481157600 +2011-02-17,10.768414497375488,10.827621392721353,10.71491762656891,10.736858084879456,530583200 +2011-02-18,10.535798072814941,10.804482282298796,10.504540997318063,10.780739328140044,816057200 +2011-02-22,10.176644325256348,10.380712437123936,10.149896700195647,10.283036135820632,872555600 +2011-02-23,10.297164916992188,10.357873349739291,10.176646888775256,10.18145647074196,671854400 +2011-02-24,10.304978370666504,10.37320172500959,10.169434511923116,10.339240924095153,499900800 +2011-02-25,10.463666915893555,10.471781331490151,10.362684935861507,10.376509376872974,380018800 +2011-02-28,10.615438461303711,10.670737820136308,10.552624983283387,10.556231567885506,403074000 +2011-03-01,10.49822998046875,10.690877351122989,10.449241728905626,10.68336403224199,456136800 +2011-03-02,10.58267593383789,10.64969707414364,10.470874251718744,10.517759035196594,602590800 +2011-03-03,10.806285858154297,10.813198079534239,10.696888498650445,10.73505779634595,500788400 +2011-03-04,10.819507598876953,10.828223111182368,10.751885335307295,10.82161103881733,453266800 +2011-03-07,10.680052757263184,10.869694539721904,10.558333364008174,10.861579324980628,546123200 +2011-03-08,10.692076683044434,10.74136587148075,10.58658608675369,10.66653044265,356316800 +2011-03-09,10.593198776245117,10.662023234579507,10.536998167647779,10.659918992112212,453306000 +2011-03-10,10.4188871383667,10.512055667044965,10.36569120128661,10.492519592573506,507539200 +2011-03-11,10.57876968383789,10.588688191040822,10.368692186184596,10.378609088321227,471080400 +2011-03-14,10.625957489013672,10.71371611111441,10.55833603263237,10.61453663753299,435957200 +2011-03-15,10.381619453430176,10.454049703736025,10.22143056363218,10.281538715112564,721081200 +2011-03-16,9.918182373046875,10.30858679601906,9.805479393930852,10.278532721757017,1162011200 +2011-03-17,10.057333946228027,10.2067030650745,9.937717950129613,10.123152116804079,659422400 +2011-03-18,9.938018798828125,10.164326809346731,9.917882432222255,10.132168491772152,753214000 +2011-03-21,10.197385787963867,10.210609130738694,10.075966497734006,10.097906958262074,409402000 +2011-03-22,10.254488945007324,10.297166870575824,10.192577503122713,10.295363577946167,325922800 +2011-03-23,10.19407844543457,10.225033758421102,10.096702269541852,10.196782982527917,372996400 +2011-03-24,10.367796897888184,10.398753029270523,10.18416595795303,10.27402806095966,404712000 +2011-03-25,10.565250396728516,10.58087813097276,10.42940475387649,10.460961974949369,448910000 +2011-03-28,10.532188415527344,10.648799720844426,10.532188415527344,10.613635919753106,309355200 +2011-03-29,10.547818183898926,10.547818183898926,10.400553297666892,10.44863949632221,352900800 +2011-03-30,10.477788925170898,10.545411981118868,10.44202483382171,10.53819800981607,329406000 +2011-03-31,10.474187850952148,10.51295744671368,10.40055539300186,10.409571055482662,274019200 +2011-04-01,10.35546588897705,10.56674715874182,10.31759756470247,10.552321627252912,418661600 +2011-04-04,10.254183769226074,10.356668843756275,10.170332709398203,10.347953334920094,460084800 +2011-04-05,10.185066223144531,10.28604822301153,10.098209617102956,10.127963550179345,482731200 +2011-04-06,10.159515380859375,10.33563290397836,10.13246680076349,10.255088261082461,402539200 +2011-04-07,10.16071891784668,10.231345056263148,10.099106833185653,10.161319212737089,373447200 +2011-04-08,10.069952964782715,10.222928619650018,10.036593267687381,10.216016401812208,377535200 +2011-04-11,9.941924095153809,10.08828690130178,9.918482098577602,10.039899763350078,398946800 +2011-04-12,9.99001407623291,10.029985862367507,9.923894143535833,9.932609657367658,425639200 +2011-04-13,10.1021146774292,10.102414824920592,9.99361858209111,10.06875416654757,346220000 +2011-04-14,9.990612983703613,10.098207030307393,9.979794031065657,10.062141982269626,301800800 +2011-04-15,9.841547966003418,10.027283158409967,9.82171254275241,10.01706449664208,453605600 +2011-04-18,9.973481178283691,9.984902029902267,9.62214814324888,9.800670074304259,609898800 +2011-04-19,10.154102325439453,10.157708105842941,9.969268561346746,10.011044412426997,419378400 +2011-04-20,10.290853500366211,10.391234368390828,10.263504769789437,10.323913058068529,700666400 +2011-04-21,10.540000915527344,10.673141175317067,10.474482906672774,10.66923364111022,753810400 +2011-04-25,10.609431266784668,10.63167187975473,10.527983739302778,10.529186737132033,266546000 +2011-04-26,10.531588554382324,10.668935721952467,10.499430239347422,10.62776174693648,338800000 +2011-04-27,10.523473739624023,10.589593664727369,10.431809176085455,10.586287227078827,356213200 +2011-04-28,10.421290397644043,10.51145181633924,10.384323301090921,10.404459666929325,360959200 +2011-04-29,10.522873878479004,10.637680300157063,10.418885607611614,10.422192045396477,1006345200 +2011-05-02,10.407163619995117,10.533090735652928,10.38372162034968,10.51115107847022,442713600 +2011-05-03,10.46487045288086,10.51566200207765,10.387330458697908,10.4585593286273,313348000 +2011-05-04,10.5060396194458,10.57396201458135,10.425193230084897,10.466668144489164,389250400 +2011-05-05,10.421290397644043,10.547517667870778,10.400251984250644,10.470878937166377,335969200 +2011-05-06,10.418583869934082,10.518964737654558,10.405059578418047,10.509648128337584,280134400 +2011-05-09,10.4468355178833,10.494922515915311,10.414677202521885,10.45464898294179,204747200 +2011-05-10,10.502436637878418,10.509649808515691,10.418585535553738,10.485605906391447,282091600 +2011-05-11,10.435714721679688,10.518965521882052,10.375907526581786,10.489512546826123,336000000 +2011-05-12,10.415876388549805,10.432406966485424,10.286644474530343,10.402352902347593,322000000 +2011-05-13,10.233449935913086,10.406261042053082,10.228942106221314,10.388529870749897,326116000 +2011-05-16,10.017060279846191,10.255090073859202,9.996021867415726,10.194380831626612,449775200 +2011-05-17,10.1024169921875,10.1024169921875,9.939823690578393,9.977992989777952,452334400 +2011-05-18,10.214518547058105,10.249982504382718,10.09820896554325,10.112334358457268,334776400 +2011-05-19,10.23435115814209,10.290852709865234,10.178449901298341,10.28093500382304,261170000 +2011-05-20,10.074764251708984,10.24697506348297,10.06875327707813,10.205199191065201,337968400 +2011-05-23,10.050121307373047,10.097607214117327,9.900452021177658,9.916981803520263,383600000 +2011-05-24,9.983699798583984,10.095201369488565,9.958153558165415,10.083179420460224,321927200 +2011-05-25,10.121647834777832,10.17514470427103,10.00353499697913,10.020966020162334,294224000 +2011-05-26,10.068150520324707,10.124953017424899,10.051019646716707,10.097303341213129,222560800 +2011-05-27,10.140583992004395,10.14719606512492,10.047416278360982,10.062142767226335,203599200 +2011-05-31,10.453747749328613,10.453747749328613,10.248477364375228,10.251483654447226,417754400 +2011-06-01,10.384020805358887,10.58297924149165,10.358175220675326,10.485003569548686,554682800 +2011-06-02,10.401751518249512,10.458253867859465,10.347654360625652,10.41377346551401,338783200 +2011-06-03,10.321808815002441,10.378611321058061,10.278831550498978,10.313995350571501,313250000 +2011-06-06,10.159515380859375,10.430303736847192,10.152603162120773,10.389730866703363,461941200 +2011-06-07,9.979191780090332,10.164926891333199,9.974984097671667,10.163424548878927,529785200 +2011-06-08,9.98520278930664,10.062141663017204,9.937417545149469,9.97137834955971,333723600 +2011-06-09,9.962663650512695,10.028181677253292,9.940423041550531,10.015558628923415,275088800 +2011-06-10,9.794657707214355,9.967769736575077,9.782935907268861,9.934409233909443,433955200 +2011-06-13,9.81569766998291,9.86709030350266,9.769714914075776,9.833729792824899,329473200 +2011-06-14,9.991214752197266,10.015558801700985,9.897144991973493,9.917882456177887,334569200 +2011-06-15,9.820204734802246,9.926896717373053,9.764002527621656,9.910366939684621,399196000 +2011-06-16,9.772420883178711,9.878211653278079,9.567151269052694,9.824715571894583,510591200 +2011-06-17,9.625154495239258,9.895342630971685,9.598105907674837,9.887528362721188,615020000 +2011-06-20,9.47668743133545,9.548216435790854,9.331826129747604,9.537997777287666,640645600 +2011-06-21,9.776629447937012,9.791656086772637,9.47308235508126,9.517562779000531,493382400 +2011-06-22,9.695779800415039,9.88482132307326,9.688866778984135,9.772417713294553,390583200 +2011-06-23,9.954848289489746,9.96867272884735,9.560838124731186,9.585481516078799,559759200 +2011-06-24,9.808186531066895,10.012554915517866,9.77031818190017,9.959058830087764,439807200 +2011-06-27,9.979191780090332,10.035093043976389,9.835232543023254,9.845451200325728,339813600 +2011-06-28,10.075966835021973,10.119245054946024,10.021268564482845,10.027579687324515,294299600 +2011-06-29,10.039300918579102,10.10932677098258,9.974383191124604,10.09940906350112,352545200 +2011-06-30,10.088288307189941,10.102114352150435,10.003235820255119,10.059136282393684,322954800 +2011-07-01,10.316405296325684,10.32361766718207,10.044113618584133,10.096708470753281,435313200 +2011-07-05,10.501834869384766,10.51385681967883,10.293559797007182,10.308586432341366,355054000 +2011-07-06,10.571859359741211,10.64218695735581,10.420085868257761,10.487407176153258,444626000 +2011-07-07,10.735356330871582,10.759399429583622,10.63918233095658,10.659319499516362,399663600 +2011-07-08,10.810791015625,10.819507330247365,10.585084131052888,10.619345884469515,489633200 +2011-07-11,10.639179229736328,10.812593008053762,10.603715288270099,10.709506817846052,442674400 +2011-07-12,10.631665229797363,10.749778034852412,10.47748658843062,10.625052357273812,451609200 +2011-07-13,10.759997367858887,10.819504396464305,10.710707388454074,10.769313172361331,391638800 +2011-07-14,10.752485275268555,10.867893572888828,10.709508013322441,10.849860650198188,430533600 +2011-07-15,10.96737289428711,10.969777284090291,10.794561791116633,10.854669931129555,484467200 +2011-07-18,11.23425579071045,11.25980123140256,10.97819386600467,10.982701696118948,572653200 +2011-07-19,11.325920104980469,11.38001727146632,11.219828409324709,11.360482005227912,819145600 +2011-07-20,11.627959251403809,11.90956727928512,11.6009106791032,11.905059451412686,941340400 +2011-07-21,11.639687538146973,11.722936740462785,11.537803509134033,11.629468879734633,526534400 +2011-07-22,11.820310592651367,11.872905414356513,11.653509666020778,11.670640541632931,516728800 +2011-07-25,11.976593017578125,12.021673721224566,11.709711367729966,11.731650220837025,589806000 +2011-07-26,12.124160766601562,12.156920181565667,12.012058883229178,12.021675641424055,476582400 +2011-07-27,11.798973083496094,12.101017749561596,11.785748938765387,12.039406460866305,659324400 +2011-07-28,11.775830268859863,11.931210345343867,11.664930600300606,11.769820097006937,594034000 +2011-07-29,11.73555850982666,11.875911964441272,11.540807738868518,11.650205074110447,632584400 +2011-08-01,11.92399787902832,12.006645967282086,11.792359948669347,11.954953193058891,612836000 +2011-08-02,11.688371658325195,11.958558916267641,11.671541733929914,11.951045600155457,639539600 +2011-08-03,11.79837417602539,11.827827155859307,11.487914890037091,11.750587318144994,732508000 +2011-08-04,11.341547966003418,11.760803418657808,11.340946868534857,11.7034006167436,871407600 +2011-08-05,11.22884464263916,11.5257811861598,10.896746704678884,11.433814874886668,1204590800 +2011-08-08,10.615438461303711,11.053026960094858,10.609727634417043,10.870297352920552,1143833600 +2011-08-09,11.240564346313477,11.258597267719123,10.669233725709452,10.85857538780265,1082583600 +2011-08-10,10.930407524108887,11.259800929513611,10.89464342657877,11.15461127437791,878656800 +2011-08-11,11.231249809265137,11.283844635930432,10.961362653525107,11.135676913257702,741969200 +2011-08-12,11.330126762390137,11.409769359994254,11.247176925245855,11.362584417319157,528976000 +2011-08-15,11.523078918457031,11.569963732832639,11.363190152977968,11.409473869700895,460544000 +2011-08-16,11.435018539428711,11.521875940541184,11.3021791773433,11.466275615245069,498750000 +2011-08-17,11.433816909790039,11.556437609932821,11.360484607730724,11.490018331533317,442061200 +2011-08-18,11.001335144042969,11.199694118772838,10.860681532182493,11.145295193584547,851435200 +2011-08-19,10.700191497802734,11.029886640398681,10.69929025285939,10.884724409452728,775888400 +2011-08-22,10.712512969970703,10.96617127372824,10.671940096686244,10.955050569853274,535315200 +2011-08-23,11.22824478149414,11.229446976525423,10.729345078979344,10.828523761459982,656835200 +2011-08-24,11.30578327178955,11.38933340789555,11.138080297074232,11.224335772912177,626267600 +2011-08-25,11.231849670410156,11.28384339386121,10.969776810901223,10.972181200600689,871346000 +2011-08-26,11.528188705444336,11.534799977122184,11.144095328861521,11.155215234223046,641477200 +2011-08-29,11.720231056213379,11.76621461330387,11.6610249593026,11.666434034223014,405269200 +2011-08-30,11.72082805633545,11.77642835137363,11.607223077120153,11.668533395096755,417922400 +2011-08-31,11.565754890441895,11.783647551239218,11.47649390429602,11.738265886809087,522586400 +2011-09-01,11.45154857635498,11.641190449874093,11.4422319650844,11.595508638629024,343725200 +2011-09-02,11.241768836975098,11.360482784940904,11.175048619214403,11.262505497026803,438939200 +2011-09-06,11.412778854370117,11.430510029065376,11.01425918673873,11.041007627609238,509698000 +2011-09-07,11.538705825805664,11.588896268907094,11.480700311790873,11.587694073771726,350576800 +2011-09-08,11.545015335083008,11.679357813813102,11.490016119128631,11.492720656538399,416158400 +2011-09-09,11.344853401184082,11.60091447990475,11.270919221615529,11.538702903737601,564813200 +2011-09-12,11.41878890991211,11.447038888646079,11.177152518986615,11.210212883008825,467832400 +2011-09-13,11.559443473815918,11.607228724870433,11.428105659529171,11.484908176775322,440560400 +2011-09-14,11.700095176696777,11.787552859493768,11.593703323292873,11.631571664506696,534724400 +2011-09-15,11.810097694396973,11.831136114856493,11.71813214970354,11.764114922050256,417818800 +2011-09-16,12.036699295043945,12.036699295043945,11.872303571012626,11.88763115335875,698513200 +2011-09-19,12.37120532989502,12.419292330584728,11.877416139815596,11.931512510841333,823860800 +2011-09-20,12.425905227661133,12.708715620123543,12.357982806170437,12.48000240480823,775754000 +2011-09-21,12.386534690856934,12.670546479406076,12.38232700774458,12.611940668427112,605976000 +2011-09-22,12.076374053955078,12.316808259768669,11.922497093173181,12.05263190443009,968480800 +2011-09-23,12.150908470153809,12.224240761198738,12.01716708324317,12.03009027842239,546277200 +2011-09-26,12.116948127746582,12.141292178141626,11.760205145427891,12.01746848593151,812876400 +2011-09-27,11.999433517456055,12.299674059393347,11.963368474223152,12.284046328761283,632497600 +2011-09-28,11.931814193725586,12.134078298384317,11.916785952772694,12.027385491939679,429637600 +2011-09-29,11.738261222839355,12.08809185731499,11.607224407349513,12.079376346954074,651086800 +2011-09-30,11.460265159606934,11.687776202091568,11.456057476132866,11.63457946229335,547640800 +2011-10-03,11.258298873901367,11.499935277624767,11.215322404729847,11.431712710953708,669099200 +2011-10-04,11.195184707641602,11.474688639375652,10.646396304737083,11.257397098319204,1233677200 +2011-10-05,11.367996215820312,11.415180360607945,10.828522876361715,11.055732903502161,786469600 +2011-10-06,11.341547966003418,11.564249361638474,11.174145932409274,11.220128684954163,812582400 +2011-10-07,11.114034652709961,11.352664662620983,11.074663983435059,11.293758732400065,535458000 +2011-10-10,11.685365676879883,11.685365676879883,11.366791296299033,11.393239580353189,442514800 +2011-10-11,12.030387878417969,12.117245246292159,11.766212400637317,11.798369906765238,605687600 +2011-10-12,12.087494850158691,12.299676670053273,12.02588355436412,12.24227385969131,622286000 +2011-10-13,12.275030136108398,12.275030136108398,12.10732717072086,12.171342037839125,426185200 +2011-10-14,12.682867050170898,12.682867050170898,12.480601360560312,12.527486963766346,573367200 +2011-10-17,12.622456550598145,12.824120317720375,12.500736331406198,12.675051370173296,686044800 +2011-10-18,12.690080642700195,12.767320472152914,12.502242076933507,12.675654301859195,881602400 +2011-10-19,11.980201721191406,12.27473230074337,11.955556721402683,12.06224953122755,1104059600 +2011-10-20,11.880720138549805,12.032193497936676,11.847661381221236,12.021674692986672,549270400 +2011-10-21,11.807385444641113,11.995825860524203,11.743670727883137,11.964569599520917,621244400 +2011-10-24,12.195090293884277,12.217029153413513,11.883428799148215,11.906870804007891,502138000 +2011-10-25,11.954652786254883,12.218528953862794,11.94293258956705,12.172846349366665,430427200 +2011-10-26,12.039706230163574,12.0983120256727,11.81580185186462,12.074568275968032,456304800 +2011-10-27,12.162628173828125,12.292162675447663,12.078476933570144,12.248883656549236,494664800 +2011-10-28,12.170443534851074,12.21251956002799,12.097111240194184,12.111837728626092,322842800 +2011-10-31,12.165329933166504,12.302076761820532,12.053227291598336,12.094402055914706,385501200 +2011-11-01,11.916781425476074,12.006643466751482,11.817903727107547,11.943830804354802,531790000 +2011-11-02,11.943835258483887,12.034899528336073,11.874709844770706,12.024380722782649,327350800 +2011-11-03,12.113938331604004,12.123856036746348,11.88222051651544,11.993721267580074,441386400 +2011-11-04,12.028886795043945,12.125059978601076,11.996428335561747,12.08268381254746,302229200 +2011-11-07,12.013564109802246,12.021679330423735,11.905369728541686,12.018974791905695,270275600 +2011-11-08,12.20891284942627,12.262109579789946,12.068560186976995,12.088095455518054,400442000 +2011-11-09,11.879815101623535,12.048419284622314,11.848258696846083,11.930606620200383,558684000 +2011-11-10,11.577472686767578,11.937822167072692,11.485206238205283,11.932412290238428,744752400 +2011-11-11,11.559443473815918,11.682064169432893,11.428406609584517,11.619250676414639,653786000 +2011-11-14,11.398348808288574,11.578373862430386,11.366491449640861,11.526379340260194,432905200 +2011-11-15,11.685972213745117,11.706107779658119,11.404063858027376,11.444636742455344,430810800 +2011-11-16,11.563949584960938,11.755394720902729,11.550424490217981,11.698592212102414,349210400 +2011-11-17,11.342750549316406,11.558238782707054,11.285346942903363,11.540205858032785,479900400 +2011-11-18,11.26851749420166,11.420291016063421,11.266714201529238,11.388133500538718,371938000 +2011-11-21,11.090295791625977,11.170540298410668,10.997127287829008,11.132070059912124,447980400 +2011-11-22,11.315702438354492,11.358379559336095,11.148300392023407,11.15070478208059,409021200 +2011-11-23,11.029582023620605,11.29556154815074,11.026275587349762,11.25558898072886,428271200 +2011-11-25,10.926800727844238,11.154611058716908,10.91928660795598,11.072563257702695,254760800 +2011-11-28,11.30397891998291,11.322011842674973,11.129965629937523,11.190674864600915,346413200 +2011-11-29,11.216221809387207,11.385427133225424,11.126059597854937,11.295565069156932,375855200 +2011-11-30,11.486710548400879,11.489114938516915,11.369498937844378,11.459361814631096,405938400 +2011-12-01,11.65892219543457,11.691079711688138,11.443132982611004,11.496930011424121,387181200 +2011-12-02,11.712114334106445,11.830227159713344,11.678453683558253,11.716021065786787,379055600 +2011-12-05,11.811595916748047,11.913780889692037,11.73285454952817,11.8260222571731,357210000 +2011-12-06,11.749685287475586,11.86028563329195,11.70250113541609,11.796570094555694,283598000 +2011-12-07,11.693781852722168,11.74938215903689,11.623755208647983,11.719027141267977,304746400 +2011-12-08,11.740968704223633,11.886431090148232,11.728045509146318,11.764711654379653,376356400 +2011-12-09,11.829926490783691,11.842549535989084,11.752086385016849,11.806785445040319,296993200 +2011-12-12,11.7764310836792,11.838342513304898,11.704601947820894,11.771622304285627,301067200 +2011-12-13,11.685365676879883,11.883423647204244,11.633973055983532,11.811292765953375,338928800 +2011-12-14,11.426304817199707,11.642395028613796,11.350869061416114,11.621957706605807,406887600 +2011-12-15,11.388734817504883,11.532995023944173,11.36980064534639,11.520672925045282,256200000 +2011-12-16,11.451245307922363,11.545315054291484,11.407666945773942,11.431409894230896,421478400 +2011-12-19,11.487009048461914,11.566352300301793,11.435014524558833,11.49482331467239,235530400 +2011-12-20,11.899955749511719,11.90446438220017,11.638784894812426,11.653811530351508,337215200 +2011-12-21,11.914982795715332,11.940529038331675,11.781541557620573,11.922195163219513,262948000 +2011-12-22,11.978095054626465,11.995526880217863,11.904462625271883,11.931510404743682,202358800 +2011-12-23,12.12175464630127,12.129568913277708,12.006346341633847,12.012357316231107,269399200 +2011-12-27,12.21792984008789,12.294868722509904,12.112439224903511,12.114844417670996,265076000 +2011-12-28,12.101020812988281,12.269624287054004,12.061950268926404,12.228751252605901,228662000 +2011-12-29,12.175551414489746,12.191480899161178,12.037002857676248,12.1238586356769,215978000 +2011-12-30,12.17194652557373,12.21041596503038,12.1265648657762,12.127165160773876,179662000 +2012-01-03,12.359182357788086,12.397351644697126,12.292161998269554,12.30418394730127,302220800 +2012-01-04,12.425599098205566,12.462867132640715,12.300574063781543,12.322212765113962,260022000 +2012-01-05,12.563551902770996,12.579179635504728,12.402460980151131,12.470985293788974,271269600 +2012-01-06,12.694886207580566,12.705405010512848,12.599314131316003,12.615843908076224,318292800 +2012-01-09,12.674753189086914,12.855679536355339,12.663332335801943,12.788058069291068,394024400 +2012-01-10,12.720130920410156,12.80308075042147,12.667836253003061,12.80037541105452,258196400 +2012-01-11,12.699397087097168,12.708413550004842,12.602021695294523,12.703303819757119,215084800 +2012-01-12,12.664531707763672,12.709913358216472,12.5851884550639,12.691280141122798,212587200 +2012-01-13,12.617046356201172,12.63628147406032,12.582484457597948,12.613741524119064,226021600 +2012-01-17,12.764010429382324,12.802780808175513,12.711715761137205,12.748982995250625,242897200 +2012-01-18,12.896551132202148,12.907370083537904,12.812098948613086,12.83193436150638,276791200 +2012-01-19,12.855677604675293,12.964473033171958,12.818410365246976,12.927807693727948,261738400 +2012-01-20,12.631773948669434,12.848164228342291,12.615244169077759,12.84786408086609,413974400 +2012-01-23,12.845460891723633,12.876717963904996,12.691884081156044,12.703003984415389,306062400 +2012-01-24,12.635079383850098,12.776033924212681,12.609232996546071,12.776033924212681,547638000 +2012-01-25,13.424003601074219,13.658125067111424,13.335944820352456,13.657824919616848,958314000 +2012-01-26,13.362993240356445,13.488017503320831,13.31821268197128,13.475095111322446,323985200 +2012-01-27,13.44264030456543,13.478705360576635,13.337150477189454,13.35428055619787,299709200 +2012-01-30,13.614848136901855,13.64159657634465,13.38583559035896,13.395452348530068,379341200 +2012-01-31,13.719134330749512,13.7720293040782,13.616649216441816,13.692385894077608,391683600 +2012-02-01,13.710419654846191,13.794571702359859,13.691186139323175,13.777140676858734,270046000 +2012-02-02,13.67825984954834,13.739870328530959,13.643998099271853,13.701701846305959,186796400 +2012-02-03,13.81531047821045,13.824928039419222,13.691487587781424,13.743782274320644,286599600 +2012-02-06,13.944239616394043,13.97459463685763,13.770828215649237,13.776237290255956,249412800 +2012-02-07,14.09030818939209,14.117958680986252,13.962576946513856,13.982714118832911,316223600 +2012-02-08,14.326229095458984,14.329533927612276,14.116450099455644,14.140493997297463,407890000 +2012-02-09,14.821819305419922,14.929413318902288,14.442835868933724,14.448846842178517,884214800 +2012-02-10,14.829334259033203,14.95556150098669,14.68296985321836,14.755401687553713,631302000 +2012-02-13,15.10523796081543,15.14220426030162,14.939638376911624,15.012970680803118,517216000 +2012-02-14,15.311408996582031,15.314413682154278,15.087205201625151,15.167148777638447,460398400 +2012-02-15,14.95706844329834,15.817217313499372,14.933624837826091,15.45566638961488,1506120000 +2012-02-16,15.093512535095215,15.174057991036621,14.62526803873536,14.771632463864705,944552000 +2012-02-17,15.090815544128418,15.260622052976819,15.036116449519605,15.120568679982274,535805200 +2012-02-21,15.473393440246582,15.473393440246582,15.150911566354594,15.233861387138198,605595200 +2012-02-22,15.419002532958984,15.492634982684919,15.299686665596004,15.420204728159959,483302400 +2012-02-23,15.519680976867676,15.562959996865363,15.312608104595695,15.480310294419846,568027600 +2012-02-24,15.700615882873535,15.715342378395457,15.587312553675941,15.618267888023164,415072000 +2012-02-27,15.801289558410645,15.883637506321973,15.516375770557762,15.667547374223693,547582000 +2012-02-28,16.09131622314453,16.09131622314453,15.803997974829098,15.867412571312444,600387200 +2012-02-29,16.302593231201172,16.457974936402305,16.100028981286407,16.276146544942957,952011200 +2012-03-01,16.363601684570312,16.476006108201318,16.192292919392926,16.474802308202417,683270000 +2012-03-02,16.384944915771484,16.433631414426213,16.304999736429032,16.356694130724776,431712400 +2012-03-05,16.023691177368164,16.45406575129893,15.808501482802649,16.392155116485654,809124400 +2012-03-06,15.936531066894531,16.03961646764788,15.514570299899596,15.738173729472964,810238800 +2012-03-07,15.949454307556152,16.162538120707566,15.727353230815742,16.1330851504587,798520800 +2012-03-08,16.2890682220459,16.319121489202452,15.992432652203055,16.069671667483327,516457200 +2012-03-09,16.3846435546875,16.46188258527247,16.32273130817335,16.355790871636184,418919200 +2012-03-12,16.589916229248047,16.589916229248047,16.439643422856005,16.499151287260272,407282400 +2012-03-13,17.07378387451172,17.076188264542807,16.70261378752952,16.756412415741835,690855200 +2012-03-14,17.71934700012207,17.873825036908233,17.293177722688895,17.3728227360234,1418844000 +2012-03-15,17.598533630371094,18.03281663862415,17.387854126433893,18.02079468596194,1159718000 +2012-03-16,17.59882926940918,17.70792565300275,17.371319090029,17.57328302781325,825487600 +2012-03-19,18.065570831298828,18.085706392381713,17.70341803873665,17.983523034452677,901236000 +2012-03-20,18.211637496948242,18.239886673638516,17.776452509767125,18.017787152312373,816662000 +2012-03-21,18.107650756835938,18.322538740439608,18.074892943125498,18.11486392822183,644042000 +2012-03-22,18.012680053710938,18.167760024154788,17.898172967408712,17.965794440978087,623870800 +2012-03-23,17.913799285888672,18.08661041029963,17.8642091413695,18.047239726233386,430488800 +2012-03-26,18.242292404174805,18.24740293742428,17.890058851370114,18.026202237285176,595742000 +2012-03-27,18.467687606811523,18.52178474788945,18.214631312024945,18.2182378951012,607129600 +2012-03-28,18.562063217163086,18.677170553872116,18.342366543848964,18.584903312001956,655460400 +2012-03-29,18.328845977783203,18.530209623609,18.24980446697302,18.416604605969972,608238400 +2012-03-30,18.01898765563965,18.34988339269426,17.97059970963255,18.296086371885558,731038000 +2012-04-02,18.59242057800293,18.59662745756186,18.043930799142,18.087509962401978,598351600 +2012-04-03,18.913707733154297,19.000565953547152,18.709039173324776,18.852997665185356,834559600 +2012-04-04,18.763126373291016,18.809710218587362,18.54342968471203,18.764328568106404,572980800 +2012-04-05,19.044740676879883,19.074193655650884,18.735782942239457,18.84337700103703,641298000 +2012-04-09,19.121376037597656,19.229872133976446,18.792884668451745,18.817829011812638,597536800 +2012-04-10,18.887250900268555,19.35489344597345,18.813918621912446,19.232572932901295,889725200 +2012-04-11,18.819927215576172,19.140605016572867,18.73397110005157,19.12046945984857,696614800 +2012-04-12,18.71685028076172,18.974115260590924,18.6486269010668,18.783871465152753,614336800 +2012-04-13,18.189693450927734,18.774849375498555,18.13800067562456,18.75711659957017,859644800 +2012-04-16,17.435333251953125,18.341465511573247,17.378831701495415,18.334854242715362,1050786800 +2012-04-17,18.324039459228516,18.333055120128332,17.188292500287748,17.39957387947349,1025528000 +2012-04-18,18.283161163330078,18.641107034451675,18.113955057175023,18.444852348321994,954531200 +2012-04-19,17.6550350189209,18.17467228059601,17.56727637046794,18.039127574608823,834719200 +2012-04-20,17.220443725585938,17.87081660472834,17.143504870794004,17.773440440286556,1030985200 +2012-04-23,17.181968688964844,17.33133933049189,16.72875265486472,17.149210899287795,966529200 +2012-04-24,16.838754653930664,17.061455988538825,16.68006817584887,16.908780483495452,1076149200 +2012-04-25,18.333059310913086,18.57349357556096,18.212842981122794,18.502565652072576,905777600 +2012-04-26,18.26392936706543,18.474008528800464,18.096527325178908,18.461384678802023,536068400 +2012-04-27,18.122665405273438,18.218239060374316,18.047530660644547,18.184879368584635,406722400 +2012-04-30,17.551044464111328,17.98442694932115,17.521591488086084,17.966394023672997,506144800 +2012-05-01,17.495447158813477,17.93513921718572,17.46839856945928,17.57869716973409,610999200 +2012-05-02,17.61115074157715,17.653827858547036,17.397164861803244,17.43863978385755,427389200 +2012-05-03,17.486125946044922,17.77404601496641,17.440444143625648,17.746997431488328,390549600 +2012-05-04,16.988128662109375,17.38213883021172,16.985724272194894,17.34367019664669,529992400 +2012-05-07,17.115251541137695,17.21413003289667,16.86730414080747,16.875419354987287,460118400 +2012-05-08,17.076187133789062,17.175966103338528,16.79217540170719,17.1182623514802,497252000 +2012-05-09,17.10624122619629,17.250503020391776,16.855890940260302,16.941545327238817,480704000 +2012-05-10,17.14651107788086,17.307601969884097,17.084000158826637,17.268531441675346,333200000 +2012-05-11,17.032014846801758,17.26523594739571,16.96108692077651,16.980622195446195,399546000 +2012-05-14,16.776844024658203,17.056046927230458,16.758210809005742,16.90757989177202,352626400 +2012-05-15,16.625076293945312,16.927121000540637,16.582399169121135,16.873925872069357,476336000 +2012-05-16,16.4119930267334,16.7368794528916,16.260519644048482,16.651525200100323,560896000 +2012-05-17,15.932330131530762,16.454671956979237,15.932330131530762,16.38885296739869,717220000 +2012-05-18,15.940136909484863,16.331742639192075,15.693693394026795,16.047730937237816,732292400 +2012-05-21,16.868812561035156,16.87662763067109,16.050437215938658,16.063963112800852,631106000 +2012-05-22,16.739274978637695,17.247490283044005,16.60733693624936,17.117354729939283,694870400 +2012-05-23,17.14771270751953,17.21503400228827,16.626873516508578,16.755203380386824,584897600 +2012-05-24,16.990234375,17.326240671829055,16.86731193631691,17.30730569834707,496230000 +2012-05-25,16.899169921875,17.00616368118161,16.784362696917256,16.96829533789747,328507200 +2012-05-29,17.199106216430664,17.251100740888674,16.989930738983706,17.157933050369145,380508800 +2012-05-30,17.4064884185791,17.431132620515243,17.027504764250896,17.106848051622862,529429600 +2012-05-31,17.363201141357422,17.476504376473713,17.174761542649964,17.453662677971924,491674400 +2012-06-01,16.860097885131836,17.21053050438879,16.845973297699743,17.10564099710472,520987600 +2012-06-04,16.95927619934082,17.055750339555967,16.484722173186853,16.87542590887099,556995600 +2012-06-05,16.915395736694336,17.024793866702318,16.780152824131285,16.868511741014693,388214400 +2012-06-06,17.174768447875977,17.246596798703845,16.99564458195031,17.063867952421106,401455600 +2012-06-07,17.182584762573242,17.350887295063878,17.145918607216746,17.349986852358793,379766800 +2012-06-08,17.4410457611084,17.44886083130431,17.100832594366583,17.17897366592497,347516400 +2012-06-11,17.166051864624023,17.68688963534972,17.149821428693908,17.66344763408792,591264800 +2012-06-12,17.316020965576172,17.3298454060514,17.0317090604166,17.264930083796646,435380400 +2012-06-13,17.195802688598633,17.38574466848598,17.14230581783206,17.266730582963312,293580000 +2012-06-14,17.176868438720703,17.236076139041376,17.0485385410917,17.168152926555738,345573200 +2012-06-15,17.2550106048584,17.26973709274181,17.11736168121878,17.160940849886085,335255200 +2012-06-18,17.605134963989258,17.66854952468562,17.14200113584551,17.159733907279197,440412000 +2012-06-19,17.654129028320312,17.731968337668263,17.52459533930869,17.53361099834464,361404400 +2012-06-20,17.603944778442383,17.70943460698336,17.455476066727453,17.678177529232695,358943200 +2012-06-21,17.361404418945312,17.678475770561814,17.35449139545985,17.594925613953436,326351200 +2012-06-22,17.494544982910156,17.497249520812346,17.293783202016318,17.402579458766613,284471600 +2012-06-25,17.15403175354004,17.425421299887578,17.142009801586603,17.350284902712104,304382400 +2012-06-26,17.191896438598633,17.265829019767605,17.050640940827012,17.170857224626968,276536400 +2012-06-27,17.266130447387695,17.333451763915033,17.188591275651785,17.28115708271013,202997200 +2012-06-28,17.102333068847656,17.251101878075314,16.99894751812348,17.181076031851095,282836400 +2012-06-29,17.551651000976562,17.551651000976562,17.258621900781936,17.37132490698995,421500800 +2012-07-02,17.807706832885742,17.836257760311373,17.539623768380963,17.573585375835368,400092000 +2012-07-03,18.01477813720703,18.032510913165382,17.852186494212372,17.87863317682151,241712800 +2012-07-05,18.33125114440918,18.463489387246792,18.0219932952445,18.049342028308903,484383200 +2012-07-06,18.20923614501953,18.286175044448242,18.08000415404211,18.245602154080892,418930400 +2012-07-09,18.44995880126953,18.450258948657208,18.156029440223794,18.19179352627832,379405600 +2012-07-10,18.279253005981445,18.62968392861004,18.192094693897893,18.5725804836357,511957600 +2012-07-11,18.165651321411133,18.262725750971907,17.948960906589335,18.216442049734894,469322000 +2012-07-12,17.999446868896484,18.136793989936137,17.81250962209412,18.039719585284114,428041600 +2012-07-13,18.181880950927734,18.24860036339004,18.03251183903506,18.12117251324582,311427200 +2012-07-16,18.24018669128418,18.381740734108202,18.183383380603598,18.186389670541566,301260400 +2012-07-17,18.24108123779297,18.37812819695453,18.127174515798,18.356788843890104,293624800 +2012-07-18,18.22064971923828,18.283162246337362,18.139502369441164,18.23056742547869,252700000 +2012-07-19,18.462892532348633,18.49384785626179,18.21284073534007,18.371527298339053,436861600 +2012-07-20,18.1617431640625,18.466492325290808,18.14371024193069,18.42411535954768,397471200 +2012-07-23,18.147619247436523,18.209831632785733,17.66314591426302,17.86420780475681,487975600 +2012-07-24,18.06015396118164,18.32342811440021,17.987722149880486,18.254302738964068,565132400 +2012-07-25,17.280254364013672,17.45546985239891,17.13088526280248,17.264927583219723,877312800 +2012-07-26,17.277551651000977,17.443449745391888,17.14170682646925,17.424214625439287,406632800 +2012-07-27,17.58650779724121,17.606644964773928,17.178673174833843,17.281458439815516,403936400 +2012-07-30,17.883142471313477,18.015680851925016,17.66645044498032,17.759619750210206,379142400 +2012-07-31,18.35589027404785,18.384142651918875,18.114255560572484,18.129582339136874,462327600 +2012-08-01,18.2371826171875,18.525402875309258,18.122675539492217,18.510676386504024,384501600 +2012-08-02,18.26663589477539,18.353792633930183,18.04002773094616,18.117868661661802,332158400 +2012-08-03,18.50436019897461,18.572883696304594,18.379935446959706,18.442147822967158,344920800 +2012-08-06,18.710235595703125,18.779961305540624,18.491140758009745,18.552149349684047,302103200 +2012-08-07,18.66094398498535,18.783864799788283,18.574687706339837,18.716843639179388,290446800 +2012-08-08,18.62938690185547,18.750205080273528,18.54643705980526,18.615260710681245,244706000 +2012-08-09,18.735637664794922,18.765821588318442,18.647200783819176,18.648709577005718,221642400 +2012-08-10,18.764904022216797,18.76671425052552,18.674355531757246,18.67465696781578,194938800 +2012-08-13,19.015424728393555,19.015424728393555,18.811687804595405,18.815914357231264,278832400 +2012-08-14,19.066436767578125,19.27530619980245,19.021766192962648,19.071870677329454,340169200 +2012-08-15,19.040481567382812,19.13616255748562,18.94751833844235,19.054668409606894,257342400 +2012-08-16,19.206789016723633,19.219465452275376,19.030518215546852,19.05194919350469,254534000 +2012-08-17,19.562049865722656,19.564464578976526,19.281346703771526,19.317264354454288,442761200 +2012-08-20,20.076372146606445,20.076372146606445,19.616077515544305,19.619398149198613,613384800 +2012-08-21,19.802005767822266,20.370054965869947,19.629055559514782,20.2475106873035,812719600 +2012-08-22,20.18864631652832,20.192569821190492,19.56204295609779,19.752498963840054,565322800 +2012-08-23,20.00031089782715,20.219741922653782,19.955638702075973,20.105347701758244,420128800 +2012-08-24,20.01811408996582,20.207061335744054,19.7866095462437,19.90613460534152,437340400 +2012-08-27,20.394207000732422,20.550857126404562,20.32961421223882,20.524295274471804,427008400 +2012-08-28,20.36764144897461,20.40687973531377,20.242983886018962,20.373073748085734,267416800 +2012-08-29,20.327495574951172,20.454264792742823,20.301236778137394,20.381222137124485,202806800 +2012-08-30,20.03773307800293,20.269540668052276,20.006946296163964,20.242074519261546,302699600 +2012-08-31,20.079086303710938,20.180501024584004,19.837921278600163,20.139753952164043,338321200 +2012-09-04,20.372770309448242,20.377901171872917,20.05675238456349,20.09478331047785,367892000 +2012-09-05,20.229705810546875,20.41442655902703,20.210689538579576,20.390883908176612,336375200 +2012-09-06,20.41201400756836,20.47298472445206,20.24691238596886,20.318446266656995,391196400 +2012-09-07,20.537872314453125,20.59944588391338,20.39691626419179,20.46573236068448,329666400 +2012-09-10,20.003631591796875,20.62389535186049,19.984313885467945,20.538176253942144,487998000 +2012-09-11,19.938732147216797,20.225773457549696,19.81528197756141,20.075160188436683,503983200 +2012-09-12,20.21642303466797,20.21974366870954,19.800197677139447,20.12768473176087,712233200 +2012-09-13,20.614538192749023,20.69060004446488,20.36673349638936,20.445210061237724,598360000 +2012-09-14,20.865062713623047,21.037107024723266,20.762740435578365,20.82522155187702,600474000 +2012-09-17,21.121614456176758,21.12221732841777,20.965567263226898,21.108634971458535,398031200 +2012-09-18,21.1859073638916,21.198583802441508,21.0202012944545,21.12463522430354,373503200 +2012-09-19,21.19164276123047,21.24868834679882,21.11527946966729,21.13610596845344,326874800 +2012-09-20,21.089017868041992,21.130067990960665,20.93568680929122,21.102901662461946,336568400 +2012-09-21,21.130971908569336,21.281283767169842,21.108938054811507,21.20099697558916,571589200 +2012-09-24,20.85026741027832,20.98096174173953,20.61514076724004,20.731648256263224,639766400 +2012-09-25,20.32961082458496,20.910336503949612,20.313310703090448,20.77390680826036,518789600 +2012-09-26,20.07727813720703,20.303953295815923,19.957148572489324,20.18472965154493,576503200 +2012-09-27,20.56443977355957,20.590095705178683,19.9314978174166,20.050420056371117,594090000 +2012-09-28,20.135231018066406,20.55809762472801,20.12466624402117,20.486865191853603,535110800 +2012-10-01,19.902509689331055,20.426491005705405,19.815280217283576,20.257765794693807,543594800 +2012-10-02,19.96046257019043,20.112586240794187,19.638709368528996,19.975553718032927,627992400 +2012-10-03,20.266517639160156,20.27889424873475,20.000302860409924,20.067611757179495,424281200 +2012-10-04,20.126174926757812,20.35103987056265,20.088447045284585,20.260489731110525,370725600 +2012-10-05,19.6972713470459,20.102027597167247,19.657731624950657,20.077882075651303,594006000 +2012-10-08,19.26203155517578,19.545452516136127,19.1998534866122,19.524927450753083,637994000 +2012-10-09,19.192005157470703,19.332055311270338,18.82075183662287,19.276518514823906,838597200 +2012-10-10,19.344730377197266,19.46757609222592,19.226714088643515,19.309415599089068,510356000 +2012-10-11,18.958084106445312,19.534584839410215,18.958084106445312,19.513456903197902,546081200 +2012-10-12,19.00667953491211,19.177817911296106,18.87357208794213,19.002151544375764,460014800 +2012-10-15,19.15910530090332,19.170272947552697,18.82980641294604,19.086364073608316,432502000 +2012-10-16,19.612756729125977,19.628150928714156,19.04561346084254,19.177515154005043,549771600 +2012-10-17,19.456411361694336,19.703310185363826,19.437999573489613,19.58499244291708,389037600 +2012-10-18,19.09511947631836,19.379444766300686,19.01543553460168,19.304893300266766,476624400 +2012-10-19,18.406936645507812,19.068853330088338,18.400295378718397,19.0471225248485,744086000 +2012-10-22,19.137067794799805,19.177814867284752,18.43470387478185,18.484808363034464,546730800 +2012-10-23,18.513193130493164,19.133157410345337,18.463090219838893,19.045624810951853,707145600 +2012-10-24,18.6179141998291,18.911295353421604,18.431080232217916,18.757060008190823,558527200 +2012-10-25,18.397878646850586,18.773962904944103,18.27744766902108,18.713595086018977,656325600 +2012-10-26,18.230667114257812,18.532499815620863,17.838285892052305,18.394561339386183,1018432800 +2012-10-31,17.96867561340332,18.169091955114972,17.73867984362941,17.955394691997057,510003200 +2012-11-01,18.00550079345703,18.20048324244578,17.9339669298759,18.056208158683877,361298000 +2012-11-02,17.40967559814453,18.017867086608813,17.347800617268035,17.985872958161853,599373600 +2012-11-05,17.64571762084961,17.740794137717568,17.433830555088154,17.61251611839243,529135600 +2012-11-06,17.592294692993164,17.83044058717331,17.50899029622502,17.815047996667705,374917200 +2012-11-07,16.91917610168457,17.420686490817907,16.85095246167806,17.39946204208502,793648800 +2012-11-08,16.30516242980957,17.04742336061132,16.23057328505439,16.99890851590494,1056146000 +2012-11-09,16.587453842163086,16.82456450280411,16.18297018844804,16.386122073568988,929913600 +2012-11-12,16.459192276000977,16.81303969954485,16.332449685099828,16.802426673432773,515802000 +2012-11-13,16.46132469177246,16.691158211796687,16.26302421669534,16.340343573247182,532949200 +2012-11-14,16.278779983520508,16.599274221129434,16.25755555346407,16.540147982123504,477170400 +2012-11-15,15.937368392944336,16.358224971435682,15.846406294175999,16.2984930906875,789910800 +2012-11-16,15.999837875366211,16.07018281629619,15.334895928954388,15.924641447522347,1266893600 +2012-11-19,17.153539657592773,17.207207156943475,16.36974025771589,16.394906107918327,823317600 +2012-11-20,17.007396697998047,17.3421426114836,16.815465128039705,17.34092974050256,642754000 +2012-11-21,17.031356811523438,17.203276875542446,16.876718140421417,17.108676147074448,373002000 +2012-11-23,17.32849884033203,17.343660539216785,17.05864229907964,17.197209183119703,272826400 +2012-11-26,17.875186920166016,17.889436939429835,17.395506981940304,17.46191045238933,630579600 +2012-11-27,17.731168746948242,17.90218038491265,17.5892660241509,17.875800025712234,533330000 +2012-11-28,17.675371170043945,17.762089015954043,17.351541096335108,17.503449542795117,520864400 +2012-11-29,17.870038986206055,18.018308883554187,17.745420892759793,17.896116533107033,514698800 +2012-11-30,17.746326446533203,17.84092878879608,17.667491431200943,17.79211112370649,391319600 +2012-12-03,17.773916244506836,18.02861433410667,17.752994621501568,18.000112671063654,364280000 +2012-12-04,17.460397720336914,17.640807869409382,17.34760393037324,17.640807869409382,557068400 +2012-12-05,16.33669090270996,17.260270048816544,16.336083657720412,17.24996145787394,1044638000 +2012-12-06,16.59290885925293,16.776955956938814,15.725421113241675,16.038032534054796,1177212400 +2012-12-07,16.16871452331543,16.834261597995837,16.070170793255198,16.77968403036869,787040800 +2012-12-10,16.064720153808594,16.328209563683842,15.814873522014166,15.918571589995134,630484400 +2012-12-11,16.415525436401367,16.663248999100993,16.293634367404838,16.366404985682774,592345600 +2012-12-12,16.343063354492188,16.61595286377373,16.260286929385206,16.608978450398094,487144000 +2012-12-13,16.060775756835938,16.30182945619386,15.942826056057816,16.105044746249195,625259600 +2012-12-14,15.457386016845703,15.710263994702165,15.329734966376481,15.60777880717018,1009579200 +2012-12-17,15.731484413146973,15.766960481895119,15.197834175421544,15.43130615442642,757607200 +2012-12-18,16.188426971435547,16.21874712957553,15.774543210532087,15.918568819658683,625685200 +2012-12-19,15.958291053771973,16.18236456303477,15.933730815903942,16.114748205652457,449369200 +2012-12-20,15.819421768188477,16.076241188604946,15.733006713865098,16.07017683222078,481689600 +2012-12-21,15.746646881103516,15.756955474527151,15.471027220271484,15.538643561301537,596268400 +2012-12-24,15.772113800048828,15.895823384674282,15.727844824912818,15.77757252838241,175753200 +2012-12-26,15.554713249206543,15.750587853864635,15.497709935467617,15.736639028668707,302436400 +2012-12-27,15.617176055908203,15.6532577529391,15.301836079559186,15.571086958839116,455120400 +2012-12-28,15.451322555541992,15.599594044340254,15.406750750802443,15.472548612454837,354278400 +2012-12-31,16.135967254638672,16.23390536042636,15.433428418974971,15.47981870443,659492400 +2013-01-02,16.647184371948242,16.828201746958356,16.422809687293846,16.792422857823325,560518000 +2013-01-03,16.437055587768555,16.666586131735777,16.403702449286822,16.612311376067858,352965200 +2013-01-04,15.979209899902344,16.331844461119488,15.94373382700266,16.28151112288958,594333600 +2013-01-07,15.885213851928711,16.048946573472275,15.621420085903583,15.827603291022434,484156400 +2013-01-08,15.927970886230469,16.12748417783673,15.804868490759398,16.046223415553555,458707200 +2013-01-09,15.679040908813477,15.91888022553838,15.645383312833927,15.842773737520922,407604400 +2013-01-10,15.873388290405273,16.031359457282196,15.631121789016747,16.026205160952273,601146000 +2013-01-11,15.776062965393066,15.928274263596235,15.73725108421246,15.797287403253307,350506800 +2013-01-14,15.213605880737305,15.387951668505577,15.115364929533344,15.241803112940682,734207600 +2013-01-15,14.733622550964355,15.12991890533293,14.65660603925707,15.108997281917567,876772400 +2013-01-16,15.345199584960938,15.4467763450027,14.933137478393105,14.998023665978767,690804800 +2013-01-17,15.241799354553223,15.486491613964898,15.222092225896631,15.473150033603217,453678400 +2013-01-18,15.160550117492676,15.227862069646664,15.051393280917713,15.115673863401948,472922800 +2013-01-22,15.305173873901367,15.399471770723396,15.058360265847165,15.298806705280409,461546400 +2013-01-23,15.585341453552246,15.615055988236866,15.305174684153906,15.427671436485648,861509600 +2013-01-24,13.659647941589355,14.121437645213211,13.652066283336119,13.947697517638176,1460852400 +2013-01-25,13.337636947631836,13.833386221469025,13.189669926463386,13.695729413308143,1208026400 +2013-01-28,13.639331817626953,13.741816987345246,13.21574674494054,13.275479426733325,785517600 +2013-01-29,13.895240783691406,13.953761402740254,13.708766326534622,13.902215196548525,571158000 +2013-01-30,13.851579666137695,14.026532666625329,13.780931953646379,13.856733963122656,417155200 +2013-01-31,13.810949325561523,13.925866020690917,13.795486434574423,13.856128366145889,319334400 +2013-02-01,13.754246711730957,13.9319282403083,13.594455432754641,13.920709589942993,539484400 +2013-02-04,13.411623001098633,13.82459593286275,13.401920031402577,13.763043933343928,477117200 +2013-02-05,13.88220500946045,13.939815576160793,13.408589377805642,13.464077015283618,573347600 +2013-02-06,13.867347717285156,14.144784284829138,13.722714865267541,13.840664553547612,593706400 +2013-02-07,14.279674530029297,14.3339593919007,13.849654836168023,14.128100719515489,704580800 +2013-02-08,14.485840797424316,14.602647159519975,14.28058963194696,14.455953092697895,633158400 +2013-02-11,14.636808395385742,14.789603836314026,14.43308494125063,14.53220139627456,517490400 +2013-02-12,14.269918441772461,14.711526851981972,14.265038682846964,14.62399739782437,609053200 +2013-02-13,14.242779731750488,14.444980327620062,14.12719325567045,14.248879432352462,475207600 +2013-02-14,14.229966163635254,14.383979884890948,14.151587074450019,14.16683550620581,355275200 +2013-02-15,14.033865928649902,14.338844349161537,14.026546290196855,14.298890915415821,391745200 +2013-02-19,14.028678894042969,14.112243945634381,13.841423858542997,14.062532626497799,435783600 +2013-02-20,13.688935279846191,13.95853543949789,13.687409133647165,13.95853543949789,476302400 +2013-02-21,13.603843688964844,13.698692765346983,13.50503103069968,13.602013779679625,447182400 +2013-02-22,13.748709678649902,13.772802264460514,13.620313884589372,13.70113366245683,330654800 +2013-02-25,13.504426002502441,13.880158532396646,13.497410940909091,13.84142666225737,372579200 +2013-02-26,13.692595481872559,13.770974574127917,13.347665257393558,13.535531090858704,501499600 +2013-02-27,13.558404922485352,13.798422779111924,13.438854082370733,13.676125852942357,587350400 +2013-02-28,13.4617280960083,13.659048068687294,13.4617280960083,13.542547073241273,322515200 +2013-03-01,13.128388404846191,13.363526532206558,13.11344454793665,13.358035988158377,552448400 +2013-03-04,12.810600280761719,13.05915691153983,12.77857726763811,13.046957513325303,582755600 +2013-03-05,13.148818016052246,13.272334053585707,12.831946432932956,12.854209924049067,638433600 +2013-03-06,12.981695175170898,13.274169702909594,12.944182424720577,13.25160081132134,460250000 +2013-03-07,13.131741523742676,13.175353964577543,12.84140236521405,12.94631474529643,468473600 +2013-03-08,13.166507720947266,13.279654276584754,13.071659446234943,13.107952244731983,391482000 +2013-03-11,13.354068756103516,13.38883703662777,12.965831507894988,13.106426704250076,474236000 +2013-03-12,13.066171646118164,13.384874014148755,13.039943753356825,13.284841388192303,465911600 +2013-03-13,13.063729286193848,13.251290526050484,12.972541648774921,13.066779949661242,405549200 +2013-03-14,13.190298080444336,13.255562418156847,13.127776571399354,13.200361362464719,303875600 +2013-03-15,13.53065013885498,13.548033870360968,13.335158489458749,13.3558974619375,643960800 +2013-03-18,13.898456573486328,13.951521511801596,13.455628197363147,13.463252413945522,606197200 +2013-03-19,13.860943794250488,14.058569143998382,13.67826067022961,14.013735951785414,526775200 +2013-03-20,13.787443161010742,13.956706952047174,13.711503947049476,13.95030267550943,308660800 +2013-03-21,13.807265281677246,13.967378692837213,13.72705710161771,13.730716920494626,383255600 +2013-03-22,14.087238311767578,14.093031804484765,13.81885805987916,13.863689627784854,395105200 +2013-03-25,14.13817024230957,14.332442007774635,14.083274575258072,14.172022353156898,501135600 +2013-03-26,14.063753128051758,14.207091970665301,14.0451494548476,14.194892573685863,294294000 +2013-03-27,13.787443161010742,13.93139279488807,13.746271415761237,13.92102412132773,331237200 +2013-03-28,13.500155448913574,13.779515154327868,13.468437827783394,13.718519791722063,442839600 +2013-04-01,13.080810546875,13.531873119936046,13.045128528364133,13.476976641885171,389732000 +2013-04-02,13.107647895812988,13.362304217887095,13.004260035063792,13.04085822858477,529519200 +2013-04-03,13.174741744995117,13.33607510190834,13.123505093151177,13.155832680079525,363216000 +2013-04-04,13.044512748718262,13.266536826803842,12.969183528900787,13.22872033525859,358447600 +2013-04-05,12.906665802001953,12.960036936441487,12.799312748961055,12.94631220913574,383695200 +2013-04-08,12.998470306396484,13.037812156719365,12.885019124039564,12.95699315350997,300829200 +2013-04-09,13.021951675415039,13.068307767397826,12.892945868679627,13.003043419491911,306614000 +2013-04-10,13.287583351135254,13.32936587654622,12.992364473778245,13.05610509829372,375928000 +2013-04-11,13.24610710144043,13.357728321382305,13.150648045838794,13.227502614674693,328364400 +2013-04-12,13.107950210571289,13.240614966233268,13.086296691677859,13.240614966233268,238613200 +2013-04-15,12.804498672485352,13.049700839384,12.795349125188666,13.0225575895933,317520000 +2013-04-16,12.99937915802002,13.01066237777659,12.826456384043043,12.85695405973152,305771200 +2013-04-17,12.28451156616211,12.82737335620436,12.141477294495521,12.817308446029182,945056000 +2013-04-18,11.956663131713867,12.375702729219736,11.886212821635688,12.351304744760123,666299200 +2013-04-19,11.910307884216309,12.186923196665544,11.744703864400984,11.832233345835707,609274400 +2013-04-22,12.15855598449707,12.266214449460952,11.932873638243214,11.974654540128332,429920400 +2013-04-23,12.386070251464844,12.454689826352238,12.162825349443642,12.320804289316428,664238400 +2013-04-24,12.365636825561523,12.664210180177067,11.970385274250622,12.0021037101966,969651200 +2013-04-25,12.454689025878906,12.624256568082112,12.412601921650808,12.541607691402605,384837600 +2013-04-26,12.723679542541504,12.77156095427035,12.450724142096616,12.498300976089489,764097600 +2013-04-29,13.11771297454834,13.224455263883838,12.809074720259833,12.822798635816792,640326400 +2013-04-30,13.503813743591309,13.579143802394109,13.177182608622372,13.269591009729533,691538400 +2013-05-01,13.39737606048584,13.569383485056441,13.247937520203257,13.555049600873804,506909200 +2013-05-02,13.587381362915039,13.681008092667014,13.438246549105077,13.473318602333382,421828400 +2013-05-03,13.723400115966797,13.822518195065804,13.698085956319163,13.763961080945888,361300800 +2013-05-06,14.050644874572754,14.09608560814533,13.855457712671962,13.8981539881611,496641600 +2013-05-07,13.98812198638916,14.20435105834815,13.8368526836095,14.18056304268072,483753200 +2013-05-08,14.146096229553223,14.192758514540218,13.901199449697922,13.999706727299703,472598000 +2013-05-09,14.022688865661621,14.213947697768134,13.986156648189462,14.116016368361906,398487600 +2013-05-10,13.906027793884277,14.11294418400742,13.829585923792193,14.059526361223655,334852000 +2013-05-13,13.960365295410156,14.057376822093415,13.860899378741347,13.861205972547157,316948800 +2013-05-14,13.626350402832031,13.974484290747068,13.57385319663293,13.93304003401911,447118000 +2013-05-15,13.165553092956543,13.538554843243464,12.96631299740496,13.48206779553162,741613600 +2013-05-16,13.341458320617676,13.441846460778036,12.86008809320733,12.993324392965805,603204000 +2013-05-17,13.300934791564941,13.51061376957028,13.231861021785171,13.478686210685725,427904400 +2013-05-20,13.597804069519043,13.685912083861046,13.203926921658102,13.259493362880518,451578400 +2013-05-21,13.497415542602539,13.676087596115948,13.329795622224873,13.451059213826392,456022000 +2013-05-22,13.549298286437988,13.764196781868023,13.45320817584909,13.63218764754889,443038400 +2013-05-23,13.573549270629883,13.69696228391454,13.378606453251018,13.383518511861686,353021200 +2013-05-24,13.665953636169434,13.681610411172706,13.518902588634903,13.533945356387669,276166800 +2013-05-28,13.5520601272583,13.848925725882147,13.53394813929809,13.811780329011816,386145200 +2013-05-29,13.65981674194336,13.738101454943868,13.489433379245815,13.507853601046952,330576400 +2013-05-30,13.863356590270996,13.953000036023507,13.646309471259826,13.681307075200003,353519600 +2013-05-31,13.806561470031738,14.032817856488407,13.799499975419645,13.891597801480735,384302800 +2013-06-03,13.83695125579834,13.887298211854002,13.5839860016852,13.837257849545324,372352400 +2013-06-04,13.793667793273926,13.950850415088022,13.734724719978438,13.913703375738464,292728800 +2013-06-05,13.664728164672852,13.836953541529331,13.62174846890814,13.681305543752254,290589600 +2013-06-06,13.460575103759766,13.722750507777965,13.325190170005339,13.675780174448704,416934000 +2013-06-07,13.563421249389648,13.607321552274165,13.285895621237058,13.400405960883136,404535600 +2013-06-10,13.473773956298828,13.786602874016388,13.40961224570749,13.653059981129632,450153200 +2013-06-11,13.434170722961426,13.592581318230891,13.302776447348034,13.37707050663286,286112400 +2013-06-12,13.268086433410645,13.546225989527807,13.24690359238949,13.492501582826476,265227200 +2013-06-13,13.383824348449707,13.420049958884459,13.162480048330524,13.277604366081247,285832400 +2013-06-14,13.20238971710205,13.393955893444605,13.154804561835487,13.3666329788231,271866000 +2013-06-17,13.262252807617188,13.375841692488704,13.211905851357397,13.24506142394316,259414400 +2013-06-18,13.255194664001465,13.351284770022337,13.20730372766394,13.248747996364383,195025600 +2013-06-19,12.9859619140625,13.251820604340384,12.9859619140625,13.243838506812299,310940000 +2013-06-20,12.796846389770508,13.07744032384495,12.74557801427818,12.872367641644997,357310800 +2013-06-21,12.694311141967773,12.893859434996727,12.528533253717919,12.847502289230174,481118400 +2013-06-24,12.357839584350586,12.545721680955772,12.219997842827773,12.507040048720315,480746000 +2013-06-25,12.36060905456543,12.51901888403966,12.243950093791925,12.454857152418443,314162800 +2013-06-26,12.22061538696289,12.426916924909248,12.146628735617522,12.399594009445593,367724000 +2013-06-27,12.088913917541504,12.322538391231848,12.081546648937017,12.256842062538906,337246000 +2013-06-28,12.173341751098633,12.288157877954529,11.9381817901821,12.014624496564304,578516400 +2013-07-01,12.56291389465332,12.656548765343251,12.317316746890578,12.362445867335603,391053600 +2013-07-02,12.84749984741211,12.943897345011953,12.570589958779038,12.58563272634592,469865200 +2013-07-03,12.918418884277344,12.985344866575161,12.815575520935962,12.92026090635259,240928800 +2013-07-05,12.814653396606445,12.994860857446973,12.751105687922358,12.90583225467205,274024800 +2013-07-08,12.741893768310547,12.924557244258025,12.606815446446458,12.89723515008528,298138400 +2013-07-09,12.966002464294434,13.001306653445996,12.598527712652436,12.697380426000095,352584400 +2013-07-10,12.916266441345215,13.041214860267342,12.84013200593654,12.88157626332589,281405600 +2013-07-11,13.117658615112305,13.147130965736435,12.929777298500063,12.984422309076775,326292400 +2013-07-12,13.093716621398926,13.194411386752554,12.998547923252392,13.128714227274196,279563200 +2013-07-15,13.122262001037598,13.245674998127368,13.04121550390529,13.047662989870451,241917200 +2013-07-16,13.20699405670166,13.222650011666955,13.021874562811833,13.094018364085306,216538000 +2013-07-17,13.210372924804688,13.269010219910804,13.146211202798709,13.191646929304833,198990400 +2013-07-18,13.254884719848633,13.350359974584311,13.219580533902118,13.304617665764603,218878800 +2013-07-19,13.045820236206055,13.323037524074259,13.027400019866699,13.296022026545842,268721600 +2013-07-22,13.08757209777832,13.193178886971962,13.061784612680984,13.184276191605047,207796400 +2013-07-23,12.8628511428833,13.107526886521459,12.854255041285516,13.07805535795556,369395600 +2013-07-24,13.52350902557373,13.648763242201463,13.362335789915155,13.475003266123872,591936800 +2013-07-25,13.46180248260498,13.550831905953574,13.379220546108836,13.529342469163982,229493600 +2013-07-26,13.538246154785156,13.5397807633382,13.334093211289051,13.363564745525444,200152400 +2013-07-29,13.747002601623535,13.814541767736964,13.513992150624423,13.532411550578331,248057600 +2013-07-30,13.91677188873291,14.034351421692927,13.791209440818108,13.813620298184496,309422400 +2013-07-31,13.892518997192383,14.040184077742069,13.797350316066671,13.968041082412615,322957600 +2013-08-01,14.01992130279541,14.023605346586006,13.914928514071711,13.991372012841854,206250800 +2013-08-02,14.199824333190918,14.209341858205939,14.019311068048134,14.060755339767292,274783600 +2013-08-05,14.411955833435059,14.449409457513896,14.187848916007637,14.265825380776917,318855600 +2013-08-06,14.283019065856934,14.486864584080731,14.188463575054135,14.36805703300683,334857600 +2013-08-07,14.27473258972168,14.33674652445584,14.17618644015708,14.23850696874158,298858000 +2013-08-08,14.246298789978027,14.341787213481073,14.151736220803354,14.334370476668775,255777200 +2013-08-09,14.043578147888184,14.229301888178178,14.018857341865136,14.173059125079206,266865200 +2013-08-12,14.442530632019043,14.48239353463464,14.110947661123433,14.118055780754359,364434000 +2013-08-13,15.128873825073242,15.286166771156202,14.463852821632685,14.553162300136895,881941200 +2013-08-14,15.404821395874023,15.582509433209438,15.247219932781263,15.385662325922258,756372400 +2013-08-15,15.38659954071045,15.525352304640336,15.113731537729269,15.340556015234322,490294000 +2013-08-16,15.523185729980469,15.542036192296818,15.415954952661034,15.455817854673741,362306000 +2013-08-19,15.690364837646484,15.875778295092069,15.574789838537345,15.58529605650577,510518400 +2013-08-20,15.4842529296875,15.777826433316775,15.476527571754866,15.751250607897164,358688400 +2013-08-21,15.5241117477417,15.672132917694713,15.488264185777718,15.562121286878591,335879600 +2013-08-22,15.542652130126953,15.62392596918127,15.395556812718995,15.605075508439718,244207600 +2013-08-23,15.482702255249023,15.55470434598424,15.431095365698958,15.552232100363964,222731600 +2013-08-26,15.542962074279785,15.766386734713985,15.466632728184145,15.474358083191143,330965600 +2013-08-27,15.098590850830078,15.528753505587682,15.027824855160258,15.389381841875363,424188800 +2013-08-28,15.169977188110352,15.321399830694308,15.018556195891435,15.018556195891435,307608000 +2013-08-29,15.194693565368652,15.34302501477603,15.177079226381082,15.193148824312496,239657600 +2013-08-30,15.056253433227539,15.233322704966463,15.034003217258032,15.203966018891284,272297200 +2013-09-03,15.098273277282715,15.469719030038535,15.0602637462868,15.237951826014386,331928800 +2013-09-04,15.410700798034668,15.520405475919564,15.336226450641984,15.437586885730767,345032800 +2013-09-05,15.305009841918945,15.472193360114801,15.254639083892316,15.458904629613494,236367600 +2013-09-06,15.396175384521484,15.432021295827294,15.140613181136247,15.402974885192751,359525600 +2013-09-09,15.641854286193848,15.695933441270292,15.558727059568927,15.60569809327958,340687200 +2013-09-10,15.28554630279541,15.68140600743135,15.126708631913898,15.642777578390032,743195600 +2013-09-11,14.453349113464355,14.63814374570476,14.363731011439576,14.431716133438927,898696400 +2013-09-12,14.607234954833984,14.690979366804939,14.400805796255678,14.477754009962904,404051200 +2013-09-13,14.3665132522583,14.580666242036338,14.360334286361544,14.50371963253571,298835600 +2013-09-16,13.909772872924805,14.26484052173593,13.820156435647188,14.245991709924958,543706800 +2013-09-17,14.070466041564941,14.206127650301786,13.828809775571811,13.843024364640684,399380800 +2013-09-18,14.359712600708008,14.411319498659898,14.235484713610703,14.31335881296337,456862000 +2013-09-19,14.595190048217773,14.704275854396252,14.50093771999524,14.545746772062653,404541200 +2013-09-20,14.444075584411621,14.788326757762512,14.400502661903891,14.771331304539855,699302800 +2013-09-23,15.161930084228516,15.355687723011073,14.913474444354247,15.330656658153998,762106800 +2013-09-24,15.11434555053711,15.311192739690718,15.07479127191674,15.292961166447542,364344400 +2013-09-25,14.880414009094238,15.131031702764016,14.877324527463287,15.117436003150885,316957200 +2013-09-26,15.025345802307129,15.0976565067485,14.953652334051108,15.01854795244763,237221600 +2013-09-27,14.918115615844727,14.977447859029972,14.855383622417161,14.94994453971529,228040400 +2013-09-30,14.732704162597656,14.884433716352554,14.660391795135975,14.748154874305166,260156400 +2013-10-01,15.079119682312012,15.11558448594774,14.7830739975062,14.78523762536619,353883600 +2013-10-02,15.128558158874512,15.197779375180797,14.949016712131444,15.007112824865724,289184000 +2013-10-03,14.93851089477539,15.214778561786593,14.8560025867636,15.157916913504033,322753200 +2013-10-04,14.926770210266113,14.97528597215437,14.789872484354255,14.952418523206394,258868400 +2013-10-07,15.072633743286133,15.224054719289017,14.998467996794648,15.03586031345184,312292400 +2013-10-08,14.862184524536133,15.161936900869438,14.84982329554756,15.14030392495726,290917200 +2013-10-09,15.036783218383789,15.073865259172742,14.779984846012878,14.97652345803277,301725200 +2013-10-10,15.131031036376953,15.215702963778243,15.050684713141315,15.182948188549057,278602800 +2013-10-11,15.228994369506836,15.260823296095593,14.992591230890564,15.049142615236223,267738800 +2013-10-14,15.328810691833496,15.376400604934435,15.122074471677598,15.1369079485451,261898000 +2013-10-15,15.410392761230469,15.512989323183014,15.312742341802323,15.374236574902632,320073600 +2013-10-16,15.485490798950195,15.529372355290848,15.427394648425405,15.47560181156469,251101200 +2013-10-17,15.590241432189941,15.598894291746118,15.441292761454838,15.45056285722578,253593200 +2013-10-18,15.72590160369873,15.737335325919545,15.6276323259972,15.636285184773719,290542000 +2013-10-21,16.111257553100586,16.202110109044767,15.80717792671157,15.81490328210439,398106800 +2013-10-22,16.065214157104492,16.33035676722599,15.699329996928926,16.267316143901635,534063600 +2013-10-23,16.22250747680664,16.24444907340088,16.038328444213914,16.038328444213914,313723200 +2013-10-24,16.437278747558594,16.45458446955314,16.144943084790903,16.22374303787822,384764800 +2013-10-25,16.25340461730957,16.47806370936094,16.227137424841583,16.419040093413148,337792000 +2013-10-28,16.37454605102539,16.409157493551618,16.168427088054376,16.34858746913072,550440800 +2013-10-29,15.966632843017578,16.664099911442243,15.900502744554734,16.57201123252714,635807200 +2013-10-30,16.22064971923828,16.30161328101746,15.977138497000972,16.05717620452278,354163600 +2013-10-31,16.15266227722168,16.300685076926797,16.108472130106538,16.22373850465699,275696400 +2013-11-01,16.070159912109375,16.217563879734406,15.940678904406505,16.193460304258977,274890000 +2013-11-04,16.277816772460938,16.27998039958244,16.03245221484496,16.103218170102576,244627600 +2013-11-05,16.237655639648438,16.343960610659884,16.161945137961666,16.21077119120206,265213200 +2013-11-06,16.191648483276367,16.3141149972181,16.10710301365161,16.29204529470566,223375600 +2013-11-07,15.929618835449219,16.262204847507043,15.926200895119765,16.14999713669139,262620400 +2013-11-08,16.180456161499023,16.198173341040775,15.932726067906462,15.99458098630661,279316800 +2013-11-11,16.133516311645508,16.214952564245106,15.989292240171778,16.16273396181481,227452400 +2013-11-12,16.163368225097656,16.28490185265656,16.069808928485752,16.09063363663494,204276800 +2013-11-13,16.182634353637695,16.232988798347584,16.068559142967707,16.10088598599139,197220800 +2013-11-14,16.41667938232422,16.451491227867223,16.221167983518065,16.25038563138428,282419200 +2013-11-15,16.318157196044922,16.445595424284775,16.30261627260111,16.367578726996555,317920400 +2013-11-18,16.12046241760254,16.386532141115552,16.107097760439874,16.318150115633156,244944000 +2013-11-19,16.149066925048828,16.268113856489716,16.09995581207834,16.13290350077999,208938800 +2013-11-20,16.007638931274414,16.176109045912963,15.98681422699272,16.139119258307623,193916800 +2013-11-21,16.198486328125,16.2006625884136,15.966298777333982,16.088453213533214,262026800 +2013-11-22,16.156835556030273,16.23019096709036,16.1173607500785,16.14813217471803,223725600 +2013-11-25,16.279300689697266,16.345506474047585,16.19413438410107,16.194755224141865,229311600 +2013-11-26,16.579557418823242,16.664725371933717,16.287380842458397,16.2911092021568,401382800 +2013-11-27,16.969959259033203,16.97120259903606,16.579558798135228,16.67001053834328,363448400 +2013-11-29,17.284198760986328,17.3544449467699,17.027454986044447,17.079363160760334,318127600 +2013-12-02,17.133764266967773,17.540947277226973,17.12102044852454,17.344194141262008,472544800 +2013-12-03,17.602811813354492,17.604677654146645,17.33425689933827,17.353527847519842,450968000 +2013-12-04,17.561779022216797,17.69201600626086,17.43185245823004,17.577319945085925,377809600 +2013-12-05,17.651914596557617,17.876954145804795,17.60560225877051,17.799558309502917,447580000 +2013-12-06,17.4069766998291,17.616164850846662,17.392991204440996,17.586324700686827,344352400 +2013-12-09,17.606229782104492,17.70413993459307,17.434341705068537,17.434341705068537,320493600 +2013-12-10,17.578872680664062,17.6512968298131,17.44366234358352,17.51764025292883,278269600 +2013-12-11,17.448633193969727,17.747340228730724,17.396726654880112,17.623940810895018,359718800 +2013-12-12,17.42315101623535,17.572348540389108,17.40729967154428,17.472884630953597,262290000 +2013-12-13,17.23322868347168,17.495878839748766,17.209606885605233,17.49494591983303,332822000 +2013-12-16,17.328651428222656,17.488418107461722,17.25125725827967,17.25156767823933,282592800 +2013-12-17,17.250638961791992,17.388956817521894,17.200594936100842,17.276126604690518,229902400 +2013-12-18,17.119464874267578,17.140601651494855,16.74740414307453,17.086206778630377,565863200 +2013-12-19,16.92333984375,17.095538335071204,16.90064929698742,17.07999741043946,320308800 +2013-12-20,17.06507682800293,17.14558186964698,16.934529412904823,16.953489938002424,436413600 +2013-12-23,17.719985961914062,17.73956732070063,17.492149316032823,17.65502186593981,501306400 +2013-12-24,17.644765853881836,17.775623641822154,17.5937889185798,17.713768727522623,167554800 +2013-12-26,17.527591705322266,17.701656054295402,17.511428278917496,17.65813913705179,204008000 +2013-12-27,17.409162521362305,17.543439950836596,17.390824497337054,17.525101926811345,225884400 +2013-12-30,17.236026763916016,17.409158118129405,17.167644726201566,17.327411420861644,253629600 +2013-12-31,17.438066482543945,17.446147362795365,17.219864455755108,17.225149895919554,223084400 +2014-01-02,17.19282341003418,17.314046576309632,17.158321968248117,17.27208509413738,234684800 +2014-01-03,16.815166473388672,17.210538608309623,16.798070134473118,17.184430129965723,392467600 +2014-01-06,16.906856536865234,16.99606325352717,16.585771120866898,16.705440489559262,412610800 +2014-01-07,16.78594970703125,16.96995904513515,16.72005434771026,16.918983765660418,317209200 +2014-01-08,16.892248153686523,16.95752099511459,16.743983635871896,16.747711994811073,258529600 +2014-01-09,16.67653465270996,16.997930515523336,16.640167379180863,16.996064675855326,279148800 +2014-01-10,16.565263748168945,16.809574286045233,16.508382179350402,16.779423701370888,304976000 +2014-01-13,16.65199089050293,16.862420891478337,16.470156063248997,16.47108898369666,378492800 +2014-01-14,16.983327865600586,16.993895427047647,16.71197426844296,16.729381030826545,332561600 +2014-01-15,17.32430076599121,17.41257623552507,17.147128986997103,17.204943460142488,391638800 +2014-01-16,17.227636337280273,17.308451778674826,17.14775215590179,17.24784019762891,229278000 +2014-01-17,16.805532455444336,17.159876081071904,16.78159857371334,17.141538059745624,426739600 +2014-01-21,17.066631317138672,17.097713163799074,16.797764379524274,16.815481563320816,328526800 +2014-01-22,17.142465591430664,17.322122367952755,17.027459159262843,17.12381549594409,379985200 +2014-01-23,17.287622451782227,17.297569170247023,16.934211826328564,17.093666421717916,403239200 +2014-01-24,16.973379135131836,17.27021868064303,16.93234891437006,17.219864239708137,429354800 +2014-01-27,17.111068725585938,17.244725243137108,16.96342671247651,17.097704069830503,554878800 +2014-01-28,15.743432998657227,16.007635272593262,15.605734341817682,15.813679217044937,1065523200 +2014-01-29,15.564709663391113,15.77047832997107,15.498503868404075,15.664175225907183,502810000 +2014-01-30,15.534555435180664,15.74343323350234,15.43882157594988,15.620344234491355,678501600 +2014-01-31,15.56004524230957,15.588952486103745,15.340911933547567,15.391576800197505,464797200 +2014-02-03,15.58895206451416,15.781666464596796,15.519638757291066,15.622522248012485,401464000 +2014-02-04,15.814613342285156,15.83543970558043,15.627184372628994,15.723230327825975,376681200 +2014-02-05,15.932724952697754,16.0163374846827,15.735659731588317,15.745296030664587,328344800 +2014-02-06,16.025598526000977,16.056555814257774,15.87863406865241,15.948990175651392,257765200 +2014-02-07,16.249792098999023,16.35141607878941,16.17787461787746,16.302949514571903,370280400 +2014-02-10,16.54090690612793,16.634713921975084,16.197262352738903,16.217899428643044,345559200 +2014-02-11,16.758840560913086,16.814810116187243,16.55684183358665,16.591551441128523,282256800 +2014-02-12,16.757600784301758,16.87142032821387,16.673801692000726,16.789808852957425,308100800 +2014-02-13,17.02370262145996,17.03683500535471,16.70382119569811,16.71820436234174,307398000 +2014-02-14,17.009929656982422,17.07215646982075,16.923004495597844,16.962401617903666,272924400 +2014-02-18,17.072471618652344,17.235068272289134,17.060588354432646,17.07278389667498,260251600 +2014-02-19,16.80293846130371,17.100617984023454,16.70850689777918,17.033701962555117,313768000 +2014-02-20,16.608442306518555,16.79136542934987,16.541214021807694,16.665976612573086,305858000 +2014-02-21,16.42396354675293,16.71538922493845,16.403638746140967,16.659730231889657,278784800 +2014-02-24,16.495880126953125,16.569988577482757,16.33547268804028,16.35829905268694,288909600 +2014-02-25,16.324216842651367,16.559045027486743,16.29107193675102,16.55310506223646,231952000 +2014-02-26,16.17693519592285,16.416141882494525,16.1222147229812,16.37267845020533,276217200 +2014-02-27,16.4996337890625,16.5343417525267,16.136288971388286,16.170372378543036,301882000 +2014-02-28,16.454914093017578,16.658474293913976,16.326085202574387,16.543716285057315,371968800 +2014-03-03,16.5024471282959,16.592814077753967,16.3476657141624,16.366739730067895,238781200 +2014-03-04,16.611257553100586,16.655034929837967,16.502755120289805,16.60375452988178,259140000 +2014-03-05,16.646286010742188,16.721017353789005,16.5452865613709,16.60125950401449,200062800 +2014-03-06,16.5959415435791,16.711324152731834,16.51307928251217,16.659729787195275,185488800 +2014-03-07,16.586244583129883,16.63439886548763,16.44897415158288,16.60656937750414,220729600 +2014-03-10,16.601255416870117,16.676612967675265,16.520580788509598,16.521207014666402,178584000 +2014-03-11,16.76291275024414,16.845774991053453,16.653471802769754,16.742901903174047,279224400 +2014-03-12,16.779176712036133,16.80231535508547,16.635027775256493,16.713513130674777,199326400 +2014-03-13,16.59281349182129,16.874545146676073,16.546222262179253,16.80512922431908,257742800 +2014-03-14,16.406457901000977,16.600324245290654,16.353612739706083,16.534658976450782,237199200 +2014-03-17,16.470550537109375,16.571548287838528,16.442721047759154,16.50056931302054,199544800 +2014-03-18,16.61626625061035,16.634089485342628,16.422399955609954,16.444287816346012,209647200 +2014-03-19,16.61189079284668,16.76760906671766,16.541222404101912,16.643160360861373,224756000 +2014-03-20,16.53183364868164,16.655971680800256,16.489621006580208,16.569043162539707,208398400 +2014-03-21,16.6622314453125,16.68974866307695,16.45773433079623,16.63283888857794,374046400 +2014-03-24,16.859851837158203,16.90081371588265,16.730710617891305,16.835774688988725,355700800 +2014-03-25,17.041208267211914,17.064973134360503,16.872355972081884,16.932081253057877,282293200 +2014-03-26,16.878299713134766,17.166599266329765,16.849533382406044,17.08905241273348,299768000 +2014-03-27,16.805757522583008,16.93208491056648,16.732589236514695,16.885805948754058,222031600 +2014-03-28,16.7869930267334,16.852032049211964,16.705381552998578,16.832645754710367,200564000 +2014-03-31,16.783239364624023,16.910503543705612,16.757909770110125,16.861098476874545,168669200 +2014-04-01,16.936767578125,16.943647715581058,16.784175480992793,16.815131089736223,200760000 +2014-04-02,16.964916229248047,16.993996511355697,16.893311002620397,16.959600819925168,180420800 +2014-04-03,16.847339630126953,16.963346766631524,16.811380891278088,16.928638810088785,162344000 +2014-04-04,16.629398345947266,16.885177540841322,16.59062575559131,16.879237575990942,275251200 +2014-04-07,16.368305206298828,16.60063350085774,16.318901794477497,16.510578816254952,289850400 +2014-04-08,16.36736297607422,16.45116371954163,16.219147779660165,16.42208344879233,243888400 +2014-04-09,16.582494735717773,16.58781014367474,16.322963220724407,16.34234951383544,206169600 +2014-04-10,16.368610382080078,16.64252496725975,16.35891640385108,16.5937444680268,239652000 +2014-04-11,16.247604370117188,16.348289844953957,16.17036981202254,16.228528686720104,271717600 +2014-04-14,16.31233024597168,16.327337963529718,16.172558247319152,16.3192087136051,205674000 +2014-04-15,16.196008682250977,16.31107730975395,15.988696115961693,16.268240104971984,266490000 +2014-04-16,16.228843688964844,16.29388270581914,16.076563849492572,16.198824910446014,214765600 +2014-04-17,16.414268493652344,16.50244782990649,16.234785369622735,16.25980102103337,284334400 +2014-04-21,16.60907554626465,16.639404937255925,16.383625737280102,16.426776902527024,182548800 +2014-04-22,16.62564468383789,16.6297093090419,16.4630463161863,16.51964213080794,202563200 +2014-04-23,16.4083251953125,16.607820799940274,16.3989434929712,16.543094067517913,394940000 +2014-04-24,17.753511428833008,17.82324129345122,17.533378741702123,17.767270034891762,759911600 +2014-04-25,17.88389778137207,17.885459171421942,17.63437262197948,17.652194177714495,390275200 +2014-04-28,18.576513290405273,18.62841993892803,17.902980982217965,17.910799626762685,669485600 +2014-04-29,18.521474838256836,18.635606650658254,18.43329717946348,18.565564502621783,337377600 +2014-04-30,18.451433181762695,18.74348505006318,18.44236542614269,18.531169313501934,456640800 +2014-05-01,18.49489974975586,18.59871136533187,18.33480291736992,18.51115825356424,244048000 +2014-05-02,18.529287338256836,18.579944850780578,18.439546640530992,18.521784315221755,191514400 +2014-05-05,18.79132843017578,18.7925808828119,18.448622320259126,18.453000894675007,287067200 +2014-05-06,18.586519241333008,18.899206570099263,18.586519241333008,18.81759508544474,374564400 +2014-05-07,18.521474838256836,18.676568523895423,18.377638194792482,18.61278028817797,282864400 +2014-05-08,18.48845672607422,18.690324339112642,18.438461695832814,18.496631380353918,230297200 +2014-05-09,18.41142463684082,18.433748769608062,18.247602378962014,18.379980422453386,291597600 +2014-05-12,18.640642166137695,18.666739597160905,18.469903069600495,18.472734307532747,213208800 +2014-05-13,18.669883728027344,18.694409369319512,18.573668654869106,18.614543604180483,159737200 +2014-05-14,18.67334747314453,18.784343448875013,18.60637339677219,18.628069484497054,166404000 +2014-05-15,18.514562606811523,18.75919277420791,18.49003695351811,18.699451271875397,230846000 +2014-05-16,18.78780174255371,18.788429787165295,18.40702030966649,18.50858217626709,276256400 +2014-05-19,19.010419845581055,19.096574459507604,18.782139085971092,18.798490074681798,317755200 +2014-05-20,19.014190673828125,19.067329281136566,18.88904525697013,19.007901832835515,234836000 +2014-05-21,19.064504623413086,19.076766607053397,18.930870496309243,18.986524654321727,196859600 +2014-05-22,19.094682693481445,19.17580789506427,18.995008351416654,19.073616337574666,200760000 +2014-05-23,19.310392379760742,19.329258907478913,19.06953558664843,19.094061233050194,232209600 +2014-05-27,19.6719913482666,19.679222257070705,19.357555967418175,19.365416600049855,348866000 +2014-05-28,19.62105369567871,19.804054809016414,19.613821107195403,19.684254461909912,315481600 +2014-05-29,19.978561401367188,20.025412847066352,19.73927645859095,19.74179199499444,376474000 +2014-05-30,19.903736114501953,20.25495923461973,19.774817331818646,20.06032413143091,564020800 +2014-06-02,19.766948699951172,19.961269702144573,19.573571443788925,19.933914501348408,369350800 +2014-06-03,20.04648208618164,20.084215137657168,19.754372516211927,19.76097538040426,292709200 +2014-06-04,20.275390625,20.371923087629806,20.00151786057871,20.043338238926673,335482000 +2014-06-05,20.354942321777344,20.418458784453733,20.205900968975413,20.318782740802018,303805600 +2014-06-06,20.29897689819336,20.47789238772147,20.264390779572686,20.43512825406474,349938400 +2014-06-09,20.62378692626953,20.66340579565604,20.19458390730212,20.403682469514195,301660000 +2014-06-10,20.744848251342773,20.920932515632714,20.595177130475523,20.85049914576954,251108000 +2014-06-11,20.65900421142578,20.85709855611484,20.573163608604478,20.718431675200637,182724000 +2014-06-12,20.313446044921875,20.71623771345011,20.227605417761982,20.69862894909316,218996000 +2014-06-13,20.091129302978516,20.3464512122581,20.00308720739027,20.293624947347173,218100000 +2014-06-16,20.29362678527832,20.414684887583928,20.128548470823464,20.141755877879,142244000 +2014-06-17,20.26722526550293,20.403688997623675,20.205596266575586,20.3178483663657,118904000 +2014-06-18,20.28922462463379,20.313436244126965,20.106537560917427,20.309033215529993,134056000 +2014-06-19,20.21879768371582,20.315644192359667,20.1043424136342,20.313442677363962,142112000 +2014-06-20,20.00969696044922,20.370668135020455,20.007495445688832,20.216594007804506,403592000 +2014-06-23,19.99209213256836,20.1659748890326,19.94146735870598,20.09994286734499,174776000 +2014-06-24,19.87102699279785,20.1923792481068,19.851218400821136,19.974476340045534,156144000 +2014-06-25,19.88863754272461,19.96347224706818,19.732363590186306,19.855621540523305,147476000 +2014-06-26,20.00749969482422,20.04051570618689,19.76538507693811,19.89084457670499,130516000 +2014-06-27,20.245210647583008,20.24961199827173,19.97888275115785,19.989888646775515,256116000 +2014-06-30,20.454301834106445,20.63038602473513,20.269413266019992,20.27161478020026,197929200 +2014-07-01,20.584169387817383,20.70522751856571,20.498328778473606,20.584169387817383,152892000 +2014-07-02,20.575366973876953,20.70302629259042,20.489524684071327,20.661207584418708,113860000 +2014-07-03,20.696428298950195,20.71183554859058,20.513741139453998,20.617190535295563,91567200 +2014-07-07,21.123428344726562,21.127829695685982,20.711832340564523,20.72063672174737,225872000 +2014-07-08,20.98695945739746,21.306111924842565,20.67221001944193,21.189455153061004,260888000 +2014-07-09,20.995765686035156,21.119023654377926,20.85710047164954,21.006771581464562,145744000 +2014-07-10,20.918731689453125,21.03098545361644,20.5841719121369,20.636998200722022,158744000 +2014-07-11,20.958341598510742,21.105811146033492,20.879103878801704,20.989156080701665,136072000 +2014-07-14,21.22907829284668,21.32592480993542,21.052995700906497,21.099217444263196,171240000 +2014-07-15,20.980356216430664,21.317115758007702,20.916525724085574,21.30611154300843,181911600 +2014-07-16,20.86150550842285,21.37214791226815,20.852701126376395,21.343534930065292,213585200 +2014-07-17,20.489526748657227,20.97155613278079,20.375073149490156,20.916530008721534,229192000 +2014-07-18,20.78446388244629,20.852695726557435,20.474115792914162,20.606179810148785,199952000 +2014-07-21,20.676618576049805,20.90992882345221,20.6281953143027,20.90772730811893,156316000 +2014-07-22,20.84829330444336,20.885710657079706,20.716230973262128,20.839488925129455,220788000 +2014-07-23,21.39195442199707,21.543825367559272,20.94734244295349,21.002368561599013,371672000 +2014-07-24,21.356740951538086,21.420571462787642,21.22247706223112,21.358942466895435,182916000 +2014-07-25,21.497600555419922,21.53501790772516,21.27089324769997,21.317114979241197,173876000 +2014-07-28,21.794742584228516,21.84316583343064,21.471190443154192,21.53061790764351,221272000 +2014-07-29,21.65387725830078,21.88718913952329,21.625264281598028,21.862977513365635,172572000 +2014-07-30,21.603246688842773,21.7243030984437,21.497595840446454,21.667077164856323,132040000 +2014-07-31,21.041982650756836,21.449175500314468,20.982555195005318,21.385346694947966,227372000 +2014-08-01,21.158632278442383,21.26648462776622,20.86809458002953,20.88790484635428,194044000 +2014-08-04,21.039779663085938,21.257684237198365,20.94733621427281,21.2114625127918,159832000 +2014-08-05,20.936328887939453,21.059586801360645,20.769049091679886,20.989153468082375,223732000 +2014-08-06,20.901121139526367,21.01557640907738,20.846095019736357,20.854899400414425,154232000 +2014-08-07,20.898906707763672,21.22406820050524,20.81484990937015,20.99844569914752,186844000 +2014-08-08,20.956417083740234,20.974113429284337,20.63346637183412,20.850242385708405,167460000 +2014-08-11,21.232919692993164,21.252828506952394,20.978540168154957,21.073655931786053,146340000 +2014-08-12,21.228490829467773,21.429781255534497,21.14885896994663,21.243974708395985,135180000 +2014-08-13,21.509418487548828,21.509418487548828,21.24398001458955,21.268312071499427,127664000 +2014-08-14,21.566932678222656,21.5824165623844,21.412093836605216,21.529329200632247,112464000 +2014-08-15,21.67310333251953,21.71955497266625,21.425359564120686,21.655406987430396,195804000 +2014-08-18,21.934120178222656,21.980571821889747,21.67310497503388,21.78591538638976,190288000 +2014-08-19,22.237163543701172,22.270343773515926,21.969512615064254,21.98942142799974,277596000 +2014-08-20,22.24601173400879,22.36103461815319,22.1088675715604,22.217256434876838,210796000 +2014-08-21,22.24822235107422,22.32785422102663,22.1442584271021,22.246009885904304,133912000 +2014-08-22,22.411909103393555,22.445089330135502,22.161954545488225,22.184074134110713,176736000 +2014-08-25,22.460575103759766,22.599930042680125,22.4030628184014,22.515874923784498,161080000 +2014-08-26,22.316795349121094,22.45172704568577,22.310159640702597,22.43403069815873,132608000 +2014-08-27,22.591079711914062,22.688407925901778,22.274764704070407,22.34554839943881,209476000 +2014-08-28,22.617631912231445,22.734867289288353,22.46500383166159,22.471639541666022,273840000 +2014-08-29,22.67292022705078,22.761400253264938,22.60655978548613,22.75255208188191,178380000 +2014-09-02,22.84988784790039,22.947214390118287,22.721591851776015,22.796798802017875,214256000 +2014-09-03,21.885456085205078,22.827763750477132,21.805824213827655,22.80564416123151,501684000 +2014-09-04,21.70407485961914,22.139836041660292,21.63107868916936,21.86554939563837,342872000 +2014-09-05,21.892099380493164,21.985002700092725,21.74610700316494,21.854495896981494,233828000 +2014-09-08,21.75716209411621,21.96730074258675,21.688590854900553,21.965089964791602,185426800 +2014-09-09,21.675325393676758,22.801231043755394,21.266106904253704,21.91643358008728,759385200 +2014-09-10,22.341123580932617,22.365455632713232,21.62443850492833,21.679738315772223,403478400 +2014-09-11,22.436241149902344,22.438453615048807,22.035871026830662,22.210618645839695,249412400 +2014-09-12,22.48712158203125,22.604356940668357,22.358825583379925,22.387580884753476,250504400 +2014-09-15,22.48048210144043,22.794586359988433,22.43845538603921,22.741497317981786,245266000 +2014-09-16,22.31015968322754,22.39863973341482,21.87439682833887,22.075688984705348,267632400 +2014-09-17,22.469417572021484,22.51808167130507,22.25042912524536,22.40084466502364,243706000 +2014-09-18,22.515872955322266,22.639744001310874,22.46499638279613,22.546840716819418,149197600 +2014-09-19,22.332275390625,22.63974220365911,22.230523941268473,22.626470789104523,283609600 +2014-09-22,22.35439109802246,22.593286644244685,22.248216424778807,22.518079724665096,211153600 +2014-09-23,22.703893661499023,22.770254119660926,22.239375517215365,22.25264693380112,253608800 +2014-09-24,22.507022857666016,22.75034168617158,22.38536259960509,22.59771535687803,240687200 +2014-09-25,21.648767471313477,22.276972422912124,21.615587252012748,22.23273325558852,400368000 +2014-09-26,22.285825729370117,22.285825729370117,21.766007799260457,21.794763095885465,249482000 +2014-09-29,22.144258499145508,22.217254661442112,21.816882845207576,21.821307775561802,199065200 +2014-09-30,22.285825729370117,22.460573349513894,22.23716162153053,22.299097145102206,221056400 +2014-10-01,21.938541412353516,22.27255274827308,21.832365031109777,22.2504314734524,205965200 +2014-10-02,22.097808837890625,22.16859254135811,21.686378034105687,21.95845220871458,191031200 +2014-10-03,22.035873413085938,22.1663801813804,21.907577422560905,21.99605747422012,173878400 +2014-10-06,22.035873413085938,22.2637084069672,21.99163254344802,22.10886789465942,148204800 +2014-10-07,21.843435287475586,22.14647899723385,21.839012043133433,21.993850909364912,168376800 +2014-10-08,22.296884536743164,22.36545576255045,21.7460972024568,21.845637875123444,229618800 +2014-10-09,22.34554672241211,22.646377827054653,22.25485591059785,22.46057127351347,309506000 +2014-10-10,22.281402587890625,22.568960618296444,22.186286836940162,22.272554414823553,265326400 +2014-10-13,22.07790184020996,22.513664736108684,22.07790184020996,22.414125725040652,214333600 +2014-10-14,21.843435287475586,22.234957385013512,21.80361933792791,22.206202077746827,254754400 +2014-10-15,21.575773239135742,21.931904136795858,21.05374291788052,21.67088897616825,403734400 +2014-10-16,21.29264259338379,21.615593330994912,21.104623547957548,21.135591311316386,288618000 +2014-10-17,21.604536056518555,21.898731541856375,21.414304516196115,21.566932579100975,272718800 +2014-10-20,22.066843032836914,22.111082218576705,21.726195902266884,21.74831549513678,310069200 +2014-10-21,22.66628646850586,22.78794503834234,22.400846367049738,22.78794503834234,378495600 +2014-10-22,22.78131103515625,23.02905481085634,22.695043459824763,22.748130809040354,273052400 +2014-10-23,23.188322067260742,23.2369861812715,22.92288190564296,23.022422599105877,284298800 +2014-10-24,23.274587631225586,23.334310692015187,23.121959593761645,23.26573945784629,188215600 +2014-10-27,23.25025749206543,23.332101836855173,23.15956497316734,23.192745204169487,136750800 +2014-10-28,23.610807418823242,23.610807418823242,23.30334059703112,23.314401234552527,192243600 +2014-10-29,23.743534088134766,23.750171485302026,23.52675970061006,23.590907705625256,210751600 +2014-10-30,23.663894653320312,23.745737289332908,23.42499907701152,23.65946972360188,162619200 +2014-10-31,23.889522552490234,23.898370726319964,23.714774916490434,23.89173501785182,178557200 +2014-11-03,24.199199676513672,24.398279350463756,23.89173283637494,23.938184479027218,209130400 +2014-11-04,24.022235870361328,24.2191030486579,23.82758115688162,24.190347756503364,166297600 +2014-11-05,24.079750061035156,24.177078269338512,23.91827386886062,24.132837407556842,149743600 +2014-11-06,24.14862060546875,24.168615745486935,23.948679374892755,24.126405101508563,139874000 +2014-11-07,24.217493057250977,24.286361634224555,24.115300373861828,24.15973138579295,134766000 +2014-11-10,24.177501678466797,24.288580890410575,24.14195551707634,24.219710626450134,108782000 +2014-11-11,24.370773315429688,24.38188191226989,24.081968441857452,24.148614938096934,109769200 +2014-11-12,24.715129852294922,24.755118444797144,24.297472537776425,24.299692902129323,187769600 +2014-11-13,25.06390953063965,25.203868706379158,24.7928760232324,24.837308718261298,238091600 +2014-11-14,25.36604881286621,25.36827087167841,24.706238025186497,25.137225908303186,176254400 +2014-11-17,25.32383918762207,26.05474063225158,25.17055102210635,25.386043277388953,186986800 +2014-11-18,25.652629852294922,25.70150496983271,25.301619185372655,25.31272778297089,176896000 +2014-11-19,25.47490692138672,25.71261637518299,25.281630170830226,25.6459698627248,167476800 +2014-11-20,25.839248657226562,25.961436482133397,25.514897525123693,25.528228184617273,173582000 +2014-11-21,25.874794006347656,26.119167953517504,25.777043749505957,26.10583898937887,228717200 +2014-11-24,26.354650497436523,26.385752537978234,25.90811333183019,25.95920881489125,189803200 +2014-11-25,26.125825881958008,26.60346675134473,26.092501785036337,26.452398980909255,275361600 +2014-11-26,26.436851501464844,26.459067004075873,26.17692656155398,26.201364122906373,163073200 +2014-11-28,26.421300888061523,26.52571561637304,26.225802089158286,26.496833937092017,99257600 +2014-12-01,25.56377410888672,26.492396546185617,24.71957127682061,26.39464628070114,335256000 +2014-12-02,25.466014862060547,25.714832861479596,25.048357711722026,25.21497649916142,237395600 +2014-12-03,25.754823684692383,25.848129807012796,25.57265386233315,25.71483510442162,172253600 +2014-12-04,25.657072067260742,26.03696271196417,25.612641067094522,25.719276145467056,168178000 +2014-12-05,25.548215866088867,25.788147343615442,25.46823870691334,25.768152206354525,153275600 +2014-12-08,24.970609664916992,25.470466168327516,24.79732634825752,25.348278345075617,230659600 +2014-12-09,25.35272216796875,25.392710755573372,24.29302544391353,24.479639417713226,240832000 +2014-12-10,24.870635986328125,25.514895783345143,24.779551909834545,25.417147225026955,178261200 +2014-12-11,24.79731559753418,25.2816208675573,24.735109835889318,24.93949680571219,165606800 +2014-12-12,24.377443313598633,24.852862180055762,24.34411921278573,24.539618005322346,224112400 +2014-12-15,24.044212341308594,24.792885312514212,23.626553326220474,24.5929423473055,268872400 +2014-12-16,23.715410232543945,24.47297122309571,23.60655308638596,23.630990647044673,243162800 +2014-12-17,24.306358337402344,24.401884849697097,23.730967034806778,23.79761525191917,213647200 +2014-12-18,25.026142120361328,25.026142120361328,24.584047413895913,24.85285885325096,236024800 +2014-12-19,24.832870483398438,25.157221606734687,24.8062125550007,24.939507281792608,353719200 +2014-12-22,25.090574264526367,25.212760387172455,24.875080310757774,24.917290955909994,180670000 +2014-12-23,25.001708984375,25.17721434093022,24.983935903852743,25.154998837744525,104113600 +2014-12-24,24.883960723876953,25.039470912562667,24.883960723876953,25.01059093321644,57918400 +2014-12-26,25.32383918762207,25.441582885385714,24.883966441450937,24.903959886761296,134884000 +2014-12-29,25.306074142456055,25.497128882500185,25.25941936850573,25.279414513760834,110395600 +2014-12-30,24.997264862060547,25.308286991404348,24.906180790536105,25.246082904522435,119526000 +2014-12-31,24.521848678588867,25.13278440556934,24.484082149523427,25.063915829634194,165613600 +2015-01-02,24.288585662841797,24.757340164944214,23.848711151343018,24.746231563593415,212818400 +2015-01-05,23.60433578491211,24.137516414569966,23.417723496745833,24.057539235374563,257142000 +2015-01-06,23.606555938720703,23.866480902659614,23.244436602442416,23.66876002975555,263188400 +2015-01-07,23.937570571899414,24.037541186337343,23.704303544965192,23.81538275875591,160423600 +2015-01-08,24.8573055267334,24.915067190627752,24.148619623170898,24.266365009745527,237458000 +2015-01-09,24.883960723876953,25.15943664166333,24.484074960208066,25.030584373932918,214798000 +2015-01-12,24.270809173583984,25.02170407834321,24.170838555190564,25.015039596441564,198603200 +2015-01-13,24.486295700073242,25.059464698823614,24.19526877908936,24.755107123145972,268367600 +2015-01-14,24.392993927001953,24.54628207628489,24.10418731802887,24.22415306198996,195826400 +2015-01-15,23.730960845947266,24.450753606345422,23.695416382375743,24.437424644372864,240056000 +2015-01-16,23.54656982421875,23.89980258382863,23.371064473774545,23.777614778160455,314053200 +2015-01-20,24.153066635131836,24.20860624689587,23.659874611477722,23.9575661169644,199599600 +2015-01-21,24.337453842163086,24.672911811933083,24.05308966122845,24.204157443782993,194303600 +2015-01-22,24.970609664916992,24.98616068833683,24.375224961946195,24.49519072615685,215185600 +2015-01-23,25.09946060180664,25.270521850097733,24.77732985576787,24.9483927989933,185859200 +2015-01-26,25.126115798950195,25.406035869763418,25.05946929299839,25.268297045568367,222460000 +2015-01-27,24.246366500854492,24.98837640334662,24.2219289424083,24.97504574741797,382274800 +2015-01-28,25.617082595825195,26.24134880447562,25.617082595825195,26.13248997647666,585908400 +2015-01-29,26.414640426635742,26.47906658146117,25.672630311520884,25.841471210548402,337745600 +2015-01-30,26.0280818939209,26.659011007530673,25.959211629596137,26.30355786641712,334982000 +2015-02-02,26.354650497436523,26.47461623735488,25.788147591911834,26.225799913021184,250956400 +2015-02-03,26.359100341796875,26.45684890690884,26.1280553511909,26.325776235423373,207662800 +2015-02-04,26.561260223388672,26.772311739909934,26.283562197650888,26.325772839941987,280598800 +2015-02-05,26.75084114074707,26.81552154981854,26.596946315658972,26.768682662651635,168984800 +2015-02-06,26.525577545166016,26.819983953766112,26.418519895846156,26.768685106844938,174826400 +2015-02-09,26.701772689819336,26.728535823049864,26.414057096227165,26.44082193108112,155559200 +2015-02-10,27.214754104614258,27.243749769386245,26.79991020192898,26.802139328739504,248034000 +2015-02-11,27.85263442993164,27.861556041891518,27.321811280495048,27.382030034194866,294247200 +2015-02-12,28.205034255981445,28.432531137637998,28.006533042518136,28.11581982595189,297898000 +2015-02-13,28.34331703186035,28.387923396573573,28.024376589451972,28.387923396573573,217088800 +2015-02-17,28.510589599609375,28.744777236769618,28.307626753854027,28.434756747894973,252609600 +2015-02-18,28.709091186523438,28.722472753990044,28.425835529907648,28.465981933931005,179566800 +2015-02-19,28.648868560791016,28.77822937525331,28.622105427883923,28.65555934401779,149449600 +2015-02-20,28.883052825927734,28.883052825927734,28.55965252898941,28.686780798766748,195793600 +2015-02-23,29.66368865966797,29.66368865966797,28.91875173115956,28.99904455839835,283896400 +2015-02-24,29.478565216064453,29.797507356812893,29.255529991547135,29.650303291852076,276912400 +2015-02-25,28.724700927734375,29.351432677017822,28.581958540748293,29.34250936350478,298846800 +2015-02-26,29.08824920654297,29.18861436185984,28.238485673214807,28.724700756115052,365150000 +2015-02-27,28.651103973388672,29.121708392752836,28.602035955957554,28.994576692159352,248059200 +2015-03-02,28.791608810424805,29.057021202929167,28.615412526417927,28.8272952538238,192386800 +2015-03-03,28.851829528808594,28.887515972542232,28.568573911948544,28.762616822721085,151265200 +2015-03-04,28.6689395904541,28.896436419430074,28.61987498346581,28.793842145845474,126665200 +2015-03-05,28.193878173828125,28.71577968293683,28.04890496520124,28.67786411038587,226068400 +2015-03-06,28.236257553100586,28.854064342812634,28.160426397654298,28.637719914497385,291368400 +2015-03-09,28.3566951751709,28.898672480540206,27.892781551054448,28.539583970998255,354114000 +2015-03-10,27.77011489868164,28.374540122839832,27.611760101352253,28.19388214449373,275426400 +2015-03-11,27.263822555541992,27.8281013430904,27.234828591930793,27.823641387774657,275756000 +2015-03-12,27.756731033325195,27.85709789818275,27.127771813054192,27.279435822987377,193450800 +2015-03-13,27.564918518066406,27.96861337203962,27.33965419967843,27.74557818039915,207309200 +2015-03-16,27.868244171142578,27.868244171142578,27.404332304778652,27.62959660422218,143497200 +2015-03-17,28.334396362304688,28.396845955632656,28.024377522838144,28.080136331398656,204092400 +2015-03-18,28.653329849243164,28.80722466797545,28.184956311528882,28.325467862356152,261083600 +2015-03-19,28.436988830566406,28.827300441966337,28.414685650239697,28.715782838709213,183238000 +2015-03-20,28.08013343811035,28.63771976463974,27.915087858231676,28.604265844249458,274780400 +2015-03-23,28.372310638427734,28.515053045645676,28.218415789361256,28.35223828504883,150838800 +2015-03-24,28.25632667541504,28.557422117693964,28.227331013820923,28.37676587330061,131369200 +2015-03-25,27.51808738708496,28.285329159671242,27.51808738708496,28.222879564530285,206620800 +2015-03-26,27.70988655090332,27.85262891072895,27.344109041147252,27.379795481915234,190291600 +2015-03-27,27.489089965820312,27.812490343592277,27.41325881028015,27.783496378525207,158184800 +2015-03-30,28.184953689575195,28.191644472093586,27.656359749520163,27.66751218813297,188398800 +2015-03-31,27.752269744873047,28.21172170806247,27.7366573490838,28.12250728857098,168362400 +2015-04-01,27.712125778198242,27.906167030034535,27.455634937713125,27.839255784125836,162485600 +2015-04-02,27.95077133178711,28.00429930359269,27.69874216714662,27.886090919277912,128880400 +2015-04-06,28.403535842895508,28.439222296026028,27.729970205482548,27.76119500115988,148776000 +2015-04-07,28.10466766357422,28.575270397460066,28.097976879444715,28.46821444814077,140049200 +2015-04-08,28.01321792602539,28.19164674849862,27.872706376923492,28.068976720345354,149316800 +2015-04-09,28.227333068847656,28.23179472555157,27.803567569642333,28.068978288327784,129936000 +2015-04-10,28.347776412963867,28.372310423545866,27.937392420726322,28.09128556700355,160752000 +2015-04-13,28.292016983032227,28.67563953079171,28.23848900731811,28.631029764719884,145460400 +2015-04-14,28.16935157775879,28.390155989571237,28.08236797002589,28.325475565580955,102098400 +2015-04-15,28.27640151977539,28.354463497065556,28.104665169737025,28.19387958733585,115881600 +2015-04-16,28.14034652709961,28.34776929984874,28.126964961639434,28.164880531525455,113476000 +2015-04-17,27.82364273071289,28.133661539638638,27.758962314959685,28.002071581178537,207828000 +2015-04-20,28.45929718017578,28.57527475991472,27.91732146183797,28.0065359009731,188217200 +2015-04-21,28.305404663085938,28.59311864088921,28.251874977408363,28.57081715762612,129740400 +2015-04-22,28.686784744262695,28.74254354117084,28.17380483368184,28.32323800100604,150618000 +2015-04-23,28.920978546142578,29.08825497257814,28.579734908473842,28.615421362892857,183083600 +2015-04-24,29.057022094726562,29.13508576665192,28.82283448219716,29.10386097853111,178103600 +2015-04-27,29.585620880126953,29.692680237181143,29.25106804663929,29.509789721315794,387816800 +2015-04-28,29.119478225708008,30.007157462025948,28.898675532596673,29.98931763900977,475696000 +2015-04-29,28.691246032714844,29.349199147137707,28.615414886672202,29.030260466474736,253544400 +2015-04-30,27.91286277770996,28.69125534884993,27.78573274917636,28.69125534884993,332781600 +2015-05-01,28.7603816986084,29.02356494334512,27.94630476844285,28.12473186614602,234050400 +2015-05-04,28.704631805419922,29.121709976263308,28.606495765221478,28.88306066003097,203953200 +2015-05-05,28.057825088500977,28.64886692816264,28.053363432188448,28.581955696461204,197085600 +2015-05-06,27.881629943847656,28.26971070308034,27.51362153519884,28.22733347190532,288564000 +2015-05-07,28.054080963134766,28.237733665003038,27.776360909592672,27.944336004303814,175763600 +2015-05-08,28.5826473236084,28.5826473236084,28.244456933474385,28.3721179576171,222201600 +2015-05-11,28.29149055480957,28.569208952019615,28.136952891723745,28.531135000130202,168143200 +2015-05-12,28.190704345703125,28.41690960439626,27.95553850040013,28.13023234720522,192640000 +2015-05-13,28.222061157226562,28.486342089006992,28.190705937246793,28.25341637720633,138776800 +2015-05-14,28.88051986694336,28.88051986694336,28.479620775161266,28.535612478438576,180814000 +2015-05-15,28.840208053588867,29.001464435626257,28.714787182551436,28.907398782348185,152832000 +2015-05-18,29.158235549926758,29.276937669583507,28.748375933627074,28.752856226103322,203531600 +2015-05-19,29.131370544433594,29.312783150651594,29.035063019457528,29.270228901299124,178532800 +2015-05-20,29.129127502441406,29.3351765910795,28.967871099600664,29.11569003844849,145819600 +2015-05-21,29.427003860473633,29.48075713398518,29.077616126305756,29.131369399817306,158921600 +2015-05-22,29.68455696105957,29.78086445822311,29.429234956141883,29.474031048289774,182384000 +2015-05-26,29.030582427978516,29.767435289034083,28.91859900134078,29.69800611131276,282790400 +2015-05-27,29.572574615478516,29.621847584620834,29.12688287295774,29.191831740938717,183332800 +2015-05-28,29.514352798461914,29.552426754903117,29.36205697269711,29.532270557515968,122933200 +2015-05-29,29.17839241027832,29.440433138039047,29.09328393858338,29.391160172053755,203538000 +2015-06-01,29.23662567138672,29.426998825554183,29.12688412242206,29.17839553147613,128451200 +2015-06-02,29.106733322143555,29.26350943361036,28.963394674879204,29.08433527016419,134670400 +2015-06-03,29.142553329467773,29.326207710603256,29.093280369527108,29.263497292035407,123934000 +2015-06-04,28.972347259521484,29.245587046600015,28.871562876492078,29.021620232106947,153800400 +2015-06-05,28.813325881958008,29.046253255036365,28.74837701718272,29.003699018562706,142507200 +2015-06-08,28.62295913696289,28.938753160748476,28.405711056837685,28.869320578651514,210699200 +2015-06-09,28.53785514831543,28.685674087079356,28.134715850173816,28.37659874556621,224301600 +2015-06-10,28.864850997924805,28.967873843270144,28.634163688897942,28.64984130128505,156349200 +2015-06-11,28.799898147583008,29.156004640237033,28.775261655907773,28.932037776812393,141563600 +2015-06-12,28.48186492919922,28.741667304738165,28.468427464509798,28.7103120813085,147544800 +2015-06-15,28.425867080688477,28.49753639145246,28.154867445964324,28.24221436506008,175955600 +2015-06-16,28.57817268371582,28.634164402025895,28.30269438651997,28.450511634318115,125976400 +2015-06-17,28.510974884033203,28.640874331951473,28.385552311630196,28.605040531787125,131672400 +2015-06-18,28.64087677001953,28.737182572460274,28.493059555070516,28.495299701749957,141628800 +2015-06-19,28.354204177856445,28.62744402087368,28.30941148928018,28.60280752953727,218867600 +2015-06-22,28.58040428161621,28.681188660933987,28.46170214770337,28.553527649723613,136157200 +2015-06-23,28.450510025024414,28.580411214251566,28.416914654192354,28.5512961375206,121075600 +2015-06-24,28.6923885345459,29.070892995104312,28.47066186824105,28.490818061209136,221123600 +2015-06-25,28.555768966674805,28.936511869404658,28.555768966674805,28.860363972351166,127752400 +2015-06-26,28.387794494628906,28.665512873567515,28.334042936160746,28.59384355936622,176267200 +2015-06-29,27.890592575073242,28.325088826725857,27.87939525740343,28.098881821524788,196645600 +2015-06-30,28.092164993286133,28.246702682695314,27.96450394382296,28.123520218857326,177482800 +2015-07-01,28.354204177856445,28.43035379891395,28.21758425634783,28.421394919452386,120955200 +2015-07-02,28.318368911743164,28.374360623948455,28.168309824397074,28.316128764810145,108844000 +2015-07-06,28.219820022583008,28.271333144307263,27.96225783142429,27.982415734266397,112241600 +2015-07-07,28.150388717651367,28.25341324455203,27.720371146535417,28.195181395875604,187787200 +2015-07-08,27.45161247253418,27.91522371167966,27.444893741474726,27.879389909785505,243046400 +2015-07-09,26.891695022583008,27.78532212315735,26.701323574312646,27.7382892977304,314380000 +2015-07-10,27.610633850097656,27.73829489020388,27.14702252458227,27.310519081989927,245418000 +2015-07-13,28.143674850463867,28.16607119344643,27.843558386556932,28.002574643083992,165762000 +2015-07-14,28.132474899291992,28.302690176077444,28.004813868885748,28.228780708807676,127072400 +2015-07-15,28.403472900390625,28.477382363314426,28.125754513662404,28.157109732709237,134596800 +2015-07-16,28.78197479248047,28.79541567234173,28.522174169960014,28.60952109301468,144889600 +2015-07-17,29.030582427978516,29.030582427978516,28.737186396981723,28.909641830893467,184658800 +2015-07-20,29.57930564880371,29.780874461326125,29.272468718344847,29.332940729086836,235600800 +2015-07-21,29.283658981323242,29.76966652525816,29.187354898095368,29.75399062640201,307025600 +2015-07-22,28.045127868652344,28.107838310210372,27.321714226436196,27.321714226436196,461802400 +2015-07-23,28.031686782836914,28.463941086110378,28.009288734833575,28.264610761744994,203998000 +2015-07-24,27.883865356445312,28.161583697615026,27.749485624184548,28.06751805590559,168649200 +2015-07-27,27.49639892578125,27.68453189650098,27.35082189584112,27.568068222071908,177822000 +2015-07-28,27.63302993774414,27.751733806155517,27.447138746844526,27.63302993774414,134472400 +2015-07-29,27.545682907104492,27.65990648113944,27.38442649875668,27.581518423951334,148046800 +2015-07-30,27.406822204589844,27.451614888081775,27.259003273350057,27.39562317935119,134513200 +2015-07-31,27.16718101501465,27.46729578958228,27.07983407562666,27.458336910064084,171540000 +2015-08-03,26.526636123657227,27.451618663971853,26.320585308551166,27.211974185991803,279904000 +2015-08-04,25.67555809020996,26.360896065522866,25.364244323075575,26.298185624478727,496554400 +2015-08-05,25.84577751159668,26.302670138017913,25.106686146470523,25.297057646963125,397250400 +2015-08-06,25.902015686035156,26.210239723891853,25.674786517417267,26.091000281327553,211612000 +2015-08-07,25.98975944519043,26.15399604657735,25.760279977058982,25.778278837903052,154681600 +2015-08-10,26.934675216674805,26.995419217814426,26.21698661975205,26.21698661975205,219806400 +2015-08-11,25.53305435180664,26.588214185277398,25.4970583391511,26.504970724033022,388331200 +2015-08-12,25.92676544189453,25.967262021018723,24.664624061734038,25.31706818475009,404870000 +2015-08-13,25.906518936157227,26.187744713326833,25.769280619581185,26.10675155218471,194143200 +2015-08-14,26.088754653930664,26.167497534171147,25.65004309511507,25.719786543832917,171718000 +2015-08-17,26.358728408813477,26.46896842424783,25.9852597819827,26.10674951421202,163538800 +2015-08-18,26.210247039794922,26.42172941067276,26.100006996375427,26.194498462163565,138242800 +2015-08-19,25.875022888183594,26.214742405614185,25.800778867897705,26.120250952413596,193146000 +2015-08-20,25.34406089782715,25.72652717034178,25.114579761145983,25.665783173258816,274006400 +2015-08-21,23.793947219848633,25.175327878474295,23.76919921810895,24.84460614292186,513102000 +2015-08-24,23.20000648498535,24.477896713893095,20.698220905443083,21.343916023355945,648825200 +2015-08-25,23.3394832611084,24.997590638014834,23.285488406283875,24.997590638014834,414406400 +2015-08-26,24.678123474121094,24.72311890919554,23.63421358890838,24.09317251935836,387098400 +2015-08-27,25.40480613708496,25.47679985248312,24.752362125777264,25.249570707409113,338464400 +2015-08-28,25.488056182861328,25.492555040287638,25.094340074117845,25.236077255337733,212657600 +2015-08-31,25.368812561035156,25.76702746189481,25.19782682695612,25.20457597022168,224917200 +2015-09-01,24.234907150268555,25.170825424088193,24.153914008168282,24.781610001212645,307383600 +2015-09-02,25.274322509765625,25.274322509765625,24.552134911744044,24.799614971644914,247555200 +2015-09-03,24.831113815307617,25.3733162642845,24.756869792273626,25.30807167281215,212935600 +2015-09-04,24.583635330200195,24.849112570825763,24.412651268856806,24.516142163817122,199985200 +2015-09-08,25.267568588256836,25.32381373369697,24.819857711163742,25.141580011739933,219374400 +2015-09-09,24.7816162109375,25.652290131988792,24.69612247481686,25.593796405287875,340043200 +2015-09-10,25.326068878173828,25.485804915888515,24.725371021599024,24.808612754279864,251571200 +2015-09-11,25.695032119750977,25.695032119750977,25.14383037924651,25.15057952208659,199662000 +2015-09-14,25.94251251220703,26.297982273193004,25.84127192849879,26.228238836259138,233453600 +2015-09-15,26.160747528076172,26.216992685890737,25.742283416618527,26.08200465042898,173364800 +2015-09-16,26.189992904663086,26.21923976522092,25.971761444405875,26.153995184161953,148694000 +2015-09-17,25.62979507446289,26.20799527265893,25.584799631333023,26.02126263885047,256450400 +2015-09-18,25.5240421295166,25.715276965832878,25.168574173127286,25.245066734481526,297141200 +2015-09-21,25.92001724243164,25.956014965838325,25.5712983083755,25.573546878738973,200888000 +2015-09-22,25.512802124023438,25.688286729362176,25.314818083976963,25.50830155049554,201384800 +2015-09-23,25.719785690307617,25.809778286081457,25.49030620172703,25.5645485055094,143026800 +2015-09-24,25.87276840209961,25.98525869950004,25.28107005570099,25.479052361198093,200878000 +2015-09-25,25.80752944946289,26.252991879520707,25.652292255940818,26.196746718559503,224607600 +2015-09-28,25.296825408935547,25.776033586374936,25.296825408935547,25.614047240066924,208436000 +2015-09-29,24.53638458251953,25.53754931895009,24.266408539249394,25.384562436706126,293461600 +2015-09-30,24.81536102294922,25.094336488096644,24.462141547382192,24.786112446226834,265892000 +2015-10-01,24.653377532958984,24.662376964020137,24.142670548150836,24.53863693251174,255716400 +2015-10-02,24.83336067199707,24.975099563728357,24.196666810262887,24.30015769138034,232079200 +2015-10-05,24.923349380493164,25.056088820595715,24.538632779190944,24.72086650705366,208258800 +2015-10-06,25.042593002319336,25.139334740434297,24.69612263131381,24.889606107543727,192787200 +2015-10-07,24.923349380493164,25.146079683043784,24.615127072030614,25.139330540006746,187062400 +2015-10-08,24.635372161865234,24.790609302839105,24.34514702357151,24.790609302839105,247918400 +2015-10-09,25.22482681274414,25.260822818069613,24.63312670517668,24.74786729780421,211064400 +2015-10-12,25.10783576965332,25.36656381482721,25.071839764562586,25.36206495786556,121868800 +2015-10-13,25.150583267211914,25.29906958120137,24.900854646148584,24.932351795069557,132197200 +2015-10-14,24.79511260986328,25.0898366571712,24.648874871321997,25.038092078535033,177849600 +2015-10-15,25.166330337524414,25.220325201523774,24.85810629411592,24.957098308502896,150694000 +2015-10-16,24.981855392456055,25.19783664342372,24.86711476284416,25.148340618239512,156930400 +2015-10-19,25.137088775634766,25.141587633388927,24.77261950476655,24.927856702510333,119036800 +2015-10-20,25.596044540405273,25.686037132254842,24.93235239388829,25.049341561766585,195871200 +2015-10-21,25.593793869018555,26.003258497677987,25.580293865646503,25.64778873310942,167180800 +2015-10-22,25.985258102416992,25.985258102416992,25.670284933640016,25.722031224500117,166616400 +2015-10-23,26.79068946838379,26.824436900679824,26.171992836664035,26.25523455766646,237467600 +2015-10-26,25.935762405395508,26.576956750149606,25.854769254851234,26.565708750414164,265335200 +2015-10-27,25.77152442932129,26.219235273442884,25.645534145617276,25.962757566441326,279537600 +2015-10-28,26.833436965942383,26.840187826165888,26.111249403954748,26.306983155255754,342205600 +2015-10-29,27.116912841796875,27.15291056355686,26.608456178965124,26.705197910612767,204909200 +2015-10-30,26.885175704956055,27.272142525302016,26.873925990878288,27.22039624359583,197461200 +2015-11-02,27.263153076171875,27.303649658622827,26.90993355230868,27.17766105387142,128813200 +2015-11-03,27.57587242126465,27.782854163924345,27.155158076028844,27.175407222846523,182076000 +2015-11-04,27.4476375579834,27.8571022463373,27.362145534337124,27.701865058420555,179544400 +2015-11-05,27.321104049682617,27.721025250712767,27.153906241720836,27.5312317001019,158210800 +2015-11-06,27.352737426757812,27.52219516245733,27.25332339400709,27.364035298663072,132169200 +2015-11-09,27.242023468017578,27.52219308724792,27.12453353860263,27.330141346032065,135485600 +2015-11-10,26.383434295654297,26.67716167500024,26.223014541148196,26.412808067876647,236511600 +2015-11-11,26.23431968688965,26.530305343254632,26.03097003893098,26.29306552381402,180872000 +2015-11-12,26.146202087402344,26.394739782673806,26.1303860992618,26.268211877549444,130102400 +2015-11-13,25.38250732421875,26.112306029374714,25.366691338599303,26.028706263207265,183249600 +2015-11-16,25.798242568969727,25.811798634532966,25.07974178929681,25.165599744219016,152426800 +2015-11-17,25.687524795532227,25.994808185893216,25.603925054806215,25.965434418815434,110467600 +2015-11-18,26.500932693481445,26.54612073698811,26.09649332598733,26.155239161596686,186698800 +2015-11-19,26.837581634521484,27.056747211333587,26.381176302252673,26.58000605784681,173183200 +2015-11-20,26.955076217651367,27.09516016744901,26.853400548093948,26.932480475207637,137148400 +2015-11-23,26.604862213134766,27.052231355323833,26.512224498168308,26.94829576942529,129930000 +2015-11-24,26.86018180847168,26.966375604988837,26.46252220611864,26.50997016808758,171212800 +2015-11-25,26.668123245239258,26.939256603726427,26.64326931094928,26.93473676632122,85553200 +2015-11-27,26.618419647216797,26.75398721011677,26.570971689727074,26.726873352774142,52185600 +2015-11-30,26.729137420654297,26.97993503760885,26.604867709978283,26.65909370926716,156721200 +2015-12-01,26.512222290039062,26.844359671547785,26.403770322901277,26.830803606608796,139409600 +2015-12-02,26.272727966308594,26.686205269283136,26.227539924767314,26.512227689341298,133546400 +2015-12-03,26.028705596923828,26.387956866531066,25.80728180391958,26.333730877768634,166278000 +2015-12-04,26.89406967163086,26.943777545428325,26.008371066661898,26.04904098851318,231108000 +2015-12-07,26.724613189697266,27.0816045509564,26.618419404174713,26.8827747703654,128336800 +2015-12-08,26.713314056396484,26.79691208975629,26.40377068679101,26.552892574613857,137238000 +2015-12-09,26.123600006103516,26.59130319548043,26.001590253594813,26.580005325802393,185445600 +2015-12-10,26.247873306274414,26.42185088144362,26.09875139422833,26.218501252459657,116850800 +2015-12-11,25.57229995727539,26.07163516968972,25.49773814611241,26.02644713348899,187544800 +2015-12-14,25.414138793945312,25.45932682781177,24.806349912707372,25.346355019332627,257274800 +2015-12-15,24.96451187133789,25.48644284294935,24.932879900187274,25.29213117798805,213292400 +2015-12-16,25.15656280517578,25.303426508670157,24.58266750493335,25.095558783872654,224954000 +2015-12-17,24.62333869934082,25.36217364527321,24.62333869934082,25.31020584948216,179091200 +2015-12-18,23.956802368164062,24.745345139551574,23.907094494677143,24.60752111371929,385813200 +2015-12-21,24.25053596496582,24.259573919163884,23.852874599318433,24.239238091264863,190362400 +2015-12-22,24.22793960571289,24.338651517292526,24.051702101560817,24.266349614491677,131157600 +2015-12-23,24.539735794067383,24.593961778184386,24.221154474277448,24.23697045813711,130629600 +2015-12-24,24.40869140625,24.62785701513054,24.390615501147582,24.62785701513054,54281600 +2015-12-28,24.13530158996582,24.331873193905576,23.990697786083693,24.309277448950674,106816800 +2015-12-29,24.569107055664062,24.72500869429402,24.14433370003601,24.166927715709637,123724800 +2015-12-30,24.248273849487305,24.560075483922393,24.216641874565486,24.532963347597033,100855200 +2015-12-31,23.782827377319336,24.182746850682086,23.683411626823528,24.178228736483696,163649200 +2016-01-04,23.803163528442383,23.807683366843445,23.046252634712044,23.184078401118814,270597600 +2016-01-05,23.2066707611084,23.91613364374091,23.138888704262126,23.89353962479215,223164000 +2016-01-06,22.752525329589844,23.129852542884784,22.56499340636256,22.72089335584966,273829600 +2016-01-07,21.792268753051758,22.62374162188698,21.787750637617336,22.296123952762994,324377600 +2016-01-08,21.90749740600586,22.39327662729139,21.8623093628314,22.26674872735222,283192000 +2016-01-11,22.262218475341797,22.3819682851718,21.993345089926283,22.361634192398803,198957600 +2016-01-12,22.5853271484375,22.750266772155083,22.33226963872977,22.718634798918274,196616800 +2016-01-13,22.00465202331543,22.863238586263442,21.984317922164728,22.66666698940705,249758400 +2016-01-14,22.485912322998047,22.702819753922995,21.63184556255437,22.133440764418324,252680400 +2016-01-15,21.94590950012207,22.07695725111728,21.545989936211157,21.735781804151653,319335600 +2016-01-19,21.839712142944336,22.289339484794287,21.577616704237446,22.235113496163347,212350800 +2016-01-20,21.86908721923828,22.18540869032942,21.10765645886051,21.487241879407215,289337600 +2016-01-21,21.75836944580078,22.115359024954458,21.451086010818546,21.93008534125748,208646000 +2016-01-22,22.915199279785156,22.92423723055652,22.2260723406438,22.284816434938403,263202000 +2016-01-25,22.467836380004883,22.94005776578175,22.415868583710015,22.937797846687225,207178000 +2016-01-26,22.592103958129883,22.793193658731777,22.158292585403082,22.57854789142378,300308000 +2016-01-27,21.10765266418457,21.83293148087719,21.089576760785953,21.699625571891676,533478800 +2016-01-28,21.259033203125,21.35618902330654,20.874929759884267,21.191251155159947,222715200 +2016-01-29,21.993356704711914,21.993356704711914,21.317785592751516,21.417201362310415,257666000 +2016-02-01,21.78774070739746,21.851004637527105,21.555019082786497,21.79677865796067,163774000 +2016-02-02,21.347156524658203,21.69962806231868,21.301966760975308,21.559542380621536,149428800 +2016-02-03,21.76966667175293,21.880378558966903,21.256775430983197,21.4646431403111,183857200 +2016-02-04,21.944589614868164,22.11042423534878,21.624281283757696,21.776484545584424,185886800 +2016-02-05,21.35849380493164,22.017286262241782,21.283529123337583,21.926418038273624,185672400 +2016-02-08,21.583393096923828,21.740139007118984,21.135868522754375,21.156312963279614,216085600 +2016-02-09,21.57884979248047,21.794662052129024,21.338050459796044,21.41983169224874,177324800 +2016-02-10,21.415287017822266,21.887800413343935,21.376668584491327,21.790117372280967,169374400 +2016-02-11,21.285795211791992,21.51750922210033,21.03363676519184,21.30624138125066,200298800 +2016-02-12,21.3516788482666,21.467535876378317,21.12905352086298,21.39711382652963,161405600 +2016-02-16,21.953678131103516,22.001383556780834,21.492523949722276,21.58566261894929,196231600 +2016-02-17,22.289888381958008,22.310332820097173,21.84236386001925,21.960491324435235,179452800 +2016-02-18,21.867355346679688,22.46481102115485,21.828735181286046,22.45345184312721,156084000 +2016-02-19,21.8173770904541,21.980939543472857,21.762856850503574,21.808290094934485,141496800 +2016-02-22,22.008188247680664,22.012732609845813,21.790105659244897,21.878701656635478,137123200 +2016-02-23,21.510700225830078,21.921876843092146,21.478896605332864,21.899160218903756,127770400 +2016-02-24,21.831005096435547,21.894612327183545,21.19947368662748,21.349406501819523,145022800 +2016-02-25,21.980941772460938,21.980941772460938,21.637915022771093,21.81965148525816,110330800 +2016-02-26,22.0150146484375,22.26717140018661,21.940048237642483,22.08089233083262,115964400 +2016-02-29,21.965030670166016,22.314872085902252,21.955943677568975,22.003649088828467,140865200 +2016-03-01,22.837364196777344,22.8918844264392,22.130866460248722,22.18311624133452,201628400 +2016-03-02,22.887344360351562,22.919147975648066,22.635185886809957,22.832824124581418,132678400 +2016-03-03,23.057723999023438,23.105429426903417,22.819195126456304,22.848728295977644,147822800 +2016-03-04,23.400747299194336,23.56885236329397,23.02818919326165,23.255358854594604,184220400 +2016-03-07,23.141775131225586,23.359857808560097,22.935049897600972,23.259902598177465,143315600 +2016-03-08,22.950956344604492,23.11679100142754,22.807840046127613,22.89416391507388,126247600 +2016-03-09,22.971393585205078,23.07589140691437,22.77829801337625,23.014554636305977,108806800 +2016-03-10,22.98275375366211,23.225825217018002,22.751041466408626,23.03727571915335,134054400 +2016-03-11,23.230375289916992,23.23491792157421,23.057725823097577,23.225830925092414,109632800 +2016-03-14,23.289430618286133,23.37802837197383,23.12132557078069,23.150858733065522,100304400 +2016-03-15,23.757404327392578,23.89370578174272,23.591569706935772,23.616558509102784,160270800 +2016-03-16,24.07317352294922,24.150410389467336,23.75967822594273,23.764222590542193,153214000 +2016-03-17,24.034549713134766,24.18675296299051,23.843726305492055,23.970940755142603,137682800 +2016-03-18,24.06181526184082,24.19357410957142,23.895982344151744,24.15722612405925,176820800 +2016-03-21,24.059539794921875,24.45481452251042,23.884618184167916,24.064082425579844,142010800 +2016-03-22,24.243549346923828,24.37303599957692,23.900522633234456,23.90960962872187,129777600 +2016-03-23,24.109516143798828,24.323056185472243,24.057268090942788,24.189026913812217,102814000 +2016-03-24,24.005016326904297,24.136775138916786,23.8278242784853,23.95958309049779,104532000 +2016-03-28,23.895978927612305,24.123148605081635,23.866445760314352,24.079985811748994,77645600 +2016-03-29,24.461631774902344,24.486620578931024,23.82555596299124,23.827828145130344,124760400 +2016-03-30,24.888702392578125,25.084068399564647,24.670619770790836,24.681978944774524,182404400 +2016-03-31,24.75922393798828,24.96594918705855,24.734235133525566,24.925058573680207,103553600 +2016-04-01,24.98639488220215,24.988667064494848,24.57976091017257,24.71151975247278,103496000 +2016-04-04,25.243091583251953,25.486163034141835,25.049995998415604,25.084071791808306,149424800 +2016-04-05,24.945499420166016,25.154496821306928,24.856903392803854,24.877349563131162,106314800 +2016-04-06,25.206741333007812,25.211285696072327,24.80692230849855,25.04090847765361,105616400 +2016-04-07,24.656997680664062,25.0840760621472,24.561586829455138,24.97730603348463,127207600 +2016-04-08,24.684255599975586,24.936412323081576,24.57294122089397,24.741048013853867,94326800 +2016-04-11,24.766036987304688,25.12723766861337,24.722875927989268,24.754679543555184,117630000 +2016-04-12,25.088621139526367,25.102250766324442,24.68425936828961,24.838733093780334,108929200 +2016-04-13,25.452085494995117,25.52023534393928,25.17039563972576,25.17039563972576,133029200 +2016-04-14,25.465723037719727,25.53160245873693,25.290803131214734,25.356682552231938,101895600 +2016-04-15,24.9545841217041,25.511150768772367,24.927324874661373,25.467987983399016,187756000 +2016-04-18,24.416194915771484,24.750132847752486,24.293523095931427,24.736503223270336,243286000 +2016-04-19,24.28671646118164,24.53433063287078,24.13224097675909,24.50706964156063,129539600 +2016-04-20,24.336685180664062,24.55476784743825,24.09361371250426,24.22537253196168,122444000 +2016-04-21,24.07317352294922,24.29125622820701,23.970946117468603,24.29125622820701,126210000 +2016-04-22,24.00728988647461,24.189026308864396,23.76649060000007,23.855086629294174,134732400 +2016-04-25,23.87099266052246,24.000479321110124,23.741505999934795,23.852818668433983,112126400 +2016-04-26,23.70515251159668,23.920964717910977,23.605199044653066,23.605199044653066,224064800 +2016-04-27,22.221736907958984,22.423917774312617,21.73559395592137,21.808288180529786,458408400 +2016-04-28,21.54250144958496,22.235367942665334,21.410742617517048,22.174032890863867,328970800 +2016-04-29,21.294885635375977,21.517512687688416,21.01546789538402,21.351678056222635,274126000 +2016-05-02,21.27216339111328,21.372118579997203,20.990473543455582,21.34712978277622,192640400 +2016-05-03,21.622013092041016,21.74922757517405,21.281258526648376,21.39938601339086,227325200 +2016-05-04,21.397113800048828,21.78557376458914,21.313060390241652,21.62655394061615,164102000 +2016-05-05,21.310260772705078,21.499959999076157,21.182271773572463,21.483961374184577,143562000 +2016-05-06,21.191417694091797,21.35826027577339,20.992576113471646,21.339977375448026,174799600 +2016-05-09,21.207412719726562,21.431393468217014,21.161701117377966,21.255408594403086,131745600 +2016-05-10,21.35140037536621,21.38568364124858,21.051996790346816,21.33083146206839,134747200 +2016-05-11,21.143415451049805,21.38568080875072,21.131987116029567,21.36511189817722,114876400 +2016-05-12,20.647457122802734,21.20512645898511,20.448617321968666,21.19141385029843,305258800 +2016-05-13,20.688594818115234,20.9514308376849,20.56974815158694,20.56974815158694,177571200 +2016-05-16,21.4565372467041,21.57309966843478,20.946865455185264,21.115994046908508,245039200 +2016-05-17,21.367403030395508,21.643951738226384,21.257698651343752,21.609670209597503,187667600 +2016-05-18,21.61195182800293,21.760511494120927,21.458821873202286,21.520532104594423,168249600 +2016-05-19,21.529664993286133,21.630228745585505,21.385677410991075,21.630228745585505,121768400 +2016-05-20,21.76279640197754,21.810792277438484,21.602808406721685,21.630235368579097,128104000 +2016-05-23,22.03934669494629,22.213047312142947,21.86564607774963,21.911357684232694,152074400 +2016-05-24,22.37531852722168,22.418742371665218,22.133051383686695,22.21990256001259,140560800 +2016-05-25,22.768428802490234,22.79585402038829,22.42331361294512,22.55130261305431,152675200 +2016-05-26,22.948986053466797,23.022122875155866,22.54444664621836,22.782141752637685,225324800 +2016-05-27,22.935272216796875,22.96269917944234,22.683864495564723,22.727290083823526,145364800 +2016-05-31,22.823280334472656,22.946699042670367,22.58558523835698,22.76385612451391,169228800 +2016-06-01,22.503305435180664,22.75014284428857,22.473594202938123,22.63129442787991,116693200 +2016-06-02,22.33417510986328,22.36160032400692,22.085051704504227,22.306748152000537,160766400 +2016-06-03,22.3798885345459,22.45988166143073,22.272468445420813,22.3501772999085,114019600 +2016-06-06,22.542156219482422,23.28723864346279,22.295320584402702,22.395882604724427,93170000 +2016-06-07,22.633581161499023,22.82556640035479,22.61758253690432,22.683863051287897,89638000 +2016-06-08,22.613012313842773,22.754713919599112,22.553588103582754,22.631295210775672,83392400 +2016-06-09,22.775283813476562,22.85299091806693,22.503305459971784,22.512447779991692,106405600 +2016-06-10,22.587873458862305,22.706720146659556,22.507880328256512,22.519306921931932,126851600 +2016-06-13,22.24732780456543,22.654153236640877,22.192475623051653,22.555875466914017,152082000 +2016-06-14,22.274755477905273,22.50788030828613,22.1124832006148,22.242758225691347,127727600 +2016-06-15,22.20162010192871,22.491883150746567,22.176479153016313,22.357036084423736,117780800 +2016-06-16,22.295324325561523,22.34103418394888,21.957065444849373,22.04391487327308,125307200 +2016-06-17,21.78793716430664,22.089626767320635,21.781080859829856,22.082770462843847,244032800 +2016-06-20,21.735366821289062,22.071339652754666,21.71936819806304,21.941064651137303,137647600 +2016-06-21,21.920499801635742,22.021061847524123,21.639379091468093,21.698803307483594,142185600 +2016-06-22,21.83822250366211,22.144482443445646,21.79251089373348,21.998208779113266,116876400 +2016-06-23,21.963924407958984,22.00734999928715,21.769654870717485,21.92735686556648,128960800 +2016-06-24,21.346830368041992,21.634807364038398,21.175415780092596,21.234839992156473,301245600 +2016-06-27,21.03599739074707,21.26683617922006,20.912578684347235,21.255407843107022,181958400 +2016-06-28,21.390256881713867,21.406257252557285,21.0588560011259,21.232556626841593,161779600 +2016-06-29,21.575382232666016,21.609665497538987,21.399395620053767,21.477104470013785,146124000 +2016-06-30,21.84963607788086,21.888489615377168,21.55251863713908,21.584515873161756,143345600 +2016-07-01,21.915922164916992,22.048483173007646,21.787933188122725,21.824500719898644,104106000 +2016-07-05,21.710229873657227,21.80393735816735,21.58909716926666,21.80165134193749,110820800 +2016-07-06,21.833642959594727,21.86335593175638,21.568522688093886,21.621088841778466,123796400 +2016-07-07,21.927350997924805,22.055339977628716,21.854214188991275,21.872497083435356,100558400 +2016-07-08,22.09648323059082,22.14447910599258,21.952495604385536,22.05305764363331,115648400 +2016-07-11,22.165050506591797,22.318180458540134,22.10791230866605,22.112482597263565,95179600 +2016-07-12,22.265615463256836,22.32960997431394,22.197050663004074,22.208477257853044,96670000 +2016-07-13,22.13990592956543,22.32274708671437,22.13304788221459,22.263324626093507,103568800 +2016-07-14,22.578731536865234,22.624441399813954,22.242758638661694,22.258757265065697,155676000 +2016-07-15,22.576440811157227,22.695289219983323,22.512446318890465,22.608438057290606,120548000 +2016-07-18,22.816423416137695,22.88498820081162,22.53530274218878,22.558157670413422,145975600 +2016-07-19,22.825565338134766,22.855276569936763,22.704430907589956,22.75471279503889,95119600 +2016-07-20,22.846134185791016,22.96041056831921,22.795852298483535,22.855276505639576,105104000 +2016-07-21,22.725000381469727,23.08382813520886,22.65643385783789,22.81642183173913,130808000 +2016-07-22,22.549015045166016,22.69528866497556,22.46902018806969,22.686146345772578,113254800 +2016-07-25,22.24732780456543,22.590156990535494,22.15133605098647,22.45531168103925,161531600 +2016-07-26,22.094196319580078,22.391315624283006,22.037058125884844,22.128479584541076,224959200 +2016-07-27,23.529504776000977,23.849478972854403,23.48379492375867,23.831194334469842,369379200 +2016-07-28,23.847200393676758,23.87234134336575,23.499800874631948,23.502086891072665,159479200 +2016-07-29,23.817489624023438,23.895198491061972,23.69635690607364,23.812919334771603,110934800 +2016-08-01,24.23801612854004,24.260871051301272,23.863189815355547,23.863189815355547,152671600 +2016-08-02,23.879196166992188,24.24259426459351,23.76949006101252,24.23802397604908,135266400 +2016-08-03,24.1785945892334,24.190021180009257,23.945469817802387,23.954612136654486,120810400 +2016-08-04,24.327964782714844,24.35783697050133,24.192387231327288,24.261325207038322,109634800 +2016-08-05,24.697919845581055,24.73698386697454,24.399191057262183,24.419871391000516,162213600 +2016-08-08,24.902435302734375,24.902435302734375,24.624388581743602,24.70711167568579,112148800 +2016-08-09,25.003543853759766,25.03341778870637,24.819712210761192,24.87026648236449,105260800 +2016-08-10,24.817419052124023,25.024231228191503,24.76226972289455,24.980570392920153,96034000 +2016-08-11,24.801326751708984,25.031117603942675,24.78294306277067,24.936902513007627,109938000 +2016-08-12,24.85877799987793,24.91852412084127,24.766861295280172,24.766861295280172,74641600 +2016-08-15,25.157506942749023,25.171293834880817,24.83579935207304,24.849586244204833,103472800 +2016-08-16,25.134521484375,25.329845101189186,25.095457462278155,25.191969194458,135177600 +2016-08-17,25.097759246826172,25.132228228158244,24.895542158032793,25.07018371112747,101424000 +2016-08-18,25.065597534179688,25.18508805815689,25.05180888486882,25.100066527708098,87938800 +2016-08-19,25.129928588867188,25.205759993423843,24.900137728876203,24.99435106982664,101472400 +2016-08-22,24.934606552124023,25.07018231714914,24.7829437439619,25.015033001983426,103280800 +2016-08-23,25.012739181518555,25.120741185314976,24.939206163447757,24.952993056471833,85030800 +2016-08-24,24.82430648803711,24.98975618882819,24.743880037142876,24.94839376363042,94700400 +2016-08-25,24.718605041503906,24.789839653723377,24.514091297315826,24.677242612726243,100344800 +2016-08-26,24.573843002319336,24.805930582996083,24.42907359211279,24.681845021627176,111065200 +2016-08-29,24.546268463134766,24.688739478946058,24.424479543841358,24.500310975797323,99881200 +2016-08-30,24.357833862304688,24.47272930505141,24.24293841955797,24.31187638647213,99455600 +2016-08-31,24.380815505981445,24.488817515541736,24.275111896436307,24.279708696466617,118649600 +2016-09-01,24.52558708190918,24.541672377113162,24.270519005699086,24.390009519619294,106806000 +2016-09-02,24.755373001098633,24.817415769128708,24.546262452635688,24.74847780183722,107210000 +2016-09-06,24.748477935791016,24.886353871120267,24.704818859224407,24.794437165289214,107521600 +2016-09-07,24.900148391723633,24.992065125714028,24.6037178450167,24.77835946428186,169457200 +2016-09-08,24.247529983520508,24.6496639753808,24.18318882532927,24.6450689297236,212008000 +2016-09-09,23.698339462280273,24.293498919858386,23.698339462280273,24.045324279173325,186228000 +2016-09-12,24.229150772094727,24.293491937520596,23.560458474636018,23.58803401117508,181171200 +2016-09-13,24.805925369262695,24.99895062457929,24.64277405106379,24.704818571873357,248704800 +2016-09-14,25.683727264404297,25.973264279627227,24.95529055647582,24.985164494504644,443554800 +2016-09-15,26.556930541992188,26.593697922387822,26.078965115840077,26.16398836813109,359934400 +2016-09-16,26.407564163208008,26.685610882401825,26.205348845566615,26.453523385284505,319547600 +2016-09-19,26.09964942932129,26.6971053863327,26.02381801566827,26.469612898538983,188092000 +2016-09-20,26.097349166870117,26.223734847271082,25.8537714044594,25.977858685262564,138057200 +2016-09-21,26.092763900756836,26.193870729808584,25.83769579791938,26.161700136042228,144012800 +2016-09-22,26.338634490966797,26.41216751135793,26.196163496949076,26.276589964069768,124296000 +2016-09-23,25.899728775024414,26.37769420589533,25.633172277185196,26.292670952764908,209924800 +2016-09-26,25.938791275024414,26.055985102836082,25.633170767996884,25.653851103582124,119477600 +2016-09-27,25.98705291748047,26.00773501082526,25.814709736657672,25.966372577301172,98429600 +2016-09-28,26.184673309326172,26.343229597125518,26.065182808358237,26.124928935424954,118564400 +2016-09-29,25.777944564819336,26.15020647320444,25.690624649444544,26.00314042985452,143548000 +2016-09-30,25.977863311767578,26.05139633350615,25.690624671669156,25.842285761995047,145516400 +2016-10-03,25.856069564819336,25.977860206321008,25.80092024339945,25.899730393907962,86807200 +2016-10-04,25.966371536254883,26.26739705234366,25.881348272651486,25.980158429155,118947200 +2016-10-05,25.977863311767578,26.11803590838885,25.89513844316599,26.05828978036203,85812400 +2016-10-06,26.170883178710938,26.274288373428085,25.996241619052924,26.12722235050511,115117200 +2016-10-07,26.209949493408203,26.32484494341005,26.083565550305433,26.267397218409126,97433600 +2016-10-10,26.667232513427734,26.828085429296586,26.361610220111622,26.43054643269886,144944000 +2016-10-11,26.724685668945312,27.273885847460356,26.701705173577295,27.0463915661097,256164000 +2016-10-12,26.96366310119629,27.11073088867246,26.828087313039518,26.96596150106017,150347200 +2016-10-13,26.88094139099121,26.986644999084724,26.591404353851715,26.83728055713055,140769600 +2016-10-14,27.030305862426758,27.15439317224152,26.915410399987046,27.087753593646614,142608800 +2016-10-17,27.011920928955078,27.078558747003438,26.83498095462335,26.961366650574586,94499600 +2016-10-18,26.99353790283203,27.163582681721138,26.988941102957327,27.156689235074555,98214000 +2016-10-19,26.913105010986328,27.060171014885295,26.150199458323556,26.942977190377817,80138400 +2016-10-20,26.899316787719727,26.97284979081706,26.73157044620006,26.853359318220797,96503200 +2016-10-21,26.793621063232422,26.8648574409622,26.720088038569706,26.84187694630805,92770800 +2016-10-24,27.034902572631836,27.05558291428259,26.885538121324686,26.908516863102953,94154800 +2016-10-25,27.172771453857422,27.198048590811908,26.95676746648829,27.103833488860595,192516000 +2016-10-26,26.5615291595459,26.586806298675484,26.037606190615314,26.267397089491215,264536800 +2016-10-27,26.306459426879883,26.623570194627312,26.21913777472588,26.51556820580433,138248000 +2016-10-28,26.13182258605957,26.4742105513399,26.06977805853856,26.16629157321952,151446800 +2016-10-31,26.090456008911133,26.249012272768702,26.0123262002113,26.115733145270028,105677600 +2016-11-01,25.6193904876709,26.143313531508372,25.398791403590153,26.072078903685146,175303200 +2016-11-02,25.642366409301758,25.81700798909054,25.559643295891792,25.598707329228674,113326800 +2016-11-03,25.36751365661621,25.743995281827615,25.30284213936926,25.63313032716619,107730400 +2016-11-04,25.13885498046875,25.464524575988186,24.97024732383125,25.067254613581614,123348000 +2016-11-07,25.50147247314453,25.524569187668334,25.282049279752517,25.42525172926626,130240000 +2016-11-08,25.65160369873047,25.80404519659029,25.337483426322173,25.478375685071473,97016800 +2016-11-09,25.610027313232422,25.711654972155866,24.95638165489821,25.379056642709223,236705600 +2016-11-10,24.89632797241211,25.658530102895437,24.443625684461487,25.658530102895437,228538000 +2016-11-11,25.04414939880371,25.145777055793495,24.609925180861946,24.741578390068558,136575600 +2016-11-14,24.415910720825195,24.90094880333466,24.03942914141622,24.877852087437343,204702000 +2016-11-15,24.739269256591797,24.87092247147441,24.519847819176245,24.614544880045152,129058000 +2016-11-16,25.404470443725586,25.459904688437273,24.62147979938319,24.64457652026297,235362000 +2016-11-17,25.395225524902344,25.487614149203825,25.13653949145793,25.362889770721793,110528000 +2016-11-18,25.420639038085938,25.531505768454362,25.328252151973626,25.342109832457094,113715600 +2016-11-21,25.806354522705078,25.866405629979546,25.4090846762239,25.43449159167326,117058400 +2016-11-22,25.82251739501953,25.965718059253767,25.730128789669845,25.857161580130345,103862000 +2016-11-23,25.69086456298828,25.75553605898415,25.48299063859721,25.72089011122462,109705600 +2016-11-25,25.820213317871094,25.838691395755834,25.626197024414314,25.66777181857173,45903600 +2016-11-28,25.76940155029297,25.977275537742,25.727826752803164,25.73706579248608,108776000 +2016-11-29,25.743993759155273,25.875646986383043,25.42294463026358,25.58693361420227,114115200 +2016-11-30,25.526878356933594,25.914909163415924,25.46913568788662,25.776327110136467,144649200 +2016-12-01,25.288986206054688,25.623894841345702,25.182739875531414,25.492241588070456,148347600 +2016-12-02,25.383682250976562,25.427565489106488,25.14116229230213,25.215072851547344,106112000 +2016-12-05,25.20121192932129,25.413704539535598,25.002576996505066,25.406775700836555,137298000 +2016-12-06,25.395225524902344,25.489924349407133,25.21968907711262,25.291289423917206,104782000 +2016-12-07,25.644672393798828,25.681628545665127,25.212758382400864,25.23585509623415,119994800 +2016-12-08,25.89643096923828,25.968031309767174,25.545354580097435,25.60540744495479,108273200 +2016-12-09,26.319116592407227,26.492344657110653,25.940324698562424,25.940324698562424,137610400 +2016-12-12,26.168977737426758,26.56162717338415,25.98189029558457,26.166667537309444,105497600 +2016-12-13,26.605510711669922,26.774118305531143,26.272912399597196,26.293698913018602,174935200 +2016-12-14,26.605510711669922,26.83878980795278,26.557007084853694,26.570864760467966,136127200 +2016-12-15,26.75102424621582,26.961208412105787,26.61475239004523,26.649396582518126,186098000 +2016-12-16,26.78566551208496,26.90807966983807,26.711754977469905,26.901150832556368,177404400 +2016-12-19,26.94042205810547,27.111339881119594,26.73485827797814,26.74640751773807,111117600 +2016-12-20,27.012027740478516,27.13906235423746,26.949666415103078,26.96352409581608,85700000 +2016-12-21,27.03742790222168,27.115958851680656,26.97275639217693,26.977376792703833,95132800 +2016-12-22,26.859582901000977,26.91039673692217,26.709451593642886,26.873440579100723,104343600 +2016-12-23,26.912704467773438,26.912704467773438,26.697901652040397,26.697901652040397,56998000 +2016-12-27,27.08362579345703,27.20835018760531,26.905777360958567,26.912706200272364,73187600 +2016-12-28,26.9681339263916,27.25915568029002,26.838789162492734,27.14367035383839,83623600 +2016-12-29,26.96120834350586,27.048976567824628,26.884987595926525,26.896535072665955,60158000 +2016-12-30,26.75102424621582,27.069763152131607,26.66094582145339,26.942730334675943,122345200 +2017-01-03,26.82724952697754,26.86882432713634,26.506200366593873,26.746410127270636,115127600 +2017-01-04,26.797216415405273,26.91039331270731,26.734855109724993,26.757951824341156,84472400 +2017-01-05,26.93349266052246,26.99123533379137,26.74871540119534,26.774122318406985,88774400 +2017-01-06,27.23375701904297,27.291499696027962,26.90115863571607,26.97275899128413,127007600 +2017-01-09,27.48320198059082,27.584829648346272,27.240683812765116,27.242992250911175,134247600 +2017-01-10,27.510923385620117,27.573284706447186,27.323837660972114,27.432392422251322,97848400 +2017-01-11,27.658740997314453,27.70031579330856,27.393124343028013,27.42546009967159,110354400 +2017-01-12,27.54326057434082,27.55480981613602,27.303050794769142,27.462421168275085,108344800 +2017-01-13,27.494752883911133,27.62871631548386,27.441628846505868,27.510920762744625,104447600 +2017-01-17,27.71648406982422,27.77191654455722,27.30535650473515,27.33307186101835,137759200 +2017-01-18,27.714174270629883,27.831969823038612,27.649502755477368,27.716484471075795,94852000 +2017-01-19,27.665668487548828,27.737268836316627,27.57097142261398,27.577900261247446,102389200 +2017-01-20,27.71648406982422,27.820420180219422,27.65412275602042,27.820420180219422,130391600 +2017-01-23,27.734960556030273,27.903568170958962,27.663358444688566,27.7164824781249,88200800 +2017-01-24,27.709550857543945,27.739576409500884,27.600994363456543,27.612543601529538,92844000 +2017-01-25,28.150707244873047,28.201521078948307,27.78115449091642,27.81349024675222,129510400 +2017-01-26,28.164560317993164,28.28004563763438,28.08602938431075,28.102197258573874,105350400 +2017-01-27,28.166872024536133,28.259260643404506,28.086032643838685,28.210757014986036,82251600 +2017-01-30,28.09296417236328,28.09296417236328,27.868924085021355,27.93128539548426,121510000 +2017-01-31,28.028291702270508,28.03753074094258,27.859684092462917,27.98209827107659,196804000 +2017-02-01,29.73747444152832,30.1393646852649,29.33558595995814,29.340204598110404,447940000 +2017-02-02,29.686664581298828,29.885299529573107,29.513436551675905,29.55963175020867,134841600 +2017-02-03,29.813695907592773,29.839102823460063,29.601203304126766,29.63584749652175,98029200 +2017-02-06,30.093170166015625,30.141675562454875,29.77212104237736,29.82524683950918,107383600 +2017-02-07,30.379566192626953,30.508909179450473,30.130117493324992,30.15090400385047,152735200 +2017-02-08,30.49736785888672,30.538944415060975,30.30797372883261,30.33800104582885,92016400 +2017-02-09,30.717737197875977,30.724696075926428,30.41617283711088,30.539117735485412,113399600 +2017-02-10,30.648149490356445,30.838368291330156,30.631913285665966,30.72702268615282,80262000 +2017-02-13,30.919553756713867,31.04250220271785,30.79429040402537,30.87084160718438,92141600 +2017-02-14,31.320873260498047,31.337109466550448,30.910281661223475,30.96131580529662,132904800 +2017-02-15,31.434545516967773,31.61084662049762,31.228090440161125,31.43686750387581,142492400 +2017-02-16,31.39742088317871,31.525002689146593,31.279112862907084,31.471650104490234,90338400 +2017-02-17,31.483253479003906,31.50877055141324,31.33943191066766,31.33943191066766,88792800 +2017-02-21,31.710590362548828,31.7221896773006,31.543570141042192,31.601563175187163,98028800 +2017-02-22,31.80569839477539,31.808016841778624,31.57372626835725,31.647955508211908,83347600 +2017-02-23,31.671152114868164,31.891524912974432,31.61779952028978,31.868329825581597,83152800 +2017-02-24,31.70130729675293,31.70130729675293,31.381184673536666,31.527328225807267,87106400 +2017-02-27,31.763933181762695,31.8822412003406,31.61315275526133,31.812648872873506,81029600 +2017-02-28,31.777854919433594,31.882241642274785,31.710581037424856,31.79873155607926,93931600 +2017-03-01,32.427371978759766,32.51088206006119,31.9193561520898,31.98662649054331,145658400 +2017-03-02,32.234840393066406,32.541041684757865,32.188443147392746,32.476089788350194,104844000 +2017-03-03,32.425052642822266,32.436651953165004,32.149005338882816,32.193080594417694,84432400 +2017-03-06,32.3229866027832,32.422736431070135,32.1513295404858,32.32994548154592,87000000 +2017-03-07,32.364749908447266,32.471455097292825,32.19540771894454,32.2580411799882,69785200 +2017-03-08,32.244102478027344,32.42968075416845,32.20234922419148,32.23250317209143,74828800 +2017-03-09,32.169883728027344,32.19540079632785,31.791771675445137,32.183805024965324,88623600 +2017-03-10,32.27659606933594,32.32763021168569,32.16061002574344,32.30211314051081,78451200 +2017-03-13,32.29052734375,32.343879955042134,32.20238032066183,32.20933920302104,69686800 +2017-03-14,32.241798400878906,32.39489727278173,32.20700046756384,32.31370917427215,61236400 +2017-03-15,32.582794189453125,32.65006452340403,32.25107233273767,32.33922284032585,102767200 +2017-03-16,32.63616180419922,32.71271303717306,32.536411940767586,32.64312068541374,76928000 +2017-03-17,32.47377014160156,32.708060649296925,32.45057151962221,32.708060649296925,175540000 +2017-03-20,32.81477737426758,32.82405470155888,32.52944912056615,32.568883955877986,86168000 +2017-03-21,32.43898010253906,33.125619128633645,32.41346302799739,32.965557801018925,158119600 +2017-03-22,32.80549240112305,32.84724921774126,32.4204178838818,32.441298061997486,103440800 +2017-03-23,32.68951416015625,32.842616624949166,32.61760336173916,32.768383839735385,81385200 +2017-03-24,32.62455368041992,32.87972438810393,32.55728333363764,32.824049813805665,89582400 +2017-03-27,32.68022918701172,32.75909884814108,32.155969998016474,32.33458949849089,94300400 +2017-03-28,33.357582092285156,33.413253119925045,32.61990911954282,32.68718299742454,133499200 +2017-03-29,33.43181610107422,33.51764818034316,33.21608375882161,33.32974781628725,116760000 +2017-03-30,33.38774108886719,33.519966878683235,33.2879947895574,33.44805609739234,84829200 +2017-03-31,33.325111389160156,33.46661450602791,33.17432740648388,33.33902914825974,78646800 +2017-04-03,33.33439254760742,33.431820412118384,33.18361208721004,33.336714534133094,79942800 +2017-04-04,33.58259963989258,33.61043515733627,33.2114428891155,33.230001080615665,79565600 +2017-04-05,33.40861511230469,33.74265542544554,33.359899425133094,33.455008813660356,110871600 +2017-04-06,33.325111389160156,33.52460752868497,33.276395692698415,33.47125139931897,84596000 +2017-04-07,33.2508659362793,33.445721568564416,33.234629736728124,33.341334875526805,66688800 +2017-04-10,33.2114372253418,33.376138934559854,33.14880378216169,33.31118704519252,75733600 +2017-04-11,32.854209899902344,33.25320219803737,32.490012001180624,33.15809278682316,121517600 +2017-04-12,32.89364242553711,32.97483053167873,32.71038249584378,32.8472487163686,81400000 +2017-04-13,32.719661712646484,33.02818499550909,32.719661712646484,32.91915783766994,71291600 +2017-04-17,32.900604248046875,32.912203561279895,32.67790946865855,32.81941259502916,66328400 +2017-04-18,32.754459381103516,32.94931509303245,32.73358274188541,32.803175078892394,58790000 +2017-04-19,32.63383102416992,32.94003587355813,32.58047843602977,32.91220035620032,69313600 +2017-04-20,33.04209899902344,33.1534445906874,32.74517506151119,32.75909281801762,93278400 +2017-04-21,33.00267028808594,33.09777615503177,32.90524243488396,33.04210511869532,69283600 +2017-04-24,33.32046127319336,33.39237203405244,33.21375258508454,33.28798533152757,68537200 +2017-04-25,33.52692794799805,33.61275649390428,33.37382550966795,33.383106376022546,75486000 +2017-04-26,33.32973861694336,33.54315599329066,33.260149841625946,33.51299849757834,80164800 +2017-04-27,33.355255126953125,33.44108718110559,33.24390954868292,33.38541262216443,56985200 +2017-04-28,33.32280349731445,33.47358754376726,33.2346564725295,33.424871826700425,83441600 +2017-05-01,34.002464294433594,34.14628583605964,33.62667069748158,33.65914664364271,134411600 +2017-05-02,34.21820068359375,34.35274491646579,34.062779812762194,34.22515956291359,181408800 +2017-05-03,34.11381530761719,34.21356514784751,33.466614727903426,33.772816048963875,182788000 +2017-05-04,33.990875244140625,34.13237838218773,33.82385503072064,33.988556797148085,93487600 +2017-05-05,34.55455780029297,34.55919469272828,34.044216463404894,34.044216463404894,109310800 +2017-05-08,35.494049072265625,35.6541103845622,34.57080112290132,34.57080112290132,195009600 +2017-05-09,35.72138214111328,35.927837152275686,35.596115234791384,35.693543084367825,156521600 +2017-05-10,35.55205154418945,35.70979445171137,35.285284979210275,35.63788364930555,103222800 +2017-05-11,35.85950469970703,35.88745866350472,35.47750036721987,35.51011036313134,109020400 +2017-05-12,36.36030578613281,36.43484139723615,36.027214666693055,36.034202269164524,130108000 +2017-05-15,36.26713180541992,36.48841417672337,36.11572901300784,36.33933940039255,104038800 +2017-05-16,36.21355438232422,36.35098195227222,36.03885723449191,36.323031545970274,80194000 +2017-05-17,34.997676849365234,36.0039345553213,34.87189641323277,35.777992530258686,203070800 +2017-05-18,35.53107833862305,35.71742272274679,35.202650315678596,35.23526031633349,134272800 +2017-05-19,35.652191162109375,35.86648589039377,35.552033176222885,35.726730313280825,107843200 +2017-05-22,35.868831634521484,36.006259250300886,35.61726723124081,35.87115965108217,91865600 +2017-05-23,35.82456588745117,36.080786262682494,35.71042912719921,36.080786262682494,79675600 +2017-05-24,35.7174186706543,35.910750636254875,35.561356288494984,35.83388345324093,76712000 +2017-05-25,35.840877532958984,35.95268630348867,35.64521751586766,35.808267530110435,76942400 +2017-05-26,35.78031539916992,35.927062182064795,35.71043580949505,35.87115779948018,87710400 +2017-05-30,35.79428482055664,35.97131000545862,35.71508962369705,35.736052430944056,80507600 +2017-05-31,35.582332611083984,35.9107642757354,35.49382175957202,35.864179055851565,97804800 +2017-06-01,35.680145263671875,35.71508682723733,35.456534895432924,35.67781724778993,65616400 +2017-06-02,36.20891189575195,36.20891189575195,35.61261258489816,35.773334605478524,111082800 +2017-06-05,35.85484313964844,35.97596749817618,35.74536952343279,35.95034510606883,101326800 +2017-06-06,35.975975036621094,36.292759426226446,35.819912635346746,35.847863049239606,106499600 +2017-06-07,36.19026184082031,36.33234900375697,35.98295469039366,36.10873863356919,84278400 +2017-06-08,36.10175704956055,36.229865475770374,35.9643258955195,36.16231746111834,85003200 +2017-06-09,34.701847076416016,36.14834130052815,34.0123775250175,36.14834130052815,259530800 +2017-06-12,33.872615814208984,34.028678191176844,33.19478994908927,33.947154978611955,289229200 +2017-06-13,34.1451416015625,34.34546115508918,33.80972248363663,34.277913150001005,136661600 +2017-06-14,33.812049865722656,34.35710408772815,33.50458119430064,34.35710408772815,126124800 +2017-06-15,33.60940170288086,33.653658884077664,33.12491138825977,33.383463319368175,128661600 +2017-06-16,33.138885498046875,33.65831735899295,33.122578724787296,33.49060781168992,201444400 +2017-06-19,34.086910247802734,34.180084202396955,33.462660746024724,33.462660746024724,130165600 +2017-06-20,33.77711868286133,34.21036786392435,33.76081545970131,34.21036786392435,99600400 +2017-06-21,33.9774284362793,34.02401718433079,33.68393851635622,33.89590523563412,85063200 +2017-06-22,33.921531677246094,34.17076444882419,33.80273533143621,33.95414167224387,76425200 +2017-06-23,34.07292938232422,34.277908494153515,33.80040227458155,33.80506186009286,141757600 +2017-06-26,33.965797424316406,34.53880227435015,33.86330782727654,34.280250265171865,102769600 +2017-06-27,33.478965759277344,34.04498645679737,33.453343364669884,33.777115321496986,99047600 +2017-06-28,33.96812057495117,34.033340572047614,33.34619903206657,33.65599579538631,88329600 +2017-06-29,33.46731948852539,33.80507021422651,33.14121950659293,33.70724021964678,125997600 +2017-06-30,33.54651641845703,33.765470774786365,33.490612044216654,33.64667442380345,92096400 +2017-07-03,33.425384521484375,33.84465834827776,33.332214139629066,33.74682838106301,57111200 +2017-07-05,33.56282043457031,33.725870420521495,33.24370806533562,33.469650029519094,86278400 +2017-07-06,33.24604034423828,33.425397128892996,33.1715047214851,33.31359191765142,96515200 +2017-07-07,33.583778381347656,33.71654992126135,33.28562886327293,33.28562886327293,76806800 +2017-07-10,33.788761138916016,33.99606830351503,33.39510961693943,33.567478769502706,84362400 +2017-07-11,33.89823532104492,33.97277447910041,33.630367774506205,33.71189098012888,79127200 +2017-07-12,33.94716262817383,34.04964867098737,33.73286781356115,33.97744106059029,99538000 +2017-07-13,34.42000961303711,34.587719217296886,33.87728319289419,33.89125840087854,100797600 +2017-07-14,34.7158203125,34.78337187575906,34.317512752351135,34.46658752967275,80528400 +2017-07-17,34.836936950683594,35.149061641103934,34.60633901046096,34.66457138796724,95174000 +2017-07-18,34.95807647705078,34.96972366845609,34.62964487222958,34.7530972818335,71475200 +2017-07-19,35.177040100097656,35.27021054731232,34.9278036447501,35.05125608671066,83692000 +2017-07-20,35.018646240234375,35.34474991547607,34.98370821091997,35.288845514348274,68974800 +2017-07-21,35.00232696533203,35.04192456514405,34.67855500995316,34.937106971027156,105010400 +2017-07-24,35.42625045776367,35.50777721286559,34.916134231447195,35.07452815598799,85972800 +2017-07-25,35.577667236328125,35.83388765553219,35.35871285071247,35.35871285071247,75415600 +2017-07-26,35.74536895751953,35.85484257200201,35.652195008503,35.71974656581783,63124000 +2017-07-27,35.06986618041992,35.86881624161626,34.310517263326936,35.81291188013702,129905200 +2017-07-28,34.822967529296875,34.99300510465887,34.750759937878335,34.91380991111743,68854800 +2017-07-31,34.64361572265625,35.01630447540552,34.503860106042794,34.91614290698702,79383600 +2017-08-01,34.951080322265625,34.99067791997708,34.56907599550598,34.72979795659672,141474400 +2017-08-02,36.6025505065918,37.21049679355686,36.37428053552894,37.10101961724423,279747200 +2017-08-03,36.236854553222656,36.618858902082856,36.10874258014265,36.58158931823719,108389200 +2017-08-04,36.42786407470703,36.66312171748989,36.264814047321686,36.35332844256975,82239600 +2017-08-07,36.99153518676758,37.017157575225106,36.49306617386658,36.5839085412665,87481200 +2017-08-08,37.28737258911133,37.694999408730006,36.865770561495815,36.942637759702194,144823600 +2017-08-09,37.51561737060547,37.56453411990464,37.061405645204886,37.096343641689,104526000 +2017-08-10,36.32069778442383,37.41508737748859,36.15934464919948,37.391701520605345,163217200 +2017-08-11,36.8258056640625,37.080698706480085,36.49608785648083,36.62002507122615,105028400 +2017-08-14,37.380008697509766,37.464192779037646,37.122778568346675,37.25607151750768,88490800 +2017-08-15,37.78923416137695,37.92953857764987,37.447819968903666,37.569419984217745,117862000 +2017-08-16,37.637245178222656,38.002041771596325,37.45016899572345,37.868752355485825,110686400 +2017-08-17,36.91465759277344,37.58111520738018,36.90997970815774,37.53668422398233,111762400 +2017-08-18,36.83047103881836,37.298159559946214,36.64807280103292,36.91465511534858,109712400 +2017-08-21,36.76266098022461,36.921673378552924,36.27158656292966,36.830474251704494,105474000 +2017-08-22,37.36363220214844,37.41507822015555,36.9520676262715,37.0011729182547,86418400 +2017-08-23,37.41040802001953,37.52499300514816,37.15318144533209,37.197612430753,77596400 +2017-08-24,37.244388580322266,37.58814004141821,37.0760203721046,37.5156452996228,79275600 +2017-08-25,37.382347106933594,37.54603739088878,37.2443798367557,37.33323823765675,101920400 +2017-08-28,37.75883483886719,37.882772017420365,37.39871266224895,37.44782152930795,103864000 +2017-08-29,38.09557342529297,38.14467872709018,37.41508569780086,37.43847155363424,118067600 +2017-08-30,38.19845199584961,38.32472629549888,38.025406001046406,38.30368117358723,109078400 +2017-08-31,38.350460052490234,38.472060071259364,38.228860033721105,38.26627597306243,107140400 +2017-09-01,38.362152099609375,38.57027335117364,38.263937937226494,38.53753529704601,66364400 +2017-09-05,37.9014778137207,38.40891942605376,37.54603354201166,38.29199729690291,117874000 +2017-09-06,37.861724853515625,38.11427708156708,37.536681476039995,38.04880097446266,86606800 +2017-09-07,37.70973587036133,37.93890588588504,37.49927739784833,37.90382709501198,87714000 +2017-09-08,37.09471893310547,37.68400394413304,37.07133307805082,37.61619067356338,114446000 +2017-09-11,37.76584243774414,37.89445747547147,37.38935309176762,37.53199821212343,126323200 +2017-09-12,37.61618423461914,38.34110279905923,37.127450633988325,38.02541165076244,286856000 +2017-09-13,37.33323669433594,37.40573141611547,36.92634994363632,37.384682719763774,179629600 +2017-09-14,37.01287841796875,37.274782912667305,36.96844742657929,37.178909453974455,95042800 +2017-09-15,37.38701629638672,37.641905648420384,36.94738800614169,37.05729507870295,196458400 +2017-09-18,37.10407257080078,37.53200804396978,36.94739732677399,37.44080891481446,113077600 +2017-09-19,37.11810302734375,37.36130308630419,37.050289753472114,37.30050128747374,83242400 +2017-09-20,36.4960823059082,37.008198335349036,35.972269779428515,36.92401424302518,211805600 +2017-09-21,35.86939239501953,36.43295825572498,35.719732121656094,36.43295825572498,150046800 +2017-09-22,35.51860427856445,35.607466238606435,35.20759098659773,35.436757360822604,186581600 +2017-09-25,35.205257415771484,35.50457781167694,34.88021400608444,35.07430518858542,177549200 +2017-09-26,35.8109016418457,35.993299837467276,35.471828256045576,35.4928733782682,146640000 +2017-09-27,36.0658073425293,36.18039234027809,35.904454195884625,35.965256000812204,102016800 +2017-09-28,35.8436393737793,36.077483578236716,35.70800930701247,35.986284481225496,88022000 +2017-09-29,36.04008102416992,36.042421750717985,35.544332268557866,35.8272854309584,105199200 +2017-10-02,35.96759033203125,36.11725053764211,35.71270090763132,36.07281955082032,74795200 +2017-10-03,36.124267578125,36.266912748248025,35.99097817847156,36.014360468283606,64921200 +2017-10-04,35.89041519165039,35.979277150203,35.65189662108311,35.92549397074334,80655200 +2017-10-05,36.33705520629883,36.34874813157937,36.02370479058724,36.05410211450087,85135200 +2017-10-06,36.31602478027344,36.36045577341464,36.14297869335013,36.238855724004175,69630400 +2017-10-09,36.442283630371094,36.650404850536574,36.360440291489695,36.435268588986396,65051600 +2017-10-10,36.45632553100586,36.94739999620243,36.269252942531836,36.493741475973025,62468000 +2017-10-11,36.60831832885742,36.70886964439379,36.42124221380219,36.47268823464688,67622400 +2017-10-12,36.47972106933594,36.80008670870358,36.41658209147117,36.56156802464886,64500400 +2017-10-13,36.71121597290039,36.77902924626432,36.575585857991875,36.65041417452515,65576800 +2017-10-16,37.38701629638672,37.41507646191564,36.86554109910935,36.924002156081094,96486000 +2017-10-17,37.52498245239258,37.618518713578226,37.23501433362966,37.36362936889465,75989200 +2017-10-18,37.35896301269531,37.58111794587272,37.32155063758505,37.513301102635175,65496800 +2017-10-19,36.47502517700195,36.73225527970482,36.250536694806804,36.655086248893966,170336800 +2017-10-20,36.53815841674805,36.88892473754883,36.47034516472556,36.622342476467416,95896400 +2017-10-23,36.519466400146484,36.874910759543646,36.362791136614184,36.68783459311455,87937200 +2017-10-24,36.73693084716797,36.81175914712097,36.52646889417917,36.54751401902409,71028800 +2017-10-25,36.57557678222656,36.8421590610548,36.308994503398324,36.69249889694385,84828400 +2017-10-26,36.8094367980957,36.9076509883977,36.66211372855206,36.76734296329125,68002000 +2017-10-27,38.1283073425293,38.256922399286424,37.11108338329961,37.24905064046623,177816800 +2017-10-30,38.98651885986328,39.302210066858706,38.28498601603395,38.324739115669274,178803200 +2017-10-31,39.5290412902832,39.671686464628834,39.03797037152198,39.262458914903945,144187200 +2017-11-01,39.026268005371094,39.739493704636594,38.72694764111873,39.72312289387926,134551200 +2017-11-02,39.31157684326172,39.40277600404529,38.64979685370631,38.95847313216264,165573600 +2017-11-03,40.33814239501953,40.749707085055476,40.015436114041485,40.6889088506284,237594400 +2017-11-06,40.747371673583984,40.9204177503154,40.15574584521254,40.30774322188749,140105200 +2017-11-07,40.87832260131836,40.98121466696892,40.59537298896027,40.66786415298291,97446000 +2017-11-08,41.21272659301758,41.21272659301758,40.76608305996782,40.84325211815296,97638000 +2017-11-09,41.1285400390625,41.179986074786456,40.48780531934302,40.94847891402865,117930400 +2017-11-10,40.99240493774414,41.15903276752868,40.898532424151654,41.09566685129998,100582000 +2017-11-13,40.82814025878906,40.95252299343461,40.69436812095815,40.717838047913496,67928400 +2017-11-14,40.210914611816406,40.71314021334376,40.173364163980686,40.60987827229944,99130000 +2017-11-15,39.680519104003906,39.97152963823451,39.51624040766688,39.88938849956249,116632400 +2017-11-16,40.15459442138672,40.335299245758335,39.966845754330734,40.17336606518514,94550000 +2017-11-17,39.931636810302734,40.22264739374085,39.81194879294899,40.14050624117943,87598000 +2017-11-20,39.891746520996094,40.0278642207708,39.7931792724023,39.964498282029034,65049600 +2017-11-21,40.63335037231445,40.76477336576597,40.07949377062023,40.07949377062023,100525200 +2017-11-22,41.06047439575195,41.069860216729566,40.61222534765896,40.68497709851023,102355600 +2017-11-24,41.06282043457031,41.18720315476792,40.987719541843184,41.09333061986667,56106800 +2017-11-27,40.85629653930664,41.08863589742661,40.680282850702696,41.08159563636307,82867200 +2017-11-28,40.61692428588867,41.039354313094805,40.33295393283673,40.905585759415,105715200 +2017-11-29,39.77439498901367,40.58171160051292,39.22992789491412,40.51365455662821,166665600 +2017-11-30,40.330604553222656,40.39866160373604,39.53032812414454,39.997348818685616,166108800 +2017-12-01,40.14285659790039,40.28836010352222,39.54440933099244,39.884701751467084,159037200 +2017-12-04,39.84950256347656,40.51131221613052,39.80960655436338,40.47845646856625,130169600 +2017-12-05,39.811946868896484,40.25315563320378,39.520936299522475,39.67582919520578,109400800 +2017-12-06,39.664093017578125,39.94336861701715,39.06564939707431,39.30972011347895,114240000 +2017-12-07,39.736846923828125,39.999692852259344,39.64062526038198,39.66878630099756,102693200 +2017-12-08,39.748592376708984,40.13113002521119,39.61951850751654,40.011441979211334,93420800 +2017-12-11,40.52305603027344,40.5746870135816,39.612477140302595,39.70869884383224,141095200 +2017-12-12,40.2953987121582,40.45733187455196,40.23907662506999,40.401006206456174,77636800 +2017-12-13,40.429168701171875,40.72721594566587,40.36580277552822,40.483145225457086,95273600 +2017-12-14,40.417442321777344,40.631006485435535,40.28367018157118,40.45968389383731,81906000 +2017-12-15,40.82814025878906,40.87507653169167,40.47376728021509,40.74834823675383,160677200 +2017-12-18,41.40312194824219,41.586175938231364,41.037013968263835,41.041708670342864,117684400 +2017-12-19,40.961917877197266,41.161401557423176,40.85631034455191,41.07691481510511,109745600 +2017-12-20,40.917320251464844,41.16843127225666,40.65916538802657,41.03935384053752,93902400 +2017-12-21,41.07221221923828,41.30924631294333,40.85865163417834,40.875077718717634,83799600 +2017-12-22,41.07221221923828,41.16843390913819,40.95252418270964,40.99476575524627,65397600 +2017-12-26,40.03020477294922,40.24141974875791,39.82133177595065,40.08418129681013,132742000 +2017-12-27,40.037254333496094,40.07949590606701,39.82838486898746,39.919911857232634,85992800 +2017-12-28,40.149898529052734,40.33060692907235,40.009086137685365,40.131123304803225,65920800 +2017-12-29,39.715728759765625,40.03490040024005,39.713383199684046,40.0184743176535,103999600 +2018-01-02,40.42682647705078,40.43621588001568,39.722771657019194,39.93399025163347,102223600 +2018-01-03,40.419776916503906,40.964247570953226,40.35641457560373,40.490183098511274,118071600 +2018-01-04,40.60752487182617,40.710786792933035,40.384574949985684,40.492527990410416,89738400 +2018-01-05,41.069862365722656,41.15669464308769,40.61222747270617,40.703754451309464,94640000 +2018-01-08,40.917320251464844,41.213021983305815,40.8187494265099,40.917320251464844,82271200 +2018-01-09,40.912620544433594,41.083939525023105,40.69671085825055,40.964251510804274,86336000 +2018-01-10,40.903236389160156,40.905585530392194,40.60049439388969,40.638044843522486,95839600 +2018-01-11,41.13557434082031,41.18485975187986,40.950174821327025,40.9736411657776,74670800 +2018-01-12,41.56036376953125,41.62372971913234,41.22241681300375,41.34679957047446,101672400 +2018-01-16,41.34914779663086,42.10013902728049,41.33741283125958,41.75045711286471,118263600 +2018-01-17,42.032073974609375,42.067275283028806,41.08629395765567,41.339750540291504,137547200 +2018-01-18,42.069618225097656,42.26675628300171,41.83258774080623,42.095433710001295,124773600 +2018-01-19,41.88187026977539,42.14471622089114,41.63545040010063,41.91707157358285,129700400 +2018-01-22,41.53922653198242,41.722280464117354,41.44535400612098,41.60963271688216,108434400 +2018-01-23,41.548622131347656,42.11186816210788,41.49699473667759,41.609642510426376,130756400 +2018-01-24,40.886802673339844,41.60963257930642,40.64742307787513,41.59789761836071,204420400 +2018-01-25,40.15694046020508,41.05812977560475,40.020822764492415,40.954867828442865,166116000 +2018-01-26,40.25082015991211,40.36581709078735,39.910527650639175,40.36581709078735,156572000 +2018-01-29,39.41769027709961,39.93399650983338,39.20882079099787,39.93399650983338,202561600 +2018-01-30,39.185340881347656,39.279213415752686,38.6526051170296,38.84739402787731,184192800 +2018-01-31,39.29329299926758,39.530327051641194,39.0750377505356,39.1618700218366,129915600 +2018-02-01,39.37544250488281,39.572577012854964,39.13606284176902,39.232284535306015,188923200 +2018-02-02,37.666927337646484,39.145442958690175,37.573054807837266,38.95769431806428,346375200 +2018-02-05,36.72584915161133,38.460170790615834,36.6108522368327,37.33837701496789,290954000 +2018-02-06,38.26068115234375,38.422614315581534,36.14147667042232,36.336265578302005,272975200 +2018-02-07,37.441627502441406,38.347511362877434,37.3313288935791,38.27475961658197,206434400 +2018-02-08,36.411376953125,37.78428565949148,36.38321589855632,37.617657730939214,217562000 +2018-02-09,36.856727600097656,37.20547638919081,35.40281840962682,37.012252020658266,282690400 +2018-02-12,38.341270446777344,38.61932598387106,37.115930479168966,37.34921710439755,243278000 +2018-02-13,38.72535705566406,38.82197101795642,38.091480291970555,38.16217352280904,130196800 +2018-02-14,39.43935775756836,39.4794164227937,38.38132862243266,38.41902856901624,162579600 +2018-02-15,40.763675689697266,40.787237711993015,39.823463626810906,40.00961906406378,204588800 +2018-02-16,40.63170623779297,41.19489348609223,40.47618541158448,40.615213184598545,160704400 +2018-02-20,40.49504852294922,41.06294258094195,40.393720669837656,40.542176168197194,135722000 +2018-02-21,40.31123352050781,41.02993793912658,40.29709199603148,40.72596168162499,149886400 +2018-02-22,40.64820861816406,40.98988849322406,40.46205318685,40.48326008492217,123967600 +2018-02-23,41.35512161254883,41.39046643209442,40.893262262045184,40.923896836056215,135249600 +2018-02-26,42.17280960083008,42.27177871683173,41.522439583272835,41.55542928860672,152648800 +2018-02-27,42.036136627197266,42.528627080196344,41.98194002503581,42.203443871619406,155712400 +2018-02-28,41.972511291503906,42.5616157216928,41.956018237174824,42.241142767845716,151128400 +2018-03-01,41.237308502197266,42.363675841065785,40.68590764002808,42.0714787606885,195208000 +2018-03-02,41.522430419921875,41.54363731246901,40.63641522258459,40.71889126552224,153816000 +2018-03-05,41.666168212890625,41.88295815110469,41.12419156955193,41.28678492211425,113605600 +2018-03-06,41.630828857421875,42.00314326566764,41.50358389046572,41.92302593108013,95154000 +2018-03-07,41.244380950927734,41.437608938692705,41.06529449044002,41.22317405342424,126814000 +2018-03-08,41.694454193115234,41.736867984637264,41.25380524613253,41.350415636468696,95096400 +2018-03-09,42.41082000732422,42.415533851189416,41.80050846652279,41.93482604961072,128740800 +2018-03-12,42.82081604003906,42.978695569792784,42.46499831736493,42.48384649188425,128828400 +2018-03-13,42.408443450927734,43.240258490091236,42.23642599068004,43.02582364771228,126774000 +2018-03-14,42.04792404174805,42.538059425082864,41.899468554772085,42.49093178344864,117473600 +2018-03-15,42.09740447998047,42.47207765994189,41.96073540547845,42.0620596496107,90975200 +2018-03-16,41.948944091796875,42.208147851708596,41.8546852372409,42.097395944860104,157618800 +2018-03-19,41.30800247192383,41.81934467481242,40.921550117889645,41.783999848007596,133787200 +2018-03-20,41.29385757446289,41.661458093646814,41.223164337171966,41.29385757446289,78597600 +2018-03-21,40.35836410522461,41.25851373335462,40.356005386501984,41.246730926564915,148219600 +2018-03-22,39.78812026977539,40.69062522008914,39.72920981844058,40.05910690767208,165963200 +2018-03-23,38.86675262451172,40.04024758721578,38.86675262451172,39.679715980628345,164115200 +2018-03-26,40.711830139160156,40.78959235574448,39.22021728418757,39.604314524877644,150164800 +2018-03-27,39.667930603027344,41.272650315738176,39.33331975564983,40.92625666195566,163690400 +2018-03-28,39.229644775390625,40.06381873792731,38.925668443841154,39.41108996315728,166674000 +2018-03-29,39.53597640991211,40.47147453692967,39.32861049895362,39.54304537545768,153594000 +2018-04-02,39.276771545410156,39.80932428812303,38.75600520684153,39.267347455946435,150347200 +2018-04-03,39.67971420288086,39.764545376842435,38.85261295346133,39.50298289009489,121112000 +2018-04-04,40.4384765625,40.53273181423707,38.82668802678752,38.85260876035632,138422000 +2018-04-05,40.718894958496094,41.05586093377513,40.54923261151675,40.66705348605198,107732800 +2018-04-06,39.6773681640625,40.64349740445966,39.634950769566224,40.28767957433702,140021200 +2018-04-09,40.070892333984375,40.787241886930794,40.02376468896047,40.03083365593361,116070800 +2018-04-10,40.82493209838867,41.001663406173904,40.4196280115526,40.76602166246026,113634400 +2018-04-11,40.63405990600586,40.982808654567776,40.459683733921196,40.584573561357715,89726400 +2018-04-12,41.03464889526367,41.237300917884426,40.77544156553691,40.862631446776255,91557200 +2018-04-13,41.17369079589844,41.43525333828606,40.96632845646567,41.185473605045516,100497200 +2018-04-16,41.430545806884766,41.51773212819286,41.197259114671375,41.244386758740376,86313600 +2018-04-17,42.00079345703125,42.16574198899704,41.56956855485818,41.588420329312605,106421600 +2018-04-18,41.90652847290039,42.13745997958061,41.68031440365616,41.89945950796199,83018000 +2018-04-19,40.718894958496094,41.329206225642714,40.68590525745054,40.94510902406339,139235200 +2018-04-20,39.050559997558594,40.34658991793335,38.98222186094349,40.2004931502313,261964400 +2018-04-23,38.93745422363281,39.33333074102967,38.6664639830638,39.31212384094241,146062000 +2018-04-24,38.39546585083008,39.19429120893321,37.99016176869321,39.03876679693956,134768000 +2018-04-25,38.562774658203125,38.979861602588485,38.27058116128908,38.32006392000796,113528400 +2018-04-26,38.69709396362305,39.05291176219348,38.49679700945855,38.67352834703607,111852000 +2018-04-27,38.2493782043457,38.72301692176556,37.85114299222857,38.64525469730407,142623200 +2018-04-30,38.94215393066406,39.413437426066245,38.136259584999245,38.20459770537288,169709600 +2018-05-01,39.847023010253906,39.870585028863154,38.94451463897729,39.21314610125641,214277600 +2018-05-02,41.60725784301758,41.885313330798986,40.95452930923599,41.29149522364299,266157600 +2018-05-03,41.682674407958984,41.826416037885345,41.10535276486756,41.444677504077866,136272800 +2018-05-04,43.31802749633789,43.416996609374756,41.984294200235574,42.00314597351994,224805200 +2018-05-07,43.631431579589844,44.222891135779996,43.53481758965198,43.636141826215024,169805600 +2018-05-08,43.841156005859375,43.88121467892142,43.28032739177404,43.59137628229113,113611200 +2018-05-09,44.14985275268555,44.15927684367673,43.64557938784763,43.95898344853604,92844800 +2018-05-10,44.7813606262207,44.85912284220606,44.218176936758304,44.23938742883291,111957200 +2018-05-11,44.611045837402344,44.95877526691211,44.34137848487162,44.82394339538335,104848800 +2018-05-14,44.50697326660156,44.833414097957146,44.438375212644104,44.71040683245773,83115200 +2018-05-15,44.10245132446289,44.25147921179702,43.78547469663136,44.18287758355946,94780800 +2018-05-16,44.51405715942383,44.58029459901324,43.99837896645012,44.01493922871573,76732400 +2018-05-17,44.23255920410156,44.686735524679,44.083531301757894,44.471473801176494,69176000 +2018-05-18,44.07170486450195,44.42653046786745,44.029127524644984,44.27987037350764,73190800 +2018-05-21,44.38395690917969,44.7718994575301,44.21364031629678,44.471479410434824,73603200 +2018-05-22,44.27278137207031,44.67964841905627,44.18289104952335,44.56137319864113,60962800 +2018-05-23,44.556636810302734,44.589753724392864,43.94160428065987,44.081171770264554,80233600 +2018-05-24,44.50697326660156,44.670193682279354,44.04806834778559,44.65363702489957,92936000 +2018-05-25,44.60869216918945,44.86179931844587,44.38869833492638,44.52589805328392,69844000 +2018-05-29,44.44782638549805,44.64889570398078,44.20417972021564,44.376864140831934,90056400 +2018-05-30,44.35319900512695,44.47147420247396,44.18288243218946,44.405240380717444,74762000 +2018-05-31,44.20417404174805,44.52588274430976,44.03149325278761,44.28696812918716,109931200 +2018-06-01,45.001346588134766,45.00607499701949,44.41233482946836,44.469108221336874,93770000 +2018-06-04,45.377464294433594,45.753578569376124,45.263921111511316,45.332519140294664,105064800 +2018-06-05,45.727561950683594,45.87658987304601,45.502839769459946,45.670792158905925,86264000 +2018-06-06,45.886043548583984,45.90970003132506,45.398750323686826,45.80325307793522,83734400 +2018-06-07,45.763038635253906,45.93808360842761,45.49809975213111,45.92389116297811,85388800 +2018-06-08,45.34672164916992,45.417687507795556,44.890181002081555,45.221350196369826,106627200 +2018-06-11,45.235530853271484,45.410579444316305,44.99425205010877,45.263919355004944,73234000 +2018-06-12,45.483917236328125,45.5619793128146,45.21661409043262,45.273387494097285,67644400 +2018-06-13,45.11016845703125,45.62585029625447,45.048666641672256,45.5170355050327,86553600 +2018-06-14,45.13383483886719,45.31597972934209,44.99663511963049,45.31124770882384,86440400 +2018-06-15,44.67018127441406,44.98242956714809,44.532981595134544,44.95167685694679,246876800 +2018-06-18,44.64652633666992,44.76006952448041,44.282236678630035,44.44309283671168,73939600 +2018-06-19,43.925052642822266,44.076444783013294,43.395178347417,43.79494917637529,134314000 +2018-06-20,44.11665344238281,44.28223801491003,43.934508607866384,44.08117232308161,82514800 +2018-06-21,43.870643615722656,44.55427420282024,43.74763638348965,44.294067290302934,102847600 +2018-06-22,43.74291229248047,44.03386835868544,43.69087090054479,44.02677213337364,108801600 +2018-06-25,43.0923957824707,43.74290953112811,42.75176255111252,43.383351830308534,126652400 +2018-06-26,43.62699508666992,44.123752445008655,43.17991490795434,43.28636549150779,98276800 +2018-06-27,43.5631217956543,44.30115787617731,43.53236908914164,43.81622884246029,101141200 +2018-06-28,43.88011169433594,44.048064114326344,43.47797662172733,43.54894248382854,69460800 +2018-06-29,43.7878532409668,44.27987860220529,43.26744298121546,44.066981034938806,90950800 +2018-07-02,44.27750778198242,44.30589628804153,43.38807946404778,43.482701801789624,70925200 +2018-07-03,43.506343841552734,44.45964154880952,43.41645354545822,44.421792623141066,55819200 +2018-07-05,43.8564567565918,44.095375047142554,43.59152137880558,43.82333983436852,66416800 +2018-07-06,44.46438217163086,44.57319334214451,43.809136505897534,43.86117788639464,69940800 +2018-07-09,45.081787109375,45.10543998969581,44.77900280926949,44.826312179384686,79026400 +2018-07-10,45.027374267578125,45.24736442747198,44.98715751950538,45.11253256386964,63756400 +2018-07-11,44.44308090209961,44.89252512320031,44.37921129696319,44.58974096403253,75326000 +2018-07-12,45.1882209777832,45.278111281541236,44.78135401584082,44.83339539070363,72164400 +2018-07-13,45.25919723510742,45.379836663073824,45.15747866647142,45.2000596236482,50055600 +2018-07-16,45.15984344482422,45.57143888284523,45.04393243474662,45.3041393514624,60172400 +2018-07-17,45.28758239746094,45.386933152154526,44.75534389122667,44.885447359089724,62138000 +2018-07-18,45.03919982910156,45.370372592380185,44.92802083972261,45.36564057319066,65573600 +2018-07-19,45.389305114746094,45.54779349572749,44.87125901048559,44.87125901048559,81147200 +2018-07-20,45.28521728515625,45.51939991314476,44.98479721255897,45.36564356932456,82704800 +2018-07-23,45.32541275024414,45.40820681661029,44.840483810396506,45.10541904761313,63957600 +2018-07-24,45.65422439575195,45.81034851643568,45.42950225144973,45.524120961848844,74791600 +2018-07-25,46.08476257324219,46.09185879831872,45.519403506005766,45.66843145156004,66839600 +2018-07-26,45.940460205078125,46.35442345403334,45.79852850450425,46.035078932478655,76304000 +2018-07-27,45.1764030456543,46.172282008820225,44.96824110817268,46.12497264164137,96096000 +2018-07-30,44.92329788208008,45.464996837149044,44.72459636568152,45.3940309785857,84118000 +2018-07-31,45.013179779052734,45.45079951875537,44.788457592235076,45.015547593417764,157492000 +2018-08-01,47.6649055480957,47.72640735261857,46.67375879565938,47.10428225573744,271742800 +2018-08-02,49.05818557739258,49.29237176452415,47.3928724084301,47.4472779878545,249616000 +2018-08-03,49.20012664794922,49.377539475543834,48.60638274153638,48.973036640459895,133789600 +2018-08-06,49.45560073852539,49.49817808389991,48.982499872729456,49.20249004277745,101701600 +2018-08-07,48.99196243286133,49.55731784769959,48.909168333956515,49.5147405004731,102349600 +2018-08-08,49.025081634521484,49.157549311361976,48.37929990518736,48.74122181136708,90102000 +2018-08-09,49.41065216064453,49.62354609173593,49.01324558394157,49.56440848760244,93970400 +2018-08-10,49.26346969604492,49.63615802396937,49.05932275702003,49.223115531859115,98444800 +2018-08-13,49.581565856933594,50.075316755482326,49.303831655649645,49.68601364999049,103563600 +2018-08-14,49.790462493896484,49.982739743294864,49.43676493669465,49.88778917785652,82992000 +2018-08-15,49.90678024291992,50.02547026132497,49.453383503301005,49.6646515911767,115230400 +2018-08-16,50.637908935546875,50.754222830238795,50.19875443815532,50.265220555731204,114001600 +2018-08-17,51.649147033691406,51.73697648515084,50.599927742417734,50.66639386062462,141708000 +2018-08-20,51.14590835571289,52.02895882987938,51.0628238874286,51.772591557395934,121150800 +2018-08-21,51.04619598388672,51.556565180937454,50.80644347668684,51.46398712151061,104639200 +2018-08-22,51.0485725402832,51.35953977789525,50.761341130701624,50.82306225227025,76072400 +2018-08-23,51.153018951416016,51.523331182353516,50.94175089032313,50.95361699295382,75532800 +2018-08-24,51.31207275390625,51.48773167368857,51.06282297563626,51.416520556010404,73905600 +2018-08-27,51.73460006713867,51.924504799962136,51.35241810535412,51.547067830452825,82100400 +2018-08-28,52.15239334106445,52.351791702590354,51.967237202200124,51.98860053619249,91107200 +2018-08-29,52.93101119995117,53.05207736343503,52.08356616622765,52.259225113819596,109019200 +2018-08-30,53.417625427246094,54.18436187501415,52.79331481770957,52.99508928286878,195175200 +2018-08-31,54.03481674194336,54.329165657459775,53.64788613858732,53.768948648472445,173360400 +2018-09-04,54.208099365234375,54.40274909041703,53.79743296109522,54.21996909019062,109560400 +2018-09-05,53.854408264160156,54.51907309748186,53.434248203257766,54.357656409659185,133332000 +2018-09-06,52.95949172973633,53.96835696368413,52.532206906226115,53.70248883898211,137160000 +2018-09-07,52.532196044921875,53.49833078569919,52.392142710712896,52.66275577263001,150479200 +2018-09-10,51.827186584472656,52.66276537198232,51.38565954800738,52.449121154390156,158066000 +2018-09-11,53.13751983642578,53.24434012282994,51.40701743257789,51.75121774304983,142996000 +2018-09-12,52.477603912353516,53.41050567281546,52.18562387340728,53.39626345084379,197114800 +2018-09-13,53.745216369628906,54.20573423228745,52.83367787441951,53.05918819069494,166825600 +2018-09-14,53.1351432800293,53.84728334636249,52.82180353435116,53.588539991573036,127997200 +2018-09-17,51.720359802246094,52.92387461747475,51.57555784548122,52.7339698774686,148780400 +2018-09-18,51.80582046508789,52.66276254166142,51.53995236118201,51.69899655096694,126286800 +2018-09-19,51.836666107177734,52.13339108809464,51.107911437553994,51.86752666427505,108495200 +2018-09-20,52.23072052001953,52.764825513984114,52.02182496329803,52.280571913194,106435200 +2018-09-21,51.66813659667969,52.54644195601363,51.58030352525411,52.408761108227836,384986800 +2018-09-24,52.4111328125,52.522701711224435,51.423634686068496,51.46873746922922,110773600 +2018-09-25,52.743473052978516,52.89302364119019,52.152395433880415,52.16426516061868,98217600 +2018-09-26,52.32329559326172,53.11377137395213,52.16662393464608,52.46097641851809,95938800 +2018-09-27,53.39863967895508,53.75233724520771,53.063932950702444,53.130402694768456,120724800 +2018-09-28,53.5861701965332,53.60990602666179,53.17787624815003,53.360656266454455,91717600 +2018-10-01,53.94697952270508,54.45972121127921,53.73096646740976,54.11077230839944,94403200 +2018-10-02,54.426490783691406,54.59740468813785,53.79743517852857,53.94460963208403,99152800 +2018-10-03,55.088775634765625,55.42110616960169,54.54517343305305,54.609267044104,114619200 +2018-10-04,54.12027359008789,55.155250651361975,53.82117243828827,54.78256227082808,128168000 +2018-10-05,53.24196243286133,54.219970566201916,52.36128459795892,54.11315028295081,134322000 +2018-10-08,53.1185302734375,53.36303141431904,52.2710818285735,52.74821800655406,118655600 +2018-10-09,53.854408264160156,53.94936245299579,52.75771364356512,53.087671752738586,107564000 +2018-10-10,51.35954666137695,53.73097461398449,51.28595942699632,53.51970651890085,167962400 +2018-10-11,50.90615463256836,52.10492469508215,50.40053755301917,50.92277297587826,212497600 +2018-10-12,52.7244758605957,52.90725948836735,51.47348215349086,52.32330305126062,161351600 +2018-10-15,51.596920013427734,52.65800896630272,51.57555668146875,52.498964791499894,123164000 +2018-10-16,52.73398208618164,52.93338410152508,51.454503629879284,51.96961795674049,116736000 +2018-10-17,52.50609588623047,52.850296247724266,52.06694132775518,52.769587896889185,91541600 +2018-10-18,51.278839111328125,52.161893181865885,50.561950350379284,51.71561753142815,130325200 +2018-10-19,52.059810638427734,52.52270094439236,51.613535050045634,51.763085618946356,132314800 +2018-10-22,52.377899169921875,53.02120060810518,51.97198137027068,52.173752210932165,115168400 +2018-10-23,52.87165832519531,52.995096967266804,50.965496784519516,51.23373740417521,155071200 +2018-10-24,51.058067321777344,53.22772054648877,50.92750758714553,52.840793579292914,163702000 +2018-10-25,52.17612838745117,52.55118924843808,51.4521186121958,51.68000502193236,119423200 +2018-10-26,51.34531021118164,52.268718544814504,50.483619392196715,51.25035600926278,189033600 +2018-10-29,50.381534576416016,52.15001492473634,48.92164534308454,52.031324919854015,183742000 +2018-10-30,50.6331672668457,51.07943931434312,49.676525919645115,50.12279796714253,146640000 +2018-10-31,51.9529914855957,52.33042484927199,51.421258935154796,51.48298005871331,153435600 +2018-11-01,52.75058364868164,52.783816703644504,51.46635698523949,51.99808948677657,233292800 +2018-11-02,49.25161361694336,50.71624814601477,48.76498377166749,49.742992077595275,365314800 +2018-11-05,47.85342788696289,48.518092535778024,47.041588813972105,48.496729207519806,264654800 +2018-11-06,48.37092590332031,48.59643618956618,47.8771750452981,47.931771433685064,127531600 +2018-11-07,49.83794021606445,49.8640521661579,48.456390224013916,48.893168641820594,133697600 +2018-11-08,49.66404342651367,50.052320434232975,49.24955972898359,50.01897142188709,101450400 +2018-11-09,48.70644760131836,49.07328675547109,48.177624925691106,48.96371298146972,137463200 +2018-11-12,46.25290298461914,47.60592795463001,46.16238267177907,47.40344945530987,204542000 +2018-11-13,45.790771484375,46.96990161049006,45.60496933770327,45.647848713349546,187531600 +2018-11-14,44.497310638427734,46.3267486160085,44.29006694824558,46.18858736747711,243204000 +2018-11-15,45.59544372558594,45.7288397690571,44.521122151289326,44.87605376570121,185915200 +2018-11-16,46.10045623779297,46.44347680282728,45.13095025792429,45.378685313354325,147713200 +2018-11-19,44.27338790893555,45.426315029572415,44.06614788324076,45.25956997241744,167701200 +2018-11-20,42.15810012817383,43.22765660758675,41.80793366785621,42.48920949003139,271300800 +2018-11-21,42.1104621887207,42.941810448552935,42.05567529849002,42.81317593350857,124496800 +2018-11-23,41.0409049987793,42.067585789740626,40.995648476539905,41.67215915297066,94496000 +2018-11-26,41.5959358215332,41.674545003582075,40.5573473972905,41.505419131258876,179994000 +2018-11-27,41.50539779663086,41.631647850998014,40.70501810463736,40.85508679798269,165549600 +2018-11-28,43.10140609741211,43.18477681325932,41.66977203052576,42.09854765484089,184250000 +2018-11-29,42.77030944824219,43.54448657630783,42.32962255220415,43.51113755310507,167080000 +2018-11-30,42.53923416137695,42.95609864238887,42.17001060838386,42.94656827592321,158126000 +2018-12-03,44.025657653808594,44.05424148532072,43.16572558637516,43.93990252450219,163210000 +2018-12-04,42.08901596069336,43.446802248630206,41.98896893261058,43.103781789621024,165377200 +2018-12-06,41.619754791259766,41.63404670780796,40.59545836632005,40.91465661846375,172393600 +2018-12-07,40.13572311401367,41.56497310411977,40.09046294943033,41.326764772435425,169126400 +2018-12-10,40.40012741088867,40.51684714665778,38.90656041585195,39.30436782371349,248104000 +2018-12-11,40.1690673828125,40.921802859456115,39.78078668497636,40.89083825164452,189126800 +2018-12-12,40.281028747558594,40.95277432624251,40.26197164560557,40.590696658676194,142510800 +2018-12-13,40.721710205078125,41.1076101421206,40.38822002222205,40.6121364170413,127594400 +2018-12-14,39.418701171875,40.276252347094136,39.37106024764494,40.257195250448206,162814800 +2018-12-17,39.05187225341797,40.10237180865223,38.7636385891992,39.411565505255,177151600 +2018-12-18,39.55925750732422,39.907039619582285,39.15906563903421,39.394893184710675,135366000 +2018-12-19,38.32533264160156,39.88797848357411,37.896556981360284,39.54257718093563,196189200 +2018-12-20,37.358211517333984,38.61595116475634,36.99375307602242,38.20861333547078,259092000 +2018-12-21,35.90513610839844,37.675025670788216,35.643109158770635,37.36535415325516,382978400 +2018-12-24,34.97611999511719,36.10046329698791,34.9189487029854,35.29055301491782,148676800 +2018-12-26,37.43919372558594,37.45348564036244,34.94991800671452,35.32628751316479,234330000 +2018-12-27,37.196224212646484,37.343915828787566,35.74792096197973,37.12238022196103,212468400 +2018-12-28,37.215274810791016,37.760773752408824,36.815086685468714,37.51780031359483,169165600 +2018-12-31,37.57496643066406,37.9608625890663,37.274821743223185,37.76314932766654,140014000 +2019-01-02,37.61785125732422,37.839386848487095,36.73886211985297,36.896080457482114,148158800 +2019-01-03,33.87083435058594,34.71170924937219,33.8255741979129,34.29722555279616,365248800 +2019-01-04,35.31676483154297,35.385847281021086,34.25435774125792,34.428248800159444,234428400 +2019-01-07,35.23815155029297,35.45254119796696,34.754588999265515,35.42157295630101,219111200 +2019-01-08,35.90989685058594,36.16478144522651,35.37869342403088,35.62642842655381,164101200 +2019-01-09,36.519710540771484,36.81032493088937,35.64310582188923,36.038528801184015,180396400 +2019-01-10,36.63642883300781,36.67692379851318,35.93609601066579,36.32675738734217,143122800 +2019-01-11,36.276737213134766,36.61261175890216,36.09093504627831,36.417282860183526,108092800 +2019-01-14,35.73124313354492,36.03376867647788,35.54544096003209,35.93372163187635,129756800 +2019-01-15,36.46254348754883,36.53876824774425,35.74315345783549,35.79555957068169,114843600 +2019-01-16,36.90798568725586,37.13190201684626,36.44586111508322,36.46491821066211,122278800 +2019-01-17,37.127140045166016,37.555915645850185,36.507797106981144,36.73171345593675,119284800 +2019-01-18,37.355831146240234,37.60833138833237,37.15573339148389,37.517811062008555,135004000 +2019-01-22,36.517330169677734,37.33438282804455,36.35534664867075,37.25815806827708,121576000 +2019-01-23,36.66502380371094,36.955638241924085,36.13620104793098,36.719810699015575,92522400 +2019-01-24,36.37440872192383,36.798419228909076,36.14573077657716,36.7102833160953,101766000 +2019-01-25,37.57973861694336,37.66787815610995,36.760305150477386,37.03662400515112,134142000 +2019-01-28,37.231956481933594,37.23910243985736,36.6030867412518,37.11046792768946,104768400 +2019-01-29,36.84605407714844,37.667875530253525,36.71027725105051,37.22004281201305,166348800 +2019-01-30,39.36392593383789,39.57831197366916,38.168119117688406,38.887509281083425,244439200 +2019-01-31,39.64738845825195,40.25720110045901,39.19955570891924,39.56877928620291,162958400 +2019-02-01,39.666446685791016,40.25243706170224,39.52590102795281,39.77125891817062,130672400 +2019-02-04,40.79317092895508,40.89083720323202,39.847483697513894,39.87845193930174,125982000 +2019-02-05,41.49110412597656,41.7054936950776,41.05518630181897,41.176671179971386,144406400 +2019-02-06,41.50539779663086,41.822215136666685,41.174288546254395,41.60306039554809,112958400 +2019-02-07,40.719329833984375,41.43395477698931,40.576403391475225,41.06711193744201,126966800 +2019-02-08,40.76716995239258,40.826977430058655,40.29110111604144,40.42746391729229,95280000 +2019-02-11,40.532711029052734,40.95854351298288,40.48965140897267,40.9202658615621,83973600 +2019-02-12,40.881996154785156,40.90831158895614,40.597311998851445,40.69300614599975,89134000 +2019-02-13,40.71214294433594,41.26237244865827,40.649944483984534,41.001612731729914,89960800 +2019-02-14,40.86046600341797,40.970509708782465,40.52075999715096,40.599706299012496,87342800 +2019-02-15,40.76956558227539,41.0757796107842,40.609281961912124,40.968126868792055,98507200 +2019-02-19,40.89155960083008,41.01356916978629,40.54707165707809,40.59970252008703,75891200 +2019-02-20,41.15471649169922,41.46332508505415,40.90591901946894,40.95376426601034,104457600 +2019-02-21,40.922672271728516,41.23606290385882,40.74085883448169,41.09970373851349,68998800 +2019-02-22,41.37959671020508,41.38677331528308,40.99922203963624,41.04706729027582,75652800 +2019-02-25,41.681034088134766,42.07337106879654,41.614049992682226,41.66428988945135,87493600 +2019-02-26,41.7049560546875,41.937009389498,41.42744844702722,41.55663465937493,68280800 +2019-02-27,41.834129333496094,41.86523038704116,41.3221775193489,41.4370104938114,111341600 +2019-02-28,41.42265319824219,41.843700132789515,41.3676313466987,41.70255537648484,112861600 +2019-03-01,41.858062744140625,41.90112238101423,41.36046403267698,41.692993502073456,103544800 +2019-03-04,42.06858825683594,42.52312370265589,41.6188347817674,42.03031058866854,109744800 +2019-03-05,41.992027282714844,42.10446563638617,41.75518834938098,42.09011242534028,78949600 +2019-03-06,41.75040817260742,41.98246149544059,41.611654375939004,41.78629120176347,83241600 +2019-03-07,41.26716232299805,41.731268964485146,41.1523329803737,41.59490615420206,99185600 +2019-03-08,41.365234375,41.403512027211185,40.54945970774359,40.74562993755753,95997600 +2019-03-11,42.79822540283203,42.85085627009745,41.94896222270755,41.98245426093479,128044000 +2019-03-12,43.27908706665039,43.70013042498477,42.91067093404369,43.06138695650634,129870400 +2019-03-13,43.47046661376953,43.8508412776213,43.281472949096475,43.59964915325102,124130000 +2019-03-14,43.953712463378906,44.04223001659465,43.67381389321422,43.99438111199851,94318000 +2019-03-15,44.525482177734375,44.81495205623566,43.956117314378744,44.22166273502183,156171600 +2019-03-18,44.980018615722656,45.06853253381992,44.44653317056252,44.44892780641998,104879200 +2019-03-19,44.62356948852539,45.212076866732026,44.47763904944211,45.05896982001842,126585600 +2019-03-20,45.01350784301758,45.331684111556115,44.19294722407938,44.55179214569076,124140800 +2019-03-21,46.671363830566406,46.96801024304123,45.40823015544598,45.458470044388214,204136800 +2019-03-22,45.704872131347656,47.29335848679614,45.640279037651645,46.731166773875984,169630800 +2019-03-25,45.15225601196289,45.927358609615716,44.64030413374622,45.814920256190476,175381200 +2019-03-26,44.68574905395508,46.14266184225436,44.15705304708854,45.85080108764559,199202000 +2019-03-27,45.08765411376953,45.396259041437204,44.62833319914236,45.15463818567194,119393600 +2019-03-28,45.1474723815918,45.34842464537016,44.86278818272628,45.202494243025605,83121600 +2019-03-29,45.44172668457031,45.47282774509854,45.10441159077078,45.41302025968838,94256000 +2019-04-01,45.75033187866211,45.8555899786877,45.06613415152161,45.84602238790681,111448000 +2019-04-02,46.415401458740234,46.5206632333561,45.704888130442924,45.71445572342629,91062800 +2019-04-03,46.73357009887695,47.00868306890755,46.207261312169265,46.23118576624114,93087200 +2019-04-04,46.81490707397461,46.97758167937359,46.20487000301009,46.59959793991464,76457200 +2019-04-05,47.12830352783203,47.15222798469051,46.872325710812824,46.99672631582962,74106400 +2019-04-08,47.869911193847656,47.90100860298469,46.97040430689956,46.98954313963878,103526800 +2019-04-09,47.726356506347656,48.52777798802599,47.661763422810274,47.92252674140269,143072800 +2019-04-10,47.994300842285156,48.02301091221339,47.41057930864462,47.5301942573297,86781200 +2019-04-11,47.59478759765625,48.08520961987092,47.47278166349611,48.0493265952234,83603200 +2019-04-12,47.575645446777344,47.87946841889986,46.93929673517641,47.65459174584973,111042800 +2019-04-15,47.66176986694336,47.810094880689405,47.369909109700444,47.50627189889882,70146400 +2019-04-16,47.666561126708984,48.17372738438398,47.50149189935205,47.71680101561021,102785600 +2019-04-17,48.59477615356445,48.65458363520854,47.51345586333893,47.73593794288261,115627200 +2019-04-18,48.769405364990234,48.83878042671001,48.44883818950445,48.59237393282901,96783200 +2019-04-22,48.92969512939453,49.02778027244778,48.405781021781074,48.523004996431936,77758000 +2019-04-23,49.63542175292969,49.70001485209425,48.77897821899976,48.90576978194872,93292000 +2019-04-24,49.55886459350586,49.874646148239904,49.53254915974815,49.60670984114939,70162400 +2019-04-25,49.10911560058594,49.70240475489666,49.07083793892493,49.47992269091466,74172800 +2019-04-26,48.87467575073242,49.04213597276273,48.353152601713404,49.01821151946166,74596400 +2019-04-29,48.94883728027344,49.27419013877787,48.76941482853259,48.89859738762798,88818800 +2019-04-30,48.00627136230469,48.65936807287442,47.633073241979126,48.57803076980022,186139600 +2019-05-01,50.3626823425293,51.508592020453015,50.054073710339814,50.209575344115216,259309200 +2019-05-02,50.034934997558594,50.87223969563154,49.79092311380709,50.200004222093234,127985200 +2019-05-03,50.65694046020508,50.678470279001594,50.29330992452947,50.45120256308905,83569600 +2019-05-06,49.87464904785156,49.9607719587603,48.68328515557956,48.87227517238446,129772400 +2019-05-07,48.53017044067383,49.62105803833619,48.0445341079457,49.252645653298934,155054800 +2019-05-08,48.53975296020508,49.12347459298433,48.2646399916479,48.300523022204345,105358000 +2019-05-09,48.01823043823242,48.247889120119275,47.046957534876604,47.94167511069751,139634400 +2019-05-10,47.35300827026367,47.7540639685717,46.293944343440415,47.41064587308777,164834800 +2019-05-13,44.60088348388672,45.503850723802664,43.91165067654419,45.07878571600781,229722400 +2019-05-14,45.306922912597656,45.556678529738576,44.52643157045996,44.76658275265618,146118800 +2019-05-15,45.84966278076172,46.048988699608614,44.672923466199215,44.73296126111396,106178800 +2019-05-16,45.64793014526367,46.221891236040925,45.35014140585695,45.60710489028637,132125600 +2019-05-17,45.38856887817383,45.84485461277008,44.85062896487243,44.89145422201707,131516400 +2019-05-20,43.96928024291992,44.27187308579342,43.294455989235885,44.07254715951819,154449200 +2019-05-21,44.812217712402344,45.14842794409167,44.35592821006204,44.480807866582374,113459200 +2019-05-22,43.89482498168945,44.59846972587299,43.83959124564455,44.34631029653192,118994400 +2019-05-23,43.145565032958984,43.35689559500795,42.70128385170774,43.17918605404062,146118800 +2019-05-24,42.979862213134766,43.741141106736286,42.89580782412961,43.275247174479105,94858800 +2019-05-28,42.80214309692383,43.36890001918463,42.72529662605627,42.96784799476519,111792800 +2019-05-29,42.598026275634766,43.071124491062065,42.2666164062,42.36747948289385,113924800 +2019-05-30,42.8189582824707,43.04229713219423,42.4275106667513,42.73490389947276,84873600 +2019-05-31,42.043270111083984,42.74451113812914,42.024057576373885,42.32184270333962,108174400 +2019-06-03,41.61819839477539,42.727695624920145,40.89054064456149,42.17054681734326,161584400 +2019-06-04,43.1407470703125,43.1863763694402,41.91117450795282,42.132113098725874,123872000 +2019-06-05,43.837196350097656,44.425569693638934,43.50098615185949,44.25506073740765,119093600 +2019-06-06,44.48080825805664,44.540846061702176,43.74354227036945,43.96688480542754,90105200 +2019-06-07,45.66475296020508,46.08982164511094,44.612893109722116,44.79060266707343,122737600 +2019-06-10,46.248313903808594,46.9183340723606,46.01776716255535,46.06339647229206,104883600 +2019-06-11,46.78384780883789,47.069628281137064,46.49326695162422,46.79585609995607,107731600 +2019-06-12,46.63496017456055,47.06242899962698,46.442838489668404,46.57732256976799,73012800 +2019-06-13,46.62535095214844,47.259349931934366,46.49327073235591,46.75743483635723,86698400 +2019-06-14,46.28673553466797,46.49086182041793,45.700766122555855,46.00095507020215,75046000 +2019-06-17,46.56290817260742,46.81987167221263,46.14984788508107,46.32515720549366,58676400 +2019-06-18,47.65800857543945,48.09988593799159,46.87992097277521,47.081647116842475,106204000 +2019-06-19,47.51871871948242,48.001424996498194,47.3842346282757,47.953391822995805,84496800 +2019-06-20,47.90055847167969,48.17673087730708,47.5571403608846,48.11909327191323,86056000 +2019-06-21,47.737247467041016,48.23436212898712,47.585951063072045,47.74205151629512,191202400 +2019-06-24,47.689231872558594,48.06867125711626,47.59076898842806,47.67962377124895,72881600 +2019-06-25,46.966373443603516,47.852528321808336,46.89912773419168,47.653202379709434,84281200 +2019-06-26,47.982208251953125,48.267988752912856,47.39383857231526,47.49470163187464,104270000 +2019-06-27,47.967796325683594,48.40727340936007,47.92697106624909,48.09987653850626,83598800 +2019-06-28,47.53071975708008,47.91015905044259,47.321789409022124,47.71323332951101,124442400 +2019-07-01,48.40247344970703,49.10851854004472,48.18633517839463,48.79151720788642,109012000 +2019-07-02,48.68584060668945,48.78190326335242,48.356834710606,48.36884300074083,67740800 +2019-07-03,49.08930206298828,49.09650630501188,48.67624175302726,48.81793006537936,45448000 +2019-07-05,49.04607009887695,49.250200049470095,48.72666861818277,48.83473957109436,69062000 +2019-07-08,48.03504180908203,48.36644795781788,47.64839824854326,48.224759635887956,101354400 +2019-07-09,48.32802963256836,48.39286781929582,47.744460301105185,47.8381191241281,82312000 +2019-07-10,48.80592727661133,48.926002876430864,48.40487521294406,48.47452111291263,71588400 +2019-07-11,48.450504302978516,49.08450332051518,48.44089986738066,48.82513958637521,80767200 +2019-07-12,48.822731018066406,48.990836095314215,48.55856327923709,48.61860106856959,70380800 +2019-07-15,49.28142547607422,49.43992247061237,48.99084093465787,49.01245366149268,67789600 +2019-07-16,49.110923767089844,49.49756737217515,48.87077255062486,49.13253649711167,67467200 +2019-07-17,48.83474349975586,49.25260420414418,48.815530965790764,49.00284859143025,56430000 +2019-07-18,49.389488220214844,49.44232176832759,48.918790336414695,48.990836416969884,74162400 +2019-07-19,48.652225494384766,49.59121746482509,48.5969917503636,49.420708518825705,83717200 +2019-07-22,49.76414108276367,49.766541276013875,48.89719494520883,48.90679938262681,89111600 +2019-07-23,50.15316390991211,50.16997624887019,49.78092890474625,50.06190896721962,73420800 +2019-07-24,50.11235427856445,50.22762583730171,49.75212745114584,49.87220306028538,59966400 +2019-07-25,49.71610641479492,50.24924241446475,49.64646050916756,50.165188021994986,55638400 +2019-07-26,49.88900375366211,50.36690222120476,49.744911590578496,49.82656210626511,70475600 +2019-07-29,50.35491180419922,50.58545861408474,50.05712660260124,50.06193065358685,86693600 +2019-07-30,50.138771057128906,50.47018091095403,49.78574847311957,50.13396700672682,135742800 +2019-07-31,51.161808013916016,53.162267870594626,50.74394728765502,51.973520210453195,277125600 +2019-08-01,50.05470657348633,52.36015926983902,49.64885417454468,51.368333765734086,216071600 +2019-08-02,48.99564743041992,49.57440902069414,48.42168622562673,49.3582744127231,163448400 +2019-08-05,46.43082809448242,47.70603026938217,46.24831451752972,47.547533276109434,209572000 +2019-08-06,47.30978012084961,47.566743629664266,46.59893105085319,47.14407522853601,143299200 +2019-08-07,47.79969024658203,47.924569888809515,46.546104432236135,46.92794393689847,133457600 +2019-08-08,48.85395050048828,48.87796708312998,47.883741391069506,48.07826325145281,108038000 +2019-08-09,48.45138168334961,48.87806167207008,48.04157055812912,48.526110822221355,98478800 +2019-08-12,48.32844161987305,48.70691333240439,48.007826510055274,48.121126724740485,89927600 +2019-08-13,50.37507247924805,51.13924382722564,48.328440715985266,48.45861715007124,188874000 +2019-08-14,48.87566375732422,49.765189373057275,48.837092683641366,48.97450075425901,146189600 +2019-08-15,48.63216781616211,49.45178251451384,48.1331644413679,49.04679746685909,108909600 +2019-08-16,49.779632568359375,49.9387354245026,49.13840252027078,49.24447109103293,110481600 +2019-08-19,50.70773696899414,51.281465917613836,50.63059484038089,50.77282150188003,97654400 +2019-08-20,50.710147857666016,51.43092947115553,50.700506930459206,50.83550198139012,107537200 +2019-08-21,51.25977325439453,51.50324621130385,51.00906868241241,51.34414700136294,86141600 +2019-08-22,51.21637725830078,51.69368218603731,50.80415685820638,51.39235266730536,89014800 +2019-08-23,48.84914016723633,51.117550102338555,48.453795909930676,50.48596080860985,187272000 +2019-08-26,49.777225494384766,49.94596928348397,49.43250262391042,49.62535424502612,104174400 +2019-08-27,49.21556091308594,50.27383030226185,49.06368962032814,50.1074957774966,103493200 +2019-08-28,49.54581069946289,49.59161338058128,49.01306210348635,49.20109145245917,63755200 +2019-08-29,50.384700775146484,50.45943357956164,49.81820353268084,50.26175966563386,83962000 +2019-08-30,50.31963348388672,50.73185031351082,49.9483933597934,50.66194346534093,84573600 +2019-09-03,49.5867805480957,49.89534165413595,49.230007458925144,49.76275594177368,80092000 +2019-09-04,50.428104400634766,50.49801123909702,49.9773165623172,50.23525274929369,76752400 +2019-09-05,51.41404724121094,51.580381723216085,50.98736361498107,51.10548610990879,95654800 +2019-09-06,51.40923309326172,51.68886781233936,51.228435354290056,51.599675438181954,77449200 +2019-09-09,51.628597259521484,52.175812730232884,50.88130221260114,51.79010945042045,109237600 +2019-09-10,52.238502502441406,52.25778803963848,51.03559700628758,51.55388248447593,127111600 +2019-09-11,53.89942169189453,53.92835183174027,52.486788527686315,52.56875296585321,177158400 +2019-09-12,53.778892517089844,54.58163496853874,53.723448903688286,54.19111300558401,128906800 +2019-09-13,52.732669830322266,53.22443802421354,52.31563077428485,53.03399937220982,159053200 +2019-09-16,53.0098876953125,53.065334975405115,52.44579971658606,52.48678008991177,84632400 +2019-09-17,53.202735900878906,53.231666034212545,52.82185497064391,53.024351190624856,73274800 +2019-09-18,53.70174026489258,53.721025794674944,52.89899801960268,53.2895198822642,101360000 +2019-09-19,53.26541519165039,53.94039033553317,53.123184870732054,53.518529031437104,88242400 +2019-09-20,52.48678207397461,53.65111982484979,52.42410685563765,53.36666651277552,221652400 +2019-09-23,52.72544479370117,52.99543491984833,52.46750490806162,52.780888406390766,76662000 +2019-09-24,52.474735260009766,53.63425454373812,52.35661642183471,53.28229998490953,124763200 +2019-09-25,53.28229522705078,53.3955954303575,52.344557829154596,52.68445843907475,87613600 +2019-09-26,53.00748825073242,53.260605830357584,52.751961358700385,53.034005400566286,75334000 +2019-09-27,52.749549865722656,53.26542593161466,52.37830978339494,53.16417596127844,101408000 +2019-09-30,53.991024017333984,54.13807298560909,53.22443972553184,53.25095687319913,103909600 +2019-10-01,54.140480041503906,55.015542199716855,54.04646537248146,54.25619323286931,139223200 +2019-10-02,52.78329086303711,53.89700358946659,52.53499195502535,53.771649479484324,138449200 +2019-10-03,53.23167037963867,53.26541913933405,51.86001779212852,52.65552479613937,114426000 +2019-10-04,54.72385025024414,54.839563434552865,53.9717329439318,54.393594272751145,138478800 +2019-10-07,54.735897064208984,55.4277483766297,54.44179919601279,54.54545845037951,122306000 +2019-10-08,54.094669342041016,54.976962984097874,54.077796803097314,54.43698288448249,111820000 +2019-10-09,54.72869110107422,54.911898187480325,54.39361270775271,54.72869110107422,74770400 +2019-10-10,55.466331481933594,55.55070522641308,54.79376555162797,54.945633142016156,113013600 +2019-10-11,56.94164276123047,57.2863619931898,56.00149237905756,56.155772958105636,166795600 +2019-10-14,56.85966873168945,57.40447480818924,56.57039315459797,56.62583675127536,96427600 +2019-10-15,56.72708511352539,57.28876003484297,56.62101654660825,56.98502123912987,87360000 +2019-10-16,56.498077392578125,56.707805235639654,56.21603340881136,56.25701378132393,73903200 +2019-10-17,56.71745681762695,56.92718102175242,56.29318610631007,56.67165413434909,67585200 +2019-10-18,56.9898567199707,57.271900740857916,56.47879929558,56.55111912414219,97433600 +2019-10-21,57.978214263916016,58.09392745858567,57.20922434833199,57.257436340274744,87247200 +2019-10-22,57.84564208984375,58.38562237721267,57.76367764336254,58.134917769268505,82293600 +2019-10-23,58.621849060058594,58.63631596699273,58.149366427033016,58.361503588666736,75828800 +2019-10-24,58.718284606933594,59.012382555695986,58.29160091432924,58.94247203697049,69275200 +2019-10-25,59.44146728515625,59.4776253564704,58.549532635464736,58.617030154143734,73477200 +2019-10-28,60.03689193725586,60.08510392289033,59.475213292684366,59.643957081574385,96572800 +2019-10-29,58.648372650146484,60.20564541734881,58.474810209592064,60.01761606827048,142839600 +2019-10-30,58.64112854003906,59.13290033156634,58.14695111511269,59.00272393096384,124522000 +2019-10-31,59.966983795166016,60.06582076053263,57.194752211017715,59.6005697472304,139162000 +2019-11-01,61.66890335083008,61.695416820540515,60.063418594376806,60.15502027808922,151125200 +2019-11-04,62.07388687133789,62.15826061609093,61.56283313513562,62.03290281588239,103272000 +2019-11-05,61.98469161987305,62.24021847609193,61.78943067043556,61.965402409963275,79897600 +2019-11-06,62.01121520996094,62.071481126579755,61.56042733072087,61.89791499245039,75864400 +2019-11-07,62.72688293457031,62.94933051661164,62.407721899853236,62.56004909273018,94940400 +2019-11-08,62.89856719970703,62.97110045600225,62.10308472143455,62.54797257716268,69986400 +2019-11-11,63.39665603637695,63.4619359747312,62.44884622948866,62.45367932088936,81821200 +2019-11-12,63.33863067626953,63.53931836760968,63.087177071390876,63.2394969483059,87388800 +2019-11-13,63.94551467895508,64.02046818348111,63.123438985634515,63.13794563949337,102734400 +2019-11-14,63.50304412841797,64.04464552488129,63.37247687078284,63.771424591526475,89182800 +2019-11-15,64.25740814208984,64.26224123270798,63.59249293326446,63.75448632476118,100206400 +2019-11-18,64.58142852783203,64.661215138633,63.88749973599202,64.26710041967422,86703200 +2019-11-19,64.38556671142578,64.79902108588207,64.16795953427855,64.7748408709178,76167200 +2019-11-20,63.63602828979492,64.33479005962836,62.96143935766805,64.20423017245497,106234400 +2019-11-21,63.3507080078125,63.834282723637145,63.1500203686371,63.7569089982017,121395200 +2019-11-22,63.29508972167969,63.6335905227378,63.06780903123409,63.49093687724774,65325200 +2019-11-25,64.4048843383789,64.42181122091748,63.47400172267781,63.51994190170359,84020400 +2019-11-26,63.902008056640625,64.59593686655197,63.46920644946367,64.54274333171028,105207600 +2019-11-27,64.76033020019531,64.79418397479826,64.14860843125285,64.2138883667176,65235600 +2019-11-29,64.61766052246094,64.79900101036307,64.29124616848443,64.46050024203176,46617600 +2019-12-02,63.87056350708008,64.85947313465985,63.698896510970194,64.62251881503481,94487200 +2019-12-03,62.73173904418945,62.75107878804116,61.96769003365425,62.456097887636844,114430400 +2019-12-04,63.2854118347168,63.665019704372995,63.029117861528626,63.12341845971325,67181600 +2019-12-05,64.2138900756836,64.28885095304722,63.52480193558771,63.781095971846014,74424400 +2019-12-06,65.45426940917969,65.52438982597056,64.62977343403563,64.67330077683782,106075600 +2019-12-09,64.53789520263672,65.47602410408834,64.05190017384767,65.28259713814829,128042400 +2019-12-10,64.91508483886719,65.2995259255182,64.28159564264737,64.94409814672522,90420400 +2019-12-11,65.46875,65.54854394773184,64.91989543978755,64.99484891870932,78756800 +2019-12-12,65.63558959960938,65.90155715077746,64.63459384364013,64.74581395457803,137310400 +2019-12-13,66.52778625488281,66.5640528807458,65.50744336760692,65.63559036483228,133587600 +2019-12-16,67.6666259765625,67.89149389219368,66.9702843829274,66.97511747512554,128186000 +2019-12-17,67.79959869384766,68.12842598196593,67.41031718322796,67.59649818434546,114158400 +2019-12-18,67.63761138916016,68.15987310860368,67.48770436741339,67.65211804424749,116028400 +2019-12-19,67.70530700683594,67.98578128422166,67.44660008937991,67.57958021163519,98369200 +2019-12-20,67.56505584716797,68.34119115362526,67.35228180431963,68.23964460147937,275978000 +2019-12-23,68.66759490966797,68.72804173617295,67.78990580821343,67.8285926626282,98572000 +2019-12-24,68.73289489746094,68.88280926913254,68.40648784202634,68.83444884230103,48478800 +2019-12-26,70.09658813476562,70.11351502418024,68.83687780880562,68.86589111707863,93121200 +2019-12-27,70.06996154785156,71.07821790686879,69.66376062600487,70.38912257734397,146266000 +2019-12-30,70.4858627319336,70.76875724678601,68.96260500854218,69.98778126028415,144114400 +2019-12-31,71.00084686279297,71.00810018742843,70.00226402498598,70.1013977141795,100805600 +2020-01-02,72.620849609375,72.68129646149221,71.37322569622376,71.6270995236096,135480400 +2020-01-03,71.91481018066406,72.67643886208242,71.6899497146884,71.84711001739942,146322800 +2020-01-06,72.48784637451172,72.52653323692198,70.78324846628296,71.03470938256737,118387200 +2020-01-07,72.1469497680664,72.75383115765004,71.92692233659784,72.49753708995398,108872000 +2020-01-08,73.3075180053711,73.60975223726805,71.84954036585081,71.84954036585081,132079200 +2020-01-09,74.86461639404297,75.05804331745496,74.03528757623693,74.28674110091968,170108400 +2020-01-10,75.03388214111328,75.59967116208304,74.53096758540974,75.09916946286842,140644800 +2020-01-13,76.63690948486328,76.66350992792401,75.23212569823723,75.35060650662172,121532000 +2020-01-14,75.60206604003906,76.78440971103713,75.4787595103825,76.57405589932931,161954400 +2020-01-15,75.278076171875,76.28391248020361,74.84527472915032,75.40139008732662,121923600 +2020-01-16,76.22106170654297,76.33228922922538,75.45943283140988,75.82211395087957,108829200 +2020-01-17,77.06488800048828,77.06730085653118,76.16301849026416,76.4700857814728,137816400 +2020-01-21,76.54263305664062,77.13500771347044,76.4048124784183,76.69254005241989,110843200 +2020-01-22,76.81584930419922,77.36953706088629,76.7215486894379,77.02861598860008,101832400 +2020-01-23,77.18577575683594,77.26556233295065,76.32017294133449,76.86903492947071,104472000 +2020-01-24,76.96332550048828,78.17709525774193,76.77231144105775,77.43239351756245,146537600 +2020-01-27,74.70020294189453,75.38203764467593,73.71612668009978,74.96858335214901,161940000 +2020-01-28,76.81343841552734,76.98510540061056,75.48360773770071,75.58274145549967,162234000 +2020-01-29,78.42131805419922,79.2699941203994,77.70562947444549,78.44791850299463,216229200 +2020-01-30,78.30767059326172,78.36086410726632,77.06972049871605,77.50252193635508,126743200 +2020-01-31,74.83560943603516,78.01994488964468,74.54062855663432,77.59681700240047,199588400 +2020-02-03,74.6301040649414,75.79793402750128,73.07299252901737,73.57590710330668,173788400 +2020-02-04,77.09391021728516,77.2849243200521,75.83177975550196,76.23798079684781,136616400 +2020-02-05,77.7225570678711,78.52287271376575,77.11808861152979,78.22305134186004,118826800 +2020-02-06,78.63167572021484,78.63409595534088,77.43483255655748,77.99336084201738,105425600 +2020-02-07,77.56285858154297,78.37961468469555,77.07086561575886,78.12998293153962,117684000 +2020-02-10,77.93124389648438,77.93124389648438,76.06506702253098,76.14504296724274,109348800 +2020-02-11,77.46105194091797,78.50078345731488,77.24292836168937,78.42807806299739,94323200 +2020-02-12,79.30062103271484,79.3054655960977,77.91188810854676,77.91188810854676,113730400 +2020-02-13,78.73588562011719,79.06307473499535,78.36749924118695,78.5710817713545,94747600 +2020-02-14,78.75527954101562,79.00491129587996,78.24631951175783,78.70437836069574,80113600 +2020-02-18,77.31320190429688,77.49497275516904,76.2492329736465,76.43100382451867,152531200 +2020-02-19,78.43291473388672,78.66316078652402,77.5555685480905,77.5555685480905,93984000 +2020-02-20,77.62828063964844,78.68255321990893,77.12174667637375,78.19298631382561,100566000 +2020-02-21,75.87116241455078,77.66464101568167,75.25314438056381,77.22111592621015,129554000 +2020-02-24,72.26725769042969,73.72142482703582,70.09812948275813,72.04428953806494,222195200 +2020-02-25,69.81939697265625,73.32151855543881,69.34679716700752,72.93859119205945,230673600 +2020-02-26,70.92700958251953,72.19456142629366,69.43648955817032,69.44376009892217,198054800 +2020-02-27,66.29061126708984,69.31528072502235,66.15488963079875,68.12771270933804,320605600 +2020-02-28,66.2518539428711,67.4757824380709,62.134139530313654,62.34984454807426,426510000 +2020-03-02,72.41993713378906,73.0573481636442,67.30854119181632,68.4137074821739,341397200 +2020-03-03,70.11992645263672,73.6777861951104,69.26681051044577,73.59781027366749,319475600 +2020-03-04,73.3724136352539,73.53237288497041,71.04332648790448,71.84554131856758,219178400 +2020-03-05,70.99247741699219,72.5993266721567,70.6265094760136,71.62261089919939,187572800 +2020-03-06,70.04965209960938,70.4834806861114,68.15923783954538,68.34585328692468,226176800 +2020-03-09,64.50929260253906,67.39823435621751,63.741004240036446,63.92277516467533,286744800 +2020-03-10,69.15532684326172,69.42192557668332,65.28481913919207,67.16796993178485,285290000 +2020-03-11,66.7535400390625,68.15681338440555,65.88830882534532,67.22857329146201,255598800 +2020-03-12,60.16133117675781,65.43753654797538,60.10558912554775,62.02993801425344,418474000 +2020-03-13,67.36913299560547,67.84174022351363,61.30525564200672,64.19905222754427,370732000 +2020-03-16,58.70230484008789,62.79093319087167,58.1666849886367,58.63928856454173,322423600 +2020-03-17,61.28346252441406,62.43467470181221,57.77891741086091,59.98682842744822,324056000 +2020-03-18,59.78324508666992,60.590308438852105,57.46869456467798,58.11095405301318,300233600 +2020-03-19,59.32517623901367,61.27860698512917,58.79925286107015,59.95773914025238,271857200 +2020-03-20,55.55887985229492,61.033818180361195,55.258350649014375,59.90683644166283,401693200 +2020-03-23,54.378578186035156,55.37953106884565,51.52841196651316,55.27773981437753,336752800 +2020-03-24,59.834136962890625,60.03044895212406,56.78523248433621,57.28449598735918,287531200 +2020-03-25,59.5045280456543,62.58978535507417,59.20884706003286,60.77207619664994,303602000 +2020-03-26,62.63582229614258,62.693986610997555,59.70809887531277,59.746877550641436,252087200 +2020-03-27,60.042572021484375,62.012966292537286,59.87534218227991,61.256800443757655,204216800 +2020-03-30,61.75605773925781,61.92813582111078,60.44488273934441,60.76964956297266,167976400 +2020-03-31,61.63003158569336,63.61739280424554,61.07502603187046,61.94752788300978,197002000 +2020-04-01,58.38724899291992,60.280089743224686,57.95584626844167,59.7420474781987,176218400 +2020-04-02,59.36153030395508,59.41485006682693,57.41537005354861,58.24909322048442,165934000 +2020-04-03,58.50840759277344,59.54813532545942,57.91704578007501,58.84528945189095,129880000 +2020-04-06,63.612545013427734,63.76765233671357,60.440037765372786,60.80842412991893,201820400 +2020-04-07,62.875762939453125,65.84953953078768,62.77154940088239,65.63140853862814,202887200 +2020-04-08,64.48505401611328,64.8001206555024,63.31202655456122,63.677986981114906,168895200 +2020-04-09,64.95038604736328,65.45450156620154,64.15302289668575,65.12246785230607,161834800 +2020-04-13,66.22520446777344,66.33426997710056,64.4268809310659,65.02793942933454,131022800 +2020-04-14,69.56979370117188,69.86063015904438,67.3885424559632,67.86114985093643,194994800 +2020-04-15,68.93480682373047,69.39529170786052,68.01383705547038,68.44281379449058,131154400 +2020-04-16,69.48253631591797,69.8485041120879,68.43068954557212,69.64976614355342,157125200 +2020-04-17,68.53974151611328,69.54554637079254,67.1001154570163,68.99780771504257,215250000 +2020-04-20,67.11712646484375,68.26834287021612,67.09774081132761,67.36433977393328,130015200 +2020-04-21,65.04246520996094,67.19463355650954,64.3299227872178,66.95954292864836,180991600 +2020-04-22,66.91592407226562,67.35217124293807,65.97071693829112,66.31243969742793,116862400 +2020-04-23,66.6566162109375,68.28528415368396,66.61783752226751,66.86019877924598,124814400 +2020-04-24,68.58094787597656,68.5906443947667,67.13405124110245,67.18252643877639,126161200 +2020-04-27,68.62943267822266,68.9614663795542,67.84902922262711,68.29739158061335,117087600 +2020-04-28,67.51697540283203,69.27409398731281,67.42488436575898,69.09232309926307,112004800 +2020-04-29,69.73460388183594,70.20478529015517,68.80393758598254,69.00752014479939,137280800 +2020-04-30,71.20574188232422,71.38266828131499,69.88487732968152,70.2750754445244,183064000 +2020-05-01,70.05936431884766,72.46600961904917,69.2789608424837,69.37590385770176,240616800 +2020-05-04,71.05062103271484,71.17907219230422,69.39287106137577,70.08360206516988,133568000 +2020-05-05,72.11700439453125,72.95072758723038,71.36568312949365,71.51110134148117,147751200 +2020-05-06,72.86106872558594,73.49362808088746,72.43451052977014,72.81986405592146,142333600 +2020-05-07,73.61479187011719,73.96137402305452,73.1858151892616,73.48876670304365,115215200 +2020-05-08,75.36695098876953,75.42041508755761,73.9477309492938,74.27580576384341,133838400 +2020-05-11,76.55288696289062,77.048636946995,74.66463767418456,74.8736364220834,145946400 +2020-05-12,75.67800903320312,77.6901917346119,75.55650039805452,77.23817575538389,162301200 +2020-05-13,74.76425170898438,76.78129923204625,73.68525458009285,75.85782927883679,200622400 +2020-05-14,75.22356414794922,75.28431846247351,73.2769935373758,74.00118763637258,158929200 +2020-05-15,74.77884674072266,74.8250206182074,72.95621710200552,72.99024308175176,166348400 +2020-05-18,76.54071807861328,76.91496675486883,75.4131217905622,76.10572250052454,135178400 +2020-05-19,76.09844970703125,77.40587670296324,76.06685626775942,76.55774860082086,101729600 +2020-05-20,77.5783920288086,77.64886168488982,76.91981000404272,76.95869365031022,111504800 +2020-05-21,77.00003051757812,77.98182245463944,76.7618709013521,77.43989122316047,102688800 +2020-05-22,77.49578094482422,77.57840592683334,76.6354977307433,76.73756083121987,81803200 +2020-05-26,76.97084045410156,78.7958945836895,76.91494382821436,78.61606422883838,125522000 +2020-05-27,77.30622100830078,77.4520328550853,76.08627697001077,76.82748410104101,112945200 +2020-05-28,77.34024047851562,78.6015006101808,76.70353646464031,76.9805722755511,133560800 +2020-05-29,77.26492309570312,78.04500657374922,76.90768735815497,77.58327517421819,153532400 +2020-06-01,78.21510314941406,78.33661177403135,77.08749955314255,77.21873094429264,80791200 +2020-06-02,78.57722473144531,78.60152794836702,77.5055173870129,77.94781071956606,87642800 +2020-06-03,79.009765625,79.2722284031161,78.3244552131719,78.89797976869754,104491200 +2020-06-04,78.32931518554688,79.1312690763083,77.95506657558614,78.83236263047952,87560400 +2020-06-05,80.56022644042969,80.62098075901221,78.55047625158724,78.57963713789907,137250400 +2020-06-08,81.03654479980469,81.07057078079636,79.54442247076808,80.25646136244434,95654400 +2020-06-09,83.59552001953125,83.98920686535521,80.68417746439864,80.71577090052271,147712400 +2020-06-10,85.7462158203125,86.21523738880465,84.10584918729383,84.5457098689179,166651600 +2020-06-11,81.6295166015625,85.31366007611484,81.5274534799194,84.88837976456844,201662400 +2020-06-12,82.33424377441406,84.52139908925585,81.22122799958797,83.77290920023673,200146000 +2020-06-15,83.35248565673828,84.00620266393342,80.82267515019947,80.98549997370785,138808800 +2020-06-16,85.56151580810547,85.83370137590062,83.77291228895632,85.41084628969108,165428800 +2020-06-17,85.44245910644531,86.3683545073001,85.32095044579455,86.30760017697472,114406400 +2020-06-18,85.47647094726562,85.89446096739049,84.86649519851686,85.39870363740545,96820400 +2020-06-19,84.98799896240234,86.65023617971444,83.87740827164068,86.18364717992426,264476000 +2020-06-22,87.21160125732422,87.35498054805204,85.33550774901583,85.3816816208449,135445200 +2020-06-23,89.07313537597656,90.49478813930877,88.03787925009263,88.45830187116142,212155600 +2020-06-24,87.50080108642578,89.62234460688504,87.12655239933392,88.7013070407747,192623200 +2020-06-25,88.66241455078125,88.70129820159251,86.89568177427711,87.65632697012038,137522400 +2020-06-26,85.93818664550781,88.77905873731159,85.78994227456904,88.5579121618439,205256800 +2020-06-29,87.91879272460938,88.01357302520984,85.3671112421525,85.84585558837018,130646000 +2020-06-30,88.6526870727539,88.93945305521017,87.48620727559833,87.50564539182193,140223200 +2020-07-01,88.48499298095703,89.27479891531075,88.43639398862099,88.73044273684806,110737200 +2020-07-02,88.48499298095703,90.03058629665891,88.3707820116338,89.393882391572,114041600 +2020-07-06,90.85202026367188,91.32104187882805,89.88480872729063,89.91640216330728,118655600 +2020-07-07,90.57011413574219,92.01120488127154,90.45832825923631,91.23112145924068,112424400 +2020-07-08,92.67951202392578,92.71110546141183,91.46199290533191,91.54948299500866,117092000 +2020-07-09,93.07804870605469,93.62726270349853,92.02821230000306,93.5737986064413,125642800 +2020-07-10,93.24085998535156,93.29918917048931,92.0597996685609,92.67220049027107,90257200 +2020-07-13,92.81073760986328,97.1631783276675,92.59688119999984,94.54830981555456,191649200 +2020-07-14,94.34661865234375,94.5385969991495,91.25543798504268,92.19104875223829,170989200 +2020-07-15,94.99545288085938,96.47542722006055,93.79494692925732,96.22511971933456,153198000 +2020-07-16,93.82653045654297,94.68438106422201,93.22627754411272,93.86541410703498,110577600 +2020-07-17,93.63697814941406,94.43407445102358,93.16309153453818,94.27854726393537,92186800 +2020-07-20,95.61027526855469,95.74879688151813,93.379378684577,93.72446644412312,90318000 +2020-07-21,94.29069519042969,96.47785049123863,94.0403877137668,96.40251573529238,103433200 +2020-07-22,94.55557250976562,95.23845032827714,93.90428811755417,93.99177075995695,89001600 +2020-07-23,90.25175476074219,94.36603535470661,89.44007797032316,94.2882680485315,197004400 +2020-07-24,90.02816772460938,90.37325548035092,86.65508713174927,88.44613048133,185438800 +2020-07-27,92.16187286376953,92.2542206187511,90.8690265429245,91.09259829217558,121214000 +2020-07-28,90.64788818359375,91.90914860198515,90.6430230910152,91.73174329776009,103625600 +2020-07-29,92.38543701171875,92.57013249165894,91.09501603040513,91.13146713399918,90329200 +2020-07-30,93.50332641601562,93.60782206135195,91.14848849561243,91.55675572597188,158130000 +2020-07-31,103.29206848144531,103.4427380109372,98.00886768351042,100.01133514701584,374336800 +2020-08-03,105.89476776123047,108.51935112132352,104.87895742584206,105.1778638999422,308151200 +2020-08-04,106.60195922851562,107.69553697101213,105.36013709111648,106.08433124379282,173071600 +2020-08-05,106.98835754394531,107.30914213352884,105.855896128936,106.32249256981191,121776800 +2020-08-06,110.72111511230469,111.2168725105059,106.7307749608819,107.32130525527312,202428800 +2020-08-07,108.20376586914062,110.69918395823287,107.40523237781791,110.24148657363267,198045600 +2020-08-10,109.77648162841797,110.79656040754556,107.12038216987283,109.65231698977226,212403600 +2020-08-11,106.51174926757812,109.53789844079104,106.25125017767719,109.03881778751953,187902400 +2020-08-12,110.05159759521484,110.30965976352992,107.41010462326905,107.60486600059996,165598000 +2020-08-13,111.99925231933594,113.00472456165949,110.94508601296111,111.43443386689364,210082000 +2020-08-14,111.89942169189453,111.98949901322317,110.08567574687753,111.82395110215055,165565200 +2020-08-17,111.60726165771484,113.04852095183266,110.97914996990063,113.02417392493486,119561600 +2020-08-18,112.53727722167969,112.96332424198891,111.0229840865938,111.35895378278491,105633600 +2020-08-19,112.67847442626953,114.09538682492261,112.58353067113143,112.9462768876478,145538000 +2020-08-20,115.17876434326172,115.2931886914799,112.7028193742301,112.71986303729176,126907200 +2020-08-21,121.11422729492188,121.59870129234525,116.12825670148469,116.14042650285538,338054800 +2020-08-24,122.5627670288086,125.41363550271217,120.69303108379322,125.32841718543504,345937600 +2020-08-25,121.55729675292969,121.90300674261194,119.83119859572422,121.43313953220415,211495600 +2020-08-26,123.2103500366211,123.66804740538558,121.8080444692864,122.87681730695134,163022400 +2020-08-27,121.73745727539062,124.14766458561553,120.5907768320979,123.8141318298438,155552400 +2020-08-28,121.54026794433594,123.13246125062976,121.31628565950032,122.71371757611423,187630000 +2020-08-31,125.66194915771484,127.57064628140903,122.70153764471402,124.24017775703048,225702700 +2020-09-01,130.6674346923828,131.27121446383708,127.11299017658317,129.2846091734375,151948100 +2020-09-02,127.9601821899414,134.36793159802133,123.67537209267218,133.9881416796695,200119000 +2020-09-03,117.715576171875,125.46719678609372,117.34552656361724,123.58772784996529,257599600 +2020-09-04,117.7934799194336,120.46174947786696,107.98709503336387,116.92677914209935,332607200 +2020-09-08,109.86656188964844,115.87503988575807,109.73022744851274,110.96697771586362,231366600 +2020-09-09,114.24876403808594,116.02111927354656,112.24269366983658,114.19033711230628,176940500 +2020-09-10,110.51904296875,117.34553642093123,109.55496138883622,117.20920195224328,182274400 +2020-09-11,109.06803131103516,112.21347869736357,107.12038789476668,111.57075280375336,180860300 +2020-09-14,112.34008026123047,112.89515837432545,109.84709890131904,111.71683492125261,140150100 +2020-09-15,112.515380859375,115.71925573478626,110.63590433457968,115.23234479499132,184642000 +2020-09-16,109.19462585449219,112.96331855332305,109.10698546668381,112.21347910439461,154679000 +2020-09-17,107.45148468017578,109.26279366804528,105.86415795625577,106.847719970666,178011000 +2020-09-18,104.04309844970703,107.97733869117779,103.31273223375831,107.50990847358545,287104900 +2020-09-21,107.19831085205078,107.30543184974553,100.40103108135007,101.80333692050233,195713800 +2020-09-22,108.88301849365234,109.90553440635527,106.30239653909264,109.73024617645395,183055400 +2020-09-23,104.31578063964844,109.17514872406446,103.97493710920857,108.69797818298632,150718700 +2020-09-24,105.3869857788086,107.36384264511429,102.25127870963266,102.41682661585128,167743300 +2020-09-25,109.3406982421875,109.49651327893982,104.85137965372228,105.591486218956,149981400 +2020-09-28,111.95053100585938,112.30110737861732,109.82759960623372,111.99922505805824,137672400 +2020-09-29,111.10332489013672,112.29138866733861,110.5969408264079,111.55128945340192,99382200 +2020-09-30,112.7782974243164,114.19034345635778,110.6456327885037,110.81118070719012,142675200 +2020-10-01,113.73263549804688,114.63828996240579,112.7977675718812,114.56038244447453,116120400 +2020-10-02,110.06131744384766,112.34980421996083,109.28226459701011,109.93472330652477,144712000 +2020-10-05,113.45024108886719,113.59631584658959,110.57746971556678,110.92804616223222,106243800 +2020-10-06,110.19766998291016,113.08018139775959,109.31148864679248,112.67117062665213,161498200 +2020-10-07,112.06741333007812,112.52511075993657,111.14227817215749,111.61945619842345,96849000 +2020-10-08,111.96028137207031,113.35284669197739,111.59022437328177,113.20677195191192,83477200 +2020-10-09,113.9079360961914,113.93714956117775,111.91159845252474,112.26217489170202,100506900 +2020-10-12,121.1434097290039,121.90298939580019,116.15744041280756,116.91702007960384,240226800 +2020-10-13,117.9298095703125,122.10750566774655,116.5177710390298,121.99064438590798,262330500 +2020-10-14,118.0174560546875,119.80928444459767,116.48855625885349,117.8324275512861,150712000 +2020-10-15,117.55001831054688,118.02718887052616,115.05703709797092,115.61211517826072,112559200 +2020-10-16,115.90426635742188,118.36804173088585,115.69976467276356,118.10510568656042,115393800 +2020-10-19,112.94385528564453,117.26761901216874,112.6322326077899,116.81966187710711,120639300 +2020-10-20,114.43378448486328,115.86530350302661,112.60299502286628,113.15807306769803,124423700 +2020-10-21,113.810546875,115.60237527015637,113.40153610682727,113.61577807356772,89946000 +2020-10-22,112.71986389160156,114.94991651803686,111.59022713214819,114.37535784081969,101988000 +2020-10-23,112.02847290039062,113.4989460580051,111.28836617190187,113.34313098688261,82572600 +2020-10-26,112.03817749023438,113.4989098829119,109.92497898227899,111.025402139751,111850700 +2020-10-27,113.54759979248047,114.20979879352078,111.54152962594779,112.46665719622837,92276800 +2020-10-28,108.28897094726562,112.4082400407623,108.19159026240904,112.03819046643926,143937800 +2020-10-29,112.30110931396484,113.86896272202166,109.26278317425792,109.42833849678561,146129200 +2020-10-30,106.01023864746094,109.058298117793,104.90008242224502,108.15264357304628,190272600 +2020-11-02,105.92259216308594,107.78259533653008,104.51055354833466,106.25369543303232,122866900 +2020-11-03,107.54887390136719,108.57138225685797,105.88363963985061,106.78929414309684,107624400 +2020-11-04,111.94080352783203,112.56404883306527,109.40886854661319,111.15201031363652,138235500 +2020-11-05,115.91400146484375,116.48856015953854,113.81055035278919,114.86227219398131,126387100 +2020-11-06,115.78231048583984,116.27981104293774,113.2850208285467,115.42137214222052,114457900 +2020-11-09,113.4703598022461,119.0014527698893,113.20697761247202,117.54795729060733,154515300 +2020-11-10,113.12895202636719,114.70926027820961,111.33402473178882,112.71924303088868,138023400 +2020-11-11,116.56269836425781,116.69926800957136,113.58742258565564,114.31904887518712,112295000 +2020-11-12,116.2895736694336,117.57723580292728,115.66525308607233,116.68953299697138,103162300 +2020-11-13,116.3383560180664,116.73830791782815,114.98240900346639,116.51394665375146,81581900 +2020-11-16,117.35285949707031,118.02595062070795,115.25552931764878,116.00666236482012,91183000 +2020-11-17,116.46516418457031,117.71380535006969,116.04569809530207,116.62124805150194,74271000 +2020-11-18,115.13848114013672,116.88463032919714,115.10921727569527,115.70427399429921,76322100 +2020-11-19,115.7335205078125,116.14322943354533,113.9483506196358,114.70924075099313,74113000 +2020-11-20,114.46539306640625,115.86036112610928,114.41662243532618,115.73354855431413,73604300 +2020-11-23,111.0608901977539,114.73853654084122,110.9633414959256,114.30931332180998,127959300 +2020-11-24,112.34854125976562,113.01188278583413,109.83174481299207,111.11941434226163,113874200 +2020-11-25,113.18748474121094,113.88984730295674,112.34855250829112,112.71924799503968,76499200 +2020-11-27,113.73375701904297,114.61171017176824,113.37282609805314,113.71425025675507,46691300 +2020-11-30,116.13347625732422,118.00643766892851,113.94834716796547,114.10443100684269,169410200 +2020-12-01,119.71359252929688,120.44521894311592,117.06998331379602,118.04548519888809,127728200 +2020-12-02,120.06478118896484,120.34767764614222,117.9284295476018,119.03074406626739,89004200 +2020-12-03,119.9281997680664,120.74761774931302,119.21608014318339,120.49398518452733,78967600 +2020-12-04,119.25511169433594,119.85016847078657,118.54299200625123,119.59653588349062,78260400 +2020-12-07,120.71834564208984,121.51825680642276,119.25509296764027,119.3136206930221,86712000 +2020-12-08,121.33291625976562,121.9182233181416,120.07451799223874,121.32316659995087,82225500 +2020-12-09,118.79662322998047,122.86446447083719,118.03573291931536,121.47925352360127,115089200 +2020-12-10,120.2208480834961,120.83541902329915,117.2065508848971,117.54797505007178,81312200 +2020-12-11,119.41117858886719,119.75260272945025,117.5967446503537,119.4306853501199,86939800 +2020-12-14,118.79662322998047,120.32816095445716,118.56250485188869,119.59653451074239,79184500 +2020-12-15,124.7471694946289,124.76668369873353,121.08903768627563,121.29389217444482,157243700 +2020-12-16,124.67888641357422,125.22516505635238,123.45950912702416,124.28869163586886,98208600 +2020-12-17,125.54706573486328,126.40551199352088,124.90323104087008,125.74216309774691,94359800 +2020-12-18,123.55706024169922,125.93728698989182,123.03028838222276,125.80071733474844,192541500 +2020-12-21,125.08856964111328,125.1666115575816,120.42567304818996,121.95721030706838,121251600 +2020-12-22,128.64920043945312,131.11721915357555,126.47382039895922,128.38581074820917,168904800 +2020-12-23,127.75174713134766,129.18572136214763,127.57614903299762,128.92234654209122,88223700 +2020-12-24,128.7369384765625,130.19044111904873,127.88825690620341,128.10286843422077,54930100 +2020-12-28,133.34129333496094,133.97536331278693,130.23919103605428,130.7074424413421,124486200 +2020-12-29,131.56594848632812,135.38991449680984,131.04893362298358,134.66805255137436,121047300 +2020-12-30,130.44410705566406,132.65850039720306,130.1319393225058,132.25854107096032,96452100 +2020-12-31,129.43934631347656,131.4391281363561,128.4931083029186,130.79529332577445,99116600 +2021-01-04,126.23970031738281,130.33680518621807,123.65461887853952,130.24901359048766,143301900 +2021-01-05,127.80046081542969,128.51258770929192,125.28366487055057,125.73240216140931,97664900 +2021-01-06,123.49853515625,127.83952293982475,123.28392355422082,124.59109992908554,155088000 +2021-01-07,127.71267700195312,128.40528973786473,124.72764426980214,125.21539510538169,109578200 +2021-01-08,128.81503295898438,129.38082586513295,127.03961229986527,129.1857135709603,105158200 +2021-01-11,125.82020568847656,126.9810550985185,125.3519690380728,126.0250675958265,100384500 +2021-01-12,125.64463806152344,126.51283409054386,123.75216213905773,125.35198453697099,91951100 +2021-01-13,127.6834487915039,128.22972749827673,125.34225008105514,125.60562488862021,88636800 +2021-01-14,125.75193786621094,127.79073301132566,125.60560366841855,127.59563563257835,90221800 +2021-01-15,124.0252914428711,127.02983860800374,123.88872179377304,125.62511371158065,111598500 +2021-01-19,124.69840240478516,125.5568487900098,123.83020635972,124.64962433562887,90757300 +2021-01-20,128.7954864501953,129.2442237752779,125.40074474969568,125.50805053058666,104319500 +2021-01-21,133.51693725585938,136.24834549078827,130.31729228736415,130.5221542310992,120150900 +2021-01-22,135.66302490234375,136.42391501700993,131.71224014697756,132.94136689721347,114459400 +2021-01-25,139.41871643066406,141.53555356505598,133.19501014057846,139.5650506326583,157611700 +2021-01-26,139.65284729003906,140.76491879465476,137.9066906570604,140.08207048216735,98390600 +2021-01-27,138.57977294921875,140.76490217618246,136.9702010537378,139.9162055519511,140843800 +2021-01-28,133.73155212402344,138.51152037306719,133.35110697778126,136.10202948520754,142621100 +2021-01-29,128.72723388671875,133.39013165524483,127.0201056066314,132.50242137720485,177523800 +2021-02-01,130.8538055419922,132.06343308345475,127.72243834178269,130.47336045084296,106239800 +2021-02-02,131.6829833984375,132.97063793703109,131.31228797923288,132.40484514955168,83305400 +2021-02-03,130.65872192382812,132.4438921194795,130.33680452281126,132.43412757446322,89880900 +2021-02-04,134.02420043945312,134.03395009949696,131.29279224448268,132.96090698056452,84183100 +2021-02-05,133.6090087890625,134.25380579574252,132.72975098520618,134.1854263656403,75693800 +2021-02-08,133.7555389404297,133.80438990060523,131.81138402031524,132.8958097444442,71297200 +2021-02-09,132.87623596191406,134.70316008517767,132.71993379523988,133.47218176230825,76774200 +2021-02-10,132.2705535888672,133.83369484015344,131.3033582625716,133.3354359263558,73046600 +2021-02-11,132.0165252685547,133.24748871589713,130.6878599207111,132.76877325498876,64280000 +2021-02-12,132.2510223388672,132.40733945975953,130.60973729116114,131.25453423442616,60145100 +2021-02-16,130.1212158203125,132.87623338492867,129.73042314316442,132.36822526546072,80576300 +2021-02-17,127.82536315917969,129.17357188926405,126.4869335636258,128.22592008727972,97918500 +2021-02-18,126.721435546875,127.00474727006973,124.47442549834508,126.22317661311753,96856700 +2021-02-19,126.87774658203125,127.69840402791259,125.8324074950476,127.23923179401972,87668800 +2021-02-22,123.09689331054688,126.73118373419764,122.70610803153758,125.06057648009266,103916400 +2021-02-23,122.96012115478516,123.79053522480318,115.6622326225289,120.9085077307379,158273000 +2021-02-24,122.46186065673828,122.6670212385794,119.41375206526031,122.06131117417482,111039900 +2021-02-25,118.20233917236328,123.5463093432761,117.76271033657684,121.80732245880864,148199500 +2021-02-26,118.46611022949219,121.97339123226033,118.40748759144725,119.76546069067267,164560400 +2021-03-01,124.84565734863281,124.98243108447949,119.96085977236707,120.89874001257695,116307900 +2021-03-02,122.23719024658203,125.75424338523828,122.1297240921733,125.45138828841935,102260900 +2021-03-03,119.2476806640625,122.81358452353464,119.03274836980684,121.93431943503865,112966300 +2021-03-04,117.36214447021484,120.75219519765207,115.88694096141373,118.94482157612892,178155000 +2021-03-05,118.62242126464844,119.13044438108311,114.86112866250235,118.19256415106085,153766600 +2021-03-08,113.67900848388672,118.21209998624401,113.53246306756205,118.1437131191071,154376600 +2021-03-09,118.3000259399414,119.24767787685906,116.05302349253789,116.28749169278657,129525800 +2021-03-10,117.21561431884766,119.35515074210788,116.6978194776284,118.88621431520569,111943300 +2021-03-11,119.14997863769531,120.37117800154545,118.466109975383,119.71661693138803,103026500 +2021-03-12,118.24142456054688,118.37819831446407,116.41451479596263,117.62594266791949,88105100 +2021-03-15,121.13321685791016,121.14298854077106,117.64547143758236,118.61266679333781,92403800 +2021-03-16,122.67681121826172,124.28879597729674,121.84639708591334,122.80381327731409,115227900 +2021-03-17,121.88548278808594,122.96013686622555,119.52123487184643,121.19184236079936,111932600 +2021-03-18,117.7529296875,120.34187390478134,117.54776908284731,120.04878306750058,121229700 +2021-03-19,117.22537231445312,118.63219642756981,116.92251724428318,117.13744953418819,185549500 +2021-03-22,120.54704284667969,121.01598672803996,117.48916202259225,117.55754889553958,111912300 +2021-03-23,119.71661376953125,121.37744187905922,119.32582849269843,120.48841264153353,95467100 +2021-03-24,117.32306671142578,120.06832806693622,117.30353080035886,119.99016951544908,88530500 +2021-03-25,117.8115463256836,118.85690017985242,116.25818424833348,116.7857432897759,98844700 +2021-03-26,118.4172592163086,118.68104245336015,116.18002108358161,117.57707345629376,94071200 +2021-03-29,118.59312438964844,119.75570869039201,117.94833493419104,118.84713597082144,80819200 +2021-03-30,117.13745880126953,117.6259386065679,116.1214199118157,117.34261942506161,85671900 +2021-03-31,119.33561706542969,120.67404695199468,118.35865746187088,118.84713726365028,118323800 +2021-04-01,120.16602325439453,121.31883580815018,119.66777180267046,120.8108201276386,75089100 +2021-04-05,122.99919128417969,123.25320281794392,120.2343943633399,121.01596487325654,88651200 +2021-04-06,123.30207061767578,124.20087166369673,122.75497562507351,123.58538979701918,80171300 +2021-04-07,124.95310974121094,124.97264564977796,122.25669968882636,122.9308040653247,83466700 +2021-04-08,127.3564224243164,127.38573001246046,125.55882078446963,125.97890615267889,88844600 +2021-04-09,129.93563842773438,129.97471025605384,126.48697192369632,126.80937040941369,106686700 +2021-04-12,128.21617126464844,129.78907666965299,127.62022536816302,129.4666782429754,91420000 +2021-04-13,131.33265686035156,131.5573682758643,128.89025813953373,129.38851701920058,91266500 +2021-04-14,128.98793029785156,131.88950050146093,128.62646014086016,131.83088533083696,87222800 +2021-04-15,131.4010467529297,131.88952648063574,130.56086102498654,130.7367214787142,89347100 +2021-04-16,131.0688934326172,131.56713742369558,130.2091642804324,131.20566716980846,84922400 +2021-04-19,131.73321533203125,132.34870458701315,130.2677760828126,130.43385740885776,94264200 +2021-04-20,130.04306030273438,132.4073001522847,128.7730101601583,131.9090562479768,94812300 +2021-04-21,130.42410278320312,130.66834267605557,128.27479470754565,129.3103694680848,68847100 +2021-04-22,128.90003967285156,131.05911183417535,128.38225232698375,129.97468618567086,84566500 +2021-04-23,131.2252197265625,132.0067754754205,129.11498342731704,129.11498342731704,78657500 +2021-04-26,131.61599731445312,131.94815999771666,130.48272061096776,131.72346346577018,66905100 +2021-04-27,131.29360961914062,132.29011265780838,131.02006210377638,131.89931984498693,66015800 +2021-04-28,130.50225830078125,131.9090824360274,130.0137785264441,131.215434597292,107760100 +2021-04-29,130.40455627441406,133.91185238072063,129.3982891326952,133.3256706891164,151101000 +2021-04-30,128.43112182617188,130.4827281416953,128.05010815991602,128.74374116163304,109839500 +2021-05-03,129.4862060546875,130.98096780991455,128.79257315513814,128.99772630286216,75135100 +2021-05-04,124.9042739868164,128.4604135210105,123.78076904048892,128.1673226815826,137564700 +2021-05-05,125.14851379394531,127.44435959905208,125.02150429281544,126.22316026424471,84000900 +2021-05-06,126.75074005126953,126.76050428037594,124.20086752220477,124.94335888284245,78128300 +2021-05-07,127.42597961425781,128.45351756221345,126.71157703177086,128.05229514281538,78973300 +2021-05-10,124.13782501220703,126.77030517991771,124.09867935425044,126.64309485753276,88071200 +2021-05-11,123.2179183959961,123.57021435708376,120.14504795375875,120.859443088754,126142800 +2021-05-12,120.14505767822266,121.97507799254855,119.6361790565564,120.76159245913604,112172300 +2021-05-13,122.29801940917969,123.45279014468096,121.60320080499332,121.91635859091211,105861300 +2021-05-14,124.72499084472656,125.15558560180872,123.15920190934219,123.55065100975592,81918000 +2021-05-17,123.57022094726562,124.21611308729157,122.493741513493,124.10846439728725,74244600 +2021-05-18,122.1805648803711,124.27480867265349,122.11206185786726,123.85400225833865,63342900 +2021-05-19,122.02399444580078,122.24907261430089,120.23312004612022,120.526708706034,92612000 +2021-05-20,124.58796691894531,124.98920424257356,122.42522009538611,122.55244532788751,76857100 +2021-05-21,122.74816131591797,125.26321143434745,122.5328639766621,125.08705974461714,79295400 +2021-05-24,124.38248443603516,125.20452835138838,123.24729017783544,123.31579321525894,63092900 +2021-05-25,124.1867446899414,125.5763892558692,123.61914391415893,125.08707232073915,72009500 +2021-05-26,124.13782501220703,124.6662801952147,123.71701852201225,124.24547370501993,56575900 +2021-05-27,122.60138702392578,124.91092845931593,122.40566621059594,123.73658864679605,94625600 +2021-05-28,121.94571685791016,123.11027588262051,121.88700210583085,122.88519022253215,71311100 +2021-06-01,121.6227798461914,122.6699019784518,121.29005293793631,122.40567810814753,67637100 +2021-06-02,122.38609313964844,122.56224486317687,121.3976932979945,121.62277149311544,59278900 +2021-06-03,120.89859008789062,122.1805785667547,120.49735272094428,122.01421513150538,76229200 +2021-06-04,123.1983413696289,123.4625726722834,121.20195777757243,121.41725514528493,75169300 +2021-06-07,123.2081298828125,123.61914805852969,122.16100788299765,123.47235371969634,71057600 +2021-06-08,124.03016662597656,125.71339992147556,123.51149976456149,123.89316056697146,74403800 +2021-06-09,124.41183471679688,125.01858120384323,123.81487651061582,124.49012603117782,56877900 +2021-06-10,123.41362762451172,125.44915668797772,123.2472642067215,124.30416692335963,71186400 +2021-06-11,124.62712860107422,124.71520819384888,123.40385484671293,123.82466131686404,53522400 +2021-06-14,127.69015502929688,127.74886975806045,124.35306937383847,125.08703334845377,96906500 +2021-06-15,126.86817169189453,127.80765254019511,126.6235169320033,127.1617603902723,62746300 +2021-06-16,127.36723327636719,128.09141657789377,125.71338001615365,127.58253061107676,91815000 +2021-06-17,128.97219848632812,129.71595852379107,126.87795430920667,127.02475612675201,96721700 +2021-06-18,127.67064666748047,128.6981847145641,127.45534928384315,127.91530142774639,108953300 +2021-06-21,129.47129821777344,129.57894690634825,126.44736905581905,127.51406019462506,79663300 +2021-06-22,131.11537170410156,131.21323957880873,128.80583022689916,129.30493548234813,74783600 +2021-06-23,130.84136962890625,131.44812362014463,130.38141746101007,130.90988013297442,60214200 +2021-06-24,130.5576171875,131.76131486331315,130.08786912604617,131.57537478888938,68711000 +2021-06-25,130.26393127441406,131.0272526395599,129.97034268800357,130.60645378064893,70783700 +2021-06-28,131.8982391357422,132.35819116099708,130.49882143563215,130.5575361737434,62111300 +2021-06-29,133.4151153564453,133.57169796299607,131.47745413113225,131.9178296460844,64556100 +2021-06-30,134.03163146972656,134.47200692367426,132.96492567634033,133.25851428981784,63261400 +2021-07-01,134.3350067138672,134.39372145259853,132.8572827706187,133.6793339104709,52485800 +2021-07-02,136.96749877929688,137.00663696239783,134.804744582645,134.9515314349465,78852600 +2021-07-06,138.98345947265625,140.08928866847637,137.07515561633554,137.07515561633554,108181800 +2021-07-07,141.47894287109375,141.79209315711816,139.60977717070656,140.47095165667832,104911600 +2021-07-08,140.1773681640625,140.97982784878258,137.66231057501108,138.5528573041526,105575500 +2021-07-09,142.0074005126953,142.53584819056374,139.59999125619547,139.69785912702397,99890800 +2021-07-12,141.41043090820312,143.19152447203606,140.9211214586938,143.08387579584243,76299700 +2021-07-13,142.5260772705078,144.30717110195238,140.55905836364727,140.95050000905363,100827100 +2021-07-14,145.96102905273438,146.3720622048418,144.5224578179845,144.93349097009192,127050800 +2021-07-15,145.30531311035156,146.79281784563116,143.94503359561688,146.04907294426016,106820300 +2021-07-16,143.26002502441406,146.55796605066817,142.76093474422927,145.28577338362382,93251400 +2021-07-19,139.404296875,140.98967007423758,138.64097512195883,140.6765047742497,121434600 +2021-07-20,143.025146484375,143.9548463868521,139.903364731854,140.39267418261483,96350000 +2021-07-21,142.2911834716797,143.0055860270602,141.53765766277516,142.41840870833036,74993500 +2021-07-22,143.6612548828125,145.03131534477524,142.69241681379228,142.81964204688137,77338200 +2021-07-23,145.3836212158203,145.540203823437,143.77868681909763,144.39522150375126,71447400 +2021-07-26,145.80442810058594,146.62646435226154,144.54200141958395,145.0998213327101,72434100 +2021-07-27,143.63192749023438,146.0197604502271,142.438011010238,145.93167338372012,104818600 +2021-07-28,141.88015747070312,143.82761436860707,139.49232507438956,141.71379405719455,118931200 +2021-07-29,142.5260772705078,143.41662418623008,141.48874347089355,141.59639216326153,56699500 +2021-07-30,142.74136352539062,143.2013156357775,141.02878032832388,141.29301163126834,70440600 +2021-08-02,142.40859985351562,143.80801745095812,142.14436861886256,143.23063599184002,62880000 +2021-08-03,144.20928955078125,144.87474327138378,142.0758924677375,142.69242718670878,64786600 +2021-08-04,143.80804443359375,144.63008072615645,143.15237156220167,144.12120964935443,56368300 +2021-08-05,143.9157257080078,144.6790474286487,143.04475528663332,143.83743438633402,46397700 +2021-08-06,143.22964477539062,144.1803285775889,142.729806727241,143.43546923928326,54126800 +2021-08-09,143.1806182861328,143.77847075197207,142.62197759620048,143.28842823751074,48908700 +2021-08-10,142.70040893554688,144.76838927434818,142.40638038902802,143.52367690186915,69023100 +2021-08-11,142.95523071289062,143.79810459984787,142.63180079586957,143.14144929737975,48493500 +2021-08-12,145.9248504638672,146.08166764811526,142.93558831686875,143.27862403804767,72282600 +2021-08-13,146.1306915283203,146.46391686661144,145.31721911667208,146.00327568224543,59375000 +2021-08-16,148.11048889160156,148.17910204241585,143.55309813191292,145.58186696938395,103296000 +2021-08-17,147.19900512695312,148.65932256875118,146.12090537704304,147.2382019565344,92229700 +2021-08-18,143.44528198242188,147.7184543955626,143.23945749374153,146.81677773378797,86326000 +2021-08-19,143.77847290039062,145.05258644801074,141.622288795524,142.14173267222196,86960300 +2021-08-20,145.2388153076172,145.54263929990177,143.85689170892408,144.50375147276918,60549600 +2021-08-23,146.72857666015625,147.19901341619334,144.9448142380219,145.3564482689187,60131800 +2021-08-24,146.640380859375,147.85569220624998,146.17973949954674,146.47376812676524,48606400 +2021-08-25,145.40545654296875,147.326430322186,144.85661116459667,146.82657724516397,58991300 +2021-08-26,144.60174560546875,146.1502818209155,144.5723442495669,145.3956270795529,48597200 +2021-08-27,145.64065551757812,145.7876623043235,143.90590065942186,144.54295000853472,55802400 +2021-08-30,150.07064819335938,150.43328990399013,145.6504691143869,146.0327017624141,90956700 +2021-08-31,148.8063201904297,149.75700391889114,148.27706586999156,149.61979260524265,86453100 +2021-09-01,149.4727783203125,151.89358979635324,149.30616564221367,149.7864127413778,80313700 +2021-09-02,150.590087890625,151.6387862531272,149.3649813670927,150.80570783515978,71115500 +2021-09-03,151.2271270751953,151.55055693814364,150.04121757771816,150.69787277040314,57808700 +2021-09-07,153.56954956054688,154.12819033773275,151.31535065096162,151.88380185111185,82278300 +2021-09-08,152.02102661132812,153.9125840013745,150.91352547223326,153.85378127804458,74420200 +2021-09-09,151.0017547607422,153.0011222642301,150.88413435118497,152.39347414202683,57305700 +2021-09-10,146.00326538085938,152.38361342288792,145.73863824034083,151.91317680467418,140893200 +2021-09-13,146.57174682617188,148.4045013917985,145.78767566355324,147.63024065247,102404300 +2021-09-14,145.1702117919922,148.06147503126564,143.98431710126377,147.35581250665328,109296300 +2021-09-15,146.0620880126953,146.46392651146115,143.45505793692854,145.60144679799546,83281300 +2021-09-16,145.82688903808594,146.00331217327675,144.28816285321537,145.4838681470228,68034100 +2021-09-17,143.15121459960938,145.85625880651142,142.8571861047404,145.85625880651142,129868800 +2021-09-20,140.0933837890625,141.9555397257547,138.4566432656741,140.93625767675672,123478900 +2021-09-21,140.57357788085938,141.7202904382326,139.93652864223833,141.06362035823236,75834000 +2021-09-22,142.94541931152344,143.51385551514431,140.83822735154473,141.57329118423013,76404300 +2021-09-23,143.9059295654297,144.15095089583022,142.73962563993675,143.72950643098542,64838200 +2021-09-24,143.99411010742188,144.5331599371337,142.66119368982206,142.75920818791974,53477900 +2021-09-27,142.47496032714844,143.05322187803952,140.95584044871157,142.572974815072,74150700 +2021-09-28,139.08389282226562,141.86733117108918,138.8682728841963,140.39720338693283,108972300 +2021-09-29,139.98561096191406,141.57334465460875,139.20153958660052,139.63277959076885,74602000 +2021-09-30,138.6820831298828,141.5047338477109,138.46646314699782,140.79907116825387,89056700 +2021-10-01,139.8091583251953,140.0737855364966,136.3396630361158,139.07409436984747,94639600 +2021-10-04,136.36904907226562,139.3779177030337,135.51637976546095,138.93686741546034,98322000 +2021-10-05,138.29983520507812,139.40733636302537,136.58468595582545,136.7121018284855,80861100 +2021-10-06,139.17208862304688,139.3190954107542,135.61437481140692,136.69247443763487,83221100 +2021-10-07,140.43638610839844,141.34787301957712,139.87774538308582,140.21097072484505,61732700 +2021-10-08,140.05416870117188,141.308676557224,139.72094332329533,141.1616697596059,58773200 +2021-10-11,139.96595764160156,141.9261279382809,138.9858724932619,139.43671824165966,64452200 +2021-10-12,138.69187927246094,140.39723324856945,138.2312379390566,140.37762735323497,73035900 +2021-10-13,138.10379028320312,138.5840223945528,136.42783823964862,138.42722014967543,78762700 +2021-10-14,140.89706420898438,141.01468462005715,138.6918721765435,139.27992936716066,69907100 +2021-10-15,141.95550537109375,142.0143080772975,140.65199054890746,140.90682221567036,67940300 +2021-10-18,143.63148498535156,143.91570310514462,140.3089968495944,140.59321496938745,85589200 +2021-10-19,145.7974853515625,146.1993239178965,143.63150519092176,144.08233605883038,76378900 +2021-10-20,146.2875213623047,146.76776852622643,145.17022475769727,145.73867600634514,58418800 +2021-10-21,146.5031280517578,146.65994526923677,144.92519031879408,145.84647277784177,61421000 +2021-10-22,145.72886657714844,147.18918391188018,145.6798593275794,146.7089517488773,58883400 +2021-10-25,145.6798553466797,146.3953133151153,144.68016431145858,145.71905217231605,50720600 +2021-10-26,146.34634399414062,147.8360628807674,146.04250498938632,146.3561394633592,60893400 +2021-10-27,145.8856964111328,146.74816126750608,145.53286512059833,146.38553450817577,56094900 +2021-10-28,149.53160095214844,150.1196430787896,146.73835224713616,146.83636674569945,100077900 +2021-10-29,146.81678771972656,146.95399906987456,143.49429899729273,144.2881657342144,124953200 +2021-11-01,145.99346923828125,146.7187225723951,144.8565670408628,146.02287059210153,74588300 +2021-11-02,147.03240966796875,148.5515449646106,145.68968255749544,145.69949298222642,69122000 +2021-11-03,148.4730987548828,148.94353542048876,146.83635841514152,147.3949991515026,54511500 +2021-11-04,147.95367431640625,149.39438585976856,147.64003986144715,148.5613223792471,60394600 +2021-11-05,148.48365783691406,149.38665026440313,147.28620777558916,149.0823828675765,65463900 +2021-11-08,147.65919494628906,148.76831225932858,147.3843718030694,148.61126618413505,55020900 +2021-11-09,148.02235412597656,148.63088895973019,147.2862174812468,147.42362905586018,56787900 +2021-11-10,145.185791015625,147.35494715999016,145.11709270904024,147.24697984100837,65187100 +2021-11-11,145.13668823242188,146.6678499743664,144.95019789623214,146.20655148055175,41000000 +2021-11-12,147.217529296875,147.61993930798695,144.75391557147125,145.68635239017757,63804000 +2021-11-15,147.22735595703125,149.0726102775832,146.6678848155588,147.59051197583477,59222800 +2021-11-16,148.2088623046875,148.6898103620709,146.5795427405627,147.16845811789992,59256200 +2021-11-17,150.65280151367188,152.134884350233,148.19901305641005,148.20882281861407,88807000 +2021-11-18,154.9518585205078,155.73707397326015,150.2209612525499,150.86876512432602,137827700 +2021-11-19,157.58233642578125,158.04364996719235,153.63663942388337,154.7359321301873,117305600 +2021-11-22,158.04364013671875,162.63712578240353,158.0240056319732,158.69142902593197,117467900 +2021-11-23,158.42642211914062,158.80921256910548,156.11985467913553,158.14177423416734,96041900 +2021-11-24,158.9466094970703,159.14290958570567,156.6891210359219,157.77860375109535,69463600 +2021-11-26,153.91143798828125,157.48415368919132,153.46975902346642,156.62043026238874,76959800 +2021-11-29,157.27804565429688,158.2104823634522,155.85483622919187,156.42411700388635,88748200 +2021-11-30,162.2445068359375,162.46044143301737,156.963948923827,157.03266219414206,174048100 +2021-12-01,161.7243194580078,167.1520991872997,161.48875033716251,164.3842181801369,152052500 +2021-12-02,160.73300170898438,161.16487100269978,154.88317666704097,155.80580379875286,136739200 +2021-12-03,158.8484649658203,161.91080351077787,156.76765689784938,160.98817654426608,118023100 +2021-12-06,162.26417541503906,164.77685309775336,161.24339074597364,161.25320051090569,107497000 +2021-12-07,168.01580810546875,168.40842327282738,165.2283078125401,165.95463463960064,120405400 +2021-12-08,171.84375,172.7074885052505,167.54470695562583,168.9482820266579,116998900 +2021-12-09,171.33335876464844,173.4828803001478,170.70518938695935,171.67689521138408,108923700 +2021-12-10,176.13299560546875,176.3096762256293,171.46098609968757,171.97137847524502,115402700 +2021-12-13,172.49154663085938,178.76343034110303,172.28542177740803,177.77209005921313,153237000 +2021-12-14,171.10760498046875,174.4545765485848,169.02679683922992,172.01059747528444,139380400 +2021-12-15,175.98577880859375,176.18207896529583,169.12497825280275,171.8732253768577,131063300 +2021-12-16,169.07591247558594,177.79177788965106,167.5938289552229,175.96615783607643,150185800 +2021-12-17,167.97657775878906,170.26351088458148,166.55338314622006,166.7889373031069,195432700 +2021-12-20,166.61228942871094,167.4269492537598,164.3646250741957,165.16946015716837,107499100 +2021-12-21,169.79241943359375,169.99852935951952,165.993943197369,168.38884408640686,91185900 +2021-12-22,172.39340209960938,172.60933673314887,168.9679072100419,169.84145550872807,92135300 +2021-12-23,173.0215606689453,173.5810317235857,172.03023535098566,172.59951616954052,68356600 +2021-12-27,176.9967041015625,177.08503690822866,173.7969687428298,173.8165882709296,74919600 +2021-12-28,175.97593688964844,177.97823723210308,175.22999037629228,176.8298657019043,79144300 +2021-12-29,176.0642852783203,177.29117986304104,174.84720045865078,176.01520649958337,62348900 +2021-12-30,174.9060821533203,177.23228437904302,174.79811483502314,176.1526111960713,59773000 +2021-12-31,174.28775024414062,175.91705492574604,173.983467796318,174.79812762549122,64062300 +2022-01-03,178.64566040039062,179.4995892112378,174.42515503160624,174.5429321185891,104487900 +2022-01-04,176.3783416748047,179.55845745447346,175.8090608575143,179.25419002967348,99310400 +2022-01-05,171.6867218017578,176.83967914737053,171.41189860813105,176.29003276011701,94537600 +2022-01-06,168.82069396972656,172.05969865170314,168.46734773211566,169.50775193820877,96904000 +2022-01-07,168.98751831054688,170.92110500332652,167.86859126297153,169.69421065393524,86709100 +2022-01-10,169.00718688964844,169.31145435336728,165.06148967296951,165.95467253383114,106765600 +2022-01-11,171.84375,171.9418925722171,167.66249900972133,169.13477238363146,76138300 +2022-01-12,172.28541564941406,173.90491024436494,171.58854802680634,172.8645062038037,74805200 +2022-01-13,169.00718688964844,173.35529415174287,168.6145716326397,172.53082457713552,84505800 +2022-01-14,169.8709259033203,170.56779364905069,167.92751407393143,168.17289299389805,80440800 +2022-01-18,166.66134643554688,169.35068950665382,166.27855596311068,168.33972966979056,90956700 +2022-01-19,163.1573028564453,167.91765859864194,162.872669976532,166.85762015573826,94815000 +2022-01-20,161.46913146972656,166.54356549753263,161.14522951347425,163.8934762825247,91420500 +2022-01-21,159.40792846679688,163.25546724898456,159.29996116779535,161.38076913756592,122848900 +2022-01-24,158.6325225830078,159.29996087836932,151.84043745137762,157.06210684561927,162294600 +2022-01-25,156.8265380859375,159.7514499461909,154.11756082376363,156.04132272716996,115798400 +2022-01-26,156.73825073242188,161.3513717096446,154.9028210933392,160.4778233011423,108275300 +2022-01-27,156.2769012451172,160.8114981245685,155.35427426622283,159.44719215998208,121954600 +2022-01-28,167.1815185546875,167.20115305601814,159.79070884938122,162.6469222351692,179935700 +2022-01-31,171.54930114746094,171.76523578487254,166.37670956776643,167.0147037152971,115541600 +2022-02-01,171.3824005126953,171.60814485583444,169.12491215109566,170.79348529602197,86213900 +2022-02-02,172.58970642089844,172.62897543344508,170.1261075578704,171.51985796847407,84914300 +2022-02-03,169.7040252685547,172.9822984461671,168.93844437078735,171.25482156772748,89418100 +2022-02-04,169.4190673828125,171.0996042103979,167.7385305552271,168.72129677126426,82465400 +2022-02-07,168.7016143798828,170.95214191132882,168.00384392494493,169.88093057527257,77251200 +2022-02-08,171.81700134277344,172.32804392038554,168.4755875609354,168.7704203940124,74829200 +2022-02-09,173.24200439453125,173.60562304759242,171.88578239754793,173.01597239364082,71285000 +2022-02-10,169.15370178222656,172.4557965844286,168.59353288500876,171.13889356700463,90865900 +2022-02-11,165.73367309570312,170.09715694195197,165.14400744238606,169.3600823732159,98670700 +2022-02-14,165.96951293945312,166.65744608251217,163.68948881295134,164.4855268067638,86185500 +2022-02-15,169.81216430664062,169.96941049690344,167.3159447684623,168.02353762882288,62527400 +2022-02-16,169.57627868652344,170.3526572392932,167.11936365193407,168.88834547600229,61177400 +2022-02-17,165.96951293945312,168.94729246969413,165.5665753142979,168.08245366366685,69589300 +2022-02-18,164.416748046875,167.6009001587836,163.32587723184227,166.89332246399607,82772700 +2022-02-22,161.48812866210938,163.81727946148703,159.35551308277192,162.1367428748668,91162800 +2022-02-23,157.3113555908203,163.28655947595425,156.99686328327715,162.6870716360414,90009200 +2022-02-24,159.9353790283203,160.04348391166852,149.38046449387545,149.95047069736393,141147500 +2022-02-25,162.00900268554688,162.27433874391238,158.097582687372,161.0163992959612,91974200 +2022-02-28,162.2743377685547,162.569170605232,159.63069449285575,160.249841950296,95056600 +2022-03-01,160.3874053955078,163.72881873455478,159.1786074354802,161.86155436972356,83474400 +2022-03-02,163.68954467773438,164.47576067919033,160.14175790506158,161.55694370851774,79724800 +2022-03-03,163.36517333984375,165.998993781618,162.69689971772982,165.5665743810418,76678400 +2022-03-04,160.35797119140625,162.69695972309876,159.30641907564566,161.65522987158562,83737200 +2022-03-07,156.5546417236328,162.17606497919274,156.29911294194886,160.54466966467405,96418800 +2022-03-08,154.72671508789062,160.07296568987567,153.11497909721768,156.0829372614916,131148300 +2022-03-09,160.1417236328125,160.59380261054181,156.66273844037977,158.69705635061237,91454900 +2022-03-10,155.7880859375,157.62585374072557,153.2918516527838,157.43912578291366,105342000 +2022-03-11,152.06338500976562,156.5349734862068,151.83735301963387,156.1909993742422,96970100 +2022-03-14,148.02423095703125,151.46391244119621,147.51320336208943,148.83992865134607,108732100 +2022-03-15,152.41720581054688,152.88894438184133,147.78838542286357,148.29941304803273,92964300 +2022-03-16,156.8396453857422,157.24258310394316,151.79806526213048,154.34342597712845,102300200 +2022-03-17,157.85191345214844,158.2253694333253,154.9134519028564,155.87655864840266,75615400 +2022-03-18,161.1539764404297,161.6453594768953,157.00670241299437,157.74377696769278,123511700 +2022-03-21,162.5298614501953,163.48314576119236,160.20069560988745,160.6920786569655,95811400 +2022-03-22,165.91058349609375,166.50023417031582,162.06796436975657,162.6576150439786,81532000 +2022-03-23,167.27662658691406,169.66474104201137,164.76073274272346,165.09488461775757,98062700 +2022-03-24,171.07008361816406,171.13886943985568,167.2766062849375,168.11194838158724,90131400 +2022-03-25,171.7088623046875,172.2592088191548,169.7728122475536,170.88334253298657,80546200 +2022-03-28,172.57373046875,172.701479862601,169.03576656556126,169.202835000459,90371900 +2022-03-29,175.8758087158203,175.92493501881802,173.30095161685145,173.64492571274934,100589400 +2022-03-30,174.7063446044922,176.51463074136956,173.65477761444038,175.47290101025155,92633200 +2022-03-31,171.60076904296875,174.96182690829795,171.39438158819624,174.77509897203208,103049300 +2022-04-01,171.3059539794922,171.86613784627107,168.97680315531144,171.0307806751932,78751300 +2022-04-04,175.36480712890625,175.413948439192,171.43374223920495,171.56150664678344,76468400 +2022-04-05,172.0430450439453,175.22721286513178,171.4140752886788,174.44099692209318,73401800 +2022-04-06,168.86868286132812,170.63766465296877,167.19798366759716,169.38954763944744,89058800 +2022-04-07,169.17337036132812,170.37234630580983,166.92284239749918,168.2102636995684,77594700 +2022-04-08,167.15869140625,168.81956860456353,166.28403012969582,168.81956860456353,76575500 +2022-04-11,162.89346313476562,166.1169343880837,162.64777163682479,165.80245706854532,72246700 +2022-04-12,164.77056884765625,166.94247354315863,163.76814322121325,165.12436524547022,79265200 +2022-04-13,167.4633331298828,168.09230281785548,163.89590247589382,164.5052126435429,70618900 +2022-04-14,162.44140625,168.3183584761883,162.19571471867903,167.67955149726123,75329400 +2022-04-18,162.22518920898438,163.7288199744053,160.75104022360551,161.09499932270256,69023900 +2022-04-19,164.51504516601562,164.92782013945308,161.08520094874402,162.17607195952326,67723800 +2022-04-20,164.34796142578125,165.9695343967265,163.23744599263426,165.851592274227,67929800 +2022-04-21,163.5519561767578,168.57389227267697,163.05075079188728,165.99904951757392,87227800 +2022-04-22,159.00172424316406,164.97694406303006,158.7167286660117,163.5912552281569,84882400 +2022-04-25,160.07296752929688,160.35796313638966,155.72914261422412,158.343289375942,96046400 +2022-04-26,154.09771728515625,159.54223452082468,154.01909420285892,159.45378917667253,95623200 +2022-04-27,153.87171936035156,157.03621289741787,152.70222512048082,153.2230900346685,88063200 +2022-04-28,160.81983947753906,161.68467841985887,156.19100467866673,156.50549701980856,130216800 +2022-04-29,154.93309020996094,163.33574447827155,154.5399897161662,159.0508831142893,131747600 +2022-05-02,155.2377471923828,155.50308325510557,150.6285715632027,154.00928950852122,123055300 +2022-05-03,156.7315216064453,157.9403346152518,153.6259923615283,155.42444099254382,88966500 +2022-05-04,163.15882873535156,163.61089273431188,156.5153204398764,156.91825813151257,108256500 +2022-05-05,154.06822204589844,161.25223873479916,152.2795808204663,161.02620676532553,130525300 +2022-05-06,154.7965545654297,156.92245186539364,151.74549742097102,153.54660360417492,116124600 +2022-05-09,149.65899658203125,153.36947314118723,149.0980045924118,152.48367497430928,131577900 +2022-05-10,152.07028198242188,154.26508109944479,150.5152283773258,153.06434369573583,115366700 +2022-05-11,144.18675231933594,152.99542804107662,143.50764507620434,151.0762217134339,142689800 +2022-05-12,140.3089599609375,143.89148337119573,136.60833616921673,140.5156506463481,182602000 +2022-05-13,144.78713989257812,145.7615132406745,140.85029972421802,142.3069263815123,113990900 +2022-05-16,143.2418975830078,145.1906439345295,141.90337156179376,143.25174929311245,86643800 +2022-05-17,146.8834991455078,147.40512922042456,144.36390904477065,146.5094945567554,78336300 +2022-05-18,138.59646606445312,145.0331931657119,137.69097960525806,144.5312514480339,109742900 +2022-05-19,135.18124389648438,139.4231864175674,134.4430864271214,137.6712938917074,136095600 +2022-05-20,135.4174346923828,138.47832804040868,130.5160736621358,136.89374952227598,137426100 +2022-05-23,140.8502960205078,140.99792151579808,135.47650272414663,135.61429152570187,117726300 +2022-05-24,138.1437225341797,139.72830130754187,135.16156729888525,138.58661405091433,104132700 +2022-05-25,138.3011932373047,139.5511291229351,136.15560763062282,136.24418292623076,92482700 +2022-05-26,141.50973510742188,142.0608903922334,134.97458026863987,135.22063280777752,90601500 +2022-05-27,147.27720642089844,147.31656821908913,142.96636115304457,143.09431327841077,90978500 +2022-05-31,146.48980712890625,148.28107646818216,144.52138720505258,146.71618623300301,103718400 +2022-06-01,146.36184692382812,149.34400143591907,145.34809700677113,147.53304397850013,74286600 +2022-06-02,148.8223876953125,148.88143788729292,144.54106856251593,145.49575338046964,72348100 +2022-06-03,143.08447265625,145.63357327354205,142.17900114416437,144.58046123211946,88570300 +2022-06-06,143.8324432373047,146.22408125410382,142.61201747807138,144.70838950271786,71598400 +2022-06-07,146.36184692382812,146.64726115984234,141.824639115417,142.07069156702747,67808200 +2022-06-08,145.6237335205078,147.5035634046079,145.1316284687619,146.23393897895934,53950200 +2022-06-09,140.38771057128906,145.61386314826538,140.2794468730643,144.75760527366657,69473000 +2022-06-10,134.9647216796875,138.53739375627023,134.89581977133565,138.06497716276021,91437900 +2022-06-13,129.79763793945312,133.0652077917095,129.36458307542827,130.77199636565416,122207100 +2022-06-14,130.6636962890625,131.7758582423787,129.40390886311616,131.0278641513014,84784300 +2022-06-15,133.2915496826172,135.1713943388265,130.07319387777778,132.16955091202541,91533000 +2022-06-16,128.00637817382812,130.2995897771678,127.00247954942031,129.9944870133419,108123900 +2022-06-17,129.482666015625,130.97866943008026,127.76029850473763,128.01620271778103,134520300 +2022-06-21,133.724609375,134.8958216908251,131.21488586149243,131.31329785187046,81000500 +2022-06-22,133.2128448486328,135.5847798082292,131.7955798825567,132.6616745701608,73409200 +2022-06-23,136.08673095703125,136.40167037101077,133.48841696582116,134.65962935518908,72433800 +2022-06-24,139.42320251464844,139.66925503284406,137.56304607780373,137.6909831751248,89116800 +2022-06-27,139.42320251464844,141.2243087499828,138.74409516157192,140.4467743824865,70207900 +2022-06-28,135.26983642578125,141.15540852649434,135.1517360213465,139.88578412525837,67083400 +2022-06-29,137.0315704345703,138.44883540642064,134.51199493699397,135.2895293397043,66242400 +2022-06-30,134.5612030029297,136.1851436237319,131.65778627775248,135.08283314259847,98964500 +2022-07-01,136.73626708984375,136.84453077392945,133.51791169701116,133.8919012274295,71051600 +2022-07-05,139.32476806640625,139.3739815709903,134.76787086684834,135.59461869744254,73353800 +2022-07-06,140.6632843017578,141.84433323860637,138.85234159739986,139.11808248899268,74064300 +2022-07-07,144.0391387939453,144.23597778940012,141.0176069003368,141.0274435938611,66253700 +2022-07-08,144.71823120117188,145.22018791054785,142.7104494172261,142.96633860975416,64547800 +2022-07-11,142.58250427246094,144.3245602553875,141.50971892875648,143.36987531125314,63141600 +2022-07-12,143.55686950683594,146.10596977247354,142.7596618190989,143.4584425008562,77588800 +2022-07-13,143.1927032470703,144.1375363377061,139.87590568375293,140.73217850583993,71185600 +2022-07-14,146.12567138671875,146.5980880188513,140.9880935814835,141.80498974783282,78140700 +2022-07-15,147.79881286621094,148.47792016432717,145.85991797831633,147.4149715696043,76259900 +2022-07-18,144.7477569580078,149.17670150055542,144.38358908348172,148.35980548278783,81420900 +2022-07-19,148.61572265625,148.8420867705286,144.59030701772662,145.58435379595355,82982400 +2022-07-20,150.62350463867188,151.29277530503674,147.99566551668846,148.73382307964516,64823400 +2022-07-21,152.8970184326172,153.11354581836207,149.54085897142338,152.06043398607093,65086600 +2022-07-22,151.65692138671875,153.8123437761435,150.98766576840873,152.93639744167695,66675400 +2022-07-25,150.53494262695312,152.5919382797309,149.87552361463057,151.57820300519043,53623900 +2022-07-26,149.20623779296875,150.67270104012428,148.41886681163666,149.8558049610543,55138700 +2022-07-27,154.31427001953125,154.84575179759253,149.75738820549032,150.17075457850913,78620700 +2022-07-28,154.86544799804688,155.1508622874104,151.97186822338708,154.50128008945563,81378700 +2022-07-29,159.94395446777344,161.0462798301135,156.981487908036,158.6940186370959,101786900 +2022-08-01,158.9597625732422,161.00692131549803,158.34955713719083,158.4676575395611,67829400 +2022-08-02,157.48342895507812,159.84554184971918,157.1094393855953,157.57201926429306,59907000 +2022-08-03,163.5068359375,163.95956419348943,158.21178056001122,158.30035586863676,82507500 +2022-08-04,163.1918487548828,164.55006328617097,161.83363422359466,163.38868774052628,55474100 +2022-08-05,162.96519470214844,163.45798329811657,160.64908228561242,160.8560601129534,56697000 +2022-08-08,162.4921112060547,165.3897106347166,161.8317762742878,163.97047703384425,60276900 +2022-08-09,162.54136657714844,163.4283949524473,160.89545469517256,161.65435324056202,63135500 +2022-08-10,166.79908752441406,166.89763621928432,164.49282549147833,165.26157448955212,70170500 +2022-08-11,166.05990600585938,168.52384897861626,165.76422984138568,167.6072543726192,57149200 +2022-08-12,169.6178436279297,169.68682621240507,166.9567731335436,167.3707287952548,68039400 +2022-08-15,170.69210815429688,170.88922057556053,168.8786498167292,169.04619612673898,54091700 +2022-08-16,170.53440856933594,171.20460883381332,169.1841727217911,170.28801428832625,56377100 +2022-08-17,172.03250122070312,173.60941569871042,170.08106259876365,170.27817502867526,79542000 +2022-08-18,171.6382598876953,172.37744277272193,170.6231165953559,171.24403503116682,62290100 +2022-08-19,169.04617309570312,171.2341552626783,168.83919530641123,170.53438896800841,70346300 +2022-08-22,165.15316772460938,167.41013274664442,164.72936173644348,167.24258643834608,69026800 +2022-08-23,164.8180389404297,166.27670374105745,164.24640247078557,164.6702084046216,54147100 +2022-08-24,165.11373901367188,165.68537556627746,163.85220146265053,164.90677623350408,53841500 +2022-08-25,167.57769775390625,167.68611185239817,165.9219352009918,166.34572619773232,51218200 +2022-08-26,161.26011657714844,168.58296208169574,161.20098435870386,168.10988929542629,78961000 +2022-08-29,159.0524444580078,160.55051089039753,157.514946518142,158.82575088680454,73314000 +2022-08-30,156.61805725097656,160.2154075742502,155.44521812063925,159.79161664881417,77906200 +2022-08-31,154.95245361328125,158.26399371424608,154.87360563007792,157.99788365077418,87991100 +2022-09-01,155.68179321289062,156.13515033839954,152.43923555152656,154.38082398932775,74229900 +2022-09-02,153.562744140625,158.0471223283173,152.73486310130946,157.44591977956676,76957800 +2022-09-06,152.30125427246094,154.82432967651317,151.47337297526548,154.21327658173306,73714800 +2022-09-07,153.7106170654297,154.410368411757,151.3945047755551,152.587059729615,87449600 +2022-09-08,152.23223876953125,154.10482916146404,150.47789777328236,152.4096354211257,84923800 +2022-09-09,155.1002655029297,155.54378723487187,152.51805827855026,153.2276750032018,68028800 +2022-09-12,161.0728759765625,161.89090686431402,157.00245233153106,157.2882631049793,104956000 +2022-09-13,151.62118530273438,158.2245492067868,151.15796283866058,157.59378043168627,122656600 +2022-09-14,153.06996154785156,154.83415280049869,151.39448365467393,152.55745729673092,87965400 +2022-09-15,150.17239379882812,153.00101060134492,149.19668199140034,152.41950862141564,90481100 +2022-09-16,148.5264892578125,149.16712349652025,146.23009244998983,149.02914328242736,162278800 +2022-09-19,152.25196838378906,152.3308163679246,146.94957303943247,147.15653583891242,81474200 +2022-09-20,154.6370391845703,155.80002796923935,150.8721425262803,151.18751937449895,107689800 +2022-09-21,151.50294494628906,156.45054724189947,151.3846804817515,155.07072998785742,101696800 +2022-09-22,150.53704833984375,152.24209247430875,148.73344048207258,150.18223999013938,86652500 +2022-09-23,148.2603759765625,149.28538472080464,146.4173513628068,149.00942429859677,96029900 +2022-09-26,148.59548950195312,151.55222131778743,147.4817823722665,147.50149812854582,93339400 +2022-09-27,149.57118225097656,152.48849721993565,147.78729002305445,150.5370586818527,84442700 +2022-09-28,147.6788787841797,148.46734352386844,142.75099295951767,145.5106120290712,146691400 +2022-09-29,140.42503356933594,144.603886261403,138.65099162276434,143.99283321708396,128138200 +2022-09-30,136.20677185058594,141.03610936010895,136.00965940990883,139.2423515609022,124925300 +2022-10-03,140.3954620361328,141.00653009557303,135.70412021518845,136.2166245441246,114311700 +2022-10-04,143.99281311035156,144.11107754403744,142.1793399077984,142.9382384476115,87830100 +2022-10-05,144.28848266601562,145.25435906019973,140.94737686981628,141.9921012373244,79471000 +2022-10-06,143.3324737548828,145.41204208560697,143.12551098076761,143.7069978739473,68402200 +2022-10-07,138.0695037841797,141.03610072606975,137.4387349893986,140.4841648717613,85925600 +2022-10-10,138.39474487304688,139.84354452092543,136.5714361256321,138.39474487304688,74899000 +2022-10-11,136.97552490234375,139.31135326076313,136.22649159037823,137.88225418694904,77033700 +2022-10-12,136.34474182128906,138.33561191162715,136.16734514961954,137.123356205743,70433700 +2022-10-13,140.9276885986328,141.51902589270472,132.43200294708785,133.04307103462438,113224000 +2022-10-14,136.38418579101562,142.43562955432296,136.19692370577837,142.22865171308297,88598000 +2022-10-17,140.35604858398438,140.83897177317823,138.24691403880277,139.035378783641,85250900 +2022-10-18,141.6767120361328,144.58416155365336,138.58200045824861,143.39162165141138,99136600 +2022-10-19,141.78512573242188,142.85940118883795,139.45916311704835,139.6464251768979,61758300 +2022-10-20,141.32191467285156,143.78585768272674,140.59258212799125,140.95725591977873,64522000 +2022-10-21,145.14596557617188,145.71760218486398,140.5925884624425,140.80941666017796,86548600 +2022-10-24,147.2944793701172,148.06322822559991,143.89424173414176,145.06708076816867,75981900 +2022-10-25,150.14280700683594,150.2906525903393,147.20579155352908,147.92525860269856,74732300 +2022-10-26,147.1959686279297,149.79789197212497,145.90484979505857,148.7827486054812,88194300 +2022-10-27,142.71157836914062,146.900281375259,142.0512434645865,145.934419951747,109180200 +2022-10-28,153.49378967285156,155.2284000306861,145.68802050452555,146.06252959255997,164762400 +2022-10-31,151.12841796875,152.01544655256544,149.72890002224932,150.95102127521648,97943200 +2022-11-01,148.4771728515625,153.2079455809234,146.97910660092256,152.84328689393647,80379300 +2022-11-02,142.93826293945312,149.97528368505897,142.90869682596562,146.80172383520585,93604600 +2022-11-03,136.87696838378906,140.7404292605941,136.74883853349507,140.01109670781145,97918500 +2022-11-04,136.6104278564453,140.84556152923415,132.6615790911303,140.27297665062395,140814800 +2022-11-07,137.1435089111328,137.37056348588825,133.93506945075268,135.35665734492238,83374600 +2022-11-08,137.716064453125,139.62137625048666,135.73177389359924,138.61443092612598,89908500 +2022-11-09,133.1453094482422,136.77825830980785,132.8688912272567,136.72889468527546,74917800 +2022-11-10,144.99183654785156,144.99183654785156,137.7160881791185,139.43384265889435,118854000 +2022-11-11,147.78564453125,148.09167786414133,142.5238023668343,143.955271925704,93979700 +2022-11-14,146.3837890625,148.35821299381362,145.54465286622803,147.06496772898868,73374100 +2022-11-15,148.1212921142578,151.6258979697989,146.66022247085542,150.2734222564666,89868300 +2022-11-16,146.88729858398438,147.95348958195228,145.40648026408388,147.22296218487898,64218300 +2022-11-17,148.79258728027344,149.54286294425333,144.28102140876982,144.5574395514813,80389400 +2022-11-18,149.3553009033203,150.74727347635653,148.05218886107582,150.36226138845927,74829600 +2022-11-21,146.1172637939453,148.4470850528785,145.83097890062086,148.2397789385964,58724100 +2022-11-22,148.25950622558594,148.49644255294848,145.05106689456673,146.23573346771818,51804100 +2022-11-23,149.1381378173828,149.88841358362208,147.4302500541231,147.53884398667913,58301400 +2022-11-25,146.21600341796875,146.97616104993173,145.23865789115922,146.4134428504666,35195900 +2022-11-28,142.375732421875,144.7647839323927,141.54647786060335,143.2839657599813,69246000 +2022-11-29,139.36471557617188,142.95816663670598,138.55520957308642,142.44481218129837,83763800 +2022-11-30,146.1370086669922,146.81818743880567,138.75266623992653,139.59178750228543,111380900 +2022-12-01,146.41343688964844,147.22295811269422,144.7351791862477,146.31472470924987,71250400 +2022-12-02,145.91981506347656,146.10738776877085,143.7874333564375,144.09348175456344,65447400 +2022-12-05,144.75491333007812,148.99004656094093,143.90591033158032,145.8803345082114,68826400 +2022-12-06,141.08248901367188,145.4163496587564,140.10514358274577,145.18929508684244,64727200 +2022-12-07,139.13766479492188,141.536582777895,138.20968308402922,140.37167982245785,69721100 +2022-12-08,140.82579040527344,141.6846751168045,139.2956238058851,140.53950554386986,62128300 +2022-12-09,140.34207153320312,143.70846830830249,139.0981746838461,140.51976247530513,76097000 +2022-12-12,142.64227294921875,142.65213964669184,139.25612782207975,140.87515496362036,70462700 +2022-12-13,143.60972595214844,148.05217980078905,142.39545945134458,147.58818897150496,93886200 +2022-12-14,141.37864685058594,144.78452547159364,139.35485909896488,143.49128007302596,82291200 +2022-12-15,134.75445556640625,139.98668286120417,134.29046466082826,139.3055040822211,98931900 +2022-12-16,132.7898712158203,135.88971607194347,132.01984711589319,134.9420010552602,160156900 +2022-12-19,130.67724609375,133.47105782876667,129.64068555678134,133.3822123650824,79592600 +2022-12-20,130.608154296875,131.54600271059752,128.22896969448558,129.70978773625592,77432800 +2022-12-21,133.71788024902344,135.06048935091275,131.05241050570748,131.27946507821224,85928000 +2022-12-22,130.5390625,132.83926868979583,128.63375022087482,132.63196256739838,77852100 +2022-12-23,130.1737823486328,130.72661868998517,127.9821703785141,129.24580060550824,63814900 +2022-12-27,128.36717224121094,129.72952959065904,127.07392696075074,129.69991443642402,69007800 +2022-12-28,124.42821502685547,129.35440133807893,124.2603907760934,128.01179226832107,85438400 +2022-12-29,127.95257568359375,128.81144548956613,126.09661943237761,126.35328918514811,75703700 +2022-12-30,128.2684783935547,128.2882268560697,125.80045533922235,126.76792664300454,77034200 +2023-01-03,123.4706039428711,129.2260441509053,122.5821116407929,128.61397753423014,112117500 +2023-01-04,124.7441177368164,127.01470850998557,123.48048749262259,125.26733892869382,89113600 +2023-01-05,123.42124938964844,126.13608257581905,123.16457967496471,125.50426745503849,80962700 +2023-01-06,127.96241760253906,128.62384785031838,123.29290895151365,124.3985891287467,87754700 +2023-01-09,128.4856414794922,131.70396238313268,128.22897177101316,128.80155656407595,70790800 +2023-01-10,129.05819702148438,129.58141808103522,126.48157356852431,128.5942062609533,63896200 +2023-01-11,131.78297424316406,131.8027076431601,128.7917222043787,129.57161328681664,69458900 +2023-01-12,131.70399475097656,132.5431161562632,129.759185341571,132.1679857307026,71379600 +2023-01-13,133.03668212890625,133.19463966232263,129.97633400317605,130.3415976184994,57809700 +2023-01-17,134.2016143798828,135.53434166770566,132.4147629011091,133.10580835372033,63646600 +2023-01-18,133.48095703125,136.83747220518643,133.3032510170013,135.0703691429246,69672800 +2023-01-19,133.54019165039062,134.50765533885576,132.0593734264766,132.36540678256628,58280400 +2023-01-20,136.10691833496094,136.25500917828725,132.5036004355903,133.55004278165805,80223600 +2023-01-23,139.30548095703125,141.48722602727366,136.1365239219778,136.35371175932897,81760300 +2023-01-24,140.7073211669922,141.32926952973608,138.50584268721101,138.5157093840139,66435100 +2023-01-25,140.0458984375,140.60860145852004,137.03489874919626,139.0883015683729,65799300 +2023-01-26,142.1190643310547,142.4053492196724,140.08539469738815,141.33915831562229,54105100 +2023-01-27,144.06385803222656,145.34723680622537,141.25031251687773,141.3292912944412,70555800 +2023-01-30,141.17132568359375,143.68871946900538,141.02324989890042,143.10626796433064,64015300 +2023-01-31,142.44483947753906,142.49420309949798,140.4605484095562,140.87517571941848,65874500 +2023-02-01,143.57025146484375,144.7351696002277,139.51282411039048,142.1289302044529,77663600 +2023-02-02,148.89132690429688,149.24670877710787,146.27520596359832,146.99586653400996,118339000 +2023-02-03,152.52427673339844,155.36745253753844,145.93957351960248,146.13701293629845,154357300 +2023-02-06,149.78970336914062,151.14219433077403,148.8518547888618,150.61897306818702,69858300 +2023-02-07,152.67234802246094,153.24493285853742,148.71363285221915,148.71363285221915,83322600 +2023-02-08,149.9772491455078,152.60323674930237,149.23684012618935,151.91219134400382,64120100 +2023-02-09,148.940673828125,152.35643407265164,148.49643142830433,151.81346444457745,56007100 +2023-02-10,149.30653381347656,149.63281307537432,147.53673245711806,147.77403058031547,57450700 +2023-02-13,152.11447143554688,152.51983488560623,149.21751602061343,149.2471763928944,62199000 +2023-02-14,151.47181701660156,152.03539434579272,149.15821711991074,150.40399819813007,61707600 +2023-02-15,153.5778045654297,153.74588507311654,151.15544476328222,151.38284602819238,65573800 +2023-02-16,151.97607421875,154.56651436571883,151.6201346111262,151.77831825822219,68167900 +2023-02-17,150.82916259765625,151.27408335489702,149.14834246660095,150.6314217151784,59144100 +2023-02-21,146.8050537109375,149.59324968756485,146.73585119733022,148.50565230235682,58867200 +2023-02-22,147.230224609375,148.25848625294472,145.49996548151248,147.19066738077868,51011300 +2023-02-23,147.7146759033203,148.64407457569817,145.57905341345287,148.39689471971093,48394200 +2023-02-24,145.05503845214844,145.52961956815125,144.07620075664735,145.4505202010405,55469600 +2023-02-27,146.2513885498047,147.4872879410314,145.78668917177046,146.0437659006096,44998500 +2023-02-28,145.7471466064453,147.39830637793327,145.17368748018072,145.39120697933842,50547000 +2023-03-01,143.67080688476562,145.56914623363537,143.37418806129784,145.17366452678502,55479000 +2023-03-02,144.26406860351562,145.05504723585858,142.27673271533786,142.75132894674115,52238100 +2023-03-03,149.32627868652344,149.40537804304904,145.66802019550744,146.3700024688502,70732300 +2023-03-06,152.09471130371094,154.53684949594242,151.72888994336137,152.05515407809082,87558000 +2023-03-07,149.8898468017578,152.29242737720674,149.42514753967646,151.96614820893737,56182000 +2023-03-08,151.14553833007812,151.7387760380252,150.11727673451966,151.08621757661572,47204800 +2023-03-09,148.89125061035156,152.79668921738386,148.53531102339875,151.82774843104707,53833600 +2023-03-10,146.82481384277344,149.237291312372,145.9448542824683,148.51553045848686,68572400 +2023-03-13,148.7726287841797,151.41250811707283,146.03387146368914,146.1426312153812,84457100 +2023-03-14,150.86866760253906,151.66952778576984,148.4067663113716,149.57344779147112,73695900 +2023-03-15,151.26416015625,151.5212217243897,148.2287848840252,149.4844625281262,77167900 +2023-03-16,154.09188842773438,154.69500772391658,149.92937409069705,150.4435122825222,76161100 +2023-03-17,153.25152587890625,154.97190327803574,152.53964661627768,154.31934477284912,98944600 +2023-03-20,155.6244354248047,156.03971087014546,152.4110972116962,153.3207323821306,73641400 +2023-03-21,157.48321533203125,157.60185682514813,154.7741189081368,155.54533387337614,73938300 +2023-03-22,156.04959106445312,160.31096943804832,156.029812451383,157.50300984854792,75701800 +2023-03-23,157.1371612548828,159.72761624709545,155.9012620500719,157.03829837049406,67622100 +2023-03-24,158.44229125976562,158.53127238912836,156.06937062345713,157.06797183296018,59196500 +2023-03-27,156.49452209472656,158.9564390941657,156.0891434767474,158.13580009435265,52390300 +2023-03-28,155.87161254882812,156.7021483382564,154.2204529064242,156.18801000892674,45992200 +2023-03-29,158.9564208984375,159.23326112130354,157.5524411719995,157.57220469744664,51305700 +2023-03-30,160.52847290039062,160.63723263142947,159.45077243888025,159.70783403649028,49501700 +2023-03-31,163.03981018066406,163.13868814753852,160.08354906302839,160.60756909681194,68749800 +2023-04-03,164.29550170898438,164.4141432098461,162.36750188667764,162.41694087425697,56976200 +2023-04-04,163.76161193847656,164.9579540581038,163.24747358574663,164.7206710388915,46278300 +2023-04-05,161.91265869140625,163.18811497040738,159.9747774130157,162.88161441725998,51511700 +2023-04-06,162.80252075195312,163.09913955417102,160.17252383849814,160.59766588857192,45390100 +2023-04-10,160.20220947265625,160.20220947265625,158.27420958419825,159.59909001148102,47716900 +2023-04-11,158.986083984375,160.52848384854775,158.6993469072352,160.5186020856557,47644200 +2023-04-12,158.29397583007812,160.23185733032426,157.97757839276272,159.40133668736163,50133100 +2023-04-13,163.6923828125,163.92968090167284,159.59908506589906,159.8067227797579,68445600 +2023-04-14,163.3463592529297,164.4438385284041,161.97203971757548,162.73334288891357,49386500 +2023-04-17,163.3660888671875,163.52428757903846,162.1796287016244,163.2276687659828,41516200 +2023-04-18,164.5921173095703,165.52151594579726,163.78136017187086,164.22629596467013,49923000 +2023-04-19,165.7390594482422,166.26307959159772,163.67262416708968,163.92970090005386,47720200 +2023-04-20,164.77008056640625,165.9763194310247,163.69238005042013,164.21640012100644,52456400 +2023-04-21,163.15847778320312,164.5723392677561,162.63445771401044,163.18813815793777,58337300 +2023-04-24,163.46499633789062,163.73195482649055,162.041237847574,163.13871709330454,41949600 +2023-04-25,161.92254638671875,164.43388649764378,161.88298917048886,163.32652582972818,48714100 +2023-04-26,161.91265869140625,163.4155161732815,160.9634966614439,161.2205582348382,45498800 +2023-04-27,166.51022338867188,166.65852525119462,163.32654598880194,163.32654598880194,64902300 +2023-04-28,167.76588439941406,167.9339799574928,165.9862017200745,166.589321099478,55209200 +2023-05-01,167.67691040039062,168.52720964209172,166.7376300382773,167.370409816753,52472900 +2023-05-02,166.63877868652344,168.42837366285386,165.6500591818085,168.17129693616405,48425700 +2023-05-03,165.5610809326172,168.9919388807047,165.27435890938423,167.58795896994013,65136000 +2023-05-04,163.91978454589844,165.15568380990734,162.45648404157697,163.0299431104764,81235400 +2023-05-05,171.612060546875,172.33382159836464,168.83374592219786,169.05126543141336,113316400 +2023-05-08,171.54283142089844,171.88888927687347,170.16851193401882,170.53433331738626,55962800 +2023-05-09,169.83236694335938,171.58238974232736,169.66428642470126,171.0979268022727,45326900 +2023-05-10,171.60214233398438,172.06684167430913,169.96086445482297,171.06824047843108,53724500 +2023-05-11,171.7899932861328,172.62051394942262,170.22781484613878,171.88887125937896,49514700 +2023-05-12,170.85931396484375,172.33453386665053,169.30487018579348,171.89889318697968,45497800 +2023-05-15,170.36427307128906,171.49297161869612,169.77021484316816,171.44346424843133,37266700 +2023-05-16,170.36427307128906,171.42365827881974,170.09694535788182,170.28506430037106,42110300 +2023-05-17,170.97811889648438,171.21573009717264,168.7306172756303,170.00783790944186,57951600 +2023-05-18,173.31472778320312,173.50284672542747,170.86921174934298,171.2850464654308,65496700 +2023-05-19,173.42364501953125,174.64144781679403,173.20582466782196,174.64144781679403,55772400 +2023-05-22,172.47314453125,172.97809854709377,171.7305793150355,172.25532419255816,43570900 +2023-05-23,169.8593292236328,171.66129487805824,169.58210606257185,171.4137731194303,50747300 +2023-05-24,170.1365509033203,170.71080319124064,168.82964388505917,169.393985633902,45143500 +2023-05-25,171.275146484375,172.1761141248664,169.98803043113716,170.70089424192957,56058300 +2023-05-26,173.6909637451172,174.02760482348145,171.39396964747598,171.60189457506777,54835000 +2023-05-30,175.5424346923828,177.21568420222022,174.81967538543662,175.20580872558915,55964400 +2023-05-31,175.49290466308594,177.57209321550437,175.0077566388477,175.57211342872856,99625300 +2023-06-01,178.30477905273438,178.3344804566055,175.17610024638307,175.93847152997847,68901800 +2023-06-02,179.15623474121094,179.97800874169684,177.48298533965166,179.2354435119536,61945900 +2023-06-05,177.79981994628906,183.1165821425977,176.275077551752,180.8195882273271,121946500 +2023-06-06,177.43348693847656,178.33445457100666,175.6711182885981,178.18594757320713,64848400 +2023-06-07,176.05726623535156,179.41366034455214,175.56222276728346,176.67111530134713,61944600 +2023-06-08,178.78001403808594,179.04732664647344,175.70084291207064,176.1364684949153,50214900 +2023-06-09,179.16615295410156,180.42355258623877,178.83942242611607,179.70079329510486,48870700 +2023-06-12,181.9680633544922,182.0670780867689,179.17602617310777,179.4730552624109,54274900 +2023-06-13,181.4928436279297,182.32451307330234,180.63147278147434,180.98790470199526,54929100 +2023-06-14,182.12649536132812,182.56213604593384,180.21563475820471,181.5522431050323,57462900 +2023-06-15,184.16610717773438,184.67106129811276,181.95821704122477,182.1364405859263,65433200 +2023-06-16,183.0868682861328,185.13635542691418,182.4433178422068,184.878923163322,101235600 +2023-06-20,183.17601013183594,184.2552165596262,182.58196693246393,182.58196693246393,49799100 +2023-06-21,182.13641357421875,183.57203672168455,180.77998409317422,183.0670826761933,49515700 +2023-06-22,185.14625549316406,185.1957628610581,181.84926421078353,181.91857754734076,51245300 +2023-06-23,184.82940673828125,185.70068800461124,183.17596350424247,183.71061886586367,53079300 +2023-06-26,183.4334259033203,186.18586660248252,183.39381396241686,184.9779592329188,48088700 +2023-06-27,186.1957550048828,186.52248552112178,183.8294477274505,184.04726807160984,50730800 +2023-06-28,187.37396240234375,188.01751290126907,185.7403249158235,186.06704032710473,51216800 +2023-06-29,187.71055603027344,188.18580857990537,187.06700564216163,187.20561719225614,46347300 +2023-06-30,192.0471649169922,192.55210381756805,189.36402266288647,189.73036510372253,85069600 +2023-07-03,190.55213928222656,191.9580609253223,189.85906633761323,191.85904618822673,31458200 +2023-07-05,189.433349609375,191.06698713435688,188.7303811843197,189.6709759307026,46920300 +2023-07-06,189.9085693359375,190.11649423604223,187.32444187549908,187.95809689875657,45094300 +2023-07-07,188.78977966308594,190.7600582083635,188.35415407859097,189.51255404191053,46778000 +2023-07-10,186.7403106689453,188.10663557063202,185.18586681905202,187.38386117936162,59922200 +2023-07-11,186.21559143066406,187.4234989521848,184.750266691003,187.28488735664294,46638100 +2023-07-12,187.88880920410156,189.7996698114742,186.60169311695756,187.79968989475896,60750200 +2023-07-13,188.65118408203125,189.29474974345305,187.89872334590046,188.61158724645796,41342300 +2023-07-14,188.7996826171875,189.28481555311026,187.75019286903466,188.3442359735881,41573900 +2023-07-17,192.06698608398438,192.39371661286773,189.90858852856573,189.99769273438966,50520200 +2023-07-18,191.8095245361328,192.40358269941262,190.5125131574161,191.43330179974714,48353800 +2023-07-19,193.16598510742188,196.2649472303636,190.74025980403414,191.18581105243047,80507300 +2023-07-20,191.2154998779297,194.52238670645607,190.5917402572243,193.1560618639693,59581200 +2023-07-21,190.0373077392578,193.03727024392953,189.33433929774543,192.17589935868594,71917800 +2023-07-24,190.8392791748047,192.97787083183135,190.3442356490594,191.49274025459553,45377800 +2023-07-25,191.70065307617188,192.51253172271785,191.0075951507849,191.41353447405788,37283200 +2023-07-26,192.57191467285156,193.70061320853526,191.40361930588426,191.75014067908202,47471900 +2023-07-27,191.3046112060547,195.24515323301043,190.6412547294524,194.07685782549473,47460200 +2023-07-28,193.8887481689453,194.6808208278144,192.21549864281087,192.74024356896163,48291400 +2023-07-31,194.50262451171875,194.54223645934454,193.32441834412157,194.11649111379066,38824100 +2023-08-01,193.67091369628906,194.77980627337752,193.34418318178373,194.29467332466547,35175100 +2023-08-02,190.6709747314453,193.24519211613384,189.9482153815842,193.1065805270162,50389300 +2023-08-03,189.27491760253906,190.46301890335675,188.79968010371752,189.67096144116343,61235200 +2023-08-04,180.18594360351562,185.52251207833032,180.11663025996506,183.68094960257173,115799700 +2023-08-07,177.0770721435547,181.31464344213896,175.5919415919706,180.32455640774955,97576100 +2023-08-08,178.0176544189453,178.48299654054432,175.81965996172053,177.90874423926195,67823000 +2023-08-09,176.42359924316406,179.13642786663587,175.25528876502239,179.07702506576103,60378500 +2023-08-10,176.20578002929688,178.95822060931928,175.8394526832055,177.70080592181807,54686900 +2023-08-11,176.26527404785156,177.08815781935616,175.03591791571532,175.7993186650753,51988100 +2023-08-14,177.9209442138672,178.14896748076782,175.78937369863468,176.44371711975322,43675600 +2023-08-15,175.9281768798828,177.94076628789648,175.53161335110406,177.34592099472832,43622600 +2023-08-16,175.0557403564453,177.00883168990967,174.98633341606396,175.61093536777827,46964900 +2023-08-17,172.5077667236328,175.9876593304517,171.9922220355352,175.62083731111454,66062900 +2023-08-18,172.99356079101562,173.59832997175556,170.48525954825683,170.82234004167174,61114200 +2023-08-21,174.3319854736328,174.61950689363672,172.25000423465377,173.56859991663836,46311900 +2023-08-22,175.71006774902344,176.15620551446153,174.73847648439144,175.5415274877659,42084200 +2023-08-23,179.56671142578125,179.99303161559698,176.80064510070915,176.9890180826326,52722800 +2023-08-24,174.8673553466797,179.54687744583052,174.50051821034532,179.1205572949361,54945800 +2023-08-25,177.0782470703125,177.6136093916348,174.31218067560857,175.85879974601767,51449600 +2023-08-28,178.64468383789062,179.04124736642365,177.018749166219,178.54553539179292,43820700 +2023-08-29,182.54098510742188,183.31429463018617,177.96061099136716,178.15889276911417,53003900 +2023-08-30,186.04071044921875,186.23900735465395,183.1556780614674,183.35395983897268,60813900 +2023-08-31,186.25880432128906,187.49808420340318,185.87214960318659,186.22906281435257,60794500 +2023-09-01,187.83517456054688,188.2912210727348,186.66528651811905,187.86491606664922,45732600 +2023-09-05,188.0731201171875,188.350717612699,186.00104769428793,186.66529992482816,45280000 +2023-09-06,181.34136962890625,187.23043067946264,179.91371663144653,186.7842777718091,81755800 +2023-09-07,176.03724670410156,176.6816813943478,172.05171790486162,173.67765269377628,112488800 +2023-09-08,176.6519012451172,178.6942471635063,176.265246533602,176.82045661878996,65551300 +2023-09-11,177.82177734375,178.75371815702783,175.81909698721213,178.5256949137557,58953100 +2023-09-12,174.7880401611328,178.58519559094336,173.32073699502078,177.95068488711692,90370200 +2023-09-13,172.71597290039062,175.77946927367296,172.48793449989455,174.99623588192003,84267900 +2023-09-14,174.23287963867188,174.58979292564496,172.09139991683338,172.5077962303134,60895800 +2023-09-15,173.5091094970703,174.98633670911127,172.32932763975032,174.9665039932106,109205100 +2023-09-18,176.4437255859375,177.84163701778533,174.65915940995401,174.9664984209427,67257600 +2023-09-19,177.53428649902344,178.08948146713516,175.6109216966876,175.99757641576028,51826900 +2023-09-20,173.9849853515625,178.158871491594,173.8957457034938,177.72264255589144,58436200 +2023-09-21,172.4383544921875,174.78803946069445,172.36896268457267,173.05304760725463,63047900 +2023-09-22,173.29098510742188,175.56135441857745,172.55734106823024,173.17201907467273,56725400 +2023-09-25,174.56993103027344,175.4522977411563,172.65647493916612,172.70604916227998,46172700 +2023-09-26,170.48526000976562,173.6974637546494,170.18782981503577,173.32073296072448,64588900 +2023-09-27,168.9683837890625,171.5560010147378,167.6002289663342,171.13960475321795,66921800 +2023-09-28,169.22613525390625,170.5546395498357,166.18245684715794,167.88770703784505,56294400 +2023-09-29,169.74169921875,171.58574835004075,168.87915010499984,170.54475018871184,51814200 +2023-10-02,172.25991821289062,172.8052044328195,169.46409530048962,169.75161672914737,52164500 +2023-10-03,170.92149353027344,172.14095595651972,169.3550569046923,170.78269477378157,49594600 +2023-10-04,172.1707000732422,172.71598631340495,169.5037670214799,169.62273306372262,53020300 +2023-10-05,173.4099578857422,173.9453201351637,171.19907169783187,172.29955283135268,48527900 +2023-10-06,175.96783447265625,176.46354642551725,171.69478473153458,172.30947784007347,57224100 +2023-10-09,177.45498657226562,177.51446959158443,174.2923416030924,175.29367439346143,42390800 +2023-10-10,176.86012268066406,178.17871838563994,176.42389371024447,176.57261638357625,43698000 +2023-10-11,178.25804138183594,178.30761560829964,176.07691156880261,176.6717569025772,47551100 +2023-10-12,179.16024780273438,180.77625872690152,177.50455631675857,178.52573701205876,56743100 +2023-10-13,177.31617736816406,180.3697497847248,176.61225971587282,179.8641290223829,51427100 +2023-10-16,177.18728637695312,177.5441995976702,174.99623283045386,175.23418002024147,52517000 +2023-10-17,175.6307373046875,176.88984988971393,173.30090022346374,175.135025356181,57549400 +2023-10-18,174.3319854736328,176.05706860986896,173.60825021874456,174.07422069011992,54764400 +2023-10-19,173.95526123046875,176.31484005715805,173.68757251536525,174.53027383635083,59302900 +2023-10-20,171.39739990234375,173.91561041088508,171.1594526769345,173.80655315689722,64189300 +2023-10-23,171.51634216308594,172.51767489960218,168.4726633962427,169.4442697526279,55980100 +2023-10-24,171.9525604248047,172.18058368172586,169.97962145460033,171.5659057161436,43816600 +2023-10-25,169.63262939453125,171.5758116987713,169.18647655282905,170.40593879918788,57157000 +2023-10-26,165.45875549316406,169.91025482669738,164.24921696829185,168.90890687614655,70625300 +2023-10-27,166.77732849121094,167.5109876180873,165.3992498850538,165.4785656118454,58499100 +2023-10-30,168.82958984375,169.7020478229813,167.42176954958222,167.57049222945847,51131000 +2023-10-31,169.30548095703125,169.43435579022267,166.4600837859852,167.89766069037708,44846000 +2023-11-01,172.47801208496094,172.73577684542204,168.6610241296242,169.5334819772275,56934900 +2023-11-02,176.0471649169922,176.25535548295753,173.95525969593038,174.01474271477764,77334800 +2023-11-03,175.13502502441406,175.3035803991637,171.86333827281126,172.74570493436423,79763700 +2023-11-06,177.69293212890625,177.89121391765332,174.6988423245846,174.86738260141615,63841300 +2023-11-07,180.2606964111328,180.87537437336846,177.4351323131202,177.64332285545842,70530000 +2023-11-08,181.32151794433594,181.87671291239437,180.0326638382413,180.7861556902591,49340300 +2023-11-09,180.84567260742188,182.54099933642837,180.25081209988173,181.3909588846785,53763500 +2023-11-10,185.04489135742188,185.2136688107188,182.19576071339824,182.63256439705196,66133400 +2023-11-13,183.45654296875,184.67759686655458,182.87083578949566,184.46913200851657,43627500 +2023-11-14,186.07733154296875,186.74245888927783,184.94561983989882,186.33543591459554,60108400 +2023-11-15,186.64320373535156,188.12237722055318,186.41488002550872,186.484378412078,53790500 +2023-11-16,188.33082580566406,189.57173837709286,187.27851922089127,188.19184420357837,54412900 +2023-11-17,188.3109893798828,188.99597562451044,187.19913643084107,188.8669158544037,50922700 +2023-11-20,190.05816650390625,190.51482899547432,188.49958819031184,188.50951003765908,46505100 +2023-11-21,189.2540740966797,190.12768147094766,188.36062302598555,190.01848054916417,38134500 +2023-11-22,189.919189453125,191.52740733771327,189.4426832554431,190.09788874466753,39617700 +2023-11-24,188.58895874023438,189.5121905622833,187.874191778969,189.48240986788565,24048300 +2023-11-27,188.41024780273438,189.28385517880056,187.52671857843467,188.5393075690696,40552600 +2023-11-28,189.01580810546875,189.690872461515,188.02307798905798,188.4003202806091,38415400 +2023-11-29,187.99330139160156,190.69352857887446,187.5962153955331,189.5121772909601,43014200 +2023-11-30,188.569091796875,188.93641225844013,186.82189215984647,188.45989087281944,48794400 +2023-12-01,189.84971618652344,190.16738195236098,187.85431892352926,188.94632812953898,45679300 +2023-12-04,188.0528564453125,188.66835941071503,186.08725507958516,188.59886103241988,43389500 +2023-12-05,192.0138702392578,192.98674157750665,188.79741899208386,188.82721483361496,66628400 +2023-12-06,190.92185974121094,193.3441084564195,190.71337975554792,193.03636454966008,41089700 +2023-12-07,192.85768127441406,193.5823700079149,192.18261692775607,192.22233461466143,47477700 +2023-12-08,194.2872314453125,194.56519468567552,192.26205338225554,192.78819916921847,53377300 +2023-12-11,191.77560424804688,192.08336332058192,190.02840462687192,191.70612101402028,60943700 +2023-12-12,193.2944793701172,193.30440121762786,190.32621099568146,191.67632450221151,52696900 +2023-12-13,196.5208740234375,196.5605765657659,193.433482543182,193.67172809287342,70404200 +2023-12-14,196.66976928710938,198.16878635020208,194.73394853732478,196.58042720970235,66831600 +2023-12-15,196.13369750976562,196.95765018105735,195.56783406915136,196.09397982207716,128256700 +2023-12-18,194.46591186523438,195.20053764226134,192.97681661429394,194.66445486912104,55751900 +2023-12-19,195.50827026367188,195.5181921115413,194.46590061872467,194.73394198979324,40714100 +2023-12-20,193.4136199951172,196.24289187855894,193.4136199951172,195.46856356116558,52242800 +2023-12-21,193.26470947265625,195.6472710587259,192.0932950990975,194.67439969704105,46482500 +2023-12-22,192.1925506591797,193.98938969071887,191.56712585784612,193.7610508645393,37122800 +2023-12-26,191.64654541015625,192.48043504376977,191.42814358023,192.20247183256527,28919300 +2023-12-27,191.74581909179688,192.09328069742187,189.7007974418798,191.09062871652011,48087700 +2023-12-28,192.17269897460938,193.24484932489418,191.76567598880632,192.72862541967714,34049900 +2023-12-29,191.13034057617188,192.98674116771573,190.33615340163328,192.49037607711168,42628800 +2024-01-02,184.29042053222656,187.07006792285642,182.55314280656535,185.78943757371047,82488700 +2024-01-03,182.91050720214844,184.5286619910614,182.09646131024977,182.88072651321147,58414500 +2024-01-04,180.58753967285156,181.7589539428833,179.5650288616003,180.82578520690032,71983600 +2024-01-05,179.8628387451172,181.43135417752765,178.86018676112266,180.66696287937032,62303300 +2024-01-08,184.21099853515625,184.2507162227342,180.18051667398524,180.76622380895435,59144500 +2024-01-09,183.79405212402344,183.80397397190293,181.40156892129536,182.58292017691045,42841800 +2024-01-10,184.83642578125,185.0448906262594,182.58292413922769,183.00980597306068,46792900 +2024-01-11,184.2407989501953,185.6901917447606,182.28511919375845,185.18388963502795,49128400 +2024-01-12,184.56837463378906,185.382420570264,183.84368591687618,184.7073562390581,40444700 +2024-01-16,182.29502868652344,182.92043833380222,179.61464536328148,180.83571426310817,65603000 +2024-01-17,181.35191345214844,181.60009595806468,178.98922629636922,179.9521756311529,47317400 +2024-01-18,187.2586669921875,187.76495384502815,184.47901992929332,184.73712427915873,78005800 +2024-01-19,190.1673583984375,190.55452249664,187.44728786414325,187.95357471629796,68741000 +2024-01-22,192.48045349121094,193.90998737033232,190.86229845472488,190.9020161446229,60133900 +2024-01-23,193.76107788085938,194.32694137960473,192.42090116695806,193.60225255736796,42355600 +2024-01-24,193.0860137939453,194.95235131957728,192.9271733347724,193.9993237123997,53631300 +2024-01-25,192.75840759277344,194.84314692565724,191.70611607825748,193.80077725921535,54822100 +2024-01-26,191.02110290527344,193.34408744696182,190.54459675135575,192.8576594463704,44594000 +2024-01-29,190.3361358642578,190.80272021826386,188.20177223046258,190.614099077556,47145600 +2024-01-30,186.6729736328125,190.40564874926815,186.10712531543376,189.55190020112778,55859400 +2024-01-31,183.05941772460938,185.73980101543498,183.00979333970113,185.68022448739953,55467800 +2024-02-01,185.5015411376953,185.5908832083414,182.48364839562151,182.6524106894615,64885400 +2024-02-02,184.49888610839844,185.96812234304272,177.94686171013706,178.55242764739413,102518000 +2024-02-05,186.31556701660156,187.8741604535555,184.48894737475842,186.7821513481828,69668800 +2024-02-06,187.92381286621094,187.9337347140823,185.4122068995574,185.50154897397763,43490800 +2024-02-07,188.03302001953125,189.66109684812312,187.23883287556598,189.2540738540102,53439000 +2024-02-08,186.950927734375,188.16204444280885,185.98797838719426,188.01314099648533,40962000 +2024-02-09,187.71630859375,188.8494643803939,186.8714052160575,187.5174970927484,45155200 +2024-02-12,186.02651977539062,187.53739935899367,185.66868027314752,187.288900125969,41781900 +2024-02-13,183.92916870117188,185.09215835173688,182.4083547485107,184.6547973151463,56529500 +2024-02-14,183.04452514648438,184.41624573755993,181.34479892181088,184.20751487981576,54630500 +2024-02-15,182.7562713623047,183.3824942652778,180.26134459364147,182.44813474883824,65434500 +2024-02-16,181.215576171875,183.7403368438813,180.57941874936438,182.31891336045317,49701400 +2024-02-20,180.47006225585938,181.33483464555084,178.91942962585208,180.69867728023533,53665600 +2024-02-21,181.2255096435547,181.7920799507102,179.57547126273693,180.84778599399235,41529700 +2024-02-22,183.26321411132812,183.8496838430312,181.36469145049406,182.3785574262725,52292200 +2024-02-23,181.42431640625,183.92917764586625,181.13604881484736,183.89935895257477,45119700 +2024-02-26,180.07247924804688,181.66286516303873,179.56553112991756,181.1459977034405,40867400 +2024-02-27,181.53366088867188,182.8159102315647,178.482083088638,180.0128468267154,54318900 +2024-02-28,180.33090209960938,182.02069366799873,179.04865286943277,181.4143549983027,48953900 +2024-02-29,179.66494750976562,181.47402922690614,178.45227002550848,180.1818301671186,136682600 +2024-03-01,178.58148193359375,179.44625436004063,176.31517027538303,178.47214167082092,73488000 +2024-03-04,174.0488739013672,175.8380562970389,172.74672514229152,175.0925585764457,81510100 +2024-03-05,169.09873962402344,171.00721175997333,168.60174119797853,169.73489700267342,95132400 +2024-03-06,168.104736328125,170.21201988746688,167.6673753032203,170.03309257401145,68587700 +2024-03-07,167.9854736328125,169.70508399774383,167.47854068144582,168.13456709874717,71765100 +2024-03-08,169.705078125,172.6572499858552,167.92583043526673,167.9854678195768,76114600 +2024-03-11,171.7129669189453,173.33318674250597,171.01717211248007,171.9018287593836,60139500 +2024-03-12,172.19007873535156,172.98527928876703,169.9834044040384,172.1105571632911,59825400 +2024-03-13,170.10269165039062,172.1503228051375,169.73490248954016,171.73284593382695,52488700 +2024-03-14,171.96145629882812,173.26358975503445,171.0171623179081,171.87200022180366,72913500 +2024-03-15,171.58372497558594,171.58372497558594,169.2677105816515,170.14243263043366,121664700 +2024-03-18,172.67713928222656,176.64319229534289,172.4783429395777,174.51603957790343,75604200 +2024-03-19,175.02296447753906,175.54978158656556,171.99127109820583,173.29340452493878,55215200 +2024-03-20,177.597412109375,177.597412109375,174.0389016316341,174.66512448913912,53423100 +2024-03-21,170.3412322998047,176.42450322724187,169.81441519205438,175.98714219427453,106181300 +2024-03-22,171.2457733154297,172.01115512427612,169.03909913099622,170.7288907150358,71106600 +2024-03-25,169.82435607910156,170.90780893012868,168.43275148556643,169.54603819383198,54288300 +2024-03-26,168.6912078857422,170.39093396328443,168.56198344496033,168.97946029150032,57388400 +2024-03-27,172.26959228515625,172.55785986634996,169.08880538680637,169.3870074763491,60273300 +2024-03-28,170.45057678222656,171.1960744249358,169.4863986176142,170.71896018041463,65672700 +2024-04-01,169.00929260253906,170.22197004043582,168.46259127116116,170.16233265286536,46240500 +2024-04-02,167.826416015625,168.32341441545842,167.2200773611407,168.06498070773253,49329500 +2024-04-03,168.63156127929688,169.6553768320082,167.56799252573734,167.7767233727702,47691700 +2024-04-04,167.8065643310547,170.88794562795422,167.8065643310547,169.2677258236611,53704400 +2024-04-05,168.56199645996094,169.36713152382467,167.9357735582051,168.5719309687928,42055200 +2024-04-08,167.43878173828125,168.1842794442996,167.23005087422234,168.01530178433154,37425500 +2024-04-09,168.6514434814453,169.05898582949538,167.33937552823474,167.68726532493085,42451200 +2024-04-10,166.77279663085938,168.0749301271986,166.1068205360595,167.78667770328389,49709300 +2024-04-11,173.98919677734375,174.40668878905643,167.15050896636146,167.32942111379162,91070300 +2024-04-12,175.4901580810547,177.28929006742356,173.16420894399843,173.21389665591335,101593300 +2024-04-15,171.6533203125,175.56967037066977,171.46445848220424,174.30729011068368,73531800 +2024-04-16,168.36318969726562,172.71688554496447,167.2598525976239,170.71895735574867,73711200 +2024-04-17,166.99147033691406,169.62555591523414,166.99147033691406,168.59180586766368,50901200 +2024-04-18,166.03721618652344,167.62761710838,165.55016746918514,167.02127846323074,43122900 +2024-04-19,164.0094757080078,165.40106519259456,163.0950004513954,165.21221853676252,67772100 +2024-04-22,164.8444366455078,166.2559103754066,163.78086788564391,164.52636553527142,48116400 +2024-04-23,165.89805603027344,166.04716464714997,163.9299466584378,164.35737315952596,49537800 +2024-04-24,168.00537109375,168.28368903028098,165.2122420517991,165.54024770277562,48251800 +2024-04-25,168.87013244628906,169.58581142644354,167.14057238305094,168.51229295621184,50558300 +2024-04-26,168.28366088867188,170.31140768247312,168.16437095925713,168.86018085141623,44838400 +2024-04-29,172.45846557617188,174.97327656975762,172.06087287514865,172.32924112310414,68169400 +2024-04-30,169.3074951171875,173.93952434742974,168.97947431756717,172.2894858404387,65934800 +2024-05-01,168.28366088867188,171.67319360904702,168.0947990703537,168.56197877866052,50383100 +2024-05-02,171.99127197265625,172.37893013348045,169.8641193422282,171.4743893691613,94214900 +2024-05-03,182.27915954589844,185.8774235329829,181.56348055207545,185.52951854505613,163224100 +2024-05-06,180.61917114257812,183.09421354898845,179.33690673477625,181.2553285088154,78569700 +2024-05-07,181.3050079345703,183.78999990279186,180.23150475142342,182.34870759466082,77305800 +2024-05-08,181.6429901123047,181.97101089337855,180.36072568018065,181.75233037266264,45057100 +2024-05-09,183.46200561523438,183.55146169147778,181.01676669426374,181.46406224266897,48983000 +2024-05-10,182.19793701171875,184.22843448265328,181.28222127480615,184.0393164696827,50759500 +2024-05-13,185.41287231445312,186.22906253508128,183.76059590764,184.57678612826817,72044800 +2024-05-14,186.55751037597656,187.4234708736874,185.42281765723527,186.63713980034996,52393600 +2024-05-15,188.83688354492188,189.76254724660947,186.4978163614719,187.03531124896162,70400000 +2024-05-16,188.95631408691406,190.21045865928463,188.7771592552961,189.58338637309936,52845200 +2024-05-17,188.9861602783203,189.92178705781208,188.29936976198016,188.62783545187153,41282900 +2024-05-20,190.15072631835938,191.02663488992152,188.1301769262196,188.44869465688268,44361300 +2024-05-21,191.4546356201172,191.83285642957057,190.03128423275254,190.20049107683238,42309400 +2024-05-22,190.01136779785156,191.92244369758092,189.38431073139583,191.37500087150013,34648500 +2024-05-23,186.0100860595703,190.11090276702717,185.76124979940406,190.09099161364105,51005900 +2024-05-24,189.0956573486328,189.6928704821682,187.16468542966413,187.94106857836448,36294600 +2024-05-28,189.10560607910156,192.1015891258543,188.219749617586,190.61851957640835,52280100 +2024-05-29,189.40420532226562,191.35508832801628,188.62783738828333,188.7273779696699,53068000 +2024-05-30,190.39956665039062,191.2854232244703,189.7426503955058,189.8720349370489,49947900 +2024-05-31,191.3551025390625,191.67362027294615,189.02599856414395,190.5488754083416,75158300 +2024-06-03,193.12681579589844,194.08235381042343,191.62385010600926,192.00207093054578,50080500 +2024-06-04,193.44532775878906,194.41081372828987,192.13146492648488,193.73397115741048,47471400 +2024-06-05,194.95823669433594,195.9834409155792,193.96289161058436,194.49042328995185,54156800 +2024-06-06,193.57470703125,195.58530834672572,193.2661524862918,194.77908126144504,41181800 +2024-06-07,195.97349548339844,196.02326577578603,193.23629646745044,193.7439169991778,53103900 +2024-06-10,192.22103881835938,196.3815891899795,191.25555286655262,195.98344204153506,97262100 +2024-06-11,206.18572998046875,206.19569315156764,192.72867525564521,192.74857122232135,172373300 +2024-06-12,212.07818603515625,219.17498621319098,205.9368934525013,206.40470686074582,198134300 +2024-06-13,213.2427520751953,215.74106295368526,210.61504146610727,213.74042465409653,97862700 +2024-06-14,211.50088500976562,214.16840257809503,210.31642191496232,212.85455494843214,70122700 +2024-06-17,215.6614227294922,217.9308083607288,211.72981259041407,212.37678083551464,93728300 +2024-06-18,213.29248046875,217.61228945527094,212.008492058615,216.5771221156608,79943300 +2024-06-20,208.70396423339844,213.24275088537271,207.87784112226225,212.93418113045576,86172500 +2024-06-21,206.52415466308594,210.90366690915465,206.14591867526494,209.41064929966387,246421400 +2024-06-24,207.171142578125,211.70991411236912,205.6283545307824,206.75309943026167,80727000 +2024-06-25,208.09681701660156,210.39606187439708,207.63895156671146,208.17643126307132,56713900 +2024-06-26,212.25733947753906,213.8598456726642,209.65948819693895,210.51548557795786,66213200 +2024-06-27,213.1033935546875,214.73575892320002,211.36153961685812,213.69064352295018,49772700 +2024-06-28,209.63955688476562,215.06419922920637,209.3210543856748,214.76559269472423,82542700 +2024-07-01,215.7410430908203,216.4974998735104,210.933524598722,211.10273143743845,60402900 +2024-07-02,219.2446746826172,219.35416325375095,214.09874221485333,215.1438424446849,58046200 +2024-07-03,220.51870727539062,220.51870727539062,218.01043340115498,218.97591935149836,37369800 +2024-07-05,225.28640747070312,225.39589603978789,220.61823649717394,220.61823649717394,60412400 +2024-07-08,226.759521484375,226.78938062149984,222.21078721739227,226.03290864697604,59085900 +2024-07-09,227.61550903320312,228.33215871662,225.3162642938077,226.8690002119573,48076100 +2024-07-10,231.89549255371094,231.9950331368443,228.1828596567971,228.23262994836378,62627700 +2024-07-11,226.5106964111328,231.30825199534104,224.7190721562944,230.31290687462652,64710600 +2024-07-12,229.4668426513672,231.55707334519846,227.61550023869842,227.85438851986095,53046500 +2024-07-15,233.3088836669922,236.12571210202407,232.00498402552307,235.37920328245679,62631300 +2024-07-16,233.7269287109375,235.17017597600105,231.24851410299036,233.90608352734432,43234300 +2024-07-17,227.8145751953125,230.38256719376508,225.5849968618027,228.38191396445072,57345900 +2024-07-18,223.13645935058594,229.3673294560276,221.23536173419896,229.20807059344992,66034600 +2024-07-19,223.26583862304688,225.74425318618754,222.24063446922685,223.773474302542,49151500 +2024-07-22,222.91748046875,226.71969060050867,222.051519961604,225.9532706718539,48201800 +2024-07-23,223.96261596679688,225.88364008312746,221.64345984915792,223.3255956520461,39960300 +2024-07-24,217.522705078125,223.75357494115906,216.1192800710717,222.9572958470105,61777600 +2024-07-25,216.4776153564453,219.8219755631398,213.62096453779796,217.91089956980477,51391200 +2024-07-26,216.9454345703125,218.46831142772768,215.0044993866062,217.68198025772855,41601300 +2024-07-29,217.22412109375,218.27918447457574,214.74570631572197,215.95008057489312,36311800 +2024-07-30,217.78152465820312,219.30440154226625,215.11399172426283,218.16970866418467,41643800 +2024-07-31,221.04623413085938,222.77814001369308,219.60298682237814,220.40921389598267,50036300 +2024-08-01,217.34353637695312,223.435042960857,216.00977771238428,223.325554402556,62501000 +2024-08-02,218.83656311035156,224.54984915998065,216.69657732981517,218.1298614428512,105568600 +2024-08-05,208.29586791992188,212.506173331003,195.0876345333798,198.16324716744046,119548600 +2024-08-06,206.26535034179688,209.01251239840335,200.13403637997632,204.34434168651262,69660500 +2024-08-07,208.84332275390625,212.64553325809877,205.4292810556757,205.9369016050796,63516400 +2024-08-08,212.3170623779297,213.2029189157903,207.85792055043288,212.1179963940502,47161100 +2024-08-09,215.2334442138672,215.77092392101787,210.98331610147795,211.1127158331721,42201600 +2024-08-12,216.76803588867188,218.7410960979999,214.8448035806853,215.31315848368175,38028100 +2024-08-13,220.4949493408203,221.11277276612057,218.2428558389481,218.2428558389481,44155300 +2024-08-14,220.943359375,222.24876826808693,218.93043078284688,219.7973936824548,41960600 +2024-08-15,223.93284606933594,224.56064415441705,221.97970491871703,223.81327127421198,46414000 +2024-08-16,225.25819396972656,226.03546056539557,222.86659157853387,223.1356500786779,44340200 +2024-08-19,225.09873962402344,225.19839542072495,222.2587166767679,224.92933693390268,40687800 +2024-08-20,225.71658325195312,226.3742750764108,224.6602986155859,224.9791850293864,30299000 +2024-08-21,225.60696411132812,227.18143154067607,224.26170199000447,225.7265541171402,34765500 +2024-08-22,223.74349975585938,227.54015139464096,223.11570169720306,226.9920749311584,43695300 +2024-08-23,226.04542541503906,227.42059644239848,223.5442228703079,224.86956599566977,38677300 +2024-08-26,226.38421630859375,226.48387210620078,223.10574735994538,225.96568932825608,30602200 +2024-08-27,227.23126220703125,228.0483972344343,224.10226151212836,225.208374045966,35934600 +2024-08-28,225.69664001464844,229.05483047059747,224.8894645684117,227.1216236092518,38052200 +2024-08-29,228.98509216308594,232.10413336375854,228.07829123837303,229.29401907737392,51906300 +2024-08-30,228.19786071777344,229.59295072736154,226.68318070354871,229.38369482859366,52990800 +2024-09-03,221.98968505859375,228.1978583447122,220.39528345963856,227.74943764667495,50190600 +2024-09-04,220.07640075683594,221.00313580397116,216.71819503548093,220.88356101217042,43840200 +2024-09-05,221.60104370117188,224.6901757794695,220.744055533832,220.85367082984084,36615400 +2024-09-06,220.0465087890625,224.4510243839852,219.00018373655976,223.16553454066073,48423000 +2024-09-09,220.13619995117188,220.49493955114087,215.95091475509392,220.04651885251477,67180000 +2024-09-10,219.3389892578125,220.70418549359823,215.97082401031443,218.15315521125123,51591000 +2024-09-11,221.88006591796875,222.3085524071335,217.126770108234,220.6842723421212,44587100 +2024-09-12,221.98968505859375,222.76695165661573,219.0500213655269,221.7206265576352,37498200 +2024-09-13,221.72061157226562,223.2552104631355,221.1326819144566,222.79683029802118,36766600 +2024-09-16,215.56227111816406,216.45911247240775,213.17066883128115,215.78148650258865,59357400 +2024-09-17,216.03060913085938,216.1402244248995,213.74863736172932,214.99425879157621,45519300 +2024-09-18,219.91696166992188,221.9298901997397,216.777986478492,216.7879611815548,59894900 +2024-09-19,228.0683135986328,229.01499812075548,223.84317512238368,224.20191472936153,66781300 +2024-09-20,227.40065002441406,232.27352055331795,226.82267984404155,229.1644542640561,318679900 +2024-09-23,225.6767120361328,228.64626930220686,225.01902026418153,226.54365969576136,54146000 +2024-09-24,226.5735626220703,228.5466380182851,224.93930782860403,227.8490778167103,43556100 +2024-09-25,225.5770721435547,226.49384776666977,223.23531278607823,224.14211370551686,42308700 +2024-09-26,226.72303771972656,227.69960067739044,224.62042810744603,226.50380712846774,36636700 +2024-09-27,226.99208068847656,228.71603171782343,226.50380681299467,227.6597471643239,34026000 +2024-09-30,232.183837890625,232.183837890625,228.84556632808733,229.234199611622,54541900 +2024-10-01,225.41761779785156,228.8455550815525,222.95626872131422,228.71602079696683,63285000 +2024-10-02,225.98562622070312,226.57355589970402,222.2388023482828,225.09874435066007,32880600 +2024-10-03,224.8795166015625,226.01552277761738,222.53775735368686,224.35137431302277,34044200 +2024-10-04,226.0055694580078,227.20136306464835,223.3449237414969,227.1017072618697,37245100 +2024-10-07,220.91348266601562,224.89947175407843,220.5547430398763,223.71363756752507,39505400 +2024-10-08,224.9791717529297,225.1884276449642,222.46799461113406,223.51431968732726,31855700 +2024-10-09,228.7359619140625,228.94523301761674,224.0424685900414,224.44106139019914,33591100 +2024-10-10,228.23770141601562,228.6960967971132,226.3742566041183,226.98212047614993,28183500 +2024-10-11,226.75294494628906,228.60643037956845,226.54367384020586,228.4968150773993,31759200 +2024-10-14,230.48980712890625,230.91829362955485,227.79926770980506,227.89890830734765,39882100 +2024-10-15,233.03086853027344,236.65811760908664,231.5560417756155,232.79170373632726,64751400 +2024-10-16,230.96810913085938,231.3069145139278,229.0349022193022,230.78874694170784,34082200 +2024-10-17,231.33682250976562,233.0308799404877,229.71254238803704,232.6123377292532,32993800 +2024-10-18,234.17684936523438,235.35270879965356,233.1903116322836,235.35270879965356,46431500 +2024-10-21,235.6516571044922,236.02037141360947,233.62876897482323,233.62876897482323,36254500 +2024-10-22,235.03382873535156,235.3925683333293,231.7852533575211,233.07072804715946,38846600 +2024-10-23,229.95169067382812,234.31635331873264,226.96219904424217,233.26006870913344,52287000 +2024-10-24,229.76235961914062,230.0114839114603,227.60992208421712,229.17441473320775,31109500 +2024-10-25,230.5994110107422,232.40306843409212,228.76585988907573,228.935262581316,38802300 +2024-10-28,232.5824432373047,233.9077863541258,231.73542973016842,232.50273684103132,36087100 +2024-10-29,232.85150146484375,233.50919327337175,231.50623935322642,232.28350596136286,35417200 +2024-10-30,229.29400634765625,232.65219696606212,228.74592985962587,231.79520878623467,47070900 +2024-10-31,225.11868286132812,229.02495000446748,224.5805658660821,228.53666090957242,64370100 +2024-11-01,222.1291961669922,224.56065178607977,219.49844414747824,220.1959891516409,65276700 +2024-11-04,221.23233032226562,222.0095968952219,218.94039900502227,220.21591416091667,44944500 +2024-11-05,222.66729736328125,223.1655459656629,220.36539125313263,221.02308305755813,28111300 +2024-11-06,221.93984985351562,225.27812143912794,220.41521040716108,221.83023455712816,54561100 +2024-11-07,226.6831817626953,227.081789771112,223.7833864288354,223.8431738287627,42137700 +2024-11-08,226.41383361816406,228.10973956989392,225.8651541338214,226.6233197345054,38328800 +2024-11-11,223.69039916992188,225.15686291743452,220.96697301971395,224.4585504714927,42005600 +2024-11-12,223.69039916992188,225.04712701721013,222.82249764582772,224.00963641496367,40398300 +2024-11-13,224.57826232910156,226.10457929193407,222.2239408664857,223.47093284409854,48566200 +2024-11-14,227.67080688476562,228.3192366196321,224.45855435577516,224.47851048945301,44923900 +2024-11-15,224.4585418701172,226.3739196007606,223.73030286311794,225.8551667084814,47923700 +2024-11-18,227.47128295898438,229.18714506333228,224.62813528483125,224.70794459457642,44686000 +2024-11-19,227.73065185546875,229.60613257977118,226.11455519341968,226.43377721041003,36211800 +2024-11-20,228.44891357421875,229.37666823104936,225.34639715216647,227.51117324017346,35169600 +2024-11-21,227.97007751464844,229.60613029336434,225.16684213362325,228.3292117939797,42108300 +2024-11-22,229.3168182373047,230.16477882059493,227.51117639639193,227.51117639639193,38168300 +2024-11-25,232.30960083007812,232.68869124314412,229.1871434272115,230.9030055193102,90152800 +2024-11-26,234.49432373046875,235.00310615337486,232.76849125195545,232.76849125195545,45986200 +2024-11-27,234.36465454101562,235.12283541072824,233.24735459247512,233.90577001446655,33498400 +2024-11-29,236.75888061523438,237.2377212602243,233.40696565616557,234.24494059041535,28481400 +2024-12-02,239.013427734375,240.21053691361496,236.58928278806928,236.69901868412032,48137100 +2024-12-03,242.06607055664062,242.1758064568113,238.32509471728144,239.232908507596,38861000 +2024-12-04,242.42520141601562,243.5225604021956,240.66944226019712,242.28553892887177,44383900 +2024-12-05,242.4551239013672,243.95151419061432,241.54732536132988,243.40284992887905,40033900 +2024-12-06,242.25559997558594,244.04130085085734,241.49743440151175,242.32543882662802,36870600 +2024-12-09,246.1562042236328,246.64503053466012,241.16823655952678,241.24804586880077,44649200 +2024-12-10,247.1737518310547,247.612695417372,244.7495916510093,246.2958646584201,36914800 +2024-12-11,245.89682006835938,250.196445491468,245.6673626102133,247.36328368802742,45205800 +2024-12-12,247.36329650878906,248.1414182384854,245.08876927344312,246.2958641332418,32777500 +2024-12-13,247.5328826904297,248.69007959411312,245.647431564018,247.223631137632,33155300 +2024-12-16,250.4358673095703,250.7750606707362,247.05402592958802,247.3932192907539,51694800 +2024-12-17,252.8699951171875,253.21915892963332,249.1789022262073,249.47818331943677,51356400 +2024-12-18,247.4530792236328,253.66808268004456,247.14382766353577,251.55318925842403,56774100 +2024-12-19,249.1888885498047,251.3935770141874,246.49538898335234,246.90440599607692,60882300 +2024-12-20,253.87759399414062,254.3863612366688,245.09876750312787,247.44310326755718,147495300 +2024-12-23,254.6557159423828,255.03479114956258,252.8400883307868,254.15691915529422,40858800 +2024-12-24,257.57867431640625,257.58862955018265,254.67565812568793,254.87518901917565,23234700 +2024-12-26,258.39666748046875,259.47408555117545,257.0100282923795,257.56867823862046,27237100 +2024-12-27,254.9749298095703,258.0774615569102,252.4510193654514,257.20952960207876,42355300 +2024-12-30,251.5930938720703,252.8899685500744,250.14658624824915,251.62302046123375,35557500 +2024-12-31,249.8173828125,252.670501064015,248.82975968702823,251.8325261089863,39480700 +2025-01-02,243.26319885253906,248.5005651105234,241.23808511721737,248.3309608077005,55740700 +2025-01-03,242.7743682861328,243.5923870862029,241.3079045417172,242.7743682861328,40244100 +2025-01-06,244.41041564941406,246.73481040856498,242.61474424512696,243.72207367593157,45045600 +2025-01-07,241.62713623046875,244.9590949760797,240.76920518354387,242.3952722906863,40856000 +2025-01-08,242.11593627929688,243.12351544341067,239.47231962725974,241.33781457710975,37628900 +2025-01-10,236.280029296875,239.58206138453855,232.4392881886217,239.4324132245663,61710900 +2025-01-13,233.83592224121094,234.10527676213235,229.16719172961072,232.96802072299363,49630700 +2025-01-14,232.71861267089844,235.55177458449063,231.9105643637605,234.1850763475817,39435300 +2025-01-15,237.2975616455078,238.38495013235746,233.86583756026477,234.07533889356793,39832000 +2025-01-16,227.710693359375,237.4372302632713,227.4812511099753,236.77883010316478,71759100 +2025-01-17,229.4265594482422,231.73099810398455,227.93016912923343,231.5614090278119,68488300 +2025-01-21,222.10421752929688,223.87993275191027,218.85206818023312,223.46094530610958,98070400 +2025-01-22,223.29135131835938,223.58064673096774,219.26106511921876,219.26106511921876,64126500 +2025-01-23,223.1217803955078,226.4836658384098,221.76505253825962,224.19918327232872,60234800 +2025-01-24,222.24388122558594,225.08702882156655,220.877182986192,224.23906824814947,54697900 +2025-01-27,229.3068389892578,231.59132137138346,223.44098442848647,223.48089669223063,94863400 +2025-01-28,237.68663024902344,239.61199368769647,230.25456145518996,230.2944737209622,75707600 +2025-01-29,238.78399658203125,239.2827933650634,233.4468649147594,233.55660081590926,45486100 +2025-01-30,237.0182342529297,240.21053038482776,236.63915907674937,238.09563705158317,55658300 +2025-01-31,235.4320831298828,246.59515764263173,232.87824601959832,246.59515764263173,101075100 +2025-02-03,227.4613037109375,231.27211844312274,225.15686500690927,229.43654993330725,73063300 +2025-02-04,232.23977661132812,232.5689843025687,226.10456727432145,226.70312948058964,45067300 +2025-02-05,231.9105682373047,232.11008389811693,227.72067847197073,227.98004730881974,39620300 +2025-02-06,232.6587677001953,233.23737378273856,229.875473186273,230.7334042435517,29925300 +2025-02-07,227.08221435546875,233.43688010961284,226.71309440770742,232.04025529180169,39707200 +2025-02-10,227.3518524169922,230.2880044885276,226.90244480659103,229.26935130196645,33115600 +2025-02-11,232.3153533935547,234.92193591818142,227.83124330015124,227.90114370319637,53718400 +2025-02-12,236.55978393554688,236.64967765066982,230.377888084301,230.89721134547665,45243300 +2025-02-13,241.21368408203125,242.02262084431055,235.2614980047627,236.5997394445533,53614100 +2025-02-14,244.2796630859375,245.22841586050225,240.67439035154717,240.93404435379279,40896200 +2025-02-18,244.14984130859375,244.85890295305822,241.52328070167576,243.83025306858283,48822500 +2025-02-19,244.54930114746094,245.68780753699892,242.84154918255663,244.33958470767533,32204200 +2025-02-20,245.508056640625,246.4568094488268,243.9700649298591,244.61922281669615,32316900 +2025-02-21,245.22842407226562,248.36431123309396,244.89885442060717,245.6278941258364,53197400 +2025-02-24,246.77639770507812,248.53408727873096,244.09989957647335,244.609226181644,51326400 +2025-02-25,246.71646118164062,249.67259136851834,244.58926106556868,247.67521063757022,48013300 +2025-02-26,240.0452117919922,244.65915630674968,238.8168269352331,244.01001367840516,44433600 +2025-02-27,236.98922729492188,242.14247324939222,236.74953612071198,239.09646458024955,41153600 +2025-02-28,241.5232696533203,241.77294223985544,229.89851463379637,236.63967447024518,56833400 +2025-03-03,237.71826171875,243.71040379171194,235.80077808405883,241.47333193183624,47184000 +2025-03-04,235.6210174560547,239.75561031847352,234.3726544629493,237.39870037793833,53798100 +2025-03-05,235.4312744140625,236.2402111793479,228.92979032203158,235.11168617953675,47227600 +2025-03-06,235.0218048095703,237.54849020730907,232.8546485518437,234.13297099659667,45170400 +2025-03-07,238.7569122314453,241.05388787370777,234.45254396930395,234.80209169163373,46273600 +2025-03-10,227.1820831298828,235.85072354308846,223.92635798057333,235.23152514577004,72071200 +2025-03-11,220.55078125,225.54423318142804,217.16522145004404,223.51689291637274,76137400 +2025-03-12,216.69583129882812,221.4595886104368,214.6285501658544,219.85169651198805,62547500 +2025-03-13,209.4053955078125,216.55602242060417,208.14705109128238,215.6671885752157,61368300 +2025-03-14,213.21041870117188,213.66980775083542,209.30553558500114,210.97334672214788,60107600 +2025-03-17,213.71974182128906,214.93814530685134,209.69502079955336,213.0306430192638,48073400 +2025-03-18,212.4114532470703,214.8682229774316,211.21302787332291,213.87952928252258,42432400 +2025-03-19,214.95811462402344,218.47349365471302,213.470060528986,213.93944620866878,54385400 +2025-03-20,213.81961059570312,217.20517028159983,211.94206785632258,213.70975404736055,48862900 +2025-03-21,217.98414611816406,218.5533916912833,211.0032951126973,211.2829271905112,94127800 +2025-03-24,220.44091796875,221.1899357355996,218.29373979930335,220.71056863168138,44299500 +2025-03-25,223.45697021484375,223.80651793975238,219.79177838679217,220.48087718007702,34493600 +2025-03-26,221.2398681640625,224.7253029108424,220.18125884970436,223.21727075576553,34466100 +2025-03-27,223.5568389892578,224.69534536875565,220.271139232742,221.1000540446544,37094800 +2025-03-28,217.6146240234375,223.51688772665744,217.39491092445158,221.3796909591809,39818600 +2025-03-31,221.83909606933594,225.32451569687797,215.9468137615173,216.72579102857173,65299300 +2025-04-01,222.897705078125,223.3870536043053,218.61331487709137,219.5221267668628,36412700 +2025-04-02,223.59678649902344,224.89508702876748,220.73055001137135,221.03016017035932,35905900 +2025-04-03,202.9239044189453,207.2182761783418,200.9864426085102,205.27081771109022,103419000 +2025-04-04,188.13330078125,199.61824028069563,187.09465424061224,193.6360793511012,125910900 +2025-04-07,181.2223663330078,193.89573468350994,174.39131242893686,176.967935484531,160466300 +2025-04-08,172.19419860839844,190.09072892121037,168.9884109270566,186.4554964395268,120859500 +2025-04-09,198.58958435058594,200.3472738997123,171.6648855169899,171.72480450043201,184395900 +2025-04-10,190.17062377929688,194.52491452460524,182.76034285398336,188.82240088513313,121880000 +2025-04-11,197.89048767089844,199.27866665425725,185.81632494094944,185.856281088865,87435900 +2025-04-14,202.25477600097656,212.6611277249045,200.8965565016436,211.1630921847052,101352900 +2025-04-15,201.87527465820312,203.24347561495443,199.53834280484799,201.59564256833872,51343900 +2025-04-16,194.0155792236328,200.4371508814261,192.11805840887246,198.10021911176236,59732400 +2025-04-17,196.72203063964844,198.56961397436802,194.16538565496842,196.94174374665747,51334300 +2025-04-21,192.9070281982422,193.54618940120912,189.56140949031536,193.01688474432112,46742500 +2025-04-22,199.47842407226562,201.32599215129426,195.71335703344474,195.8631544964882,52976400 +2025-04-23,204.33206176757812,207.7276030292648,202.5344160012944,205.7302222309065,52929200 +2025-04-24,208.09710693359375,208.5565112075726,202.67422555441442,204.62166872266098,47311000 +2025-04-25,209.00592041015625,209.47530610539675,205.92995222724628,206.0997277622984,38222300 +2025-04-28,209.8647918701172,211.2230113707532,207.1883090170199,209.72497582911666,38743100 +2025-04-29,210.9333953857422,211.96204522644123,208.09710321217068,208.41669143858087,36827600 +2025-04-30,212.22171020507812,213.30029766677714,206.399343338795,209.02590396975114,52286500 +2025-05-01,213.04063415527344,214.2790004444518,208.62640936955898,208.80618155790114,57365700 +2025-05-02,205.08106994628906,206.71892151455646,201.89524528415058,205.82009105417706,101010600 +2025-05-05,198.62953186035156,203.83271551835597,197.9504297070337,202.83402512431957,69018500 +2025-05-06,198.25001525878906,200.38721199140494,196.7619763948813,197.9504203457911,51216500 +2025-05-07,195.99298095703125,199.1788056079939,192.99690991055434,198.90915494694545,68536700 +2025-05-08,197.2313690185547,199.78801395815432,194.42503624466005,197.46106353953903,50478900 +2025-05-09,198.27000427246094,200.2773664943336,197.28129528859796,198.739389980464,36453900 +2025-05-12,210.7899932861328,211.27000427246094,206.75,210.97000122070312,63775800 +2025-05-13,212.92999267578125,213.39999389648438,209.0,210.42999267578125,51909300 +2025-05-14,212.3300018310547,213.94000244140625,210.5800018310547,212.42999267578125,49325800 +2025-05-15,211.4499969482422,212.9600067138672,209.5399932861328,210.9499969482422,45029500 +2025-05-16,211.25999450683594,212.57000732421875,209.77000427246094,212.36000061035156,54737900 +2025-05-19,208.77999877929688,209.47999572753906,204.25999450683594,207.91000366210938,46140500 +2025-05-20,206.86000061035156,208.47000122070312,205.02999877929688,207.6699981689453,42496600 +2025-05-21,202.08999633789062,207.0399932861328,200.7100067138672,205.1699981689453,59211800 +2025-05-22,201.36000061035156,202.75,199.6999969482422,200.7100067138672,46742400 +2025-05-23,195.27000427246094,197.6999969482422,193.4600067138672,193.6699981689453,78432900 +2025-05-27,200.2100067138672,200.74000549316406,197.42999267578125,198.3000030517578,56288500 +2025-05-28,200.4199981689453,202.72999572753906,199.89999389648438,200.58999633789062,45339700 +2025-05-29,199.9499969482422,203.80999755859375,198.50999450683594,203.5800018310547,51396800 +2025-05-30,200.85000610351562,201.9600067138672,196.77999877929688,199.3699951171875,70819900 +2025-06-02,201.6999969482422,202.1300048828125,200.1199951171875,200.27999877929688,35423300 +2025-06-03,203.27000427246094,203.77000427246094,200.9600067138672,201.35000610351562,46381600 +2025-06-04,202.82000732421875,206.24000549316406,202.10000610351562,202.91000366210938,43604000 +2025-06-05,200.6300048828125,204.75,200.14999389648438,203.5,55126100 +2025-06-06,203.9199981689453,205.6999969482422,202.0500030517578,203.0,46607700 +2025-06-09,201.4499969482422,206.0,200.02000427246094,204.38999938964844,72862600 +2025-06-10,202.6699981689453,204.35000610351562,200.57000732421875,200.60000610351562,54672600 +2025-06-11,198.77999877929688,204.5,198.41000366210938,203.5,60989900 +2025-06-12,199.1999969482422,199.67999267578125,197.36000061035156,199.0800018310547,43758300 diff --git a/tradingagents/graph/reflection.py b/tradingagents/graph/reflection.py index 57a876dc..c1a25ce4 100644 --- a/tradingagents/graph/reflection.py +++ b/tradingagents/graph/reflection.py @@ -119,3 +119,47 @@ Adhere strictly to these instructions, and ensure your output is detailed, accur "RISK JUDGE", judge_decision, situation, returns_losses ) risk_manager_memory.add_situations([(situation, result)]) + + @staticmethod + def generate_final_report(final_state: dict) -> str: + """Generate a final, comprehensive report from the final state.""" + + report_parts = [] + report_parts.append(f"# ์ตœ์ข… ๋ถ„์„ ๋ณด๊ณ ์„œ: {final_state.get('company_of_interest', 'N/A')}") + report_parts.append(f"**๋ถ„์„ ๊ธฐ์ค€์ผ:** {final_state.get('trade_date', 'N/A')}") + report_parts.append("---") + + # ๊ฐ ๋ถ„์„๊ฐ€ ๋ฆฌํฌํŠธ ์ถ”๊ฐ€ + if final_state.get('market_report'): + report_parts.append("## ์‹œ์žฅ ๋ถ„์„๊ฐ€ ๋ฆฌํฌํŠธ") + report_parts.append(final_state['market_report']) + + if final_state.get('sentiment_report'): + report_parts.append("## ์†Œ์…œ ๋ฏธ๋””์–ด ๋ถ„์„๊ฐ€ ๋ฆฌํฌํŠธ") + report_parts.append(final_state['sentiment_report']) + + if final_state.get('news_report'): + report_parts.append("## ๋‰ด์Šค ๋ถ„์„๊ฐ€ ๋ฆฌํฌํŠธ") + report_parts.append(final_state['news_report']) + + if final_state.get('fundamentals_report'): + report_parts.append("## ์žฌ๋ฌด ๋ถ„์„๊ฐ€ ๋ฆฌํฌํŠธ") + report_parts.append(final_state['fundamentals_report']) + + # ํˆฌ์ž ํ† ๋ก  ์š”์•ฝ ์ถ”๊ฐ€ + if final_state.get('investment_debate_state'): + debate = final_state['investment_debate_state'] + report_parts.append("## ํˆฌ์ž ๊ฒฐ์ • ํ† ๋ก  ์š”์•ฝ") + report_parts.append(f"**์‹ฌ์‚ฌ์œ„์› ์ตœ์ข… ๊ฒฐ์ •:** {debate.get('judge_decision', 'N/A')}") + + # ์ตœ์ข… ํˆฌ์ž ๊ณ„ํš ๋ฐ ๊ฒฐ์ • ์ถ”๊ฐ€ + if final_state.get('investment_plan'): + report_parts.append("## ์ตœ์ข… ํˆฌ์ž ๊ณ„ํš") + report_parts.append(final_state['investment_plan']) + + if final_state.get('final_trade_decision'): + report_parts.append("## ์ตœ์ข… ๊ฑฐ๋ž˜ ๊ฒฐ์ •") + report_parts.append(final_state['final_trade_decision']) + + report = "\n\n".join(report_parts) + return report diff --git a/tradingagents/graph/setup.py b/tradingagents/graph/setup.py index b3b7059c..f745fd18 100644 --- a/tradingagents/graph/setup.py +++ b/tradingagents/graph/setup.py @@ -1,6 +1,6 @@ # TradingAgents/graph/setup.py -from typing import Dict, Any +from typing import Dict, Any, List from langchain_openai import ChatOpenAI from langgraph.graph import END, StateGraph, START from langgraph.prebuilt import ToolNode @@ -40,9 +40,7 @@ class GraphSetup: self.risk_manager_memory = risk_manager_memory self.conditional_logic = conditional_logic - def setup_graph( - self, selected_analysts=["market", "social", "news", "fundamentals"] - ): + def setup_graph(self, selected_analysts: List[str]): """Set up and compile the agent workflow graph. Args: diff --git a/tradingagents/graph/trading_graph.py b/tradingagents/graph/trading_graph.py index 396f96b8..a9d6cc4f 100644 --- a/tradingagents/graph/trading_graph.py +++ b/tradingagents/graph/trading_graph.py @@ -5,6 +5,7 @@ from pathlib import Path import json from datetime import date from typing import Dict, Any, Tuple, List, Optional +import asyncio from langchain_openai import ChatOpenAI from langgraph.prebuilt import ToolNode @@ -31,19 +32,20 @@ class TradingAgentsGraph: def __init__( self, - selected_analysts=["market", "social", "news", "fundamentals"], - debug=False, config: Dict[str, Any] = None, + progress_callback=None, + debug=False, ): """Initialize the trading agents graph and components. Args: - selected_analysts: List of analyst types to include - debug: Whether to run in debug mode config: Configuration dictionary. If None, uses default config + progress_callback: Async function to send progress updates + debug: Whether to run in debug mode """ self.debug = debug self.config = config or DEFAULT_CONFIG + self.progress_callback = progress_callback # Update the interface's config set_config(self.config) @@ -95,8 +97,9 @@ class TradingAgentsGraph: self.ticker = None self.log_states_dict = {} # date to full state dict - # Set up the graph - self.graph = self.graph_setup.setup_graph(selected_analysts) + # Set up the graph with default analysts initially + default_analysts = ["market", "social", "news", "fundamentals"] + self.graph = self.graph_setup.setup_graph(default_analysts) def _create_tool_nodes(self) -> Dict[str, ToolNode]: """Create tool nodes for different data sources.""" @@ -143,8 +146,55 @@ class TradingAgentsGraph: ), } + def invoke(self, input_data: Dict) -> Dict: + """Run the trading agents graph for a web-based request.""" + + self.ticker = input_data.get("ticker", "UNKNOWN") + trade_date = input_data.get("date", date.today().strftime("%Y-%m-%d")) + selected_analysts = input_data.get("selected_analysts", []) + + self.graph = self.graph_setup.setup_graph(selected_analysts) + + init_agent_state = self.propagator.create_initial_state( + self.ticker, trade_date + ) + args = self.propagator.get_graph_args() + + final_report = "" + final_state_result = None + + # ์ง„ํ–‰๋ฅ  ๊ณ„์‚ฐ์„ ์œ„ํ•œ ๋ณ€์ˆ˜ + total_steps = len(self.graph.nodes) + step_count = 0 + + # Stream the graph execution to get real-time updates + for chunk in self.graph.stream(init_agent_state, **args): + # 1 ์ฒญํฌ๋‹น 1๋‹จ๊ณ„๋กœ ๊ฐ„์ฃผ + step_count += 1 + for node_name, node_output in chunk.items(): + if self.progress_callback: + agent_name = node_name.replace("_node", "").replace("_", " ").title() + message = f"Step {step_count}/{total_steps}: {agent_name} is working..." + + # ๊ณ„์‚ฐ๋œ ์ง„ํ–‰๋ฅ ๊ณผ ํ•จ๊ป˜ ์ฝœ๋ฐฑ ํ˜ธ์ถœ + asyncio.run(self.progress_callback( + "agent_update", + message, + agent_name, + step=step_count, + total=total_steps + )) + + final_state_result = chunk + + if final_state_result: + final_report = self.reflector.generate_final_report(final_state_result) + self._log_state(trade_date, final_state_result) + + return {"final_report": final_report} + def propagate(self, company_name, trade_date): - """Run the trading agents graph for a company on a specific date.""" + """Run the trading agents graph for a company on a specific date (CLI).""" self.ticker = company_name diff --git a/web/backend/apps/authentication/serializers.py b/web/backend/apps/authentication/serializers.py index 4af0dc68..975ef59a 100644 --- a/web/backend/apps/authentication/serializers.py +++ b/web/backend/apps/authentication/serializers.py @@ -2,6 +2,7 @@ from rest_framework import serializers from django.contrib.auth import authenticate from django.contrib.auth.password_validation import validate_password from .models import User, UserProfile, AnalysisSession +from datetime import date class UserRegistrationSerializer(serializers.ModelSerializer): @@ -121,11 +122,17 @@ class CreateAnalysisSessionSerializer(serializers.ModelSerializer): class Meta: model = AnalysisSession fields = ( - 'ticker', 'analysis_date', + 'ticker', 'analysts_selected', 'research_depth', 'shallow_thinker', 'deep_thinker' ) - + # analysis_date๋Š” create ์‹œ์ ์— ์ž๋™ ์ƒ์„ฑ๋˜๋ฏ€๋กœ ํ•„๋“œ์—์„œ ์ œ์™ธ + + def create(self, validated_data): + """์˜ค๋Š˜ ๋‚ ์งœ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์„ธ์…˜ ์ƒ์„ฑ""" + validated_data['analysis_date'] = date.today() + return super().create(validated_data) + def validate_analysts_selected(self, value): """์„ ํƒ๋œ ๋ถ„์„๊ฐ€๋“ค ๊ฒ€์ฆ""" if not isinstance(value, list) or len(value) == 0: diff --git a/web/backend/apps/trading_api/services.py b/web/backend/apps/trading_api/services.py index 6ad9bb18..1863f6f9 100644 --- a/web/backend/apps/trading_api/services.py +++ b/web/backend/apps/trading_api/services.py @@ -3,6 +3,7 @@ import datetime from typing import Dict, List, Optional from django.conf import settings from channels.layers import get_channel_layer +from channels.db import database_sync_to_async from asgiref.sync import async_to_sync # CLI ๋ชจ๋“ˆ import (๊ฒฝ๋กœ ์กฐ์ • ํ•„์š”) @@ -25,41 +26,50 @@ class TradingAnalysisService: self.channel_layer = get_channel_layer() self.user_channel_group = f"user_{user.id}" + @database_sync_to_async + def _update_session_status(self, status: str, error_message: Optional[str] = None, final_report: Optional[str] = None): + """์„ธ์…˜ ์ƒํƒœ ์—…๋ฐ์ดํŠธ (๋น„๋™๊ธฐ ์•ˆ์ „)""" + self.session.status = status + now = datetime.datetime.now() + if status == 'running': + self.session.started_at = now + else: + self.session.completed_at = now + + if error_message: + self.session.error_message = error_message + if final_report: + self.session.final_report = final_report + + self.session.save() + + @database_sync_to_async + def _get_user_profile_and_key(self): + """์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ๋ฐ API ํ‚ค ์กฐํšŒ (๋น„๋™๊ธฐ ์•ˆ์ „)""" + profile = self.user.profile + return profile.get_effective_openai_api_key() + async def run_analysis(self): """๋ถ„์„ ์‹คํ–‰""" try: - # ์„ธ์…˜ ์ƒํƒœ ์—…๋ฐ์ดํŠธ - self.session.status = 'running' - self.session.started_at = datetime.datetime.now() - self.session.save() + await self._update_session_status('running') - # WebSocket์œผ๋กœ ์‹œ์ž‘ ์•Œ๋ฆผ await self._send_websocket_message({ 'type': 'analysis_started', 'session_id': self.session.id, 'message': '๋ถ„์„์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค...' }) - # ์‚ฌ์šฉ์ž ํ”„๋กœํ•„์—์„œ OpenAI API ํ‚ค ๊ฐ€์ ธ์˜ค๊ธฐ - profile = self.user.profile - api_key = profile.get_effective_openai_api_key() + api_key = await self._get_user_profile_and_key() if not api_key: raise Exception("OpenAI API ํ‚ค๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.") - # CLI ์„ค์ • ์ค€๋น„ config = self._prepare_analysis_config(api_key) - - # ๋ถ„์„ ์‹คํ–‰ result = await self._execute_trading_analysis(config) - # ๊ฒฐ๊ณผ ์ €์žฅ - self.session.final_report = result - self.session.status = 'completed' - self.session.completed_at = datetime.datetime.now() - self.session.save() + await self._update_session_status('completed', final_report=result) - # WebSocket์œผ๋กœ ์™„๋ฃŒ ์•Œ๋ฆผ await self._send_websocket_message({ 'type': 'analysis_completed', 'session_id': self.session.id, @@ -70,17 +80,13 @@ class TradingAnalysisService: return result except Exception as e: - # ์—๋Ÿฌ ์ฒ˜๋ฆฌ - self.session.status = 'failed' - self.session.error_message = str(e) - self.session.completed_at = datetime.datetime.now() - self.session.save() + error_msg = str(e) + await self._update_session_status('failed', error_message=error_msg) - # WebSocket์œผ๋กœ ์—๋Ÿฌ ์•Œ๋ฆผ await self._send_websocket_message({ 'type': 'analysis_failed', 'session_id': self.session.id, - 'message': f'๋ถ„์„ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค: {str(e)}' + 'message': f'๋ถ„์„ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค: {error_msg}' }) raise e @@ -115,9 +121,28 @@ class TradingAnalysisService: 'deep_thinking_model': config['deep_thinker'], }) - # TradingAgentsGraph ์ดˆ๊ธฐํ™” - trading_graph = TradingAgentsGraph(analysis_config) - + # ์ง„ํ–‰ ์ƒํ™ฉ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์ˆ˜์ • + async def progress_callback(message_type: str, content: str, agent: str = None, step: int = 0, total: int = 0): + # ๋ฐฑ์—”๋“œ์—์„œ ์ง„ํ–‰๋ฅ  ๊ณ„์‚ฐ + progress_percent = int((step / total) * 99) if total > 0 else 0 # 100%๋Š” ์™„๋ฃŒ ์‹œ์—๋งŒ + await self._send_websocket_message({ + 'type': 'analysis_progress', + 'session_id': self.session.id, + 'message_type': message_type, + 'content': content, + 'agent': agent, + 'progress': progress_percent, + }) + + # TradingAgentsGraph ์ดˆ๊ธฐํ™” (๋” ์ƒ์„ธํ•œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ) + try: + trading_graph = TradingAgentsGraph( + config=analysis_config, + progress_callback=progress_callback + ) + except Exception as e: + raise Exception(f"TradingAgentsGraph ์ดˆ๊ธฐํ™” ์‹คํŒจ: {str(e)}") + # ๋ถ„์„ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ ์ค€๋น„ input_data = { 'ticker': config['ticker'], @@ -126,50 +151,22 @@ class TradingAnalysisService: 'research_depth': config['research_depth'], } - # ์ง„ํ–‰ ์ƒํ™ฉ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ - async def progress_callback(message_type: str, content: str, agent: str = None): - await self._send_websocket_message({ - 'type': 'analysis_progress', - 'session_id': self.session.id, - 'message_type': message_type, - 'content': content, - 'agent': agent - }) - # ๋ถ„์„ ์‹คํ–‰ (์‹ค์ œ CLI ๋กœ์ง ํ˜ธ์ถœ) - # ์—ฌ๊ธฐ์„œ๋Š” ๊ฐ„๋‹จํ™”๋œ ๋ฒ„์ „์œผ๋กœ ๊ตฌํ˜„ - # ์‹ค์ œ๋กœ๋Š” trading_graph.invoke(input_data) ํ˜•ํƒœ๋กœ ํ˜ธ์ถœ - - # ๋ถ„์„ ์ง„ํ–‰ ์ƒํ™ฉ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ - analysis_steps = [ - ("Market Analyst", "์‹œ์žฅ ๋ฐ์ดํ„ฐ ๋ถ„์„ ์ค‘..."), - ("Social Analyst", "์†Œ์…œ ์„ผํ‹ฐ๋ฉ˜ํŠธ ๋ถ„์„ ์ค‘..."), - ("News Analyst", "๋‰ด์Šค ๋ถ„์„ ์ค‘..."), - ("Fundamentals Analyst", "๊ธฐ๋ณธ ๋ถ„์„ ์ค‘..."), - ("Research Manager", "์—ฐ๊ตฌ ๊ฒฐ๊ณผ ์ข…ํ•ฉ ์ค‘..."), - ("Trader", "๊ฑฐ๋ž˜ ์ „๋žต ์ˆ˜๋ฆฝ ์ค‘..."), - ("Portfolio Manager", "ํฌํŠธํด๋ฆฌ์˜ค ์ตœ์ ํ™” ์ค‘...") - ] - - final_report_parts = [] - - for agent, message in analysis_steps: - await progress_callback("agent_update", message, agent) - - # ์‹ค์ œ ๋ถ„์„ ๋กœ์ง ํ˜ธ์ถœ (์—ฌ๊ธฐ์„œ๋Š” ์‹œ๋ฎฌ๋ ˆ์ด์…˜) - await asyncio.sleep(2) # ์‹ค์ œ ๋ถ„์„ ์‹œ๊ฐ„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ - - # ๊ฐ ๋‹จ๊ณ„๋ณ„ ๊ฒฐ๊ณผ ์ƒ์„ฑ (์‹ค์ œ๋กœ๋Š” trading_graph์˜ ๊ฒฐ๊ณผ) - step_result = f"## {agent} ๋ถ„์„ ๊ฒฐ๊ณผ\n\n{config['ticker']} ์ข…๋ชฉ์— ๋Œ€ํ•œ {agent.lower()} ๋ถ„์„์„ ์™„๋ฃŒํ–ˆ์Šต๋‹ˆ๋‹ค.\n" - final_report_parts.append(step_result) - - # ์ตœ์ข… ๋ณด๊ณ ์„œ ์ƒ์„ฑ - final_report = "\n\n".join(final_report_parts) - - return final_report - + try: + # ์—ฌ๊ธฐ์„œ trading_graph.invoke๋ฅผ ๋น„๋™๊ธฐ๋กœ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + # ํ˜„์žฌ trading_graph.invoke๊ฐ€ ๋™๊ธฐ ํ•จ์ˆ˜๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ , + # asyncio.to_thread๋ฅผ ์‚ฌ์šฉํ•ด ๋น„๋™๊ธฐ ์ปจํ…์ŠคํŠธ์—์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. + result = await asyncio.to_thread( + trading_graph.invoke, + input_data + ) + return result['final_report'] # ๊ฒฐ๊ณผ ํ˜•์‹์— ๋”ฐ๋ผ ์กฐ์ • ํ•„์š” + except Exception as e: + raise Exception(f"trading_graph.invoke ์‹คํ–‰ ์‹คํŒจ: {str(e)}") + except Exception as e: - raise Exception(f"๋ถ„์„ ์‹คํ–‰ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}") + # ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋‹ค์‹œ ๋˜์ง + raise Exception(f"๋ถ„์„ ์‹คํ–‰ ์ค‘ ์˜ค๋ฅ˜: {str(e)}") async def _send_websocket_message(self, message: Dict): """WebSocket์œผ๋กœ ๋ฉ”์‹œ์ง€ ์ „์†ก""" @@ -189,24 +186,15 @@ class TradingAnalysisManager: """๊ฑฐ๋ž˜ ๋ถ„์„ ๊ด€๋ฆฌ์ž""" @staticmethod - def create_analysis_session(user, analysis_data: Dict) -> AnalysisSession: - """๋ถ„์„ ์„ธ์…˜ ์ƒ์„ฑ""" - session = AnalysisSession.objects.create( - user=user, - ticker=analysis_data['ticker'], - analysis_date=analysis_data['analysis_date'], - analysts_selected=analysis_data['analysts_selected'], - research_depth=analysis_data['research_depth'], - shallow_thinker=analysis_data['shallow_thinker'], - deep_thinker=analysis_data['deep_thinker'], - ) - return session - + @database_sync_to_async + def _get_session(user, session_id): + return AnalysisSession.objects.get(id=session_id, user=user) + @staticmethod async def start_analysis(user, session_id: int): """๋ถ„์„ ์‹œ์ž‘""" try: - session = AnalysisSession.objects.get(id=session_id, user=user) + session = await TradingAnalysisManager._get_session(user, session_id) service = TradingAnalysisService(user, session) result = await service.run_analysis() return result @@ -214,11 +202,13 @@ class TradingAnalysisManager: raise Exception("๋ถ„์„ ์„ธ์…˜์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.") @staticmethod + @database_sync_to_async def get_user_analysis_sessions(user) -> List[AnalysisSession]: """์‚ฌ์šฉ์ž์˜ ๋ถ„์„ ์„ธ์…˜ ๋ชฉ๋ก ์กฐํšŒ""" - return AnalysisSession.objects.filter(user=user).order_by('-created_at') + return list(AnalysisSession.objects.filter(user=user).order_by('-created_at')) @staticmethod + @database_sync_to_async def cancel_analysis(user, session_id: int): """๋ถ„์„ ์ทจ์†Œ""" try: diff --git a/web/backend/apps/trading_api/views.py b/web/backend/apps/trading_api/views.py index 58b0032a..0ca5a5b7 100644 --- a/web/backend/apps/trading_api/views.py +++ b/web/backend/apps/trading_api/views.py @@ -5,6 +5,7 @@ from rest_framework.views import APIView from django.shortcuts import get_object_or_404 from asgiref.sync import sync_to_async import asyncio +import threading from datetime import datetime from apps.authentication.models import AnalysisSession @@ -56,15 +57,15 @@ class StartAnalysisView(APIView): def post(self, request): """์ƒˆ๋กœ์šด ๋ถ„์„ ์‹œ์ž‘""" + print(f"request.data: {request.data}") serializer = CreateAnalysisSessionSerializer(data=request.data) if serializer.is_valid(): - # ๋ถ„์„ ์„ธ์…˜ ์ƒ์„ฑ session = serializer.save(user=request.user) - # ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋ถ„์„ ์‹คํ–‰ - # ์‹ค์ œ ํ™˜๊ฒฝ์—์„œ๋Š” Celery๋‚˜ ๋‹ค๋ฅธ task queue๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค - asyncio.create_task(self._start_analysis_async(request.user, session.id)) + # ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ์—์„œ ๋น„๋™๊ธฐ ์ž‘์—… ์‹คํ–‰ + thread = threading.Thread(target=self.run_async_task, args=(self._start_analysis_async(request.user, session.id),)) + thread.start() return Response({ 'message': '๋ถ„์„์ด ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค.', @@ -74,6 +75,13 @@ class StartAnalysisView(APIView): return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + def run_async_task(self, coro): + """์ƒˆ ์ด๋ฒคํŠธ ๋ฃจํ”„์—์„œ ๋น„๋™๊ธฐ ์ฝ”๋ฃจํ‹ด ์‹คํ–‰""" + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + loop.run_until_complete(coro) + loop.close() + async def _start_analysis_async(self, user, session_id): """๋น„๋™๊ธฐ ๋ถ„์„ ์‹คํ–‰""" try: diff --git a/web/backend/eval_results/AAPL/TradingAgentsStrategy_logs/full_states_log.json b/web/backend/eval_results/AAPL/TradingAgentsStrategy_logs/full_states_log.json new file mode 100644 index 00000000..6db4fec8 --- /dev/null +++ b/web/backend/eval_results/AAPL/TradingAgentsStrategy_logs/full_states_log.json @@ -0,0 +1,27 @@ +{ + "2025-06-13": { + "company_of_interest": "AAPL", + "trade_date": "2025-06-13", + "market_report": "### AAPL Technical Analysis Report (as of June 13, 2025)\n\n#### Overview\nApple Inc. (AAPL) has experienced a volatile trading period from May 1, 2025, to June 13, 2025. The stock has shown fluctuations in price, with notable highs and lows, reflecting broader market trends and investor sentiment. This report analyzes key technical indicators to provide insights into potential trading strategies.\n\n#### Moving Averages\n1. **50-Day Simple Moving Average (SMA)**: \n - Current Value (as of June 12, 2025): **201.84**\n - The 50 SMA indicates a medium-term trend. The recent value is below the previous levels, suggesting a potential bearish trend as the price has been declining.\n\n2. **200-Day Simple Moving Average (SMA)**: \n - Current Value (as of June 12, 2025): **224.13**\n - The 200 SMA serves as a long-term trend benchmark. The significant gap between the 50 SMA and the 200 SMA indicates a bearish sentiment in the medium term, as the price is well below the long-term average.\n\n3. **10-Day Exponential Moving Average (EMA)**: \n - Current Value (as of June 12, 2025): **201.19**\n - The 10 EMA is more responsive to recent price changes. It has been declining, indicating short-term bearish momentum. \n\n#### MACD Indicators\n1. **MACD**: \n - Current Value (as of June 12, 2025): **-1.27**\n - The negative MACD value suggests bearish momentum. The trend has been consistently negative, indicating a lack of buying pressure.\n\n2. **MACD Signal**: \n - Current Value (as of June 12, 2025): **-1.15**\n - The MACD Signal is also negative, confirming the bearish trend. \n\n3. **MACD Histogram**: \n - Current Value (as of June 12, 2025): **-0.12**\n - The histogram shows a slight decrease in the gap between the MACD and its signal line, indicating a potential slowing of the bearish momentum.\n\n#### Momentum Indicator\n- **Relative Strength Index (RSI)**: \n - Current Value (as of June 12, 2025): **44.35**\n - The RSI is below the neutral level of 50, indicating that the stock is neither overbought nor oversold. This suggests a potential for further downside if the trend continues.\n\n#### Volatility Indicator\n- **Average True Range (ATR)**: \n - Current Value (as of June 12, 2025): **5.07**\n - The ATR indicates moderate volatility. Traders should consider this when setting stop-loss levels, as the stock has shown significant price swings.\n\n### Summary of Key Indicators\n| Indicator | Current Value | Trend Direction | Interpretation |\n|--------------------------|---------------|------------------|----------------------------------------------------|\n| 50 SMA | 201.84 | Bearish | Medium-term trend is declining. |\n| 200 SMA | 224.13 | Bearish | Long-term trend is significantly above current price. |\n| 10 EMA | 201.19 | Bearish | Short-term trend is declining. |\n| MACD | -1.27 | Bearish | Indicates bearish momentum. |\n| MACD Signal | -1.15 | Bearish | Confirms bearish trend. |\n| MACD Histogram | -0.12 | Neutral | Slowing bearish momentum. |\n| RSI | 44.35 | Neutral | Indicates potential for further downside. |\n| ATR | 5.07 | Moderate | Suggests moderate volatility. |\n\n### Conclusion\nThe analysis of AAPL indicates a bearish trend across multiple indicators, particularly in the moving averages and MACD metrics. The RSI suggests that while the stock is not currently overbought or oversold, the overall sentiment leans towards further downside potential. Traders should exercise caution and consider these indicators when making trading decisions.\n\nFINAL TRANSACTION PROPOSAL: **SELL**", + "sentiment_report": "", + "news_report": "### Comprehensive Report on Current State of the World Relevant for Trading and Macroeconomics (June 13, 2025)\n\n#### Macroeconomic Developments\n\n1. **Geopolitical Tensions**:\n - A significant military strike by Israel on Iran has escalated tensions in the Middle East, leading to a notable decline in global stock markets. The S&P E-mini and Nasdaq futures dropped by 1.7% and 1.8%, respectively. This geopolitical instability has also caused crude oil prices to surge by approximately 9%, with Brent futures reaching $75.36 per barrel and WTI at $74.20. Investors are increasingly turning to safe-haven assets, resulting in a 1.5% rise in gold prices.\n\n2. **U.S. Dollar Weakness**:\n - The U.S. dollar has fallen to its lowest level in over three years against a basket of major currencies. This decline is attributed to subdued inflation data, particularly in consumer and producer prices, and renewed tariff threats from President Trump, which include a proposed increase in tariffs on steel and aluminum to 50% for all exporters.\n\n3. **Market Reactions**:\n - The stock market has reacted negatively to geopolitical events, with Boeing shares dropping about 5% following a tragic crash of a Boeing 787 in India. The International Monetary Fund (IMF) is set to release its global growth forecast in July, which will take into account recent trade developments and economic uncertainties.\n\n#### Company-Specific Insights: Apple Inc. (AAPL)\n\n1. **Recent Performance**:\n - Apple Inc. has faced a challenging year, with its stock down over 16% as of early June 2025. Analysts have expressed concerns about the company's performance, particularly following its recent Worldwide Developers Conference (WWDC), where expectations for AI advancements were not met.\n\n2. **Analyst Ratings**:\n - Despite the recent downturn, several analysts have maintained a positive outlook on Apple. Goldman Sachs and TD Cowen have reiterated \"Buy\" ratings with price targets of $253 and $275, respectively. However, Barclays has issued a \"Sell\" recommendation with a target of $173, reflecting mixed sentiments among analysts.\n\n3. **WWDC Highlights**:\n - At WWDC, Apple unveiled several updates, including a redesign of its operating systems and new AI tools. However, the lack of groundbreaking AI innovations has left some investors underwhelmed. The introduction of features like ChatGPT integration in Xcode and a new on-device intelligence framework were notable, but analysts have criticized the overall impact on Apple's competitive position in the AI space.\n\n4. **Market Sentiment**:\n - The sentiment around Apple remains cautious, with some analysts suggesting that the company is lagging in innovation compared to competitors. Concerns about softening demand for iPhones, particularly in key markets like the U.S. and China, have also been raised.\n\n5. **Legal and Regulatory Challenges**:\n - Apple is currently facing investigations related to potential fraud claims, which could impact investor confidence. Additionally, the looming threat of tariffs on imports may affect the pricing strategy for upcoming products, including the anticipated iPhone 17.\n\n### Summary Table of Key Points\n\n| **Category** | **Details** |\n|------------------------------------|---------------------------------------------------------------------------------------------------|\n| **Geopolitical Tensions** | Israel's strike on Iran; global stock market declines; oil prices surge; gold prices rise. |\n| **U.S. Dollar Weakness** | Dollar at three-year low; subdued inflation data; renewed tariff threats from President Trump. |\n| **Market Reactions** | Boeing shares drop after crash; IMF to release growth forecast in July. |\n| **Apple Inc. (AAPL) Performance** | Stock down 16% YTD; mixed analyst ratings; Goldman Sachs and TD Cowen maintain \"Buy\" ratings. |\n| **WWDC Highlights** | New OS redesign; AI tools introduced; lack of major innovations disappoints investors. |\n| **Market Sentiment** | Cautious outlook; concerns over iPhone demand; legal investigations may impact confidence. |\n| **Legal Challenges** | Ongoing investigations into potential fraud claims; tariff threats may affect pricing strategy. |\n\n### Conclusion\nThe current macroeconomic landscape is characterized by geopolitical instability, a weakening U.S. dollar, and mixed sentiments regarding major companies like Apple Inc. Traders should closely monitor these developments, particularly the implications of geopolitical events and corporate performance, to inform their investment strategies.\n\nFINAL TRANSACTION PROPOSAL: **HOLD**", + "fundamentals_report": "", + "investment_debate_state": { + "bull_history": "\nBull Analyst: Absolutely, let\u2019s dive into why investing in Apple Inc. (AAPL) is a compelling opportunity despite the current bearish sentiment. \n\n### Growth Potential\n\nFirst and foremost, let\u2019s talk about growth potential. Apple is not just a tech company; it\u2019s a powerhouse with a diverse ecosystem that continues to expand. The company has a robust pipeline of products and services, including the anticipated iPhone 17, which is expected to drive significant revenue growth. Analysts from Goldman Sachs and TD Cowen have set price targets of $253 and $275, respectively, indicating strong upside potential from current levels. \n\nMoreover, Apple\u2019s services segment, which includes Apple Music, iCloud, and the App Store, has been a consistent revenue driver, growing at a rate of over 20% year-over-year. This segment is highly scalable and has higher margins compared to hardware sales, which positions Apple well for sustained growth.\n\n### Competitive Advantages\n\nNow, let\u2019s discuss competitive advantages. Apple\u2019s brand loyalty is unparalleled. The company has cultivated a dedicated customer base that is willing to pay a premium for its products. This strong branding is complemented by a unique ecosystem that integrates hardware, software, and services seamlessly. Unlike competitors, Apple\u2019s closed ecosystem creates a high switching cost for consumers, ensuring that once they are in, they are likely to stay.\n\nAdditionally, Apple\u2019s investment in AI and machine learning, although criticized for not being groundbreaking at WWDC, is still a strategic move. The integration of AI tools into their existing products will enhance user experience and keep Apple competitive in a rapidly evolving tech landscape.\n\n### Positive Indicators\n\nDespite the recent volatility, there are positive indicators worth noting. The recent dip in stock price, down 16% YTD, presents a buying opportunity rather than a reason to sell. The market often overreacts to short-term news, and Apple\u2019s fundamentals remain strong. The company has a solid balance sheet with over $200 billion in cash, allowing it to weather economic downturns and invest in innovation.\n\nFurthermore, the current geopolitical tensions and a weakening U.S. dollar may actually benefit Apple in the long run. As global markets stabilize, Apple\u2019s international sales could see a boost, especially in emerging markets where smartphone penetration is still growing.\n\n### Addressing Bear Counterpoints\n\nNow, let\u2019s address some of the bearish arguments. Yes, the technical indicators show a bearish trend, with the 50-day SMA below the 200-day SMA and a negative MACD. However, these indicators are often lagging and do not account for the long-term potential of the company. The RSI at 44.35 suggests that the stock is not overbought, indicating potential for recovery.\n\nConcerns about softening demand for iPhones are valid, but let\u2019s not forget that Apple has consistently innovated and adapted to market demands. The introduction of new features and services can reignite interest in their flagship products. Additionally, the legal challenges Apple faces are not new to the company; it has navigated regulatory scrutiny before and emerged stronger.\n\n### Engagement and Reflection\n\nI understand the concerns about Apple\u2019s innovation pace compared to competitors, but let\u2019s remember that Apple has a history of surprising the market. The company often takes a measured approach to innovation, ensuring that when they do release a product, it meets their high standards.\n\nReflecting on past experiences, I\u2019ve learned that market sentiment can often be driven by fear rather than fundamentals. For instance, during the pandemic, many investors were quick to sell off tech stocks, only to see them rebound significantly as the economy recovered. \n\nIn conclusion, while the current sentiment may lean bearish, the long-term growth potential, competitive advantages, and positive indicators make Apple a strong buy. The stock is currently undervalued, and as the market stabilizes, I believe we will see a significant rebound. Let\u2019s not miss this opportunity to invest in a company that has consistently proven its resilience and ability to innovate. What do you think?", + "bear_history": "\nBear Analyst: Absolutely, let\u2019s engage in this discussion about Apple Inc. (AAPL) and why I believe the current sentiment leans towards caution rather than optimism. While I appreciate the bullish perspective on growth potential and competitive advantages, I think it\u2019s crucial to examine the underlying risks and challenges that could significantly impact Apple\u2019s performance moving forward.\n\n### Risks and Challenges\n\nFirst, let\u2019s address the broader macroeconomic landscape. The recent geopolitical tensions, particularly the military strike by Israel on Iran, have led to a decline in global stock markets and increased volatility. This instability can have a ripple effect on consumer confidence and spending, which is critical for a company like Apple that relies heavily on consumer electronics sales. The S&P E-mini and Nasdaq futures have already dropped by 1.7% and 1.8%, respectively, indicating a bearish sentiment that could affect Apple\u2019s stock price.\n\nMoreover, the U.S. dollar's weakness, now at its lowest level in over three years, poses additional challenges. While some may argue that this could benefit Apple\u2019s international sales, it also raises concerns about inflation and potential tariff increases, particularly with President Trump\u2019s proposed tariffs on steel and aluminum. These factors could lead to increased costs for Apple, impacting margins and pricing strategies for upcoming products like the iPhone 17.\n\n### Competitive Weaknesses\n\nNow, let\u2019s talk about Apple\u2019s competitive positioning. While the company has a strong brand and loyal customer base, there are signs that it may be losing its edge in innovation. The recent Worldwide Developers Conference (WWDC) left many investors underwhelmed, as the anticipated AI advancements did not materialize in a way that would significantly differentiate Apple from its competitors. This stagnation in innovation could lead to a decline in market share, especially as rivals continue to push the envelope in technology.\n\nAdditionally, concerns about softening demand for iPhones, particularly in key markets like the U.S. and China, cannot be overlooked. The smartphone market is becoming increasingly saturated, and Apple\u2019s reliance on iPhone sales makes it vulnerable to shifts in consumer preferences. If the iPhone 17 fails to excite the market, we could see a further decline in sales, which would directly impact revenue.\n\n### Negative Indicators\n\nThe technical indicators paint a concerning picture as well. The 50-day SMA is currently below the 200-day SMA, indicating a bearish trend. The negative MACD value of -1.27 suggests a lack of buying pressure, and the RSI at 44.35 indicates potential for further downside. These indicators are not just lagging; they reflect a broader sentiment that investors should heed. The stock is down over 16% year-to-date, and while some may view this as a buying opportunity, it could also signal deeper issues within the company.\n\n### Addressing Bull Counterpoints\n\nI understand the bullish argument that Apple\u2019s fundamentals remain strong, particularly with a solid balance sheet boasting over $200 billion in cash. However, cash reserves alone do not guarantee growth or innovation. The company must effectively utilize this capital to invest in new technologies and products that resonate with consumers. If it fails to do so, the cash becomes a mere cushion rather than a catalyst for growth.\n\nFurthermore, while the bulls argue that the market often overreacts to short-term news, it\u2019s essential to recognize that the current geopolitical and economic climate is not just a passing phase. The implications of these events could have lasting effects on consumer behavior and market dynamics.\n\n### Engagement and Reflection\n\nReflecting on past experiences, I\u2019ve seen how companies can quickly lose their market position when they fail to innovate or adapt to changing consumer needs. For instance, during the dot-com bubble, many tech companies with strong fundamentals saw their stock prices plummet when they could not deliver on growth expectations. Apple is not immune to this risk, especially in a rapidly evolving tech landscape.\n\nIn conclusion, while the bullish arguments highlight potential growth and competitive advantages, the risks and challenges facing Apple are significant. The combination of geopolitical instability, competitive weaknesses, and negative technical indicators suggests that now may not be the right time to invest in AAPL. Instead, I would advocate for a cautious approach, keeping a close eye on how these factors evolve in the coming months. What do you think?", + "history": "\nBull Analyst: Absolutely, let\u2019s dive into why investing in Apple Inc. (AAPL) is a compelling opportunity despite the current bearish sentiment. \n\n### Growth Potential\n\nFirst and foremost, let\u2019s talk about growth potential. Apple is not just a tech company; it\u2019s a powerhouse with a diverse ecosystem that continues to expand. The company has a robust pipeline of products and services, including the anticipated iPhone 17, which is expected to drive significant revenue growth. Analysts from Goldman Sachs and TD Cowen have set price targets of $253 and $275, respectively, indicating strong upside potential from current levels. \n\nMoreover, Apple\u2019s services segment, which includes Apple Music, iCloud, and the App Store, has been a consistent revenue driver, growing at a rate of over 20% year-over-year. This segment is highly scalable and has higher margins compared to hardware sales, which positions Apple well for sustained growth.\n\n### Competitive Advantages\n\nNow, let\u2019s discuss competitive advantages. Apple\u2019s brand loyalty is unparalleled. The company has cultivated a dedicated customer base that is willing to pay a premium for its products. This strong branding is complemented by a unique ecosystem that integrates hardware, software, and services seamlessly. Unlike competitors, Apple\u2019s closed ecosystem creates a high switching cost for consumers, ensuring that once they are in, they are likely to stay.\n\nAdditionally, Apple\u2019s investment in AI and machine learning, although criticized for not being groundbreaking at WWDC, is still a strategic move. The integration of AI tools into their existing products will enhance user experience and keep Apple competitive in a rapidly evolving tech landscape.\n\n### Positive Indicators\n\nDespite the recent volatility, there are positive indicators worth noting. The recent dip in stock price, down 16% YTD, presents a buying opportunity rather than a reason to sell. The market often overreacts to short-term news, and Apple\u2019s fundamentals remain strong. The company has a solid balance sheet with over $200 billion in cash, allowing it to weather economic downturns and invest in innovation.\n\nFurthermore, the current geopolitical tensions and a weakening U.S. dollar may actually benefit Apple in the long run. As global markets stabilize, Apple\u2019s international sales could see a boost, especially in emerging markets where smartphone penetration is still growing.\n\n### Addressing Bear Counterpoints\n\nNow, let\u2019s address some of the bearish arguments. Yes, the technical indicators show a bearish trend, with the 50-day SMA below the 200-day SMA and a negative MACD. However, these indicators are often lagging and do not account for the long-term potential of the company. The RSI at 44.35 suggests that the stock is not overbought, indicating potential for recovery.\n\nConcerns about softening demand for iPhones are valid, but let\u2019s not forget that Apple has consistently innovated and adapted to market demands. The introduction of new features and services can reignite interest in their flagship products. Additionally, the legal challenges Apple faces are not new to the company; it has navigated regulatory scrutiny before and emerged stronger.\n\n### Engagement and Reflection\n\nI understand the concerns about Apple\u2019s innovation pace compared to competitors, but let\u2019s remember that Apple has a history of surprising the market. The company often takes a measured approach to innovation, ensuring that when they do release a product, it meets their high standards.\n\nReflecting on past experiences, I\u2019ve learned that market sentiment can often be driven by fear rather than fundamentals. For instance, during the pandemic, many investors were quick to sell off tech stocks, only to see them rebound significantly as the economy recovered. \n\nIn conclusion, while the current sentiment may lean bearish, the long-term growth potential, competitive advantages, and positive indicators make Apple a strong buy. The stock is currently undervalued, and as the market stabilizes, I believe we will see a significant rebound. Let\u2019s not miss this opportunity to invest in a company that has consistently proven its resilience and ability to innovate. What do you think?\nBear Analyst: Absolutely, let\u2019s engage in this discussion about Apple Inc. (AAPL) and why I believe the current sentiment leans towards caution rather than optimism. While I appreciate the bullish perspective on growth potential and competitive advantages, I think it\u2019s crucial to examine the underlying risks and challenges that could significantly impact Apple\u2019s performance moving forward.\n\n### Risks and Challenges\n\nFirst, let\u2019s address the broader macroeconomic landscape. The recent geopolitical tensions, particularly the military strike by Israel on Iran, have led to a decline in global stock markets and increased volatility. This instability can have a ripple effect on consumer confidence and spending, which is critical for a company like Apple that relies heavily on consumer electronics sales. The S&P E-mini and Nasdaq futures have already dropped by 1.7% and 1.8%, respectively, indicating a bearish sentiment that could affect Apple\u2019s stock price.\n\nMoreover, the U.S. dollar's weakness, now at its lowest level in over three years, poses additional challenges. While some may argue that this could benefit Apple\u2019s international sales, it also raises concerns about inflation and potential tariff increases, particularly with President Trump\u2019s proposed tariffs on steel and aluminum. These factors could lead to increased costs for Apple, impacting margins and pricing strategies for upcoming products like the iPhone 17.\n\n### Competitive Weaknesses\n\nNow, let\u2019s talk about Apple\u2019s competitive positioning. While the company has a strong brand and loyal customer base, there are signs that it may be losing its edge in innovation. The recent Worldwide Developers Conference (WWDC) left many investors underwhelmed, as the anticipated AI advancements did not materialize in a way that would significantly differentiate Apple from its competitors. This stagnation in innovation could lead to a decline in market share, especially as rivals continue to push the envelope in technology.\n\nAdditionally, concerns about softening demand for iPhones, particularly in key markets like the U.S. and China, cannot be overlooked. The smartphone market is becoming increasingly saturated, and Apple\u2019s reliance on iPhone sales makes it vulnerable to shifts in consumer preferences. If the iPhone 17 fails to excite the market, we could see a further decline in sales, which would directly impact revenue.\n\n### Negative Indicators\n\nThe technical indicators paint a concerning picture as well. The 50-day SMA is currently below the 200-day SMA, indicating a bearish trend. The negative MACD value of -1.27 suggests a lack of buying pressure, and the RSI at 44.35 indicates potential for further downside. These indicators are not just lagging; they reflect a broader sentiment that investors should heed. The stock is down over 16% year-to-date, and while some may view this as a buying opportunity, it could also signal deeper issues within the company.\n\n### Addressing Bull Counterpoints\n\nI understand the bullish argument that Apple\u2019s fundamentals remain strong, particularly with a solid balance sheet boasting over $200 billion in cash. However, cash reserves alone do not guarantee growth or innovation. The company must effectively utilize this capital to invest in new technologies and products that resonate with consumers. If it fails to do so, the cash becomes a mere cushion rather than a catalyst for growth.\n\nFurthermore, while the bulls argue that the market often overreacts to short-term news, it\u2019s essential to recognize that the current geopolitical and economic climate is not just a passing phase. The implications of these events could have lasting effects on consumer behavior and market dynamics.\n\n### Engagement and Reflection\n\nReflecting on past experiences, I\u2019ve seen how companies can quickly lose their market position when they fail to innovate or adapt to changing consumer needs. For instance, during the dot-com bubble, many tech companies with strong fundamentals saw their stock prices plummet when they could not deliver on growth expectations. Apple is not immune to this risk, especially in a rapidly evolving tech landscape.\n\nIn conclusion, while the bullish arguments highlight potential growth and competitive advantages, the risks and challenges facing Apple are significant. The combination of geopolitical instability, competitive weaknesses, and negative technical indicators suggests that now may not be the right time to invest in AAPL. Instead, I would advocate for a cautious approach, keeping a close eye on how these factors evolve in the coming months. What do you think?", + "current_response": "Here\u2019s how I see it after weighing both sides and learning from past calls where I let short-term noise derail solid ideas: Apple still deserves a Buy. \n\nFirst, the nutshell on each camp\u2019s best arguments:\n\nBull case\u2019s strongest points \n\u2022 Services engine: >20% growth, high margins, recurring revenue. \n\u2022 Huge cash hoard: $200 billion+ to fund R&D, buy back stock, buffer downturns. \n\u2022 Undervalued vs. long-term targets of $253\u2013$275; 16% YTD drop looks like a buying opportunity. \n\u2022 Brand lock-in and ecosystem make defections rare, and iPhone 17 still has upgrade potential. \n\nBear case\u2019s strongest points \n\u2022 Macro headwinds: war-driven volatility, weaker dollar, potential tariffs could squeeze costs. \n\u2022 Innovation questions: WWDC underwhelmed, smartphone market saturation, risk of faltering iPhone demand. \n\u2022 Technicals are negative (50-day under 200-day SMA, negative MACD, RSI not yet oversold). \n\nWhy I\u2019m siding with the Bull: Apple\u2019s fundamentals aren\u2019t just paper strength\u2014they translate into real fre e-cash-flow and pricing power. History shows it weathers one-off storms and comes out stronger. The macro risks are real, but they\u2019re already priced into a sub-$170 stock. If you wait for the \u201cperfect\u201d moment, you\u2019ll miss half the rally. \n\nHere\u2019s the actionable plan:\n\n1. Recommendation: Buy Apple (AAPL) with a 12- to 18-month horizon. \n2. Rationale: \n \u2013 The services margin engine vaulted revenue 20%+ last quarter and will accelerate once holiday iPhone upgrades kick in. \n \u2013 Cash cushion gives Apple optionality on AI, AR/VR, health wearables\u2014and the balance sheet means buybacks can continue to support the stock. \n \u2013 Technicals look beaten-down enough now that a relief rally is likely when headline risks calm. \n\n3. Strategic Actions: \n a. Scale in over three tranches\u2014today, then on any 3\u20135% pullback, then again if it retests the 200-day moving average. \n b. Size position to no more than 7% of your total equity exposure to keep risk manageable. \n c. Use a 10% trailing stop from your average entry to lock in gains if the market turns sour again. \n d. Monitor quarterly services growth (target >18%) and gross margins. If services growth decelerates under 15% or margins compress by >200 bps, revisit. \n e. Hedge gently by selling out-of-the-money December covered calls at about $185 if you get assigned cost basis around $170. \n\n4. Learning from past mistakes: I\u2019ve been too patient waiting for a \u201ccomplete bottom\u201d and missed sharp rebounds. This time I\u2019m committing to a disciplined build-up at these levels, rather than sitting on the sidelines hoping for a technical retest that may never come. \n\nIn short: Buy now, average in methodically, keep an eye on margin and services trends, and employ basic risk controls. That way you capture Apple\u2019s next leg up without gasping for air if the market hiccups again.", + "judge_decision": "Here\u2019s how I see it after weighing both sides and learning from past calls where I let short-term noise derail solid ideas: Apple still deserves a Buy. \n\nFirst, the nutshell on each camp\u2019s best arguments:\n\nBull case\u2019s strongest points \n\u2022 Services engine: >20% growth, high margins, recurring revenue. \n\u2022 Huge cash hoard: $200 billion+ to fund R&D, buy back stock, buffer downturns. \n\u2022 Undervalued vs. long-term targets of $253\u2013$275; 16% YTD drop looks like a buying opportunity. \n\u2022 Brand lock-in and ecosystem make defections rare, and iPhone 17 still has upgrade potential. \n\nBear case\u2019s strongest points \n\u2022 Macro headwinds: war-driven volatility, weaker dollar, potential tariffs could squeeze costs. \n\u2022 Innovation questions: WWDC underwhelmed, smartphone market saturation, risk of faltering iPhone demand. \n\u2022 Technicals are negative (50-day under 200-day SMA, negative MACD, RSI not yet oversold). \n\nWhy I\u2019m siding with the Bull: Apple\u2019s fundamentals aren\u2019t just paper strength\u2014they translate into real fre e-cash-flow and pricing power. History shows it weathers one-off storms and comes out stronger. The macro risks are real, but they\u2019re already priced into a sub-$170 stock. If you wait for the \u201cperfect\u201d moment, you\u2019ll miss half the rally. \n\nHere\u2019s the actionable plan:\n\n1. Recommendation: Buy Apple (AAPL) with a 12- to 18-month horizon. \n2. Rationale: \n \u2013 The services margin engine vaulted revenue 20%+ last quarter and will accelerate once holiday iPhone upgrades kick in. \n \u2013 Cash cushion gives Apple optionality on AI, AR/VR, health wearables\u2014and the balance sheet means buybacks can continue to support the stock. \n \u2013 Technicals look beaten-down enough now that a relief rally is likely when headline risks calm. \n\n3. Strategic Actions: \n a. Scale in over three tranches\u2014today, then on any 3\u20135% pullback, then again if it retests the 200-day moving average. \n b. Size position to no more than 7% of your total equity exposure to keep risk manageable. \n c. Use a 10% trailing stop from your average entry to lock in gains if the market turns sour again. \n d. Monitor quarterly services growth (target >18%) and gross margins. If services growth decelerates under 15% or margins compress by >200 bps, revisit. \n e. Hedge gently by selling out-of-the-money December covered calls at about $185 if you get assigned cost basis around $170. \n\n4. Learning from past mistakes: I\u2019ve been too patient waiting for a \u201ccomplete bottom\u201d and missed sharp rebounds. This time I\u2019m committing to a disciplined build-up at these levels, rather than sitting on the sidelines hoping for a technical retest that may never come. \n\nIn short: Buy now, average in methodically, keep an eye on margin and services trends, and employ basic risk controls. That way you capture Apple\u2019s next leg up without gasping for air if the market hiccups again." + }, + "trader_investment_decision": "After thoroughly analyzing the proposed investment plan for Apple (AAPL) and considering both the bullish and bearish arguments, I find the bull case compelling enough to recommend a buy. \n\nThe key points supporting this decision include:\n\n1. **Strong Services Growth**: The services segment is showing robust growth, which is crucial for Apple's revenue diversification and margin expansion. This trend is likely to continue, especially with the upcoming holiday season and potential iPhone upgrades.\n\n2. **Solid Financial Position**: Apple's substantial cash reserves provide a buffer against macroeconomic uncertainties and allow for continued investment in innovation and stock buybacks, which can support the stock price.\n\n3. **Valuation Opportunity**: The current price below $170 appears to be an attractive entry point, especially when considering long-term targets that suggest significant upside potential.\n\n4. **Market Resilience**: Historically, Apple has demonstrated resilience during market downturns, and the current macroeconomic challenges seem to be priced into the stock already.\n\n5. **Technical Indicators**: While there are some negative technical indicators, the overall sentiment and fundamentals suggest that a relief rally could occur as market conditions stabilize.\n\nGiven these factors, I recommend a strategic approach to buying AAPL:\n\n- **Scale In**: Begin purchasing shares today, with additional buys on any 3-5% pullbacks, and again if the stock retests the 200-day moving average.\n- **Position Sizing**: Limit the investment to no more than 7% of total equity exposure to manage risk effectively.\n- **Risk Management**: Implement a 10% trailing stop to protect gains and mitigate potential losses.\n\nIn conclusion, the combination of strong fundamentals, a solid financial position, and an attractive entry point outweighs the macroeconomic risks and technical concerns. \n\nFINAL TRANSACTION PROPOSAL: **BUY**", + "risk_debate_state": { + "risky_history": "\nRisky Analyst: Let's dive into the arguments presented by the conservative and neutral analysts regarding the investment in Apple (AAPL) and why their caution may overlook significant opportunities.\n\nFirst, the conservative analyst emphasizes the bearish technical indicators, such as the declining moving averages and negative MACD values. While it's true that these indicators suggest a bearish trend, they often reflect short-term market sentiment rather than long-term potential. The reality is that Apple has a history of bouncing back from such dips, and the current price below $170 could be seen as a prime entry point for savvy investors. The market often overreacts to short-term fluctuations, and those who buy during these dips can reap substantial rewards when the stock rebounds.\n\nMoreover, the conservative stance fails to account for the strong services growth that Apple is experiencing. This segment is not only diversifying revenue but also enhancing margins, which is crucial for long-term sustainability. The upcoming holiday season and potential iPhone upgrades could further boost this growth, creating a perfect storm for a price rally. By focusing solely on technical indicators, the conservative analyst risks missing out on the broader narrative of Apple's evolving business model.\n\nNow, addressing the neutral analyst's concerns about geopolitical tensions and macroeconomic factors, it's essential to recognize that while these elements can create volatility, they also present unique buying opportunities. The current geopolitical climate may be causing short-term panic, but historically, companies like Apple have shown resilience in the face of such challenges. The stock market often overreacts to geopolitical events, and those who invest during these periods can benefit from significant upside when stability returns.\n\nAdditionally, the neutral analyst points to the mixed sentiments surrounding Apple's innovation, particularly after the recent WWDC. However, it's crucial to remember that innovation is not a linear process. Apple has a robust pipeline of products and services that could surprise the market. The lack of immediate groundbreaking announcements does not negate the company's potential for future growth. In fact, the anticipation of new products can create a buzz that drives stock prices higher.\n\nFurthermore, the analyst's mention of legal challenges and tariff threats is valid, but these risks are often priced into the stock. Apple's substantial cash reserves provide a buffer against such uncertainties, allowing the company to navigate challenges while continuing to invest in innovation and shareholder returns. This financial strength is a competitive advantage that should not be overlooked.\n\nIn conclusion, while the conservative and neutral analysts present valid points, their caution may lead them to miss the significant upside potential that comes with investing in Apple at this juncture. The combination of strong fundamentals, a solid financial position, and an attractive entry point outweighs the perceived risks. By adopting a high-reward, high-risk strategy, investors can position themselves to capitalize on Apple's growth trajectory and market resilience. The recommendation to buy AAPL is not just about the current market conditions; it's about recognizing the long-term value and potential that this iconic company holds.", + "safe_history": "\nSafe Analyst: I appreciate the enthusiasm for Apple\u2019s potential, but I must emphasize that the optimism surrounding this investment overlooks several critical risks that could jeopardize our firm\u2019s assets. \n\nFirst, while it\u2019s true that Apple has historically bounced back from dips, we must consider the current market environment. The bearish technical indicators, including declining moving averages and negative MACD values, are not just short-term fluctuations; they reflect a broader sentiment that could persist. The significant gap between the 50-day and 200-day moving averages indicates a sustained bearish trend, which suggests that we could see further declines before any potential recovery. Relying on past performance in a different market context can be misleading and risky.\n\nRegarding the strong services growth, while it is indeed a positive aspect of Apple\u2019s business model, we cannot ignore the potential for saturation in key markets. The anticipated iPhone upgrades and holiday season sales may not yield the expected results, especially if consumer demand softens due to economic pressures or geopolitical tensions. The current geopolitical instability, particularly in the Middle East, is causing market volatility that could impact consumer spending and investor sentiment. This is not just a temporary panic; it\u2019s a significant factor that could lead to a prolonged downturn.\n\nYou mentioned that the market often overreacts to geopolitical events, but this time, the implications are serious. The rise in oil prices and the weakening U.S. dollar could lead to increased costs for Apple, affecting margins and profitability. These macroeconomic factors are not just noise; they can have real consequences on the bottom line, and we must factor them into our investment strategy.\n\nAs for the innovation pipeline, while Apple has a history of strong product launches, the recent WWDC did not meet market expectations. The lack of groundbreaking announcements raises concerns about Apple\u2019s competitive edge in a rapidly evolving tech landscape. If competitors continue to innovate while Apple lags, we could see a decline in market share, which would directly impact stock performance.\n\nLastly, the legal challenges and tariff threats are not just risks that are priced into the stock; they are real threats that could lead to significant financial repercussions. Ongoing investigations into potential fraud claims could damage investor confidence and lead to further stock price declines. The proposed tariffs could also increase costs for Apple, impacting pricing strategies and potentially leading to reduced sales.\n\nIn conclusion, while the arguments for buying AAPL are compelling on the surface, they fail to adequately address the substantial risks involved. A conservative approach prioritizes stability and risk mitigation, ensuring that we protect our assets in an uncertain market. Instead of chasing potential short-term gains, we should focus on preserving capital and seeking safer investment opportunities that align with our long-term growth objectives.", + "neutral_history": "\nNeutral Analyst: Let's take a closer look at the arguments presented by both the Risky and Safe Analysts regarding the investment in Apple (AAPL) and see where each perspective might be missing the mark.\n\nStarting with the Risky Analyst, while it's true that Apple has a history of bouncing back from dips, this time the market context is different. The bearish technical indicators, such as the declining moving averages and negative MACD values, are not just short-term fluctuations; they reflect a broader sentiment that could persist. The significant gap between the 50-day and 200-day moving averages suggests that we might see further declines before any potential recovery. Relying solely on past performance can be misleading, especially in a volatile market environment where external factors, like geopolitical tensions and economic shifts, are at play.\n\nThe Risky Analyst also emphasizes the strong growth in Apple's services segment as a reason to buy. While this is indeed a positive aspect, we must consider the potential for market saturation. If consumer demand softens due to economic pressures or geopolitical instability, the anticipated growth may not materialize as expected. The upcoming holiday season and iPhone upgrades could be impacted by these factors, which the Risky Analyst seems to downplay.\n\nNow, turning to the Safe Analyst, their caution regarding the geopolitical tensions and macroeconomic factors is well-founded. The current instability, particularly in the Middle East, is causing market volatility that could significantly impact consumer spending and investor sentiment. The Safe Analyst rightly points out that these are not just temporary concerns; they could lead to a prolonged downturn. However, while they advocate for a conservative approach, they may be overlooking the potential for unique buying opportunities that arise during periods of market panic. Historically, companies like Apple have shown resilience in the face of such challenges, and investing during these times can yield significant long-term rewards.\n\nThe Safe Analyst also raises valid concerns about Apple's innovation pipeline, particularly following the recent WWDC. While the lack of groundbreaking announcements may raise eyebrows, it's important to recognize that innovation is not always linear. Apple has a robust pipeline of products and services that could surprise the market in the future. The anticipation of new products can create a buzz that drives stock prices higher, even if immediate results are not evident.\n\nBoth analysts highlight the legal challenges and tariff threats facing Apple, which are indeed significant risks. However, the Safe Analyst's assertion that these risks are not priced into the stock may not fully account for Apple's substantial cash reserves. This financial strength provides a buffer against uncertainties, allowing the company to navigate challenges while continuing to invest in innovation and shareholder returns.\n\nIn conclusion, a balanced approach might be the most prudent strategy here. While the Risky Analyst's enthusiasm for Apple's potential is commendable, it overlooks the substantial risks present in the current market environment. Conversely, the Safe Analyst's caution is warranted, but it may lead to missed opportunities for growth. A moderate strategy that incorporates both growth potential and risk management\u2014such as scaling into the position, maintaining a diversified portfolio, and implementing stop-loss measures\u2014could provide the best of both worlds. This way, investors can position themselves to capitalize on Apple's long-term value while safeguarding against extreme volatility.", + "history": "\nRisky Analyst: Let's dive into the arguments presented by the conservative and neutral analysts regarding the investment in Apple (AAPL) and why their caution may overlook significant opportunities.\n\nFirst, the conservative analyst emphasizes the bearish technical indicators, such as the declining moving averages and negative MACD values. While it's true that these indicators suggest a bearish trend, they often reflect short-term market sentiment rather than long-term potential. The reality is that Apple has a history of bouncing back from such dips, and the current price below $170 could be seen as a prime entry point for savvy investors. The market often overreacts to short-term fluctuations, and those who buy during these dips can reap substantial rewards when the stock rebounds.\n\nMoreover, the conservative stance fails to account for the strong services growth that Apple is experiencing. This segment is not only diversifying revenue but also enhancing margins, which is crucial for long-term sustainability. The upcoming holiday season and potential iPhone upgrades could further boost this growth, creating a perfect storm for a price rally. By focusing solely on technical indicators, the conservative analyst risks missing out on the broader narrative of Apple's evolving business model.\n\nNow, addressing the neutral analyst's concerns about geopolitical tensions and macroeconomic factors, it's essential to recognize that while these elements can create volatility, they also present unique buying opportunities. The current geopolitical climate may be causing short-term panic, but historically, companies like Apple have shown resilience in the face of such challenges. The stock market often overreacts to geopolitical events, and those who invest during these periods can benefit from significant upside when stability returns.\n\nAdditionally, the neutral analyst points to the mixed sentiments surrounding Apple's innovation, particularly after the recent WWDC. However, it's crucial to remember that innovation is not a linear process. Apple has a robust pipeline of products and services that could surprise the market. The lack of immediate groundbreaking announcements does not negate the company's potential for future growth. In fact, the anticipation of new products can create a buzz that drives stock prices higher.\n\nFurthermore, the analyst's mention of legal challenges and tariff threats is valid, but these risks are often priced into the stock. Apple's substantial cash reserves provide a buffer against such uncertainties, allowing the company to navigate challenges while continuing to invest in innovation and shareholder returns. This financial strength is a competitive advantage that should not be overlooked.\n\nIn conclusion, while the conservative and neutral analysts present valid points, their caution may lead them to miss the significant upside potential that comes with investing in Apple at this juncture. The combination of strong fundamentals, a solid financial position, and an attractive entry point outweighs the perceived risks. By adopting a high-reward, high-risk strategy, investors can position themselves to capitalize on Apple's growth trajectory and market resilience. The recommendation to buy AAPL is not just about the current market conditions; it's about recognizing the long-term value and potential that this iconic company holds.\nSafe Analyst: I appreciate the enthusiasm for Apple\u2019s potential, but I must emphasize that the optimism surrounding this investment overlooks several critical risks that could jeopardize our firm\u2019s assets. \n\nFirst, while it\u2019s true that Apple has historically bounced back from dips, we must consider the current market environment. The bearish technical indicators, including declining moving averages and negative MACD values, are not just short-term fluctuations; they reflect a broader sentiment that could persist. The significant gap between the 50-day and 200-day moving averages indicates a sustained bearish trend, which suggests that we could see further declines before any potential recovery. Relying on past performance in a different market context can be misleading and risky.\n\nRegarding the strong services growth, while it is indeed a positive aspect of Apple\u2019s business model, we cannot ignore the potential for saturation in key markets. The anticipated iPhone upgrades and holiday season sales may not yield the expected results, especially if consumer demand softens due to economic pressures or geopolitical tensions. The current geopolitical instability, particularly in the Middle East, is causing market volatility that could impact consumer spending and investor sentiment. This is not just a temporary panic; it\u2019s a significant factor that could lead to a prolonged downturn.\n\nYou mentioned that the market often overreacts to geopolitical events, but this time, the implications are serious. The rise in oil prices and the weakening U.S. dollar could lead to increased costs for Apple, affecting margins and profitability. These macroeconomic factors are not just noise; they can have real consequences on the bottom line, and we must factor them into our investment strategy.\n\nAs for the innovation pipeline, while Apple has a history of strong product launches, the recent WWDC did not meet market expectations. The lack of groundbreaking announcements raises concerns about Apple\u2019s competitive edge in a rapidly evolving tech landscape. If competitors continue to innovate while Apple lags, we could see a decline in market share, which would directly impact stock performance.\n\nLastly, the legal challenges and tariff threats are not just risks that are priced into the stock; they are real threats that could lead to significant financial repercussions. Ongoing investigations into potential fraud claims could damage investor confidence and lead to further stock price declines. The proposed tariffs could also increase costs for Apple, impacting pricing strategies and potentially leading to reduced sales.\n\nIn conclusion, while the arguments for buying AAPL are compelling on the surface, they fail to adequately address the substantial risks involved. A conservative approach prioritizes stability and risk mitigation, ensuring that we protect our assets in an uncertain market. Instead of chasing potential short-term gains, we should focus on preserving capital and seeking safer investment opportunities that align with our long-term growth objectives.\nNeutral Analyst: Let's take a closer look at the arguments presented by both the Risky and Safe Analysts regarding the investment in Apple (AAPL) and see where each perspective might be missing the mark.\n\nStarting with the Risky Analyst, while it's true that Apple has a history of bouncing back from dips, this time the market context is different. The bearish technical indicators, such as the declining moving averages and negative MACD values, are not just short-term fluctuations; they reflect a broader sentiment that could persist. The significant gap between the 50-day and 200-day moving averages suggests that we might see further declines before any potential recovery. Relying solely on past performance can be misleading, especially in a volatile market environment where external factors, like geopolitical tensions and economic shifts, are at play.\n\nThe Risky Analyst also emphasizes the strong growth in Apple's services segment as a reason to buy. While this is indeed a positive aspect, we must consider the potential for market saturation. If consumer demand softens due to economic pressures or geopolitical instability, the anticipated growth may not materialize as expected. The upcoming holiday season and iPhone upgrades could be impacted by these factors, which the Risky Analyst seems to downplay.\n\nNow, turning to the Safe Analyst, their caution regarding the geopolitical tensions and macroeconomic factors is well-founded. The current instability, particularly in the Middle East, is causing market volatility that could significantly impact consumer spending and investor sentiment. The Safe Analyst rightly points out that these are not just temporary concerns; they could lead to a prolonged downturn. However, while they advocate for a conservative approach, they may be overlooking the potential for unique buying opportunities that arise during periods of market panic. Historically, companies like Apple have shown resilience in the face of such challenges, and investing during these times can yield significant long-term rewards.\n\nThe Safe Analyst also raises valid concerns about Apple's innovation pipeline, particularly following the recent WWDC. While the lack of groundbreaking announcements may raise eyebrows, it's important to recognize that innovation is not always linear. Apple has a robust pipeline of products and services that could surprise the market in the future. The anticipation of new products can create a buzz that drives stock prices higher, even if immediate results are not evident.\n\nBoth analysts highlight the legal challenges and tariff threats facing Apple, which are indeed significant risks. However, the Safe Analyst's assertion that these risks are not priced into the stock may not fully account for Apple's substantial cash reserves. This financial strength provides a buffer against uncertainties, allowing the company to navigate challenges while continuing to invest in innovation and shareholder returns.\n\nIn conclusion, a balanced approach might be the most prudent strategy here. While the Risky Analyst's enthusiasm for Apple's potential is commendable, it overlooks the substantial risks present in the current market environment. Conversely, the Safe Analyst's caution is warranted, but it may lead to missed opportunities for growth. A moderate strategy that incorporates both growth potential and risk management\u2014such as scaling into the position, maintaining a diversified portfolio, and implementing stop-loss measures\u2014could provide the best of both worlds. This way, investors can position themselves to capitalize on Apple's long-term value while safeguarding against extreme volatility.", + "judge_decision": "Recommendation: BUY Apple (AAPL) with a 12\u201318-month horizon.\n\n1. Summary of Key Arguments \n Bull Case (Risky Analyst) \n \u2022 \u201cMarket often overreacts to short-term fluctuations,\u201d and Apple below $170 offers a \u201cprime entry point.\u201d \n \u2022 Services revenue grew >20%, high margins, recurring revenue\u2014and holiday iPhone upgrades should accelerate it. \n \u2022 $200 billion+ cash hoard funds R&D, buybacks, buffers downturns. \n \u2022 Ecosystem lock-in makes defections rare, and long-term targets of $253\u2013$275 imply 50%+ upside. \n\n Bear Case (Safe/Conservative Analyst) \n \u2022 \u201cBearish technical indicators\u2026reflect a broader sentiment that could persist\u201d: 50-day under 200-day SMA, negative MACD. \n \u2022 Macro headwinds (geopolitical volatility, rising oil, weaker dollar) may compress margins and dampen consumer demand. \n \u2022 Innovation questions after underwhelming WWDC, smartphone market saturation. \n \u2022 Real legal and tariff risks could impose costs beyond what\u2019s priced in. \n\n Neutral Case (Neutral Analyst) \n \u2022 Validity in both camps: fundamentals strong but market context different\u2014technicals may signal further near-term weakness. \n \u2022 Services growth is a plus but could slow if consumer spending falls. \n \u2022 Apple\u2019s cash reserves provide a buffer, but risk-management\u2014scaling in, stop-losses, position limits\u2014is prudent. \n\n2. Rationale for Buy \n \u2022 Fundamentals translate into real free-cash-flow and pricing power. Even the safest analyst admits Apple\u2019s \u201cfinancial strength provides a buffer against uncertainties.\u201d \n \u2022 \u201cMacroeconomic factors are real,\u201d but much of the downside is already reflected in a sub-$170 stock. Waiting for a perfect bottom risks missing a relief rally. \n \u2022 History shows Apple \u201cweathers one-off storms and comes out stronger.\u201d Technicals are beaten down enough now that when headline risks calm, a snap-back is likely. \n \u2022 Neutral\u2019s call for moderation aligns with disciplined risk controls\u2014scale in and use stops\u2014rather than pure sit-and-hope.\n\n3. Refined Trader Plan \n a. Scale in over four tranches: \n \u2013 Tranche 1: today (\u224830% of target). \n \u2013 Tranche 2: on any 3\u20135% pullback. \n \u2013 Tranche 3: if RSI dips below 30. \n \u2013 Tranche 4: at a retest of the 200-day SMA. \n b. Position size: cap at 5\u20137% of total equity to ensure diversification. \n c. Risk controls: \n \u2013 10% trailing stop from average entry. \n \u2013 Hard exit/re-evaluate if 50-day SMA trades more than 2% below the 200-day SMA. \n d. Monitoring triggers: \n \u2013 Services growth: target >18% QoQ. \n \u2013 Gross margin: watch for >200 bps compression. \n \u2013 If services decelerates under 15% for two consecutive quarters, pause new buys. \n e. Hedging: sell out-of-the-money December covered calls at $185\u2013$190 if average cost \u2248$170.\n\n4. Lessons from Past Mistakes \n \u2013 Previously, waiting for a \u201ccomplete bottom\u201d caused missed rallies. This plan enforces disciplined, phased entries rather than all-or-nothing timing. \n \u2013 By blending the Bull\u2019s conviction with the Safe/Neutral calls for technical stops and caps, we protect against unexpected drawdowns without sacrificing upside.\n\nIn sum, Apple\u2019s strong services engine, cash cushion, ecosystem lock-in and bargain valuation outweigh the real but largely priced-in risks. Acting now with calibrated entries and hard stops lets us capture the next leg up while managing downside." + }, + "investment_plan": "Here\u2019s how I see it after weighing both sides and learning from past calls where I let short-term noise derail solid ideas: Apple still deserves a Buy. \n\nFirst, the nutshell on each camp\u2019s best arguments:\n\nBull case\u2019s strongest points \n\u2022 Services engine: >20% growth, high margins, recurring revenue. \n\u2022 Huge cash hoard: $200 billion+ to fund R&D, buy back stock, buffer downturns. \n\u2022 Undervalued vs. long-term targets of $253\u2013$275; 16% YTD drop looks like a buying opportunity. \n\u2022 Brand lock-in and ecosystem make defections rare, and iPhone 17 still has upgrade potential. \n\nBear case\u2019s strongest points \n\u2022 Macro headwinds: war-driven volatility, weaker dollar, potential tariffs could squeeze costs. \n\u2022 Innovation questions: WWDC underwhelmed, smartphone market saturation, risk of faltering iPhone demand. \n\u2022 Technicals are negative (50-day under 200-day SMA, negative MACD, RSI not yet oversold). \n\nWhy I\u2019m siding with the Bull: Apple\u2019s fundamentals aren\u2019t just paper strength\u2014they translate into real fre e-cash-flow and pricing power. History shows it weathers one-off storms and comes out stronger. The macro risks are real, but they\u2019re already priced into a sub-$170 stock. If you wait for the \u201cperfect\u201d moment, you\u2019ll miss half the rally. \n\nHere\u2019s the actionable plan:\n\n1. Recommendation: Buy Apple (AAPL) with a 12- to 18-month horizon. \n2. Rationale: \n \u2013 The services margin engine vaulted revenue 20%+ last quarter and will accelerate once holiday iPhone upgrades kick in. \n \u2013 Cash cushion gives Apple optionality on AI, AR/VR, health wearables\u2014and the balance sheet means buybacks can continue to support the stock. \n \u2013 Technicals look beaten-down enough now that a relief rally is likely when headline risks calm. \n\n3. Strategic Actions: \n a. Scale in over three tranches\u2014today, then on any 3\u20135% pullback, then again if it retests the 200-day moving average. \n b. Size position to no more than 7% of your total equity exposure to keep risk manageable. \n c. Use a 10% trailing stop from your average entry to lock in gains if the market turns sour again. \n d. Monitor quarterly services growth (target >18%) and gross margins. If services growth decelerates under 15% or margins compress by >200 bps, revisit. \n e. Hedge gently by selling out-of-the-money December covered calls at about $185 if you get assigned cost basis around $170. \n\n4. Learning from past mistakes: I\u2019ve been too patient waiting for a \u201ccomplete bottom\u201d and missed sharp rebounds. This time I\u2019m committing to a disciplined build-up at these levels, rather than sitting on the sidelines hoping for a technical retest that may never come. \n\nIn short: Buy now, average in methodically, keep an eye on margin and services trends, and employ basic risk controls. That way you capture Apple\u2019s next leg up without gasping for air if the market hiccups again.", + "final_trade_decision": "Recommendation: BUY Apple (AAPL) with a 12\u201318-month horizon.\n\n1. Summary of Key Arguments \n Bull Case (Risky Analyst) \n \u2022 \u201cMarket often overreacts to short-term fluctuations,\u201d and Apple below $170 offers a \u201cprime entry point.\u201d \n \u2022 Services revenue grew >20%, high margins, recurring revenue\u2014and holiday iPhone upgrades should accelerate it. \n \u2022 $200 billion+ cash hoard funds R&D, buybacks, buffers downturns. \n \u2022 Ecosystem lock-in makes defections rare, and long-term targets of $253\u2013$275 imply 50%+ upside. \n\n Bear Case (Safe/Conservative Analyst) \n \u2022 \u201cBearish technical indicators\u2026reflect a broader sentiment that could persist\u201d: 50-day under 200-day SMA, negative MACD. \n \u2022 Macro headwinds (geopolitical volatility, rising oil, weaker dollar) may compress margins and dampen consumer demand. \n \u2022 Innovation questions after underwhelming WWDC, smartphone market saturation. \n \u2022 Real legal and tariff risks could impose costs beyond what\u2019s priced in. \n\n Neutral Case (Neutral Analyst) \n \u2022 Validity in both camps: fundamentals strong but market context different\u2014technicals may signal further near-term weakness. \n \u2022 Services growth is a plus but could slow if consumer spending falls. \n \u2022 Apple\u2019s cash reserves provide a buffer, but risk-management\u2014scaling in, stop-losses, position limits\u2014is prudent. \n\n2. Rationale for Buy \n \u2022 Fundamentals translate into real free-cash-flow and pricing power. Even the safest analyst admits Apple\u2019s \u201cfinancial strength provides a buffer against uncertainties.\u201d \n \u2022 \u201cMacroeconomic factors are real,\u201d but much of the downside is already reflected in a sub-$170 stock. Waiting for a perfect bottom risks missing a relief rally. \n \u2022 History shows Apple \u201cweathers one-off storms and comes out stronger.\u201d Technicals are beaten down enough now that when headline risks calm, a snap-back is likely. \n \u2022 Neutral\u2019s call for moderation aligns with disciplined risk controls\u2014scale in and use stops\u2014rather than pure sit-and-hope.\n\n3. Refined Trader Plan \n a. Scale in over four tranches: \n \u2013 Tranche 1: today (\u224830% of target). \n \u2013 Tranche 2: on any 3\u20135% pullback. \n \u2013 Tranche 3: if RSI dips below 30. \n \u2013 Tranche 4: at a retest of the 200-day SMA. \n b. Position size: cap at 5\u20137% of total equity to ensure diversification. \n c. Risk controls: \n \u2013 10% trailing stop from average entry. \n \u2013 Hard exit/re-evaluate if 50-day SMA trades more than 2% below the 200-day SMA. \n d. Monitoring triggers: \n \u2013 Services growth: target >18% QoQ. \n \u2013 Gross margin: watch for >200 bps compression. \n \u2013 If services decelerates under 15% for two consecutive quarters, pause new buys. \n e. Hedging: sell out-of-the-money December covered calls at $185\u2013$190 if average cost \u2248$170.\n\n4. Lessons from Past Mistakes \n \u2013 Previously, waiting for a \u201ccomplete bottom\u201d caused missed rallies. This plan enforces disciplined, phased entries rather than all-or-nothing timing. \n \u2013 By blending the Bull\u2019s conviction with the Safe/Neutral calls for technical stops and caps, we protect against unexpected drawdowns without sacrificing upside.\n\nIn sum, Apple\u2019s strong services engine, cash cushion, ecosystem lock-in and bargain valuation outweigh the real but largely priced-in risks. Acting now with calibrated entries and hard stops lets us capture the next leg up while managing downside." + } +} \ No newline at end of file diff --git a/web/backend/reset_and_run.sh b/web/backend/reset_and_run.sh index 36023437..09128036 100644 --- a/web/backend/reset_and_run.sh +++ b/web/backend/reset_and_run.sh @@ -1,32 +1,32 @@ -#!/bin/bash +# #!/bin/bash -echo "๐Ÿš€ Django ์„œ๋ฒ„ ์‹œ์ž‘ - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ดˆ๊ธฐํ™”" +# echo "๐Ÿš€ Django ์„œ๋ฒ„ ์‹œ์ž‘ - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ดˆ๊ธฐํ™”" -# Django ์„ค์ • ๋ชจ๋“ˆ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ • -export DJANGO_SETTINGS_MODULE=tradingagents_web.settings +# # Django ์„ค์ • ๋ชจ๋“ˆ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ • +# export DJANGO_SETTINGS_MODULE=tradingagents_web.settings -# 1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ดˆ๊ธฐํ™” -echo "๐Ÿ”„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ดˆ๊ธฐํ™” ์ค‘..." -docker exec -i tradingagents_mysql mysql -u root -ppassword -e " -DROP DATABASE IF EXISTS tradingagents_db; -CREATE DATABASE tradingagents_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -" +# # 1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ดˆ๊ธฐํ™” +# echo "๐Ÿ”„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ดˆ๊ธฐํ™” ์ค‘..." +# docker exec -i tradingagents_mysql mysql -u root -ppassword -e " +# DROP DATABASE IF EXISTS tradingagents_db; +# CREATE DATABASE tradingagents_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +# " -# 2. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ -echo "๐Ÿ”„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ค‘..." -python manage.py makemigrations authentication -python manage.py makemigrations -python manage.py migrate +# # 2. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ +# echo "๐Ÿ”„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ค‘..." +# python manage.py makemigrations authentication +# python manage.py makemigrations +# python manage.py migrate -# 3. ๊ด€๋ฆฌ์ž ๊ณ„์ • ์ƒ์„ฑ -echo "๐Ÿ”„ ๊ด€๋ฆฌ์ž ๊ณ„์ • ์ƒ์„ฑ ์ค‘..." -python manage.py shell -c " -from django.contrib.auth import get_user_model; -User = get_user_model(); -if not User.objects.filter(email='admin@example.com').exists(): - User.objects.create_superuser('admin@example.com', 'admin', 'admin123!'); - print('โœ… ๊ด€๋ฆฌ์ž: admin@example.com / admin123!'); -" +# # 3. ๊ด€๋ฆฌ์ž ๊ณ„์ • ์ƒ์„ฑ +# echo "๐Ÿ”„ ๊ด€๋ฆฌ์ž ๊ณ„์ • ์ƒ์„ฑ ์ค‘..." +# python manage.py shell -c " +# from django.contrib.auth import get_user_model; +# User = get_user_model(); +# if not User.objects.filter(email='admin@example.com').exists(): +# User.objects.create_superuser('admin@example.com', 'admin', 'admin123!'); +# print('โœ… ๊ด€๋ฆฌ์ž: admin@example.com / admin123!'); +# " # 4. ์„œ๋ฒ„ ์‹œ์ž‘ (ํ™˜๊ฒฝ ๋ณ€์ˆ˜์™€ ํ•จ๊ป˜) echo "๐ŸŽ‰ ์„œ๋ฒ„ ์‹œ์ž‘!" diff --git a/web/frontend/src/contexts/WebSocketContext.js b/web/frontend/src/contexts/WebSocketContext.js index f392bec7..9f0e069d 100644 --- a/web/frontend/src/contexts/WebSocketContext.js +++ b/web/frontend/src/contexts/WebSocketContext.js @@ -136,9 +136,10 @@ export const WebSocketProvider = ({ children }) => { ...prev, [data.session_id]: { ...prev[data.session_id], + status: 'running', message: data.content, agent: data.agent, - progress: prev[data.session_id]?.progress + 10 || 10 + progress: data.progress, } })); @@ -160,7 +161,7 @@ export const WebSocketProvider = ({ children }) => { status: 'completed', message: data.message, progress: 100, - result: data.result + result: data.result, } })); message.success(data.message); diff --git a/web/frontend/src/pages/Analysis/Analysis.js b/web/frontend/src/pages/Analysis/Analysis.js index e49cd6bb..382a4b7b 100644 --- a/web/frontend/src/pages/Analysis/Analysis.js +++ b/web/frontend/src/pages/Analysis/Analysis.js @@ -1,7 +1,7 @@ // web/frontend/src/pages/Analysis/Analysis.js import React, { useState, useEffect } from 'react'; -import { Card, Divider, Spin, Alert, Typography } from 'antd'; +import { Card, Divider, Spin, Alert, Typography, message } from 'antd'; import styled from 'styled-components'; import api from '../../services/api'; import { useWebSocket } from '../../contexts/WebSocketContext'; @@ -54,7 +54,7 @@ const Analysis = () => { if(currentSessionId) clearAnalysisProgress(currentSessionId); try { - const response = await api.post('/api/trading/start-analysis/', values); + const response = await api.post('/api/trading/start/', values); const { session_id } = response.data; setCurrentSessionId(session_id); @@ -78,6 +78,20 @@ const Analysis = () => { clearMessages(); }; + // ๋ถ„์„ ์ทจ์†Œ ํ•ธ๋“ค๋Ÿฌ + const handleCancelAnalysis = async () => { + if (!currentSessionId) return; + + try { + await api.post(`/api/trading/cancel/${currentSessionId}/`); + message.success('๋ถ„์„์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.'); + handleNewAnalysis(); // ์ƒํƒœ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ํผ์œผ๋กœ ๋Œ์•„๊ฐ + } catch (err) { + const errorMessage = err.response?.data?.error || '๋ถ„์„ ์ทจ์†Œ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.'; + setError(errorMessage); + } + }; + const renderContent = () => { if (analysisStatus === 'starting') { return
; @@ -92,6 +106,7 @@ const Analysis = () => { messages={messages.filter(m => m.sessionId === currentSessionId)} finalReport={finalReport} onNewAnalysis={handleNewAnalysis} + onCancelAnalysis={handleCancelAnalysis} /> ); } diff --git a/web/frontend/src/pages/Analysis/components/AnalysisForm.js b/web/frontend/src/pages/Analysis/components/AnalysisForm.js index f75ac69e..cd2b6fd6 100644 --- a/web/frontend/src/pages/Analysis/components/AnalysisForm.js +++ b/web/frontend/src/pages/Analysis/components/AnalysisForm.js @@ -1,3 +1,5 @@ +// web/frontend/src/pages/Analysis/components/AnalysisForm.js + import React from 'react'; import { Form, Input, Button, Card, Select, Slider, Checkbox, Row, Col, Typography } from 'antd'; import { FundOutlined, SendOutlined } from '@ant-design/icons'; @@ -18,6 +20,24 @@ const analystsOptions = [ { label: '์žฌ๋ฌด ๋ถ„์„๊ฐ€ (Fundamentals)', value: 'fundamentals' }, ]; +const shallowThinkerOptions = [ + { value: 'gpt-4o-mini', label: 'GPT-4o-mini - ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ธ ๋ชจ๋ธ' }, + { value: 'gpt-4.1-nano', label: 'GPT-4.1-nano - ์ดˆ๊ฒฝ๋Ÿ‰ ๋ชจ๋ธ' }, + { value: 'gpt-4.1-mini', label: 'GPT-4.1-mini - ์ค€์ˆ˜ํ•œ ์„ฑ๋Šฅ์˜ ์ปดํŒฉํŠธ ๋ชจ๋ธ' }, + { value: 'gpt-4o', label: 'GPT-4o - ํ‘œ์ค€ ๋ชจ๋ธ' }, +]; + +const deepThinkerOptions = [ + { value: 'gpt-4.1-nano', label: 'GPT-4.1-nano - ์ดˆ๊ฒฝ๋Ÿ‰ ๋ชจ๋ธ' }, + { value: 'gpt-4.1-mini', label: 'GPT-4.1-mini - ์ค€์ˆ˜ํ•œ ์„ฑ๋Šฅ์˜ ์ปดํŒฉํŠธ ๋ชจ๋ธ' }, + { value: 'gpt-4o', label: 'GPT-4o - ํ‘œ์ค€ ๋ชจ๋ธ' }, + { value: 'o4-mini', label: 'o4-mini - ํŠนํ™”๋œ ์†Œํ˜• ์ถ”๋ก  ๋ชจ๋ธ' }, + { value: 'o3-mini', label: 'o3-mini - ๊ฒฝ๋Ÿ‰ ๊ณ ๊ธ‰ ์ถ”๋ก  ๋ชจ๋ธ' }, + { value: 'o3', label: 'o3 - ์ „์ฒด ๊ณ ๊ธ‰ ์ถ”๋ก  ๋ชจ๋ธ' }, + { value: 'o1', label: 'o1 - ์ตœ์ƒ์œ„ ์ถ”๋ก  ๋ฐ ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ชจ๋ธ' }, +]; + + const AnalysisForm = ({ onStartAnalysis, loading }) => { const [form] = Form.useForm(); @@ -83,17 +103,22 @@ const AnalysisForm = ({ onStartAnalysis, loading }) => {
@@ -116,4 +141,4 @@ const AnalysisForm = ({ onStartAnalysis, loading }) => { ); }; -export default AnalysisForm; \ No newline at end of file +export default AnalysisForm; \ No newline at end of file From fa08b2c176b7e0dface0b78538551602483219f4 Mon Sep 17 00:00:00 2001 From: kimheesu Date: Fri, 13 Jun 2025 16:41:31 +0900 Subject: [PATCH 12/14] [add] Speak in Korean prompt --- .../agents/analysts/market_analyst.py | 2 +- tradingagents/agents/analysts/news_analyst.py | 2 +- .../agents/managers/research_manager.py | 4 +- tradingagents/agents/managers/risk_manager.py | 2 +- .../agents/researchers/bear_researcher.py | 2 +- .../agents/researchers/bull_researcher.py | 2 +- .../agents/risk_mgmt/aggresive_debator.py | 2 +- .../agents/risk_mgmt/conservative_debator.py | 2 +- .../agents/risk_mgmt/neutral_debator.py | 2 +- tradingagents/agents/trader/trader.py | 2 +- tradingagents/agents/utils/memory.py | 2 +- .../APP-YFin-data-2010-06-13-2025-06-13.csv | 1047 ++++ tradingagents/dataflows/googlenews_utils.py | 12 +- tradingagents/graph/setup.py | 6 +- .../full_states_log.json | 27 + web/frontend/package-lock.json | 4652 ++++++++++++++++- web/frontend/package.json | 21 +- web/frontend/src/pages/Analysis/Analysis.js | 17 +- .../Analysis/components/ReportDisplay.js | 82 + web/frontend/src/pages/Dashboard/Dashboard.js | 2 +- 20 files changed, 5842 insertions(+), 48 deletions(-) create mode 100644 tradingagents/dataflows/data_cache/APP-YFin-data-2010-06-13-2025-06-13.csv create mode 100644 web/backend/eval_results/APP/TradingAgentsStrategy_logs/full_states_log.json create mode 100644 web/frontend/src/pages/Analysis/components/ReportDisplay.js diff --git a/tradingagents/agents/analysts/market_analyst.py b/tradingagents/agents/analysts/market_analyst.py index 378f8046..42b989f0 100644 --- a/tradingagents/agents/analysts/market_analyst.py +++ b/tradingagents/agents/analysts/market_analyst.py @@ -47,7 +47,7 @@ Volume-Based Indicators: - vwma: VWMA: A moving average weighted by volume. Usage: Confirm trends by integrating price action with volume data. Tips: Watch for skewed results from volume spikes; use in combination with other volume analyses. - Select indicators that provide diverse and complementary information. Avoid redundancy (e.g., do not select both rsi and stochrsi). Also briefly explain why they are suitable for the given market context. When you tool call, please use the exact name of the indicators provided above as they are defined parameters, otherwise your call will fail. Please make sure to call get_YFin_data first to retrieve the CSV that is needed to generate indicators. Write a very detailed and nuanced report of the trends you observe. Do not simply state the trends are mixed, provide detailed and finegrained analysis and insights that may help traders make decisions.""" - + """ Make sure to append a Markdown table at the end of the report to organize key points in the report, organized and easy to read.""" + + """ Make sure to append a Markdown table at the end of the report to organize key points in the report, organized and easy to read. Please write all responses in Korean.""" ) prompt = ChatPromptTemplate.from_messages( diff --git a/tradingagents/agents/analysts/news_analyst.py b/tradingagents/agents/analysts/news_analyst.py index 08f217b0..2f6946a2 100644 --- a/tradingagents/agents/analysts/news_analyst.py +++ b/tradingagents/agents/analysts/news_analyst.py @@ -19,7 +19,7 @@ def create_news_analyst(llm, toolkit): system_message = ( "You are a news researcher tasked with analyzing recent news and trends over the past week. Please write a comprehensive report of the current state of the world that is relevant for trading and macroeconomics. Look at news from EODHD, and finnhub to be comprehensive. Do not simply state the trends are mixed, provide detailed and finegrained analysis and insights that may help traders make decisions." - + """ Make sure to append a Makrdown table at the end of the report to organize key points in the report, organized and easy to read.""" + + """ Make sure to append a Makrdown table at the end of the report to organize key points in the report, organized and easy to read. Please write all responses in Korean.""" ) prompt = ChatPromptTemplate.from_messages( diff --git a/tradingagents/agents/managers/research_manager.py b/tradingagents/agents/managers/research_manager.py index 029a83b5..50ebea35 100644 --- a/tradingagents/agents/managers/research_manager.py +++ b/tradingagents/agents/managers/research_manager.py @@ -35,7 +35,9 @@ Here are your past reflections on mistakes: Here is the debate: Debate History: -{history}""" +{history} + +Please write all responses in Korean.""" response = llm.invoke(prompt) new_investment_debate_state = { diff --git a/tradingagents/agents/managers/risk_manager.py b/tradingagents/agents/managers/risk_manager.py index 1288cb76..cc4c162e 100644 --- a/tradingagents/agents/managers/risk_manager.py +++ b/tradingagents/agents/managers/risk_manager.py @@ -41,7 +41,7 @@ Deliverables: --- -Focus on actionable insights and continuous improvement. Build on past lessons, critically evaluate all perspectives, and ensure each decision advances better outcomes.""" +Focus on actionable insights and continuous improvement. Build on past lessons, critically evaluate all perspectives, and ensure each decision advances better outcomes. Please write all responses in Korean.""" response = llm.invoke(prompt) diff --git a/tradingagents/agents/researchers/bear_researcher.py b/tradingagents/agents/researchers/bear_researcher.py index 47c28f66..186b9d55 100644 --- a/tradingagents/agents/researchers/bear_researcher.py +++ b/tradingagents/agents/researchers/bear_researcher.py @@ -41,7 +41,7 @@ Company fundamentals report: {fundamentals_report} Conversation history of the debate: {history} Last bull argument: {current_response} Reflections from similar situations and lessons learned: {past_memory_str} -Use this information to deliver a compelling bear argument, refute the bull's claims, and engage in a dynamic debate that demonstrates the risks and weaknesses of investing in the stock. You must also address reflections and learn from lessons and mistakes you made in the past. +Use this information to deliver a compelling bear argument, refute the bull's claims, and engage in a dynamic debate that demonstrates the risks and weaknesses of investing in the stock. You must also address reflections and learn from lessons and mistakes you made in the past. Please write all responses in Korean. """ response = llm.invoke(prompt) diff --git a/tradingagents/agents/researchers/bull_researcher.py b/tradingagents/agents/researchers/bull_researcher.py index 3be2e4a1..ece204a2 100644 --- a/tradingagents/agents/researchers/bull_researcher.py +++ b/tradingagents/agents/researchers/bull_researcher.py @@ -39,7 +39,7 @@ Company fundamentals report: {fundamentals_report} Conversation history of the debate: {history} Last bear argument: {current_response} Reflections from similar situations and lessons learned: {past_memory_str} -Use this information to deliver a compelling bull argument, refute the bear's concerns, and engage in a dynamic debate that demonstrates the strengths of the bull position. You must also address reflections and learn from lessons and mistakes you made in the past. +Use this information to deliver a compelling bull argument, refute the bear's concerns, and engage in a dynamic debate that demonstrates the strengths of the bull position. You must also address reflections and learn from lessons and mistakes you made in the past. Please write all responses in Korean. """ response = llm.invoke(prompt) diff --git a/tradingagents/agents/risk_mgmt/aggresive_debator.py b/tradingagents/agents/risk_mgmt/aggresive_debator.py index d9aa34cb..10b9beac 100644 --- a/tradingagents/agents/risk_mgmt/aggresive_debator.py +++ b/tradingagents/agents/risk_mgmt/aggresive_debator.py @@ -30,7 +30,7 @@ Latest World Affairs Report: {news_report} Company Fundamentals Report: {fundamentals_report} Here is the current conversation history: {history} Here are the last arguments from the conservative analyst: {current_safe_response} Here are the last arguments from the neutral analyst: {current_neutral_response}. If there are no responses from the other viewpoints, do not halluncinate and just present your point. -Engage actively by addressing any specific concerns raised, refuting the weaknesses in their logic, and asserting the benefits of risk-taking to outpace market norms. Maintain a focus on debating and persuading, not just presenting data. Challenge each counterpoint to underscore why a high-risk approach is optimal. Output conversationally as if you are speaking without any special formatting.""" +Engage actively by addressing any specific concerns raised, refuting the weaknesses in their logic, and asserting the benefits of risk-taking to outpace market norms. Maintain a focus on debating and persuading, not just presenting data. Challenge each counterpoint to underscore why a high-risk approach is optimal. Output conversationally as if you are speaking without any special formatting. Please write all responses in Korean.""" response = llm.invoke(prompt) diff --git a/tradingagents/agents/risk_mgmt/conservative_debator.py b/tradingagents/agents/risk_mgmt/conservative_debator.py index 0627a55a..053722ac 100644 --- a/tradingagents/agents/risk_mgmt/conservative_debator.py +++ b/tradingagents/agents/risk_mgmt/conservative_debator.py @@ -31,7 +31,7 @@ Latest World Affairs Report: {news_report} Company Fundamentals Report: {fundamentals_report} Here is the current conversation history: {history} Here is the last response from the risky analyst: {current_risky_response} Here is the last response from the neutral analyst: {current_neutral_response}. If there are no responses from the other viewpoints, do not halluncinate and just present your point. -Engage by questioning their optimism and emphasizing the potential downsides they may have overlooked. Address each of their counterpoints to showcase why a conservative stance is ultimately the safest path for the firm's assets. Focus on debating and critiquing their arguments to demonstrate the strength of a low-risk strategy over their approaches. Output conversationally as if you are speaking without any special formatting.""" +Engage by questioning their optimism and emphasizing the potential downsides they may have overlooked. Address each of their counterpoints to showcase why a conservative stance is ultimately the safest path for the firm's assets. Focus on debating and critiquing their arguments to demonstrate the strength of a low-risk strategy over their approaches. Output conversationally as if you are speaking without any special formatting. Please write all responses in Korean.""" response = llm.invoke(prompt) diff --git a/tradingagents/agents/risk_mgmt/neutral_debator.py b/tradingagents/agents/risk_mgmt/neutral_debator.py index aacf297b..c77f9519 100644 --- a/tradingagents/agents/risk_mgmt/neutral_debator.py +++ b/tradingagents/agents/risk_mgmt/neutral_debator.py @@ -30,7 +30,7 @@ Latest World Affairs Report: {news_report} Company Fundamentals Report: {fundamentals_report} Here is the current conversation history: {history} Here is the last response from the risky analyst: {current_risky_response} Here is the last response from the safe analyst: {current_safe_response}. If there are no responses from the other viewpoints, do not halluncinate and just present your point. -Engage actively by analyzing both sides critically, addressing weaknesses in the risky and conservative arguments to advocate for a more balanced approach. Challenge each of their points to illustrate why a moderate risk strategy might offer the best of both worlds, providing growth potential while safeguarding against extreme volatility. Focus on debating rather than simply presenting data, aiming to show that a balanced view can lead to the most reliable outcomes. Output conversationally as if you are speaking without any special formatting.""" +Engage actively by analyzing both sides critically, addressing weaknesses in the risky and conservative arguments to advocate for a more balanced approach. Challenge each of their points to illustrate why a moderate risk strategy might offer the best of both worlds, providing growth potential while safeguarding against extreme volatility. Focus on debating rather than simply presenting data, aiming to show that a balanced view can lead to the most reliable outcomes. Output conversationally as if you are speaking without any special formatting. Please write all responses in Korean.""" response = llm.invoke(prompt) diff --git a/tradingagents/agents/trader/trader.py b/tradingagents/agents/trader/trader.py index 0c645751..ad64919f 100644 --- a/tradingagents/agents/trader/trader.py +++ b/tradingagents/agents/trader/trader.py @@ -27,7 +27,7 @@ def create_trader(llm, memory): messages = [ { "role": "system", - "content": f"""You are a trading agent analyzing market data to make investment decisions. Based on your analysis, provide a specific recommendation to buy, sell, or hold. End with a firm decision and always conclude your response with 'FINAL TRANSACTION PROPOSAL: **BUY/HOLD/SELL**' to confirm your recommendation. Do not forget to utilize lessons from past decisions to learn from your mistakes. Here is some reflections from similar situatiosn you traded in and the lessons learned: {past_memory_str}""", + "content": f"""You are a trading agent analyzing market data to make investment decisions. Based on your analysis, provide a specific recommendation to buy, sell, or hold. End with a firm decision and always conclude your response with 'FINAL TRANSACTION PROPOSAL: **BUY/HOLD/SELL**' to confirm your recommendation. Do not forget to utilize lessons from past decisions to learn from your mistakes. Here is some reflections from similar situatiosn you traded in and the lessons learned: {past_memory_str}. Please write all responses in Korean.""", }, context, ] diff --git a/tradingagents/agents/utils/memory.py b/tradingagents/agents/utils/memory.py index 782a1ee2..0e814cf6 100644 --- a/tradingagents/agents/utils/memory.py +++ b/tradingagents/agents/utils/memory.py @@ -10,7 +10,7 @@ class FinancialSituationMemory: # self.client = OpenAI() self.embeddings = OpenAIEmbeddings(model="text-embedding-ada-002", api_key=os.getenv("OPENAI_API_KEY")) self.chroma_client = chromadb.Client(Settings(allow_reset=True)) - self.situation_collection = self.chroma_client.create_collection(name=name) + self.situation_collection = self.chroma_client.get_or_create_collection(name=name) def get_embedding(self, text): """Get OpenAI embedding for a text""" diff --git a/tradingagents/dataflows/data_cache/APP-YFin-data-2010-06-13-2025-06-13.csv b/tradingagents/dataflows/data_cache/APP-YFin-data-2010-06-13-2025-06-13.csv new file mode 100644 index 00000000..fbe05f6d --- /dev/null +++ b/tradingagents/dataflows/data_cache/APP-YFin-data-2010-06-13-2025-06-13.csv @@ -0,0 +1,1047 @@ +Date,Close,High,Low,Open,Volume +2021-04-15,65.19999694824219,71.51000213623047,63.0,70.0,11444400 +2021-04-16,61.0,65.19999694824219,58.650001525878906,65.0,4199300 +2021-04-19,58.86000061035156,61.0,55.70500183105469,60.0,4642500 +2021-04-20,60.150001525878906,61.900001525878906,58.9900016784668,60.040000915527344,3055500 +2021-04-21,61.810001373291016,62.209999084472656,56.5260009765625,60.4900016784668,3607100 +2021-04-22,62.099998474121094,62.95000076293945,60.5099983215332,61.95000076293945,844900 +2021-04-23,58.5,62.939998626708984,58.45000076293945,62.099998474121094,1229600 +2021-04-26,59.79999923706055,59.810001373291016,57.650001525878906,58.77000045776367,796200 +2021-04-27,58.849998474121094,61.11000061035156,58.709999084472656,60.0,630200 +2021-04-28,58.75,60.04199981689453,58.06999969482422,58.41999816894531,309600 +2021-04-29,59.16999816894531,59.82500076293945,58.81999969482422,59.0,292900 +2021-04-30,58.0099983215332,59.560001373291016,57.80500030517578,59.40999984741211,284000 +2021-05-03,60.060001373291016,60.40999984741211,58.529998779296875,58.529998779296875,516100 +2021-05-04,58.54999923706055,60.0,57.81999969482422,59.779998779296875,879100 +2021-05-05,58.18000030517578,59.290000915527344,57.5099983215332,58.77000045776367,645100 +2021-05-06,56.93000030517578,57.97999954223633,54.720001220703125,57.97999954223633,1329400 +2021-05-07,57.2599983215332,57.95000076293945,55.7599983215332,57.72999954223633,552600 +2021-05-10,55.5,59.209999084472656,54.470001220703125,59.209999084472656,1348300 +2021-05-11,53.459999084472656,54.95000076293945,50.75,54.43000030517578,1483400 +2021-05-12,52.25,53.439998626708984,49.65999984741211,52.56999969482422,1351200 +2021-05-13,49.869998931884766,54.88999938964844,49.40999984741211,52.310001373291016,1645400 +2021-05-14,57.2599983215332,57.81999969482422,50.0099983215332,50.2400016784668,1198900 +2021-05-17,62.439998626708984,62.869998931884766,55.82500076293945,56.16999816894531,1033400 +2021-05-18,64.29000091552734,65.88999938964844,61.9109992980957,62.0099983215332,1122100 +2021-05-19,64.61000061035156,65.2699966430664,61.540000915527344,62.459999084472656,603700 +2021-05-20,67.9000015258789,68.55000305175781,66.30000305175781,66.30000305175781,964200 +2021-05-21,68.3499984741211,70.16999816894531,65.87999725341797,69.0,880300 +2021-05-24,70.30999755859375,70.7300033569336,66.5199966430664,68.41999816894531,834000 +2021-05-25,69.94999694824219,72.53099822998047,67.58999633789062,70.01000213623047,1028600 +2021-05-26,68.62000274658203,69.9800033569336,67.54000091552734,69.33999633789062,529400 +2021-05-27,69.68000030517578,71.90799713134766,67.08999633789062,68.87000274658203,1112500 +2021-05-28,74.30999755859375,75.18000030517578,69.0,69.8499984741211,864500 +2021-06-01,68.86000061035156,74.72000122070312,67.66999816894531,74.25,1013900 +2021-06-02,70.08999633789062,72.02999877929688,68.51499938964844,68.86000061035156,499400 +2021-06-03,70.47000122070312,72.0999984741211,69.05999755859375,69.23999786376953,352900 +2021-06-04,74.36000061035156,74.61000061035156,69.98999786376953,69.98999786376953,524500 +2021-06-07,77.25,77.46499633789062,72.22000122070312,74.19999694824219,661900 +2021-06-08,79.47000122070312,80.14900207519531,77.16999816894531,77.16999816894531,941700 +2021-06-09,80.25,81.80000305175781,78.43000030517578,79.4800033569336,863700 +2021-06-10,81.86000061035156,82.13999938964844,79.16699981689453,80.18000030517578,1161100 +2021-06-11,82.41999816894531,82.51000213623047,79.79000091552734,82.0,1144600 +2021-06-14,81.88999938964844,84.45999908447266,81.18000030517578,82.5,869900 +2021-06-15,81.6500015258789,82.95999908447266,80.2959976196289,81.51000213623047,588700 +2021-06-16,85.80999755859375,86.7699966430664,81.02999877929688,81.02999877929688,1455100 +2021-06-17,88.22000122070312,88.4800033569336,85.25,86.03199768066406,1375300 +2021-06-18,88.20999908447266,90.02999877929688,87.30000305175781,87.44000244140625,2514200 +2021-06-21,83.91000366210938,88.0,83.27999877929688,88.0,620500 +2021-06-22,80.30000305175781,84.5999984741211,77.58999633789062,84.11000061035156,1214600 +2021-06-23,81.48999786376953,82.87000274658203,80.1500015258789,80.1500015258789,388300 +2021-06-24,84.5,87.16000366210938,83.91999816894531,85.91000366210938,754500 +2021-06-25,84.86000061035156,85.48999786376953,82.75,84.76000213623047,537600 +2021-06-28,82.12000274658203,86.45999908447266,81.06999969482422,85.30999755859375,810400 +2021-06-29,83.31999969482422,84.9000015258789,81.19999694824219,81.7300033569336,635400 +2021-06-30,75.16999816894531,79.0,73.94000244140625,78.37100219726562,2206100 +2021-07-01,70.9800033569336,74.9000015258789,69.41000366210938,74.27999877929688,1523900 +2021-07-02,72.06999969482422,72.58499908447266,70.52999877929688,70.9800033569336,669600 +2021-07-06,68.05999755859375,72.1500015258789,68.0,72.0199966430664,1394800 +2021-07-07,66.27999877929688,68.70500183105469,65.36000061035156,68.05999755859375,941900 +2021-07-08,65.87999725341797,66.9800033569336,63.95000076293945,65.01000213623047,624100 +2021-07-09,66.18000030517578,66.41000366210938,65.04499816894531,65.76000213623047,321600 +2021-07-12,67.19999694824219,67.5199966430664,65.76000213623047,66.55000305175781,395400 +2021-07-13,68.9800033569336,69.66999816894531,66.2300033569336,66.88999938964844,779800 +2021-07-14,65.16000366210938,69.58999633789062,64.62999725341797,68.91000366210938,541900 +2021-07-15,63.43000030517578,66.375,60.915000915527344,65.05000305175781,927800 +2021-07-16,60.75,63.58000183105469,59.43000030517578,63.58000183105469,695700 +2021-07-19,60.5099983215332,61.29999923706055,58.150001525878906,59.97999954223633,719500 +2021-07-20,60.849998474121094,61.150001525878906,59.040000915527344,60.43000030517578,550900 +2021-07-21,59.83000183105469,61.5099983215332,59.150001525878906,61.33000183105469,666900 +2021-07-22,62.689998626708984,62.70000076293945,59.45000076293945,60.0,872100 +2021-07-23,63.349998474121094,64.84600067138672,61.75,62.720001220703125,479800 +2021-07-26,62.56999969482422,65.62999725341797,62.060001373291016,63.5,487100 +2021-07-27,62.650001525878906,62.96200180053711,60.0,62.380001068115234,485600 +2021-07-28,65.20999908447266,65.30000305175781,62.18000030517578,62.5099983215332,581300 +2021-07-29,65.22000122070312,66.38899993896484,64.4000015258789,65.29000091552734,409500 +2021-07-30,61.470001220703125,65.33000183105469,61.0099983215332,64.44999694824219,405300 +2021-08-02,63.22999954223633,64.13999938964844,60.5,62.02000045776367,308400 +2021-08-03,62.88999938964844,63.709999084472656,60.54999923706055,63.58000183105469,352600 +2021-08-04,63.18000030517578,64.36000061035156,62.75,63.02000045776367,354100 +2021-08-05,63.25,64.01000213623047,61.7400016784668,62.86000061035156,345300 +2021-08-06,58.650001525878906,62.880001068115234,56.58000183105469,62.849998474121094,1465000 +2021-08-09,57.56999969482422,60.0,57.529998779296875,59.34000015258789,449500 +2021-08-10,57.189998626708984,58.79999923706055,56.209999084472656,58.2400016784668,581800 +2021-08-11,58.5,62.04999923706055,57.90999984741211,58.15999984741211,1396700 +2021-08-12,56.959999084472656,63.45000076293945,55.34000015258789,61.15999984741211,2481200 +2021-08-13,56.459999084472656,57.099998474121094,55.4900016784668,56.45000076293945,1057100 +2021-08-16,55.880001068115234,56.369998931884766,54.619998931884766,56.369998931884766,740400 +2021-08-17,62.56999969482422,63.45000076293945,56.27000045776367,57.9900016784668,2469700 +2021-08-18,63.77000045776367,65.4800033569336,60.310001373291016,63.060001373291016,1343600 +2021-08-19,67.0999984741211,67.12000274658203,63.5,64.0,1765600 +2021-08-20,69.97000122070312,70.33000183105469,66.5,66.5,1474900 +2021-08-23,71.55999755859375,72.0,68.7300033569336,70.56999969482422,1117700 +2021-08-24,74.5,74.55999755859375,69.4800033569336,72.0,1181700 +2021-08-25,76.5999984741211,76.62000274658203,72.77999877929688,74.30000305175781,985600 +2021-08-26,73.56999969482422,77.0250015258789,71.72799682617188,75.5199966430664,1287300 +2021-08-27,74.19999694824219,75.11000061035156,72.30000305175781,72.99400329589844,811000 +2021-08-30,73.30000305175781,74.60800170898438,71.33999633789062,74.27999877929688,972900 +2021-08-31,70.4000015258789,73.94999694824219,69.33999633789062,73.94999694824219,1304000 +2021-09-01,74.30000305175781,76.0,68.80400085449219,69.22000122070312,2589900 +2021-09-02,78.44999694824219,79.52999877929688,74.38999938964844,74.38999938964844,1898200 +2021-09-03,77.9800033569336,79.66999816894531,77.2300033569336,78.31999969482422,1116700 +2021-09-07,74.04000091552734,77.5999984741211,73.5199966430664,77.56999969482422,1117800 +2021-09-08,68.0,73.30000305175781,67.91000366210938,73.30000305175781,2050600 +2021-09-09,71.08999633789062,71.7699966430664,68.43000030517578,69.79000091552734,1428500 +2021-09-10,77.37999725341797,80.22000122070312,69.12000274658203,71.1500015258789,3303400 +2021-09-13,74.95999908447266,77.73999786376953,71.0999984741211,77.55999755859375,1490100 +2021-09-14,75.62999725341797,76.9000015258789,74.10099792480469,74.80000305175781,1875600 +2021-09-15,73.56999969482422,77.52999877929688,72.20999908447266,75.2699966430664,1081100 +2021-09-16,71.62000274658203,73.58599853515625,70.23999786376953,73.4000015258789,861100 +2021-09-17,72.75,73.17500305175781,70.52999877929688,71.88999938964844,1636900 +2021-09-20,70.33999633789062,73.95999908447266,69.33999633789062,70.58999633789062,843600 +2021-09-21,74.08999633789062,74.38999938964844,70.13999938964844,70.47000122070312,632000 +2021-09-22,73.08000183105469,75.73999786376953,72.88999938964844,74.08999633789062,1003600 +2021-09-23,77.8499984741211,79.88999938964844,75.63999938964844,76.0,1300100 +2021-09-24,79.47000122070312,80.75,77.25,77.72000122070312,1547100 +2021-09-27,76.69999694824219,79.43000030517578,75.30000305175781,79.43000030517578,824600 +2021-09-28,72.70999908447266,76.0,72.4000015258789,74.37999725341797,805000 +2021-09-29,74.16000366210938,76.19999694824219,72.93000030517578,73.36000061035156,1172400 +2021-09-30,72.37000274658203,74.80000305175781,72.18000030517578,74.61000061035156,806200 +2021-10-01,74.77999877929688,75.0199966430664,70.05000305175781,72.58999633789062,1003000 +2021-10-04,71.87999725341797,74.4000015258789,71.20999908447266,74.4000015258789,539000 +2021-10-05,73.75,74.80999755859375,71.83000183105469,71.83000183105469,932500 +2021-10-06,77.0,77.23999786376953,72.48999786376953,73.0,838200 +2021-10-07,84.94000244140625,85.0,80.05000305175781,82.62999725341797,5279400 +2021-10-08,86.33999633789062,87.05999755859375,83.30999755859375,84.58000183105469,1880500 +2021-10-11,87.41000366210938,88.16999816894531,84.33999633789062,85.19000244140625,1362600 +2021-10-12,87.18000030517578,89.5,86.05999755859375,88.9000015258789,1465300 +2021-10-13,88.01000213623047,88.94999694824219,87.30000305175781,87.33999633789062,1198100 +2021-10-14,90.79000091552734,90.87000274658203,87.8499984741211,88.5999984741211,1604600 +2021-10-15,91.83999633789062,92.6500015258789,89.5999984741211,91.1500015258789,1507200 +2021-10-18,92.20999908447266,94.05000305175781,91.79000091552734,91.9000015258789,967100 +2021-10-19,95.66000366210938,96.8499984741211,93.05000305175781,94.04000091552734,1812300 +2021-10-20,93.33000183105469,98.5999984741211,92.69000244140625,96.30999755859375,2282900 +2021-10-21,96.30000305175781,96.44000244140625,92.52999877929688,93.1500015258789,3229800 +2021-10-22,94.25,98.2300033569336,93.56999969482422,95.75,2283700 +2021-10-25,93.55999755859375,96.80500030517578,89.45999908447266,90.0,2371600 +2021-10-26,94.01000213623047,96.37000274658203,92.87999725341797,93.0,1731100 +2021-10-27,94.91999816894531,98.75,94.80999755859375,95.23999786376953,1565100 +2021-10-28,97.9000015258789,100.5,94.4000015258789,95.0199966430664,1548400 +2021-10-29,98.25,99.32499694824219,97.0999984741211,97.25,1049300 +2021-11-01,99.48999786376953,101.66999816894531,98.13999938964844,99.0,1166100 +2021-11-02,98.75,100.99500274658203,98.29000091552734,99.79000091552734,1056500 +2021-11-03,98.36000061035156,100.7300033569336,97.3499984741211,98.66999816894531,1402800 +2021-11-04,98.55000305175781,100.95999908447266,97.91000366210938,98.58000183105469,1368600 +2021-11-05,98.47000122070312,100.6449966430664,97.19000244140625,98.83999633789062,1148000 +2021-11-08,99.63999938964844,100.48999786376953,98.33999633789062,98.6500015258789,1505600 +2021-11-09,103.56999969482422,104.66999816894531,99.36000061035156,100.69999694824219,2133800 +2021-11-10,95.7300033569336,100.45999908447266,94.69000244140625,98.48999786376953,3236700 +2021-11-11,114.8499984741211,116.08999633789062,103.4000015258789,103.697998046875,7535600 +2021-11-12,112.36000061035156,116.0,109.69499969482422,114.8499984741211,3047000 +2021-11-15,102.7699966430664,113.55000305175781,101.54000091552734,113.0,2609400 +2021-11-16,109.02999877929688,109.19000244140625,98.0,102.0,3102200 +2021-11-17,105.41999816894531,109.72000122070312,103.12999725341797,109.01000213623047,1505300 +2021-11-18,99.63999938964844,102.80000305175781,96.80999755859375,102.0,2282300 +2021-11-19,99.7699966430664,101.0,98.9000015258789,99.86000061035156,1171700 +2021-11-22,95.5,100.01000213623047,91.7300033569336,100.01000213623047,2429400 +2021-11-23,92.93000030517578,97.94999694824219,91.38999938964844,93.9800033569336,1473800 +2021-11-24,94.31999969482422,96.2300033569336,90.9800033569336,92.8499984741211,863900 +2021-11-26,90.70999908447266,94.08000183105469,89.19999694824219,92.0,931200 +2021-11-29,90.26000213623047,92.62000274658203,88.94000244140625,91.13999938964844,1368700 +2021-11-30,91.11000061035156,91.86000061035156,88.83000183105469,90.26000213623047,1289800 +2021-12-01,86.12999725341797,93.97000122070312,86.04000091552734,93.7699966430664,1582100 +2021-12-02,90.31999969482422,90.51000213623047,85.01499938964844,85.37000274658203,1222900 +2021-12-03,93.52999877929688,96.19000244140625,81.44999694824219,85.0,29157000 +2021-12-06,89.81999969482422,94.30999755859375,86.37000274658203,93.33999633789062,3513100 +2021-12-07,96.47000122070312,96.69000244140625,89.81999969482422,91.13999938964844,2749200 +2021-12-08,96.05999755859375,98.58000183105469,93.47000122070312,97.16000366210938,1504500 +2021-12-09,90.77999877929688,99.29499816894531,90.05000305175781,96.0,1437600 +2021-12-10,90.66999816894531,93.6989974975586,89.4800033569336,92.18000030517578,821800 +2021-12-13,88.8499984741211,92.51899719238281,88.13999938964844,90.69999694824219,1032400 +2021-12-14,87.52999877929688,90.4800033569336,85.91000366210938,90.4800033569336,1833400 +2021-12-15,88.55999755859375,89.12000274658203,84.93000030517578,86.9800033569336,1066300 +2021-12-16,83.75,90.9800033569336,82.56999969482422,89.91699981689453,1345700 +2021-12-17,88.12999725341797,88.58000183105469,81.05000305175781,82.0,2262400 +2021-12-20,87.36000061035156,89.68000030517578,86.01000213623047,86.26000213623047,953200 +2021-12-21,91.1500015258789,91.45500183105469,87.47000122070312,88.56999969482422,928500 +2021-12-22,93.83000183105469,93.9800033569336,89.5,91.06999969482422,1047300 +2021-12-23,93.80000305175781,95.0,90.31500244140625,94.0,521400 +2021-12-27,95.80999755859375,96.9800033569336,93.33000183105469,94.23999786376953,1036400 +2021-12-28,93.19000244140625,96.7699966430664,92.70999908447266,95.27999877929688,499000 +2021-12-29,91.27999877929688,93.05999755859375,88.68000030517578,92.7300033569336,388800 +2021-12-30,93.98999786376953,95.46499633789062,90.52999877929688,90.66999816894531,733300 +2021-12-31,94.26000213623047,95.80000305175781,93.91000366210938,94.48999786376953,517300 +2022-01-03,94.37999725341797,98.13999938964844,92.5199966430664,95.0,531400 +2022-01-04,88.61000061035156,95.30999755859375,88.2699966430664,94.37999725341797,1727200 +2022-01-05,82.02999877929688,87.30000305175781,80.80000305175781,86.87999725341797,2234300 +2022-01-06,82.1500015258789,84.6500015258789,79.63999938964844,80.75,1028800 +2022-01-07,80.44999694824219,83.89900207519531,80.19000244140625,81.80000305175781,509400 +2022-01-10,82.94000244140625,82.94999694824219,75.69999694824219,80.37000274658203,959700 +2022-01-11,84.0,85.97000122070312,81.13600158691406,82.36000061035156,741600 +2022-01-12,84.33000183105469,85.9800033569336,82.75,85.25,455700 +2022-01-13,79.55000305175781,85.75,79.45999908447266,85.12000274658203,772600 +2022-01-14,79.01000213623047,79.80000305175781,75.91000366210938,78.48999786376953,1092600 +2022-01-18,72.44000244140625,77.75,72.22000122070312,77.25399780273438,1712900 +2022-01-19,70.12000274658203,73.69999694824219,69.83999633789062,72.9800033569336,2064300 +2022-01-20,70.9000015258789,74.98999786376953,70.87000274658203,71.0,1311100 +2022-01-21,68.48999786376953,71.39600372314453,68.25499725341797,70.05999755859375,1518300 +2022-01-24,69.54000091552734,69.80999755859375,60.5,67.16999816894531,2199000 +2022-01-25,64.58000183105469,70.91999816894531,63.849998474121094,67.7300033569336,1835900 +2022-01-26,63.029998779296875,68.38999938964844,62.25,66.73999786376953,2719200 +2022-01-27,59.779998779296875,64.62999725341797,59.599998474121094,64.62999725341797,1281200 +2022-01-28,60.88999938964844,61.22999954223633,57.0,59.119998931884766,2239800 +2022-01-31,64.41999816894531,64.56999969482422,61.040000915527344,61.81999969482422,1270900 +2022-02-01,67.69000244140625,67.73999786376953,63.79999923706055,65.0,1275700 +2022-02-02,65.22000122070312,69.02999877929688,64.8499984741211,67.81999969482422,1401500 +2022-02-03,61.310001373291016,64.19000244140625,60.97999954223633,63.029998779296875,1594700 +2022-02-04,68.9000015258789,69.54000091552734,61.67499923706055,61.869998931884766,2067500 +2022-02-07,68.41999816894531,72.2300033569336,67.5,68.36000061035156,1406100 +2022-02-08,70.80999755859375,71.47000122070312,66.5,67.83000183105469,1162500 +2022-02-09,74.75,75.9800033569336,72.1500015258789,72.1500015258789,1447100 +2022-02-10,72.2300033569336,76.12000274658203,71.91999816894531,72.83999633789062,1478300 +2022-02-11,70.30999755859375,74.31999969482422,69.73500061035156,72.19999694824219,719300 +2022-02-14,70.95999908447266,72.68000030517578,68.11000061035156,69.7300033569336,1100500 +2022-02-15,75.51000213623047,76.37999725341797,72.53500366210938,72.80000305175781,2006400 +2022-02-16,68.70999908447266,75.97000122070312,67.8499984741211,73.91000366210938,3766500 +2022-02-17,64.12999725341797,66.11599731445312,54.099998474121094,55.790000915527344,9499400 +2022-02-18,63.77000045776367,66.61000061035156,63.0099983215332,63.06999969482422,2595100 +2022-02-22,57.33000183105469,62.263999938964844,56.779998779296875,61.79999923706055,2755000 +2022-02-23,56.279998779296875,58.599998474121094,55.540000915527344,58.0,1422100 +2022-02-24,57.11000061035156,57.20000076293945,52.845001220703125,53.83000183105469,1673400 +2022-02-25,57.20000076293945,58.0,54.30500030517578,57.5,1494800 +2022-02-28,58.08000183105469,58.279998779296875,55.46200180053711,56.689998626708984,1905100 +2022-03-01,60.34000015258789,61.029998779296875,57.27000045776367,59.11000061035156,1814700 +2022-03-02,57.849998474121094,60.47999954223633,57.33000183105469,60.47999954223633,1326000 +2022-03-03,55.13999938964844,58.81999969482422,54.66999816894531,58.43000030517578,1413900 +2022-03-04,50.2599983215332,54.970001220703125,49.630001068115234,54.59000015258789,2603600 +2022-03-07,47.33000183105469,50.27000045776367,44.845001220703125,50.27000045776367,3545100 +2022-03-08,45.7400016784668,48.369998931884766,44.369998931884766,48.369998931884766,3038600 +2022-03-09,48.540000915527344,49.189998626708984,46.86000061035156,47.720001220703125,1498300 +2022-03-10,46.43000030517578,46.869998931884766,43.970001220703125,46.41999816894531,1615500 +2022-03-11,44.54999923706055,48.02000045776367,44.494998931884766,47.54999923706055,1732100 +2022-03-14,44.04999923706055,47.20000076293945,43.08000183105469,45.099998474121094,1611900 +2022-03-15,45.959999084472656,46.83000183105469,43.5099983215332,44.58000183105469,2108600 +2022-03-16,49.9900016784668,50.2400016784668,47.130001068115234,47.209999084472656,2566400 +2022-03-17,52.5099983215332,52.880001068115234,49.220001220703125,49.86000061035156,2882000 +2022-03-18,54.45000076293945,55.75,52.11000061035156,52.75,7024300 +2022-03-21,53.400001525878906,54.939998626708984,52.52000045776367,53.59000015258789,2425900 +2022-03-22,55.25,55.849998474121094,52.689998626708984,53.369998931884766,2559200 +2022-03-23,54.900001525878906,56.797000885009766,53.59700012207031,54.34000015258789,736200 +2022-03-24,55.20000076293945,56.40999984741211,53.900001525878906,55.75,899400 +2022-03-25,53.439998626708984,55.7599983215332,52.900001525878906,55.599998474121094,946300 +2022-03-28,53.43000030517578,53.88999938964844,51.900001525878906,53.33000183105469,1012900 +2022-03-29,55.97999954223633,56.70000076293945,54.400001525878906,54.83000183105469,1475300 +2022-03-30,55.310001373291016,56.63999938964844,54.58000183105469,55.38999938964844,1001400 +2022-03-31,55.06999969482422,56.27000045776367,54.720001220703125,55.470001220703125,1108500 +2022-04-01,53.27000045776367,56.65999984741211,52.650001525878906,55.2400016784668,1605700 +2022-04-04,57.779998779296875,58.27000045776367,53.20000076293945,54.41999816894531,1199900 +2022-04-05,54.97999954223633,57.619998931884766,54.349998474121094,57.27000045776367,833800 +2022-04-06,52.439998626708984,53.47999954223633,51.209999084472656,53.20000076293945,744900 +2022-04-07,51.880001068115234,53.53499984741211,50.68000030517578,51.54999923706055,1428500 +2022-04-08,51.27000045776367,52.2599983215332,50.665000915527344,51.47999954223633,567400 +2022-04-11,49.900001525878906,51.900001525878906,49.2599983215332,50.029998779296875,936600 +2022-04-12,49.529998779296875,52.792999267578125,49.150001525878906,51.29999923706055,1199000 +2022-04-13,51.959999084472656,52.09299850463867,48.52000045776367,49.130001068115234,1025000 +2022-04-14,48.959999084472656,51.61000061035156,48.86000061035156,51.59000015258789,758800 +2022-04-18,46.7400016784668,48.900001525878906,45.81999969482422,48.900001525878906,1962200 +2022-04-19,49.59000015258789,49.65999984741211,46.52000045776367,46.849998474121094,1020200 +2022-04-20,46.34000015258789,50.470001220703125,44.959999084472656,50.0,2309000 +2022-04-21,43.119998931884766,47.619998931884766,43.08000183105469,47.0,1336100 +2022-04-22,41.209999084472656,43.29999923706055,40.779998779296875,43.18000030517578,2140100 +2022-04-25,41.13999938964844,41.65999984741211,40.650001525878906,40.86000061035156,2070100 +2022-04-26,38.599998474121094,41.185001373291016,37.130001068115234,41.06999969482422,2451700 +2022-04-27,37.68000030517578,39.86000061035156,36.599998474121094,37.97999954223633,1919800 +2022-04-28,39.15999984741211,40.595001220703125,37.560001373291016,38.84000015258789,1864500 +2022-04-29,38.150001525878906,41.06999969482422,38.08000183105469,38.900001525878906,1098700 +2022-05-02,39.599998474121094,39.7400016784668,37.724998474121094,37.880001068115234,1249400 +2022-05-03,39.77000045776367,41.40999984741211,38.88999938964844,39.279998779296875,1682200 +2022-05-04,40.310001373291016,40.470001220703125,36.810001373291016,39.7400016784668,1501000 +2022-05-05,36.47999954223633,39.689998626708984,35.880001068115234,39.689998626708984,1614300 +2022-05-06,33.5,35.98500061035156,32.994998931884766,35.63999938964844,2850900 +2022-05-09,30.200000762939453,33.16999816894531,30.020000457763672,32.599998474121094,2959200 +2022-05-10,28.989999771118164,32.20000076293945,27.040000915527344,31.399999618530273,4733600 +2022-05-11,27.280000686645508,29.81599998474121,27.149999618530273,27.469999313354492,7500900 +2022-05-12,36.7400016784668,39.86000061035156,31.614999771118164,32.1349983215332,15940600 +2022-05-13,39.459999084472656,43.25,38.59000015258789,38.81999969482422,5526300 +2022-05-16,37.369998931884766,39.70000076293945,36.779998779296875,39.060001373291016,3267600 +2022-05-17,38.099998474121094,39.0,36.5099983215332,38.810001373291016,2169900 +2022-05-18,36.5,38.79999923706055,36.34000015258789,37.16999816894531,2671500 +2022-05-19,39.40999984741211,40.150001525878906,36.060001373291016,36.11000061035156,3003600 +2022-05-20,40.029998779296875,42.31999969482422,38.25,40.02000045776367,3445600 +2022-05-23,37.97999954223633,40.630001068115234,37.630001068115234,39.880001068115234,2341800 +2022-05-24,33.119998931884766,35.5,31.399999618530273,35.4900016784668,6328100 +2022-05-25,35.689998626708984,36.06999969482422,32.400001525878906,32.849998474121094,3653800 +2022-05-26,36.43000030517578,38.290000915527344,34.8650016784668,34.90999984741211,4684800 +2022-05-27,40.290000915527344,40.97100067138672,37.220001220703125,37.220001220703125,3804200 +2022-05-31,38.11000061035156,41.45000076293945,37.2599983215332,40.470001220703125,8734900 +2022-06-01,38.310001373291016,40.84000015258789,37.90999984741211,38.560001373291016,2981100 +2022-06-02,40.95000076293945,41.70000076293945,37.86000061035156,38.0,2685400 +2022-06-03,39.43000030517578,40.7400016784668,39.11000061035156,39.91999816894531,1752100 +2022-06-06,42.560001373291016,44.06999969482422,38.65999984741211,40.599998474121094,4532300 +2022-06-07,43.5,44.34000015258789,41.95000076293945,42.0,2465700 +2022-06-08,43.75,44.7599983215332,43.209999084472656,43.209999084472656,2045600 +2022-06-09,40.29999923706055,43.939998626708984,40.20000076293945,43.040000915527344,2632500 +2022-06-10,36.11000061035156,39.5,35.209999084472656,39.02000045776367,3995900 +2022-06-13,33.83000183105469,37.15999984741211,32.66999816894531,34.18000030517578,3334100 +2022-06-14,32.349998474121094,34.25699996948242,32.130001068115234,33.880001068115234,2956800 +2022-06-15,34.06999969482422,35.02000045776367,32.81999969482422,32.81999969482422,2998200 +2022-06-16,30.6299991607666,32.9900016784668,30.229999542236328,32.33000183105469,2979000 +2022-06-17,33.5,33.779998779296875,30.610000610351562,30.610000610351562,4636200 +2022-06-21,35.040000915527344,35.869998931884766,34.310001373291016,34.540000915527344,2813100 +2022-06-22,35.959999084472656,36.5099983215332,34.0,34.349998474121094,2253200 +2022-06-23,38.13999938964844,38.33000183105469,35.970001220703125,36.349998474121094,2342400 +2022-06-24,39.630001068115234,40.470001220703125,38.43000030517578,38.70000076293945,16578600 +2022-06-27,38.34000015258789,40.029998779296875,37.40999984741211,39.369998931884766,1732100 +2022-06-28,36.25,38.80500030517578,35.619998931884766,37.849998474121094,1914700 +2022-06-29,35.54999923706055,36.790000915527344,35.119998931884766,36.0,1745700 +2022-06-30,34.439998626708984,35.540000915527344,33.04999923706055,35.52000045776367,3003700 +2022-07-01,34.97999954223633,36.209999084472656,34.119998931884766,34.689998626708984,2142000 +2022-07-05,35.36000061035156,35.4900016784668,32.36000061035156,34.11000061035156,2996000 +2022-07-06,35.880001068115234,36.369998931884766,34.61000061035156,35.45000076293945,1715400 +2022-07-07,37.63999938964844,37.77000045776367,35.880001068115234,35.900001525878906,1654600 +2022-07-08,37.38999938964844,38.2599983215332,36.0,36.45000076293945,1547100 +2022-07-11,34.93000030517578,37.22999954223633,34.380001068115234,36.849998474121094,1802300 +2022-07-12,34.400001525878906,36.0,33.93000030517578,34.88999938964844,1382200 +2022-07-13,32.939998626708984,33.599998474121094,32.345001220703125,32.63999938964844,2479000 +2022-07-14,30.809999465942383,33.0,30.631000518798828,32.86000061035156,2646700 +2022-07-15,32.619998931884766,32.95000076293945,30.690000534057617,31.489999771118164,1762400 +2022-07-18,34.33000183105469,35.349998474121094,33.41999816894531,33.41999816894531,1994300 +2022-07-19,35.20000076293945,36.33000183105469,34.02000045776367,35.41999816894531,2000200 +2022-07-20,37.599998474121094,38.70000076293945,35.31999969482422,35.43000030517578,2818900 +2022-07-21,38.119998931884766,38.33000183105469,36.810001373291016,37.369998931884766,1582000 +2022-07-22,36.15999984741211,38.4900016784668,35.599998474121094,38.0,2363100 +2022-07-25,35.15999984741211,36.66999816894531,34.709999084472656,36.290000915527344,1148400 +2022-07-26,33.400001525878906,34.709999084472656,32.75,34.5,1073100 +2022-07-27,35.33000183105469,35.689998626708984,34.09000015258789,34.5099983215332,2733900 +2022-07-28,35.36000061035156,36.0,34.220001220703125,35.150001525878906,1755000 +2022-07-29,35.540000915527344,35.81999969482422,34.005001068115234,35.81999969482422,1656100 +2022-08-01,34.16999816894531,34.97999954223633,33.54999923706055,34.97999954223633,2248600 +2022-08-02,34.4900016784668,34.86000061035156,33.470001220703125,33.52000045776367,1587100 +2022-08-03,35.81999969482422,36.18000030517578,32.709999084472656,34.25,4755900 +2022-08-04,36.0,36.62900161743164,35.68000030517578,35.93000030517578,1857700 +2022-08-05,36.459999084472656,37.099998474121094,34.74100112915039,35.150001525878906,2627500 +2022-08-08,40.13999938964844,40.55500030517578,36.470001220703125,36.470001220703125,2689000 +2022-08-09,36.0099983215332,36.36000061035156,33.599998474121094,35.08000183105469,9262200 +2022-08-10,40.459999084472656,40.529998779296875,37.310001373291016,37.650001525878906,5187800 +2022-08-11,34.459999084472656,39.779998779296875,34.310001373291016,38.27000045776367,8429900 +2022-08-12,36.31999969482422,36.619998931884766,34.7599983215332,34.880001068115234,2653800 +2022-08-15,33.54999923706055,36.25,33.0099983215332,35.56999969482422,4256900 +2022-08-16,32.630001068115234,33.529998779296875,31.260000228881836,33.529998779296875,4883600 +2022-08-17,30.18000030517578,32.13999938964844,30.06999969482422,31.950000762939453,3407900 +2022-08-18,28.969999313354492,30.190000534057617,28.639999389648438,30.09000015258789,3890400 +2022-08-19,26.93000030517578,28.3700008392334,26.81999969482422,28.239999771118164,3871800 +2022-08-22,25.549999237060547,26.709999084472656,25.440000534057617,25.920000076293945,2711000 +2022-08-23,26.040000915527344,26.5,25.510000228881836,25.56999969482422,2362300 +2022-08-24,26.399999618530273,27.110000610351562,25.915000915527344,26.010000228881836,1796300 +2022-08-25,27.06999969482422,27.209999084472656,25.950000762939453,26.649999618530273,1529500 +2022-08-26,25.75,27.2189998626709,25.639999389648438,27.0,1786800 +2022-08-29,24.940000534057617,26.1200008392334,24.889999389648438,25.270000457763672,1444300 +2022-08-30,24.489999771118164,25.56999969482422,24.170000076293945,25.360000610351562,1366800 +2022-08-31,24.6299991607666,25.09000015258789,24.399999618530273,24.399999618530273,1648200 +2022-09-01,25.049999237060547,25.1299991607666,23.3700008392334,24.139999389648438,2314000 +2022-09-02,24.09000015258789,25.739999771118164,23.8799991607666,25.479999542236328,1834600 +2022-09-06,24.530000686645508,24.594999313354492,23.5,24.149999618530273,2309300 +2022-09-07,25.360000610351562,25.524999618530273,24.354999542236328,24.459999084472656,1812900 +2022-09-08,25.940000534057617,26.190000534057617,24.75,24.950000762939453,1401900 +2022-09-09,27.729999542236328,27.84000015258789,26.094999313354492,26.43000030517578,1836400 +2022-09-12,28.510000228881836,28.65999984741211,27.770999908447266,28.040000915527344,2345800 +2022-09-13,26.68000030517578,28.09000015258789,26.3700008392334,28.020000457763672,2576600 +2022-09-14,25.34000015258789,26.6200008392334,24.459999084472656,26.56999969482422,3363400 +2022-09-15,24.389999389648438,26.149999618530273,24.25,24.770000457763672,3806000 +2022-09-16,23.149999618530273,23.700000762939453,22.639999389648438,23.610000610351562,10604500 +2022-09-19,22.81999969482422,22.979999542236328,22.219999313354492,22.709999084472656,1805700 +2022-09-20,21.780000686645508,22.709999084472656,21.729999542236328,22.25,1695800 +2022-09-21,21.139999389648438,22.299999237060547,21.110000610351562,22.010000228881836,1688400 +2022-09-22,19.899999618530273,21.34000015258789,19.889999389648438,21.020000457763672,2182800 +2022-09-23,20.209999084472656,20.479999542236328,19.34000015258789,19.709999084472656,2533000 +2022-09-26,20.31999969482422,21.09000015258789,19.75,20.1200008392334,2326200 +2022-09-27,20.3799991607666,21.34000015258789,20.219999313354492,21.0,1831900 +2022-09-28,21.3700008392334,21.549999237060547,20.360000610351562,20.450000762939453,1653900 +2022-09-29,19.68000030517578,20.790000915527344,19.469999313354492,20.610000610351562,1712200 +2022-09-30,19.489999771118164,20.75,19.350000381469727,19.469999313354492,2235400 +2022-10-03,20.420000076293945,20.520000457763672,19.110000610351562,19.6200008392334,2135000 +2022-10-04,21.239999771118164,21.790000915527344,20.6200008392334,21.040000915527344,2654200 +2022-10-05,20.760000228881836,21.030000686645508,20.229999542236328,20.549999237060547,1538400 +2022-10-06,20.540000915527344,21.170000076293945,20.170000076293945,20.670000076293945,1235600 +2022-10-07,19.219999313354492,19.8700008392334,18.597999572753906,19.84000015258789,1895900 +2022-10-10,18.479999542236328,19.576000213623047,18.440000534057617,19.420000076293945,1608300 +2022-10-11,17.770000457763672,18.389999389648438,17.34000015258789,18.31999969482422,1893000 +2022-10-12,18.100000381469727,18.14699935913086,17.469999313354492,17.690000534057617,2042700 +2022-10-13,18.34000015258789,18.475000381469727,16.790000915527344,17.25,2706100 +2022-10-14,17.829999923706055,19.139999389648438,17.635000228881836,19.049999237060547,1911400 +2022-10-17,18.440000534057617,19.18000030517578,18.329999923706055,18.559999465942383,2229400 +2022-10-18,18.6299991607666,19.40999984741211,18.062999725341797,19.239999771118164,2503100 +2022-10-19,17.440000534057617,18.260000228881836,17.155000686645508,18.079999923706055,1973300 +2022-10-20,17.799999237060547,18.440000534057617,17.350000381469727,17.43000030517578,1854900 +2022-10-21,17.520000457763672,17.530000686645508,16.465999603271484,17.489999771118164,2212100 +2022-10-24,17.670000076293945,17.979999542236328,16.809999465942383,17.5,1941000 +2022-10-25,18.799999237060547,18.875,17.815000534057617,17.81999969482422,1862100 +2022-10-26,17.989999771118164,18.825000762939453,17.815000534057617,18.280000686645508,1649700 +2022-10-27,17.579999923706055,18.84000015258789,17.510000228881836,18.350000381469727,2431400 +2022-10-28,17.389999389648438,17.6299991607666,16.889999389648438,17.3700008392334,1446300 +2022-10-31,16.959999084472656,17.514999389648438,16.739999771118164,17.18000030517578,1749200 +2022-11-01,17.1200008392334,18.559999465942383,17.079999923706055,17.639999389648438,2333200 +2022-11-02,16.06999969482422,17.25,15.989999771118164,17.239999771118164,2620000 +2022-11-03,15.289999961853027,16.030000686645508,15.260000228881836,15.6899995803833,2597200 +2022-11-04,14.84000015258789,15.812999725341797,14.380000114440918,15.680000305175781,2813300 +2022-11-07,14.9399995803833,15.279999732971191,14.329999923706055,15.119999885559082,2831800 +2022-11-08,15.180000305175781,15.800000190734863,14.319999694824219,14.970000267028809,3510000 +2022-11-09,13.739999771118164,14.829999923706055,13.201000213623047,14.829999923706055,7823100 +2022-11-10,16.280000686645508,16.399999618530273,14.899999618530273,15.649999618530273,10644800 +2022-11-11,16.940000534057617,17.395000457763672,15.395000457763672,15.600000381469727,5326500 +2022-11-14,15.359999656677246,16.729999542236328,15.319999694824219,16.610000610351562,4589800 +2022-11-15,15.520000457763672,16.3799991607666,15.140000343322754,16.209999084472656,5377100 +2022-11-16,14.569999694824219,15.050000190734863,14.289999961853027,15.050000190734863,3973500 +2022-11-17,14.359999656677246,14.654999732971191,13.84000015258789,14.010000228881836,2674100 +2022-11-18,13.949999809265137,14.770000457763672,13.670000076293945,14.770000457763672,2219600 +2022-11-21,13.300000190734863,13.78499984741211,13.020000457763672,13.699999809265137,2902700 +2022-11-22,13.960000038146973,14.010000228881836,13.0,13.170000076293945,2074400 +2022-11-23,14.100000381469727,14.270000457763672,13.819999694824219,13.920000076293945,2214800 +2022-11-25,14.020000457763672,14.710000038146973,13.789999961853027,13.869999885559082,884600 +2022-11-28,13.479999542236328,14.079999923706055,13.430000305175781,13.449999809265137,2572300 +2022-11-29,13.4399995803833,13.789999961853027,13.289999961853027,13.614999771118164,2156600 +2022-11-30,14.40999984741211,14.460000038146973,13.180000305175781,13.25,8646200 +2022-12-01,14.289999961853027,14.390000343322754,13.869999885559082,14.300000190734863,3669300 +2022-12-02,14.279999732971191,14.494999885559082,13.8100004196167,14.079999923706055,2783000 +2022-12-05,12.829999923706055,14.25,12.6850004196167,14.170000076293945,3805300 +2022-12-06,11.100000381469727,12.859999656677246,10.78499984741211,12.859999656677246,6689800 +2022-12-07,10.789999961853027,11.140000343322754,10.579999923706055,10.920000076293945,5112700 +2022-12-08,10.40999984741211,10.949999809265137,10.175000190734863,10.40999984741211,5614400 +2022-12-09,10.359999656677246,10.569999694824219,10.1899995803833,10.329999923706055,5542200 +2022-12-12,10.699999809265137,10.699999809265137,10.329999923706055,10.449999809265137,4100400 +2022-12-13,10.5600004196167,11.930000305175781,10.319999694824219,11.399999618530273,6844800 +2022-12-14,10.529999732971191,10.760000228881836,10.25,10.479999542236328,4061300 +2022-12-15,9.760000228881836,10.359999656677246,9.734999656677246,10.170000076293945,5541500 +2022-12-16,9.819999694824219,9.975000381469727,9.59000015258789,9.710000038146973,6275100 +2022-12-19,9.479999542236328,9.850000381469727,9.449999809265137,9.850000381469727,2003400 +2022-12-20,9.829999923706055,9.930000305175781,9.399999618530273,9.40999984741211,2406500 +2022-12-21,10.199999809265137,10.427000045776367,9.779999732971191,9.949999809265137,3541000 +2022-12-22,9.84000015258789,10.050000190734863,9.524999618530273,9.9399995803833,3079500 +2022-12-23,9.84000015258789,9.914999961853027,9.670000076293945,9.850000381469727,2601400 +2022-12-27,9.300000190734863,9.800000190734863,9.229999542236328,9.800000190734863,2569500 +2022-12-28,9.399999618530273,9.4399995803833,9.140000343322754,9.220000267028809,2654300 +2022-12-29,10.430000305175781,10.569999694824219,9.4350004196167,9.529999732971191,2600500 +2022-12-30,10.529999732971191,10.600000381469727,10.130000114440918,10.130000114440918,2577900 +2023-01-03,10.729999542236328,11.140000343322754,10.470000267028809,10.8100004196167,2575200 +2023-01-04,10.899999618530273,11.180000305175781,10.569999694824219,10.979999542236328,3561300 +2023-01-05,9.850000381469727,10.010000228881836,9.4350004196167,9.710000038146973,4030100 +2023-01-06,9.720000267028809,9.9350004196167,9.21500015258789,9.890000343322754,4199800 +2023-01-09,10.180000305175781,10.529999732971191,9.920000076293945,9.949999809265137,3275600 +2023-01-10,10.369999885559082,10.369999885559082,9.949999809265137,10.069999694824219,3943900 +2023-01-11,10.760000228881836,10.779999732971191,10.300000190734863,10.399999618530273,2544500 +2023-01-12,10.680000305175781,10.890000343322754,10.300000190734863,10.829999923706055,1727000 +2023-01-13,10.8100004196167,10.904999732971191,10.331999778747559,10.4399995803833,1345500 +2023-01-17,10.899999618530273,11.079999923706055,10.4399995803833,10.789999961853027,2863100 +2023-01-18,10.699999809265137,11.225000381469727,10.654999732971191,11.039999961853027,1975600 +2023-01-19,10.180000305175781,10.619999885559082,10.085000038146973,10.402000427246094,1856500 +2023-01-20,10.9399995803833,10.949999809265137,10.130000114440918,10.270000457763672,1960100 +2023-01-23,11.979999542236328,11.989999771118164,10.954999923706055,11.020000457763672,2707800 +2023-01-24,11.899999618530273,12.1899995803833,11.720000267028809,11.84000015258789,2775700 +2023-01-25,11.819999694824219,11.90999984741211,11.005000114440918,11.5,1904200 +2023-01-26,11.899999618530273,12.274999618530273,11.765000343322754,12.220000267028809,1905800 +2023-01-27,12.59000015258789,12.675000190734863,11.760000228881836,11.760000228881836,2602600 +2023-01-30,12.210000038146973,12.484999656677246,11.8100004196167,12.199999809265137,2764100 +2023-01-31,12.699999809265137,12.710000038146973,12.175000190734863,12.300000190734863,2207100 +2023-02-01,13.359999656677246,13.359999656677246,12.4350004196167,12.760000228881836,3002900 +2023-02-02,14.1899995803833,14.524999618530273,13.479999542236328,13.960000038146973,5440900 +2023-02-03,13.220000267028809,14.045000076293945,13.170000076293945,13.489999771118164,2688500 +2023-02-06,12.600000381469727,13.140000343322754,12.493000030517578,12.9399995803833,3526800 +2023-02-07,12.850000381469727,12.930000305175781,12.345000267028809,12.579999923706055,2901900 +2023-02-08,12.680000305175781,13.125,12.420000076293945,12.75,7109300 +2023-02-09,16.110000610351562,17.3799991607666,16.049999237060547,17.270000457763672,14681600 +2023-02-10,15.289999961853027,16.139999389648438,15.140000343322754,15.710000038146973,5111600 +2023-02-13,15.859999656677246,16.108999252319336,14.385000228881836,15.390000343322754,4817600 +2023-02-14,15.970000267028809,16.219999313354492,15.170000076293945,15.59000015258789,3283200 +2023-02-15,16.8700008392334,17.014999389648438,15.789999961853027,15.9399995803833,3881500 +2023-02-16,15.600000381469727,16.584999084472656,15.59000015258789,16.209999084472656,3155900 +2023-02-17,14.989999771118164,15.59000015258789,14.930000305175781,15.449999809265137,2701100 +2023-02-21,14.199999809265137,14.789999961853027,14.1899995803833,14.619999885559082,2920700 +2023-02-22,15.170000076293945,15.3100004196167,14.109999656677246,14.199999809265137,3225900 +2023-02-23,14.489999771118164,15.050000190734863,14.119999885559082,14.649999618530273,3350600 +2023-02-24,14.210000038146973,14.505000114440918,14.010000228881836,14.0600004196167,3171000 +2023-02-27,13.40999984741211,14.5600004196167,13.369999885559082,14.449999809265137,2751500 +2023-02-28,13.5,13.71500015258789,13.289999961853027,13.34000015258789,2297100 +2023-03-01,13.380000114440918,13.59000015258789,13.239999771118164,13.5,1817800 +2023-03-02,13.699999809265137,13.710000038146973,13.130000114440918,13.260000228881836,1393200 +2023-03-03,13.949999809265137,14.289999961853027,13.800000190734863,13.9399995803833,2183300 +2023-03-06,13.609999656677246,14.175000190734863,13.5,14.010000228881836,1586400 +2023-03-07,13.4399995803833,13.949999809265137,13.350000381469727,13.670000076293945,1885600 +2023-03-08,13.289999961853027,13.59000015258789,13.180000305175781,13.420000076293945,1761000 +2023-03-09,12.779999732971191,13.579999923706055,12.710000038146973,13.229999542236328,1574900 +2023-03-10,12.3100004196167,12.75,11.920000076293945,12.75,2316900 +2023-03-13,12.40999984741211,12.704999923706055,11.6899995803833,12.140000343322754,2417800 +2023-03-14,12.770000457763672,12.930000305175781,12.614999771118164,12.819999694824219,2054100 +2023-03-15,13.59000015258789,13.6899995803833,12.359999656677246,12.399999618530273,3235100 +2023-03-16,13.760000228881836,14.050000190734863,13.539999961853027,13.670000076293945,3312800 +2023-03-17,13.520000457763672,14.0,13.479999542236328,13.680000305175781,6121600 +2023-03-20,13.600000381469727,14.059000015258789,13.229999542236328,13.40999984741211,2591500 +2023-03-21,14.239999771118164,14.40999984741211,13.635000228881836,13.760000228881836,2483300 +2023-03-22,13.8100004196167,14.404999732971191,13.789999961853027,14.270000457763672,2212200 +2023-03-23,14.1899995803833,14.734999656677246,14.050000190734863,14.149999618530273,1817200 +2023-03-24,14.170000076293945,14.345000267028809,13.850000381469727,14.149999618530273,1728300 +2023-03-27,14.149999618530273,14.350000381469727,13.6850004196167,14.25,2424000 +2023-03-28,13.970000267028809,14.145000457763672,13.829999923706055,14.109999656677246,1740100 +2023-03-29,14.979999542236328,15.0600004196167,14.239999771118164,14.279999732971191,2725700 +2023-03-30,15.0,15.380000114440918,14.904999732971191,15.34000015258789,2675900 +2023-03-31,15.75,15.880000114440918,15.069999694824219,15.220000267028809,2517900 +2023-04-03,15.829999923706055,16.007999420166016,15.5600004196167,15.619999885559082,2150900 +2023-04-04,16.399999618530273,16.559999465942383,15.920000076293945,15.920000076293945,2607600 +2023-04-05,15.699999809265137,16.360000610351562,15.25,16.309999465942383,3350700 +2023-04-06,15.720000267028809,15.949999809265137,15.260000228881836,15.619999885559082,2306500 +2023-04-10,15.859999656677246,15.920000076293945,15.260000228881836,15.449999809265137,2247500 +2023-04-11,15.960000038146973,16.15999984741211,15.770000457763672,15.859999656677246,2146000 +2023-04-12,16.15999984741211,16.40999984741211,15.850000381469727,16.40999984741211,2765300 +2023-04-13,16.360000610351562,16.829999923706055,16.299999237060547,16.3700008392334,2961500 +2023-04-14,16.469999313354492,16.55500030517578,16.1200008392334,16.299999237060547,2246900 +2023-04-17,16.34000015258789,16.844999313354492,16.170000076293945,16.40999984741211,2329800 +2023-04-18,16.600000381469727,16.729999542236328,16.325000762939453,16.610000610351562,1790800 +2023-04-19,16.770000457763672,17.079999923706055,16.270000457763672,16.329999923706055,2262600 +2023-04-20,16.489999771118164,16.864999771118164,16.389999389648438,16.5,2077000 +2023-04-21,16.43000030517578,16.71500015258789,16.315000534057617,16.59000015258789,2039800 +2023-04-24,15.859999656677246,16.59000015258789,15.59000015258789,16.530000686645508,2439900 +2023-04-25,15.4399995803833,15.789999961853027,15.40999984741211,15.760000228881836,1740900 +2023-04-26,15.9399995803833,16.3700008392334,15.609999656677246,15.760000228881836,3049000 +2023-04-27,17.030000686645508,17.34000015258789,16.3799991607666,16.479999542236328,2945300 +2023-04-28,17.0,17.31999969482422,16.68000030517578,16.959999084472656,2051500 +2023-05-01,16.8700008392334,17.110000610351562,16.684999465942383,16.969999313354492,3190800 +2023-05-02,16.260000228881836,16.90999984741211,15.699999809265137,16.809999465942383,2790400 +2023-05-03,16.450000762939453,17.190000534057617,16.350000381469727,16.360000610351562,2243200 +2023-05-04,16.6200008392334,17.03499984741211,16.559999465942383,16.649999618530273,2322800 +2023-05-05,17.15999984741211,17.260000228881836,16.850000381469727,16.899999618530273,1757100 +2023-05-08,17.6200008392334,17.915000915527344,17.200000762939453,17.200000762939453,2333700 +2023-05-09,17.329999923706055,17.75,17.25,17.40999984741211,3295900 +2023-05-10,17.809999465942383,18.059999465942383,17.565000534057617,17.739999771118164,4608900 +2023-05-11,22.0,22.9950008392334,20.899999618530273,21.7549991607666,15089800 +2023-05-12,21.510000228881836,22.68000030517578,21.1200008392334,22.68000030517578,3462000 +2023-05-15,22.6299991607666,22.93000030517578,21.3700008392334,21.549999237060547,3835100 +2023-05-16,22.8799991607666,23.110000610351562,22.075000762939453,22.5,2594200 +2023-05-17,24.3799991607666,25.010000228881836,24.049999237060547,24.3700008392334,5482300 +2023-05-18,25.079999923706055,25.202999114990234,24.280000686645508,24.43000030517578,4548200 +2023-05-19,25.1200008392334,25.239999771118164,24.697999954223633,25.079999923706055,2217400 +2023-05-22,25.09000015258789,25.34000015258789,24.53499984741211,25.170000076293945,3246900 +2023-05-23,24.809999465942383,25.5,24.719999313354492,24.93000030517578,1819500 +2023-05-24,24.43000030517578,24.850000381469727,24.229999542236328,24.389999389648438,1749000 +2023-05-25,24.049999237060547,25.075000762939453,23.649999618530273,24.93000030517578,1905400 +2023-05-26,24.049999237060547,24.486000061035156,23.8700008392334,24.139999389648438,1772000 +2023-05-30,24.229999542236328,24.90999984741211,24.114999771118164,24.610000610351562,2196400 +2023-05-31,25.010000228881836,25.179000854492188,23.8799991607666,23.989999771118164,3578300 +2023-06-01,24.829999923706055,25.0,24.1299991607666,24.510000228881836,1908900 +2023-06-02,24.809999465942383,25.64699935913086,24.610000610351562,25.040000915527344,2718300 +2023-06-05,25.600000381469727,25.790000915527344,24.190000534057617,24.790000915527344,3630000 +2023-06-06,23.299999237060547,25.719999313354492,23.239999771118164,25.649999618530273,4938300 +2023-06-07,21.53499984741211,23.700000762939453,21.03499984741211,23.579999923706055,6511100 +2023-06-08,22.489999771118164,22.860000610351562,21.329999923706055,21.440000534057617,3651200 +2023-06-09,22.65999984741211,23.510000228881836,22.344999313354492,22.389999389648438,1963000 +2023-06-12,22.3799991607666,22.829999923706055,22.15999984741211,22.829999923706055,2137800 +2023-06-13,22.520000457763672,23.1200008392334,22.190000534057617,22.709999084472656,2016800 +2023-06-14,22.5,22.780000686645508,21.8700008392334,22.510000228881836,2264300 +2023-06-15,23.209999084472656,23.459999084472656,22.110000610351562,22.190000534057617,2228000 +2023-06-16,23.969999313354492,24.43000030517578,23.09000015258789,23.299999237060547,7120300 +2023-06-20,23.579999923706055,24.295000076293945,23.219999313354492,23.690000534057617,2908200 +2023-06-21,23.350000381469727,23.790000915527344,23.18000030517578,23.6299991607666,1782300 +2023-06-22,23.700000762939453,23.770000457763672,22.95400047302246,23.219999313354492,1333100 +2023-06-23,23.389999389648438,23.510000228881836,22.850000381469727,23.299999237060547,4326600 +2023-06-26,24.190000534057617,24.700000762939453,23.475000381469727,23.489999771118164,1800200 +2023-06-27,26.040000915527344,26.155000686645508,24.520000457763672,24.520000457763672,2516400 +2023-06-28,25.709999084472656,26.618000030517578,25.665000915527344,25.920000076293945,2181400 +2023-06-29,25.56999969482422,25.760000228881836,25.111000061035156,25.700000762939453,1486900 +2023-06-30,25.729999542236328,26.31999969482422,25.700000762939453,26.040000915527344,2090900 +2023-07-03,25.920000076293945,25.9950008392334,25.540000915527344,25.649999618530273,759200 +2023-07-05,26.559999465942383,26.649999618530273,25.790000915527344,25.790000915527344,1757100 +2023-07-06,25.549999237060547,26.1200008392334,25.239999771118164,26.020000457763672,1878900 +2023-07-07,25.989999771118164,26.540000915527344,25.729999542236328,25.760000228881836,1505200 +2023-07-10,27.079999923706055,27.139999389648438,25.81999969482422,25.829999923706055,1999900 +2023-07-11,28.09000015258789,28.59000015258789,26.920000076293945,27.219999313354492,2805200 +2023-07-12,28.299999237060547,28.559999465942383,27.850000381469727,28.5,1504800 +2023-07-13,28.989999771118164,29.25,28.329999923706055,28.549999237060547,2518700 +2023-07-14,28.149999618530273,29.125,28.079999923706055,28.979999542236328,1112700 +2023-07-17,28.459999084472656,28.719999313354492,27.860000610351562,28.299999237060547,1072100 +2023-07-18,28.309999465942383,28.759000778198242,28.270000457763672,28.700000762939453,1215400 +2023-07-19,28.56999969482422,29.125,28.1299991607666,28.600000381469727,1519000 +2023-07-20,28.030000686645508,28.18000030517578,27.31999969482422,28.06999969482422,2525300 +2023-07-21,28.100000381469727,28.510000228881836,27.969999313354492,28.479999542236328,1094800 +2023-07-24,28.149999618530273,29.5,27.959999084472656,29.5,1442200 +2023-07-25,28.639999389648438,28.93000030517578,28.39299964904785,28.399999618530273,1323300 +2023-07-26,29.940000534057617,29.979999542236328,28.190000534057617,28.190000534057617,1880300 +2023-07-27,29.979999542236328,31.100000381469727,29.950000762939453,30.59000015258789,2646300 +2023-07-28,31.260000228881836,31.329999923706055,30.479999542236328,30.729999542236328,2014200 +2023-07-31,31.399999618530273,31.889999389648438,31.170000076293945,31.309999465942383,1526400 +2023-08-01,31.43000030517578,32.029998779296875,30.8700008392334,31.139999389648438,1471700 +2023-08-02,31.15999984741211,31.375,29.761999130249023,30.56999969482422,2419300 +2023-08-03,30.59000015258789,31.190000534057617,30.350000381469727,31.0,1267300 +2023-08-04,31.360000610351562,31.969999313354492,31.024999618530273,31.100000381469727,3167100 +2023-08-07,30.780000686645508,31.479999542236328,30.229999542236328,31.440000534057617,2225100 +2023-08-08,30.049999237060547,30.31999969482422,29.600000381469727,30.06999969482422,1966400 +2023-08-09,29.40999984741211,30.190000534057617,28.990999221801758,30.030000686645508,4990600 +2023-08-10,37.20000076293945,38.959999084472656,33.16999816894531,38.31999969482422,19545600 +2023-08-11,38.88999938964844,39.56999969482422,37.10499954223633,37.20000076293945,7701100 +2023-08-14,39.75,40.0,38.29999923706055,38.400001525878906,3657400 +2023-08-15,39.630001068115234,40.040000915527344,38.529998779296875,39.689998626708984,2374500 +2023-08-16,39.04999923706055,39.650001525878906,38.625,39.400001525878906,2437000 +2023-08-17,37.81999969482422,38.869998931884766,37.439998626708984,38.619998931884766,2300700 +2023-08-18,38.22999954223633,39.25,37.06999969482422,37.209999084472656,2516600 +2023-08-21,39.0099983215332,39.599998474121094,38.130001068115234,38.5099983215332,4053500 +2023-08-22,39.47999954223633,40.689998626708984,39.2400016784668,40.68000030517578,2502600 +2023-08-23,40.18000030517578,40.189998626708984,39.38999938964844,39.560001373291016,2112100 +2023-08-24,39.310001373291016,40.43000030517578,39.220001220703125,40.43000030517578,1984200 +2023-08-25,39.7599983215332,39.935001373291016,38.849998474121094,39.310001373291016,1595600 +2023-08-28,40.650001525878906,40.90999984741211,39.369998931884766,39.66999816894531,2042600 +2023-08-29,41.220001220703125,42.29999923706055,40.380001068115234,40.459999084472656,2865400 +2023-08-30,42.97999954223633,43.040000915527344,41.25,41.25,2481800 +2023-08-31,43.220001220703125,43.236000061035156,42.540000915527344,43.099998474121094,2226600 +2023-09-01,43.189998626708984,43.7599983215332,42.849998474121094,43.4900016784668,1467600 +2023-09-05,42.540000915527344,43.459999084472656,42.130001068115234,42.709999084472656,2090000 +2023-09-06,42.22999954223633,42.70000076293945,41.779998779296875,42.2599983215332,1971700 +2023-09-07,42.47999954223633,42.900001525878906,41.50299835205078,41.720001220703125,1468700 +2023-09-08,42.119998931884766,42.6150016784668,41.724998474121094,42.34000015258789,1284700 +2023-09-11,42.400001525878906,43.63999938964844,42.279998779296875,42.619998931884766,1798800 +2023-09-12,41.70000076293945,42.34000015258789,41.310001373291016,41.959999084472656,3087200 +2023-09-13,40.810001373291016,41.849998474121094,40.70000076293945,41.40999984741211,2640100 +2023-09-14,42.599998474121094,42.970001220703125,41.30500030517578,41.720001220703125,3400500 +2023-09-15,42.81999969482422,42.84000015258789,41.09000015258789,42.119998931884766,6482300 +2023-09-18,44.0099983215332,44.88999938964844,42.084999084472656,42.4900016784668,5615400 +2023-09-19,39.72999954223633,43.790000915527344,39.02000045776367,43.599998474121094,5802800 +2023-09-20,39.33000183105469,40.560001373291016,39.310001373291016,39.66999816894531,3764600 +2023-09-21,38.439998626708984,39.29999923706055,38.2400016784668,38.380001068115234,2582200 +2023-09-22,37.7599983215332,38.970001220703125,37.481998443603516,38.81999969482422,2103800 +2023-09-25,38.20000076293945,38.34000015258789,37.119998931884766,37.349998474121094,2219500 +2023-09-26,38.59000015258789,39.04999923706055,37.369998931884766,37.650001525878906,2240000 +2023-09-27,39.560001373291016,39.560001373291016,38.38999938964844,38.959999084472656,1734600 +2023-09-28,39.7400016784668,40.349998474121094,38.900001525878906,39.2400016784668,1485900 +2023-09-29,39.959999084472656,40.529998779296875,39.61000061035156,40.380001068115234,1539100 +2023-10-02,40.81999969482422,41.04999923706055,39.970001220703125,40.150001525878906,1356600 +2023-10-03,39.130001068115234,40.959999084472656,39.0,40.31999969482422,2126900 +2023-10-04,40.33000183105469,40.470001220703125,39.2400016784668,39.29999923706055,2205600 +2023-10-05,39.70000076293945,40.34000015258789,39.31999969482422,40.290000915527344,1230600 +2023-10-06,40.380001068115234,41.060001373291016,38.790000915527344,38.9900016784668,1828500 +2023-10-09,40.849998474121094,40.939998626708984,39.56999969482422,39.709999084472656,1543000 +2023-10-10,40.529998779296875,42.220001220703125,40.422000885009766,41.5,3160600 +2023-10-11,40.279998779296875,40.63999938964844,39.79999923706055,40.5,2003700 +2023-10-12,39.689998626708984,40.209999084472656,38.97999954223633,40.15999984741211,2033100 +2023-10-13,38.52000045776367,39.83000183105469,38.209999084472656,39.68000030517578,2091600 +2023-10-16,38.88999938964844,39.43000030517578,37.90999984741211,38.689998626708984,2298800 +2023-10-17,39.63999938964844,40.25,38.814998626708984,38.88999938964844,2237000 +2023-10-18,38.95000076293945,39.97999954223633,38.630001068115234,39.36000061035156,1546400 +2023-10-19,38.540000915527344,39.68000030517578,38.45000076293945,39.369998931884766,2165900 +2023-10-20,37.58000183105469,38.560001373291016,37.38999938964844,38.34000015258789,1993400 +2023-10-23,37.63999938964844,38.22999954223633,36.83000183105469,37.04999923706055,1440700 +2023-10-24,38.470001220703125,38.95000076293945,37.71699905395508,38.18000030517578,1352200 +2023-10-25,36.150001525878906,38.380001068115234,36.060001373291016,38.31999969482422,1709900 +2023-10-26,36.369998931884766,36.650001525878906,34.45000076293945,36.400001525878906,3996700 +2023-10-27,36.220001220703125,37.0,36.132999420166016,36.77000045776367,2358200 +2023-10-30,36.72999954223633,37.15999984741211,35.869998931884766,36.81999969482422,1631000 +2023-10-31,36.439998626708984,37.279998779296875,36.26499938964844,36.880001068115234,1023800 +2023-11-01,36.70000076293945,36.76599884033203,36.04499816894531,36.56999969482422,2246500 +2023-11-02,37.36000061035156,38.91999816894531,37.279998779296875,37.630001068115234,2093800 +2023-11-03,39.27000045776367,39.5099983215332,37.2599983215332,37.2599983215332,2235200 +2023-11-06,39.41999816894531,39.47999954223633,38.41999816894531,39.36000061035156,3293900 +2023-11-07,40.88999938964844,41.5,39.665000915527344,40.0,5125600 +2023-11-08,40.119998931884766,41.90999984741211,39.81800079345703,41.099998474121094,5230800 +2023-11-09,39.68000030517578,45.10499954223633,37.13999938964844,45.10499954223633,14358800 +2023-11-10,43.790000915527344,44.060001373291016,39.130001068115234,39.869998931884766,5897800 +2023-11-13,41.40999984741211,44.52000045776367,41.32500076293945,43.650001525878906,3429900 +2023-11-14,42.79999923706055,43.810001373291016,42.56999969482422,42.58000183105469,3557900 +2023-11-15,40.45000076293945,42.70000076293945,39.869998931884766,42.439998626708984,5182300 +2023-11-16,38.93000030517578,40.400001525878906,38.900001525878906,40.20000076293945,2850300 +2023-11-17,39.099998474121094,39.41999816894531,38.56999969482422,39.189998626708984,2328700 +2023-11-20,39.5,40.11000061035156,39.15999984741211,39.15999984741211,1991400 +2023-11-21,38.77000045776367,39.650001525878906,38.65999984741211,39.02000045776367,1830000 +2023-11-22,39.2400016784668,39.540000915527344,38.61000061035156,39.0,1329400 +2023-11-24,39.4900016784668,39.63800048828125,38.72999954223633,39.209999084472656,811900 +2023-11-27,39.38999938964844,40.41999816894531,38.790000915527344,39.25,3201600 +2023-11-28,38.400001525878906,40.09000015258789,37.95000076293945,39.43000030517578,3391600 +2023-11-29,39.029998779296875,39.27000045776367,38.279998779296875,38.880001068115234,2245900 +2023-11-30,37.47999954223633,39.5,37.04399871826172,38.93000030517578,4034500 +2023-12-01,38.25,38.77000045776367,36.810001373291016,37.650001525878906,2907400 +2023-12-04,37.369998931884766,37.93000030517578,36.95000076293945,37.56999969482422,3051100 +2023-12-05,37.06999969482422,37.380001068115234,36.61000061035156,36.97999954223633,2456500 +2023-12-06,36.599998474121094,37.79999923706055,36.29999923706055,37.130001068115234,1929500 +2023-12-07,36.84000015258789,37.060001373291016,36.369998931884766,36.52000045776367,1932000 +2023-12-08,37.36000061035156,37.6150016784668,36.529998779296875,36.529998779296875,1631300 +2023-12-11,36.7400016784668,37.90999984741211,36.58000183105469,37.27000045776367,3843100 +2023-12-12,36.2599983215332,36.75,35.790000915527344,36.560001373291016,4006800 +2023-12-13,37.93000030517578,38.029998779296875,36.33000183105469,36.369998931884766,3158300 +2023-12-14,38.689998626708984,39.59000015258789,38.13999938964844,38.25,4068300 +2023-12-15,39.95000076293945,40.2400016784668,38.720001220703125,38.790000915527344,4498800 +2023-12-18,40.869998931884766,41.04999923706055,39.91999816894531,40.56999969482422,2922500 +2023-12-19,43.59000015258789,44.40999984741211,41.2599983215332,41.459999084472656,3942400 +2023-12-20,43.099998474121094,44.56999969482422,43.029998779296875,43.61000061035156,2132600 +2023-12-21,43.0,44.11000061035156,42.32099914550781,43.91999816894531,1590100 +2023-12-22,41.209999084472656,42.47999954223633,41.13999938964844,42.380001068115234,1898100 +2023-12-26,40.400001525878906,41.38999938964844,40.310001373291016,41.15999984741211,2617200 +2023-12-27,40.650001525878906,40.689998626708984,39.880001068115234,40.5,2234100 +2023-12-28,40.7599983215332,40.93000030517578,40.349998474121094,40.349998474121094,1130700 +2023-12-29,39.849998474121094,40.75,39.275001525878906,40.70000076293945,2260500 +2024-01-02,38.779998779296875,39.40999984741211,38.29999923706055,39.40999984741211,2371600 +2024-01-03,38.209999084472656,38.43000030517578,37.58000183105469,37.939998626708984,1942300 +2024-01-04,38.119998931884766,38.41999816894531,37.400001525878906,38.040000915527344,2131400 +2024-01-05,38.11000061035156,38.689998626708984,37.68000030517578,37.790000915527344,1955600 +2024-01-08,39.290000915527344,39.310001373291016,37.95000076293945,38.33000183105469,1428600 +2024-01-09,39.13999938964844,39.310001373291016,38.599998474121094,38.7599983215332,1726900 +2024-01-10,40.529998779296875,41.2599983215332,39.150001525878906,39.38999938964844,2951400 +2024-01-11,41.41999816894531,41.45000076293945,39.90999984741211,40.9900016784668,2108600 +2024-01-12,41.709999084472656,42.029998779296875,41.209999084472656,41.45000076293945,2121100 +2024-01-16,40.720001220703125,41.41999816894531,40.38999938964844,41.369998931884766,2131300 +2024-01-17,41.18000030517578,41.220001220703125,39.43000030517578,40.56999969482422,2661200 +2024-01-18,43.09000015258789,43.119998931884766,40.97999954223633,42.0099983215332,2826600 +2024-01-19,41.13999938964844,43.70000076293945,41.099998474121094,43.400001525878906,3288200 +2024-01-22,43.35499954223633,44.018001556396484,42.275001525878906,42.439998626708984,8093000 +2024-01-23,44.72999954223633,44.88999938964844,43.400001525878906,44.04999923706055,5229600 +2024-01-24,43.310001373291016,45.599998474121094,42.88999938964844,45.41999816894531,3867500 +2024-01-25,44.06999969482422,44.56999969482422,43.25,43.91999816894531,1895100 +2024-01-26,44.29999923706055,44.58000183105469,43.895999908447266,44.13999938964844,2173500 +2024-01-29,46.56999969482422,46.59000015258789,44.150001525878906,44.54999923706055,4791600 +2024-01-30,42.470001220703125,47.040000915527344,42.11000061035156,46.41999816894531,5727700 +2024-01-31,41.130001068115234,42.44499969482422,41.040000915527344,41.79999923706055,2907100 +2024-02-01,40.959999084472656,41.97999954223633,40.900001525878906,41.540000915527344,2847200 +2024-02-02,45.86000061035156,45.88999938964844,40.709999084472656,41.0,6021700 +2024-02-05,45.47999954223633,46.09000015258789,44.0099983215332,45.599998474121094,2839600 +2024-02-06,46.040000915527344,46.5,45.08399963378906,46.11000061035156,2400200 +2024-02-07,47.689998626708984,47.83000183105469,45.71500015258789,46.5,4285800 +2024-02-08,46.54999923706055,48.77000045776367,46.52000045776367,47.801998138427734,3383900 +2024-02-09,46.349998474121094,47.15999984741211,45.279998779296875,47.08000183105469,2741500 +2024-02-12,47.060001373291016,48.369998931884766,46.47999954223633,46.68000030517578,3593300 +2024-02-13,45.83000183105469,46.790000915527344,45.124000549316406,45.33000183105469,3452200 +2024-02-14,46.869998931884766,47.29999923706055,45.59000015258789,46.279998779296875,6882500 +2024-02-15,58.5,59.13999938964844,52.75,54.685001373291016,16102500 +2024-02-16,59.869998931884766,60.650001525878906,57.119998931884766,58.52000045776367,6176200 +2024-02-20,57.33000183105469,59.150001525878906,55.380001068115234,59.130001068115234,6228000 +2024-02-21,55.41999816894531,57.58000183105469,54.5,55.209999084472656,4189000 +2024-02-22,57.79999923706055,58.34000015258789,56.45000076293945,57.7599983215332,4505000 +2024-02-23,57.38999938964844,59.06800079345703,57.09000015258789,58.06999969482422,3099000 +2024-02-26,58.9900016784668,60.900001525878906,57.720001220703125,57.81999969482422,4403100 +2024-02-27,60.630001068115234,61.349998474121094,59.68000030517578,59.90999984741211,4166100 +2024-02-28,58.0099983215332,60.400001525878906,57.96500015258789,59.79999923706055,2882700 +2024-02-29,59.720001220703125,60.060001373291016,57.400001525878906,58.5,15796600 +2024-03-01,62.2599983215332,62.34000015258789,59.84000015258789,60.72999954223633,6042700 +2024-03-04,61.869998931884766,63.487998962402344,61.599998474121094,62.5,4657800 +2024-03-05,60.959999084472656,61.689998626708984,60.02000045776367,60.75,3761500 +2024-03-06,62.619998931884766,63.84000015258789,61.119998931884766,62.529998779296875,4374100 +2024-03-07,63.189998626708984,63.380001068115234,62.310001373291016,63.0,4283500 +2024-03-08,63.41999816894531,65.66999816894531,62.540000915527344,64.04000091552734,3859300 +2024-03-11,60.029998779296875,62.95000076293945,59.29999923706055,62.79999923706055,4416800 +2024-03-12,61.11000061035156,61.349998474121094,59.91999816894531,61.150001525878906,3947500 +2024-03-13,63.09000015258789,63.209999084472656,60.79999923706055,60.9900016784668,3591800 +2024-03-14,63.189998626708984,64.30999755859375,62.5,63.43000030517578,3870900 +2024-03-15,63.130001068115234,63.90700149536133,62.13999938964844,62.58000183105469,4649200 +2024-03-18,68.1500015258789,68.81999969482422,63.59000015258789,63.75,7559300 +2024-03-19,67.63999938964844,68.00499725341797,63.73400115966797,66.98999786376953,5961700 +2024-03-20,70.5199966430664,71.06999969482422,67.27999877929688,68.18000030517578,3855300 +2024-03-21,71.91000366210938,73.4800033569336,71.02999877929688,71.5199966430664,3400800 +2024-03-22,71.2300033569336,72.30500030517578,70.26000213623047,72.0,6504000 +2024-03-25,72.5999984741211,73.25,70.38999938964844,70.61000061035156,2618000 +2024-03-26,71.08999633789062,74.55000305175781,70.56999969482422,72.80000305175781,5233200 +2024-03-27,68.86000061035156,71.59500122070312,66.29000091552734,71.25,4049600 +2024-03-28,69.22000122070312,70.03500366210938,68.54000091552734,68.8499984741211,2602100 +2024-04-01,69.13999938964844,69.43000030517578,67.80000305175781,69.04000091552734,1735800 +2024-04-02,69.72000122070312,69.76000213623047,67.19999694824219,67.4000015258789,3216500 +2024-04-03,72.86000061035156,73.67900085449219,69.51000213623047,69.76000213623047,7316600 +2024-04-04,72.77999877929688,75.83000183105469,72.48999786376953,73.0999984741211,4692300 +2024-04-05,74.79499816894531,75.8499984741211,70.83000183105469,71.94999694824219,4150800 +2024-04-08,78.05000305175781,78.29000091552734,75.05000305175781,77.18000030517578,3907400 +2024-04-09,76.5199966430664,79.55000305175781,75.33499908447266,78.30000305175781,4198000 +2024-04-10,76.33999633789062,77.52999877929688,74.31999969482422,74.70999908447266,2924200 +2024-04-11,78.23999786376953,78.875,75.22000122070312,77.20999908447266,2777200 +2024-04-12,75.56999969482422,78.04000091552734,74.48999786376953,77.5,2561300 +2024-04-15,71.43000030517578,75.09500122070312,71.27999877929688,74.33999633789062,4107200 +2024-04-16,72.31999969482422,73.29000091552734,70.4530029296875,70.80999755859375,2812100 +2024-04-17,70.9000015258789,73.18800354003906,70.36000061035156,72.75,2394700 +2024-04-18,68.86000061035156,71.83000183105469,68.30999755859375,71.47000122070312,3701600 +2024-04-19,66.80000305175781,69.18000030517578,66.20999908447266,68.16000366210938,2611400 +2024-04-22,67.8499984741211,68.25,65.69999694824219,67.30000305175781,2468600 +2024-04-23,71.18499755859375,71.66999816894531,68.86000061035156,68.86000061035156,2526700 +2024-04-24,69.69999694824219,72.9800033569336,68.45999908447266,71.80000305175781,3856500 +2024-04-25,69.20999908447266,69.77999877929688,65.62000274658203,66.45999908447266,4564800 +2024-04-26,73.81999969482422,74.58999633789062,69.97000122070312,70.08999633789062,5381300 +2024-04-29,72.98999786376953,73.66500091552734,71.52999877929688,72.63999938964844,3820200 +2024-04-30,70.56999969482422,73.27999877929688,70.51000213623047,72.36000061035156,3687000 +2024-05-01,69.73999786376953,72.3550033569336,69.37000274658203,70.7300033569336,2646000 +2024-05-02,72.47000122070312,73.05000305175781,70.68000030517578,71.25499725341797,2397900 +2024-05-03,75.06999969482422,75.27999877929688,72.5,73.0,2974600 +2024-05-06,76.8499984741211,77.55999755859375,75.30000305175781,75.80000305175781,2831200 +2024-05-07,77.08999633789062,78.27999877929688,75.31999969482422,76.4000015258789,3398300 +2024-05-08,74.0,76.62999725341797,73.62000274658203,75.7300033569336,6353600 +2024-05-09,84.69000244140625,88.5,80.66999816894531,83.27200317382812,15126900 +2024-05-10,86.43000030517578,87.95999908447266,84.80999755859375,85.73999786376953,4971000 +2024-05-13,86.37000274658203,87.12999725341797,83.51000213623047,87.05000305175781,5023700 +2024-05-14,83.44000244140625,83.88999938964844,80.01000213623047,81.12000274658203,7763200 +2024-05-15,84.05999755859375,84.38999938964844,82.52999877929688,84.0999984741211,5308100 +2024-05-16,83.2300033569336,84.5,82.70999908447266,83.83999633789062,4621400 +2024-05-17,82.48999786376953,83.91999816894531,81.91999816894531,83.25,3337200 +2024-05-20,84.56999969482422,85.1500015258789,81.42500305175781,82.5,6473600 +2024-05-21,84.0,84.93000030517578,83.0199966430664,84.54000091552734,4187100 +2024-05-22,80.0,84.58999633789062,79.5,83.9000015258789,4840500 +2024-05-23,79.26000213623047,81.78500366210938,77.9000015258789,81.51000213623047,3662300 +2024-05-24,82.1500015258789,82.27999877929688,78.37999725341797,79.43000030517578,5050400 +2024-05-28,83.2300033569336,85.33999633789062,82.55999755859375,83.83999633789062,6187200 +2024-05-29,83.88999938964844,84.37999725341797,81.44999694824219,82.12999725341797,2998200 +2024-05-30,82.5,84.2300033569336,82.08999633789062,83.51000213623047,3246500 +2024-05-31,81.4800033569336,83.09500122070312,78.22000122070312,82.98999786376953,6736000 +2024-06-03,82.69999694824219,83.41999816894531,79.06999969482422,83.05000305175781,3779300 +2024-06-04,81.63999938964844,85.44999694824219,79.86000061035156,83.0,4193400 +2024-06-05,83.66999816894531,84.5999984741211,81.83000183105469,82.19999694824219,4259500 +2024-06-06,83.2300033569336,87.08000183105469,82.19999694824219,83.66999816894531,4691500 +2024-06-07,81.91000366210938,83.33999633789062,80.80400085449219,82.4000015258789,3008800 +2024-06-10,80.37999725341797,83.0,79.08000183105469,81.18000030517578,3835600 +2024-06-11,77.3499984741211,79.6500015258789,72.1500015258789,79.6500015258789,9550300 +2024-06-12,76.54000091552734,79.3499984741211,73.62999725341797,79.1500015258789,6165500 +2024-06-13,75.6500015258789,77.2300033569336,74.37999725341797,76.54000091552734,3139200 +2024-06-14,77.5199966430664,77.66999816894531,74.9000015258789,75.41000366210938,2846300 +2024-06-17,78.45999908447266,79.4489974975586,76.73999786376953,77.66999816894531,3794600 +2024-06-18,80.83999633789062,81.0999984741211,78.45999908447266,78.52999877929688,4370300 +2024-06-20,77.18000030517578,82.66000366210938,76.33999633789062,81.5999984741211,4373400 +2024-06-21,78.58000183105469,78.72000122070312,75.12999725341797,77.0,4131600 +2024-06-24,78.05000305175781,78.33999633789062,76.37899780273438,77.73999786376953,3496400 +2024-06-25,81.20999908447266,81.76000213623047,78.44000244140625,78.44000244140625,4042500 +2024-06-26,80.4800033569336,82.25,79.88500213623047,80.72000122070312,2896400 +2024-06-27,83.12000274658203,83.55999755859375,80.0199966430664,80.58000183105469,3319300 +2024-06-28,83.22000122070312,84.3499984741211,82.30000305175781,83.5,10782600 +2024-07-01,84.81999969482422,85.26000213623047,82.41999816894531,85.12000274658203,3347400 +2024-07-02,83.68000030517578,85.38999938964844,82.62999725341797,84.20999908447266,3466500 +2024-07-03,86.95999908447266,87.0,83.69999694824219,83.7699966430664,2986800 +2024-07-05,86.80000305175781,91.91000366210938,85.31999969482422,87.51000213623047,5769600 +2024-07-08,85.18000030517578,87.91999816894531,83.12000274658203,87.31999969482422,2932300 +2024-07-09,84.70999908447266,86.20500183105469,84.04000091552734,85.6500015258789,1996300 +2024-07-10,84.36000061035156,85.27999877929688,82.06999969482422,85.0,2349700 +2024-07-11,82.01000213623047,85.05999755859375,80.87100219726562,85.0,2383300 +2024-07-12,84.86000061035156,85.23999786376953,81.83000183105469,82.22000122070312,1952400 +2024-07-15,87.93000030517578,88.45999908447266,84.69999694824219,85.7300033569336,3154300 +2024-07-16,86.52999877929688,89.26000213623047,86.19000244140625,88.62000274658203,2014000 +2024-07-17,80.19000244140625,84.36000061035156,79.13999938964844,84.05999755859375,4584300 +2024-07-18,80.93000030517578,82.25900268554688,78.80000305175781,81.98999786376953,2763500 +2024-07-19,81.80000305175781,82.33799743652344,79.9000015258789,80.38999938964844,1654500 +2024-07-22,83.23999786376953,83.87999725341797,81.91000366210938,83.25,1802300 +2024-07-23,83.80999755859375,85.27999877929688,82.75,83.5199966430664,1425200 +2024-07-24,78.68000030517578,82.8550033569336,78.55000305175781,81.48999786376953,2194700 +2024-07-25,76.16999816894531,78.20500183105469,73.08499908447266,77.77999877929688,4132000 +2024-07-26,77.52999877929688,78.81999969482422,76.56500244140625,78.81999969482422,1790400 +2024-07-29,76.8499984741211,79.0999984741211,76.30000305175781,78.22000122070312,2339500 +2024-07-30,74.83000183105469,78.38999938964844,74.12000274658203,76.98999786376953,3080500 +2024-07-31,77.0999984741211,78.05000305175781,76.41000366210938,77.62999725341797,2799900 +2024-08-01,75.08999633789062,81.62999725341797,74.61000061035156,78.88999938964844,3166100 +2024-08-02,68.72000122070312,71.55000305175781,68.08000183105469,70.5250015258789,4368000 +2024-08-05,67.13999938964844,68.72000122070312,60.66999816894531,62.09000015258789,3561700 +2024-08-06,69.0,70.5,67.31999969482422,68.98999786376953,4259000 +2024-08-07,67.19000244140625,73.0,66.97000122070312,72.0,7312900 +2024-08-08,76.7300033569336,76.86000061035156,66.16000366210938,70.05000305175781,9465900 +2024-08-09,77.37999725341797,78.1500015258789,72.80999755859375,76.5,4907300 +2024-08-12,74.76000213623047,78.19000244140625,74.12000274658203,77.58999633789062,4957300 +2024-08-13,79.79000091552734,80.16999816894531,75.88999938964844,76.33999633789062,3919500 +2024-08-14,84.63999938964844,85.5999984741211,80.13999938964844,80.13999938964844,6277900 +2024-08-15,85.58000183105469,86.94000244140625,84.19000244140625,86.01000213623047,3521100 +2024-08-16,86.3499984741211,87.0199966430664,83.61000061035156,84.43000030517578,2782200 +2024-08-19,85.81500244140625,86.30500030517578,84.16999816894531,86.0,1873300 +2024-08-20,86.58000183105469,88.7040023803711,85.0,85.6500015258789,2363900 +2024-08-21,90.88999938964844,91.0999984741211,86.29000091552734,86.58999633789062,3545900 +2024-08-22,89.0,92.5,88.69999694824219,91.4000015258789,3145700 +2024-08-23,90.19999694824219,91.30000305175781,88.31999969482422,90.11000061035156,1910200 +2024-08-26,89.88999938964844,92.33000183105469,89.56999969482422,89.98999786376953,2055200 +2024-08-27,90.30000305175781,90.88999938964844,87.62999725341797,88.98999786376953,1876100 +2024-08-28,88.0,89.80000305175781,87.11000061035156,88.9000015258789,3219400 +2024-08-29,91.61000061035156,93.69000244140625,88.29000091552734,88.29000091552734,4595100 +2024-08-30,92.87000274658203,93.69999694824219,90.69499969482422,92.0,4581600 +2024-09-03,88.12999725341797,92.80999755859375,87.77999877929688,92.62000274658203,3302500 +2024-09-04,87.87999725341797,89.8550033569336,85.41300201416016,87.37000274658203,2575400 +2024-09-05,88.19000244140625,89.41999816894531,86.55999755859375,86.55999755859375,2019200 +2024-09-06,84.56999969482422,88.56500244140625,82.51000213623047,88.19000244140625,4251000 +2024-09-09,86.30999755859375,88.19999694824219,84.7300033569336,85.88999938964844,3564600 +2024-09-10,86.2300033569336,88.27999877929688,85.2300033569336,87.9000015258789,2828300 +2024-09-11,97.56999969482422,98.0999984741211,87.12000274658203,87.55000305175781,7894700 +2024-09-12,105.61000061035156,106.44999694824219,97.3499984741211,97.3499984741211,9799100 +2024-09-13,112.58000183105469,112.87999725341797,105.94000244140625,106.8499984741211,8598400 +2024-09-16,116.25,116.97000122070312,110.9000015258789,111.4000015258789,6967200 +2024-09-17,123.63999938964844,124.76499938964844,117.26000213623047,118.16000366210938,9429300 +2024-09-18,123.16000366210938,125.75,120.63999938964844,123.30000305175781,7244700 +2024-09-19,124.0,128.19000244140625,122.41300201416016,126.5,6986000 +2024-09-20,126.08999633789062,126.68000030517578,123.51000213623047,124.0,9910700 +2024-09-23,126.12000274658203,127.41699981689453,124.58999633789062,125.76000213623047,3910300 +2024-09-24,129.0800018310547,130.38999938964844,125.88999938964844,126.51000213623047,4925200 +2024-09-25,130.7100067138672,131.41400146484375,128.1300048828125,129.33999633789062,4530400 +2024-09-26,128.1300048828125,133.0500030517578,125.62000274658203,133.0500030517578,4494900 +2024-09-27,127.75,128.9499969482422,126.66000366210938,128.9499969482422,2327100 +2024-09-30,130.5500030517578,131.14700317382812,126.52999877929688,127.51000213623047,3814900 +2024-10-01,130.64999389648438,131.66799926757812,128.00999450683594,130.7899932861328,2555900 +2024-10-02,131.36000061035156,132.02999877929688,128.5,129.85000610351562,2637200 +2024-10-03,135.25,135.2519989013672,130.5399932861328,130.8800048828125,3160900 +2024-10-04,139.66000366210938,140.02000427246094,135.5,137.5,3961200 +2024-10-07,139.9499969482422,142.27000427246094,137.1999969482422,138.85000610351562,3848900 +2024-10-08,143.50999450683594,143.9499969482422,139.89999389648438,141.3699951171875,2616000 +2024-10-09,143.39999389648438,144.49000549316406,140.14999389648438,142.9600067138672,4041800 +2024-10-10,144.83999633789062,145.67999267578125,141.10400390625,141.58999633789062,3846400 +2024-10-11,147.0,147.60000610351562,144.656005859375,144.83999633789062,4037700 +2024-10-14,145.3000030517578,148.47999572753906,140.9199981689453,141.27000427246094,5361000 +2024-10-15,143.80999755859375,146.77000427246094,143.30999755859375,144.6300048828125,4586200 +2024-10-16,144.85000610351562,145.10000610351562,139.39999389648438,144.1199951171875,4297500 +2024-10-17,143.0,146.74000549316406,142.72000122070312,146.30999755859375,2598900 +2024-10-18,145.22000122070312,146.02000427246094,141.35000610351562,144.14999389648438,2782700 +2024-10-21,158.85000610351562,159.80999755859375,148.00999450683594,148.27000427246094,5796500 +2024-10-22,158.9499969482422,163.07899475097656,157.9199981689453,161.27000427246094,3411500 +2024-10-23,159.39999389648438,165.3800048828125,157.8800048828125,160.16000366210938,4049400 +2024-10-24,159.0,162.72000122070312,158.0800018310547,160.55999755859375,2489100 +2024-10-25,161.6300048828125,164.14999389648438,159.91000366210938,161.4600067138672,2193300 +2024-10-28,166.18499755859375,166.74000549316406,162.1699981689453,163.30999755859375,2584900 +2024-10-29,172.24000549316406,172.5500030517578,166.57000732421875,167.97999572753906,2874200 +2024-10-30,171.64999389648438,174.4600067138672,170.8300018310547,173.22000122070312,2995100 +2024-10-31,169.38999938964844,171.30999755859375,164.75999450683594,170.0,2772800 +2024-11-01,163.52999877929688,171.17999267578125,163.02000427246094,171.13999938964844,3567900 +2024-11-04,159.11000061035156,162.4499969482422,158.3300018310547,161.77999877929688,4037600 +2024-11-05,165.17999267578125,167.42999267578125,160.52000427246094,161.7100067138672,4003600 +2024-11-06,168.5500030517578,176.99000549316406,166.97000122070312,175.22999572753906,6099600 +2024-11-07,246.52999877929688,257.42999267578125,228.10000610351562,230.0,18592800 +2024-11-08,290.010009765625,292.8599853515625,243.25,249.08999633789062,15031900 +2024-11-11,286.42999267578125,292.04998779296875,263.260009765625,291.1199951171875,10199300 +2024-11-12,289.0299987792969,291.32000732421875,277.32000732421875,281.0,6234700 +2024-11-13,283.9599914550781,291.4490051269531,278.19000244140625,290.0,4750300 +2024-11-14,284.489990234375,302.54998779296875,283.0350036621094,284.57000732421875,7161900 +2024-11-15,291.0899963378906,292.04998779296875,277.5,280.5,24367500 +2024-11-18,298.0,302.3999938964844,287.239990234375,293.1000061035156,5367300 +2024-11-19,321.19000244140625,323.5899963378906,293.6099853515625,295.2799987792969,5599000 +2024-11-20,325.2200012207031,342.5069885253906,319.5199890136719,327.6600036621094,7107500 +2024-11-21,318.239990234375,329.19000244140625,307.70001220703125,325.6199951171875,8502500 +2024-11-22,333.30999755859375,335.3900146484375,303.5,309.0,6876400 +2024-11-25,319.5899963378906,344.7699890136719,317.8599853515625,344.0,8052300 +2024-11-26,329.7699890136719,334.739990234375,320.3699951171875,324.4599914550781,4442200 +2024-11-27,328.55999755859375,329.3599853515625,309.32000732421875,325.1549987792969,4854000 +2024-11-29,336.75,343.75,331.8080139160156,332.5,2715200 +2024-12-02,340.5899963378906,347.6000061035156,335.7850036621094,335.7850036621094,3805700 +2024-12-03,366.54998779296875,372.57000732421875,338.0,338.0,7364800 +2024-12-04,373.70001220703125,384.5,368.0,373.0,5787200 +2024-12-05,379.07000732421875,397.4700012207031,370.3500061035156,373.70001220703125,6384100 +2024-12-06,401.5,417.635009765625,378.0,382.8800048828125,9922600 +2024-12-09,342.5400085449219,379.8999938964844,332.3500061035156,370.0,16231100 +2024-12-10,321.05999755859375,360.4599914550781,319.552001953125,342.1099853515625,9028300 +2024-12-11,338.2099914550781,339.1700134277344,313.92999267578125,327.6000061035156,7055400 +2024-12-12,326.2099914550781,340.6300048828125,324.0,336.20001220703125,4055400 +2024-12-13,324.4700012207031,337.625,321.0,326.0,4704100 +2024-12-16,343.9599914550781,350.0,326.0,326.1600036621094,8308300 +2024-12-17,337.8900146484375,342.4700012207031,320.4700012207031,340.5899963378906,6556400 +2024-12-18,313.07000732421875,344.0899963378906,308.1300048828125,339.0199890136719,6826600 +2024-12-19,318.739990234375,331.0,312.7099914550781,315.3999938964844,5507600 +2024-12-20,340.989990234375,343.20001220703125,311.1199951171875,313.20001220703125,8922500 +2024-12-23,344.82000732421875,350.20001220703125,331.5400085449219,347.6050109863281,2481700 +2024-12-24,341.8299865722656,348.4800109863281,341.3110046386719,345.0,1312400 +2024-12-26,346.7300109863281,350.2359924316406,336.3500061035156,341.3500061035156,1825300 +2024-12-27,335.1700134277344,345.04998779296875,326.68499755859375,345.0,2506500 +2024-12-30,335.3800048828125,341.239990234375,325.2099914550781,328.7300109863281,2291600 +2024-12-31,323.8299865722656,334.3500061035156,318.7200012207031,332.010009765625,2981700 +2025-01-02,341.7799987792969,342.4079895019531,316.25,331.05999755859375,4883300 +2025-01-03,350.6499938964844,352.1700134277344,336.7200012207031,341.4700012207031,4431800 +2025-01-06,354.92999267578125,362.45001220703125,346.0400085449219,358.8800048828125,3895700 +2025-01-07,330.0050048828125,347.0,313.6099853515625,345.67999267578125,6622400 +2025-01-08,329.20001220703125,340.5799865722656,317.3599853515625,332.6099853515625,3924200 +2025-01-10,318.4800109863281,321.8399963378906,308.20001220703125,315.0,4238400 +2025-01-13,315.67999267578125,317.7300109863281,307.0679931640625,310.0,3809100 +2025-01-14,321.0899963378906,328.5,316.82000732421875,324.5199890136719,3227500 +2025-01-15,335.0299987792969,342.3599853515625,329.4049987792969,335.0,3825400 +2025-01-16,332.010009765625,343.17999267578125,331.6700134277344,333.7300109863281,2496200 +2025-01-17,342.3399963378906,347.3900146484375,336.7699890136719,341.82000732421875,4175700 +2025-01-21,338.3900146484375,354.9049987792969,337.1199951171875,349.0,4919800 +2025-01-22,361.7200012207031,371.77398681640625,343.17999267578125,345.0,4582100 +2025-01-23,362.5199890136719,367.7850036621094,352.4599914550781,354.17999267578125,3120100 +2025-01-24,363.1000061035156,368.8500061035156,360.6000061035156,364.29998779296875,2833400 +2025-01-27,343.0199890136719,350.5799865722656,330.5400085449219,341.6600036621094,5825400 +2025-01-28,360.75,368.3800048828125,342.0799865722656,347.6300048828125,4522300 +2025-01-29,366.3399963378906,370.6390075683594,352.2200012207031,360.0,3346800 +2025-01-30,365.510009765625,385.6600036621094,357.010009765625,377.989990234375,4018500 +2025-01-31,369.5899963378906,379.0,364.5,371.0400085449219,3357600 +2025-02-03,365.44000244140625,369.4800109863281,349.2200012207031,353.510009765625,3549600 +2025-02-04,380.260009765625,390.67999267578125,370.75,373.7699890136719,5255600 +2025-02-05,368.2699890136719,378.6499938964844,363.010009765625,377.3699951171875,3978500 +2025-02-06,380.6300048828125,381.7900085449219,365.6000061035156,369.57000732421875,3014500 +2025-02-07,375.7200012207031,393.6300048828125,374.5799865722656,385.8800048828125,3119700 +2025-02-10,384.3999938964844,396.614990234375,373.20001220703125,387.20001220703125,4593700 +2025-02-11,375.25,383.3399963378906,366.9599914550781,381.6000061035156,4253900 +2025-02-12,380.32000732421875,390.2099914550781,372.00299072265625,375.92999267578125,9393000 +2025-02-13,471.6700134277344,525.1500244140625,449.0,499.3399963378906,19398900 +2025-02-14,510.1300048828125,516.989990234375,462.79998779296875,473.55999755859375,11344800 +2025-02-18,496.0,519.7899780273438,487.989990234375,514.0999755859375,7330000 +2025-02-19,494.1700134277344,507.0,481.1199951171875,502.739990234375,5052300 +2025-02-20,450.010009765625,494.5400085449219,427.1300048828125,488.9100036621094,11209300 +2025-02-21,415.30999755859375,456.760009765625,412.18499755859375,452.7699890136719,7658100 +2025-02-24,410.45001220703125,426.489990234375,395.010009765625,411.8599853515625,8103500 +2025-02-25,377.05999755859375,406.70001220703125,367.1199951171875,406.70001220703125,11330300 +2025-02-26,331.0,343.1700134277344,288.9150085449219,328.4700012207031,31783300 +2025-02-27,320.489990234375,349.92401123046875,310.0,346.44000244140625,11883600 +2025-02-28,325.739990234375,331.55999755859375,306.1000061035156,313.0,9099600 +2025-03-03,337.3399963378906,359.70001220703125,332.0,350.239990234375,10950600 +2025-03-04,327.2300109863281,341.0,307.5660095214844,324.0,9225400 +2025-03-05,318.0,326.27398681640625,310.510009765625,323.0,8128700 +2025-03-06,259.6300048828125,306.5,258.5140075683594,305.760009765625,16179500 +2025-03-07,270.4800109863281,278.6000061035156,247.5,256.1449890136719,14654300 +2025-03-10,238.0800018310547,255.60000610351562,234.55999755859375,246.52999877929688,16713700 +2025-03-11,257.760009765625,261.45001220703125,236.0,239.8000030517578,12850800 +2025-03-12,272.5899963378906,292.42999267578125,261.010009765625,285.0,12741300 +2025-03-13,272.0,275.0,260.92999267578125,272.875,7266100 +2025-03-14,292.8900146484375,298.010009765625,282.3900146484375,284.17999267578125,10061800 +2025-03-17,306.8500061035156,314.79998779296875,293.510009765625,297.760009765625,8871500 +2025-03-18,278.8399963378906,302.0,275.7200012207031,299.5,8636600 +2025-03-19,297.0299987792969,300.20001220703125,277.5,286.19500732421875,6935500 +2025-03-20,306.739990234375,315.4079895019531,292.4049987792969,293.82000732421875,8401500 +2025-03-21,314.0299987792969,315.2699890136719,296.1300048828125,301.04998779296875,9505700 +2025-03-24,339.7200012207031,342.3800048828125,323.5,328.0899963378906,9119900 +2025-03-25,346.2900085449219,352.0,332.0400085449219,341.0,7757500 +2025-03-26,327.6199951171875,343.20001220703125,322.1000061035156,340.5,8294500 +2025-03-27,261.70001220703125,326.010009765625,252.50999450683594,322.04998779296875,20188900 +2025-03-28,272.3800048828125,286.9100036621094,264.07000732421875,286.80999755859375,15471800 +2025-03-31,264.9700012207031,268.3999938964844,244.0,255.92999267578125,10510400 +2025-04-01,282.70001220703125,284.79998779296875,257.0,264.2200012207031,7624200 +2025-04-02,290.3900146484375,299.7200012207031,272.8999938964844,273.3299865722656,7313600 +2025-04-03,261.9800109863281,268.0,249.0800018310547,264.5199890136719,8959500 +2025-04-04,219.3699951171875,245.97000122070312,208.50999450683594,243.3800048828125,16840300 +2025-04-07,232.22000122070312,253.61000061035156,200.5,203.77999877929688,13612300 +2025-04-08,235.27999877929688,261.60699462890625,227.1999969482422,255.0500030517578,11230600 +2025-04-09,274.9599914550781,280.989990234375,218.28700256347656,234.30999755859375,13063800 +2025-04-10,263.8299865722656,278.4800109863281,250.50999450683594,270.0,10364800 +2025-04-11,249.9499969482422,263.0,239.0,258.2950134277344,8966900 +2025-04-14,236.07000732421875,262.0799865722656,234.38999938964844,258.94000244140625,7438400 +2025-04-15,245.47000122070312,248.17999267578125,230.52000427246094,235.60000610351562,6784600 +2025-04-16,229.80999755859375,241.9499969482422,224.39999389648438,234.52499389648438,7300800 +2025-04-17,238.22000122070312,239.9499969482422,226.10000610351562,231.38999938964844,5286000 +2025-04-21,228.1300048828125,238.4949951171875,222.02000427246094,233.52999877929688,5778200 +2025-04-22,237.7100067138672,243.55999755859375,227.0500030517578,232.0,6342300 +2025-04-23,252.35000610351562,268.0,250.10000610351562,255.5050048828125,7302600 +2025-04-24,267.8800048828125,275.9200134277344,252.0,253.72500610351562,6773100 +2025-04-25,276.8299865722656,278.8800048828125,266.5050048828125,272.29998779296875,5770400 +2025-04-28,284.9800109863281,286.8280029296875,273.5,278.6400146484375,6313800 +2025-04-29,288.8800048828125,291.3900146484375,281.2699890136719,286.5,4797100 +2025-04-30,269.30999755859375,273.80999755859375,246.0,247.91000366210938,9277900 +2025-05-01,279.489990234375,288.25,276.79998779296875,282.0,5912200 +2025-05-02,307.5799865722656,309.3420104980469,286.8450012207031,291.989990234375,6998000 +2025-05-05,301.8399963378906,306.7900085449219,295.4100036621094,299.19000244140625,4444600 +2025-05-06,304.6199951171875,307.2699890136719,290.9599914550781,294.6449890136719,4539500 +2025-05-07,303.4599914550781,304.5199890136719,292.8699951171875,300.54998779296875,11595900 +2025-05-08,339.510009765625,357.6400146484375,335.1300048828125,344.0,14355300 +2025-05-09,328.5400085449219,351.375,328.5199890136719,343.0450134277344,7760100 +2025-05-12,347.8999938964844,358.6700134277344,343.3699951171875,350.55999755859375,7826600 +2025-05-13,370.1000061035156,380.70001220703125,347.70001220703125,348.5299987792969,9729200 +2025-05-14,376.5400085449219,379.5799865722656,368.45001220703125,373.489990234375,6324300 +2025-05-15,366.6099853515625,378.2300109863281,361.44000244140625,373.94000244140625,6322200 +2025-05-16,362.3399963378906,373.7300109863281,358.0,369.260009765625,4740200 +2025-05-19,370.6300048828125,375.8399963378906,354.010009765625,355.2699890136719,6224300 +2025-05-20,363.05499267578125,371.447998046875,360.864013671875,371.447998046875,5533500 +2025-05-21,358.3500061035156,374.57000732421875,358.0,359.67999267578125,7567100 +2025-05-22,351.4700012207031,367.4700012207031,350.8169860839844,360.5199890136719,5329400 +2025-05-23,354.2900085449219,356.54998779296875,340.20001220703125,341.7200012207031,5318800 +2025-05-27,380.9100036621094,384.3599853515625,355.1600036621094,362.0,7683400 +2025-05-28,390.260009765625,392.8699951171875,375.1199951171875,381.3800048828125,6778300 +2025-05-29,384.2300109863281,402.90301513671875,381.42999267578125,400.0950012207031,5144700 +2025-05-30,393.0,394.239990234375,372.5299987792969,386.8699951171875,7840300 +2025-06-02,401.9100036621094,402.25,381.6000061035156,392.30999755859375,6202100 +2025-06-03,398.510009765625,408.0,390.4100036621094,401.9100036621094,4651300 +2025-06-04,416.5199890136719,417.45001220703125,398.2099914550781,398.3900146484375,4804600 +2025-06-05,414.1400146484375,428.989990234375,406.7799987792969,414.1700134277344,5973700 +2025-06-06,417.8900146484375,426.5199890136719,413.2300109863281,421.0,5495500 +2025-06-09,383.6000061035156,404.5,382.8500061035156,401.25,7829200 +2025-06-10,383.6099853515625,396.7699890136719,374.67999267578125,390.0,4949300 +2025-06-11,383.42999267578125,387.95001220703125,377.8999938964844,386.29998779296875,3598500 +2025-06-12,380.5799865722656,384.1000061035156,362.45001220703125,380.5,6520300 diff --git a/tradingagents/dataflows/googlenews_utils.py b/tradingagents/dataflows/googlenews_utils.py index 6c799ea5..19ad19c9 100644 --- a/tradingagents/dataflows/googlenews_utils.py +++ b/tradingagents/dataflows/googlenews_utils.py @@ -74,10 +74,14 @@ def getNewsData(query, start_date, end_date): for el in results_on_page: try: link = el.find("a")["href"] - title = el.select_one("div.MBeuO").get_text() - snippet = el.select_one(".GI74Re").get_text() - date = el.select_one(".LfVVr").get_text() - source = el.select_one(".NUnG9d span").get_text() + title_el = el.select_one("div.MBeuO") + title = title_el.get_text() if title_el else "" + snippet_el = el.select_one(".GI74Re") + snippet = snippet_el.get_text() if snippet_el else "" + date_el = el.select_one(".LfVVr") + date = date_el.get_text() if date_el else "" + source_el = el.select_one(".NUnG9d span") + source = source_el.get_text() if source_el else "" news_results.append( { "link": link, diff --git a/tradingagents/graph/setup.py b/tradingagents/graph/setup.py index f745fd18..b3b7059c 100644 --- a/tradingagents/graph/setup.py +++ b/tradingagents/graph/setup.py @@ -1,6 +1,6 @@ # TradingAgents/graph/setup.py -from typing import Dict, Any, List +from typing import Dict, Any from langchain_openai import ChatOpenAI from langgraph.graph import END, StateGraph, START from langgraph.prebuilt import ToolNode @@ -40,7 +40,9 @@ class GraphSetup: self.risk_manager_memory = risk_manager_memory self.conditional_logic = conditional_logic - def setup_graph(self, selected_analysts: List[str]): + def setup_graph( + self, selected_analysts=["market", "social", "news", "fundamentals"] + ): """Set up and compile the agent workflow graph. Args: diff --git a/web/backend/eval_results/APP/TradingAgentsStrategy_logs/full_states_log.json b/web/backend/eval_results/APP/TradingAgentsStrategy_logs/full_states_log.json new file mode 100644 index 00000000..e33db174 --- /dev/null +++ b/web/backend/eval_results/APP/TradingAgentsStrategy_logs/full_states_log.json @@ -0,0 +1,27 @@ +{ + "2025-06-13": { + "company_of_interest": "APP", + "trade_date": "2025-06-13", + "market_report": "### APP \uc8fc\uc2dd \ubd84\uc11d \ubcf4\uace0\uc11c (2025\ub144 6\uc6d4 13\uc77c \uae30\uc900)\n\n#### 1. \uac00\uaca9 \ub3d9\ud5a5\nAPP\uc758 \ucd5c\uadfc \uc8fc\uac00\ub294 2025\ub144 6\uc6d4 12\uc77c \uae30\uc900\uc73c\ub85c 380.58 \ub2ec\ub7ec\ub85c \ub9c8\uac10\ud558\uc600\uc73c\uba70, \ucd5c\uadfc \ud55c \ub2ec\uac04\uc758 \uac00\uaca9 \ubcc0\ub3d9\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4:\n- **\ucd5c\uace0\uac00**: 428.99 \ub2ec\ub7ec (2025\ub144 6\uc6d4 5\uc77c)\n- **\ucd5c\uc800\uac00**: 276.8 \ub2ec\ub7ec (2025\ub144 5\uc6d4 1\uc77c)\n\nAPP\uc758 \uc8fc\uac00\ub294 5\uc6d4 \ucd08\uc5d0 \ube44\ud574 \uae09\uaca9\ud788 \uc0c1\uc2b9\ud558\uc600\uc73c\uba70, \ud2b9\ud788 5\uc6d4 8\uc77c\uc5d0 339.51 \ub2ec\ub7ec\ub85c \uae09\ub4f1\ud55c \ud6c4, 6\uc6d4 \ucd08\uae4c\uc9c0 \uc0c1\uc2b9\uc138\ub97c \uc774\uc5b4\uac14\uc2b5\ub2c8\ub2e4. \uadf8\ub7ec\ub098 6\uc6d4 \uc911\uc21c\uc5d0\ub294 \uc57d\uac04\uc758 \uc870\uc815\uc138\ub97c \ubcf4\uc774\uace0 \uc788\uc2b5\ub2c8\ub2e4.\n\n#### 2. \uae30\uc220\uc801 \uc9c0\ud45c \ubd84\uc11d\n\ub2e4\uc74c\uc740 APP\uc758 \uc8fc\uc694 \uae30\uc220\uc801 \uc9c0\ud45c \ubd84\uc11d\uc785\ub2c8\ub2e4:\n\n| \uc9c0\ud45c | \uac12 | \ud574\uc11d |\n|------|-----|------|\n| **50 SMA** | 319.97 | \uc911\uae30 \ucd94\uc138 \uc9c0\ud45c\ub85c, \ud604\uc7ac \uc8fc\uac00\ub294 \uc774 \uc9c0\ud45c\ub97c \uc0c1\ud68c\ud558\uace0 \uc788\uc5b4 \uc0c1\uc2b9 \ucd94\uc138\ub97c \ub098\ud0c0\ub0c5\ub2c8\ub2e4. |\n| **200 SMA** | 279.12 | \uc7a5\uae30 \ucd94\uc138 \uc9c0\ud45c\ub85c, \ud604\uc7ac \uc8fc\uac00\uac00 \uc774 \uc9c0\ud45c\ub97c \ud06c\uac8c \uc0c1\ud68c\ud558\uace0 \uc788\uc5b4 \uac15\ud55c \uc0c1\uc2b9\uc138\ub97c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. |\n| **10 EMA** | 389.06 | \ub2e8\uae30 \ucd94\uc138 \uc9c0\ud45c\ub85c, \ucd5c\uadfc \uc8fc\uac00\uac00 \uc774 \uc9c0\ud45c\ub97c \ud558\ud68c\ud558\uace0 \uc788\uc5b4 \ub2e8\uae30 \uc870\uc815 \uac00\ub2a5\uc131\uc744 \uc2dc\uc0ac\ud569\ub2c8\ub2e4. |\n| **MACD** | 18.33 | \ubaa8\uba58\ud140 \uc9c0\ud45c\ub85c, \uc591\uc218 \uac12\uc744 \uc720\uc9c0\ud558\uace0 \uc788\uc5b4 \uc0c1\uc2b9 \ubaa8\uba58\ud140\uc744 \ub098\ud0c0\ub0c5\ub2c8\ub2e4. |\n| **MACD Signal** | 22.98 | MACD \uc2e0\ud638\uc120\uc73c\ub85c, \ud604\uc7ac MACD\uac00 \uc2e0\ud638\uc120\uc744 \ud558\ud68c\ud558\uace0 \uc788\uc5b4 \ub2e8\uae30 \uc870\uc815 \uac00\ub2a5\uc131\uc744 \uc2dc\uc0ac\ud569\ub2c8\ub2e4. |\n| **MACD Histogram** | -4.65 | MACD\uc640 \uc2e0\ud638\uc120 \uac04\uc758 \ucc28\uc774\ub97c \ub098\ud0c0\ub0b4\uba70, \uc74c\uc218\ub85c \uc804\ud658\ub418\uc5b4 \ubaa8\uba58\ud140 \uc57d\ud654\ub97c \uc2dc\uc0ac\ud569\ub2c8\ub2e4. |\n| **RSI** | 54.99 | \uc0c1\ub300 \uac15\ub3c4 \uc9c0\uc218\ub85c, 50\uc744 \uc0c1\ud68c\ud558\uc5ec \uc911\ub9bd\uc801\uc778 \uc0c1\ud0dc\ub97c \ub098\ud0c0\ub0b4\uba70 \uacfc\ub9e4\ub3c4/\uacfc\ub9e4\uc218 \uad6c\uac04\uc5d0 \uc788\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. |\n| **ATR** | 21.11 | \ud3c9\uade0 \uc9c4\ud3ed\uc73c\ub85c, \ud604\uc7ac \uc2dc\uc7a5\uc758 \ubcc0\ub3d9\uc131\uc774 \ub2e4\uc18c \ub192\uc740 \ud3b8\uc785\ub2c8\ub2e4. |\n\n#### 3. \uc885\ud569 \ubd84\uc11d\n- **\ucd94\uc138**: APP\ub294 \uc911\uae30 \ubc0f \uc7a5\uae30 \ucd94\uc138 \uc9c0\ud45c\uc778 50 SMA\uc640 200 SMA \ubaa8\ub450\uc5d0\uc11c \uc0c1\uc2b9\uc138\ub97c \ubcf4\uc774\uace0 \uc788\uc73c\uba70, \uc774\ub294 \uac15\ud55c \uc0c1\uc2b9 \ucd94\uc138\ub97c \ub098\ud0c0\ub0c5\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \ub2e8\uae30\uc801\uc73c\ub85c 10 EMA\uac00 \uc8fc\uac00\ub97c \ud558\ud68c\ud558\uace0 \uc788\uc5b4 \uc870\uc815 \uac00\ub2a5\uc131\uc774 \uc874\uc7ac\ud569\ub2c8\ub2e4.\n- **\ubaa8\uba58\ud140**: MACD\uc640 RSI\ub294 \uc0c1\uc2b9 \ubaa8\uba58\ud140\uc744 \ub098\ud0c0\ub0b4\uace0 \uc788\uc73c\ub098, MACD \ud788\uc2a4\ud1a0\uadf8\ub7a8\uc774 \uc74c\uc218\ub85c \uc804\ud658\ub418\uba74\uc11c \ubaa8\uba58\ud140 \uc57d\ud654\ub97c \uc2dc\uc0ac\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.\n- **\ubcc0\ub3d9\uc131**: ATR \uac12\uc774 \ub192\uc544 \ud604\uc7ac \uc2dc\uc7a5\uc758 \ubcc0\ub3d9\uc131\uc774 \ud06c\uba70, \uc774\ub294 \ud22c\uc790\uc790\ub4e4\uc774 \uc8fc\uc758\ud574\uc57c \ud560 \uc2e0\ud638\uc785\ub2c8\ub2e4.\n\n### \uacb0\ub860\nAPP\uc758 \uc8fc\uac00\ub294 \ud604\uc7ac \uac15\ud55c \uc0c1\uc2b9\uc138\ub97c \ubcf4\uc774\uace0 \uc788\uc73c\ub098, \ub2e8\uae30 \uc870\uc815 \uac00\ub2a5\uc131\uc774 \uc874\uc7ac\ud569\ub2c8\ub2e4. \ub530\ub77c\uc11c, \ud22c\uc790\uc790\ub4e4\uc740 \uc2dc\uc7a5\uc758 \ubcc0\ub3d9\uc131\uc744 \uace0\ub824\ud558\uc5ec \uc2e0\uc911\ud55c \uc811\uadfc\uc774 \ud544\uc694\ud569\ub2c8\ub2e4.\n\n---\n\n| \uc9c0\ud45c | \ud604\uc7ac \uac12 | \ud574\uc11d |\n|------|---------|------|\n| 50 SMA | 319.97 | \uc0c1\uc2b9 \ucd94\uc138 \ud655\uc778 |\n| 200 SMA | 279.12 | \uac15\ud55c \uc0c1\uc2b9\uc138 |\n| 10 EMA | 389.06 | \ub2e8\uae30 \uc870\uc815 \uac00\ub2a5\uc131 |\n| MACD | 18.33 | \uc0c1\uc2b9 \ubaa8\uba58\ud140 |\n| MACD Signal | 22.98 | \ub2e8\uae30 \uc870\uc815 \uac00\ub2a5\uc131 |\n| MACD Histogram | -4.65 | \ubaa8\uba58\ud140 \uc57d\ud654 |\n| RSI | 54.99 | \uc911\ub9bd\uc801 \uc0c1\ud0dc |\n| ATR | 21.11 | \ub192\uc740 \ubcc0\ub3d9\uc131 |\n\nFINAL TRANSACTION PROPOSAL: **HOLD**", + "sentiment_report": "", + "news_report": "### \ucd5c\uadfc \uc138\uacc4 \uacbd\uc81c \ubc0f \uac70\ub798 \ub3d9\ud5a5 \ubcf4\uace0\uc11c (2025\ub144 6\uc6d4 13\uc77c \uae30\uc900)\n\n\ucd5c\uadfc \uc77c\uc8fc\uc77c(2025\ub144 6\uc6d4 6\uc77c~13\uc77c) \ub3d9\uc548 \uc5ec\ub7ec \uac00\uc9c0 \uac70\uc2dc\uacbd\uc81c\uc801 \uc0ac\uac74\ub4e4\uc774 \ubc1c\uc0dd\ud558\uc600\uc73c\uba70, \uc774\ub294 \uac70\ub798 \uacb0\uc815\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc544\ub798\ub294 \uc8fc\uc694 \ub3d9\ud5a5\uacfc \uc0ac\uac74\ub4e4\uc5d0 \ub300\ud55c \ubd84\uc11d\uc785\ub2c8\ub2e4.\n\n#### 1. \uc9c0\uc815\ud559\uc801 \uc0ac\uac74\n- **\uc911\ub3d9 \uae34\uc7a5 \uace0\uc870**: 2025\ub144 6\uc6d4 13\uc77c, \uc774\uc2a4\ub77c\uc5d8\uc774 \uc774\ub780\uc758 \ud575 \uc2dc\uc124\uc5d0 \ub300\ud55c \ub300\uaddc\ubaa8 \uad70\uc0ac \uc791\uc804\uc744 \uac10\ud589\ud558\uc600\uc2b5\ub2c8\ub2e4. \uc774\ub85c \uc778\ud574 \uc9c0\uc5ed \uae34\uc7a5\uc774 \uace0\uc870\ub418\uc5c8\uace0, \uc774\ub294 \uc720\uac00 \uc0c1\uc2b9\uc73c\ub85c \uc774\uc5b4\uc84c\uc2b5\ub2c8\ub2e4. \ubbf8\uad6d \uc6d0\uc720 \uac00\uaca9\uc740 8.2% \uc0c1\uc2b9\ud558\uc5ec \ubc30\ub7f4\ub2f9 73.61\ub2ec\ub7ec\uc5d0 \ub3c4\ub2ec\ud558\uc600\uace0, \ube0c\ub80c\ud2b8\uc720\ub294 74.88\ub2ec\ub7ec\ub85c \uc99d\uac00\ud588\uc2b5\ub2c8\ub2e4.\n\n#### 2. \uc2dc\uc7a5 \ubc18\uc751\n- **\ud1b5\ud654 \uc2dc\uc7a5**: \ubbf8\uad6d \ub2ec\ub7ec\ub294 3\ub144 \ub9cc\uc5d0 \uac00\uc7a5 \ub0ae\uc740 \uc218\uc900\uc73c\ub85c \ud558\ub77d\ud558\uc600\uc73c\uba70, \uc774\ub294 \ubbf8\uad6d\uc758 \uc778\ud50c\ub808\uc774\uc158 \ub454\ud654\uc640 \uc5f0\ubc29\uc900\ube44\uc81c\ub3c4\uc758 \uae08\ub9ac \uc778\ud558 \uae30\ub300\uac10\uc5d0 \uc601\ud5a5\uc744 \ubc1b\uc558\uc2b5\ub2c8\ub2e4.\n- **\uc8fc\uc2dd \uc2dc\uc7a5**: \ubbf8\uad6d \uc8fc\uc2dd \uc9c0\uc218\ub294 \ud63c\uc870\uc138\ub97c \ubcf4\uc600\uc2b5\ub2c8\ub2e4. S&P 500\uc740 0.4% \uc0c1\uc2b9\ud558\uc600\uace0, \ub2e4\uc6b0\uc874\uc2a4\ub294 0.2% \uc0c1\uc2b9\ud588\uc73c\uba70, \ub098\uc2a4\ub2e5\ub3c4 0.2% \uc0c1\uc2b9\ud588\uc2b5\ub2c8\ub2e4. \ubc18\uba74, \uc720\ub7fd \uc2dc\uc7a5\uc740 \uc911\ub3d9 \uae34\uc7a5\uc73c\ub85c \uc778\ud574 \ud558\ub77d\uc138\ub97c \ubcf4\uc600\uc2b5\ub2c8\ub2e4.\n\n#### 3. \uc6d0\uc790\uc7ac \uc2dc\uc7a5\n- **\uc720\uac00**: \uc9c0\uc815\ud559\uc801 \uae34\uc7a5\uc73c\ub85c \uc778\ud574 \uc720\uac00\uac00 \uae09\ub4f1\ud558\uc600\uc73c\uba70, \uc774\ub294 \uc6d0\uc790\uc7ac \uc2dc\uc7a5\uc5d0 \ud070 \uc601\ud5a5\uc744 \ubbf8\ucce4\uc2b5\ub2c8\ub2e4.\n- **\uae08 \uac00\uaca9**: \uc548\uc804 \uc790\uc0b0\uc73c\ub85c \uc5ec\uaca8\uc9c0\ub294 \uae08\uc758 \uac00\uaca9\ub3c4 \uc0c1\uc2b9\ud558\uc600\uc73c\uba70, SPDR \uae08 ETF(GLD)\ub294 \uc804\uc77c \ub300\ube44 1.23% \uc0c1\uc2b9\ud558\uc5ec 312.20\ub2ec\ub7ec\uc5d0 \uac70\ub798\ub418\uace0 \uc788\uc2b5\ub2c8\ub2e4.\n\n#### 4. \uc8fc\uc694 \uc774\ubca4\ud2b8\n- **G7 \uc815\uc0c1 \ud68c\ub2f4**: 2025\ub144 6\uc6d4 15\uc77c\ubd80\ud130 17\uc77c\uae4c\uc9c0 \uce90\ub098\ub2e4 \uc54c\ubc84\ud0c0\uc8fc \uce74\ub098\ub098\uc2a4\ud0a4\uc2a4\uc5d0\uc11c \uc81c51\ucc28 G7 \uc815\uc0c1 \ud68c\ub2f4\uc774 \uc608\uc815\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \uc8fc\uc694 \uc9c0\ub3c4\uc790\ub4e4\uc774 \ucc38\uc11d\ud560 \uac83\uc73c\ub85c \uc608\uc0c1\ub418\uba70, \uc774\ub294 \uae00\ub85c\ubc8c \uacbd\uc81c\uc5d0 \uc911\uc694\ud55c \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n### APP \uad00\ub828 \ucd5c\uadfc \ub274\uc2a4 (2025\ub144 6\uc6d4 6\uc77c~13\uc77c)\n- **APP\uc758 Toss \ud50c\ub7ab\ud3fc**: APP\ub294 Toss \ud50c\ub7ab\ud3fc\uc5d0\uc11c '\uc571 \uc778 \uc571' \ud615\ud0dc\ub85c \uc0c8\ub85c\uc6b4 \uae30\ub2a5\uc744 \ucd94\uac00\ud558\uc600\uc73c\uba70, \uc774\ub294 \uc0ac\uc6a9\uc790\uc5d0\uac8c \ub354 \ub098\uc740 \uacbd\ud5d8\uc744 \uc81c\uacf5\ud560 \uac83\uc73c\ub85c \uae30\ub300\ub429\ub2c8\ub2e4.\n- **Apple Games \uc571 \ucd9c\uc2dc**: Apple\uc740 'Apple Games'\ub77c\ub294 \uc0c8\ub85c\uc6b4 \uc571\uc744 \ucd9c\uc2dc\ud558\uc600\uc73c\uba70, \uc774\ub294 \uc0ac\uc6a9\uc790\uac00 App Store\uc5d0\uc11c \ub2e4\uc6b4\ub85c\ub4dc\ud55c \ubaa8\ub4e0 \uac8c\uc784\uc744 \uad00\ub9ac\ud558\uace0 \uc990\uae38 \uc218 \uc788\ub3c4\ub85d \ub3d5\uc2b5\ub2c8\ub2e4.\n- **\ubc95\uc801 \uc18c\uc1a1**: \ud55c\uad6d\uc758 \ub450 \ucd9c\ud310 \ud611\ud68c\uac00 \ubbf8\uad6d\uc5d0\uc11c Google\uacfc Apple\uc744 \uc0c1\ub300\ub85c \uc778\uc571 \uad6c\ub9e4 \uac15\uc81c\uc5d0 \ub300\ud55c \uc9d1\ub2e8 \uc18c\uc1a1\uc744 \uc81c\uae30\ud558\uc600\uc2b5\ub2c8\ub2e4.\n\n### \uacb0\ub860\n\ucd5c\uadfc\uc758 \uc9c0\uc815\ud559\uc801 \uc0ac\uac74\uacfc \uacbd\uc81c\uc801 \ubcc0\ud654\ub294 \uac70\ub798\uc790\ub4e4\uc5d0\uac8c \uc911\uc694\ud55c \uc2e0\ud638\ub97c \uc81c\uacf5\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ud2b9\ud788 \uc911\ub3d9\uc758 \uae34\uc7a5 \uace0\uc870\ub294 \uc6d0\uc790\uc7ac \uc2dc\uc7a5\uc5d0 \ud070 \uc601\ud5a5\uc744 \ubbf8\uce58\uace0 \uc788\uc73c\uba70, \ud1b5\ud654 \ubc0f \uc8fc\uc2dd \uc2dc\uc7a5\uc5d0\uc11c\ub3c4 \ud63c\uc870\uc138\uac00 \ub098\ud0c0\ub098\uace0 \uc788\uc2b5\ub2c8\ub2e4. APP\uc640 \uad00\ub828\ub41c \ub274\uc2a4\ub294 \uae30\uc220 \ubc0f \ud50c\ub7ab\ud3fc\uc758 \ubcc0\ud654\uac00 \uc2dc\uc7a5\uc5d0 \ubbf8\uce58\ub294 \uc601\ud5a5\uc744 \ubcf4\uc5ec\uc8fc\uace0 \uc788\uc2b5\ub2c8\ub2e4.\n\n| \uc8fc\uc694 \uc0ac\ud56d | \ub0b4\uc6a9 |\n|-----------|------|\n| **\uc911\ub3d9 \uae34\uc7a5** | \uc774\ub780 \ud575 \uc2dc\uc124\uc5d0 \ub300\ud55c \uc774\uc2a4\ub77c\uc5d8\uc758 \uad70\uc0ac \uc791\uc804 |\n| **\uc720\uac00 \uc0c1\uc2b9** | \ubbf8\uad6d \uc6d0\uc720 8.2% \uc0c1\uc2b9, \ubc30\ub7f4\ub2f9 73.61\ub2ec\ub7ec |\n| **\ub2ec\ub7ec \ud558\ub77d** | 3\ub144 \ub9cc\uc5d0 \ucd5c\uc800 \uc218\uc900 |\n| **\uc8fc\uc2dd \uc2dc\uc7a5** | S&P 500 +0.4%, \ub2e4\uc6b0\uc874\uc2a4 +0.2%, \ub098\uc2a4\ub2e5 +0.2% |\n| **\uae08 \uac00\uaca9 \uc0c1\uc2b9** | SPDR \uae08 ETF 1.23% \uc0c1\uc2b9 |\n| **G7 \uc815\uc0c1 \ud68c\ub2f4** | 6\uc6d4 15-17\uc77c \uce90\ub098\ub2e4\uc5d0\uc11c \uac1c\ucd5c \uc608\uc815 |\n| **APP \ub274\uc2a4** | Toss \ud50c\ub7ab\ud3fc \uae30\ub2a5 \ucd94\uac00, Apple Games \uc571 \ucd9c\uc2dc, Google\uacfc Apple\uc5d0 \ub300\ud55c \ubc95\uc801 \uc18c\uc1a1 |\n\n\uc774 \ubcf4\uace0\uc11c\ub294 \uac70\ub798\uc790\ub4e4\uc774 \ud604\uc7ac\uc758 \uacbd\uc81c \uc0c1\ud669\uc744 \uc774\ud574\ud558\uace0, \ud5a5\ud6c4 \uac70\ub798 \uacb0\uc815\uc744 \ub0b4\ub9ac\ub294 \ub370 \ub3c4\uc6c0\uc774 \ub420 \uc218 \uc788\ub3c4\ub85d \uc791\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4.", + "fundamentals_report": "### Comprehensive Report on Applovin Corporation (APP)\n\n#### Company Overview\nApplovin Corporation (APP) is a technology company that specializes in mobile app development and monetization. The company has shown remarkable growth in its financial performance over the past year, indicating a strong position in the market.\n\n#### Financial Performance\n- **Earnings Per Share (EPS)**: Increased by **354%** over the past year.\n- **Revenue Growth**: Grew by **43.44%** year-over-year.\n- **Future Projections**:\n - EPS is expected to grow at an annual rate of **3.85%**.\n - Revenue is projected to increase by **12.37%** annually.\n\n#### Stock Market Information (as of June 13, 2025)\n- **Current Stock Price**: $380.58\n- **Price Change**: Decreased by **0.74%** from the previous close.\n- **Latest Open Price**: $380.50\n- **Intraday Volume**: 6,527,801 shares\n- **Intraday High**: $383.60\n- **Intraday Low**: $363.245\n- **Latest Trade Time**: June 12, 2025, at 17:15 PDT\n\n#### Analyst Forecasts\n- **Median Price Target**: $538.00, suggesting a potential upside of approximately **75.4%** from the current price.\n- **Price Range Predictions**: Analysts anticipate a stock price between **$123.35** and **$171.52** by the end of 2025.\n\n#### Insider Sentiment and Transactions\nWhile specific insider transactions were not detailed in the retrieved data, monitoring insider trading activity can provide insights into the confidence of executives and board members in the company's future performance.\n\n### Summary Table\n\n| Key Metrics | Value |\n|---------------------------------|--------------------------------|\n| Current Stock Price | $380.58 |\n| EPS Growth (YoY) | 354% |\n| Revenue Growth (YoY) | 43.44% |\n| Projected EPS Growth (Annual) | 3.85% |\n| Projected Revenue Growth (Annual)| 12.37% |\n| Median Price Target | $538.00 |\n| Price Change (from previous close)| -0.74% |\n| Intraday Volume | 6,527,801 |\n| Intraday High | $383.60 |\n| Intraday Low | $363.245 |\n\n### Conclusion\nApplovin Corporation has shown impressive growth metrics and positive future projections, making it an interesting option for investors. However, the stock price has seen a slight decrease recently, and potential investors should consider the analyst forecasts and market conditions before making any decisions.\n\nFINAL TRANSACTION PROPOSAL: **HOLD**", + "investment_debate_state": { + "bull_history": "\nBull Analyst: \uc548\ub155\ud558\uc138\uc694! APP \uc8fc\uc2dd\uc5d0 \ub300\ud55c \ud22c\uc790 \uad00\uc810\uc5d0\uc11c \uac15\ub825\ud55c \uc8fc\uc7a5\uc744 \ud3bc\uccd0\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \ucd5c\uadfc\uc758 \uc2dc\uc7a5 \ub3d9\ud5a5\uacfc APP\uc758 \uc131\uc7a5 \uac00\ub2a5\uc131\uc744 \uace0\ub824\ud560 \ub54c, \uc774 \uc8fc\uc2dd\uc740 \uc5ec\uc804\ud788 \ub9e4\ub825\uc801\uc778 \ud22c\uc790\ucc98\ub77c\uace0 \uc0dd\uac01\ud569\ub2c8\ub2e4. \n\n### \uc131\uc7a5 \uc7a0\uc7ac\ub825\nAPP\ub294 \ubaa8\ubc14\uc77c \uc571 \uac1c\ubc1c \ubc0f \uc218\uc775\ud654\uc5d0 \ud2b9\ud654\ub41c \uae30\uc220 \ud68c\uc0ac\ub85c, \ucd5c\uadfc 1\ub144\uac04 **EPS\uac00 354%** \uc99d\uac00\ud558\uace0, **\ub9e4\ucd9c\uc774 43.44%** \uc131\uc7a5\ud588\uc2b5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uc131\uc7a5\uc740 \ub2e8\uc21c\ud55c \uc77c\ud68c\uc131\uc774 \uc544\ub2c8\ub77c, APP\uc758 \ube44\uc988\ub2c8\uc2a4 \ubaa8\ub378\uacfc \uc2dc\uc7a5\uc5d0\uc11c\uc758 \uc704\uce58\ub97c \ubc18\uc601\ud55c \uac83\uc785\ub2c8\ub2e4. \uc55e\uc73c\ub85c\ub3c4 **EPS\ub294 \uc5f0\ud3c9\uade0 3.85%**, **\ub9e4\ucd9c\uc740 12.37%** \uc99d\uac00\ud560 \uac83\uc73c\ub85c \uc608\uc0c1\ub418\uba70, \uc774\ub294 APP\uac00 \uc9c0\uc18d\uc801\uc73c\ub85c \uc131\uc7a5\ud560 \uc218 \uc788\ub294 \uae30\ubc18\uc744 \ub9c8\ub828\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.\n\n### \uacbd\uc7c1 \uc6b0\uc704\nAPP\ub294 \ub3c5\ud2b9\ud55c \ud50c\ub7ab\ud3fc\uacfc \uac15\ub825\ud55c \ube0c\ub79c\ub4dc \uc778\uc9c0\ub3c4\ub97c \ubcf4\uc720\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ucd5c\uadfc Toss \ud50c\ub7ab\ud3fc\uc5d0\uc11c '\uc571 \uc778 \uc571' \ud615\ud0dc\uc758 \uc0c8\ub85c\uc6b4 \uae30\ub2a5\uc744 \ucd94\uac00\ud55c \uac83\uc740 \uc0ac\uc6a9\uc790 \uacbd\ud5d8\uc744 \ud5a5\uc0c1\uc2dc\ud0a4\uace0, \uace0\uac1d \ucda9\uc131\ub3c4\ub97c \ub192\uc774\ub294 \ub370 \uae30\uc5ec\ud560 \uac83\uc785\ub2c8\ub2e4. \ub610\ud55c, Apple Games \uc571 \ucd9c\uc2dc\uc640 \uac19\uc740 \ud601\uc2e0\uc801\uc778 \uc81c\ud488\uc740 APP\uc758 \uc2dc\uc7a5 \uc810\uc720\uc728\uc744 \ub354\uc6b1 \ud655\ub300\ud560 \uc218 \uc788\ub294 \uae30\ud68c\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uacbd\uc7c1 \uc6b0\uc704\ub294 APP\uac00 \uc2dc\uc7a5\uc5d0\uc11c \uc9c0\uc18d\uc801\uc73c\ub85c \uc131\uc7a5\ud560 \uc218 \uc788\ub294 \uc911\uc694\ud55c \uc694\uc18c\uc785\ub2c8\ub2e4.\n\n### \uae0d\uc815\uc801\uc778 \uc2dc\uc7a5 \uc9c0\ud45c\n\ud604\uc7ac APP\uc758 \uc8fc\uac00\ub294 **$380.58**\ub85c, \ucd5c\uadfc \ud55c \ub2ec\uac04\uc758 \uac00\uaca9 \ubcc0\ub3d9\uc744 \ubcf4\uba74 **\ucd5c\uace0\uac00\uac00 $428.99**\uc5d0 \ub2ec\ud588\uc73c\uba70, \uc774\ub294 APP\uc758 \uac15\ud55c \uc0c1\uc2b9\uc138\ub97c \ub098\ud0c0\ub0c5\ub2c8\ub2e4. \uae30\uc220\uc801 \uc9c0\ud45c\ub97c \uc0b4\ud3b4\ubcf4\uba74, **50 SMA\uc640 200 SMA** \ubaa8\ub450 \uc0c1\uc2b9\uc138\ub97c \ubcf4\uc774\uace0 \uc788\uc5b4 \uc911\uc7a5\uae30\uc801\uc73c\ub85c \uae0d\uc815\uc801\uc778 \uc2e0\ud638\ub97c \ubcf4\ub0b4\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ub610\ud55c, **MACD**\uc640 **RSI** \uc9c0\ud45c\ub294 \uc0c1\uc2b9 \ubaa8\uba58\ud140\uc744 \ub098\ud0c0\ub0b4\uace0 \uc788\uc5b4, APP\uc758 \uc8fc\uac00\uac00 \uc55e\uc73c\ub85c\ub3c4 \uae0d\uc815\uc801\uc778 \ubc29\ud5a5\uc73c\ub85c \ub098\uc544\uac08 \uac00\ub2a5\uc131\uc774 \ub192\uc2b5\ub2c8\ub2e4.\n\n### \ubca0\uc5b4 \ud3ec\uc778\ud2b8 \ubc18\ubc15\n\ubca0\uc5b4 \ubd84\uc11d\uac00\ub4e4\uc740 APP\uc758 \ub2e8\uae30 \uc870\uc815 \uac00\ub2a5\uc131\uc744 \uc5b8\uae09\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ubb3c\ub860, **10 EMA**\uac00 \uc8fc\uac00\ub97c \ud558\ud68c\ud558\uace0 \uc788\ub294 \uac83\uc740 \ub2e8\uae30\uc801\uc778 \uc870\uc815 \uc2e0\ud638\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud558\uc9c0\ub9cc, APP\uc758 \uac15\ub825\ud55c \uc7ac\ubb34 \uc131\uacfc\uc640 \uae0d\uc815\uc801\uc778 \uc131\uc7a5 \uc804\ub9dd\uc744 \uace0\ub824\ud560 \ub54c, \uc774\ub7ec\ud55c \ub2e8\uae30 \uc870\uc815\uc740 \uc624\ud788\ub824 \ub9e4\uc218 \uae30\ud68c\ub85c \uc791\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc8fc\uac00\ub294 \ud56d\uc0c1 \ubcc0\ub3d9\uc131\uc774 \uc788\uc73c\uba70, \uc7a5\uae30\uc801\uc778 \uc131\uc7a5 \uac00\ub2a5\uc131\uc744 \uac04\uacfc\ud574\uc11c\ub294 \uc548 \ub429\ub2c8\ub2e4.\n\n\uacfc\uac70\uc758 \uacbd\ud5d8\uc5d0\uc11c \ubc30\uc6b4 \uc810\uc740, \ub2e8\uae30\uc801\uc778 \uc2dc\uc7a5 \ubcc0\ub3d9\uc5d0 \ub108\ubb34 \ubbfc\uac10\ud558\uac8c \ubc18\uc751\ud558\uae30\ubcf4\ub2e4\ub294, \uae30\uc5c5\uc758 \uae30\ubcf8\uc801\uc778 \uc131\uc7a5 \uac00\ub2a5\uc131\uacfc \uc2dc\uc7a5\uc5d0\uc11c\uc758 \uc704\uce58\ub97c \uace0\ub824\ud574\uc57c \ud55c\ub2e4\ub294 \uac83\uc785\ub2c8\ub2e4. APP\ub294 \uc774\ub7ec\ud55c \uae30\uc900\uc744 \ucda9\uc871\ud558\ub294 \uae30\uc5c5\uc785\ub2c8\ub2e4.\n\n### \uacb0\ub860\nAPP\ub294 \uac15\ub825\ud55c \uc131\uc7a5 \uc7a0\uc7ac\ub825\uacfc \uacbd\uc7c1 \uc6b0\uc704\ub97c \uac00\uc9c0\uace0 \uc788\uc73c\uba70, \uae0d\uc815\uc801\uc778 \uc2dc\uc7a5 \uc9c0\ud45c\uac00 \uc774\ub97c \ub4b7\ubc1b\uce68\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ub2e8\uae30\uc801\uc778 \uc870\uc815 \uac00\ub2a5\uc131\uc740 \uc874\uc7ac\ud558\uc9c0\ub9cc, \uc774\ub294 \uc7a5\uae30 \ud22c\uc790\uc790\uc5d0\uac8c\ub294 \ub9e4\uc218 \uae30\ud68c\ub85c \uc791\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. APP\uc5d0 \ub300\ud55c \uae0d\uc815\uc801\uc778 \uc804\ub9dd\uc744 \ubc14\ud0d5\uc73c\ub85c, \uc774 \uc8fc\uc2dd\uc740 \uc5ec\uc804\ud788 \ub9e4\ub825\uc801\uc778 \ud22c\uc790\ucc98\ub77c\uace0 \ud655\uc2e0\ud569\ub2c8\ub2e4. \n\n\uc5ec\ub7ec\ubd84\uc758 \uc0dd\uac01\uc740 \uc5b4\ub5a0\uc2e0\uac00\uc694? APP\uc758 \ubbf8\ub798\uc5d0 \ub300\ud574 \ub354 \ub17c\uc758\ud574\ubcf4\uace0 \uc2f6\uc2b5\ub2c8\ub2e4!", + "bear_history": "\nBear Analyst: \uc548\ub155\ud558\uc138\uc694! APP \uc8fc\uc2dd\uc5d0 \ub300\ud55c \ub17c\uc758\uc5d0 \ucc38\uc5ec\ud558\uac8c \ub418\uc5b4 \uae30\uc069\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \uc800\ub294 \uc774 \uc8fc\uc2dd\uc5d0 \ub300\ud574 \uc2e0\uc911\ud55c \uc811\uadfc\uc774 \ud544\uc694\ud558\ub2e4\uace0 \uc0dd\uac01\ud569\ub2c8\ub2e4. APP\uc758 \uc131\uc7a5 \uac00\ub2a5\uc131\uc5d0 \ub300\ud55c \uae0d\uc815\uc801\uc778 \uc804\ub9dd\uc774 \uc788\uc9c0\ub9cc, \uc5ec\ub7ec \uac00\uc9c0 \uc704\ud5d8 \uc694\uc18c\uc640 \ub3c4\uc804 \uacfc\uc81c\uac00 \uc874\uc7ac\ud569\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 APP\uc5d0 \ub300\ud55c \ud22c\uc790 \uacb0\uc815\uc744 \uc7ac\uace0\ud574\ubcf4\ub294 \uac83\uc774 \uc88b\uaca0\uc2b5\ub2c8\ub2e4.\n\n### 1. \uc704\ud5d8\uacfc \ub3c4\uc804 \uacfc\uc81c\nAPP\uc758 \ucd5c\uadfc \uc8fc\uac00\ub294 \uc0c1\uc2b9\uc138\ub97c \ubcf4\uc774\uace0 \uc788\uc9c0\ub9cc, \uc774\ub294 \ub2e8\uae30\uc801\uc778 \uc870\uc815 \uac00\ub2a5\uc131\uc744 \ub0b4\ud3ec\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ud2b9\ud788, **10 EMA**\uac00 \ud604\uc7ac \uc8fc\uac00\ub97c \ud558\ud68c\ud558\uace0 \uc788\ub2e4\ub294 \uc810\uc740 \ub2e8\uae30\uc801\uc778 \uc870\uc815 \uc2e0\ud638\ub85c \ud574\uc11d\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub610\ud55c, **MACD \ud788\uc2a4\ud1a0\uadf8\ub7a8**\uc774 \uc74c\uc218\ub85c \uc804\ud658\ub418\uba74\uc11c \ubaa8\uba58\ud140 \uc57d\ud654\ub97c \uc2dc\uc0ac\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uae30\uc220\uc801 \uc9c0\ud45c\ub4e4\uc740 APP\uc758 \uc8fc\uac00\uac00 \uc9c0\uc18d\uc801\uc73c\ub85c \uc0c1\uc2b9\ud560 \uac83\uc774\ub77c\ub294 \ub099\uad00\uc801\uc778 \uc804\ub9dd\uc5d0 \uc758\ubb38\uc744 \uc81c\uae30\ud569\ub2c8\ub2e4.\n\n\ub354\uc6b1\uc774, \ucd5c\uadfc\uc758 **\uc911\ub3d9 \uae34\uc7a5 \uace0\uc870**\uc640 \uac19\uc740 \uc9c0\uc815\ud559\uc801 \uc0ac\uac74\ub4e4\uc740 \uae00\ub85c\ubc8c \uacbd\uc81c\uc5d0 \ubd80\uc815\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uc678\ubd80 \uc694\uc778\uc740 APP\uc640 \uac19\uc740 \uae30\uc220 \uae30\uc5c5\uc758 \uc131\uacfc\uc5d0 \uc9c1\uc811\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc73c\uba70, \ud2b9\ud788 \uc6d0\uc790\uc7ac \uac00\uaca9 \uc0c1\uc2b9\uc740 \uc6b4\uc601 \ube44\uc6a9 \uc99d\uac00\ub85c \uc774\uc5b4\uc9c8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n### 2. \uacbd\uc7c1 \uc57d\uc810\nAPP\ub294 \ubaa8\ubc14\uc77c \uc571 \uac1c\ubc1c \ubc0f \uc218\uc775\ud654\uc5d0 \ud2b9\ud654\ub41c \uae30\uc5c5\uc774\uc9c0\ub9cc, \uc2dc\uc7a5\uc5d0\uc11c\uc758 \uacbd\uc7c1\uc774 \uce58\uc5f4\ud574\uc9c0\uace0 \uc788\uc2b5\ub2c8\ub2e4. **Apple Games \uc571**\uacfc \uac19\uc740 \uc0c8\ub85c\uc6b4 \uacbd\uc7c1\uc790\uac00 \ub4f1\uc7a5\ud558\uba74\uc11c APP\uc758 \uc2dc\uc7a5 \uc810\uc720\uc728\uc774 \uc704\ud611\ubc1b\uace0 \uc788\uc2b5\ub2c8\ub2e4. APP\uc758 **Toss \ud50c\ub7ab\ud3fc**\uc5d0\uc11c\uc758 \ud601\uc2e0\uc740 \uae0d\uc815\uc801\uc774\uc9c0\ub9cc, \uc774\ub7ec\ud55c \ubcc0\ud654\uac00 \uc2e4\uc81c\ub85c \uace0\uac1d \ucda9\uc131\ub3c4\ub97c \ub192\uc774\ub294 \ub370 \uc5bc\ub9c8\ub098 \uae30\uc5ec\ud560\uc9c0\ub294 \ubd88\ud655\uc2e4\ud569\ub2c8\ub2e4. \uacbd\uc7c1\uc0ac\ub4e4\uc774 \ub354 \ud601\uc2e0\uc801\uc778 \uae30\ub2a5\uc744 \uc81c\uacf5\ud560 \uacbd\uc6b0, APP\uc758 \uc2dc\uc7a5 \uc704\uce58\uac00 \uc57d\ud654\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n### 3. \ubd80\uc815\uc801\uc778 \uc9c0\ud45c\nAPP\uc758 **EPS**\uc640 **\ub9e4\ucd9c \uc131\uc7a5\ub960**\uc740 \uc778\uc0c1\uc801\uc774\uc9c0\ub9cc, \ud5a5\ud6c4 \uc131\uc7a5\ub960\uc774 **3.85%**\uc640 **12.37%**\ub85c \uc608\uc0c1\ub418\ub294 \uac83\uc740 \ub2e4\uc18c \ubcf4\uc218\uc801\uc778 \uc218\uce58\uc785\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uc131\uc7a5\ub960\uc740 \uc774\ubbf8 \uc2dc\uc7a5\uc5d0\uc11c \uae30\ub300\ub418\ub294 \uc218\uc900\uc77c \uc218 \uc788\uc73c\uba70, \uc2e4\uc81c\ub85c\ub294 \ub354 \ub0ae\uc740 \uc131\uacfc\ub97c \uae30\ub85d\ud560 \uac00\ub2a5\uc131\ub3c4 \uc874\uc7ac\ud569\ub2c8\ub2e4. \ub610\ud55c, \ucd5c\uadfc\uc758 \uc8fc\uac00 \ud558\ub77d\uc740 \ud22c\uc790\uc790\ub4e4\uc774 APP\uc758 \ubbf8\ub798\uc5d0 \ub300\ud574 \uc6b0\ub824\ud558\uace0 \uc788\ub2e4\ub294 \uc2e0\ud638\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n### 4. \uac15\uc138\ub860 \ubc18\ubc15\n\uac15\uc138\ub860\uc790\ub4e4\uc740 APP\uc758 \ub2e8\uae30 \uc870\uc815\uc774 \ub9e4\uc218 \uae30\ud68c\ub85c \uc791\uc6a9\ud560 \uac83\uc774\ub77c\uace0 \uc8fc\uc7a5\ud569\ub2c8\ub2e4. \ud558\uc9c0\ub9cc, \ub2e8\uae30 \uc870\uc815\uc774 \ud56d\uc0c1 \ub9e4\uc218 \uae30\ud68c\ub85c \uc774\uc5b4\uc9c0\ub294 \uac83\uc740 \uc544\ub2d9\ub2c8\ub2e4. \uacfc\uac70\uc758 \uacbd\ud5d8\uc5d0\uc11c \ubc30\uc6b4 \uc810\uc740, \ub2e8\uae30\uc801\uc778 \ubcc0\ub3d9\uc131\uc5d0 \ub108\ubb34 \ubbfc\uac10\ud558\uac8c \ubc18\uc751\ud558\uae30\ubcf4\ub2e4\ub294 \uae30\uc5c5\uc758 \uae30\ubcf8\uc801\uc778 \uc7ac\ubb34 \uac74\uc804\uc131\uacfc \uc2dc\uc7a5\uc5d0\uc11c\uc758 \uc704\uce58\ub97c \uace0\ub824\ud574\uc57c \ud55c\ub2e4\ub294 \uac83\uc785\ub2c8\ub2e4. APP\ub294 \ud604\uc7ac \ub192\uc740 \ubcc0\ub3d9\uc131\uc744 \ubcf4\uc774\uace0 \uc788\uc73c\uba70, \uc774\ub294 \ud22c\uc790\uc790\ub4e4\uc5d0\uac8c \uc704\ud5d8 \uc2e0\ud638\ub85c \uc791\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n### \uacb0\ub860\nAPP\ub294 \ub9e4\ub825\uc801\uc778 \uc131\uc7a5 \uc7a0\uc7ac\ub825\uc744 \uac00\uc9c0\uace0 \uc788\uc9c0\ub9cc, \uc5ec\ub7ec \uac00\uc9c0 \uc704\ud5d8 \uc694\uc18c\uc640 \ub3c4\uc804 \uacfc\uc81c\uac00 \uc874\uc7ac\ud569\ub2c8\ub2e4. \ud2b9\ud788, \ub2e8\uae30\uc801\uc778 \uc870\uc815 \uac00\ub2a5\uc131\uacfc \uacbd\uc7c1\uc758 \uc2ec\ud654\ub294 APP\uc758 \ubbf8\ub798\uc5d0 \ubd80\uc815\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub530\ub77c\uc11c, APP\uc5d0 \ub300\ud55c \ud22c\uc790\ub294 \uc2e0\uc911\ud558\uac8c \uace0\ub824\ud574\uc57c \ud558\uba70, \ud604\uc7ac\uc758 \uc2dc\uc7a5 \uc0c1\ud669\uacfc \uae30\uc220\uc801 \uc9c0\ud45c\ub97c \uba74\ubc00\ud788 \ubd84\uc11d\ud558\ub294 \uac83\uc774 \uc911\uc694\ud569\ub2c8\ub2e4. \n\n\uc5ec\ub7ec\ubd84\uc758 \uc758\uacac\uc740 \uc5b4\ub5a0\uc2e0\uac00\uc694? APP\uc758 \ubbf8\ub798\uc5d0 \ub300\ud55c \ub354 \uae4a\uc740 \ub17c\uc758\ub97c \uc6d0\ud558\uc2e0\ub2e4\uba74, \ud568\uaed8 \uc774\uc57c\uae30\ud574\ubcf4\uba74 \uc88b\uaca0\uc2b5\ub2c8\ub2e4.", + "history": "\nBull Analyst: \uc548\ub155\ud558\uc138\uc694! APP \uc8fc\uc2dd\uc5d0 \ub300\ud55c \ud22c\uc790 \uad00\uc810\uc5d0\uc11c \uac15\ub825\ud55c \uc8fc\uc7a5\uc744 \ud3bc\uccd0\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \ucd5c\uadfc\uc758 \uc2dc\uc7a5 \ub3d9\ud5a5\uacfc APP\uc758 \uc131\uc7a5 \uac00\ub2a5\uc131\uc744 \uace0\ub824\ud560 \ub54c, \uc774 \uc8fc\uc2dd\uc740 \uc5ec\uc804\ud788 \ub9e4\ub825\uc801\uc778 \ud22c\uc790\ucc98\ub77c\uace0 \uc0dd\uac01\ud569\ub2c8\ub2e4. \n\n### \uc131\uc7a5 \uc7a0\uc7ac\ub825\nAPP\ub294 \ubaa8\ubc14\uc77c \uc571 \uac1c\ubc1c \ubc0f \uc218\uc775\ud654\uc5d0 \ud2b9\ud654\ub41c \uae30\uc220 \ud68c\uc0ac\ub85c, \ucd5c\uadfc 1\ub144\uac04 **EPS\uac00 354%** \uc99d\uac00\ud558\uace0, **\ub9e4\ucd9c\uc774 43.44%** \uc131\uc7a5\ud588\uc2b5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uc131\uc7a5\uc740 \ub2e8\uc21c\ud55c \uc77c\ud68c\uc131\uc774 \uc544\ub2c8\ub77c, APP\uc758 \ube44\uc988\ub2c8\uc2a4 \ubaa8\ub378\uacfc \uc2dc\uc7a5\uc5d0\uc11c\uc758 \uc704\uce58\ub97c \ubc18\uc601\ud55c \uac83\uc785\ub2c8\ub2e4. \uc55e\uc73c\ub85c\ub3c4 **EPS\ub294 \uc5f0\ud3c9\uade0 3.85%**, **\ub9e4\ucd9c\uc740 12.37%** \uc99d\uac00\ud560 \uac83\uc73c\ub85c \uc608\uc0c1\ub418\uba70, \uc774\ub294 APP\uac00 \uc9c0\uc18d\uc801\uc73c\ub85c \uc131\uc7a5\ud560 \uc218 \uc788\ub294 \uae30\ubc18\uc744 \ub9c8\ub828\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.\n\n### \uacbd\uc7c1 \uc6b0\uc704\nAPP\ub294 \ub3c5\ud2b9\ud55c \ud50c\ub7ab\ud3fc\uacfc \uac15\ub825\ud55c \ube0c\ub79c\ub4dc \uc778\uc9c0\ub3c4\ub97c \ubcf4\uc720\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ucd5c\uadfc Toss \ud50c\ub7ab\ud3fc\uc5d0\uc11c '\uc571 \uc778 \uc571' \ud615\ud0dc\uc758 \uc0c8\ub85c\uc6b4 \uae30\ub2a5\uc744 \ucd94\uac00\ud55c \uac83\uc740 \uc0ac\uc6a9\uc790 \uacbd\ud5d8\uc744 \ud5a5\uc0c1\uc2dc\ud0a4\uace0, \uace0\uac1d \ucda9\uc131\ub3c4\ub97c \ub192\uc774\ub294 \ub370 \uae30\uc5ec\ud560 \uac83\uc785\ub2c8\ub2e4. \ub610\ud55c, Apple Games \uc571 \ucd9c\uc2dc\uc640 \uac19\uc740 \ud601\uc2e0\uc801\uc778 \uc81c\ud488\uc740 APP\uc758 \uc2dc\uc7a5 \uc810\uc720\uc728\uc744 \ub354\uc6b1 \ud655\ub300\ud560 \uc218 \uc788\ub294 \uae30\ud68c\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uacbd\uc7c1 \uc6b0\uc704\ub294 APP\uac00 \uc2dc\uc7a5\uc5d0\uc11c \uc9c0\uc18d\uc801\uc73c\ub85c \uc131\uc7a5\ud560 \uc218 \uc788\ub294 \uc911\uc694\ud55c \uc694\uc18c\uc785\ub2c8\ub2e4.\n\n### \uae0d\uc815\uc801\uc778 \uc2dc\uc7a5 \uc9c0\ud45c\n\ud604\uc7ac APP\uc758 \uc8fc\uac00\ub294 **$380.58**\ub85c, \ucd5c\uadfc \ud55c \ub2ec\uac04\uc758 \uac00\uaca9 \ubcc0\ub3d9\uc744 \ubcf4\uba74 **\ucd5c\uace0\uac00\uac00 $428.99**\uc5d0 \ub2ec\ud588\uc73c\uba70, \uc774\ub294 APP\uc758 \uac15\ud55c \uc0c1\uc2b9\uc138\ub97c \ub098\ud0c0\ub0c5\ub2c8\ub2e4. \uae30\uc220\uc801 \uc9c0\ud45c\ub97c \uc0b4\ud3b4\ubcf4\uba74, **50 SMA\uc640 200 SMA** \ubaa8\ub450 \uc0c1\uc2b9\uc138\ub97c \ubcf4\uc774\uace0 \uc788\uc5b4 \uc911\uc7a5\uae30\uc801\uc73c\ub85c \uae0d\uc815\uc801\uc778 \uc2e0\ud638\ub97c \ubcf4\ub0b4\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ub610\ud55c, **MACD**\uc640 **RSI** \uc9c0\ud45c\ub294 \uc0c1\uc2b9 \ubaa8\uba58\ud140\uc744 \ub098\ud0c0\ub0b4\uace0 \uc788\uc5b4, APP\uc758 \uc8fc\uac00\uac00 \uc55e\uc73c\ub85c\ub3c4 \uae0d\uc815\uc801\uc778 \ubc29\ud5a5\uc73c\ub85c \ub098\uc544\uac08 \uac00\ub2a5\uc131\uc774 \ub192\uc2b5\ub2c8\ub2e4.\n\n### \ubca0\uc5b4 \ud3ec\uc778\ud2b8 \ubc18\ubc15\n\ubca0\uc5b4 \ubd84\uc11d\uac00\ub4e4\uc740 APP\uc758 \ub2e8\uae30 \uc870\uc815 \uac00\ub2a5\uc131\uc744 \uc5b8\uae09\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ubb3c\ub860, **10 EMA**\uac00 \uc8fc\uac00\ub97c \ud558\ud68c\ud558\uace0 \uc788\ub294 \uac83\uc740 \ub2e8\uae30\uc801\uc778 \uc870\uc815 \uc2e0\ud638\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud558\uc9c0\ub9cc, APP\uc758 \uac15\ub825\ud55c \uc7ac\ubb34 \uc131\uacfc\uc640 \uae0d\uc815\uc801\uc778 \uc131\uc7a5 \uc804\ub9dd\uc744 \uace0\ub824\ud560 \ub54c, \uc774\ub7ec\ud55c \ub2e8\uae30 \uc870\uc815\uc740 \uc624\ud788\ub824 \ub9e4\uc218 \uae30\ud68c\ub85c \uc791\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc8fc\uac00\ub294 \ud56d\uc0c1 \ubcc0\ub3d9\uc131\uc774 \uc788\uc73c\uba70, \uc7a5\uae30\uc801\uc778 \uc131\uc7a5 \uac00\ub2a5\uc131\uc744 \uac04\uacfc\ud574\uc11c\ub294 \uc548 \ub429\ub2c8\ub2e4.\n\n\uacfc\uac70\uc758 \uacbd\ud5d8\uc5d0\uc11c \ubc30\uc6b4 \uc810\uc740, \ub2e8\uae30\uc801\uc778 \uc2dc\uc7a5 \ubcc0\ub3d9\uc5d0 \ub108\ubb34 \ubbfc\uac10\ud558\uac8c \ubc18\uc751\ud558\uae30\ubcf4\ub2e4\ub294, \uae30\uc5c5\uc758 \uae30\ubcf8\uc801\uc778 \uc131\uc7a5 \uac00\ub2a5\uc131\uacfc \uc2dc\uc7a5\uc5d0\uc11c\uc758 \uc704\uce58\ub97c \uace0\ub824\ud574\uc57c \ud55c\ub2e4\ub294 \uac83\uc785\ub2c8\ub2e4. APP\ub294 \uc774\ub7ec\ud55c \uae30\uc900\uc744 \ucda9\uc871\ud558\ub294 \uae30\uc5c5\uc785\ub2c8\ub2e4.\n\n### \uacb0\ub860\nAPP\ub294 \uac15\ub825\ud55c \uc131\uc7a5 \uc7a0\uc7ac\ub825\uacfc \uacbd\uc7c1 \uc6b0\uc704\ub97c \uac00\uc9c0\uace0 \uc788\uc73c\uba70, \uae0d\uc815\uc801\uc778 \uc2dc\uc7a5 \uc9c0\ud45c\uac00 \uc774\ub97c \ub4b7\ubc1b\uce68\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ub2e8\uae30\uc801\uc778 \uc870\uc815 \uac00\ub2a5\uc131\uc740 \uc874\uc7ac\ud558\uc9c0\ub9cc, \uc774\ub294 \uc7a5\uae30 \ud22c\uc790\uc790\uc5d0\uac8c\ub294 \ub9e4\uc218 \uae30\ud68c\ub85c \uc791\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. APP\uc5d0 \ub300\ud55c \uae0d\uc815\uc801\uc778 \uc804\ub9dd\uc744 \ubc14\ud0d5\uc73c\ub85c, \uc774 \uc8fc\uc2dd\uc740 \uc5ec\uc804\ud788 \ub9e4\ub825\uc801\uc778 \ud22c\uc790\ucc98\ub77c\uace0 \ud655\uc2e0\ud569\ub2c8\ub2e4. \n\n\uc5ec\ub7ec\ubd84\uc758 \uc0dd\uac01\uc740 \uc5b4\ub5a0\uc2e0\uac00\uc694? APP\uc758 \ubbf8\ub798\uc5d0 \ub300\ud574 \ub354 \ub17c\uc758\ud574\ubcf4\uace0 \uc2f6\uc2b5\ub2c8\ub2e4!\nBear Analyst: \uc548\ub155\ud558\uc138\uc694! APP \uc8fc\uc2dd\uc5d0 \ub300\ud55c \ub17c\uc758\uc5d0 \ucc38\uc5ec\ud558\uac8c \ub418\uc5b4 \uae30\uc069\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \uc800\ub294 \uc774 \uc8fc\uc2dd\uc5d0 \ub300\ud574 \uc2e0\uc911\ud55c \uc811\uadfc\uc774 \ud544\uc694\ud558\ub2e4\uace0 \uc0dd\uac01\ud569\ub2c8\ub2e4. APP\uc758 \uc131\uc7a5 \uac00\ub2a5\uc131\uc5d0 \ub300\ud55c \uae0d\uc815\uc801\uc778 \uc804\ub9dd\uc774 \uc788\uc9c0\ub9cc, \uc5ec\ub7ec \uac00\uc9c0 \uc704\ud5d8 \uc694\uc18c\uc640 \ub3c4\uc804 \uacfc\uc81c\uac00 \uc874\uc7ac\ud569\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 APP\uc5d0 \ub300\ud55c \ud22c\uc790 \uacb0\uc815\uc744 \uc7ac\uace0\ud574\ubcf4\ub294 \uac83\uc774 \uc88b\uaca0\uc2b5\ub2c8\ub2e4.\n\n### 1. \uc704\ud5d8\uacfc \ub3c4\uc804 \uacfc\uc81c\nAPP\uc758 \ucd5c\uadfc \uc8fc\uac00\ub294 \uc0c1\uc2b9\uc138\ub97c \ubcf4\uc774\uace0 \uc788\uc9c0\ub9cc, \uc774\ub294 \ub2e8\uae30\uc801\uc778 \uc870\uc815 \uac00\ub2a5\uc131\uc744 \ub0b4\ud3ec\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ud2b9\ud788, **10 EMA**\uac00 \ud604\uc7ac \uc8fc\uac00\ub97c \ud558\ud68c\ud558\uace0 \uc788\ub2e4\ub294 \uc810\uc740 \ub2e8\uae30\uc801\uc778 \uc870\uc815 \uc2e0\ud638\ub85c \ud574\uc11d\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub610\ud55c, **MACD \ud788\uc2a4\ud1a0\uadf8\ub7a8**\uc774 \uc74c\uc218\ub85c \uc804\ud658\ub418\uba74\uc11c \ubaa8\uba58\ud140 \uc57d\ud654\ub97c \uc2dc\uc0ac\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uae30\uc220\uc801 \uc9c0\ud45c\ub4e4\uc740 APP\uc758 \uc8fc\uac00\uac00 \uc9c0\uc18d\uc801\uc73c\ub85c \uc0c1\uc2b9\ud560 \uac83\uc774\ub77c\ub294 \ub099\uad00\uc801\uc778 \uc804\ub9dd\uc5d0 \uc758\ubb38\uc744 \uc81c\uae30\ud569\ub2c8\ub2e4.\n\n\ub354\uc6b1\uc774, \ucd5c\uadfc\uc758 **\uc911\ub3d9 \uae34\uc7a5 \uace0\uc870**\uc640 \uac19\uc740 \uc9c0\uc815\ud559\uc801 \uc0ac\uac74\ub4e4\uc740 \uae00\ub85c\ubc8c \uacbd\uc81c\uc5d0 \ubd80\uc815\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uc678\ubd80 \uc694\uc778\uc740 APP\uc640 \uac19\uc740 \uae30\uc220 \uae30\uc5c5\uc758 \uc131\uacfc\uc5d0 \uc9c1\uc811\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc73c\uba70, \ud2b9\ud788 \uc6d0\uc790\uc7ac \uac00\uaca9 \uc0c1\uc2b9\uc740 \uc6b4\uc601 \ube44\uc6a9 \uc99d\uac00\ub85c \uc774\uc5b4\uc9c8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n### 2. \uacbd\uc7c1 \uc57d\uc810\nAPP\ub294 \ubaa8\ubc14\uc77c \uc571 \uac1c\ubc1c \ubc0f \uc218\uc775\ud654\uc5d0 \ud2b9\ud654\ub41c \uae30\uc5c5\uc774\uc9c0\ub9cc, \uc2dc\uc7a5\uc5d0\uc11c\uc758 \uacbd\uc7c1\uc774 \uce58\uc5f4\ud574\uc9c0\uace0 \uc788\uc2b5\ub2c8\ub2e4. **Apple Games \uc571**\uacfc \uac19\uc740 \uc0c8\ub85c\uc6b4 \uacbd\uc7c1\uc790\uac00 \ub4f1\uc7a5\ud558\uba74\uc11c APP\uc758 \uc2dc\uc7a5 \uc810\uc720\uc728\uc774 \uc704\ud611\ubc1b\uace0 \uc788\uc2b5\ub2c8\ub2e4. APP\uc758 **Toss \ud50c\ub7ab\ud3fc**\uc5d0\uc11c\uc758 \ud601\uc2e0\uc740 \uae0d\uc815\uc801\uc774\uc9c0\ub9cc, \uc774\ub7ec\ud55c \ubcc0\ud654\uac00 \uc2e4\uc81c\ub85c \uace0\uac1d \ucda9\uc131\ub3c4\ub97c \ub192\uc774\ub294 \ub370 \uc5bc\ub9c8\ub098 \uae30\uc5ec\ud560\uc9c0\ub294 \ubd88\ud655\uc2e4\ud569\ub2c8\ub2e4. \uacbd\uc7c1\uc0ac\ub4e4\uc774 \ub354 \ud601\uc2e0\uc801\uc778 \uae30\ub2a5\uc744 \uc81c\uacf5\ud560 \uacbd\uc6b0, APP\uc758 \uc2dc\uc7a5 \uc704\uce58\uac00 \uc57d\ud654\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n### 3. \ubd80\uc815\uc801\uc778 \uc9c0\ud45c\nAPP\uc758 **EPS**\uc640 **\ub9e4\ucd9c \uc131\uc7a5\ub960**\uc740 \uc778\uc0c1\uc801\uc774\uc9c0\ub9cc, \ud5a5\ud6c4 \uc131\uc7a5\ub960\uc774 **3.85%**\uc640 **12.37%**\ub85c \uc608\uc0c1\ub418\ub294 \uac83\uc740 \ub2e4\uc18c \ubcf4\uc218\uc801\uc778 \uc218\uce58\uc785\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uc131\uc7a5\ub960\uc740 \uc774\ubbf8 \uc2dc\uc7a5\uc5d0\uc11c \uae30\ub300\ub418\ub294 \uc218\uc900\uc77c \uc218 \uc788\uc73c\uba70, \uc2e4\uc81c\ub85c\ub294 \ub354 \ub0ae\uc740 \uc131\uacfc\ub97c \uae30\ub85d\ud560 \uac00\ub2a5\uc131\ub3c4 \uc874\uc7ac\ud569\ub2c8\ub2e4. \ub610\ud55c, \ucd5c\uadfc\uc758 \uc8fc\uac00 \ud558\ub77d\uc740 \ud22c\uc790\uc790\ub4e4\uc774 APP\uc758 \ubbf8\ub798\uc5d0 \ub300\ud574 \uc6b0\ub824\ud558\uace0 \uc788\ub2e4\ub294 \uc2e0\ud638\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n### 4. \uac15\uc138\ub860 \ubc18\ubc15\n\uac15\uc138\ub860\uc790\ub4e4\uc740 APP\uc758 \ub2e8\uae30 \uc870\uc815\uc774 \ub9e4\uc218 \uae30\ud68c\ub85c \uc791\uc6a9\ud560 \uac83\uc774\ub77c\uace0 \uc8fc\uc7a5\ud569\ub2c8\ub2e4. \ud558\uc9c0\ub9cc, \ub2e8\uae30 \uc870\uc815\uc774 \ud56d\uc0c1 \ub9e4\uc218 \uae30\ud68c\ub85c \uc774\uc5b4\uc9c0\ub294 \uac83\uc740 \uc544\ub2d9\ub2c8\ub2e4. \uacfc\uac70\uc758 \uacbd\ud5d8\uc5d0\uc11c \ubc30\uc6b4 \uc810\uc740, \ub2e8\uae30\uc801\uc778 \ubcc0\ub3d9\uc131\uc5d0 \ub108\ubb34 \ubbfc\uac10\ud558\uac8c \ubc18\uc751\ud558\uae30\ubcf4\ub2e4\ub294 \uae30\uc5c5\uc758 \uae30\ubcf8\uc801\uc778 \uc7ac\ubb34 \uac74\uc804\uc131\uacfc \uc2dc\uc7a5\uc5d0\uc11c\uc758 \uc704\uce58\ub97c \uace0\ub824\ud574\uc57c \ud55c\ub2e4\ub294 \uac83\uc785\ub2c8\ub2e4. APP\ub294 \ud604\uc7ac \ub192\uc740 \ubcc0\ub3d9\uc131\uc744 \ubcf4\uc774\uace0 \uc788\uc73c\uba70, \uc774\ub294 \ud22c\uc790\uc790\ub4e4\uc5d0\uac8c \uc704\ud5d8 \uc2e0\ud638\ub85c \uc791\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n### \uacb0\ub860\nAPP\ub294 \ub9e4\ub825\uc801\uc778 \uc131\uc7a5 \uc7a0\uc7ac\ub825\uc744 \uac00\uc9c0\uace0 \uc788\uc9c0\ub9cc, \uc5ec\ub7ec \uac00\uc9c0 \uc704\ud5d8 \uc694\uc18c\uc640 \ub3c4\uc804 \uacfc\uc81c\uac00 \uc874\uc7ac\ud569\ub2c8\ub2e4. \ud2b9\ud788, \ub2e8\uae30\uc801\uc778 \uc870\uc815 \uac00\ub2a5\uc131\uacfc \uacbd\uc7c1\uc758 \uc2ec\ud654\ub294 APP\uc758 \ubbf8\ub798\uc5d0 \ubd80\uc815\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub530\ub77c\uc11c, APP\uc5d0 \ub300\ud55c \ud22c\uc790\ub294 \uc2e0\uc911\ud558\uac8c \uace0\ub824\ud574\uc57c \ud558\uba70, \ud604\uc7ac\uc758 \uc2dc\uc7a5 \uc0c1\ud669\uacfc \uae30\uc220\uc801 \uc9c0\ud45c\ub97c \uba74\ubc00\ud788 \ubd84\uc11d\ud558\ub294 \uac83\uc774 \uc911\uc694\ud569\ub2c8\ub2e4. \n\n\uc5ec\ub7ec\ubd84\uc758 \uc758\uacac\uc740 \uc5b4\ub5a0\uc2e0\uac00\uc694? APP\uc758 \ubbf8\ub798\uc5d0 \ub300\ud55c \ub354 \uae4a\uc740 \ub17c\uc758\ub97c \uc6d0\ud558\uc2e0\ub2e4\uba74, \ud568\uaed8 \uc774\uc57c\uae30\ud574\ubcf4\uba74 \uc88b\uaca0\uc2b5\ub2c8\ub2e4.", + "current_response": "\uc548\ub155\ud558\uc138\uc694. \uc774\ubc88 APP \uc8fc\uc2dd \ud1a0\ub860\uc744 \uc885\ud569\ud574 \ubcf8 \ub4a4, \uc800\ub294 \ud655\uc2e4\ud788 \ub9e4\uc218(Buy) \uc785\uc7a5\uc744 \ucde8\ud558\uaca0\uc2b5\ub2c8\ub2e4.\n\n\uc6b0\uc120 \uc591\uce21 \ud575\uc2ec \ub17c\uc810\uc744 \uac04\ub2e8\ud788 \uc815\ub9ac\ud558\uba74\u2026\n\n\uac15\uc138 \uce21\uc740 \n\u2022 \uc9c0\ub09c 1\ub144\uac04 EPS 354%, \ub9e4\ucd9c 43.44%\ub77c\ub294 \uc555\ub3c4\uc801 \uc2e4\uc801 \uc131\uc7a5 \n\u2022 \uc55e\uc73c\ub85c\ub3c4 EPS \uc5f0\ud3c9\uade0 3.85%, \ub9e4\ucd9c 12.37% \uc99d\uac00 \uc608\uc0c1 \n\u2022 Toss \ud50c\ub7ab\ud3fc \ub0b4 \u2018\uc571 \uc778 \uc571\u2019 \uae30\ub2a5, Apple Games \ucd9c\uc2dc \ub4f1\uc73c\ub85c \ucc28\ubcc4\ud654\ub41c \uacbd\uc7c1\ub825 \ud655\ubcf4 \n\u2022 \uc911\u00b7\uc7a5\uae30 50/200\uc77c \uc774\ub3d9\ud3c9\uade0\uc120 \uc0c1\uc2b9, MACD\u00b7RSI\ub3c4 \uae0d\uc815\uc801 \ubaa8\uba58\ud140 \uc2dc\uadf8\ub110 \n\n\uc57d\uc138 \uce21\uc740 \n\u2022 \ub2e8\uae30\uc801\uc73c\ub85c 10\uc77c EMA\u00b7MACD \ud788\uc2a4\ud1a0\uadf8\ub7a8 \uc57d\ud654\uac00 \uc870\uc815 \uc2e0\ud638 \n\u2022 \uc9c0\uc815\ud559\uc801 \ubd88\uc548(\uc911\ub3d9 \uae34\uc7a5) \ubc0f \uc6d0\uc790\uc7ac \uac00\uaca9 \uc0c1\uc2b9 \uc704\ud5d8 \n\u2022 Apple Games \ub4f1 \uc2e0\uaddc \uacbd\uc7c1\uc790\uc758 \uc704\ud611\uc73c\ub85c \uc2dc\uc7a5 \uc810\uc720\uc728 \ud558\ub77d \uac00\ub2a5\uc131 \n\u2022 \ubbf8\ub798 \uc131\uc7a5\ub960(3.85%, 12.37%)\uc774 \uc774\ubbf8 \uc8fc\uac00\uc5d0 \uc120\ubc18\uc601\ub410\uc744 \uc6b0\ub824 \n\n\uc774 \uc911\uc5d0\uc11c \uac00\uc7a5 \uc124\ub4dd\ub825 \uc788\ub294 \ud3ec\uc778\ud2b8\ub294 \u2018\uac15\ub825\ud55c \ud380\ub354\uba58\ud138 \uc131\uc7a5\u2019\uc785\ub2c8\ub2e4. 1\ub144\uac04 \uc2e4\uc801 \ud3ed\uc99d\uc740 \uc77c\ud68c\uc131\uc774 \uc544\ub2c8\ub77c \ud50c\ub7ab\ud3fc \ube44\uc988\ub2c8\uc2a4 \ubaa8\ub378\uc758 \ud798\uc744 \ubcf4\uc5ec\uc900 \uac83\uc774\uace0, \ud5a5\ud6c4\uc5d0\ub3c4 \uc548\uc815\uc801\uc778 \ub9e4\ucd9c\u00b7\uc774\uc775 \ud655\uc7a5\uc774 \uac00\ub2a5\ud558\ub2e4\ub294 \uc804\ub9dd\uc774 \ub2e4\uc218 \uc560\ub110\ub9ac\uc2a4\ud2b8\uc5d0\uac8c\uc11c \uae0d\uc815\uc801\uc73c\ub85c \ub098\uc628\ub2e4\ub294 \uc810\uc774 \uc911\uc694\ud569\ub2c8\ub2e4. \ubb3c\ub860 \ub2e8\uae30 \uc870\uc815\uc740 \uc62c \uc218 \uc788\uc9c0\ub9cc, \ubd88\ud655\uc2e4\uc131\uc744 \uc774\uc720\ub85c \uc644\uc804\ud788 \ubc30\uc81c\ud558\uae30\ubcf4\ub2e4 \uc774\ub97c \uc624\ud788\ub824 \uc800\uac00 \ub9e4\uc218 \uae30\ud68c\ub85c \ud65c\uc6a9\ud558\ub294 \ucabd\uc774 \ud569\ub9ac\uc801\uc774\ub77c\uace0 \ud310\ub2e8\ud588\uc2b5\ub2c8\ub2e4.\n\n\ud22c\uc790 \uacc4\ud68d\uc744 \uc544\ub798\uc640 \uac19\uc774 \uc81c\uc548\ub4dc\ub9bd\ub2c8\ub2e4.\n\n1. \ucd94\ucc9c \uc758\uacac: \ub9e4\uc218(Buy) \n2. \ucd94\ucc9c \uadfc\uac70: \n - \uae30\uc5c5\uc758 \uc218\uc775\uc131\uacfc \ub9e4\ucd9c \uc131\uc7a5\uc138\uac00 \uc5c5\uacc4 \ub300\ube44 \uc6d4\ub4f1\ud788 \ub192\uc73c\uba70, \ud5a5\ud6c4\uc5d0\ub3c4 \uafb8\uc900\ud55c \ud655\uc7a5\uc774 \uae30\ub300\ub428 \n - \ud50c\ub7ab\ud3fc\u00b7\ube0c\ub79c\ub4dc \ud30c\uc6cc\ub97c \ubc14\ud0d5\uc73c\ub85c \uacbd\uc7c1\uc0ac\ubcf4\ub2e4 \ube60\ub978 \ud601\uc2e0\uc774 \uac00\ub2a5 \n - \uc911\u00b7\uc7a5\uae30 \uae30\uc220\uc801 \uc9c0\ud45c(50/200\uc77c\uc120, MACD\u00b7RSI)\uac00 \uc5ec\uc804\ud788 \uae0d\uc815\uc801 \n - \ub2e8\uae30 \uc870\uc815\uc740 \uc790\uc5f0\uc2a4\ub7ec\uc6b4 \ubcc0\ub3d9\uc131\uc73c\ub85c \ubcf4\uace0 \ubd84\ud560 \ub9e4\uc218 \uae30\ud68c\ub85c \ud65c\uc6a9 \n\n3. \uad6c\uccb4\uc801 \uc2e4\ud589 \uc804\ub7b5 \n \uac00. \ubd84\ud560 \ub9e4\uc218: \ud604\uc7ac \uac00\uaca9\uc5d0\uc11c 3\ub2e8\uacc4\ub85c \ub098\ub220 \ubd84\ud560 \uc9c4\uc785. \uc608\ucee8\ub300 380\ub2ec\ub7ec, 365\ub2ec\ub7ec, 350\ub2ec\ub7ec \uc218\uc900\uc5d0\uc11c \uac01 1/3\uc529 \ub9e4\uc218. \n \ub098. \uc190\uc808\u00b7\uc218\uc775 \ubaa9\ud45c \uc124\uc815: \ucd5c\uadfc \uc9c0\uc9c0\uc120\uc778 345\ub2ec\ub7ec \uc544\ub798\ub85c 5% \uc774\uc0c1 \ud558\ub77d \uc2dc 1\ucc28 \uc190\uc808. \ubaa9\ud45c\uac00\ub294 430\ub2ec\ub7ec(\uc804\uace0\uc810 \ub3cc\ud30c)\ub85c \uc124\uc815 \n \ub2e4. \ubaa8\ub2c8\ud130\ub9c1 \ud3ec\uc778\ud2b8: \n - \ubd84\uae30 \uc2e4\uc801\uc774 \uc608\uce21\uce58\ub97c \ubc11\ub3cc\uac70\ub098 \ub9e4\ucd9c \uc131\uc7a5\ub960\uc774 10% \uc774\ud558\ub85c \ud558\ub77d\ud558\ub294 \uc9c0\ud45c \n - \uc8fc\uc694 \uacbd\uc81c\u00b7\uc9c0\uc815\ud559\uc801 \uc0ac\uac74(\uc911\ub3d9 \uc0c1\ud669, \uae08\ub9ac \uacb0\uc815 \ub4f1)\uacfc \uc6d0\uc790\uc7ac \uac00\uaca9 \ucd94\uc774 \n - Toss \ud50c\ub7ab\ud3fc \uc0ac\uc6a9\uc790 \uc218\u00b7ARPU(\uac00\uc785\uc790\ub2f9 \ud3c9\uade0 \ub9e4\ucd9c) \ubcc0\ud654 \n \ub77c. \ud3ec\ud2b8\ud3f4\ub9ac\uc624 \ube44\uc911: \uc804\uccb4 \uc704\ud5d8 \uc790\uc0b0\uc758 5~7% \uc774\ub0b4\ub85c \ube44\uc911 \uc81c\ud55c, \ub2e4\ub978 \uc5c5\uc885\u00b7\uc2a4\ud0c0\uc77c\uacfc\uc758 \ubd84\uc0b0 \uc720\uc9c0 \n\n4. \uacfc\uac70 \uc2e4\uc218 \uad50\ud6c8 \ubc18\uc601 \n - \ub2e8\uae30 \ubaa8\uba58\ud140 \uc2e0\ud638\uc5d0 \uacfc\ub3c4\ud558\uac8c \ubc18\uc751\ud574 \uc774\ud0c8\ud55c \uacbd\ud5d8\uc744 \uc904\uc774\uace0, \ud380\ub354\uba58\ud138\uacfc \uae30\uc220\uc801 \uc9c0\ud45c\uc758 \uacb0\ud569\uc5d0 \uc9d1\uc911 \n - \ucd94\uaca9 \ub9e4\uc218\ub97c \uc790\uc81c\ud558\uace0 \ubd84\ud560 \uc811\uadfc\uc73c\ub85c \ub9ac\uc2a4\ud06c \uad00\ub9ac \n\n\uc774\ub807\uac8c \uc911\uc7a5\uae30 \uc131\uc7a5 \uc2a4\ud1a0\ub9ac\ub97c \ubbff\ub418, \ub2e8\uae30 \uc870\uc815 \ub9ac\uc2a4\ud06c\ub294 \ub9e4\uc218 \ud0c0\uc774\ubc0d\uc73c\ub85c \uc0bc\uc544 \ub2e8\uacc4\uc801\uc73c\ub85c \uc9c4\uc785\ud558\ub294 \uc804\ub7b5\uc744 \ucd94\ucc9c\ub4dc\ub9bd\ub2c8\ub2e4. \uc774\uc0c1\uc785\ub2c8\ub2e4.", + "judge_decision": "\uc548\ub155\ud558\uc138\uc694. \uc774\ubc88 APP \uc8fc\uc2dd \ud1a0\ub860\uc744 \uc885\ud569\ud574 \ubcf8 \ub4a4, \uc800\ub294 \ud655\uc2e4\ud788 \ub9e4\uc218(Buy) \uc785\uc7a5\uc744 \ucde8\ud558\uaca0\uc2b5\ub2c8\ub2e4.\n\n\uc6b0\uc120 \uc591\uce21 \ud575\uc2ec \ub17c\uc810\uc744 \uac04\ub2e8\ud788 \uc815\ub9ac\ud558\uba74\u2026\n\n\uac15\uc138 \uce21\uc740 \n\u2022 \uc9c0\ub09c 1\ub144\uac04 EPS 354%, \ub9e4\ucd9c 43.44%\ub77c\ub294 \uc555\ub3c4\uc801 \uc2e4\uc801 \uc131\uc7a5 \n\u2022 \uc55e\uc73c\ub85c\ub3c4 EPS \uc5f0\ud3c9\uade0 3.85%, \ub9e4\ucd9c 12.37% \uc99d\uac00 \uc608\uc0c1 \n\u2022 Toss \ud50c\ub7ab\ud3fc \ub0b4 \u2018\uc571 \uc778 \uc571\u2019 \uae30\ub2a5, Apple Games \ucd9c\uc2dc \ub4f1\uc73c\ub85c \ucc28\ubcc4\ud654\ub41c \uacbd\uc7c1\ub825 \ud655\ubcf4 \n\u2022 \uc911\u00b7\uc7a5\uae30 50/200\uc77c \uc774\ub3d9\ud3c9\uade0\uc120 \uc0c1\uc2b9, MACD\u00b7RSI\ub3c4 \uae0d\uc815\uc801 \ubaa8\uba58\ud140 \uc2dc\uadf8\ub110 \n\n\uc57d\uc138 \uce21\uc740 \n\u2022 \ub2e8\uae30\uc801\uc73c\ub85c 10\uc77c EMA\u00b7MACD \ud788\uc2a4\ud1a0\uadf8\ub7a8 \uc57d\ud654\uac00 \uc870\uc815 \uc2e0\ud638 \n\u2022 \uc9c0\uc815\ud559\uc801 \ubd88\uc548(\uc911\ub3d9 \uae34\uc7a5) \ubc0f \uc6d0\uc790\uc7ac \uac00\uaca9 \uc0c1\uc2b9 \uc704\ud5d8 \n\u2022 Apple Games \ub4f1 \uc2e0\uaddc \uacbd\uc7c1\uc790\uc758 \uc704\ud611\uc73c\ub85c \uc2dc\uc7a5 \uc810\uc720\uc728 \ud558\ub77d \uac00\ub2a5\uc131 \n\u2022 \ubbf8\ub798 \uc131\uc7a5\ub960(3.85%, 12.37%)\uc774 \uc774\ubbf8 \uc8fc\uac00\uc5d0 \uc120\ubc18\uc601\ub410\uc744 \uc6b0\ub824 \n\n\uc774 \uc911\uc5d0\uc11c \uac00\uc7a5 \uc124\ub4dd\ub825 \uc788\ub294 \ud3ec\uc778\ud2b8\ub294 \u2018\uac15\ub825\ud55c \ud380\ub354\uba58\ud138 \uc131\uc7a5\u2019\uc785\ub2c8\ub2e4. 1\ub144\uac04 \uc2e4\uc801 \ud3ed\uc99d\uc740 \uc77c\ud68c\uc131\uc774 \uc544\ub2c8\ub77c \ud50c\ub7ab\ud3fc \ube44\uc988\ub2c8\uc2a4 \ubaa8\ub378\uc758 \ud798\uc744 \ubcf4\uc5ec\uc900 \uac83\uc774\uace0, \ud5a5\ud6c4\uc5d0\ub3c4 \uc548\uc815\uc801\uc778 \ub9e4\ucd9c\u00b7\uc774\uc775 \ud655\uc7a5\uc774 \uac00\ub2a5\ud558\ub2e4\ub294 \uc804\ub9dd\uc774 \ub2e4\uc218 \uc560\ub110\ub9ac\uc2a4\ud2b8\uc5d0\uac8c\uc11c \uae0d\uc815\uc801\uc73c\ub85c \ub098\uc628\ub2e4\ub294 \uc810\uc774 \uc911\uc694\ud569\ub2c8\ub2e4. \ubb3c\ub860 \ub2e8\uae30 \uc870\uc815\uc740 \uc62c \uc218 \uc788\uc9c0\ub9cc, \ubd88\ud655\uc2e4\uc131\uc744 \uc774\uc720\ub85c \uc644\uc804\ud788 \ubc30\uc81c\ud558\uae30\ubcf4\ub2e4 \uc774\ub97c \uc624\ud788\ub824 \uc800\uac00 \ub9e4\uc218 \uae30\ud68c\ub85c \ud65c\uc6a9\ud558\ub294 \ucabd\uc774 \ud569\ub9ac\uc801\uc774\ub77c\uace0 \ud310\ub2e8\ud588\uc2b5\ub2c8\ub2e4.\n\n\ud22c\uc790 \uacc4\ud68d\uc744 \uc544\ub798\uc640 \uac19\uc774 \uc81c\uc548\ub4dc\ub9bd\ub2c8\ub2e4.\n\n1. \ucd94\ucc9c \uc758\uacac: \ub9e4\uc218(Buy) \n2. \ucd94\ucc9c \uadfc\uac70: \n - \uae30\uc5c5\uc758 \uc218\uc775\uc131\uacfc \ub9e4\ucd9c \uc131\uc7a5\uc138\uac00 \uc5c5\uacc4 \ub300\ube44 \uc6d4\ub4f1\ud788 \ub192\uc73c\uba70, \ud5a5\ud6c4\uc5d0\ub3c4 \uafb8\uc900\ud55c \ud655\uc7a5\uc774 \uae30\ub300\ub428 \n - \ud50c\ub7ab\ud3fc\u00b7\ube0c\ub79c\ub4dc \ud30c\uc6cc\ub97c \ubc14\ud0d5\uc73c\ub85c \uacbd\uc7c1\uc0ac\ubcf4\ub2e4 \ube60\ub978 \ud601\uc2e0\uc774 \uac00\ub2a5 \n - \uc911\u00b7\uc7a5\uae30 \uae30\uc220\uc801 \uc9c0\ud45c(50/200\uc77c\uc120, MACD\u00b7RSI)\uac00 \uc5ec\uc804\ud788 \uae0d\uc815\uc801 \n - \ub2e8\uae30 \uc870\uc815\uc740 \uc790\uc5f0\uc2a4\ub7ec\uc6b4 \ubcc0\ub3d9\uc131\uc73c\ub85c \ubcf4\uace0 \ubd84\ud560 \ub9e4\uc218 \uae30\ud68c\ub85c \ud65c\uc6a9 \n\n3. \uad6c\uccb4\uc801 \uc2e4\ud589 \uc804\ub7b5 \n \uac00. \ubd84\ud560 \ub9e4\uc218: \ud604\uc7ac \uac00\uaca9\uc5d0\uc11c 3\ub2e8\uacc4\ub85c \ub098\ub220 \ubd84\ud560 \uc9c4\uc785. \uc608\ucee8\ub300 380\ub2ec\ub7ec, 365\ub2ec\ub7ec, 350\ub2ec\ub7ec \uc218\uc900\uc5d0\uc11c \uac01 1/3\uc529 \ub9e4\uc218. \n \ub098. \uc190\uc808\u00b7\uc218\uc775 \ubaa9\ud45c \uc124\uc815: \ucd5c\uadfc \uc9c0\uc9c0\uc120\uc778 345\ub2ec\ub7ec \uc544\ub798\ub85c 5% \uc774\uc0c1 \ud558\ub77d \uc2dc 1\ucc28 \uc190\uc808. \ubaa9\ud45c\uac00\ub294 430\ub2ec\ub7ec(\uc804\uace0\uc810 \ub3cc\ud30c)\ub85c \uc124\uc815 \n \ub2e4. \ubaa8\ub2c8\ud130\ub9c1 \ud3ec\uc778\ud2b8: \n - \ubd84\uae30 \uc2e4\uc801\uc774 \uc608\uce21\uce58\ub97c \ubc11\ub3cc\uac70\ub098 \ub9e4\ucd9c \uc131\uc7a5\ub960\uc774 10% \uc774\ud558\ub85c \ud558\ub77d\ud558\ub294 \uc9c0\ud45c \n - \uc8fc\uc694 \uacbd\uc81c\u00b7\uc9c0\uc815\ud559\uc801 \uc0ac\uac74(\uc911\ub3d9 \uc0c1\ud669, \uae08\ub9ac \uacb0\uc815 \ub4f1)\uacfc \uc6d0\uc790\uc7ac \uac00\uaca9 \ucd94\uc774 \n - Toss \ud50c\ub7ab\ud3fc \uc0ac\uc6a9\uc790 \uc218\u00b7ARPU(\uac00\uc785\uc790\ub2f9 \ud3c9\uade0 \ub9e4\ucd9c) \ubcc0\ud654 \n \ub77c. \ud3ec\ud2b8\ud3f4\ub9ac\uc624 \ube44\uc911: \uc804\uccb4 \uc704\ud5d8 \uc790\uc0b0\uc758 5~7% \uc774\ub0b4\ub85c \ube44\uc911 \uc81c\ud55c, \ub2e4\ub978 \uc5c5\uc885\u00b7\uc2a4\ud0c0\uc77c\uacfc\uc758 \ubd84\uc0b0 \uc720\uc9c0 \n\n4. \uacfc\uac70 \uc2e4\uc218 \uad50\ud6c8 \ubc18\uc601 \n - \ub2e8\uae30 \ubaa8\uba58\ud140 \uc2e0\ud638\uc5d0 \uacfc\ub3c4\ud558\uac8c \ubc18\uc751\ud574 \uc774\ud0c8\ud55c \uacbd\ud5d8\uc744 \uc904\uc774\uace0, \ud380\ub354\uba58\ud138\uacfc \uae30\uc220\uc801 \uc9c0\ud45c\uc758 \uacb0\ud569\uc5d0 \uc9d1\uc911 \n - \ucd94\uaca9 \ub9e4\uc218\ub97c \uc790\uc81c\ud558\uace0 \ubd84\ud560 \uc811\uadfc\uc73c\ub85c \ub9ac\uc2a4\ud06c \uad00\ub9ac \n\n\uc774\ub807\uac8c \uc911\uc7a5\uae30 \uc131\uc7a5 \uc2a4\ud1a0\ub9ac\ub97c \ubbff\ub418, \ub2e8\uae30 \uc870\uc815 \ub9ac\uc2a4\ud06c\ub294 \ub9e4\uc218 \ud0c0\uc774\ubc0d\uc73c\ub85c \uc0bc\uc544 \ub2e8\uacc4\uc801\uc73c\ub85c \uc9c4\uc785\ud558\ub294 \uc804\ub7b5\uc744 \ucd94\ucc9c\ub4dc\ub9bd\ub2c8\ub2e4. \uc774\uc0c1\uc785\ub2c8\ub2e4." + }, + "trader_investment_decision": "\uc548\ub155\ud558\uc138\uc694. APP \uc8fc\uc2dd\uc5d0 \ub300\ud55c \uc885\ud569\uc801\uc778 \ubd84\uc11d\uc744 \ubc14\ud0d5\uc73c\ub85c \ud22c\uc790 \uacb0\uc815\uc744 \ub0b4\ub9ac\uaca0\uc2b5\ub2c8\ub2e4. \uc81c\uc548\ub41c \ud22c\uc790 \uacc4\ud68d\uc744 \uba74\ubc00\ud788 \uac80\ud1a0\ud55c \uacb0\uacfc, \ub2e4\uc74c\uacfc \uac19\uc740 \uacb0\ub860\uc5d0 \ub3c4\ub2ec\ud588\uc2b5\ub2c8\ub2e4.\n\n\uac15\uc138 \uce21\uc758 \uc2e4\uc801 \uc131\uc7a5\uacfc \uae0d\uc815\uc801\uc778 \uae30\uc220\uc801 \uc9c0\ud45c\ub294 \ub9e4\uc6b0 \ub9e4\ub825\uc801\uc785\ub2c8\ub2e4. \ud2b9\ud788, EPS\uc640 \ub9e4\ucd9c \uc131\uc7a5\ub960\uc774 \uc5c5\uacc4 \ud3c9\uade0\uc744 \ud06c\uac8c \ucd08\uacfc\ud558\uace0 \uc788\uc73c\uba70, \ud50c\ub7ab\ud3fc\uc758 \ucc28\ubcc4\ud654\ub41c \uacbd\uc7c1\ub825\uc740 \uc911\uc7a5\uae30\uc801\uc73c\ub85c \uc548\uc815\uc801\uc778 \uc218\uc775\uc744 \uae30\ub300\ud560 \uc218 \uc788\uac8c \ud569\ub2c8\ub2e4. \ub610\ud55c, \ub2e8\uae30 \uc870\uc815\uc774 \uc788\uc744 \uc218 \uc788\uc9c0\ub9cc, \uc774\ub97c \uc800\uac00 \ub9e4\uc218 \uae30\ud68c\ub85c \ud65c\uc6a9\ud558\ub294 \uc804\ub7b5\uc740 \uacfc\uac70\uc758 \uacbd\ud5d8\uc744 \ud1b5\ud574 \uac80\uc99d\ub41c \ubc14 \uc788\uc2b5\ub2c8\ub2e4.\n\n\ubc18\uba74, \uc57d\uc138 \uce21\uc758 \uc6b0\ub824 \uc0ac\ud56d\ub3c4 \ubb34\uc2dc\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \uc9c0\uc815\ud559\uc801 \ubd88\uc548\uacfc \uc2e0\uaddc \uacbd\uc7c1\uc790\uc758 \uc704\ud611\uc740 \ubd84\uba85\ud788 \ub9ac\uc2a4\ud06c \uc694\uc18c\uc785\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \uc774\ub7ec\ud55c \ub9ac\uc2a4\ud06c\ub294 \uc2dc\uc7a5\uc758 \ubcc0\ub3d9\uc131\uc744 \ubc18\uc601\ud558\ub294 \uc790\uc5f0\uc2a4\ub7ec\uc6b4 \ud604\uc0c1\uc73c\ub85c \ubcfc \uc218 \uc788\uc73c\uba70, \uc774\ub97c \ud1b5\ud574 \uc624\ud788\ub824 \ub9e4\uc218 \uae30\ud68c\ub97c \ud3ec\ucc29\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n\ub530\ub77c\uc11c, APP \uc8fc\uc2dd\uc5d0 \ub300\ud55c \ucd94\ucc9c \uc758\uacac\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.\n\n1. \ucd94\ucc9c \uc758\uacac: \ub9e4\uc218(Buy) \n2. \ucd94\ucc9c \uadfc\uac70: \n - \uac15\ub825\ud55c \ud380\ub354\uba58\ud138 \uc131\uc7a5\uacfc \uae0d\uc815\uc801\uc778 \uae30\uc220\uc801 \uc9c0\ud45c \n - \ub2e8\uae30 \uc870\uc815\uc740 \ub9e4\uc218 \uae30\ud68c\ub85c \ud65c\uc6a9 \uac00\ub2a5 \n - \ubd84\ud560 \ub9e4\uc218 \uc804\ub7b5\uc744 \ud1b5\ud574 \ub9ac\uc2a4\ud06c \uad00\ub9ac \uac00\ub2a5 \n\n3. \uad6c\uccb4\uc801 \uc2e4\ud589 \uc804\ub7b5: \n - \ud604\uc7ac \uac00\uaca9\uc5d0\uc11c 3\ub2e8\uacc4\ub85c \ub098\ub220 \ubd84\ud560 \ub9e4\uc218 \n - \uc190\uc808 \ubc0f \ubaa9\ud45c\uac00 \uc124\uc815 \n - \uc8fc\uc694 \uacbd\uc81c \ubc0f \uc9c0\uc815\ud559\uc801 \uc0ac\uac74 \ubaa8\ub2c8\ud130\ub9c1 \n\n4. \uacfc\uac70 \uc2e4\uc218 \uad50\ud6c8 \ubc18\uc601: \n - \ud380\ub354\uba58\ud138\uacfc \uae30\uc220\uc801 \uc9c0\ud45c\uc758 \uacb0\ud569\uc5d0 \uc9d1\uc911 \n - \ubd84\ud560 \uc811\uadfc\uc73c\ub85c \ub9ac\uc2a4\ud06c \uad00\ub9ac \n\n\uc774\ub7ec\ud55c \ubd84\uc11d\uc744 \ubc14\ud0d5\uc73c\ub85c APP \uc8fc\uc2dd\uc5d0 \ub300\ud55c \ub9e4\uc218 \uacb0\uc815\uc744 \ub0b4\ub9ac\uaca0\uc2b5\ub2c8\ub2e4. \n\nFINAL TRANSACTION PROPOSAL: **BUY**", + "risk_debate_state": { + "risky_history": "\nRisky Analyst: \uc548\ub155\ud558\uc138\uc694. APP \uc8fc\uc2dd\uc5d0 \ub300\ud55c \ud22c\uc790 \uacb0\uc815\uc744 \uc9c0\uc9c0\ud558\ub294 \uc785\uc7a5\uc5d0\uc11c, \ubcf4\uc218\uc801\uc774\uace0 \uc911\ub9bd\uc801\uc778 \ubd84\uc11d\uac00\ub4e4\uc758 \uc6b0\ub824 \uc0ac\ud56d\uc744 \ubc18\ubc15\ud558\uba70 APP\uc758 \ub9e4\uc218 \ucd94\ucc9c \uc774\uc720\ub97c \uac15\uc870\ud558\uace0\uc790 \ud569\ub2c8\ub2e4.\n\n\uccab\uc9f8, \ubcf4\uc218\uc801 \ubd84\uc11d\uac00\uac00 \uc9c0\uc801\ud55c \uc9c0\uc815\ud559\uc801 \ubd88\uc548\uacfc \uc2e0\uaddc \uacbd\uc7c1\uc790\uc758 \uc704\ud611\uc740 \ubd84\uba85\ud788 \ub9ac\uc2a4\ud06c \uc694\uc18c\ub85c \uc791\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \uc774\ub7ec\ud55c \ub9ac\uc2a4\ud06c\ub294 \uc2dc\uc7a5\uc758 \uc790\uc5f0\uc2a4\ub7ec\uc6b4 \ubcc0\ub3d9\uc131\uc744 \ubc18\uc601\ud558\ub294 \uac83\uc774\uba70, \uc624\ud788\ub824 \uc774\ub7ec\ud55c \uc0c1\ud669\uc5d0\uc11c \uc800\uac00 \ub9e4\uc218 \uae30\ud68c\ub97c \ud3ec\ucc29\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. APP\uc758 \uacbd\uc6b0, \ucd5c\uadfc\uc758 \uc9c0\uc815\ud559\uc801 \uae34\uc7a5\uc5d0\ub3c4 \ubd88\uad6c\ud558\uace0 \uc8fc\uac00\ub294 \uc5ec\uc804\ud788 \uac15\ud55c \uc0c1\uc2b9\uc138\ub97c \ubcf4\uc774\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub294 APP\uac00 \uc2dc\uc7a5\uc5d0\uc11c\uc758 \uacbd\uc7c1\ub825\uc744 \uc720\uc9c0\ud558\uace0 \uc788\ub2e4\ub294 \uac15\ub825\ud55c \uc2e0\ud638\uc785\ub2c8\ub2e4. \ub610\ud55c, APP\uc758 \ud50c\ub7ab\ud3fc\uc740 \ucc28\ubcc4\ud654\ub41c \uacbd\uc7c1\ub825\uc744 \uac16\ucd94\uace0 \uc788\uc5b4 \uc2e0\uaddc \uacbd\uc7c1\uc790\uac00 \uc9c4\uc785\ud558\ub354\ub77c\ub3c4 \uc27d\uac8c \uc2dc\uc7a5 \uc810\uc720\uc728\uc744 \ube7c\uc557\uae30\uc9c0 \uc54a\uc744 \uac83\uc785\ub2c8\ub2e4.\n\n\ub458\uc9f8, \uc911\ub9bd\uc801\uc778 \ubd84\uc11d\uac00\uac00 \uc5b8\uae09\ud55c \ub2e8\uae30 \uc870\uc815 \uac00\ub2a5\uc131\uc5d0 \ub300\ud55c \uc6b0\ub824\ub294 \uacfc\uac70\uc758 \ub370\uc774\ud130\ub97c \ud1b5\ud574 \ucda9\ubd84\ud788 \ubc18\ubc15\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. APP\uc758 \uc8fc\uac00\ub294 5\uc6d4 \ucd08\uc5d0 \ube44\ud574 \uae09\uaca9\ud788 \uc0c1\uc2b9\ud558\uc600\uace0, \ub2e8\uae30 \uc870\uc815\uc774 \uc788\uc744 \uc218 \uc788\uc9c0\ub9cc, \uc774\ub294 \uacfc\uac70\uc5d0\ub3c4 \uc800\uac00 \ub9e4\uc218 \uae30\ud68c\ub85c \ud65c\uc6a9\ub41c \ubc14 \uc788\uc2b5\ub2c8\ub2e4. APP\uc758 EPS\ub294 354% \uc99d\uac00\ud588\uc73c\uba70, \ub9e4\ucd9c \uc131\uc7a5\ub960\ub3c4 43.44%\uc5d0 \ub2ec\ud569\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ud380\ub354\uba58\ud138\uc774 \ub4b7\ubc1b\uce68\ub418\uace0 \uc788\ub294 \uc0c1\ud669\uc5d0\uc11c \ub2e8\uae30 \uc870\uc815\uc740 \uc624\ud788\ub824 \uc7a5\uae30 \ud22c\uc790\uc790\uc5d0\uac8c\ub294 \ub9e4\ub825\uc801\uc778 \uc9c4\uc785 \uae30\ud68c\uac00 \ub420 \uac83\uc785\ub2c8\ub2e4.\n\n\uc14b\uc9f8, APP\uc758 \uae30\uc220\uc801 \uc9c0\ud45c\ub97c \uc0b4\ud3b4\ubcf4\uba74, 50 SMA\uc640 200 SMA \ubaa8\ub450 \uc0c1\uc2b9\uc138\ub97c \ubcf4\uc774\uace0 \uc788\uc5b4 \uc911\uc7a5\uae30\uc801\uc73c\ub85c \uae0d\uc815\uc801\uc778 \uc804\ub9dd\uc744 \uc81c\uc2dc\ud569\ub2c8\ub2e4. MACD\uc640 RSI \uc9c0\ud45c \ub610\ud55c \uc0c1\uc2b9 \ubaa8\uba58\ud140\uc744 \ub098\ud0c0\ub0b4\uace0 \uc788\uc73c\uba70, \uc774\ub294 APP\uc758 \uc8fc\uac00\uac00 \uc55e\uc73c\ub85c\ub3c4 \uc0c1\uc2b9\ud560 \uac00\ub2a5\uc131\uc774 \ub192\ub2e4\ub294 \uac83\uc744 \uc758\ubbf8\ud569\ub2c8\ub2e4. \ub2e8\uae30\uc801\uc778 \uc870\uc815\uc774 \uc788\ub354\ub77c\ub3c4, \uc774\ub7ec\ud55c \uac15\ub825\ud55c \ud380\ub354\uba58\ud138\uacfc \uae30\uc220\uc801 \uc9c0\ud45c\ub294 APP\uc758 \uc8fc\uac00\uac00 \ub2e4\uc2dc \uc0c1\uc2b9\ud560 \uac83\uc774\ub77c\ub294 \uc2e0\ub8b0\ub97c \uc90d\ub2c8\ub2e4.\n\n\ub9c8\uc9c0\ub9c9\uc73c\ub85c, APP\uc758 \ubbf8\ub798 \uc131\uc7a5 \uac00\ub2a5\uc131\uc744 \uac04\uacfc\ud574\uc11c\ub294 \uc548 \ub429\ub2c8\ub2e4. \uc560\ub110\ub9ac\uc2a4\ud2b8\ub4e4\uc740 APP\uc758 \ubaa9\ud45c \uc8fc\uac00\ub97c 538\ub2ec\ub7ec\ub85c \uc608\uc0c1\ud558\uace0 \uc788\uc73c\uba70, \uc774\ub294 \ud604\uc7ac \uc8fc\uac00\uc5d0\uc11c \uc57d 75.4%\uc758 \uc0c1\uc2b9 \uc5ec\ub825\uc744 \uc758\ubbf8\ud569\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uc7a0\uc7ac\uc801 \uc218\uc775\uc744 \uace0\ub824\ud560 \ub54c, APP\uc5d0 \ub300\ud55c \ud22c\uc790\ub294 \ub2e8\uc21c\ud55c \ub9ac\uc2a4\ud06c\ub97c \ub118\uc5b4\uc11c \ub192\uc740 \ubcf4\uc0c1\uc744 \uae30\ub300\ud560 \uc218 \uc788\ub294 \uae30\ud68c\uc785\ub2c8\ub2e4.\n\n\uacb0\ub860\uc801\uc73c\ub85c, APP \uc8fc\uc2dd\uc5d0 \ub300\ud55c \ub9e4\uc218 \uacb0\uc815\uc740 \ub2e8\uc21c\ud788 \ud604\uc7ac\uc758 \uc2dc\uc7a5 \uc0c1\ud669\uc744 \ubc18\uc601\ud558\ub294 \uac83\uc774 \uc544\ub2c8\ub77c, \ubbf8\ub798\uc758 \uc131\uc7a5 \uac00\ub2a5\uc131\uacfc \uc2dc\uc7a5\uc5d0\uc11c\uc758 \uacbd\uc7c1\ub825\uc744 \uace0\ub824\ud55c \uc804\ub7b5\uc801 \uc120\ud0dd\uc785\ub2c8\ub2e4. \ubcf4\uc218\uc801\uc774\uace0 \uc911\ub9bd\uc801\uc778 \uc2dc\uac01\uc774 \ub193\uce58\ub294 \uae30\ud68c\ub97c \ud3ec\ucc29\ud558\uc5ec, \uc6b0\ub9ac\ub294 \ub354 \ub192\uc740 \uc218\uc775\uc744 \ucd94\uad6c\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. APP \uc8fc\uc2dd\uc5d0 \ub300\ud55c \ub9e4\uc218\ub294 \uc774\ub7ec\ud55c \uace0\uc704\ud5d8 \uace0\uc218\uc775 \uc804\ub7b5\uc758 \uc77c\ud658\uc73c\ub85c, \uc7a5\uae30\uc801\uc73c\ub85c \ud22c\uc790\uc790\uc5d0\uac8c \ud070 \ubcf4\uc0c1\uc744 \uac00\uc838\ub2e4\uc904 \uac83\uc785\ub2c8\ub2e4.", + "safe_history": "\nSafe Analyst: \uc548\ub155\ud558\uc138\uc694. APP \uc8fc\uc2dd\uc5d0 \ub300\ud55c \ud22c\uc790 \uacb0\uc815\uc744 \uc9c0\uc9c0\ud558\ub294 \uc785\uc7a5\uc5d0\uc11c, \ub9ac\uc2a4\ud06c\uac00 \ub192\uc740 \uc694\uc18c\ub4e4\uc744 \uac04\uacfc\ud558\uace0 \uc788\ub294 \uc810\uc744 \uc9c0\uc801\ud558\uace0 \uc2f6\uc2b5\ub2c8\ub2e4. \ub9ac\uc2a4\ud06c \ubd84\uc11d\uac00\ub85c\uc11c, \uc5ec\ub7ec\ubd84\uc758 \ub099\uad00\uc801\uc778 \uc2dc\uac01\uc774 \uc2e4\uc81c\ub85c\ub294 \uc5ec\ub7ec \uc7a0\uc7ac\uc801 \uc704\ud5d8\uc744 \uac04\uacfc\ud558\uace0 \uc788\ub2e4\ub294 \uc810\uc744 \uac15\uc870\ud558\uace0 \uc2f6\uc2b5\ub2c8\ub2e4.\n\n\uccab\uc9f8, \uc9c0\uc815\ud559\uc801 \ubd88\uc548\uacfc \uc2e0\uaddc \uacbd\uc7c1\uc790\uc758 \uc704\ud611\uc744 \ub2e8\uc21c\ud788 \uc2dc\uc7a5\uc758 \uc790\uc5f0\uc2a4\ub7ec\uc6b4 \ubcc0\ub3d9\uc131\uc73c\ub85c \uce58\ubd80\ud558\ub294 \uac83\uc740 \ub9e4\uc6b0 \uc704\ud5d8\ud55c \uc811\uadfc\uc785\ub2c8\ub2e4. \uc911\ub3d9\uc758 \uae34\uc7a5 \uace0\uc870\ub294 \ub2e8\uc21c\ud55c \uc77c\uc2dc\uc801 \ud604\uc0c1\uc774 \uc544\ub2d9\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uc0ac\uac74\ub4e4\uc740 \uae00\ub85c\ubc8c \uacbd\uc81c\uc5d0 \uc2ec\uac01\ud55c \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc73c\uba70, APP\uc640 \uac19\uc740 \uae30\uc220 \uae30\uc5c5\uc758 \uc8fc\uac00\uc5d0\ub3c4 \ubd80\uc815\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud2b9\ud788, APP\uc758 \ud50c\ub7ab\ud3fc\uc774 \ucc28\ubcc4\ud654\ub41c \uacbd\uc7c1\ub825\uc744 \uac16\ucd94\uace0 \uc788\ub2e4\uace0 \ud558\ub354\ub77c\ub3c4, \uc2dc\uc7a5\uc758 \uc804\ubc18\uc801\uc778 \ubd88\uc548\uc815\uc131\uc740 \uc18c\ube44\uc790 \uc2e0\ub8b0\uc640 \uc9c0\ucd9c\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub530\ub77c\uc11c \uc774\ub7ec\ud55c \ub9ac\uc2a4\ud06c\ub97c \uac04\uacfc\ud558\ub294 \uac83\uc740 \ub9e4\uc6b0 \uc704\ud5d8\ud569\ub2c8\ub2e4.\n\n\ub458\uc9f8, \ub2e8\uae30 \uc870\uc815 \uac00\ub2a5\uc131\uc744 \uacfc\uac70\uc758 \ub370\uc774\ud130\ub85c \ubc18\ubc15\ud558\ub294 \uac83\uc740 \ube44\ud604\uc2e4\uc801\uc785\ub2c8\ub2e4. \uacfc\uac70\uc758 \uc131\uacfc\uac00 \ubbf8\ub798\uc758 \uc131\uacfc\ub97c \ubcf4\uc7a5\ud558\uc9c0 \uc54a\uc73c\uba70, APP\uc758 \uc8fc\uac00\uac00 \uae09\ub4f1\ud55c \ud6c4 \uc870\uc815\uc774 \ubc1c\uc0dd\ud560 \uacbd\uc6b0, \uc774\ub294 \ud22c\uc790\uc790\uc5d0\uac8c \ud070 \uc190\uc2e4\uc744 \ucd08\ub798\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud2b9\ud788, \ud604\uc7ac\uc758 \uae30\uc220\uc801 \uc9c0\ud45c\uc5d0\uc11c MACD \ud788\uc2a4\ud1a0\uadf8\ub7a8\uc774 \uc74c\uc218\ub85c \uc804\ud658\ub41c \uc810\uc740 \ubaa8\uba58\ud140 \uc57d\ud654\ub97c \uc2dc\uc0ac\ud558\uace0 \uc788\uc73c\uba70, \uc774\ub294 \ub2e8\uae30 \uc870\uc815\uc774 \ubd88\uac00\ud53c\ud560 \uc218 \uc788\uc74c\uc744 \ub098\ud0c0\ub0c5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uc2e0\ud638\ub97c \ubb34\uc2dc\ud558\uace0 \ub9e4\uc218 \uacb0\uc815\uc744 \ub0b4\ub9ac\ub294 \uac83\uc740 \ub9e4\uc6b0 \uc704\ud5d8\ud55c \uc804\ub7b5\uc785\ub2c8\ub2e4.\n\n\uc14b\uc9f8, APP\uc758 \ubbf8\ub798 \uc131\uc7a5 \uac00\ub2a5\uc131\uc744 \uac15\uc870\ud558\ub294 \uac83\uc740 \uc88b\uc9c0\ub9cc, \uadf8 \uc131\uc7a5\ub960\uc774 \uc608\uc0c1\ubcf4\ub2e4 \ub0ae\uc544\uc9c8 \uacbd\uc6b0 \ud22c\uc790\uc790\uc5d0\uac8c \ud070 \ud0c0\uaca9\uc774 \ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4. EPS\uc640 \ub9e4\ucd9c \uc131\uc7a5\ub960\uc774 \ud604\uc7ac\ub294 \ub192\uc9c0\ub9cc, \ud5a5\ud6c4 3.85%\uc640 12.37%\uc758 \uc131\uc7a5\ub960\uc774 \uc2e4\uc81c\ub85c \ub2ec\uc131\ub420 \uc218 \uc788\uc744\uc9c0\uc5d0 \ub300\ud55c \uc758\ubb38\uc774 \uc788\uc2b5\ub2c8\ub2e4. \uc2dc\uc7a5\uc758 \ubcc0\ub3d9\uc131\uacfc \uacbd\uc7c1 \uc2ec\ud654\ub85c \uc778\ud574 \uc774\ub7ec\ud55c \uc131\uc7a5\ub960\uc774 \uc800\uc870\ud560 \uacbd\uc6b0, APP\uc758 \uc8fc\uac00\ub294 \ud070 \ud558\ub77d\uc138\ub97c \uacaa\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n\uacb0\ub860\uc801\uc73c\ub85c, APP \uc8fc\uc2dd\uc5d0 \ub300\ud55c \ub9e4\uc218 \uacb0\uc815\uc740 \ub2e8\uc21c\ud788 \ud604\uc7ac\uc758 \uae0d\uc815\uc801\uc778 \uc9c0\ud45c\ub97c \uae30\ubc18\uc73c\ub85c \ud55c \uac83\uc774 \uc544\ub2c8\ub77c, \uc5ec\ub7ec \ub9ac\uc2a4\ud06c \uc694\uc18c\ub97c \ucda9\ubd84\ud788 \uace0\ub824\ud574\uc57c \ud569\ub2c8\ub2e4. \ubcf4\uc218\uc801\uc778 \uc811\uadfc\uc774 \uc7a5\uae30\uc801\uc73c\ub85c \uc548\uc815\uc801\uc778 \uc218\uc775\uc744 \ubcf4\uc7a5\ud560 \uc218 \uc788\uc73c\uba70, \ubd88\ud655\uc2e4\ud55c \uc2dc\uc7a5 \uc0c1\ud669\uc5d0\uc11c \uc790\uc0b0\uc744 \ubcf4\ud638\ud558\ub294 \ub370 \ub354 \ud6a8\uacfc\uc801\uc785\ub2c8\ub2e4. \ub530\ub77c\uc11c APP \uc8fc\uc2dd\uc5d0 \ub300\ud55c \ub9e4\uc218\ubcf4\ub2e4\ub294 \ubcf4\uc720 \ub610\ub294 \ub9e4\ub3c4 \uc804\ub7b5\uc774 \ub354 \uc548\uc804\ud55c \uc120\ud0dd\uc774 \ub420 \uac83\uc785\ub2c8\ub2e4.", + "neutral_history": "\nNeutral Analyst: \uc548\ub155\ud558\uc138\uc694. APP \uc8fc\uc2dd\uc5d0 \ub300\ud55c \ub17c\uc758\uc5d0\uc11c \uc591\uce21\uc758 \uc8fc\uc7a5\uc744 \uc798 \ub4e4\uc5c8\uc2b5\ub2c8\ub2e4. \ub9ac\uc2a4\ud06c\uac00 \ub192\uc740 \ubd84\uc11d\uac00\uc640 \ubcf4\uc218\uc801\uc778 \ubd84\uc11d\uac00\uc758 \uc758\uacac\uc744 \ubaa8\ub450 \uace0\ub824\ud558\uba74\uc11c, \uc911\ub9bd\uc801\uc778 \uc2dc\uac01\uc5d0\uc11c \uade0\ud615 \uc7a1\ud78c \uc811\uadfc\uc744 \uc81c\uc548\ud558\uace0\uc790 \ud569\ub2c8\ub2e4.\n\n\uba3c\uc800, \ub9ac\uc2a4\ud06c\uac00 \ub192\uc740 \ubd84\uc11d\uac00\uc758 \uc8fc\uc7a5\uc744 \uc0b4\ud3b4\ubcf4\uba74, APP\uc758 \uac15\ub825\ud55c \ud380\ub354\uba58\ud138\uacfc \uae30\uc220\uc801 \uc9c0\ud45c\ub97c \uac15\uc870\ud558\uba70 \ub2e8\uae30 \uc870\uc815\uc744 \uc800\uac00 \ub9e4\uc218 \uae30\ud68c\ub85c \ud65c\uc6a9\ud560 \uc218 \uc788\ub2e4\uace0 \uc8fc\uc7a5\ud569\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \uc774\ub7ec\ud55c \uc811\uadfc\uc740 \ub2e8\uae30\uc801\uc778 \uc2dc\uc7a5 \ubcc0\ub3d9\uc131\uc744 \uac04\uacfc\ud560 \uc704\ud5d8\uc774 \uc788\uc2b5\ub2c8\ub2e4. \uacfc\uac70\uc758 \ub370\uc774\ud130\uac00 \ud604\uc7ac\uc640 \ubbf8\ub798\ub97c \ubcf4\uc7a5\ud558\uc9c0 \uc54a\ub294\ub2e4\ub294 \uc810\uc740 \ub9e4\uc6b0 \uc911\uc694\ud569\ub2c8\ub2e4. APP\uc758 \uc8fc\uac00\uac00 \uae09\ub4f1\ud55c \ud6c4 \uc870\uc815\uc774 \ubc1c\uc0dd\ud560 \uacbd\uc6b0, \ud22c\uc790\uc790\ub4e4\uc740 \ud070 \uc190\uc2e4\uc744 \uc785\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub530\ub77c\uc11c \ub2e8\uae30 \uc870\uc815 \uac00\ub2a5\uc131\uc744 \ubb34\uc2dc\ud558\uace0 \ub9e4\uc218 \uacb0\uc815\uc744 \ub0b4\ub9ac\ub294 \uac83\uc740 \uc2e0\uc911\ud558\uc9c0 \ubabb\ud55c \uc811\uadfc\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n\ubc18\uba74, \ubcf4\uc218\uc801\uc778 \ubd84\uc11d\uac00\ub294 \uc9c0\uc815\ud559\uc801 \ubd88\uc548\uacfc \uc2e0\uaddc \uacbd\uc7c1\uc790\uc758 \uc704\ud611\uc744 \uac15\uc870\ud558\uba70 APP\uc758 \ubbf8\ub798 \uc131\uc7a5 \uac00\ub2a5\uc131\uc5d0 \ub300\ud55c \uc758\uad6c\uc2ec\uc744 \uc81c\uae30\ud569\ub2c8\ub2e4. \uc774\ub4e4\uc740 APP\uc758 \ud50c\ub7ab\ud3fc\uc774 \ucc28\ubcc4\ud654\ub41c \uacbd\uc7c1\ub825\uc744 \uac16\ucd94\uace0 \uc788\ub2e4\uace0 \ud558\ub354\ub77c\ub3c4, \uc2dc\uc7a5\uc758 \uc804\ubc18\uc801\uc778 \ubd88\uc548\uc815\uc131\uc774 \uc18c\ube44\uc790 \uc2e0\ub8b0\uc640 \uc9c0\ucd9c\uc5d0 \ubd80\uc815\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\ub2e4\uace0 \uc8fc\uc7a5\ud569\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \uc774\ub7ec\ud55c \uc6b0\ub824\ub294 APP\uc758 \uac15\ub825\ud55c \ud380\ub354\uba58\ud138\uacfc \uae30\uc220\uc801 \uc9c0\ud45c\uac00 \uc5ec\uc804\ud788 \uae0d\uc815\uc801\uc778 \uc2e0\ud638\ub97c \ubcf4\ub0b4\uace0 \uc788\ub2e4\ub294 \uc0ac\uc2e4\uc744 \uac04\uacfc\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. APP\ub294 \ud604\uc7ac\uc758 \uc2dc\uc7a5 \uc0c1\ud669\uc5d0\uc11c\ub3c4 \uacbd\uc7c1\ub825\uc744 \uc720\uc9c0\ud558\uace0 \uc788\uc73c\uba70, \uc774\ub294 \uc7a5\uae30\uc801\uc778 \uc131\uc7a5 \uac00\ub2a5\uc131\uc744 \ub4b7\ubc1b\uce68\ud558\ub294 \uc694\uc18c\uc785\ub2c8\ub2e4.\n\n\uacb0\uad6d, APP \uc8fc\uc2dd\uc5d0 \ub300\ud55c \ud22c\uc790 \uacb0\uc815\uc744 \ub0b4\ub9b4 \ub54c\ub294 \ub450 \uac00\uc9c0 \uce21\uba74\uc744 \ubaa8\ub450 \uace0\ub824\ud574\uc57c \ud569\ub2c8\ub2e4. \uc989, \uac15\ub825\ud55c \ud380\ub354\uba58\ud138\uacfc \uae30\uc220\uc801 \uc9c0\ud45c\ub97c \ubc14\ud0d5\uc73c\ub85c \ud55c \uc131\uc7a5 \uac00\ub2a5\uc131\uc744 \uc778\uc815\ud558\uba74\uc11c\ub3c4, \uc9c0\uc815\ud559\uc801 \ub9ac\uc2a4\ud06c\uc640 \uc2dc\uc7a5 \ubcc0\ub3d9\uc131\uc744 \ucda9\ubd84\ud788 \uac10\uc548\ud574\uc57c \ud569\ub2c8\ub2e4. \ub530\ub77c\uc11c, APP \uc8fc\uc2dd\uc5d0 \ub300\ud55c \uc811\uadfc\uc740 \ub2e8\uc21c\ud55c \ub9e4\uc218 \ub610\ub294 \ubcf4\uc720 \uc804\ub7b5\uc774 \uc544\ub2c8\ub77c, \ubd84\ud560 \ub9e4\uc218\uc640 \uac19\uc740 \ub9ac\uc2a4\ud06c \uad00\ub9ac \uc804\ub7b5\uc744 \ud1b5\ud574 \uc548\uc815\uc131\uc744 \ud655\ubcf4\ud558\ub294 \uac83\uc774 \ubc14\ub78c\uc9c1\ud569\ub2c8\ub2e4.\n\n\uc608\ub97c \ub4e4\uc5b4, \ud604\uc7ac \uac00\uaca9\uc5d0\uc11c \uc77c\uc815 \ube44\uc728\ub85c \ubd84\ud560 \ub9e4\uc218\ub97c \uc9c4\ud589\ud558\uace0, \uc190\uc808 \ubc0f \ubaa9\ud45c\uac00\ub97c \uc124\uc815\ud558\uc5ec \ub9ac\uc2a4\ud06c\ub97c \uad00\ub9ac\ud558\ub294 \uc804\ub7b5\uc774 \ud6a8\uacfc\uc801\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub610\ud55c, \uc8fc\uc694 \uacbd\uc81c \ubc0f \uc9c0\uc815\ud559\uc801 \uc0ac\uac74\uc744 \ubaa8\ub2c8\ud130\ub9c1\ud558\uc5ec \uc2dc\uc7a5\uc758 \ubcc0\ub3d9\uc131\uc5d0 \ub300\uc751\ud558\ub294 \uc720\uc5f0\ud55c \uc811\uadfc\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ubc29\uc2dd\uc73c\ub85c APP \uc8fc\uc2dd\uc5d0 \ub300\ud55c \ud22c\uc790\ub294 \uc131\uc7a5 \uc7a0\uc7ac\ub825\uc744 \ucd94\uad6c\ud558\uba74\uc11c\ub3c4 \ub9ac\uc2a4\ud06c\ub97c \ucd5c\uc18c\ud654\ud560 \uc218 \uc788\ub294 \uade0\ud615 \uc7a1\ud78c \uc804\ub7b5\uc774 \ub420 \uac83\uc785\ub2c8\ub2e4. \n\n\uacb0\ub860\uc801\uc73c\ub85c, APP \uc8fc\uc2dd\uc5d0 \ub300\ud55c \ud22c\uc790 \uacb0\uc815\uc740 \ub2e8\uc21c\ud788 \ud55c\ucabd\uc758 \uc758\uacac\uc5d0 \uc758\uc874\ud558\uae30\ubcf4\ub2e4\ub294, \ub2e4\uc591\ud55c \uc694\uc18c\ub97c \uc885\ud569\uc801\uc73c\ub85c \uace0\ub824\ud558\uc5ec \uc2e0\uc911\ud558\uac8c \uc811\uadfc\ud558\ub294 \uac83\uc774 \uac00\uc7a5 \ubc14\ub78c\uc9c1\ud558\ub2e4\uace0 \uc0dd\uac01\ud569\ub2c8\ub2e4.", + "history": "\nRisky Analyst: \uc548\ub155\ud558\uc138\uc694. APP \uc8fc\uc2dd\uc5d0 \ub300\ud55c \ud22c\uc790 \uacb0\uc815\uc744 \uc9c0\uc9c0\ud558\ub294 \uc785\uc7a5\uc5d0\uc11c, \ubcf4\uc218\uc801\uc774\uace0 \uc911\ub9bd\uc801\uc778 \ubd84\uc11d\uac00\ub4e4\uc758 \uc6b0\ub824 \uc0ac\ud56d\uc744 \ubc18\ubc15\ud558\uba70 APP\uc758 \ub9e4\uc218 \ucd94\ucc9c \uc774\uc720\ub97c \uac15\uc870\ud558\uace0\uc790 \ud569\ub2c8\ub2e4.\n\n\uccab\uc9f8, \ubcf4\uc218\uc801 \ubd84\uc11d\uac00\uac00 \uc9c0\uc801\ud55c \uc9c0\uc815\ud559\uc801 \ubd88\uc548\uacfc \uc2e0\uaddc \uacbd\uc7c1\uc790\uc758 \uc704\ud611\uc740 \ubd84\uba85\ud788 \ub9ac\uc2a4\ud06c \uc694\uc18c\ub85c \uc791\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \uc774\ub7ec\ud55c \ub9ac\uc2a4\ud06c\ub294 \uc2dc\uc7a5\uc758 \uc790\uc5f0\uc2a4\ub7ec\uc6b4 \ubcc0\ub3d9\uc131\uc744 \ubc18\uc601\ud558\ub294 \uac83\uc774\uba70, \uc624\ud788\ub824 \uc774\ub7ec\ud55c \uc0c1\ud669\uc5d0\uc11c \uc800\uac00 \ub9e4\uc218 \uae30\ud68c\ub97c \ud3ec\ucc29\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. APP\uc758 \uacbd\uc6b0, \ucd5c\uadfc\uc758 \uc9c0\uc815\ud559\uc801 \uae34\uc7a5\uc5d0\ub3c4 \ubd88\uad6c\ud558\uace0 \uc8fc\uac00\ub294 \uc5ec\uc804\ud788 \uac15\ud55c \uc0c1\uc2b9\uc138\ub97c \ubcf4\uc774\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub294 APP\uac00 \uc2dc\uc7a5\uc5d0\uc11c\uc758 \uacbd\uc7c1\ub825\uc744 \uc720\uc9c0\ud558\uace0 \uc788\ub2e4\ub294 \uac15\ub825\ud55c \uc2e0\ud638\uc785\ub2c8\ub2e4. \ub610\ud55c, APP\uc758 \ud50c\ub7ab\ud3fc\uc740 \ucc28\ubcc4\ud654\ub41c \uacbd\uc7c1\ub825\uc744 \uac16\ucd94\uace0 \uc788\uc5b4 \uc2e0\uaddc \uacbd\uc7c1\uc790\uac00 \uc9c4\uc785\ud558\ub354\ub77c\ub3c4 \uc27d\uac8c \uc2dc\uc7a5 \uc810\uc720\uc728\uc744 \ube7c\uc557\uae30\uc9c0 \uc54a\uc744 \uac83\uc785\ub2c8\ub2e4.\n\n\ub458\uc9f8, \uc911\ub9bd\uc801\uc778 \ubd84\uc11d\uac00\uac00 \uc5b8\uae09\ud55c \ub2e8\uae30 \uc870\uc815 \uac00\ub2a5\uc131\uc5d0 \ub300\ud55c \uc6b0\ub824\ub294 \uacfc\uac70\uc758 \ub370\uc774\ud130\ub97c \ud1b5\ud574 \ucda9\ubd84\ud788 \ubc18\ubc15\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. APP\uc758 \uc8fc\uac00\ub294 5\uc6d4 \ucd08\uc5d0 \ube44\ud574 \uae09\uaca9\ud788 \uc0c1\uc2b9\ud558\uc600\uace0, \ub2e8\uae30 \uc870\uc815\uc774 \uc788\uc744 \uc218 \uc788\uc9c0\ub9cc, \uc774\ub294 \uacfc\uac70\uc5d0\ub3c4 \uc800\uac00 \ub9e4\uc218 \uae30\ud68c\ub85c \ud65c\uc6a9\ub41c \ubc14 \uc788\uc2b5\ub2c8\ub2e4. APP\uc758 EPS\ub294 354% \uc99d\uac00\ud588\uc73c\uba70, \ub9e4\ucd9c \uc131\uc7a5\ub960\ub3c4 43.44%\uc5d0 \ub2ec\ud569\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ud380\ub354\uba58\ud138\uc774 \ub4b7\ubc1b\uce68\ub418\uace0 \uc788\ub294 \uc0c1\ud669\uc5d0\uc11c \ub2e8\uae30 \uc870\uc815\uc740 \uc624\ud788\ub824 \uc7a5\uae30 \ud22c\uc790\uc790\uc5d0\uac8c\ub294 \ub9e4\ub825\uc801\uc778 \uc9c4\uc785 \uae30\ud68c\uac00 \ub420 \uac83\uc785\ub2c8\ub2e4.\n\n\uc14b\uc9f8, APP\uc758 \uae30\uc220\uc801 \uc9c0\ud45c\ub97c \uc0b4\ud3b4\ubcf4\uba74, 50 SMA\uc640 200 SMA \ubaa8\ub450 \uc0c1\uc2b9\uc138\ub97c \ubcf4\uc774\uace0 \uc788\uc5b4 \uc911\uc7a5\uae30\uc801\uc73c\ub85c \uae0d\uc815\uc801\uc778 \uc804\ub9dd\uc744 \uc81c\uc2dc\ud569\ub2c8\ub2e4. MACD\uc640 RSI \uc9c0\ud45c \ub610\ud55c \uc0c1\uc2b9 \ubaa8\uba58\ud140\uc744 \ub098\ud0c0\ub0b4\uace0 \uc788\uc73c\uba70, \uc774\ub294 APP\uc758 \uc8fc\uac00\uac00 \uc55e\uc73c\ub85c\ub3c4 \uc0c1\uc2b9\ud560 \uac00\ub2a5\uc131\uc774 \ub192\ub2e4\ub294 \uac83\uc744 \uc758\ubbf8\ud569\ub2c8\ub2e4. \ub2e8\uae30\uc801\uc778 \uc870\uc815\uc774 \uc788\ub354\ub77c\ub3c4, \uc774\ub7ec\ud55c \uac15\ub825\ud55c \ud380\ub354\uba58\ud138\uacfc \uae30\uc220\uc801 \uc9c0\ud45c\ub294 APP\uc758 \uc8fc\uac00\uac00 \ub2e4\uc2dc \uc0c1\uc2b9\ud560 \uac83\uc774\ub77c\ub294 \uc2e0\ub8b0\ub97c \uc90d\ub2c8\ub2e4.\n\n\ub9c8\uc9c0\ub9c9\uc73c\ub85c, APP\uc758 \ubbf8\ub798 \uc131\uc7a5 \uac00\ub2a5\uc131\uc744 \uac04\uacfc\ud574\uc11c\ub294 \uc548 \ub429\ub2c8\ub2e4. \uc560\ub110\ub9ac\uc2a4\ud2b8\ub4e4\uc740 APP\uc758 \ubaa9\ud45c \uc8fc\uac00\ub97c 538\ub2ec\ub7ec\ub85c \uc608\uc0c1\ud558\uace0 \uc788\uc73c\uba70, \uc774\ub294 \ud604\uc7ac \uc8fc\uac00\uc5d0\uc11c \uc57d 75.4%\uc758 \uc0c1\uc2b9 \uc5ec\ub825\uc744 \uc758\ubbf8\ud569\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uc7a0\uc7ac\uc801 \uc218\uc775\uc744 \uace0\ub824\ud560 \ub54c, APP\uc5d0 \ub300\ud55c \ud22c\uc790\ub294 \ub2e8\uc21c\ud55c \ub9ac\uc2a4\ud06c\ub97c \ub118\uc5b4\uc11c \ub192\uc740 \ubcf4\uc0c1\uc744 \uae30\ub300\ud560 \uc218 \uc788\ub294 \uae30\ud68c\uc785\ub2c8\ub2e4.\n\n\uacb0\ub860\uc801\uc73c\ub85c, APP \uc8fc\uc2dd\uc5d0 \ub300\ud55c \ub9e4\uc218 \uacb0\uc815\uc740 \ub2e8\uc21c\ud788 \ud604\uc7ac\uc758 \uc2dc\uc7a5 \uc0c1\ud669\uc744 \ubc18\uc601\ud558\ub294 \uac83\uc774 \uc544\ub2c8\ub77c, \ubbf8\ub798\uc758 \uc131\uc7a5 \uac00\ub2a5\uc131\uacfc \uc2dc\uc7a5\uc5d0\uc11c\uc758 \uacbd\uc7c1\ub825\uc744 \uace0\ub824\ud55c \uc804\ub7b5\uc801 \uc120\ud0dd\uc785\ub2c8\ub2e4. \ubcf4\uc218\uc801\uc774\uace0 \uc911\ub9bd\uc801\uc778 \uc2dc\uac01\uc774 \ub193\uce58\ub294 \uae30\ud68c\ub97c \ud3ec\ucc29\ud558\uc5ec, \uc6b0\ub9ac\ub294 \ub354 \ub192\uc740 \uc218\uc775\uc744 \ucd94\uad6c\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. APP \uc8fc\uc2dd\uc5d0 \ub300\ud55c \ub9e4\uc218\ub294 \uc774\ub7ec\ud55c \uace0\uc704\ud5d8 \uace0\uc218\uc775 \uc804\ub7b5\uc758 \uc77c\ud658\uc73c\ub85c, \uc7a5\uae30\uc801\uc73c\ub85c \ud22c\uc790\uc790\uc5d0\uac8c \ud070 \ubcf4\uc0c1\uc744 \uac00\uc838\ub2e4\uc904 \uac83\uc785\ub2c8\ub2e4.\nSafe Analyst: \uc548\ub155\ud558\uc138\uc694. APP \uc8fc\uc2dd\uc5d0 \ub300\ud55c \ud22c\uc790 \uacb0\uc815\uc744 \uc9c0\uc9c0\ud558\ub294 \uc785\uc7a5\uc5d0\uc11c, \ub9ac\uc2a4\ud06c\uac00 \ub192\uc740 \uc694\uc18c\ub4e4\uc744 \uac04\uacfc\ud558\uace0 \uc788\ub294 \uc810\uc744 \uc9c0\uc801\ud558\uace0 \uc2f6\uc2b5\ub2c8\ub2e4. \ub9ac\uc2a4\ud06c \ubd84\uc11d\uac00\ub85c\uc11c, \uc5ec\ub7ec\ubd84\uc758 \ub099\uad00\uc801\uc778 \uc2dc\uac01\uc774 \uc2e4\uc81c\ub85c\ub294 \uc5ec\ub7ec \uc7a0\uc7ac\uc801 \uc704\ud5d8\uc744 \uac04\uacfc\ud558\uace0 \uc788\ub2e4\ub294 \uc810\uc744 \uac15\uc870\ud558\uace0 \uc2f6\uc2b5\ub2c8\ub2e4.\n\n\uccab\uc9f8, \uc9c0\uc815\ud559\uc801 \ubd88\uc548\uacfc \uc2e0\uaddc \uacbd\uc7c1\uc790\uc758 \uc704\ud611\uc744 \ub2e8\uc21c\ud788 \uc2dc\uc7a5\uc758 \uc790\uc5f0\uc2a4\ub7ec\uc6b4 \ubcc0\ub3d9\uc131\uc73c\ub85c \uce58\ubd80\ud558\ub294 \uac83\uc740 \ub9e4\uc6b0 \uc704\ud5d8\ud55c \uc811\uadfc\uc785\ub2c8\ub2e4. \uc911\ub3d9\uc758 \uae34\uc7a5 \uace0\uc870\ub294 \ub2e8\uc21c\ud55c \uc77c\uc2dc\uc801 \ud604\uc0c1\uc774 \uc544\ub2d9\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uc0ac\uac74\ub4e4\uc740 \uae00\ub85c\ubc8c \uacbd\uc81c\uc5d0 \uc2ec\uac01\ud55c \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc73c\uba70, APP\uc640 \uac19\uc740 \uae30\uc220 \uae30\uc5c5\uc758 \uc8fc\uac00\uc5d0\ub3c4 \ubd80\uc815\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud2b9\ud788, APP\uc758 \ud50c\ub7ab\ud3fc\uc774 \ucc28\ubcc4\ud654\ub41c \uacbd\uc7c1\ub825\uc744 \uac16\ucd94\uace0 \uc788\ub2e4\uace0 \ud558\ub354\ub77c\ub3c4, \uc2dc\uc7a5\uc758 \uc804\ubc18\uc801\uc778 \ubd88\uc548\uc815\uc131\uc740 \uc18c\ube44\uc790 \uc2e0\ub8b0\uc640 \uc9c0\ucd9c\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub530\ub77c\uc11c \uc774\ub7ec\ud55c \ub9ac\uc2a4\ud06c\ub97c \uac04\uacfc\ud558\ub294 \uac83\uc740 \ub9e4\uc6b0 \uc704\ud5d8\ud569\ub2c8\ub2e4.\n\n\ub458\uc9f8, \ub2e8\uae30 \uc870\uc815 \uac00\ub2a5\uc131\uc744 \uacfc\uac70\uc758 \ub370\uc774\ud130\ub85c \ubc18\ubc15\ud558\ub294 \uac83\uc740 \ube44\ud604\uc2e4\uc801\uc785\ub2c8\ub2e4. \uacfc\uac70\uc758 \uc131\uacfc\uac00 \ubbf8\ub798\uc758 \uc131\uacfc\ub97c \ubcf4\uc7a5\ud558\uc9c0 \uc54a\uc73c\uba70, APP\uc758 \uc8fc\uac00\uac00 \uae09\ub4f1\ud55c \ud6c4 \uc870\uc815\uc774 \ubc1c\uc0dd\ud560 \uacbd\uc6b0, \uc774\ub294 \ud22c\uc790\uc790\uc5d0\uac8c \ud070 \uc190\uc2e4\uc744 \ucd08\ub798\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud2b9\ud788, \ud604\uc7ac\uc758 \uae30\uc220\uc801 \uc9c0\ud45c\uc5d0\uc11c MACD \ud788\uc2a4\ud1a0\uadf8\ub7a8\uc774 \uc74c\uc218\ub85c \uc804\ud658\ub41c \uc810\uc740 \ubaa8\uba58\ud140 \uc57d\ud654\ub97c \uc2dc\uc0ac\ud558\uace0 \uc788\uc73c\uba70, \uc774\ub294 \ub2e8\uae30 \uc870\uc815\uc774 \ubd88\uac00\ud53c\ud560 \uc218 \uc788\uc74c\uc744 \ub098\ud0c0\ub0c5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uc2e0\ud638\ub97c \ubb34\uc2dc\ud558\uace0 \ub9e4\uc218 \uacb0\uc815\uc744 \ub0b4\ub9ac\ub294 \uac83\uc740 \ub9e4\uc6b0 \uc704\ud5d8\ud55c \uc804\ub7b5\uc785\ub2c8\ub2e4.\n\n\uc14b\uc9f8, APP\uc758 \ubbf8\ub798 \uc131\uc7a5 \uac00\ub2a5\uc131\uc744 \uac15\uc870\ud558\ub294 \uac83\uc740 \uc88b\uc9c0\ub9cc, \uadf8 \uc131\uc7a5\ub960\uc774 \uc608\uc0c1\ubcf4\ub2e4 \ub0ae\uc544\uc9c8 \uacbd\uc6b0 \ud22c\uc790\uc790\uc5d0\uac8c \ud070 \ud0c0\uaca9\uc774 \ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4. EPS\uc640 \ub9e4\ucd9c \uc131\uc7a5\ub960\uc774 \ud604\uc7ac\ub294 \ub192\uc9c0\ub9cc, \ud5a5\ud6c4 3.85%\uc640 12.37%\uc758 \uc131\uc7a5\ub960\uc774 \uc2e4\uc81c\ub85c \ub2ec\uc131\ub420 \uc218 \uc788\uc744\uc9c0\uc5d0 \ub300\ud55c \uc758\ubb38\uc774 \uc788\uc2b5\ub2c8\ub2e4. \uc2dc\uc7a5\uc758 \ubcc0\ub3d9\uc131\uacfc \uacbd\uc7c1 \uc2ec\ud654\ub85c \uc778\ud574 \uc774\ub7ec\ud55c \uc131\uc7a5\ub960\uc774 \uc800\uc870\ud560 \uacbd\uc6b0, APP\uc758 \uc8fc\uac00\ub294 \ud070 \ud558\ub77d\uc138\ub97c \uacaa\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n\uacb0\ub860\uc801\uc73c\ub85c, APP \uc8fc\uc2dd\uc5d0 \ub300\ud55c \ub9e4\uc218 \uacb0\uc815\uc740 \ub2e8\uc21c\ud788 \ud604\uc7ac\uc758 \uae0d\uc815\uc801\uc778 \uc9c0\ud45c\ub97c \uae30\ubc18\uc73c\ub85c \ud55c \uac83\uc774 \uc544\ub2c8\ub77c, \uc5ec\ub7ec \ub9ac\uc2a4\ud06c \uc694\uc18c\ub97c \ucda9\ubd84\ud788 \uace0\ub824\ud574\uc57c \ud569\ub2c8\ub2e4. \ubcf4\uc218\uc801\uc778 \uc811\uadfc\uc774 \uc7a5\uae30\uc801\uc73c\ub85c \uc548\uc815\uc801\uc778 \uc218\uc775\uc744 \ubcf4\uc7a5\ud560 \uc218 \uc788\uc73c\uba70, \ubd88\ud655\uc2e4\ud55c \uc2dc\uc7a5 \uc0c1\ud669\uc5d0\uc11c \uc790\uc0b0\uc744 \ubcf4\ud638\ud558\ub294 \ub370 \ub354 \ud6a8\uacfc\uc801\uc785\ub2c8\ub2e4. \ub530\ub77c\uc11c APP \uc8fc\uc2dd\uc5d0 \ub300\ud55c \ub9e4\uc218\ubcf4\ub2e4\ub294 \ubcf4\uc720 \ub610\ub294 \ub9e4\ub3c4 \uc804\ub7b5\uc774 \ub354 \uc548\uc804\ud55c \uc120\ud0dd\uc774 \ub420 \uac83\uc785\ub2c8\ub2e4.\nNeutral Analyst: \uc548\ub155\ud558\uc138\uc694. APP \uc8fc\uc2dd\uc5d0 \ub300\ud55c \ub17c\uc758\uc5d0\uc11c \uc591\uce21\uc758 \uc8fc\uc7a5\uc744 \uc798 \ub4e4\uc5c8\uc2b5\ub2c8\ub2e4. \ub9ac\uc2a4\ud06c\uac00 \ub192\uc740 \ubd84\uc11d\uac00\uc640 \ubcf4\uc218\uc801\uc778 \ubd84\uc11d\uac00\uc758 \uc758\uacac\uc744 \ubaa8\ub450 \uace0\ub824\ud558\uba74\uc11c, \uc911\ub9bd\uc801\uc778 \uc2dc\uac01\uc5d0\uc11c \uade0\ud615 \uc7a1\ud78c \uc811\uadfc\uc744 \uc81c\uc548\ud558\uace0\uc790 \ud569\ub2c8\ub2e4.\n\n\uba3c\uc800, \ub9ac\uc2a4\ud06c\uac00 \ub192\uc740 \ubd84\uc11d\uac00\uc758 \uc8fc\uc7a5\uc744 \uc0b4\ud3b4\ubcf4\uba74, APP\uc758 \uac15\ub825\ud55c \ud380\ub354\uba58\ud138\uacfc \uae30\uc220\uc801 \uc9c0\ud45c\ub97c \uac15\uc870\ud558\uba70 \ub2e8\uae30 \uc870\uc815\uc744 \uc800\uac00 \ub9e4\uc218 \uae30\ud68c\ub85c \ud65c\uc6a9\ud560 \uc218 \uc788\ub2e4\uace0 \uc8fc\uc7a5\ud569\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \uc774\ub7ec\ud55c \uc811\uadfc\uc740 \ub2e8\uae30\uc801\uc778 \uc2dc\uc7a5 \ubcc0\ub3d9\uc131\uc744 \uac04\uacfc\ud560 \uc704\ud5d8\uc774 \uc788\uc2b5\ub2c8\ub2e4. \uacfc\uac70\uc758 \ub370\uc774\ud130\uac00 \ud604\uc7ac\uc640 \ubbf8\ub798\ub97c \ubcf4\uc7a5\ud558\uc9c0 \uc54a\ub294\ub2e4\ub294 \uc810\uc740 \ub9e4\uc6b0 \uc911\uc694\ud569\ub2c8\ub2e4. APP\uc758 \uc8fc\uac00\uac00 \uae09\ub4f1\ud55c \ud6c4 \uc870\uc815\uc774 \ubc1c\uc0dd\ud560 \uacbd\uc6b0, \ud22c\uc790\uc790\ub4e4\uc740 \ud070 \uc190\uc2e4\uc744 \uc785\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub530\ub77c\uc11c \ub2e8\uae30 \uc870\uc815 \uac00\ub2a5\uc131\uc744 \ubb34\uc2dc\ud558\uace0 \ub9e4\uc218 \uacb0\uc815\uc744 \ub0b4\ub9ac\ub294 \uac83\uc740 \uc2e0\uc911\ud558\uc9c0 \ubabb\ud55c \uc811\uadfc\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n\ubc18\uba74, \ubcf4\uc218\uc801\uc778 \ubd84\uc11d\uac00\ub294 \uc9c0\uc815\ud559\uc801 \ubd88\uc548\uacfc \uc2e0\uaddc \uacbd\uc7c1\uc790\uc758 \uc704\ud611\uc744 \uac15\uc870\ud558\uba70 APP\uc758 \ubbf8\ub798 \uc131\uc7a5 \uac00\ub2a5\uc131\uc5d0 \ub300\ud55c \uc758\uad6c\uc2ec\uc744 \uc81c\uae30\ud569\ub2c8\ub2e4. \uc774\ub4e4\uc740 APP\uc758 \ud50c\ub7ab\ud3fc\uc774 \ucc28\ubcc4\ud654\ub41c \uacbd\uc7c1\ub825\uc744 \uac16\ucd94\uace0 \uc788\ub2e4\uace0 \ud558\ub354\ub77c\ub3c4, \uc2dc\uc7a5\uc758 \uc804\ubc18\uc801\uc778 \ubd88\uc548\uc815\uc131\uc774 \uc18c\ube44\uc790 \uc2e0\ub8b0\uc640 \uc9c0\ucd9c\uc5d0 \ubd80\uc815\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\ub2e4\uace0 \uc8fc\uc7a5\ud569\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \uc774\ub7ec\ud55c \uc6b0\ub824\ub294 APP\uc758 \uac15\ub825\ud55c \ud380\ub354\uba58\ud138\uacfc \uae30\uc220\uc801 \uc9c0\ud45c\uac00 \uc5ec\uc804\ud788 \uae0d\uc815\uc801\uc778 \uc2e0\ud638\ub97c \ubcf4\ub0b4\uace0 \uc788\ub2e4\ub294 \uc0ac\uc2e4\uc744 \uac04\uacfc\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. APP\ub294 \ud604\uc7ac\uc758 \uc2dc\uc7a5 \uc0c1\ud669\uc5d0\uc11c\ub3c4 \uacbd\uc7c1\ub825\uc744 \uc720\uc9c0\ud558\uace0 \uc788\uc73c\uba70, \uc774\ub294 \uc7a5\uae30\uc801\uc778 \uc131\uc7a5 \uac00\ub2a5\uc131\uc744 \ub4b7\ubc1b\uce68\ud558\ub294 \uc694\uc18c\uc785\ub2c8\ub2e4.\n\n\uacb0\uad6d, APP \uc8fc\uc2dd\uc5d0 \ub300\ud55c \ud22c\uc790 \uacb0\uc815\uc744 \ub0b4\ub9b4 \ub54c\ub294 \ub450 \uac00\uc9c0 \uce21\uba74\uc744 \ubaa8\ub450 \uace0\ub824\ud574\uc57c \ud569\ub2c8\ub2e4. \uc989, \uac15\ub825\ud55c \ud380\ub354\uba58\ud138\uacfc \uae30\uc220\uc801 \uc9c0\ud45c\ub97c \ubc14\ud0d5\uc73c\ub85c \ud55c \uc131\uc7a5 \uac00\ub2a5\uc131\uc744 \uc778\uc815\ud558\uba74\uc11c\ub3c4, \uc9c0\uc815\ud559\uc801 \ub9ac\uc2a4\ud06c\uc640 \uc2dc\uc7a5 \ubcc0\ub3d9\uc131\uc744 \ucda9\ubd84\ud788 \uac10\uc548\ud574\uc57c \ud569\ub2c8\ub2e4. \ub530\ub77c\uc11c, APP \uc8fc\uc2dd\uc5d0 \ub300\ud55c \uc811\uadfc\uc740 \ub2e8\uc21c\ud55c \ub9e4\uc218 \ub610\ub294 \ubcf4\uc720 \uc804\ub7b5\uc774 \uc544\ub2c8\ub77c, \ubd84\ud560 \ub9e4\uc218\uc640 \uac19\uc740 \ub9ac\uc2a4\ud06c \uad00\ub9ac \uc804\ub7b5\uc744 \ud1b5\ud574 \uc548\uc815\uc131\uc744 \ud655\ubcf4\ud558\ub294 \uac83\uc774 \ubc14\ub78c\uc9c1\ud569\ub2c8\ub2e4.\n\n\uc608\ub97c \ub4e4\uc5b4, \ud604\uc7ac \uac00\uaca9\uc5d0\uc11c \uc77c\uc815 \ube44\uc728\ub85c \ubd84\ud560 \ub9e4\uc218\ub97c \uc9c4\ud589\ud558\uace0, \uc190\uc808 \ubc0f \ubaa9\ud45c\uac00\ub97c \uc124\uc815\ud558\uc5ec \ub9ac\uc2a4\ud06c\ub97c \uad00\ub9ac\ud558\ub294 \uc804\ub7b5\uc774 \ud6a8\uacfc\uc801\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub610\ud55c, \uc8fc\uc694 \uacbd\uc81c \ubc0f \uc9c0\uc815\ud559\uc801 \uc0ac\uac74\uc744 \ubaa8\ub2c8\ud130\ub9c1\ud558\uc5ec \uc2dc\uc7a5\uc758 \ubcc0\ub3d9\uc131\uc5d0 \ub300\uc751\ud558\ub294 \uc720\uc5f0\ud55c \uc811\uadfc\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ubc29\uc2dd\uc73c\ub85c APP \uc8fc\uc2dd\uc5d0 \ub300\ud55c \ud22c\uc790\ub294 \uc131\uc7a5 \uc7a0\uc7ac\ub825\uc744 \ucd94\uad6c\ud558\uba74\uc11c\ub3c4 \ub9ac\uc2a4\ud06c\ub97c \ucd5c\uc18c\ud654\ud560 \uc218 \uc788\ub294 \uade0\ud615 \uc7a1\ud78c \uc804\ub7b5\uc774 \ub420 \uac83\uc785\ub2c8\ub2e4. \n\n\uacb0\ub860\uc801\uc73c\ub85c, APP \uc8fc\uc2dd\uc5d0 \ub300\ud55c \ud22c\uc790 \uacb0\uc815\uc740 \ub2e8\uc21c\ud788 \ud55c\ucabd\uc758 \uc758\uacac\uc5d0 \uc758\uc874\ud558\uae30\ubcf4\ub2e4\ub294, \ub2e4\uc591\ud55c \uc694\uc18c\ub97c \uc885\ud569\uc801\uc73c\ub85c \uace0\ub824\ud558\uc5ec \uc2e0\uc911\ud558\uac8c \uc811\uadfc\ud558\ub294 \uac83\uc774 \uac00\uc7a5 \ubc14\ub78c\uc9c1\ud558\ub2e4\uace0 \uc0dd\uac01\ud569\ub2c8\ub2e4.", + "judge_decision": "1. \ud575\uc2ec \ub17c\uc810 \uc694\uc57d \n- Risky Analyst (\uac15\uc138): \n \u2022 \u201cEPS 354%, \ub9e4\ucd9c 43.44%\ub77c\ub294 \uc555\ub3c4\uc801 \uc2e4\uc801 \uc131\uc7a5\u201d \n \u2022 \u201c50\u00b7200\uc77c \uc774\ub3d9\ud3c9\uade0\uc120, MACD\u00b7RSI \uae0d\uc815\uc801 \ubaa8\uba58\ud140\u201d \n \u2022 \u201c\uc560\ud50c \uac8c\uc784\uc988 \ub4f1 \uacbd\uc7c1\uc0ac \ub300\ube44 \ud50c\ub7ab\ud3fc \ucc28\ubcc4\ud654\ub85c \uc911\uc7a5\uae30 75.4% Upside(\ubaa9\ud45c\uac00 538\ub2ec\ub7ec)\u201d \n \u2022 \ub2e8\uae30 \uc870\uc815\uc740 \u201c\uc800\uac00 \ub9e4\uc218 \uae30\ud68c\u201d \n\n- Safe/Conservative Analyst (\uc57d\uc138): \n \u2022 \u201c\uc911\ub3d9 \uc9c0\uc815\ud559\uc801 \ub9ac\uc2a4\ud06c\uc640 \uc6d0\uc790\uc7ac \uac00\uaca9 \uc0c1\uc2b9\u201d \n \u2022 \u201cMACD \ud788\uc2a4\ud1a0\uadf8\ub7a8 \uc74c\uc804\ud658, 10\uc77c EMA \uc57d\ud654 \u2192 \ub2e8\uae30 \uc870\uc815 \uc2e0\ud638\u201d \n \u2022 \u201c\ubbf8\ub798 \uc131\uc7a5\ub960(3.85%, 12.37%)\uc774 \uc774\ubbf8 \uc8fc\uac00\uc5d0 \uc120\ubc18\uc601\ub410\uc744 \uac00\ub2a5\uc131\u201d \n \u2022 \ubd88\ud655\uc2e4\uc131 \uc2dc \u201c\ubcf4\uc720 \ud639\uc740 \ub9e4\ub3c4\u201d \uad8c\uace0 \n\n- Neutral Analyst (\uc911\ub9bd): \n \u2022 \u201c\uac15\ub825\ud55c \ud380\ub354\uba58\ud138\uacfc \uae30\uc220\uc801 \uc9c0\ud45c \uc778\uc815\ud558\ub418, \uc9c0\uc815\ud559\u00b7\ubaa8\uba58\ud140 \ub9ac\uc2a4\ud06c\ub3c4 \ubb34\uc2dc \ubd88\uac00\u201d \n \u2022 \u201c\ubd84\ud560 \ub9e4\uc218\uc640 \uc190\uc808\u00b7\ubaa9\ud45c\uac00 \uc124\uc815\uc73c\ub85c \ub9ac\uc2a4\ud06c \uad00\ub9ac \uc81c\uc548\u201d \n \u2022 \u201c\uc8fc\uc694 \uc774\ubca4\ud2b8 \ubaa8\ub2c8\ud130\ub9c1, \uc720\uc5f0\ud55c \ub300\uc751 \uc804\ub7b5 \ud544\uc694\u201d \n\n2. \ucd5c\uc885 \ucd94\ucc9c: Buy \n \ud310\ub2e8 \uadfc\uac70: \n - \ud380\ub354\uba58\ud138 \uc131\uc7a5(\u201cEPS 354%, \ub9e4\ucd9c 43.44%\u201d)\uacfc \uc560\ub110\ub9ac\uc2a4\ud2b8 \ubaa9\ud45c\uac00(538$)\ub294 \uc5ec\uc804\ud788 \ub9e4\uc218 \ub9e4\ub825 \ub192\uc74c. \n - \uc911\u00b7\uc7a5\uae30 \uae30\uc220\uc9c0\ud45c(50/200\uc77c\uc120, MACD\u00b7RSI) \uc0c1\uc2b9 \ucd94\uc138 \uc9c0\uc18d. \n - \uc57d\uc138 \uce21\uc774 \uc9c0\uc801\ud55c \ub2e8\uae30 \ubaa8\uba58\ud140 \uc57d\ud654\uc640 \uc9c0\uc815\ud559 \ub9ac\uc2a4\ud06c\ub294 \u201c\ubd84\ud560 \ub9e4\uc218\u00b7\uc190\uc808\u00b7\ubaa8\ub2c8\ud130\ub9c1\u201d \uc804\ub7b5\uc73c\ub85c \ucda9\ubd84\ud788 \uad00\ub9ac \uac00\ub2a5. \n\n3. \uac1c\uc120\ub41c \uc2e4\ud589 \uc804\ub7b5 \n \uac00. \ubd84\ud560 \ub9e4\uc218 \uc2dc\uc810 \uc870\uc815 \n - 1\ucc28 \uc9c4\uc785: 380$ \uadfc\ucc98 \u2192 \uac15\uc138 \ub9e5\ub77d \uc720\uc9c0 \n - 2\ucc28 \uc9c4\uc785: 365$ \uadfc\ucc98 \u2192 MACD \ud788\uc2a4\ud1a0\uadf8\ub7a8 \uc57d\ud654 \ud655\uc778 \uc2dc \uc9c4\uc785 \n - 3\ucc28 \uc9c4\uc785: 350$ \uadfc\ucc98 \u2192 10\uc77c EMA \uc774\ud0c8 \uc2dc \ucd5c\uc885 \uc9c4\uc785 \uae30\ud68c \n\n \ub098. \uc190\uc808\u00b7\ubaa9\ud45c\uac00 \uc138\ubd84\ud654 \n - 1\ucc28 \uc190\uc808 \ud2b8\ub9ac\uac70: 345$ \uc544\ub798 -5% (\uae30\uc874) \n - 2\ucc28 \uc190\uc808 \ubcf4\uac15: 337$ \uc544\ub798 \ucd94\uac00 -5% (\ub2e8\uae30 \ubaa8\uba58\ud140 \ud68c\ubcf5 \uc2e4\ud328 \uc2dc) \n - \ubaa9\ud45c\uac00 \ub2e8\uacc4\ubcc4 \uc124\uc815: \n \u2022 \ub2e8\uae30 \ubaa9\ud45c 415$ (\uc804\uace0\uc810 \ud68c\ubcf5) \n \u2022 \uc911\uae30 \ubaa9\ud45c 460$ (\ucd94\uac00 \ubaa8\uba58\ud140 \ud655\uc778) \n \u2022 \uc7a5\uae30 \ubaa9\ud45c 538$ (\uc560\ub110\ub9ac\uc2a4\ud2b8 \ud3c9\uade0) \n\n \ub2e4. \ubaa8\ub2c8\ud130\ub9c1 \ud3ec\uc778\ud2b8 \ud655\ub300 \n \u2022 \uae30\uc220\uc9c0\ud45c: 10\uc77c EMA\u00b7MACD \ud788\uc2a4\ud1a0\uadf8\ub7a8, \uc8fc\uac04 RSI \n \u2022 \ud380\ub354\uba58\ud138: \ubd84\uae30 \ub9e4\ucd9c\u00b7EPS\uac00 \uc608\uc0c1\uce58 \ub300\ube44 10% \uc774\ud558\ub85c \ub5a8\uc5b4\uc9c8 \uacbd\uc6b0 \n \u2022 \uc9c0\uc815\ud559\u00b7\uc6d0\uc790\uc7ac: \uc911\ub3d9 \uae34\uc7a5 \uc545\ud654 \uc2dc \ucd94\uac00 \ud5e4\uc9c0 \uac80\ud1a0 \n \u2022 \uacbd\uc7c1\ud658\uacbd: Apple Games \ub4f1 \uc2e0\uaddc \uc11c\ube44\uc2a4 \uc6d4\uac04 MAU\u00b7ARPU \ubcc0\ud654 \n\n \ub77c. \ud3ec\ud2b8\ud3f4\ub9ac\uc624 \ube44\uc911 \ubc0f \ub9ac\uc2a4\ud06c \uad00\ub9ac \n \u2022 \uc804\uccb4 \uc704\ud5d8 \uc790\uc0b0\uc758 5~7% \u2192 \ub9ac\uc2a4\ud06c \uc801\uc815\uc120 \uc720\uc9c0 \n \u2022 \ubd84\ud560 \ub9e4\uc218\ub85c \uc9c4\uc785 \ud0c0\uc774\ubc0d \ub9ac\uc2a4\ud06c \uc644\ud654 \n \u2022 \uc8fc\uc694 \ubaa8\ub2c8\ud130\ub9c1 \uc774\ubca4\ud2b8 \ubc1c\uc0dd \uc2dc \ub9ac\ubc38\ub7f0\uc2f1 \n\n4. \uacfc\uac70 \uc2e4\uc218 \uad50\ud6c8 \ubc18\uc601 \n - \u201c\ub2e8\uae30 \ubaa8\uba58\ud140 \uc2e0\ud638\uc5d0 \uacfc\ub3c4 \ubc18\uc751\ud574 \uc774\ud0c8\u201d \u2192 \uc774\ubc88\uc5d4 \ubaa8\uba58\ud140 \uc57d\ud654 \uc2dc\uc5d0\ub3c4 \ubd84\ud560 \ub9e4\uc218\u00b7\uc190\uc808 \uccb4\uacc4\ub97c \uacac\uace0\ud788 \uc801\uc6a9 \n - \u201c\ucd94\uaca9 \ub9e4\uc218\u201d \uc790\uc81c \u2192 \uc0ac\uc804 \uc9c4\uc785 \uad6c\uac04(380\u2192365\u2192350) \uba85\ud655\ud788 \uc124\uc815 \n - \uc2ec\ub9ac\uc801 \ub300\uc751 \uc900\ube44 \u2192 \uc9c0\uc815\ud559 \ubd88\ud655\uc2e4\uc131\uacfc \uae30\uc220\uc801 \uc870\uc815\uc740 \uc804\ub7b5\uc801 \uae30\ud68c\ub85c \ud65c\uc6a9 \n\n\uacb0\ub860\uc801\uc73c\ub85c, APP \uc8fc\uc2dd\uc740 \uac15\ub825\ud55c \ud380\ub354\uba58\ud138\uacfc \uae0d\uc815\uc801 \uae30\uc220\uc9c0\ud45c\ub97c \ubc14\ud0d5\uc73c\ub85c \uc5ec\uc804\ud788 \ub9e4\uc218 \uad00\uc810\uc774 \uc720\ud6a8\ud569\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \ub2e8\uae30 \ubaa8\uba58\ud140 \uc57d\ud654\uc640 \uc9c0\uc815\ud559\uc801 \ub9ac\uc2a4\ud06c\ub97c \uac10\uc548\ud574 \ubd84\ud560 \ub9e4\uc218\u00b7\ub2e4\ub2e8\uacc4 \uc190\uc808\u00b7\ubaa8\ub2c8\ud130\ub9c1 \uc804\ub7b5\uc744 \ubcd1\ud589\ud568\uc73c\ub85c\uc368 \ub9ac\uc2a4\ud06c\ub97c \ud1b5\uc81c\ud558\uba74\uc11c \uae30\ub300 \uc218\uc775\uc744 \uadf9\ub300\ud654\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4." + }, + "investment_plan": "\uc548\ub155\ud558\uc138\uc694. \uc774\ubc88 APP \uc8fc\uc2dd \ud1a0\ub860\uc744 \uc885\ud569\ud574 \ubcf8 \ub4a4, \uc800\ub294 \ud655\uc2e4\ud788 \ub9e4\uc218(Buy) \uc785\uc7a5\uc744 \ucde8\ud558\uaca0\uc2b5\ub2c8\ub2e4.\n\n\uc6b0\uc120 \uc591\uce21 \ud575\uc2ec \ub17c\uc810\uc744 \uac04\ub2e8\ud788 \uc815\ub9ac\ud558\uba74\u2026\n\n\uac15\uc138 \uce21\uc740 \n\u2022 \uc9c0\ub09c 1\ub144\uac04 EPS 354%, \ub9e4\ucd9c 43.44%\ub77c\ub294 \uc555\ub3c4\uc801 \uc2e4\uc801 \uc131\uc7a5 \n\u2022 \uc55e\uc73c\ub85c\ub3c4 EPS \uc5f0\ud3c9\uade0 3.85%, \ub9e4\ucd9c 12.37% \uc99d\uac00 \uc608\uc0c1 \n\u2022 Toss \ud50c\ub7ab\ud3fc \ub0b4 \u2018\uc571 \uc778 \uc571\u2019 \uae30\ub2a5, Apple Games \ucd9c\uc2dc \ub4f1\uc73c\ub85c \ucc28\ubcc4\ud654\ub41c \uacbd\uc7c1\ub825 \ud655\ubcf4 \n\u2022 \uc911\u00b7\uc7a5\uae30 50/200\uc77c \uc774\ub3d9\ud3c9\uade0\uc120 \uc0c1\uc2b9, MACD\u00b7RSI\ub3c4 \uae0d\uc815\uc801 \ubaa8\uba58\ud140 \uc2dc\uadf8\ub110 \n\n\uc57d\uc138 \uce21\uc740 \n\u2022 \ub2e8\uae30\uc801\uc73c\ub85c 10\uc77c EMA\u00b7MACD \ud788\uc2a4\ud1a0\uadf8\ub7a8 \uc57d\ud654\uac00 \uc870\uc815 \uc2e0\ud638 \n\u2022 \uc9c0\uc815\ud559\uc801 \ubd88\uc548(\uc911\ub3d9 \uae34\uc7a5) \ubc0f \uc6d0\uc790\uc7ac \uac00\uaca9 \uc0c1\uc2b9 \uc704\ud5d8 \n\u2022 Apple Games \ub4f1 \uc2e0\uaddc \uacbd\uc7c1\uc790\uc758 \uc704\ud611\uc73c\ub85c \uc2dc\uc7a5 \uc810\uc720\uc728 \ud558\ub77d \uac00\ub2a5\uc131 \n\u2022 \ubbf8\ub798 \uc131\uc7a5\ub960(3.85%, 12.37%)\uc774 \uc774\ubbf8 \uc8fc\uac00\uc5d0 \uc120\ubc18\uc601\ub410\uc744 \uc6b0\ub824 \n\n\uc774 \uc911\uc5d0\uc11c \uac00\uc7a5 \uc124\ub4dd\ub825 \uc788\ub294 \ud3ec\uc778\ud2b8\ub294 \u2018\uac15\ub825\ud55c \ud380\ub354\uba58\ud138 \uc131\uc7a5\u2019\uc785\ub2c8\ub2e4. 1\ub144\uac04 \uc2e4\uc801 \ud3ed\uc99d\uc740 \uc77c\ud68c\uc131\uc774 \uc544\ub2c8\ub77c \ud50c\ub7ab\ud3fc \ube44\uc988\ub2c8\uc2a4 \ubaa8\ub378\uc758 \ud798\uc744 \ubcf4\uc5ec\uc900 \uac83\uc774\uace0, \ud5a5\ud6c4\uc5d0\ub3c4 \uc548\uc815\uc801\uc778 \ub9e4\ucd9c\u00b7\uc774\uc775 \ud655\uc7a5\uc774 \uac00\ub2a5\ud558\ub2e4\ub294 \uc804\ub9dd\uc774 \ub2e4\uc218 \uc560\ub110\ub9ac\uc2a4\ud2b8\uc5d0\uac8c\uc11c \uae0d\uc815\uc801\uc73c\ub85c \ub098\uc628\ub2e4\ub294 \uc810\uc774 \uc911\uc694\ud569\ub2c8\ub2e4. \ubb3c\ub860 \ub2e8\uae30 \uc870\uc815\uc740 \uc62c \uc218 \uc788\uc9c0\ub9cc, \ubd88\ud655\uc2e4\uc131\uc744 \uc774\uc720\ub85c \uc644\uc804\ud788 \ubc30\uc81c\ud558\uae30\ubcf4\ub2e4 \uc774\ub97c \uc624\ud788\ub824 \uc800\uac00 \ub9e4\uc218 \uae30\ud68c\ub85c \ud65c\uc6a9\ud558\ub294 \ucabd\uc774 \ud569\ub9ac\uc801\uc774\ub77c\uace0 \ud310\ub2e8\ud588\uc2b5\ub2c8\ub2e4.\n\n\ud22c\uc790 \uacc4\ud68d\uc744 \uc544\ub798\uc640 \uac19\uc774 \uc81c\uc548\ub4dc\ub9bd\ub2c8\ub2e4.\n\n1. \ucd94\ucc9c \uc758\uacac: \ub9e4\uc218(Buy) \n2. \ucd94\ucc9c \uadfc\uac70: \n - \uae30\uc5c5\uc758 \uc218\uc775\uc131\uacfc \ub9e4\ucd9c \uc131\uc7a5\uc138\uac00 \uc5c5\uacc4 \ub300\ube44 \uc6d4\ub4f1\ud788 \ub192\uc73c\uba70, \ud5a5\ud6c4\uc5d0\ub3c4 \uafb8\uc900\ud55c \ud655\uc7a5\uc774 \uae30\ub300\ub428 \n - \ud50c\ub7ab\ud3fc\u00b7\ube0c\ub79c\ub4dc \ud30c\uc6cc\ub97c \ubc14\ud0d5\uc73c\ub85c \uacbd\uc7c1\uc0ac\ubcf4\ub2e4 \ube60\ub978 \ud601\uc2e0\uc774 \uac00\ub2a5 \n - \uc911\u00b7\uc7a5\uae30 \uae30\uc220\uc801 \uc9c0\ud45c(50/200\uc77c\uc120, MACD\u00b7RSI)\uac00 \uc5ec\uc804\ud788 \uae0d\uc815\uc801 \n - \ub2e8\uae30 \uc870\uc815\uc740 \uc790\uc5f0\uc2a4\ub7ec\uc6b4 \ubcc0\ub3d9\uc131\uc73c\ub85c \ubcf4\uace0 \ubd84\ud560 \ub9e4\uc218 \uae30\ud68c\ub85c \ud65c\uc6a9 \n\n3. \uad6c\uccb4\uc801 \uc2e4\ud589 \uc804\ub7b5 \n \uac00. \ubd84\ud560 \ub9e4\uc218: \ud604\uc7ac \uac00\uaca9\uc5d0\uc11c 3\ub2e8\uacc4\ub85c \ub098\ub220 \ubd84\ud560 \uc9c4\uc785. \uc608\ucee8\ub300 380\ub2ec\ub7ec, 365\ub2ec\ub7ec, 350\ub2ec\ub7ec \uc218\uc900\uc5d0\uc11c \uac01 1/3\uc529 \ub9e4\uc218. \n \ub098. \uc190\uc808\u00b7\uc218\uc775 \ubaa9\ud45c \uc124\uc815: \ucd5c\uadfc \uc9c0\uc9c0\uc120\uc778 345\ub2ec\ub7ec \uc544\ub798\ub85c 5% \uc774\uc0c1 \ud558\ub77d \uc2dc 1\ucc28 \uc190\uc808. \ubaa9\ud45c\uac00\ub294 430\ub2ec\ub7ec(\uc804\uace0\uc810 \ub3cc\ud30c)\ub85c \uc124\uc815 \n \ub2e4. \ubaa8\ub2c8\ud130\ub9c1 \ud3ec\uc778\ud2b8: \n - \ubd84\uae30 \uc2e4\uc801\uc774 \uc608\uce21\uce58\ub97c \ubc11\ub3cc\uac70\ub098 \ub9e4\ucd9c \uc131\uc7a5\ub960\uc774 10% \uc774\ud558\ub85c \ud558\ub77d\ud558\ub294 \uc9c0\ud45c \n - \uc8fc\uc694 \uacbd\uc81c\u00b7\uc9c0\uc815\ud559\uc801 \uc0ac\uac74(\uc911\ub3d9 \uc0c1\ud669, \uae08\ub9ac \uacb0\uc815 \ub4f1)\uacfc \uc6d0\uc790\uc7ac \uac00\uaca9 \ucd94\uc774 \n - Toss \ud50c\ub7ab\ud3fc \uc0ac\uc6a9\uc790 \uc218\u00b7ARPU(\uac00\uc785\uc790\ub2f9 \ud3c9\uade0 \ub9e4\ucd9c) \ubcc0\ud654 \n \ub77c. \ud3ec\ud2b8\ud3f4\ub9ac\uc624 \ube44\uc911: \uc804\uccb4 \uc704\ud5d8 \uc790\uc0b0\uc758 5~7% \uc774\ub0b4\ub85c \ube44\uc911 \uc81c\ud55c, \ub2e4\ub978 \uc5c5\uc885\u00b7\uc2a4\ud0c0\uc77c\uacfc\uc758 \ubd84\uc0b0 \uc720\uc9c0 \n\n4. \uacfc\uac70 \uc2e4\uc218 \uad50\ud6c8 \ubc18\uc601 \n - \ub2e8\uae30 \ubaa8\uba58\ud140 \uc2e0\ud638\uc5d0 \uacfc\ub3c4\ud558\uac8c \ubc18\uc751\ud574 \uc774\ud0c8\ud55c \uacbd\ud5d8\uc744 \uc904\uc774\uace0, \ud380\ub354\uba58\ud138\uacfc \uae30\uc220\uc801 \uc9c0\ud45c\uc758 \uacb0\ud569\uc5d0 \uc9d1\uc911 \n - \ucd94\uaca9 \ub9e4\uc218\ub97c \uc790\uc81c\ud558\uace0 \ubd84\ud560 \uc811\uadfc\uc73c\ub85c \ub9ac\uc2a4\ud06c \uad00\ub9ac \n\n\uc774\ub807\uac8c \uc911\uc7a5\uae30 \uc131\uc7a5 \uc2a4\ud1a0\ub9ac\ub97c \ubbff\ub418, \ub2e8\uae30 \uc870\uc815 \ub9ac\uc2a4\ud06c\ub294 \ub9e4\uc218 \ud0c0\uc774\ubc0d\uc73c\ub85c \uc0bc\uc544 \ub2e8\uacc4\uc801\uc73c\ub85c \uc9c4\uc785\ud558\ub294 \uc804\ub7b5\uc744 \ucd94\ucc9c\ub4dc\ub9bd\ub2c8\ub2e4. \uc774\uc0c1\uc785\ub2c8\ub2e4.", + "final_trade_decision": "1. \ud575\uc2ec \ub17c\uc810 \uc694\uc57d \n- Risky Analyst (\uac15\uc138): \n \u2022 \u201cEPS 354%, \ub9e4\ucd9c 43.44%\ub77c\ub294 \uc555\ub3c4\uc801 \uc2e4\uc801 \uc131\uc7a5\u201d \n \u2022 \u201c50\u00b7200\uc77c \uc774\ub3d9\ud3c9\uade0\uc120, MACD\u00b7RSI \uae0d\uc815\uc801 \ubaa8\uba58\ud140\u201d \n \u2022 \u201c\uc560\ud50c \uac8c\uc784\uc988 \ub4f1 \uacbd\uc7c1\uc0ac \ub300\ube44 \ud50c\ub7ab\ud3fc \ucc28\ubcc4\ud654\ub85c \uc911\uc7a5\uae30 75.4% Upside(\ubaa9\ud45c\uac00 538\ub2ec\ub7ec)\u201d \n \u2022 \ub2e8\uae30 \uc870\uc815\uc740 \u201c\uc800\uac00 \ub9e4\uc218 \uae30\ud68c\u201d \n\n- Safe/Conservative Analyst (\uc57d\uc138): \n \u2022 \u201c\uc911\ub3d9 \uc9c0\uc815\ud559\uc801 \ub9ac\uc2a4\ud06c\uc640 \uc6d0\uc790\uc7ac \uac00\uaca9 \uc0c1\uc2b9\u201d \n \u2022 \u201cMACD \ud788\uc2a4\ud1a0\uadf8\ub7a8 \uc74c\uc804\ud658, 10\uc77c EMA \uc57d\ud654 \u2192 \ub2e8\uae30 \uc870\uc815 \uc2e0\ud638\u201d \n \u2022 \u201c\ubbf8\ub798 \uc131\uc7a5\ub960(3.85%, 12.37%)\uc774 \uc774\ubbf8 \uc8fc\uac00\uc5d0 \uc120\ubc18\uc601\ub410\uc744 \uac00\ub2a5\uc131\u201d \n \u2022 \ubd88\ud655\uc2e4\uc131 \uc2dc \u201c\ubcf4\uc720 \ud639\uc740 \ub9e4\ub3c4\u201d \uad8c\uace0 \n\n- Neutral Analyst (\uc911\ub9bd): \n \u2022 \u201c\uac15\ub825\ud55c \ud380\ub354\uba58\ud138\uacfc \uae30\uc220\uc801 \uc9c0\ud45c \uc778\uc815\ud558\ub418, \uc9c0\uc815\ud559\u00b7\ubaa8\uba58\ud140 \ub9ac\uc2a4\ud06c\ub3c4 \ubb34\uc2dc \ubd88\uac00\u201d \n \u2022 \u201c\ubd84\ud560 \ub9e4\uc218\uc640 \uc190\uc808\u00b7\ubaa9\ud45c\uac00 \uc124\uc815\uc73c\ub85c \ub9ac\uc2a4\ud06c \uad00\ub9ac \uc81c\uc548\u201d \n \u2022 \u201c\uc8fc\uc694 \uc774\ubca4\ud2b8 \ubaa8\ub2c8\ud130\ub9c1, \uc720\uc5f0\ud55c \ub300\uc751 \uc804\ub7b5 \ud544\uc694\u201d \n\n2. \ucd5c\uc885 \ucd94\ucc9c: Buy \n \ud310\ub2e8 \uadfc\uac70: \n - \ud380\ub354\uba58\ud138 \uc131\uc7a5(\u201cEPS 354%, \ub9e4\ucd9c 43.44%\u201d)\uacfc \uc560\ub110\ub9ac\uc2a4\ud2b8 \ubaa9\ud45c\uac00(538$)\ub294 \uc5ec\uc804\ud788 \ub9e4\uc218 \ub9e4\ub825 \ub192\uc74c. \n - \uc911\u00b7\uc7a5\uae30 \uae30\uc220\uc9c0\ud45c(50/200\uc77c\uc120, MACD\u00b7RSI) \uc0c1\uc2b9 \ucd94\uc138 \uc9c0\uc18d. \n - \uc57d\uc138 \uce21\uc774 \uc9c0\uc801\ud55c \ub2e8\uae30 \ubaa8\uba58\ud140 \uc57d\ud654\uc640 \uc9c0\uc815\ud559 \ub9ac\uc2a4\ud06c\ub294 \u201c\ubd84\ud560 \ub9e4\uc218\u00b7\uc190\uc808\u00b7\ubaa8\ub2c8\ud130\ub9c1\u201d \uc804\ub7b5\uc73c\ub85c \ucda9\ubd84\ud788 \uad00\ub9ac \uac00\ub2a5. \n\n3. \uac1c\uc120\ub41c \uc2e4\ud589 \uc804\ub7b5 \n \uac00. \ubd84\ud560 \ub9e4\uc218 \uc2dc\uc810 \uc870\uc815 \n - 1\ucc28 \uc9c4\uc785: 380$ \uadfc\ucc98 \u2192 \uac15\uc138 \ub9e5\ub77d \uc720\uc9c0 \n - 2\ucc28 \uc9c4\uc785: 365$ \uadfc\ucc98 \u2192 MACD \ud788\uc2a4\ud1a0\uadf8\ub7a8 \uc57d\ud654 \ud655\uc778 \uc2dc \uc9c4\uc785 \n - 3\ucc28 \uc9c4\uc785: 350$ \uadfc\ucc98 \u2192 10\uc77c EMA \uc774\ud0c8 \uc2dc \ucd5c\uc885 \uc9c4\uc785 \uae30\ud68c \n\n \ub098. \uc190\uc808\u00b7\ubaa9\ud45c\uac00 \uc138\ubd84\ud654 \n - 1\ucc28 \uc190\uc808 \ud2b8\ub9ac\uac70: 345$ \uc544\ub798 -5% (\uae30\uc874) \n - 2\ucc28 \uc190\uc808 \ubcf4\uac15: 337$ \uc544\ub798 \ucd94\uac00 -5% (\ub2e8\uae30 \ubaa8\uba58\ud140 \ud68c\ubcf5 \uc2e4\ud328 \uc2dc) \n - \ubaa9\ud45c\uac00 \ub2e8\uacc4\ubcc4 \uc124\uc815: \n \u2022 \ub2e8\uae30 \ubaa9\ud45c 415$ (\uc804\uace0\uc810 \ud68c\ubcf5) \n \u2022 \uc911\uae30 \ubaa9\ud45c 460$ (\ucd94\uac00 \ubaa8\uba58\ud140 \ud655\uc778) \n \u2022 \uc7a5\uae30 \ubaa9\ud45c 538$ (\uc560\ub110\ub9ac\uc2a4\ud2b8 \ud3c9\uade0) \n\n \ub2e4. \ubaa8\ub2c8\ud130\ub9c1 \ud3ec\uc778\ud2b8 \ud655\ub300 \n \u2022 \uae30\uc220\uc9c0\ud45c: 10\uc77c EMA\u00b7MACD \ud788\uc2a4\ud1a0\uadf8\ub7a8, \uc8fc\uac04 RSI \n \u2022 \ud380\ub354\uba58\ud138: \ubd84\uae30 \ub9e4\ucd9c\u00b7EPS\uac00 \uc608\uc0c1\uce58 \ub300\ube44 10% \uc774\ud558\ub85c \ub5a8\uc5b4\uc9c8 \uacbd\uc6b0 \n \u2022 \uc9c0\uc815\ud559\u00b7\uc6d0\uc790\uc7ac: \uc911\ub3d9 \uae34\uc7a5 \uc545\ud654 \uc2dc \ucd94\uac00 \ud5e4\uc9c0 \uac80\ud1a0 \n \u2022 \uacbd\uc7c1\ud658\uacbd: Apple Games \ub4f1 \uc2e0\uaddc \uc11c\ube44\uc2a4 \uc6d4\uac04 MAU\u00b7ARPU \ubcc0\ud654 \n\n \ub77c. \ud3ec\ud2b8\ud3f4\ub9ac\uc624 \ube44\uc911 \ubc0f \ub9ac\uc2a4\ud06c \uad00\ub9ac \n \u2022 \uc804\uccb4 \uc704\ud5d8 \uc790\uc0b0\uc758 5~7% \u2192 \ub9ac\uc2a4\ud06c \uc801\uc815\uc120 \uc720\uc9c0 \n \u2022 \ubd84\ud560 \ub9e4\uc218\ub85c \uc9c4\uc785 \ud0c0\uc774\ubc0d \ub9ac\uc2a4\ud06c \uc644\ud654 \n \u2022 \uc8fc\uc694 \ubaa8\ub2c8\ud130\ub9c1 \uc774\ubca4\ud2b8 \ubc1c\uc0dd \uc2dc \ub9ac\ubc38\ub7f0\uc2f1 \n\n4. \uacfc\uac70 \uc2e4\uc218 \uad50\ud6c8 \ubc18\uc601 \n - \u201c\ub2e8\uae30 \ubaa8\uba58\ud140 \uc2e0\ud638\uc5d0 \uacfc\ub3c4 \ubc18\uc751\ud574 \uc774\ud0c8\u201d \u2192 \uc774\ubc88\uc5d4 \ubaa8\uba58\ud140 \uc57d\ud654 \uc2dc\uc5d0\ub3c4 \ubd84\ud560 \ub9e4\uc218\u00b7\uc190\uc808 \uccb4\uacc4\ub97c \uacac\uace0\ud788 \uc801\uc6a9 \n - \u201c\ucd94\uaca9 \ub9e4\uc218\u201d \uc790\uc81c \u2192 \uc0ac\uc804 \uc9c4\uc785 \uad6c\uac04(380\u2192365\u2192350) \uba85\ud655\ud788 \uc124\uc815 \n - \uc2ec\ub9ac\uc801 \ub300\uc751 \uc900\ube44 \u2192 \uc9c0\uc815\ud559 \ubd88\ud655\uc2e4\uc131\uacfc \uae30\uc220\uc801 \uc870\uc815\uc740 \uc804\ub7b5\uc801 \uae30\ud68c\ub85c \ud65c\uc6a9 \n\n\uacb0\ub860\uc801\uc73c\ub85c, APP \uc8fc\uc2dd\uc740 \uac15\ub825\ud55c \ud380\ub354\uba58\ud138\uacfc \uae0d\uc815\uc801 \uae30\uc220\uc9c0\ud45c\ub97c \ubc14\ud0d5\uc73c\ub85c \uc5ec\uc804\ud788 \ub9e4\uc218 \uad00\uc810\uc774 \uc720\ud6a8\ud569\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \ub2e8\uae30 \ubaa8\uba58\ud140 \uc57d\ud654\uc640 \uc9c0\uc815\ud559\uc801 \ub9ac\uc2a4\ud06c\ub97c \uac10\uc548\ud574 \ubd84\ud560 \ub9e4\uc218\u00b7\ub2e4\ub2e8\uacc4 \uc190\uc808\u00b7\ubaa8\ub2c8\ud130\ub9c1 \uc804\ub7b5\uc744 \ubcd1\ud589\ud568\uc73c\ub85c\uc368 \ub9ac\uc2a4\ud06c\ub97c \ud1b5\uc81c\ud558\uba74\uc11c \uae30\ub300 \uc218\uc775\uc744 \uadf9\ub300\ud654\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4." + } +} \ No newline at end of file diff --git a/web/frontend/package-lock.json b/web/frontend/package-lock.json index bc3e2f25..dff6ab18 100644 --- a/web/frontend/package-lock.json +++ b/web/frontend/package-lock.json @@ -21,6 +21,7 @@ "react-router-dom": "^6.4.0", "react-scripts": "5.0.1", "recharts": "^2.8.0", + "remark-gfm": "^4.0.1", "styled-components": "^6.0.8", "websocket": "^1.0.34" } @@ -6560,6 +6561,16 @@ "node": ">=4" } }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -7940,6 +7951,19 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -13841,6 +13865,16 @@ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", "license": "MIT" }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -13922,6 +13956,16 @@ "tmpl": "1.0.5" } }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -13946,6 +13990,76 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-from-markdown": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", @@ -13970,6 +14084,2745 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/mdast-util-gfm-footnote/node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-footnote/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/mdast-util-gfm-table/node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-table/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm/node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/mdast-util-gfm/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/mdast-util-gfm/node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm/node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing/node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/mdast-util-phrasing/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/mdast-util-phrasing/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-to-hast": { "version": "12.3.0", "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", @@ -13990,6 +16843,211 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/mdast-util-to-markdown/node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-to-markdown/node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-to-markdown/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-to-string": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", @@ -14132,6 +17190,904 @@ "uvu": "^0.5.0" } }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter/node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm/node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm/node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm/node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, "node_modules/micromark-factory-destination": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", @@ -18158,6 +22114,594 @@ "node": ">= 0.10" } }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm/node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/remark-gfm/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/remark-gfm/node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm/node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm/node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/remark-gfm/node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/remark-gfm/node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/remark-gfm/node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/remark-gfm/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/remark-gfm/node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/remark-gfm/node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/remark-gfm/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/remark-gfm/node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/remark-gfm/node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/remark-gfm/node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/remark-gfm/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/remark-gfm/node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/remark-gfm/node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/remark-gfm/node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/remark-gfm/node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/remark-gfm/node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/remark-gfm/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/remark-gfm/node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/remark-gfm/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/remark-gfm/node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/remark-gfm/node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm/node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm/node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-parse": { "version": "10.0.2", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", @@ -18189,6 +22733,96 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify/node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/remark-stringify/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/remark-stringify/node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify/node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/renderkid": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", @@ -20543,9 +25177,9 @@ } }, "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "license": "Apache-2.0", "peer": true, "bin": { @@ -20553,7 +25187,7 @@ "tsserver": "bin/tsserver" }, "engines": { - "node": ">=14.17" + "node": ">=4.2.0" } }, "node_modules/unbox-primitive": { @@ -21957,6 +26591,16 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } } } diff --git a/web/frontend/package.json b/web/frontend/package.json index a0a92303..fd237fd2 100644 --- a/web/frontend/package.json +++ b/web/frontend/package.json @@ -3,21 +3,22 @@ "version": "0.1.0", "private": true, "dependencies": { + "@ant-design/icons": "^5.2.6", "@testing-library/jest-dom": "^5.16.4", "@testing-library/react": "^13.3.0", "@testing-library/user-event": "^13.5.0", + "antd": "^5.10.0", + "axios": "^1.5.0", + "dayjs": "^1.11.9", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-scripts": "5.0.1", - "react-router-dom": "^6.4.0", - "axios": "^1.5.0", - "antd": "^5.10.0", - "@ant-design/icons": "^5.2.6", - "styled-components": "^6.0.8", - "dayjs": "^1.11.9", "react-markdown": "^8.0.7", - "websocket": "^1.0.34", - "recharts": "^2.8.0" + "react-router-dom": "^6.4.0", + "react-scripts": "5.0.1", + "recharts": "^2.8.0", + "remark-gfm": "^4.0.1", + "styled-components": "^6.0.8", + "websocket": "^1.0.34" }, "scripts": { "start": "react-scripts start", @@ -44,4 +45,4 @@ ] }, "proxy": "http://localhost:8000" -} \ No newline at end of file +} diff --git a/web/frontend/src/pages/Analysis/Analysis.js b/web/frontend/src/pages/Analysis/Analysis.js index 382a4b7b..1a71e1ec 100644 --- a/web/frontend/src/pages/Analysis/Analysis.js +++ b/web/frontend/src/pages/Analysis/Analysis.js @@ -1,7 +1,7 @@ // web/frontend/src/pages/Analysis/Analysis.js import React, { useState, useEffect } from 'react'; -import { Card, Divider, Spin, Alert, Typography, message } from 'antd'; +import { Card, Divider, Spin, Alert, Typography } from 'antd'; import styled from 'styled-components'; import api from '../../services/api'; import { useWebSocket } from '../../contexts/WebSocketContext'; @@ -78,20 +78,6 @@ const Analysis = () => { clearMessages(); }; - // ๋ถ„์„ ์ทจ์†Œ ํ•ธ๋“ค๋Ÿฌ - const handleCancelAnalysis = async () => { - if (!currentSessionId) return; - - try { - await api.post(`/api/trading/cancel/${currentSessionId}/`); - message.success('๋ถ„์„์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.'); - handleNewAnalysis(); // ์ƒํƒœ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ํผ์œผ๋กœ ๋Œ์•„๊ฐ - } catch (err) { - const errorMessage = err.response?.data?.error || '๋ถ„์„ ์ทจ์†Œ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.'; - setError(errorMessage); - } - }; - const renderContent = () => { if (analysisStatus === 'starting') { return
; @@ -106,7 +92,6 @@ const Analysis = () => { messages={messages.filter(m => m.sessionId === currentSessionId)} finalReport={finalReport} onNewAnalysis={handleNewAnalysis} - onCancelAnalysis={handleCancelAnalysis} /> ); } diff --git a/web/frontend/src/pages/Analysis/components/ReportDisplay.js b/web/frontend/src/pages/Analysis/components/ReportDisplay.js new file mode 100644 index 00000000..c3fbf6ea --- /dev/null +++ b/web/frontend/src/pages/Analysis/components/ReportDisplay.js @@ -0,0 +1,82 @@ +import React from 'react'; +import { Card, Tabs, Typography, Divider, Tag } from 'antd'; +import { LineChartOutlined, MessageOutlined, ReadOutlined, WalletOutlined, ProjectOutlined, ExperimentOutlined, SolutionOutlined } from '@ant-design/icons'; +import styled from 'styled-components'; +import ReactMarkdown from 'react-markdown'; +import remarkGfm from 'remark-gfm'; + +const { Title, Paragraph, Text } = Typography; +const { TabPane } = Tabs; + +const ReportContainer = styled(Card)` + margin-top: ${props => props.theme.spacing.lg}; + .ant-card-body { + padding: ${props => props.theme.spacing.xl}; + } +`; + +const MarkdownWrapper = styled.div` + h1, h2, h3 { + margin-top: 24px; + margin-bottom: 16px; + font-weight: 600; + } + h1 { font-size: 2em; } + h2 { font-size: 1.5em; border-bottom: 1px solid #f0f0f0; padding-bottom: 8px; } + h3 { font-size: 1.25em; } + p { line-height: 1.8; } + ul, ol { padding-left: 24px; } + li { margin-bottom: 8px; } + strong { color: ${props => props.theme.colors.primary}; } +`; + +const reportSections = { + "์‹œ์žฅ ๋ถ„์„๊ฐ€ ๋ฆฌํฌํŠธ": { icon: , key: 'market' }, + "์†Œ์…œ ๋ฏธ๋””์–ด ๋ถ„์„๊ฐ€ ๋ฆฌํฌํŠธ": { icon: , key: 'social' }, + "๋‰ด์Šค ๋ถ„์„๊ฐ€ ๋ฆฌํฌํŠธ": { icon: , key: 'news' }, + "์žฌ๋ฌด ๋ถ„์„๊ฐ€ ๋ฆฌํฌํŠธ": { icon: , key: 'fundamentals' }, + "ํˆฌ์ž ๊ฒฐ์ • ํ† ๋ก  ์š”์•ฝ": { icon: , key: 'debate' }, + "์ตœ์ข… ํˆฌ์ž ๊ณ„ํš": { icon: , key: 'plan' }, + "์ตœ์ข… ๊ฑฐ๋ž˜ ๊ฒฐ์ •": { icon: , key: 'decision' }, +}; + +const ReportDisplay = ({ reportContent }) => { + if (!reportContent) return null; + + const parsedSections = {}; + const sections = reportContent.split('## ').slice(1); + + sections.forEach(section => { + const lines = section.split('\n'); + const title = lines[0].trim(); + const content = lines.slice(1).join('\n').trim(); + parsedSections[title] = content; + }); + + const mainTitleMatch = reportContent.match(/^# (.*)/); + const mainTitle = mainTitleMatch ? mainTitleMatch[1] : "์ตœ์ข… ๋ถ„์„ ๋ณด๊ณ ์„œ"; + + return ( + + {mainTitle} + + + {Object.entries(parsedSections).map(([title, content]) => { + const sectionInfo = Object.values(reportSections).find(info => title.includes(Object.keys(reportSections).find(key => reportSections[key] === info))) || {}; + return ( + {sectionInfo.icon} {title}} + key={sectionInfo.key || title} + > + + {content} + + + ); + })} + + + ); +}; + +export default ReportDisplay; \ No newline at end of file diff --git a/web/frontend/src/pages/Dashboard/Dashboard.js b/web/frontend/src/pages/Dashboard/Dashboard.js index c296ca56..9b34368d 100644 --- a/web/frontend/src/pages/Dashboard/Dashboard.js +++ b/web/frontend/src/pages/Dashboard/Dashboard.js @@ -97,7 +97,7 @@ const Dashboard = () => { }); const [recentAnalyses, setRecentAnalyses] = useState([]); const { user } = useAuth(); - const { connected, messages } = useWebSocket(); + const { connected, analysisProgress } = useWebSocket(); const navigate = useNavigate(); useEffect(() => { From cbc07bc03badbe87d68c0c1dd86e5d5b18404248 Mon Sep 17 00:00:00 2001 From: kimheesu Date: Fri, 13 Jun 2025 17:07:38 +0900 Subject: [PATCH 13/14] =?UTF-8?q?[add]=20=ED=94=84=EB=A1=A0=ED=8A=B8?= =?UTF-8?q?=EC=97=94=EB=93=9C=20Analysis=20=EC=BB=A8=ED=85=8C=EC=9D=B4?= =?UTF-8?q?=EB=84=88=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../agents/analysts/fundamentals_analyst.py | 36 ++- .../agents/analysts/market_analyst.py | 63 ++++-- tradingagents/graph/reflection.py | 80 ++++--- .../full_states_log.json | 27 +++ web/frontend/src/pages/Analysis/Analysis.js | 6 +- .../Analysis/components/AnalysisDisplay.js | 10 +- .../pages/Analysis/components/AnalysisForm.js | 4 +- .../Analysis/components/ReportDisplay.js | 209 ++++++++++++------ 8 files changed, 309 insertions(+), 126 deletions(-) create mode 100644 web/backend/eval_results/MSFT/TradingAgentsStrategy_logs/full_states_log.json diff --git a/tradingagents/agents/analysts/fundamentals_analyst.py b/tradingagents/agents/analysts/fundamentals_analyst.py index 0969b797..4f4a06ed 100644 --- a/tradingagents/agents/analysts/fundamentals_analyst.py +++ b/tradingagents/agents/analysts/fundamentals_analyst.py @@ -21,8 +21,40 @@ def create_fundamentals_analyst(llm, toolkit): ] system_message = ( - "You are a researcher tasked with analyzing fundamental information over the past week about a company. Please write a comprehensive report of the company's fundamental information such as financial documents, company profile, basic company financials, company financial history, insider sentiment and insider transactions to gain a full view of the company's fundamental information to inform traders. Make sure to include as much detail as possible. Do not simply state the trends are mixed, provide detailed and finegrained analysis and insights that may help traders make decisions." - + " Make sure to append a Makrdown table at the end of the report to organize key points in the report, organized and easy to read.", + """You are a fundamental analyst. Your task is to provide a comprehensive report on a given company by analyzing its financial documents, company profile, financial history, insider sentiment, and transactions. + +You must output your findings in a structured JSON format. Do not add any text outside the JSON structure. + +The JSON object must contain the following keys: +1. `company_overview`: A string with a summary of the company's business and market position. +2. `financial_performance`: An array of objects, each with `metric` and `value` keys (e.g., {"metric": "Earnings Per Share (EPS)", "value": "Increased by 354%"}). +3. `stock_market_info`: An array of objects, each with `metric` and `value` keys (e.g., {"metric": "Current Stock Price", "value": "$380.58"}). +4. `analyst_forecasts`: An array of objects, each with `metric` and `value` keys (e.g., {"metric": "Median Price Target", "value": "$538.00"}). +5. `insider_sentiment`: A string summarizing insider trading activity and sentiment. +6. `summary`: A string providing a final, overall conclusion based on all the fundamental data. + +Here is an example of the expected JSON output format: +```json +{ + "company_overview": "Applovin Corporation (APP)์€ ๋ชจ๋ฐ”์ผ ์•ฑ ๊ฐœ๋ฐœ ๋ฐ ์ˆ˜์ตํ™”์— ํŠนํ™”๋œ ๊ธฐ์ˆ  ํšŒ์‚ฌ์ž…๋‹ˆ๋‹ค. ์ง€๋‚œ ํ•œ ํ•ด ๋™์•ˆ ๊ด„๋ชฉํ•  ๋งŒํ•œ ์žฌ๋ฌด ์„ฑ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ๋ฉฐ ์‹œ์žฅ์—์„œ ๊ฐ•๋ ฅํ•œ ์ž…์ง€๋ฅผ ๋‚˜ํƒ€๋ƒˆ์Šต๋‹ˆ๋‹ค.", + "financial_performance": [ + {"metric": "์ฃผ๋‹น ์ˆœ์ด์ต (EPS)", "value": "์ง€๋‚œ 1๋…„๊ฐ„ 354% ์ฆ๊ฐ€"}, + {"metric": "๋งค์ถœ ์„ฑ์žฅ๋ฅ ", "value": "์ „๋…„ ๋Œ€๋น„ 43.44% ์„ฑ์žฅ"} + ], + "stock_market_info": [ + {"metric": "ํ˜„์žฌ ์ฃผ๊ฐ€", "value": "$380.58"}, + {"metric": "์ „์ผ ๋Œ€๋น„ ๋ณ€๋™", "value": "-0.74% ๊ฐ์†Œ"} + ], + "analyst_forecasts": [ + {"metric": "์ค‘๊ฐ„ ๋ชฉํ‘œ ์ฃผ๊ฐ€", "value": "$538.00 (ํ˜„์žฌ๊ฐ€ ๋Œ€๋น„ ์•ฝ 75.4% ์ƒ์Šน ๊ฐ€๋Šฅ์„ฑ)"} + ], + "insider_sentiment": "์ œ๊ณต๋œ ๋ฐ์ดํ„ฐ์—์„œ๋Š” ๊ตฌ์ฒด์ ์ธ ๋‚ด๋ถ€์ž ๊ฑฐ๋ž˜ ๋‚ด์—ญ์ด ์ž์„ธํžˆ ์„ค๋ช…๋˜์ง€ ์•Š์•˜์ง€๋งŒ, ์ž„์› ๋ฐ ์ด์‚ฌํšŒ ๊ตฌ์„ฑ์›์˜ ์‹ ๋ขฐ๋„์— ๋Œ€ํ•œ ํ†ต์ฐฐ๋ ฅ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.", + "summary": "์ „๋ฐ˜์ ์ธ ์žฌ๋ฌด ๊ฑด์ „์„ฑ์€ ๊ธ์ •์ ์ด๋‚˜, ์ฃผ๊ฐ€ ๋ณ€๋™์„ฑ์„ ๊ณ ๋ คํ•  ๋•Œ ์‹ ์ค‘ํ•œ ์ ‘๊ทผ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค." +} +``` + +Please ensure all text content within the JSON is written in Korean. +""" ) prompt = ChatPromptTemplate.from_messages( diff --git a/tradingagents/agents/analysts/market_analyst.py b/tradingagents/agents/analysts/market_analyst.py index 42b989f0..42dce45c 100644 --- a/tradingagents/agents/analysts/market_analyst.py +++ b/tradingagents/agents/analysts/market_analyst.py @@ -22,32 +22,65 @@ def create_market_analyst(llm, toolkit): ] system_message = ( - """You are a trading assistant tasked with analyzing financial markets. Your role is to select the **most relevant indicators** for a given market condition or trading strategy from the following list. The goal is to choose up to **8 indicators** that provide complementary insights without redundancy. Categories and each category's indicators are: + """You are a trading assistant tasked with analyzing financial markets. Your role is to select the **most relevant indicators** for a given market condition or trading strategy from the following list. The goal is to choose up to **8 indicators** that provide complementary insights without redundancy. + +First, call `get_YFin_data` to retrieve the necessary stock data. Then, use `get_stockstats_indicators_report` with the selected indicators. +After analyzing the results, you must output your findings in a structured JSON format. Do not add any text outside the JSON structure. + +The JSON object must contain the following keys: +1. `price_summary`: A string containing a detailed analysis of the stock's price movement (์ตœ๊ณ ๊ฐ€, ์ตœ์ €๊ฐ€, ์ตœ๊ทผ ๋™ํ–ฅ ๋“ฑ). +2. `indicator_analysis`: An array of objects, where each object represents a technical indicator and has the following keys: + - `indicator`: The name of the indicator (e.g., "50 SMA"). + - `value`: The calculated value of the indicator. + - `interpretation`: A detailed interpretation of what the indicator's value means in the current market context. +3. `overall_conclusion`: A string providing a comprehensive conclusion based on the combined analysis of price trends and technical indicators. + +Here is an example of the expected JSON output format: +```json +{ + "price_summary": "APP์˜ ์ตœ๊ทผ ์ฃผ๊ฐ€๋Š” 2025๋…„ 6์›” 12์ผ ๊ธฐ์ค€์œผ๋กœ 380.58 ๋‹ฌ๋Ÿฌ๋กœ ๋งˆ๊ฐํ•˜์˜€์œผ๋ฉฐ, ์ตœ๊ณ ๊ฐ€๋Š” 428.99 ๋‹ฌ๋Ÿฌ(2025๋…„ 6์›” 5์ผ), ์ตœ์ €๊ฐ€๋Š” 276.8 ๋‹ฌ๋Ÿฌ(2025๋…„ 5์›” 1์ผ)์ž…๋‹ˆ๋‹ค. 5์›” ์ดˆ์— ๋น„ํ•ด ๊ธ‰๊ฒฉํžˆ ์ƒ์Šนํ•˜์˜€์œผ๋‚˜, ์ตœ๊ทผ์—๋Š” ์•ฝ๊ฐ„์˜ ์กฐ์ •์„ธ๋ฅผ ๋ณด์ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.", + "indicator_analysis": [ + { + "indicator": "50 SMA", + "value": "319.97", + "interpretation": "์ค‘๊ธฐ ์ถ”์„ธ ์ง€ํ‘œ๋กœ, ํ˜„์žฌ ์ฃผ๊ฐ€๊ฐ€ ์ด ์ง€ํ‘œ๋ฅผ ์ƒํšŒํ•˜๊ณ  ์žˆ์–ด ์ƒ์Šน ์ถ”์„ธ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค." + }, + { + "indicator": "MACD", + "value": "18.33", + "interpretation": "๋ชจ๋ฉ˜ํ…€ ์ง€ํ‘œ๋กœ, ์–‘์ˆ˜ ๊ฐ’์„ ์œ ์ง€ํ•˜๊ณ  ์žˆ์–ด ์ƒ์Šน ๋ชจ๋ฉ˜ํ…€์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค." + } + ], + "overall_conclusion": "APP์˜ ์ฃผ๊ฐ€๋Š” ํ˜„์žฌ ๊ฐ•ํ•œ ์ƒ์Šน์„ธ๋ฅผ ๋ณด์ด๊ณ  ์žˆ์œผ๋‚˜, ๋‹จ๊ธฐ ์กฐ์ • ๊ฐ€๋Šฅ์„ฑ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ํˆฌ์ž์ž๋“ค์€ ์‹œ์žฅ์˜ ๋ณ€๋™์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ ์‹ ์ค‘ํ•œ ์ ‘๊ทผ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค." +} +``` + +Available indicators: Moving Averages: -- close_50_sma: 50 SMA: A medium-term trend indicator. Usage: Identify trend direction and serve as dynamic support/resistance. Tips: It lags price; combine with faster indicators for timely signals. -- close_200_sma: 200 SMA: A long-term trend benchmark. Usage: Confirm overall market trend and identify golden/death cross setups. Tips: It reacts slowly; best for strategic trend confirmation rather than frequent trading entries. -- close_10_ema: 10 EMA: A responsive short-term average. Usage: Capture quick shifts in momentum and potential entry points. Tips: Prone to noise in choppy markets; use alongside longer averages for filtering false signals. +- close_50_sma: 50 SMA +- close_200_sma: 200 SMA +- close_10_ema: 10 EMA MACD Related: -- macd: MACD: Computes momentum via differences of EMAs. Usage: Look for crossovers and divergence as signals of trend changes. Tips: Confirm with other indicators in low-volatility or sideways markets. -- macds: MACD Signal: An EMA smoothing of the MACD line. Usage: Use crossovers with the MACD line to trigger trades. Tips: Should be part of a broader strategy to avoid false positives. -- macdh: MACD Histogram: Shows the gap between the MACD line and its signal. Usage: Visualize momentum strength and spot divergence early. Tips: Can be volatile; complement with additional filters in fast-moving markets. +- macd: MACD +- macds: MACD Signal +- macdh: MACD Histogram Momentum Indicators: -- rsi: RSI: Measures momentum to flag overbought/oversold conditions. Usage: Apply 70/30 thresholds and watch for divergence to signal reversals. Tips: In strong trends, RSI may remain extreme; always cross-check with trend analysis. +- rsi: RSI Volatility Indicators: -- boll: Bollinger Middle: A 20 SMA serving as the basis for Bollinger Bands. Usage: Acts as a dynamic benchmark for price movement. Tips: Combine with the upper and lower bands to effectively spot breakouts or reversals. -- boll_ub: Bollinger Upper Band: Typically 2 standard deviations above the middle line. Usage: Signals potential overbought conditions and breakout zones. Tips: Confirm signals with other tools; prices may ride the band in strong trends. -- boll_lb: Bollinger Lower Band: Typically 2 standard deviations below the middle line. Usage: Indicates potential oversold conditions. Tips: Use additional analysis to avoid false reversal signals. -- atr: ATR: Averages true range to measure volatility. Usage: Set stop-loss levels and adjust position sizes based on current market volatility. Tips: It's a reactive measure, so use it as part of a broader risk management strategy. +- boll: Bollinger Middle +- boll_ub: Bollinger Upper Band +- boll_lb: Bollinger Lower Band +- atr: ATR Volume-Based Indicators: -- vwma: VWMA: A moving average weighted by volume. Usage: Confirm trends by integrating price action with volume data. Tips: Watch for skewed results from volume spikes; use in combination with other volume analyses. +- vwma: VWMA -- Select indicators that provide diverse and complementary information. Avoid redundancy (e.g., do not select both rsi and stochrsi). Also briefly explain why they are suitable for the given market context. When you tool call, please use the exact name of the indicators provided above as they are defined parameters, otherwise your call will fail. Please make sure to call get_YFin_data first to retrieve the CSV that is needed to generate indicators. Write a very detailed and nuanced report of the trends you observe. Do not simply state the trends are mixed, provide detailed and finegrained analysis and insights that may help traders make decisions.""" - + """ Make sure to append a Markdown table at the end of the report to organize key points in the report, organized and easy to read. Please write all responses in Korean.""" +Please write all text content within the JSON in Korean. +""" ) prompt = ChatPromptTemplate.from_messages( diff --git a/tradingagents/graph/reflection.py b/tradingagents/graph/reflection.py index c1a25ce4..2a968f6b 100644 --- a/tradingagents/graph/reflection.py +++ b/tradingagents/graph/reflection.py @@ -2,6 +2,8 @@ from typing import Dict, Any from langchain_openai import ChatOpenAI +import json +import re class Reflector: @@ -122,44 +124,56 @@ Adhere strictly to these instructions, and ensure your output is detailed, accur @staticmethod def generate_final_report(final_state: dict) -> str: - """Generate a final, comprehensive report from the final state.""" - - report_parts = [] - report_parts.append(f"# ์ตœ์ข… ๋ถ„์„ ๋ณด๊ณ ์„œ: {final_state.get('company_of_interest', 'N/A')}") - report_parts.append(f"**๋ถ„์„ ๊ธฐ์ค€์ผ:** {final_state.get('trade_date', 'N/A')}") - report_parts.append("---") + """ + Generate a final, comprehensive report from the final state, ensuring + all parts are combined into a single, valid JSON object. + """ + final_report_json = { + "company_info": { + "ticker": final_state.get('company_of_interest', 'N/A'), + "analysis_date": final_state.get('trade_date', 'N/A') + }, + "reports": {}, + "final_decision": {} + } - # ๊ฐ ๋ถ„์„๊ฐ€ ๋ฆฌํฌํŠธ ์ถ”๊ฐ€ - if final_state.get('market_report'): - report_parts.append("## ์‹œ์žฅ ๋ถ„์„๊ฐ€ ๋ฆฌํฌํŠธ") - report_parts.append(final_state['market_report']) - - if final_state.get('sentiment_report'): - report_parts.append("## ์†Œ์…œ ๋ฏธ๋””์–ด ๋ถ„์„๊ฐ€ ๋ฆฌํฌํŠธ") - report_parts.append(final_state['sentiment_report']) + def extract_json(text: str) -> dict: + """Extracts a JSON object from a string, even if it's embedded in other text.""" + if not isinstance(text, str): + return {} # Return empty dict if not a string + + # Find the start and end of the JSON object + match = re.search(r'\{.*\}', text, re.DOTALL) + if match: + json_str = match.group(0) + try: + return json.loads(json_str) + except json.JSONDecodeError: + return {"error": "Failed to decode JSON", "original_text": json_str} + return {"error": "No JSON object found", "original_text": text} - if final_state.get('news_report'): - report_parts.append("## ๋‰ด์Šค ๋ถ„์„๊ฐ€ ๋ฆฌํฌํŠธ") - report_parts.append(final_state['news_report']) + # Process each report + report_keys = ['market_report', 'sentiment_report', 'news_report', 'fundamentals_report'] + for key in report_keys: + if final_state.get(key): + report_name = key.replace('_report', '') + final_report_json['reports'][report_name] = extract_json(final_state[key]) - if final_state.get('fundamentals_report'): - report_parts.append("## ์žฌ๋ฌด ๋ถ„์„๊ฐ€ ๋ฆฌํฌํŠธ") - report_parts.append(final_state['fundamentals_report']) - - # ํˆฌ์ž ํ† ๋ก  ์š”์•ฝ ์ถ”๊ฐ€ + # Add investment debate summary if final_state.get('investment_debate_state'): - debate = final_state['investment_debate_state'] - report_parts.append("## ํˆฌ์ž ๊ฒฐ์ • ํ† ๋ก  ์š”์•ฝ") - report_parts.append(f"**์‹ฌ์‚ฌ์œ„์› ์ตœ์ข… ๊ฒฐ์ •:** {debate.get('judge_decision', 'N/A')}") + final_report_json['reports']['investment_debate'] = { + "summary": final_state['investment_debate_state'].get('judge_decision', 'N/A') + } - # ์ตœ์ข… ํˆฌ์ž ๊ณ„ํš ๋ฐ ๊ฒฐ์ • ์ถ”๊ฐ€ + # Add final plan and decision if final_state.get('investment_plan'): - report_parts.append("## ์ตœ์ข… ํˆฌ์ž ๊ณ„ํš") - report_parts.append(final_state['investment_plan']) - + final_report_json['final_decision']['investment_plan'] = final_state['investment_plan'] + if final_state.get('final_trade_decision'): - report_parts.append("## ์ตœ์ข… ๊ฑฐ๋ž˜ ๊ฒฐ์ •") - report_parts.append(final_state['final_trade_decision']) + # Extract the final proposal (BUY/HOLD/SELL) + proposal_match = re.search(r'FINAL TRANSACTION PROPOSAL:\s*\*{2}(.*?)\*{2}', final_state['final_trade_decision']) + proposal = proposal_match.group(1) if proposal_match else 'N/A' + final_report_json['final_decision']['final_proposal'] = proposal + final_report_json['final_decision']['full_text'] = final_state['final_trade_decision'] - report = "\n\n".join(report_parts) - return report + return json.dumps(final_report_json, ensure_ascii=False, indent=4) diff --git a/web/backend/eval_results/MSFT/TradingAgentsStrategy_logs/full_states_log.json b/web/backend/eval_results/MSFT/TradingAgentsStrategy_logs/full_states_log.json new file mode 100644 index 00000000..1e4fecca --- /dev/null +++ b/web/backend/eval_results/MSFT/TradingAgentsStrategy_logs/full_states_log.json @@ -0,0 +1,27 @@ +{ + "2025-06-13": { + "company_of_interest": "MSFT", + "trade_date": "2025-06-13", + "market_report": "", + "sentiment_report": "", + "news_report": "### \ucd5c\uadfc \uc138\uacc4 \uacbd\uc81c \ubc0f MSFT \uad00\ub828 \ub274\uc2a4 \ubd84\uc11d \ubcf4\uace0\uc11c (2025\ub144 6\uc6d4 13\uc77c \uae30\uc900)\n\n#### 1. \uc138\uacc4 \uacbd\uc81c \ub3d9\ud5a5\n\ucd5c\uadfc \uc77c\uc8fc\uc77c(6\uc6d4 6\uc77c~13\uc77c) \ub3d9\uc548 \uc5ec\ub7ec \uac00\uc9c0 \uac70\uc2dc\uacbd\uc81c\uc801 \ubc1c\uc804\uc774 \uac70\ub798 \uacb0\uc815\uc5d0 \uc911\uc694\ud55c \uc601\ud5a5\uc744 \ubbf8\uce58\uace0 \uc788\uc2b5\ub2c8\ub2e4.\n\n- **\ubbf8\uad6d \ub2ec\ub7ec \ud558\ub77d**: \ubbf8\uad6d \ub2ec\ub7ec\ub294 \uc8fc\uc694 \ud1b5\ud654 \ubc14\uc2a4\ucf13\uc5d0 \ub300\ud574 3\ub144 \ub9cc\uc5d0 \ucd5c\uc800 \uc218\uc900\uc73c\ub85c \ud558\ub77d\ud588\uc2b5\ub2c8\ub2e4. \uc774\ub294 \uc608\uc0c1\ubcf4\ub2e4 \ub0ae\uc740 \uc0dd\uc0b0\uc790 \ubc0f \uc18c\ube44\uc790 \ubb3c\uac00 \uc9c0\uc218\uc640 \uac19\uc740 \ubd80\ub4dc\ub7ec\uc6b4 \uc778\ud50c\ub808\uc774\uc158 \ub370\uc774\ud130\uc5d0 \uae30\uc778\ud558\uba70, \uc774\ub294 \uc5f0\ubc29\uc900\ube44\uc81c\ub3c4(Fed)\uac00 9\uc6d4\uc5d0 \uae08\ub9ac \uc778\ud558\ub97c \ud560 \uac00\ub2a5\uc131\uc744 \uc2dc\uc0ac\ud569\ub2c8\ub2e4. \uc720\ub7fd \uc5f0\uae08 \uae30\uae08\uc758 \uc9c0\uc18d\uc801\uc778 \ud5e4\uc9d5\ub3c4 \ub2ec\ub7ec\uc5d0 \ucd94\uac00\uc801\uc778 \uc555\ub825\uc744 \uac00\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.\n\n- **\uc9c0\uc815\ud559\uc801 \uae34\uc7a5**: \uc911\ub3d9\uc5d0\uc11c\uc758 \uae34\uc7a5\uc774 \uc2dc\uc7a5\uc5d0 \ud070 \uc601\ud5a5\uc744 \ubbf8\uce58\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc774\uc2a4\ub77c\uc5d8\uc758 \uc774\ub780 \uad70\uc0ac \uacf5\uaca9\uc73c\ub85c \uc778\ud574 \uae00\ub85c\ubc8c \uc8fc\uc2dd \uc2dc\uc7a5\uc5d0\uc11c \uae09\uaca9\ud55c \ub9e4\ub3c4\uc138\uac00 \ub098\ud0c0\ub0ac\uc2b5\ub2c8\ub2e4. \uc544\uc2dc\uc544 \ubc0f \uc720\ub7fd \uc9c0\uc218\ub294 \ud558\ub77d\ud588\uc73c\uba70, S&P E-mini\uc640 \ub098\uc2a4\ub2e5 \uc120\ubb3c\uc740 \uac01\uac01 1.7% \ubc0f 1.8% \ud558\ub77d\ud588\uc2b5\ub2c8\ub2e4. \uc6d0\uc720 \uac00\uaca9\uc740 \uc57d 9% \uc0c1\uc2b9\ud558\uba70 \uacf5\uae09 \uc911\ub2e8 \uc6b0\ub824\uac00 \ucee4\uc84c\uc2b5\ub2c8\ub2e4.\n\n- **\ubbf8\uc911 \ubb34\uc5ed \uad00\uacc4**: \ubbf8\uc911 \ubb34\uc5ed \uad00\uacc4\ub294 \uc5ec\uc804\ud788 \ubcf5\uc7a1\ud569\ub2c8\ub2e4. \uc0c8\ub85c\uc6b4 \ubb34\uc5ed \ud611\uc815\uc774 \ucd94\uac00 \uad00\uc138\ub97c \ub3c4\uc785\ud558\uba74\uc11c JPMorgan\uc740 \ubbf8\uad6d GDP \uc804\ub9dd\uc744 \ud558\ud5a5 \uc870\uc815\ud588\uc2b5\ub2c8\ub2e4. \ubc18\uba74, Oxford Economics\ub294 \uc131\uc7a5 \uc804\ub9dd\uc744 \uc0c1\ud5a5 \uc870\uc815\ud558\uba70 \uacbd\uae30 \uce68\uccb4 \uc704\ud5d8\uc744 \uc904\uc600\uc2b5\ub2c8\ub2e4.\n\n- **\uc911\uad6d\uacfc \uc720\ub7fd \uc911\uc559\uc740\ud589\uc758 \ud611\ub825**: \uc911\uad6d\uc758 \ub9ac\ucc3d \ucd1d\ub9ac\ub294 \uc720\ub7fd \uc911\uc559\uc740\ud589\uacfc\uc758 \ud611\ub825\uc744 \uac15\ud654\ud560 \uc900\ube44\uac00 \ub418\uc5b4 \uc788\ub2e4\uace0 \ubc1d\ud614\uc2b5\ub2c8\ub2e4. \uc774\ub294 \uae00\ub85c\ubc8c \ubb34\uc5ed \uae34\uc7a5 \uc18d\uc5d0\uc11c \uacbd\uc81c\uc801 \uc720\ub300\uc640 \uc0b0\uc5c5 \ud1b5\ud569\uc744 \uac15\ud654\ud558\ub824\ub294 \uc911\uad6d\uc758 \uc801\uadf9\uc801\uc778 \uc811\uadfc\uc744 \ubc18\uc601\ud569\ub2c8\ub2e4.\n\n#### 2. MSFT \uad00\ub828 \ub274\uc2a4\nMicrosoft (MSFT)\ub294 \ucd5c\uadfc \uba87 \uac00\uc9c0 \uae0d\uc815\uc801\uc778 \ub274\uc2a4\ub85c \uc8fc\ubaa9\ubc1b\uace0 \uc788\uc2b5\ub2c8\ub2e4.\n\n- **AI \ubc0f \ud074\ub77c\uc6b0\ub4dc \ud50c\ub7ab\ud3fc\uc758 \uac15\ub825\ud55c \uc131\uc7a5**: Microsoft\ub294 Azure \ud074\ub77c\uc6b0\ub4dc \ud50c\ub7ab\ud3fc\uc758 \uac15\ub825\ud55c \uc131\uacfc\uc640 AI \ubd84\uc57c\uc5d0\uc11c\uc758 \ub9ac\ub354\uc2ed\uc744 \ud1b5\ud574 \uc8fc\uac00\uac00 \uc0ac\uc0c1 \ucd5c\uace0\uce58\ub97c \uae30\ub85d\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ucd5c\uadfc \uc8fc\uac00\ub294 $470.38\uc5d0 \ub3c4\ub2ec\ud558\uba70, \uc2dc\uc7a5\uc5d0\uc11c\uc758 \uc9c0\ubc30\ub825\uc744 \ub2e4\uc2dc \ud68c\ubcf5\ud588\uc2b5\ub2c8\ub2e4.\n\n- **OpenAI\uc758 \uc218\uc775 \uc99d\uac00**: Microsoft\uac00 \uc9c0\uc6d0\ud558\ub294 OpenAI\ub294 \uc5f0\uac04 \ubc18\ubcf5 \uc218\uc775\uc774 $10\uc5b5\uc5d0 \ub2ec\ud558\uba70, \uc774\ub294 6\uac1c\uc6d4 \uc804\uc758 $5.5\uc5b5\uc5d0\uc11c \uac70\uc758 \ub450 \ubc30\ub85c \uc99d\uac00\ud55c \uac83\uc785\ub2c8\ub2e4. \uc774\ub294 AI \ucc44\ud0dd\uc774 \uac00\uc18d\ud654\ub418\uace0 \uc788\uc74c\uc744 \ub098\ud0c0\ub0c5\ub2c8\ub2e4.\n\n- **\ubc30\ub2f9\uae08 \ubc1c\ud45c**: Microsoft\ub294 \uc8fc\ub2f9 $0.83\uc758 \ubc30\ub2f9\uae08\uc744 \ubc1c\ud45c\ud558\uba70, \uc774\ub294 \uc8fc\uc8fc\ub4e4\uc5d0\uac8c \uc9c0\uc18d\uc801\uc778 \uc218\uc775\uc744 \uc81c\uacf5\ud558\ub294 \uac83\uc744 \ubaa9\ud45c\ub85c \ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.\n\n- **\uae0d\uc815\uc801\uc778 \uc560\ub110\ub9ac\uc2a4\ud2b8 \uc804\ub9dd**: Citi\ub294 Microsoft\uc5d0 \ub300\ud574 \uae0d\uc815\uc801\uc778 \ucd09\ub9e4 \uad00\ucc30\uc744 \uc2dc\uc791\ud558\uba70, \uac00\uaca9 \ubaa9\ud45c\ub97c $605\ub85c \uc0c1\ud5a5 \uc870\uc815\ud588\uc2b5\ub2c8\ub2e4. \uc774\ub294 Azure\uc758 \uc131\uc7a5 \uc804\ub9dd\uc5d0 \ub300\ud55c \uc790\uc2e0\uac10\uc744 \ubc18\uc601\ud569\ub2c8\ub2e4.\n\n- **AI \ub3c4\uad6c\uc758 \ubcf4\uc548 \ubb38\uc81c**: Microsoft\ub294 \ucd5c\uadfc 365 Copilot\uc758 \ubcf4\uc548 \ucde8\uc57d\uc810\uc744 \ud574\uacb0\ud588\uc73c\uba70, \uc774\ub294 AI \ub3c4\uad6c\uc758 \ubcf4\uc548 \ubc0f \uac1c\uc778 \uc815\ubcf4 \ubcf4\ud638\uc5d0 \ub300\ud55c \uc6b0\ub824\ub97c \ubd88\ub7ec\uc77c\uc73c\ucf30\uc2b5\ub2c8\ub2e4.\n\n### \uacb0\ub860\n\ud604\uc7ac\uc758 \uac70\uc2dc\uacbd\uc81c\uc801 \ud658\uacbd\uacfc Microsoft\uc758 \uae0d\uc815\uc801\uc778 \uc131\uc7a5 \uc804\ub9dd\uc744 \uc885\ud569\uc801\uc73c\ub85c \uace0\ub824\ud560 \ub54c, MSFT \uc8fc\uc2dd\uc740 \uc5ec\uc804\ud788 \ub9e4\ub825\uc801\uc778 \ud22c\uc790 \ub300\uc0c1\uc73c\ub85c \ubcf4\uc785\ub2c8\ub2e4. \ud2b9\ud788 AI \ubc0f \ud074\ub77c\uc6b0\ub4dc \ucef4\ud4e8\ud305 \ubd84\uc57c\uc5d0\uc11c\uc758 \uc131\uc7a5\uc740 \ud5a5\ud6c4 \uc8fc\uac00 \uc0c1\uc2b9\uc5d0 \uae30\uc5ec\ud560 \uac83\uc73c\ub85c \uc608\uc0c1\ub429\ub2c8\ub2e4.\n\n| \uc8fc\uc694 \uc0ac\ud56d | \ub0b4\uc6a9 |\n|-----------|------|\n| \ubbf8\uad6d \ub2ec\ub7ec \ud558\ub77d | 3\ub144 \ub9cc\uc5d0 \ucd5c\uc800 \uc218\uc900, \uae08\ub9ac \uc778\ud558 \uac00\ub2a5\uc131 |\n| \uc9c0\uc815\ud559\uc801 \uae34\uc7a5 | \uc774\ub780 \uacf5\uaca9\uc73c\ub85c \uc778\ud55c \uae00\ub85c\ubc8c \uc8fc\uc2dd \uc2dc\uc7a5 \ud558\ub77d |\n| \ubbf8\uc911 \ubb34\uc5ed \uad00\uacc4 | \uc0c8\ub85c\uc6b4 \uad00\uc138 \ub3c4\uc785, GDP \uc804\ub9dd \ud558\ud5a5 \uc870\uc815 |\n| \uc911\uad6d-ECB \ud611\ub825 | \uacbd\uc81c\uc801 \uc720\ub300 \uac15\ud654 |\n| MSFT \uc8fc\uac00 | $470.38, \uc0ac\uc0c1 \ucd5c\uace0\uce58 \uae30\ub85d |\n| OpenAI \uc218\uc775 | \uc5f0\uac04 $10\uc5b5, AI \ucc44\ud0dd \uac00\uc18d\ud654 |\n| \ubc30\ub2f9\uae08 | \uc8fc\ub2f9 $0.83 \ubc1c\ud45c |\n| \uc560\ub110\ub9ac\uc2a4\ud2b8 \uc804\ub9dd | Citi, \uac00\uaca9 \ubaa9\ud45c $605\ub85c \uc0c1\ud5a5 \uc870\uc815 |\n| AI \ub3c4\uad6c \ubcf4\uc548 | 365 Copilot \ubcf4\uc548 \ucde8\uc57d\uc810 \ud574\uacb0 |\n\n\uc774 \uc815\ubcf4\ub97c \ubc14\ud0d5\uc73c\ub85c \ud22c\uc790 \uacb0\uc815\uc744 \ub0b4\ub9ac\ub294 \ub370 \ub3c4\uc6c0\uc774 \ub418\uae38 \ubc14\ub78d\ub2c8\ub2e4.", + "fundamentals_report": "### Microsoft Corporation (MSFT) Fundamental Analysis Report\n\n**Date:** June 13, 2025\n\n#### Company Overview\nMicrosoft Corporation (MSFT) is a leading technology company based in the USA, known for its software products, hardware, and services. The company has a diverse portfolio that includes operating systems, productivity software, cloud services, and gaming.\n\n#### Current Stock Market Information\n- **Current Price:** $478.87\n- **Change:** +$6.41 (0.01%) from the previous close\n- **Open Price:** $475.00\n- **Intraday Volume:** 18,950,582 shares\n- **Intraday High:** $480.40\n- **Intraday Low:** $469.54\n- **Latest Trade Time:** June 12, 2025, 17:15 PDT\n\n#### Recent Developments (May 13 - June 13, 2025)\n1. **Layoffs:**\n - Microsoft announced plans to lay off over 6,000 employees, which is approximately 3% of its workforce. This move is part of a broader strategy to streamline operations and reduce costs.\n\n2. **Stock Performance Predictions:**\n - Analysts forecast that MSFT's stock price could reach an average of $564.47 by the end of June 2025, suggesting a potential increase of about 49% from the current price. This optimistic outlook is driven by the company's strong fundamentals and growth prospects.\n\n3. **Acquisitions:**\n - The acquisition of Activision Blizzard was completed on October 13, 2023. This strategic acquisition has significantly expanded Microsoft's gaming portfolio, positioning the company as a major player in the gaming industry.\n\n4. **Investments in AI:**\n - Microsoft has been making substantial investments in artificial intelligence, including a multi-billion-dollar investment in OpenAI, the developer of ChatGPT. This investment is expected to enhance Microsoft's capabilities in AI and cloud computing, driving future growth.\n\n#### Financial Insights\n- The recent layoffs may lead to short-term disruptions but are likely aimed at long-term efficiency and profitability.\n- The positive stock performance predictions indicate strong investor confidence in Microsoft's growth trajectory, particularly in AI and gaming.\n- The completion of the Activision Blizzard acquisition is expected to contribute positively to revenue streams and market share in the gaming sector.\n\n#### Insider Sentiment and Transactions\n- There is no specific insider transaction data available for this report, but the overall sentiment appears to be positive given the company's strategic moves and market performance.\n\n### Summary Table\n\n| Key Metrics | Details |\n|---------------------------------|----------------------------------|\n| **Current Price** | $478.87 |\n| **Change** | +$6.41 (0.01%) |\n| **Open Price** | $475.00 |\n| **Intraday Volume** | 18,950,582 shares |\n| **Intraday High** | $480.40 |\n| **Intraday Low** | $469.54 |\n| **Layoffs Announced** | 6,000 employees (3% workforce) |\n| **Stock Price Prediction** | $564.47 (49% potential increase) |\n| **Acquisition** | Activision Blizzard |\n| **AI Investment** | Multi-billion in OpenAI |\n\n### Conclusion\nMicrosoft Corporation is positioned for potential growth, driven by strategic investments in AI and gaming, despite the recent layoffs. The positive stock predictions reflect strong market confidence. Traders should consider these factors when making investment decisions.\n\nFINAL TRANSACTION PROPOSAL: **BUY**", + "investment_debate_state": { + "bull_history": "\nBull Analyst: \uc548\ub155\ud558\uc138\uc694! Microsoft (MSFT) \uc8fc\uc2dd\uc5d0 \ub300\ud55c \ud22c\uc790 \uad00\uc810\uc5d0\uc11c \uac15\ub825\ud55c \uc8fc\uc7a5\uc744 \ud3bc\uce58\uace0\uc790 \ud569\ub2c8\ub2e4. \ucd5c\uadfc\uc758 \uc2dc\uc7a5 \ub3d9\ud5a5\uacfc \ud68c\uc0ac\uc758 \uc131\uc7a5 \uc7a0\uc7ac\ub825\uc744 \ubc14\ud0d5\uc73c\ub85c, MSFT \uc8fc\uc2dd\uc774 \ub9e4\ub825\uc801\uc778 \ud22c\uc790 \ub300\uc0c1\uc784\uc744 \uac15\uc870\ud558\uaca0\uc2b5\ub2c8\ub2e4.\n\n### \uc131\uc7a5 \uc7a0\uc7ac\ub825\nMicrosoft\ub294 \ud074\ub77c\uc6b0\ub4dc \ucef4\ud4e8\ud305\uacfc \uc778\uacf5\uc9c0\ub2a5(AI) \ubd84\uc57c\uc5d0\uc11c\uc758 \uac15\ub825\ud55c \uc131\uc7a5\uc744 \ubcf4\uc5ec\uc8fc\uace0 \uc788\uc2b5\ub2c8\ub2e4. Azure \ud074\ub77c\uc6b0\ub4dc \ud50c\ub7ab\ud3fc\uc740 \ucd5c\uadfc \uba87 \ub144\uac04 \uc9c0\uc18d\uc801\uc73c\ub85c \uc131\uc7a5\ud574\uc654\uc73c\uba70, AI \ubd84\uc57c\uc5d0\uc11c\ub3c4 OpenAI\uc640\uc758 \ud611\ub825\uc744 \ud1b5\ud574 \uc5f0\uac04 \ubc18\ubcf5 \uc218\uc775\uc774 10\uc5b5 \ub2ec\ub7ec\uc5d0 \ub2ec\ud558\ub294 \uc131\uacfc\ub97c \uc62c\ub9ac\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub294 AI \ucc44\ud0dd\uc774 \uac00\uc18d\ud654\ub418\uace0 \uc788\ub2e4\ub294 \uac83\uc744 \uc758\ubbf8\ud558\uba70, \uc55e\uc73c\ub85c\ub3c4 \uc774 \ubd84\uc57c\uc5d0\uc11c\uc758 \uc131\uc7a5\uc740 \ub354\uc6b1 \uae30\ub300\ub429\ub2c8\ub2e4. Citi\uc758 \ubd84\uc11d\uc5d0 \ub530\ub974\uba74, MSFT\uc758 \uc8fc\uac00\ub294 2025\ub144 6\uc6d4\uae4c\uc9c0 564.47\ub2ec\ub7ec\uc5d0 \uc774\ub97c \uac83\uc73c\ub85c \uc608\uc0c1\ub418\uba70, \uc774\ub294 \ud604\uc7ac \uac00\uaca9\uc5d0\uc11c \uc57d 49% \uc0c1\uc2b9\ud560 \uac00\ub2a5\uc131\uc744 \ub0b4\ud3ec\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.\n\n### \uacbd\uc7c1 \uc6b0\uc704\nMicrosoft\ub294 \uc18c\ud504\ud2b8\uc6e8\uc5b4, \ud558\ub4dc\uc6e8\uc5b4, \ud074\ub77c\uc6b0\ub4dc \uc11c\ube44\uc2a4, \uac8c\uc784 \ub4f1 \ub2e4\uc591\ud55c \ud3ec\ud2b8\ud3f4\ub9ac\uc624\ub97c \ubcf4\uc720\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ud2b9\ud788, \ucd5c\uadfc Activision Blizzard \uc778\uc218\ub294 \uac8c\uc784 \uc0b0\uc5c5\uc5d0\uc11c\uc758 \uc2dc\uc7a5 \uc810\uc720\uc728\uc744 \ud06c\uac8c \ud655\ub300\ud558\ub294 \uacc4\uae30\uac00 \ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ub3c5\ud2b9\ud55c \uc81c\ud488\uacfc \uac15\ub825\ud55c \ube0c\ub79c\ub4dc\ub294 Microsoft\uac00 \uacbd\uc7c1\uc0ac\ub4e4\ubcf4\ub2e4 \uc6b0\uc704\ub97c \uc810\ud560 \uc218 \uc788\ub294 \uc911\uc694\ud55c \uc694\uc18c\uc785\ub2c8\ub2e4. \ub610\ud55c, Microsoft\uc758 \ud074\ub77c\uc6b0\ub4dc \uc11c\ube44\uc2a4\ub294 \uc774\ubbf8 \uc2dc\uc7a5\uc5d0\uc11c \ub192\uc740 \uc810\uc720\uc728\uc744 \ucc28\uc9c0\ud558\uace0 \uc788\uc73c\uba70, \uc774\ub294 \uace0\uac1d\uc758 \uc2e0\ub8b0\ub97c \ubc14\ud0d5\uc73c\ub85c \ud55c \uc9c0\uc18d \uac00\ub2a5\ud55c \uc131\uc7a5\uc73c\ub85c \uc774\uc5b4\uc9c8 \uac83\uc785\ub2c8\ub2e4.\n\n### \uae0d\uc815\uc801\uc778 \uc2dc\uc7a5 \uc9c0\ud45c\n\ucd5c\uadfc \ubbf8\uad6d \ub2ec\ub7ec\uc758 \ud558\ub77d\uacfc \uae08\ub9ac \uc778\ud558 \uac00\ub2a5\uc131\uc740 \uae30\uc5c5\uc758 \uc790\uae08 \uc870\ub2ec \ube44\uc6a9\uc744 \ub0ae\ucd94\uace0, \uc774\ub294 Microsoft\uc640 \uac19\uc740 \ub300\uae30\uc5c5\uc5d0\uac8c \uae0d\uc815\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uac83\uc785\ub2c8\ub2e4. \ub610\ud55c, \uc9c0\uc815\ud559\uc801 \uae34\uc7a5 \uc18d\uc5d0\uc11c\ub3c4 Microsoft\ub294 \uc548\uc815\uc801\uc778 \uc131\uc7a5\uc744 \uc774\uc5b4\uac00\uace0 \uc788\uc73c\uba70, \uc774\ub294 \ud22c\uc790\uc790\ub4e4\uc5d0\uac8c \uc2e0\ub8b0\ub97c \uc904 \uc218 \uc788\ub294 \uc694\uc18c\uc785\ub2c8\ub2e4. \ucd5c\uadfc \ubc1c\ud45c\ub41c \ubc30\ub2f9\uae08\uc740 \uc8fc\uc8fc\ub4e4\uc5d0\uac8c \uc9c0\uc18d\uc801\uc778 \uc218\uc775\uc744 \uc81c\uacf5\ud558\ub294 \uac83\uc744 \ubaa9\ud45c\ub85c \ud558\uace0 \uc788\uc73c\uba70, \uc774\ub294 \ud22c\uc790\uc790\ub4e4\uc5d0\uac8c \uae0d\uc815\uc801\uc778 \uc2e0\ud638\ub85c \uc791\uc6a9\ud560 \uac83\uc785\ub2c8\ub2e4.\n\n### \ubca0\uc5b4 \ubc18\ub860\n\ubca0\uc5b4 \ubd84\uc11d\uac00\ub4e4\uc740 \ucd5c\uadfc\uc758 \uc778\ub825 \uac10\ucd95\uc774 \ubd80\uc815\uc801\uc778 \uc2e0\ud638\ub77c\uace0 \uc8fc\uc7a5\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \uc774\ub7ec\ud55c \uac10\ucd95\uc740 \uc7a5\uae30\uc801\uc778 \ud6a8\uc728\uc131\uacfc \uc218\uc775\uc131\uc744 \uc704\ud55c \uc804\ub7b5\uc758 \uc77c\ud658\uc73c\ub85c \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4. Microsoft\ub294 \uc774\ub7ec\ud55c \uc870\uce58\ub97c \ud1b5\ud574 \uc6b4\uc601 \ube44\uc6a9\uc744 \uc808\uac10\ud558\uace0, \ub354 \ub098\uc740 \uc131\uacfc\ub97c \ub0b4\uae30 \uc704\ud55c \uae30\ubc18\uc744 \ub9c8\ub828\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ub610\ud55c, AI\uc640 \ud074\ub77c\uc6b0\ub4dc \ubd84\uc57c\uc5d0\uc11c\uc758 \uac15\ub825\ud55c \uc131\uc7a5 \uc804\ub9dd\uc740 \uc774\ub7ec\ud55c \ub2e8\uae30\uc801\uc778 \ubd80\uc815\uc801 \uc694\uc18c\ub97c \uc0c1\uc1c4\ud560 \ub9cc\ud07c \ucda9\ubd84\ud788 \uae0d\uc815\uc801\uc785\ub2c8\ub2e4.\n\n\uacfc\uac70\uc758 \uacbd\ud5d8\uc744 \ud1b5\ud574 \ubc30\uc6b4 \uc810\uc740, \ub2e8\uae30\uc801\uc778 \uc2dc\uc7a5 \ubcc0\ub3d9\uc131\uc5d0 \ud718\ub458\ub9ac\uc9c0 \uc54a\uace0 \uc7a5\uae30\uc801\uc778 \uc131\uc7a5 \uac00\ub2a5\uc131\uc744 \ubc14\ub77c\ubcf4\ub294 \uac83\uc774 \uc911\uc694\ud558\ub2e4\ub294 \uac83\uc785\ub2c8\ub2e4. Microsoft\ub294 \uc774\ubbf8 \uc5ec\ub7ec \ucc28\ub840\uc758 \uc2dc\uc7a5 \uc704\uae30\ub97c \uadf9\ubcf5\ud574\uc654\uc73c\uba70, \uc774\ubc88\uc5d0\ub3c4 \uadf8\ub7f4 \uac83\uc774\ub77c\uace0 \ud655\uc2e0\ud569\ub2c8\ub2e4.\n\n\uacb0\ub860\uc801\uc73c\ub85c, Microsoft\ub294 \uac15\ub825\ud55c \uc131\uc7a5 \uc7a0\uc7ac\ub825\uacfc \uacbd\uc7c1 \uc6b0\uc704\ub97c \ubc14\ud0d5\uc73c\ub85c \ub9e4\ub825\uc801\uc778 \ud22c\uc790 \uae30\ud68c\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4. AI\uc640 \ud074\ub77c\uc6b0\ub4dc \ucef4\ud4e8\ud305 \ubd84\uc57c\uc5d0\uc11c\uc758 \uc131\uc7a5\uc740 \uc55e\uc73c\ub85c\ub3c4 \uc9c0\uc18d\ub420 \uac83\uc774\uba70, \uc774\ub294 \uc8fc\uac00 \uc0c1\uc2b9\uc73c\ub85c \uc774\uc5b4\uc9c8 \uac83\uc785\ub2c8\ub2e4. \ub530\ub77c\uc11c MSFT \uc8fc\uc2dd\uc740 \ud604\uc7ac\uc758 \uc2dc\uc7a5 \uc0c1\ud669\uc5d0\uc11c\ub3c4 \uc5ec\uc804\ud788 \ub9e4\ub825\uc801\uc778 \ud22c\uc790 \ub300\uc0c1\uc774\ub77c\uace0 \uc0dd\uac01\ud569\ub2c8\ub2e4. \n\n\uc5ec\ub7ec\ubd84\uc758 \uc758\uacac\uc740 \uc5b4\ub5a0\uc2e0\uac00\uc694?", + "bear_history": "\nBear Analyst: \uc548\ub155\ud558\uc138\uc694! Microsoft (MSFT) \uc8fc\uc2dd\uc5d0 \ub300\ud55c \ud22c\uc790 \uad00\uc810\uc5d0\uc11c \ubc18\ub860\uc744 \uc81c\uae30\ud558\uace0\uc790 \ud569\ub2c8\ub2e4. \ucd5c\uadfc\uc758 \uae0d\uc815\uc801\uc778 \ub274\uc2a4\uc640 \uc131\uc7a5 \uc804\ub9dd\uc5d0\ub3c4 \ubd88\uad6c\ud558\uace0, MSFT \uc8fc\uc2dd\uc5d0 \ub300\ud55c \ud22c\uc790\uc5d0\ub294 \uc5ec\ub7ec \uac00\uc9c0 \uc704\ud5d8 \uc694\uc18c\uc640 \ub3c4\uc804 \uacfc\uc81c\uac00 \uc874\uc7ac\ud569\ub2c8\ub2e4. \uc774 \uc810\ub4e4\uc744 \ud568\uaed8 \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.\n\n### 1. \uc2dc\uc7a5 \ud3ec\ud654\uc640 \uacbd\uc7c1\uc758 \uc2ec\ud654\nMicrosoft\ub294 \ud074\ub77c\uc6b0\ub4dc \ucef4\ud4e8\ud305\uacfc AI \ubd84\uc57c\uc5d0\uc11c \uac15\ub825\ud55c \uc131\uc7a5\uc744 \ubcf4\uc5ec\uc8fc\uace0 \uc788\ub2e4\uace0 \ud558\uc9c0\ub9cc, \uc774 \uc2dc\uc7a5\uc740 \uc774\ubbf8 \ud3ec\ud654 \uc0c1\ud0dc\uc5d0 \uac00\uae4c\uc6cc\uc9c0\uace0 \uc788\uc2b5\ub2c8\ub2e4. AWS\uc640 Google Cloud\uc640 \uac19\uc740 \uac15\ub825\ud55c \uacbd\uc7c1\uc790\ub4e4\uc774 \uc874\uc7ac\ud558\uba70, \uc774\ub4e4\uc740 \uc9c0\uc18d\uc801\uc73c\ub85c \ud601\uc2e0\uc744 \uc774\ub8e8\uace0 \uc788\uc2b5\ub2c8\ub2e4. Microsoft\uc758 Azure\uac00 \uc2dc\uc7a5 \uc810\uc720\uc728\uc744 \uc720\uc9c0\ud558\uace0 \uc788\uc9c0\ub9cc, \uacbd\uc7c1\uc790\ub4e4\uc774 \uc81c\uacf5\ud558\ub294 \uac00\uaca9 \uacbd\uc7c1\ub825\uacfc \uae30\uc220 \ud601\uc2e0\uc5d0 \ub300\uc751\ud558\uae30 \uc5b4\ub824\uc6b4 \uc0c1\ud669\uc785\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uacbd\uc7c1 \uc2ec\ud654\ub294 MSFT\uc758 \uc131\uc7a5 \uc7a0\uc7ac\ub825\uc744 \uc81c\ud55c\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n### 2. \uc7ac\uc815\uc801 \ubd88\uc548\uc815\uc131\uacfc \uc778\ub825 \uac10\ucd95\n\ucd5c\uadfc Microsoft\ub294 6,000\uba85\uc758 \uc9c1\uc6d0\uc744 \uac10\ucd95\ud55c\ub2e4\uace0 \ubc1c\ud45c\ud588\uc2b5\ub2c8\ub2e4. \uc774\ub294 \ub2e8\uae30\uc801\uc778 \ube44\uc6a9 \uc808\uac10 \uc804\ub7b5\uc73c\ub85c \ubcfc \uc218 \uc788\uc9c0\ub9cc, \uc7a5\uae30\uc801\uc73c\ub85c\ub294 \ud68c\uc0ac\uc758 \ud601\uc2e0\uacfc \uc131\uc7a5\uc5d0 \ubd80\uc815\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc778\ub825 \uac10\ucd95\uc740 \uc9c1\uc6d0\ub4e4\uc758 \uc0ac\uae30 \uc800\ud558\uc640 \uae30\uc5c5 \ubb38\ud654\uc758 \uc57d\ud654\ub97c \ucd08\ub798\ud560 \uc218 \uc788\uc73c\uba70, \uc774\ub294 \uacb0\uad6d \uace0\uac1d \uc11c\ube44\uc2a4\uc640 \uc81c\ud488 \ud488\uc9c8\uc5d0 \uc545\uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uacfc\uac70\uc5d0\ub3c4 \ube44\uc2b7\ud55c \uc0c1\ud669\uc5d0\uc11c \uc778\ub825 \uac10\ucd95\uc774 \uae30\uc5c5\uc758 \uc131\uacfc\uc5d0 \ubd80\uc815\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce5c \uc0ac\ub840\uac00 \ub9ce\uc558\uc2b5\ub2c8\ub2e4.\n\n### 3. \uac70\uc2dc\uacbd\uc81c\uc801 \uc704\ud611\n\ud604\uc7ac\uc758 \uac70\uc2dc\uacbd\uc81c\uc801 \ud658\uacbd\uc740 Microsoft\uc5d0\uac8c\ub3c4 \uc704\ud611\uc774 \ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ubbf8\uad6d \ub2ec\ub7ec\uc758 \ud558\ub77d\uacfc \uae08\ub9ac \uc778\ud558 \uac00\ub2a5\uc131\uc740 \ub2e8\uae30\uc801\uc73c\ub85c \uae0d\uc815\uc801\uc73c\ub85c \uc791\uc6a9\ud560 \uc218 \uc788\uc9c0\ub9cc, \uc9c0\uc815\ud559\uc801 \uae34\uc7a5\uacfc \ubbf8\uc911 \ubb34\uc5ed \uad00\uacc4\uc758 \ubcf5\uc7a1\uc131\uc740 \uae30\uc5c5\uc758 \uae00\ub85c\ubc8c \uc6b4\uc601\uc5d0 \ubd80\uc815\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud2b9\ud788, \uc911\ub3d9\uc758 \uae34\uc7a5 \uc0c1\ud669\uc740 \uae00\ub85c\ubc8c \uc2dc\uc7a5\uc5d0 \ubd88\ud655\uc2e4\uc131\uc744 \ub354\ud558\uace0 \uc788\uc73c\uba70, \uc774\ub294 Microsoft\uc758 \uc218\uc775\uc131\uc5d0 \uc545\uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n### 4. \uae0d\uc815\uc801\uc778 \uc2dc\uc7a5 \uc9c0\ud45c\uc758 \ud55c\uacc4\n\ubc30\ub2f9\uae08 \ubc1c\ud45c\uc640 \uac19\uc740 \uae0d\uc815\uc801\uc778 \uc2e0\ud638\ub294 \uc788\uc9c0\ub9cc, \uc774\ub294 \ub2e8\uae30\uc801\uc778 \ud22c\uc790\uc790 \uc720\uce58\ub97c \uc704\ud55c \uc804\ub7b5\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ubc30\ub2f9\uae08\uc774 \uc99d\uac00\ud55c\ub2e4\uace0 \ud574\uc11c \uae30\uc5c5\uc758 \uc7a5\uae30\uc801\uc778 \uc131\uc7a5 \uac00\ub2a5\uc131\uc774 \ubcf4\uc7a5\ub418\ub294 \uac83\uc740 \uc544\ub2d9\ub2c8\ub2e4. \ub610\ud55c, Citi\uc758 \uc8fc\uac00 \uc608\uce21\uc740 \uc9c0\ub098\uce58\uac8c \ub099\uad00\uc801\uc77c \uc218 \uc788\uc73c\uba70, \uacfc\uac70\uc5d0\ub3c4 \ube44\uc2b7\ud55c \uc608\uce21\uc774 \uc2e4\ud328\ud55c \uc0ac\ub840\uac00 \ub9ce\uc558\uc2b5\ub2c8\ub2e4. \ud22c\uc790\uc790\ub4e4\uc740 \uc774\ub7ec\ud55c \uacfc\ub3c4\ud55c \ub099\uad00\ub860\uc5d0 \ud718\ub458\ub9ac\uc9c0 \ub9d0\uace0, \ubcf4\ub2e4 \ud604\uc2e4\uc801\uc778 \uc2dc\uac01\uc5d0\uc11c \uae30\uc5c5\uc758 \uc131\uc7a5\uc744 \ud3c9\uac00\ud574\uc57c \ud569\ub2c8\ub2e4.\n\n### 5. \ubc18\ub860\uc5d0 \ub300\ud55c \ubc18\ubc15\nBull Analyst\uac00 \uc8fc\uc7a5\ud55c \uc778\ub825 \uac10\ucd95\uc774 \uc7a5\uae30\uc801\uc778 \ud6a8\uc728\uc131\uc744 \uc704\ud55c \uc804\ub7b5\uc774\ub77c\ub294 \uc810\uc5d0 \ub300\ud574, \uacfc\uac70\uc758 \uacbd\ud5d8\uc744 \ud1b5\ud574 \uc6b0\ub9ac\ub294 \uc774\ub7ec\ud55c \uc804\ub7b5\uc774 \ud56d\uc0c1 \uc131\uacf5\uc801\uc774\uc9c0 \uc54a\ub2e4\ub294 \uac83\uc744 \ubc30\uc6e0\uc2b5\ub2c8\ub2e4. \uc778\ub825 \uac10\ucd95\uc774 \ub2e8\uae30\uc801\uc778 \ube44\uc6a9 \uc808\uac10\uc5d0\ub294 \ub3c4\uc6c0\uc774 \ub420 \uc218 \uc788\uc9c0\ub9cc, \uc7a5\uae30\uc801\uc73c\ub85c\ub294 \uae30\uc5c5\uc758 \ud601\uc2e0\uacfc \uacbd\uc7c1\ub825\uc744 \uc57d\ud654\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub610\ud55c, AI\uc640 \ud074\ub77c\uc6b0\ub4dc \ubd84\uc57c\uc5d0\uc11c\uc758 \uac15\ub825\ud55c \uc131\uc7a5 \uc804\ub9dd\uc774 \ub2e8\uae30\uc801\uc778 \ubd80\uc815\uc801 \uc694\uc18c\ub97c \uc0c1\uc1c4\ud560 \ub9cc\ud07c \ucda9\ubd84\ud788 \uae0d\uc815\uc801\uc774\ub77c\ub294 \uc8fc\uc7a5\uc740 \uc9c0\ub098\uce58\uac8c \ub099\uad00\uc801\uc785\ub2c8\ub2e4. \uc2dc\uc7a5\uc758 \ubcc0\ub3d9\uc131\uacfc \uacbd\uc7c1\uc758 \uc2ec\ud654\ub294 \uc5b8\uc81c\ub4e0\uc9c0 \uae30\uc5c5\uc758 \uc131\uacfc\uc5d0 \ubd80\uc815\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n\uacb0\ub860\uc801\uc73c\ub85c, Microsoft\ub294 \ud604\uc7ac \uc5ec\ub7ec \uac00\uc9c0 \uc704\ud5d8 \uc694\uc18c\uc640 \ub3c4\uc804 \uacfc\uc81c\uc5d0 \uc9c1\uba74\ud574 \uc788\uc73c\uba70, \uc774\ub7ec\ud55c \uc694\uc18c\ub4e4\uc740 \uc8fc\uc2dd\uc758 \uc7a5\uae30\uc801\uc778 \uc131\uacfc\uc5d0 \ubd80\uc815\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub530\ub77c\uc11c MSFT \uc8fc\uc2dd\uc5d0 \ub300\ud55c \ud22c\uc790\ub294 \uc2e0\uc911\ud558\uac8c \uace0\ub824\ud574\uc57c \ud560 \ud544\uc694\uac00 \uc788\uc2b5\ub2c8\ub2e4. \uc5ec\ub7ec\ubd84\uc758 \uc758\uacac\uc740 \uc5b4\ub5a0\uc2e0\uac00\uc694?", + "history": "\nBull Analyst: \uc548\ub155\ud558\uc138\uc694! Microsoft (MSFT) \uc8fc\uc2dd\uc5d0 \ub300\ud55c \ud22c\uc790 \uad00\uc810\uc5d0\uc11c \uac15\ub825\ud55c \uc8fc\uc7a5\uc744 \ud3bc\uce58\uace0\uc790 \ud569\ub2c8\ub2e4. \ucd5c\uadfc\uc758 \uc2dc\uc7a5 \ub3d9\ud5a5\uacfc \ud68c\uc0ac\uc758 \uc131\uc7a5 \uc7a0\uc7ac\ub825\uc744 \ubc14\ud0d5\uc73c\ub85c, MSFT \uc8fc\uc2dd\uc774 \ub9e4\ub825\uc801\uc778 \ud22c\uc790 \ub300\uc0c1\uc784\uc744 \uac15\uc870\ud558\uaca0\uc2b5\ub2c8\ub2e4.\n\n### \uc131\uc7a5 \uc7a0\uc7ac\ub825\nMicrosoft\ub294 \ud074\ub77c\uc6b0\ub4dc \ucef4\ud4e8\ud305\uacfc \uc778\uacf5\uc9c0\ub2a5(AI) \ubd84\uc57c\uc5d0\uc11c\uc758 \uac15\ub825\ud55c \uc131\uc7a5\uc744 \ubcf4\uc5ec\uc8fc\uace0 \uc788\uc2b5\ub2c8\ub2e4. Azure \ud074\ub77c\uc6b0\ub4dc \ud50c\ub7ab\ud3fc\uc740 \ucd5c\uadfc \uba87 \ub144\uac04 \uc9c0\uc18d\uc801\uc73c\ub85c \uc131\uc7a5\ud574\uc654\uc73c\uba70, AI \ubd84\uc57c\uc5d0\uc11c\ub3c4 OpenAI\uc640\uc758 \ud611\ub825\uc744 \ud1b5\ud574 \uc5f0\uac04 \ubc18\ubcf5 \uc218\uc775\uc774 10\uc5b5 \ub2ec\ub7ec\uc5d0 \ub2ec\ud558\ub294 \uc131\uacfc\ub97c \uc62c\ub9ac\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub294 AI \ucc44\ud0dd\uc774 \uac00\uc18d\ud654\ub418\uace0 \uc788\ub2e4\ub294 \uac83\uc744 \uc758\ubbf8\ud558\uba70, \uc55e\uc73c\ub85c\ub3c4 \uc774 \ubd84\uc57c\uc5d0\uc11c\uc758 \uc131\uc7a5\uc740 \ub354\uc6b1 \uae30\ub300\ub429\ub2c8\ub2e4. Citi\uc758 \ubd84\uc11d\uc5d0 \ub530\ub974\uba74, MSFT\uc758 \uc8fc\uac00\ub294 2025\ub144 6\uc6d4\uae4c\uc9c0 564.47\ub2ec\ub7ec\uc5d0 \uc774\ub97c \uac83\uc73c\ub85c \uc608\uc0c1\ub418\uba70, \uc774\ub294 \ud604\uc7ac \uac00\uaca9\uc5d0\uc11c \uc57d 49% \uc0c1\uc2b9\ud560 \uac00\ub2a5\uc131\uc744 \ub0b4\ud3ec\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.\n\n### \uacbd\uc7c1 \uc6b0\uc704\nMicrosoft\ub294 \uc18c\ud504\ud2b8\uc6e8\uc5b4, \ud558\ub4dc\uc6e8\uc5b4, \ud074\ub77c\uc6b0\ub4dc \uc11c\ube44\uc2a4, \uac8c\uc784 \ub4f1 \ub2e4\uc591\ud55c \ud3ec\ud2b8\ud3f4\ub9ac\uc624\ub97c \ubcf4\uc720\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ud2b9\ud788, \ucd5c\uadfc Activision Blizzard \uc778\uc218\ub294 \uac8c\uc784 \uc0b0\uc5c5\uc5d0\uc11c\uc758 \uc2dc\uc7a5 \uc810\uc720\uc728\uc744 \ud06c\uac8c \ud655\ub300\ud558\ub294 \uacc4\uae30\uac00 \ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ub3c5\ud2b9\ud55c \uc81c\ud488\uacfc \uac15\ub825\ud55c \ube0c\ub79c\ub4dc\ub294 Microsoft\uac00 \uacbd\uc7c1\uc0ac\ub4e4\ubcf4\ub2e4 \uc6b0\uc704\ub97c \uc810\ud560 \uc218 \uc788\ub294 \uc911\uc694\ud55c \uc694\uc18c\uc785\ub2c8\ub2e4. \ub610\ud55c, Microsoft\uc758 \ud074\ub77c\uc6b0\ub4dc \uc11c\ube44\uc2a4\ub294 \uc774\ubbf8 \uc2dc\uc7a5\uc5d0\uc11c \ub192\uc740 \uc810\uc720\uc728\uc744 \ucc28\uc9c0\ud558\uace0 \uc788\uc73c\uba70, \uc774\ub294 \uace0\uac1d\uc758 \uc2e0\ub8b0\ub97c \ubc14\ud0d5\uc73c\ub85c \ud55c \uc9c0\uc18d \uac00\ub2a5\ud55c \uc131\uc7a5\uc73c\ub85c \uc774\uc5b4\uc9c8 \uac83\uc785\ub2c8\ub2e4.\n\n### \uae0d\uc815\uc801\uc778 \uc2dc\uc7a5 \uc9c0\ud45c\n\ucd5c\uadfc \ubbf8\uad6d \ub2ec\ub7ec\uc758 \ud558\ub77d\uacfc \uae08\ub9ac \uc778\ud558 \uac00\ub2a5\uc131\uc740 \uae30\uc5c5\uc758 \uc790\uae08 \uc870\ub2ec \ube44\uc6a9\uc744 \ub0ae\ucd94\uace0, \uc774\ub294 Microsoft\uc640 \uac19\uc740 \ub300\uae30\uc5c5\uc5d0\uac8c \uae0d\uc815\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uac83\uc785\ub2c8\ub2e4. \ub610\ud55c, \uc9c0\uc815\ud559\uc801 \uae34\uc7a5 \uc18d\uc5d0\uc11c\ub3c4 Microsoft\ub294 \uc548\uc815\uc801\uc778 \uc131\uc7a5\uc744 \uc774\uc5b4\uac00\uace0 \uc788\uc73c\uba70, \uc774\ub294 \ud22c\uc790\uc790\ub4e4\uc5d0\uac8c \uc2e0\ub8b0\ub97c \uc904 \uc218 \uc788\ub294 \uc694\uc18c\uc785\ub2c8\ub2e4. \ucd5c\uadfc \ubc1c\ud45c\ub41c \ubc30\ub2f9\uae08\uc740 \uc8fc\uc8fc\ub4e4\uc5d0\uac8c \uc9c0\uc18d\uc801\uc778 \uc218\uc775\uc744 \uc81c\uacf5\ud558\ub294 \uac83\uc744 \ubaa9\ud45c\ub85c \ud558\uace0 \uc788\uc73c\uba70, \uc774\ub294 \ud22c\uc790\uc790\ub4e4\uc5d0\uac8c \uae0d\uc815\uc801\uc778 \uc2e0\ud638\ub85c \uc791\uc6a9\ud560 \uac83\uc785\ub2c8\ub2e4.\n\n### \ubca0\uc5b4 \ubc18\ub860\n\ubca0\uc5b4 \ubd84\uc11d\uac00\ub4e4\uc740 \ucd5c\uadfc\uc758 \uc778\ub825 \uac10\ucd95\uc774 \ubd80\uc815\uc801\uc778 \uc2e0\ud638\ub77c\uace0 \uc8fc\uc7a5\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \uc774\ub7ec\ud55c \uac10\ucd95\uc740 \uc7a5\uae30\uc801\uc778 \ud6a8\uc728\uc131\uacfc \uc218\uc775\uc131\uc744 \uc704\ud55c \uc804\ub7b5\uc758 \uc77c\ud658\uc73c\ub85c \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4. Microsoft\ub294 \uc774\ub7ec\ud55c \uc870\uce58\ub97c \ud1b5\ud574 \uc6b4\uc601 \ube44\uc6a9\uc744 \uc808\uac10\ud558\uace0, \ub354 \ub098\uc740 \uc131\uacfc\ub97c \ub0b4\uae30 \uc704\ud55c \uae30\ubc18\uc744 \ub9c8\ub828\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ub610\ud55c, AI\uc640 \ud074\ub77c\uc6b0\ub4dc \ubd84\uc57c\uc5d0\uc11c\uc758 \uac15\ub825\ud55c \uc131\uc7a5 \uc804\ub9dd\uc740 \uc774\ub7ec\ud55c \ub2e8\uae30\uc801\uc778 \ubd80\uc815\uc801 \uc694\uc18c\ub97c \uc0c1\uc1c4\ud560 \ub9cc\ud07c \ucda9\ubd84\ud788 \uae0d\uc815\uc801\uc785\ub2c8\ub2e4.\n\n\uacfc\uac70\uc758 \uacbd\ud5d8\uc744 \ud1b5\ud574 \ubc30\uc6b4 \uc810\uc740, \ub2e8\uae30\uc801\uc778 \uc2dc\uc7a5 \ubcc0\ub3d9\uc131\uc5d0 \ud718\ub458\ub9ac\uc9c0 \uc54a\uace0 \uc7a5\uae30\uc801\uc778 \uc131\uc7a5 \uac00\ub2a5\uc131\uc744 \ubc14\ub77c\ubcf4\ub294 \uac83\uc774 \uc911\uc694\ud558\ub2e4\ub294 \uac83\uc785\ub2c8\ub2e4. Microsoft\ub294 \uc774\ubbf8 \uc5ec\ub7ec \ucc28\ub840\uc758 \uc2dc\uc7a5 \uc704\uae30\ub97c \uadf9\ubcf5\ud574\uc654\uc73c\uba70, \uc774\ubc88\uc5d0\ub3c4 \uadf8\ub7f4 \uac83\uc774\ub77c\uace0 \ud655\uc2e0\ud569\ub2c8\ub2e4.\n\n\uacb0\ub860\uc801\uc73c\ub85c, Microsoft\ub294 \uac15\ub825\ud55c \uc131\uc7a5 \uc7a0\uc7ac\ub825\uacfc \uacbd\uc7c1 \uc6b0\uc704\ub97c \ubc14\ud0d5\uc73c\ub85c \ub9e4\ub825\uc801\uc778 \ud22c\uc790 \uae30\ud68c\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4. AI\uc640 \ud074\ub77c\uc6b0\ub4dc \ucef4\ud4e8\ud305 \ubd84\uc57c\uc5d0\uc11c\uc758 \uc131\uc7a5\uc740 \uc55e\uc73c\ub85c\ub3c4 \uc9c0\uc18d\ub420 \uac83\uc774\uba70, \uc774\ub294 \uc8fc\uac00 \uc0c1\uc2b9\uc73c\ub85c \uc774\uc5b4\uc9c8 \uac83\uc785\ub2c8\ub2e4. \ub530\ub77c\uc11c MSFT \uc8fc\uc2dd\uc740 \ud604\uc7ac\uc758 \uc2dc\uc7a5 \uc0c1\ud669\uc5d0\uc11c\ub3c4 \uc5ec\uc804\ud788 \ub9e4\ub825\uc801\uc778 \ud22c\uc790 \ub300\uc0c1\uc774\ub77c\uace0 \uc0dd\uac01\ud569\ub2c8\ub2e4. \n\n\uc5ec\ub7ec\ubd84\uc758 \uc758\uacac\uc740 \uc5b4\ub5a0\uc2e0\uac00\uc694?\nBear Analyst: \uc548\ub155\ud558\uc138\uc694! Microsoft (MSFT) \uc8fc\uc2dd\uc5d0 \ub300\ud55c \ud22c\uc790 \uad00\uc810\uc5d0\uc11c \ubc18\ub860\uc744 \uc81c\uae30\ud558\uace0\uc790 \ud569\ub2c8\ub2e4. \ucd5c\uadfc\uc758 \uae0d\uc815\uc801\uc778 \ub274\uc2a4\uc640 \uc131\uc7a5 \uc804\ub9dd\uc5d0\ub3c4 \ubd88\uad6c\ud558\uace0, MSFT \uc8fc\uc2dd\uc5d0 \ub300\ud55c \ud22c\uc790\uc5d0\ub294 \uc5ec\ub7ec \uac00\uc9c0 \uc704\ud5d8 \uc694\uc18c\uc640 \ub3c4\uc804 \uacfc\uc81c\uac00 \uc874\uc7ac\ud569\ub2c8\ub2e4. \uc774 \uc810\ub4e4\uc744 \ud568\uaed8 \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.\n\n### 1. \uc2dc\uc7a5 \ud3ec\ud654\uc640 \uacbd\uc7c1\uc758 \uc2ec\ud654\nMicrosoft\ub294 \ud074\ub77c\uc6b0\ub4dc \ucef4\ud4e8\ud305\uacfc AI \ubd84\uc57c\uc5d0\uc11c \uac15\ub825\ud55c \uc131\uc7a5\uc744 \ubcf4\uc5ec\uc8fc\uace0 \uc788\ub2e4\uace0 \ud558\uc9c0\ub9cc, \uc774 \uc2dc\uc7a5\uc740 \uc774\ubbf8 \ud3ec\ud654 \uc0c1\ud0dc\uc5d0 \uac00\uae4c\uc6cc\uc9c0\uace0 \uc788\uc2b5\ub2c8\ub2e4. AWS\uc640 Google Cloud\uc640 \uac19\uc740 \uac15\ub825\ud55c \uacbd\uc7c1\uc790\ub4e4\uc774 \uc874\uc7ac\ud558\uba70, \uc774\ub4e4\uc740 \uc9c0\uc18d\uc801\uc73c\ub85c \ud601\uc2e0\uc744 \uc774\ub8e8\uace0 \uc788\uc2b5\ub2c8\ub2e4. Microsoft\uc758 Azure\uac00 \uc2dc\uc7a5 \uc810\uc720\uc728\uc744 \uc720\uc9c0\ud558\uace0 \uc788\uc9c0\ub9cc, \uacbd\uc7c1\uc790\ub4e4\uc774 \uc81c\uacf5\ud558\ub294 \uac00\uaca9 \uacbd\uc7c1\ub825\uacfc \uae30\uc220 \ud601\uc2e0\uc5d0 \ub300\uc751\ud558\uae30 \uc5b4\ub824\uc6b4 \uc0c1\ud669\uc785\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uacbd\uc7c1 \uc2ec\ud654\ub294 MSFT\uc758 \uc131\uc7a5 \uc7a0\uc7ac\ub825\uc744 \uc81c\ud55c\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n### 2. \uc7ac\uc815\uc801 \ubd88\uc548\uc815\uc131\uacfc \uc778\ub825 \uac10\ucd95\n\ucd5c\uadfc Microsoft\ub294 6,000\uba85\uc758 \uc9c1\uc6d0\uc744 \uac10\ucd95\ud55c\ub2e4\uace0 \ubc1c\ud45c\ud588\uc2b5\ub2c8\ub2e4. \uc774\ub294 \ub2e8\uae30\uc801\uc778 \ube44\uc6a9 \uc808\uac10 \uc804\ub7b5\uc73c\ub85c \ubcfc \uc218 \uc788\uc9c0\ub9cc, \uc7a5\uae30\uc801\uc73c\ub85c\ub294 \ud68c\uc0ac\uc758 \ud601\uc2e0\uacfc \uc131\uc7a5\uc5d0 \ubd80\uc815\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc778\ub825 \uac10\ucd95\uc740 \uc9c1\uc6d0\ub4e4\uc758 \uc0ac\uae30 \uc800\ud558\uc640 \uae30\uc5c5 \ubb38\ud654\uc758 \uc57d\ud654\ub97c \ucd08\ub798\ud560 \uc218 \uc788\uc73c\uba70, \uc774\ub294 \uacb0\uad6d \uace0\uac1d \uc11c\ube44\uc2a4\uc640 \uc81c\ud488 \ud488\uc9c8\uc5d0 \uc545\uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uacfc\uac70\uc5d0\ub3c4 \ube44\uc2b7\ud55c \uc0c1\ud669\uc5d0\uc11c \uc778\ub825 \uac10\ucd95\uc774 \uae30\uc5c5\uc758 \uc131\uacfc\uc5d0 \ubd80\uc815\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce5c \uc0ac\ub840\uac00 \ub9ce\uc558\uc2b5\ub2c8\ub2e4.\n\n### 3. \uac70\uc2dc\uacbd\uc81c\uc801 \uc704\ud611\n\ud604\uc7ac\uc758 \uac70\uc2dc\uacbd\uc81c\uc801 \ud658\uacbd\uc740 Microsoft\uc5d0\uac8c\ub3c4 \uc704\ud611\uc774 \ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ubbf8\uad6d \ub2ec\ub7ec\uc758 \ud558\ub77d\uacfc \uae08\ub9ac \uc778\ud558 \uac00\ub2a5\uc131\uc740 \ub2e8\uae30\uc801\uc73c\ub85c \uae0d\uc815\uc801\uc73c\ub85c \uc791\uc6a9\ud560 \uc218 \uc788\uc9c0\ub9cc, \uc9c0\uc815\ud559\uc801 \uae34\uc7a5\uacfc \ubbf8\uc911 \ubb34\uc5ed \uad00\uacc4\uc758 \ubcf5\uc7a1\uc131\uc740 \uae30\uc5c5\uc758 \uae00\ub85c\ubc8c \uc6b4\uc601\uc5d0 \ubd80\uc815\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud2b9\ud788, \uc911\ub3d9\uc758 \uae34\uc7a5 \uc0c1\ud669\uc740 \uae00\ub85c\ubc8c \uc2dc\uc7a5\uc5d0 \ubd88\ud655\uc2e4\uc131\uc744 \ub354\ud558\uace0 \uc788\uc73c\uba70, \uc774\ub294 Microsoft\uc758 \uc218\uc775\uc131\uc5d0 \uc545\uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n### 4. \uae0d\uc815\uc801\uc778 \uc2dc\uc7a5 \uc9c0\ud45c\uc758 \ud55c\uacc4\n\ubc30\ub2f9\uae08 \ubc1c\ud45c\uc640 \uac19\uc740 \uae0d\uc815\uc801\uc778 \uc2e0\ud638\ub294 \uc788\uc9c0\ub9cc, \uc774\ub294 \ub2e8\uae30\uc801\uc778 \ud22c\uc790\uc790 \uc720\uce58\ub97c \uc704\ud55c \uc804\ub7b5\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ubc30\ub2f9\uae08\uc774 \uc99d\uac00\ud55c\ub2e4\uace0 \ud574\uc11c \uae30\uc5c5\uc758 \uc7a5\uae30\uc801\uc778 \uc131\uc7a5 \uac00\ub2a5\uc131\uc774 \ubcf4\uc7a5\ub418\ub294 \uac83\uc740 \uc544\ub2d9\ub2c8\ub2e4. \ub610\ud55c, Citi\uc758 \uc8fc\uac00 \uc608\uce21\uc740 \uc9c0\ub098\uce58\uac8c \ub099\uad00\uc801\uc77c \uc218 \uc788\uc73c\uba70, \uacfc\uac70\uc5d0\ub3c4 \ube44\uc2b7\ud55c \uc608\uce21\uc774 \uc2e4\ud328\ud55c \uc0ac\ub840\uac00 \ub9ce\uc558\uc2b5\ub2c8\ub2e4. \ud22c\uc790\uc790\ub4e4\uc740 \uc774\ub7ec\ud55c \uacfc\ub3c4\ud55c \ub099\uad00\ub860\uc5d0 \ud718\ub458\ub9ac\uc9c0 \ub9d0\uace0, \ubcf4\ub2e4 \ud604\uc2e4\uc801\uc778 \uc2dc\uac01\uc5d0\uc11c \uae30\uc5c5\uc758 \uc131\uc7a5\uc744 \ud3c9\uac00\ud574\uc57c \ud569\ub2c8\ub2e4.\n\n### 5. \ubc18\ub860\uc5d0 \ub300\ud55c \ubc18\ubc15\nBull Analyst\uac00 \uc8fc\uc7a5\ud55c \uc778\ub825 \uac10\ucd95\uc774 \uc7a5\uae30\uc801\uc778 \ud6a8\uc728\uc131\uc744 \uc704\ud55c \uc804\ub7b5\uc774\ub77c\ub294 \uc810\uc5d0 \ub300\ud574, \uacfc\uac70\uc758 \uacbd\ud5d8\uc744 \ud1b5\ud574 \uc6b0\ub9ac\ub294 \uc774\ub7ec\ud55c \uc804\ub7b5\uc774 \ud56d\uc0c1 \uc131\uacf5\uc801\uc774\uc9c0 \uc54a\ub2e4\ub294 \uac83\uc744 \ubc30\uc6e0\uc2b5\ub2c8\ub2e4. \uc778\ub825 \uac10\ucd95\uc774 \ub2e8\uae30\uc801\uc778 \ube44\uc6a9 \uc808\uac10\uc5d0\ub294 \ub3c4\uc6c0\uc774 \ub420 \uc218 \uc788\uc9c0\ub9cc, \uc7a5\uae30\uc801\uc73c\ub85c\ub294 \uae30\uc5c5\uc758 \ud601\uc2e0\uacfc \uacbd\uc7c1\ub825\uc744 \uc57d\ud654\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub610\ud55c, AI\uc640 \ud074\ub77c\uc6b0\ub4dc \ubd84\uc57c\uc5d0\uc11c\uc758 \uac15\ub825\ud55c \uc131\uc7a5 \uc804\ub9dd\uc774 \ub2e8\uae30\uc801\uc778 \ubd80\uc815\uc801 \uc694\uc18c\ub97c \uc0c1\uc1c4\ud560 \ub9cc\ud07c \ucda9\ubd84\ud788 \uae0d\uc815\uc801\uc774\ub77c\ub294 \uc8fc\uc7a5\uc740 \uc9c0\ub098\uce58\uac8c \ub099\uad00\uc801\uc785\ub2c8\ub2e4. \uc2dc\uc7a5\uc758 \ubcc0\ub3d9\uc131\uacfc \uacbd\uc7c1\uc758 \uc2ec\ud654\ub294 \uc5b8\uc81c\ub4e0\uc9c0 \uae30\uc5c5\uc758 \uc131\uacfc\uc5d0 \ubd80\uc815\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n\uacb0\ub860\uc801\uc73c\ub85c, Microsoft\ub294 \ud604\uc7ac \uc5ec\ub7ec \uac00\uc9c0 \uc704\ud5d8 \uc694\uc18c\uc640 \ub3c4\uc804 \uacfc\uc81c\uc5d0 \uc9c1\uba74\ud574 \uc788\uc73c\uba70, \uc774\ub7ec\ud55c \uc694\uc18c\ub4e4\uc740 \uc8fc\uc2dd\uc758 \uc7a5\uae30\uc801\uc778 \uc131\uacfc\uc5d0 \ubd80\uc815\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub530\ub77c\uc11c MSFT \uc8fc\uc2dd\uc5d0 \ub300\ud55c \ud22c\uc790\ub294 \uc2e0\uc911\ud558\uac8c \uace0\ub824\ud574\uc57c \ud560 \ud544\uc694\uac00 \uc788\uc2b5\ub2c8\ub2e4. \uc5ec\ub7ec\ubd84\uc758 \uc758\uacac\uc740 \uc5b4\ub5a0\uc2e0\uac00\uc694?", + "current_response": "\ud1a0\ub860\uc744 \uc815\ub9ac\ud574 \ubcf4\uba74, \uac15\uc138 \uce21\uc740 \ub9c8\uc774\ud06c\ub85c\uc18c\ud504\ud2b8\uc758 AI\u00b7\ud074\ub77c\uc6b0\ub4dc \ubd80\ubb38\uc5d0\uc11c\uc758 \ube60\ub978 \uc131\uc7a5\uacfc OpenAI \ud611\ub825\uc73c\ub85c \uc5bb\ub294 \uc218\uc775, Azure \uc810\uc720\uc728, Activision Blizzard \uc778\uc218\uc5d0 \ub530\ub978 \ud3ec\ud2b8\ud3f4\ub9ac\uc624 \ub2e4\uac01\ud654, \uadf8\ub9ac\uace0 \uae08\ub9ac \uc778\ud558 \uae30\ub300 \uc18d\uc5d0\uc11c\uc758 \ud380\ub354\uba58\ud138 \uac15\ud654\ub97c \uac15\uc870\ud588\uc2b5\ub2c8\ub2e4. \ubc18\uba74 \uc57d\uc138 \uce21\uc740 \ud074\ub77c\uc6b0\ub4dc\u00b7AI \uc2dc\uc7a5\uc758 \uacbd\uc7c1 \uc2ec\ud654(AWS\u00b7\uad6c\uae00), \ucd5c\uadfc 6,000\uba85 \uc774\uc0c1 \uc778\ub825 \uac10\ucd95\uc774 \ud601\uc2e0\ub825\u00b7\uae30\uc5c5 \ubb38\ud654\uc5d0 \ubbf8\uce60 \ubd80\uc815\uc801 \uc601\ud5a5, \uc9c0\uc815\ud559\uc801\u00b7\uac70\uc2dc\uacbd\uc81c\uc801 \ub9ac\uc2a4\ud06c(\ubbf8\uc911 \uac08\ub4f1\u00b7\uc911\ub3d9 \ubd88\uc548), \uadf8\ub9ac\uace0 \uc9c0\ub098\uce58\uac8c \ub099\uad00\uc801\uc778 \uc8fc\uac00 \uc608\uce21(Citi \ubcf4\uace0\uc11c)\uc744 \uc9c0\uc801\ud588\uc2b5\ub2c8\ub2e4.\n\n\uc81c\uac00 \ud310\ub2e8\ud558\uae30\uc5d0 \ub9c8\uc774\ud06c\ub85c\uc18c\ud504\ud2b8\ub294 \ub2e8\uae30\uc801 \ube44\uc6a9 \uc808\uac10 \ucc28\uc6d0\uc744 \ub118\uc5b4\uc11c\ub294 \uc7a5\uae30\uc801 \uc131\uc7a5 \uc2a4\ud1a0\ub9ac\ub97c \uac16\ucd94\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc778\ub825 \uac10\ucd95\uc740 \uc804\uccb4 \uc9c1\uc6d0\uc758 3% \uc815\ub3c4\ub85c, \ube44\uc6a9 \ud6a8\uc728\uc744 \uc81c\uace0\ud558\uace0 \ud575\uc2ec \ubd84\uc57c\uc5d0 \uc7ac\ud22c\uc790\ud558\uae30 \uc704\ud55c \uc804\ub7b5\uc77c \ubfd0\uc774\uba70, \uc5ec\uc804\ud788 AI\u00b7\ud074\ub77c\uc6b0\ub4dc \uc2dc\uc7a5\uc5d0\uc11c \uacbd\uc7c1 \uc6b0\uc704\ub97c \uc810\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc9c0\uc815\ud559\uc801 \ub9ac\uc2a4\ud06c\uac00 \ubd88\uac00\ud53c\ud558\ub098 \uae00\ub85c\ubc8c \ubd84\uc0b0 \uc778\ud504\ub77c\uc640 \ud604\uc9c0\ud654 \uc804\ub7b5\uc73c\ub85c \ub9ac\uc2a4\ud06c\ub97c \uad00\ub9ac\ud560 \uc218 \uc788\uace0, \uae08\ub9ac \uc778\ud558 \uac00\ub2a5\uc131\uc740 \uae30\uc5c5 \uc774\uc775\uc744 \ucd94\uac00\ub85c \ub4b7\ubc1b\uce68\ud560 \uc5ec\uc9c0\uac00 \ud07d\ub2c8\ub2e4. \ub530\ub77c\uc11c \ub9e4\uc218(Buy)\ub97c \ucd94\ucc9c\ud569\ub2c8\ub2e4.\n\n\ud22c\uc790 \uc2e4\ud589 \uacc4\ud68d\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4. \n1. \ucd94\ucc9c: \ub9e4\uc218(Buy) \n2. \uc774\uc720: \n - AI\u00b7\ud074\ub77c\uc6b0\ub4dc \ubd80\ubb38\uc5d0\uc11c\uc758 \uc9c0\uc18d\uc801\uc778 \ub9e4\ucd9c \uc131\uc7a5\uacfc \ub192\uc740 \uc2dc\uc7a5 \uc810\uc720\uc728 \n - OpenAI \ud611\ub825\uc73c\ub85c \uc778\ud55c \uc2e0\uaddc \uc218\uc775 \ubaa8\ub378 \uad6c\ucd95 \ubc0f \uc7a5\uae30 \uc131\uc7a5\uc131 \ud655\ubcf4 \n - Activision Blizzard \uc778\uc218\ub97c \ud1b5\ud55c \ud3ec\ud2b8\ud3f4\ub9ac\uc624 \ub2e4\uac01\ud654 \ubc0f \ucd94\uac00 \ub9e4\ucd9c\uc6d0 \ucc3d\ucd9c \n - \uac70\uc2dc \ud658\uacbd \uac1c\uc120(\uae08\ub9ac \uc778\ud558 \uae30\ub300)\uc73c\ub85c \uae30\uc5c5 \uc774\uc775\ub960 \uac15\ud654 \n3. \uad6c\uccb4\uc801 \uc2e4\ud589 \ubc29\uc548: \n \uac00. \ubd84\ud560 \ub9e4\uc218 \uc804\ub7b5 \n - \ud604 \uc8fc\uac00 \ub300\ube44 3% \ud558\ub77d \uc2dc 50% \ube44\uc911 \ub9e4\uc218, \ucd94\uac00 5% \ud558\ub77d \uc2dc \ub098\uba38\uc9c0 50% \ub9e4\uc218\ub85c \uc9c4\uc785 \n - \ud3c9\uade0 \uc9c4\uc785 \ub2e8\uac00\ub97c \ub0ae\ucdb0 \uc2dc\uc7a5 \ubcc0\ub3d9\uc131\uc5d0 \ub300\uc751 \n \ub098. \ud3ec\uc9c0\uc158 \ud06c\uae30 \ubc0f \ub9ac\uc2a4\ud06c \uad00\ub9ac \n - \uc804\uccb4 \ud3ec\ud2b8\ud3f4\ub9ac\uc624\uc758 8~10% \ube44\uc911\uc73c\ub85c \uc124\uc815 \n - \uc190\uc808\uac00\ub294 \uc9c4\uc785\uac00 \ub300\ube44 10% \ud558\ub77d \uc2dc \uc790\ub3d9 \uccad\uc0b0 \n \ub2e4. \ubaa8\ub2c8\ud130\ub9c1 \ud3ec\uc778\ud2b8 \n - Azure \ub9e4\ucd9c \uc131\uc7a5\ub960\uacfc \ud074\ub77c\uc6b0\ub4dc \ub9c8\uc9c4 \uc9c0\ud45c \n - OpenAI \uad00\ub828 \ub9e4\ucd9c \ube44\uc911 \ubc0f \uc2e0\uaddc AI \uc194\ub8e8\uc158 \uc0c1\uc6a9\ud654 \ud604\ud669 \n - \uacbd\uc7c1\uc0ac\uc758 \uac00\uaca9 \uc815\ucc45\u00b7\uae30\uc220 \ub85c\ub4dc\ub9f5 \ubcc0\ud654 \n - \uae00\ub85c\ubc8c \uc9c0\uc815\ud559 \ub9ac\uc2a4\ud06c(\ubbf8\uc911\u00b7\uc911\ub3d9) \ubc0f \uae08\ub9ac \uacb0\uc815 \ub3d9\ud5a5 \n \ub77c. \ucd94\uac00 \ub300\uc751 \n - \ub2e8\uae30 \uc870\uc815\uc774 \uc2ec\ud560 \uacbd\uc6b0 \ucf5c\uc635\uc158 \uc77c\ubd80 \ub9e4\uc785\uc73c\ub85c \ub808\ubc84\ub9ac\uc9c0 \ud655\ub300 \uac80\ud1a0 \n - \ub9e4 \ubd84\uae30 \uc2e4\uc801 \ubc1c\ud45c \ud6c4 \ub9ac\ubc38\ub7f0\uc2f1\ud558\uc5ec \ubaa9\ud45c \uc218\uc775\ub960(1\ub144 20~25%) \ub2ec\uc131 \uc5ec\ubd80 \uc810\uac80 \n\n\uc774\uc804 \uacb0\uc815\uc5d0\uc11c \uc9c0\ub098\uce58\uac8c \ubcf4\uc218\uc801\uc73c\ub85c \uc811\uadfc\ud574 \uae30\ud68c\ub97c \ub193\uce5c \uacbd\ud5d8\uc744 \ubc18\uc601\ud574, \uc774\ubc88\uc5d0\ub294 \uc7a5\uae30\uc801 \uc131\uc7a5 \ubaa8\uba58\ud140\uc774 \ud655\uc2e4\ud55c \uc885\ubaa9\uc5d0 \ub300\ud574 \uba85\ud655\ud788 \ub9e4\uc218 \uad00\uc810\uc744 \ucde8\ud558\uace0\uc790 \ud569\ub2c8\ub2e4. \uc2dc\uc7a5 \ubcc0\ub3d9\uc744 \uacc4\ub7c9\uc801\uc73c\ub85c \uad00\ub9ac\ud558\uba74\uc11c\ub3c4 \uc131\uc7a5\uc131\uc758 \ud575\uc2ec \ucd95\uc5d0\uc11c \uc774\ud0c8\ud558\uc9c0 \uc54a\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4.", + "judge_decision": "\ud1a0\ub860\uc744 \uc815\ub9ac\ud574 \ubcf4\uba74, \uac15\uc138 \uce21\uc740 \ub9c8\uc774\ud06c\ub85c\uc18c\ud504\ud2b8\uc758 AI\u00b7\ud074\ub77c\uc6b0\ub4dc \ubd80\ubb38\uc5d0\uc11c\uc758 \ube60\ub978 \uc131\uc7a5\uacfc OpenAI \ud611\ub825\uc73c\ub85c \uc5bb\ub294 \uc218\uc775, Azure \uc810\uc720\uc728, Activision Blizzard \uc778\uc218\uc5d0 \ub530\ub978 \ud3ec\ud2b8\ud3f4\ub9ac\uc624 \ub2e4\uac01\ud654, \uadf8\ub9ac\uace0 \uae08\ub9ac \uc778\ud558 \uae30\ub300 \uc18d\uc5d0\uc11c\uc758 \ud380\ub354\uba58\ud138 \uac15\ud654\ub97c \uac15\uc870\ud588\uc2b5\ub2c8\ub2e4. \ubc18\uba74 \uc57d\uc138 \uce21\uc740 \ud074\ub77c\uc6b0\ub4dc\u00b7AI \uc2dc\uc7a5\uc758 \uacbd\uc7c1 \uc2ec\ud654(AWS\u00b7\uad6c\uae00), \ucd5c\uadfc 6,000\uba85 \uc774\uc0c1 \uc778\ub825 \uac10\ucd95\uc774 \ud601\uc2e0\ub825\u00b7\uae30\uc5c5 \ubb38\ud654\uc5d0 \ubbf8\uce60 \ubd80\uc815\uc801 \uc601\ud5a5, \uc9c0\uc815\ud559\uc801\u00b7\uac70\uc2dc\uacbd\uc81c\uc801 \ub9ac\uc2a4\ud06c(\ubbf8\uc911 \uac08\ub4f1\u00b7\uc911\ub3d9 \ubd88\uc548), \uadf8\ub9ac\uace0 \uc9c0\ub098\uce58\uac8c \ub099\uad00\uc801\uc778 \uc8fc\uac00 \uc608\uce21(Citi \ubcf4\uace0\uc11c)\uc744 \uc9c0\uc801\ud588\uc2b5\ub2c8\ub2e4.\n\n\uc81c\uac00 \ud310\ub2e8\ud558\uae30\uc5d0 \ub9c8\uc774\ud06c\ub85c\uc18c\ud504\ud2b8\ub294 \ub2e8\uae30\uc801 \ube44\uc6a9 \uc808\uac10 \ucc28\uc6d0\uc744 \ub118\uc5b4\uc11c\ub294 \uc7a5\uae30\uc801 \uc131\uc7a5 \uc2a4\ud1a0\ub9ac\ub97c \uac16\ucd94\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc778\ub825 \uac10\ucd95\uc740 \uc804\uccb4 \uc9c1\uc6d0\uc758 3% \uc815\ub3c4\ub85c, \ube44\uc6a9 \ud6a8\uc728\uc744 \uc81c\uace0\ud558\uace0 \ud575\uc2ec \ubd84\uc57c\uc5d0 \uc7ac\ud22c\uc790\ud558\uae30 \uc704\ud55c \uc804\ub7b5\uc77c \ubfd0\uc774\uba70, \uc5ec\uc804\ud788 AI\u00b7\ud074\ub77c\uc6b0\ub4dc \uc2dc\uc7a5\uc5d0\uc11c \uacbd\uc7c1 \uc6b0\uc704\ub97c \uc810\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc9c0\uc815\ud559\uc801 \ub9ac\uc2a4\ud06c\uac00 \ubd88\uac00\ud53c\ud558\ub098 \uae00\ub85c\ubc8c \ubd84\uc0b0 \uc778\ud504\ub77c\uc640 \ud604\uc9c0\ud654 \uc804\ub7b5\uc73c\ub85c \ub9ac\uc2a4\ud06c\ub97c \uad00\ub9ac\ud560 \uc218 \uc788\uace0, \uae08\ub9ac \uc778\ud558 \uac00\ub2a5\uc131\uc740 \uae30\uc5c5 \uc774\uc775\uc744 \ucd94\uac00\ub85c \ub4b7\ubc1b\uce68\ud560 \uc5ec\uc9c0\uac00 \ud07d\ub2c8\ub2e4. \ub530\ub77c\uc11c \ub9e4\uc218(Buy)\ub97c \ucd94\ucc9c\ud569\ub2c8\ub2e4.\n\n\ud22c\uc790 \uc2e4\ud589 \uacc4\ud68d\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4. \n1. \ucd94\ucc9c: \ub9e4\uc218(Buy) \n2. \uc774\uc720: \n - AI\u00b7\ud074\ub77c\uc6b0\ub4dc \ubd80\ubb38\uc5d0\uc11c\uc758 \uc9c0\uc18d\uc801\uc778 \ub9e4\ucd9c \uc131\uc7a5\uacfc \ub192\uc740 \uc2dc\uc7a5 \uc810\uc720\uc728 \n - OpenAI \ud611\ub825\uc73c\ub85c \uc778\ud55c \uc2e0\uaddc \uc218\uc775 \ubaa8\ub378 \uad6c\ucd95 \ubc0f \uc7a5\uae30 \uc131\uc7a5\uc131 \ud655\ubcf4 \n - Activision Blizzard \uc778\uc218\ub97c \ud1b5\ud55c \ud3ec\ud2b8\ud3f4\ub9ac\uc624 \ub2e4\uac01\ud654 \ubc0f \ucd94\uac00 \ub9e4\ucd9c\uc6d0 \ucc3d\ucd9c \n - \uac70\uc2dc \ud658\uacbd \uac1c\uc120(\uae08\ub9ac \uc778\ud558 \uae30\ub300)\uc73c\ub85c \uae30\uc5c5 \uc774\uc775\ub960 \uac15\ud654 \n3. \uad6c\uccb4\uc801 \uc2e4\ud589 \ubc29\uc548: \n \uac00. \ubd84\ud560 \ub9e4\uc218 \uc804\ub7b5 \n - \ud604 \uc8fc\uac00 \ub300\ube44 3% \ud558\ub77d \uc2dc 50% \ube44\uc911 \ub9e4\uc218, \ucd94\uac00 5% \ud558\ub77d \uc2dc \ub098\uba38\uc9c0 50% \ub9e4\uc218\ub85c \uc9c4\uc785 \n - \ud3c9\uade0 \uc9c4\uc785 \ub2e8\uac00\ub97c \ub0ae\ucdb0 \uc2dc\uc7a5 \ubcc0\ub3d9\uc131\uc5d0 \ub300\uc751 \n \ub098. \ud3ec\uc9c0\uc158 \ud06c\uae30 \ubc0f \ub9ac\uc2a4\ud06c \uad00\ub9ac \n - \uc804\uccb4 \ud3ec\ud2b8\ud3f4\ub9ac\uc624\uc758 8~10% \ube44\uc911\uc73c\ub85c \uc124\uc815 \n - \uc190\uc808\uac00\ub294 \uc9c4\uc785\uac00 \ub300\ube44 10% \ud558\ub77d \uc2dc \uc790\ub3d9 \uccad\uc0b0 \n \ub2e4. \ubaa8\ub2c8\ud130\ub9c1 \ud3ec\uc778\ud2b8 \n - Azure \ub9e4\ucd9c \uc131\uc7a5\ub960\uacfc \ud074\ub77c\uc6b0\ub4dc \ub9c8\uc9c4 \uc9c0\ud45c \n - OpenAI \uad00\ub828 \ub9e4\ucd9c \ube44\uc911 \ubc0f \uc2e0\uaddc AI \uc194\ub8e8\uc158 \uc0c1\uc6a9\ud654 \ud604\ud669 \n - \uacbd\uc7c1\uc0ac\uc758 \uac00\uaca9 \uc815\ucc45\u00b7\uae30\uc220 \ub85c\ub4dc\ub9f5 \ubcc0\ud654 \n - \uae00\ub85c\ubc8c \uc9c0\uc815\ud559 \ub9ac\uc2a4\ud06c(\ubbf8\uc911\u00b7\uc911\ub3d9) \ubc0f \uae08\ub9ac \uacb0\uc815 \ub3d9\ud5a5 \n \ub77c. \ucd94\uac00 \ub300\uc751 \n - \ub2e8\uae30 \uc870\uc815\uc774 \uc2ec\ud560 \uacbd\uc6b0 \ucf5c\uc635\uc158 \uc77c\ubd80 \ub9e4\uc785\uc73c\ub85c \ub808\ubc84\ub9ac\uc9c0 \ud655\ub300 \uac80\ud1a0 \n - \ub9e4 \ubd84\uae30 \uc2e4\uc801 \ubc1c\ud45c \ud6c4 \ub9ac\ubc38\ub7f0\uc2f1\ud558\uc5ec \ubaa9\ud45c \uc218\uc775\ub960(1\ub144 20~25%) \ub2ec\uc131 \uc5ec\ubd80 \uc810\uac80 \n\n\uc774\uc804 \uacb0\uc815\uc5d0\uc11c \uc9c0\ub098\uce58\uac8c \ubcf4\uc218\uc801\uc73c\ub85c \uc811\uadfc\ud574 \uae30\ud68c\ub97c \ub193\uce5c \uacbd\ud5d8\uc744 \ubc18\uc601\ud574, \uc774\ubc88\uc5d0\ub294 \uc7a5\uae30\uc801 \uc131\uc7a5 \ubaa8\uba58\ud140\uc774 \ud655\uc2e4\ud55c \uc885\ubaa9\uc5d0 \ub300\ud574 \uba85\ud655\ud788 \ub9e4\uc218 \uad00\uc810\uc744 \ucde8\ud558\uace0\uc790 \ud569\ub2c8\ub2e4. \uc2dc\uc7a5 \ubcc0\ub3d9\uc744 \uacc4\ub7c9\uc801\uc73c\ub85c \uad00\ub9ac\ud558\uba74\uc11c\ub3c4 \uc131\uc7a5\uc131\uc758 \ud575\uc2ec \ucd95\uc5d0\uc11c \uc774\ud0c8\ud558\uc9c0 \uc54a\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4." + }, + "trader_investment_decision": "\ub9c8\uc774\ud06c\ub85c\uc18c\ud504\ud2b8(MSFT)\uc5d0 \ub300\ud55c \uc885\ud569\uc801\uc778 \ubd84\uc11d\uc744 \ubc14\ud0d5\uc73c\ub85c, \ud604\uc7ac\uc758 \ud22c\uc790 \uacc4\ud68d\uc740 \ub9e4\uc6b0 \uae0d\uc815\uc801\uc785\ub2c8\ub2e4. AI \ubc0f \ud074\ub77c\uc6b0\ub4dc \ubd80\ubb38\uc5d0\uc11c\uc758 \uc9c0\uc18d\uc801\uc778 \uc131\uc7a5, OpenAI\uc640\uc758 \ud611\ub825, Activision Blizzard \uc778\uc218\ub85c \uc778\ud55c \ud3ec\ud2b8\ud3f4\ub9ac\uc624 \ub2e4\uac01\ud654 \ub4f1\uc740 \ubaa8\ub450 \uc7a5\uae30\uc801\uc778 \uc131\uc7a5 \uac00\ub2a5\uc131\uc744 \ub4b7\ubc1b\uce68\ud558\ub294 \uc694\uc18c\ub4e4\uc785\ub2c8\ub2e4. \ub610\ud55c, \uae08\ub9ac \uc778\ud558 \uae30\ub300\ub294 \uae30\uc5c5 \uc774\uc775\ub960\uc744 \ub354\uc6b1 \uac15\ud654\ud560 \uc218 \uc788\ub294 \uae30\ud68c\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4.\n\n\uacfc\uac70\uc758 \uacbd\ud5d8\uc744 \ud1b5\ud574, \uc9c0\ub098\uce58\uac8c \ubcf4\uc218\uc801\uc778 \uc811\uadfc\uc774 \uae30\ud68c\ub97c \ub193\uce58\ub294 \uacb0\uacfc\ub97c \ucd08\ub798\ud560 \uc218 \uc788\ub2e4\ub294 \uc810\uc744 \ubc30\uc6e0\uc2b5\ub2c8\ub2e4. \uc774\ubc88\uc5d0\ub294 \uc7a5\uae30\uc801\uc778 \uc131\uc7a5 \ubaa8\uba58\ud140\uc744 \uace0\ub824\ud558\uc5ec \ubcf4\ub2e4 \uc801\uadf9\uc801\uc778 \ub9e4\uc218 \uc804\ub7b5\uc744 \ucde8\ud558\ub294 \uac83\uc774 \uc911\uc694\ud569\ub2c8\ub2e4. \n\n\ub530\ub77c\uc11c, \ub2e4\uc74c\uacfc \uac19\uc740 \uacb0\uc815\uc744 \ub0b4\ub9ac\uaca0\uc2b5\ub2c8\ub2e4:\n\n1. **\ucd94\ucc9c**: \ub9e4\uc218(Buy)\n2. **\uc774\uc720**:\n - AI \ubc0f \ud074\ub77c\uc6b0\ub4dc \ubd80\ubb38\uc5d0\uc11c\uc758 \uc9c0\uc18d\uc801\uc778 \ub9e4\ucd9c \uc131\uc7a5\n - OpenAI\uc640\uc758 \ud611\ub825\uc73c\ub85c \uc778\ud55c \uc2e0\uaddc \uc218\uc775 \ubaa8\ub378 \uad6c\ucd95\n - Activision Blizzard \uc778\uc218\ub97c \ud1b5\ud55c \ud3ec\ud2b8\ud3f4\ub9ac\uc624 \ub2e4\uac01\ud654\n - \uae08\ub9ac \uc778\ud558 \uae30\ub300\uc5d0 \ub530\ub978 \uae30\uc5c5 \uc774\uc775\ub960 \uac15\ud654\n\n\uc774\ub7ec\ud55c \uc694\uc18c\ub4e4\uc744 \uc885\ud569\uc801\uc73c\ub85c \uace0\ub824\ud560 \ub54c, \ub9c8\uc774\ud06c\ub85c\uc18c\ud504\ud2b8\ub294 \ud604\uc7ac \ub9e4\uc218\ud558\uae30\uc5d0 \uc801\ud569\ud55c \uc885\ubaa9\uc785\ub2c8\ub2e4. \n\nFINAL TRANSACTION PROPOSAL: **BUY**", + "risk_debate_state": { + "risky_history": "\nRisky Analyst: \ubcf4\uc218\uc801\uc778 \ubd84\uc11d\uac00\uc640 \uc911\ub9bd\uc801\uc778 \ubd84\uc11d\uac00\uc758 \uc8fc\uc7a5\uc744 \ubc18\ubc15\ud558\uba70, \ub9c8\uc774\ud06c\ub85c\uc18c\ud504\ud2b8(MSFT)\uc5d0 \ub300\ud55c \ub9e4\uc218 \uacb0\uc815\uc744 \uc9c0\uc9c0\ud558\ub294 \uac15\ub825\ud55c \ub17c\ub9ac\ub97c \uc81c\uc2dc\ud558\uaca0\uc2b5\ub2c8\ub2e4.\n\n\uccab\uc9f8, \ubcf4\uc218\uc801\uc778 \ubd84\uc11d\uac00\uac00 \uc5b8\uae09\ud55c \uacbd\uc81c\uc801 \ubd88\ud655\uc2e4\uc131\uacfc \uc9c0\uc815\ud559\uc801 \uae34\uc7a5\uc5d0 \ub300\ud55c \uc6b0\ub824\ub294 \uc774\ud574\ud558\uc9c0\ub9cc, \uc774\ub7ec\ud55c \uc694\uc18c\ub4e4\uc774 \ubc18\ub4dc\uc2dc \ub9c8\uc774\ud06c\ub85c\uc18c\ud504\ud2b8\uc758 \uc131\uc7a5 \uac00\ub2a5\uc131\uc744 \uc81c\ud55c\ud558\ub294 \uac83\uc740 \uc544\ub2d9\ub2c8\ub2e4. \uc624\ud788\ub824, \ubbf8\uad6d \ub2ec\ub7ec\uc758 \ud558\ub77d\uacfc \uae08\ub9ac \uc778\ud558 \uae30\ub300\ub294 \uae30\uc5c5\uc758 \uc774\uc775\ub960\uc744 \ub192\uc774\uace0, \uc774\ub294 MSFT\uc758 \uc8fc\uac00 \uc0c1\uc2b9\uc5d0 \uae0d\uc815\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uac83\uc785\ub2c8\ub2e4. \ucd5c\uadfc\uc758 \uc778\ud50c\ub808\uc774\uc158 \ub370\uc774\ud130\ub294 \uc5f0\uc900\uc774 \uae08\ub9ac\ub97c \uc778\ud558\ud560 \uac00\ub2a5\uc131\uc744 \uc2dc\uc0ac\ud558\uace0 \uc788\uc73c\uba70, \uc774\ub294 \uae30\uc5c5\ub4e4\uc774 \uc790\uae08\uc744 \ub354 \uc800\ub834\ud558\uac8c \uc870\ub2ec\ud560 \uc218 \uc788\uac8c \ud574\uc90d\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ud658\uacbd\uc740 \ub9c8\uc774\ud06c\ub85c\uc18c\ud504\ud2b8\uc640 \uac19\uc740 \ub300\ud615 \uae30\uc220 \uae30\uc5c5\uc5d0\uac8c \uc720\ub9ac\ud558\uac8c \uc791\uc6a9\ud560 \uac83\uc785\ub2c8\ub2e4.\n\n\ub458\uc9f8, \uc911\ub9bd\uc801\uc778 \ubd84\uc11d\uac00\uac00 \uc5b8\uae09\ud55c MSFT\uc758 \ucd5c\uadfc \uc778\ub825 \uac10\ucd95\uc740 \ub2e8\uae30\uc801\uc778 \ubd80\uc815\uc801 \uc694\uc18c\ub85c \ubcf4\uc77c \uc218 \uc788\uc9c0\ub9cc, \uc774\ub294 \uc7a5\uae30\uc801\uc778 \ud6a8\uc728\uc131\uc744 \uc704\ud55c \uc804\ub7b5\uc801 \uacb0\uc815\uc785\ub2c8\ub2e4. \ub9c8\uc774\ud06c\ub85c\uc18c\ud504\ud2b8\ub294 AI\uc640 \ud074\ub77c\uc6b0\ub4dc \uc11c\ube44\uc2a4\uc5d0 \ub300\ud55c \ub300\uaddc\ubaa8 \ud22c\uc790\ub97c \ud1b5\ud574 \ubbf8\ub798 \uc131\uc7a5 \uac00\ub2a5\uc131\uc744 \uadf9\ub300\ud654\ud558\uace0 \uc788\uc73c\uba70, \uc774\ub7ec\ud55c \ud22c\uc790\ub294 \uacb0\uad6d \uae30\uc5c5\uc758 \uc218\uc775\uc131\uc744 \ub192\uc774\ub294 \ub370 \uae30\uc5ec\ud560 \uac83\uc785\ub2c8\ub2e4. \uc2e4\uc81c\ub85c OpenAI\uc640\uc758 \ud611\ub825\uc73c\ub85c \uc778\ud574 AI \ubd84\uc57c\uc5d0\uc11c\uc758 \uc218\uc775 \ubaa8\ub378\uc774 \uae09\uaca9\ud788 \uc99d\uac00\ud558\uace0 \uc788\uc73c\uba70, \uc774\ub294 MSFT\uc758 \ub9e4\ucd9c \uc131\uc7a5\uc5d0 \uc9c1\uc811\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uac83\uc785\ub2c8\ub2e4.\n\n\uc14b\uc9f8, Activision Blizzard \uc778\uc218\ub294 \ub9c8\uc774\ud06c\ub85c\uc18c\ud504\ud2b8\uc758 \ud3ec\ud2b8\ud3f4\ub9ac\uc624\ub97c \ub2e4\uac01\ud654\ud558\uace0 \uac8c\uc784 \uc0b0\uc5c5\uc5d0\uc11c\uc758 \uc785\uc9c0\ub97c \uac15\ud654\ud558\ub294 \uc911\uc694\ud55c \uc804\ub7b5\uc785\ub2c8\ub2e4. \uac8c\uc784 \uc0b0\uc5c5\uc740 \uc9c0\uc18d\uc801\uc73c\ub85c \uc131\uc7a5\ud558\uace0 \uc788\uc73c\uba70, \uc774 \uc778\uc218\ub294 MSFT\uac00 \uc774 \uc2dc\uc7a5\uc5d0\uc11c \uacbd\uc7c1\ub825\uc744 \uac16\ucd94\ub294 \ub370 \ud070 \ub3c4\uc6c0\uc774 \ub420 \uac83\uc785\ub2c8\ub2e4. \uc774\ub294 \ub2e8\uc21c\ud788 \uac8c\uc784\uc744 \ub118\uc5b4\uc11c, \ud074\ub77c\uc6b0\ub4dc\uc640 AI \uae30\uc220\uc744 \uacb0\ud569\ud55c \uc0c8\ub85c\uc6b4 \ube44\uc988\ub2c8\uc2a4 \ubaa8\ub378\uc744 \ucc3d\ucd9c\ud560 \uc218 \uc788\ub294 \uae30\ud68c\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4.\n\n\ub9c8\uc9c0\ub9c9\uc73c\ub85c, \uc560\ub110\ub9ac\uc2a4\ud2b8\ub4e4\uc774 \uc81c\uc2dc\ud55c \uae0d\uc815\uc801\uc778 \uac00\uaca9 \ubaa9\ud45c\ub294 MSFT\uc758 \uc131\uc7a5 \uac00\ub2a5\uc131\uc744 \uc798 \ubc18\uc601\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. Citi\uc758 \uac00\uaca9 \ubaa9\ud45c\uc778 $605\ub294 \ud604\uc7ac \uc8fc\uac00\uc5d0\uc11c \uc57d 26% \uc0c1\uc2b9\ud560 \uc5ec\uc9c0\ub97c \ubcf4\uc5ec\uc8fc\uba70, \uc774\ub294 \ud22c\uc790\uc790\ub4e4\uc5d0\uac8c \ub9e4\ub825\uc801\uc778 \uae30\ud68c\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uc131\uc7a5 \uc7a0\uc7ac\ub825\uc744 \uac04\uacfc\ud558\ub294 \uac83\uc740 \uc9c0\ub098\uce58\uac8c \ubcf4\uc218\uc801\uc778 \uc811\uadfc\uc785\ub2c8\ub2e4.\n\n\uacb0\ub860\uc801\uc73c\ub85c, \ub9c8\uc774\ud06c\ub85c\uc18c\ud504\ud2b8\ub294 \ud604\uc7ac\uc758 \uacbd\uc81c\uc801 \ud658\uacbd\uacfc \uae30\uc5c5\uc758 \uc804\ub7b5\uc801 \uacb0\uc815\ub4e4\uc744 \uace0\ub824\ud560 \ub54c, \ub9e4\uc218\ud558\uae30\uc5d0 \ub9e4\uc6b0 \uc801\ud569\ud55c \uc885\ubaa9\uc785\ub2c8\ub2e4. \uace0\uc704\ud5d8 \uace0\uc218\uc775\uc758 \uae30\ud68c\ub97c \uc801\uadf9\uc801\uc73c\ub85c \ucd94\uad6c\ud558\ub294 \uac83\uc774 \uc2dc\uc7a5\uc5d0\uc11c\uc758 \uacbd\uc7c1\ub825\uc744 \uc720\uc9c0\ud558\uace0, \uc7a5\uae30\uc801\uc778 \uc131\uc7a5\uc744 \uc774\ub04c\uc5b4\ub0bc \uc218 \uc788\ub294 \ucd5c\uc120\uc758 \ubc29\ubc95\uc785\ub2c8\ub2e4. \ub530\ub77c\uc11c, \uc6b0\ub9ac\ub294 MSFT\ub97c \ub9e4\uc218\ud558\ub294 \uacb0\uc815\uc744 \uc9c0\uc9c0\ud574\uc57c \ud569\ub2c8\ub2e4.", + "safe_history": "\nSafe Analyst: \ub9ac\uc2a4\ud06c\ub97c \ucd5c\uc18c\ud654\ud558\uace0 \uc548\uc815\uc801\uc778 \uc131\uc7a5\uc744 \ucd94\uad6c\ud558\ub294 \uc785\uc7a5\uc5d0\uc11c, \ub9c8\uc774\ud06c\ub85c\uc18c\ud504\ud2b8(MSFT)\uc5d0 \ub300\ud55c \ub9e4\uc218 \uacb0\uc815\uc5d0 \ub300\ud574 \uba87 \uac00\uc9c0 \uc6b0\ub824\ub97c \uc81c\uae30\ud558\uace0 \uc2f6\uc2b5\ub2c8\ub2e4. \n\n\uccab\uc9f8, \uacbd\uc81c\uc801 \ubd88\ud655\uc2e4\uc131\uacfc \uc9c0\uc815\ud559\uc801 \uae34\uc7a5\uc5d0 \ub300\ud55c \ub9ac\uc2a4\ud06c\ub97c \uac04\uacfc\ud558\ub294 \uac83\uc740 \ub9e4\uc6b0 \uc704\ud5d8\ud569\ub2c8\ub2e4. \ubbf8\uad6d \ub2ec\ub7ec\uc758 \ud558\ub77d\uacfc \uae08\ub9ac \uc778\ud558 \uae30\ub300\uac00 \uae30\uc5c5 \uc774\uc775\ub960\uc5d0 \uae0d\uc815\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\ub2e4\ub294 \uc8fc\uc7a5\uc740 \uc774\ud574\ud558\uc9c0\ub9cc, \uc774\ub7ec\ud55c \uc694\uc18c\ub4e4\uc774 \ubc18\ub4dc\uc2dc \uc9c0\uc18d\uc801\uc778 \uc131\uc7a5\uc73c\ub85c \uc774\uc5b4\uc9c0\uc9c0\ub294 \uc54a\uc2b5\ub2c8\ub2e4. \uc9c0\uc815\ud559\uc801 \uae34\uc7a5\uc774 \uace0\uc870\ub418\ub294 \uc0c1\ud669\uc5d0\uc11c \uae00\ub85c\ubc8c \uc2dc\uc7a5\uc758 \ubcc0\ub3d9\uc131\uc774 \ucee4\uc9c8 \uc218 \uc788\uc73c\uba70, \uc774\ub294 MSFT\uc640 \uac19\uc740 \ub300\uae30\uc5c5\uc5d0\ub3c4 \ubd80\uc815\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, \uc774\ub780\uacfc\uc758 \uac08\ub4f1\uc774 \uc2ec\ud654\ub418\uba74 \uc6d0\uc790\uc7ac \uac00\uaca9\uc774 \uae09\ub4f1\ud558\uace0, \uc774\ub294 \uae30\uc5c5 \uc6b4\uc601 \ube44\uc6a9\uc5d0 \ubd80\ub2f4\uc744 \uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n\ub458\uc9f8, \uc778\ub825 \uac10\ucd95\uc774 \uc7a5\uae30\uc801\uc778 \ud6a8\uc728\uc131\uc744 \uc704\ud55c \uc804\ub7b5\uc801 \uacb0\uc815\uc774\ub77c\ub294 \uc8fc\uc7a5\uc740 \ub2e8\uae30\uc801\uc778 \uad00\uc810\uc5d0\uc11c\ub9cc \uc720\ud6a8\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc9c1\uc6d0 \uc218\ub97c \uc904\uc774\ub294 \uac83\uc740 \ub2e8\uae30\uc801\uc73c\ub85c \ube44\uc6a9 \uc808\uac10 \ud6a8\uacfc\ub97c \uac00\uc838\uc62c \uc218 \uc788\uc9c0\ub9cc, \uc774\ub294 \uae30\uc5c5\uc758 \ud601\uc2e0\uacfc \uc0dd\uc0b0\uc131\uc5d0 \ubd80\uc815\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud2b9\ud788, AI\uc640 \ud074\ub77c\uc6b0\ub4dc \uc11c\ube44\uc2a4\uc5d0 \ub300\ud55c \ub300\uaddc\ubaa8 \ud22c\uc790\uac00 \uc774\ub8e8\uc5b4\uc9c0\uace0 \uc788\ub294 \uc0c1\ud669\uc5d0\uc11c \uc778\ub825 \uac10\ucd95\uc740 \ud544\uc694\ud55c \uc778\uc7ac\ub97c \uc783\uac8c \ub9cc\ub4e4\uace0, \uacb0\uacfc\uc801\uc73c\ub85c \uae30\uc5c5\uc758 \uacbd\uc7c1\ub825\uc744 \uc57d\ud654\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n\uc14b\uc9f8, Activision Blizzard \uc778\uc218\uac00 \ud3ec\ud2b8\ud3f4\ub9ac\uc624 \ub2e4\uac01\ud654\uc5d0 \uae30\uc5ec\ud560 \uac83\uc774\ub77c\ub294 \uc8fc\uc7a5\uc740 \uae0d\uc815\uc801\uc774\uc9c0\ub9cc, \uc774 \uc778\uc218\ub85c \uc778\ud574 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub294 \ud1b5\ud569 \ubb38\uc81c\uc640 \ubb38\ud654\uc801 \ucda9\ub3cc\uc744 \uac04\uacfc\ud574\uc11c\ub294 \uc548 \ub429\ub2c8\ub2e4. \uac8c\uc784 \uc0b0\uc5c5\uc740 \ube60\ub974\uac8c \ubcc0\ud654\ud558\ub294 \uc2dc\uc7a5\uc774\uba70, \uacbd\uc7c1\uc774 \uce58\uc5f4\ud569\ub2c8\ub2e4. \uc778\uc218 \ud6c4 \ud1b5\ud569 \uacfc\uc815\uc5d0\uc11c \ubc1c\uc0dd\ud560 \uc218 \uc788\ub294 \ub9ac\uc2a4\ud06c\ub294 \uae30\uc5c5\uc758 \uc131\uacfc\uc5d0 \ubd80\uc815\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n\ub9c8\uc9c0\ub9c9\uc73c\ub85c, \uc560\ub110\ub9ac\uc2a4\ud2b8\ub4e4\uc758 \uae0d\uc815\uc801\uc778 \uac00\uaca9 \ubaa9\ud45c\ub294 \ud604\uc7ac\uc758 \uc2dc\uc7a5 \uc0c1\ud669\uc744 \ubc18\uc601\ud558\uace0 \uc788\uc9c0\ub9cc, \uc774\ub7ec\ud55c \uc804\ub9dd\uc774 \ud56d\uc0c1 \ud604\uc2e4\uc774 \ub418\ub294 \uac83\uc740 \uc544\ub2d9\ub2c8\ub2e4. \uc2dc\uc7a5\uc740 \uc608\uce21\ud560 \uc218 \uc5c6\ub294 \uc694\uc18c\ub4e4\ub85c \uc778\ud574 \uae09\ubcc0\ud560 \uc218 \uc788\uc73c\uba70, \uc9c0\ub098\uce58\uac8c \ub099\uad00\uc801\uc778 \uc804\ub9dd\uc740 \ud22c\uc790\uc790\ub4e4\uc5d0\uac8c \uc798\ubabb\ub41c \uc2e0\ud638\ub97c \uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \n\n\uacb0\ub860\uc801\uc73c\ub85c, \ub9c8\uc774\ud06c\ub85c\uc18c\ud504\ud2b8\uc5d0 \ub300\ud55c \ub9e4\uc218 \uacb0\uc815\uc740 \ub2e8\uae30\uc801\uc778 \uae30\ud68c\ub97c \ucd94\uad6c\ud558\ub294 \uac83\uc77c \uc218 \uc788\uc9c0\ub9cc, \uc7a5\uae30\uc801\uc778 \uc548\uc815\uc131\uacfc \uc9c0\uc18d \uac00\ub2a5\ud55c \uc131\uc7a5\uc744 \uace0\ub824\ud560 \ub54c, \ubcf4\ub2e4 \ubcf4\uc218\uc801\uc778 \uc811\uadfc\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. \ub9ac\uc2a4\ud06c\ub97c \ucd5c\uc18c\ud654\ud558\uace0 \uc790\uc0b0\uc744 \ubcf4\ud638\ud558\ub294 \uac83\uc774 \uad81\uadf9\uc801\uc73c\ub85c \uae30\uc5c5\uc758 \uc131\uacf5\uc744 \ubcf4\uc7a5\ud558\ub294 \uae38\uc785\ub2c8\ub2e4.", + "neutral_history": "\nNeutral Analyst: \uba3c\uc800, \ub9ac\uc2a4\ud06c\ub97c \uac10\uc218\ud558\ub294 \ubd84\uc11d\uac00\uc758 \uc8fc\uc7a5\uc744 \uc0b4\ud3b4\ubcf4\uba74, \ub9c8\uc774\ud06c\ub85c\uc18c\ud504\ud2b8(MSFT)\uc758 \uc131\uc7a5 \uac00\ub2a5\uc131\uc744 \uac15\uc870\ud558\uba70 \ub9e4\uc218 \uacb0\uc815\uc744 \uc9c0\uc9c0\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \uc774 \ubd84\uc11d\uc740 \uc9c0\ub098\uce58\uac8c \ub099\uad00\uc801\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uacbd\uc81c\uc801 \ubd88\ud655\uc2e4\uc131\uacfc \uc9c0\uc815\ud559\uc801 \uae34\uc7a5 \uac19\uc740 \uc678\ubd80 \uc694\uc778\uc774 \uae30\uc5c5\uc758 \uc131\uacfc\uc5d0 \ubbf8\uce58\ub294 \uc601\ud5a5\uc744 \uac04\uacfc\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, \uc774\ub780\uacfc\uc758 \uac08\ub4f1\uc774 \uc2ec\ud654\ub418\uba74 \uc6d0\uc790\uc7ac \uac00\uaca9\uc774 \uae09\ub4f1\ud560 \uc218 \uc788\uc73c\uba70, \uc774\ub294 \ub9c8\uc774\ud06c\ub85c\uc18c\ud504\ud2b8\uc758 \uc6b4\uc601 \ube44\uc6a9\uc5d0 \ubd80\ub2f4\uc744 \uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub530\ub77c\uc11c, \uc774\ub7ec\ud55c \uc678\ubd80 \uc694\uc778\ub4e4\uc774 \uae30\uc5c5\uc758 \uc131\uc7a5 \uac00\ub2a5\uc131\uc744 \uc81c\ud55c\ud560 \uc218 \uc788\ub2e4\ub294 \uc810\uc744 \uace0\ub824\ud574\uc57c \ud569\ub2c8\ub2e4.\n\n\ub610\ud55c, \uc778\ub825 \uac10\ucd95\uc774 \uc7a5\uae30\uc801\uc778 \ud6a8\uc728\uc131\uc744 \uc704\ud55c \uc804\ub7b5\uc801 \uacb0\uc815\uc774\ub77c\ub294 \uc8fc\uc7a5\uc740 \ub2e8\uae30\uc801\uc778 \uad00\uc810\uc5d0\uc11c\ub9cc \uc720\ud6a8\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc9c1\uc6d0 \uc218\ub97c \uc904\uc774\ub294 \uac83\uc774 \ube44\uc6a9 \uc808\uac10 \ud6a8\uacfc\ub97c \uac00\uc838\uc62c \uc218 \uc788\uc9c0\ub9cc, \uc774\ub294 \uae30\uc5c5\uc758 \ud601\uc2e0\uacfc \uc0dd\uc0b0\uc131\uc5d0 \ubd80\uc815\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud2b9\ud788 AI\uc640 \ud074\ub77c\uc6b0\ub4dc \uc11c\ube44\uc2a4\uc5d0 \ub300\ud55c \ub300\uaddc\ubaa8 \ud22c\uc790\uac00 \uc774\ub8e8\uc5b4\uc9c0\uace0 \uc788\ub294 \uc0c1\ud669\uc5d0\uc11c \uc778\ub825 \uac10\ucd95\uc740 \ud544\uc694\ud55c \uc778\uc7ac\ub97c \uc783\uac8c \ub9cc\ub4e4\uace0, \uacb0\uacfc\uc801\uc73c\ub85c \uae30\uc5c5\uc758 \uacbd\uc7c1\ub825\uc744 \uc57d\ud654\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n\ubc18\uba74, \ubcf4\uc218\uc801\uc778 \ubd84\uc11d\uac00\uc758 \uc8fc\uc7a5\uc740 \ub9ac\uc2a4\ud06c\ub97c \ucd5c\uc18c\ud654\ud558\uace0 \uc548\uc815\uc801\uc778 \uc131\uc7a5\uc744 \ucd94\uad6c\ud558\ub294 \ub370 \ucd08\uc810\uc744 \ub9de\ucd94\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \uc774 \uc811\uadfc\uc740 \uc9c0\ub098\uce58\uac8c \uc18c\uadf9\uc801\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uacbd\uc81c\uc801 \ubd88\ud655\uc2e4\uc131\uacfc \uc9c0\uc815\ud559\uc801 \uae34\uc7a5\uc5d0 \ub300\ud55c \uc6b0\ub824\ub294 \uc774\ud574\ud558\uc9c0\ub9cc, \uc774\ub7ec\ud55c \uc694\uc18c\ub4e4\uc774 \ubc18\ub4dc\uc2dc \uc9c0\uc18d\uc801\uc778 \uc131\uc7a5\uc73c\ub85c \uc774\uc5b4\uc9c0\uc9c0 \uc54a\ub294\ub2e4\ub294 \uc810\uc744 \uac15\uc870\ud574\uc57c \ud569\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, \ubbf8\uad6d \ub2ec\ub7ec\uc758 \ud558\ub77d\uacfc \uae08\ub9ac \uc778\ud558 \uae30\ub300\ub294 \uae30\uc5c5 \uc774\uc775\ub960\uc5d0 \uae0d\uc815\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc73c\uba70, \uc774\ub294 \ub9c8\uc774\ud06c\ub85c\uc18c\ud504\ud2b8\uc640 \uac19\uc740 \ub300\ud615 \uae30\uc220 \uae30\uc5c5\uc5d0\uac8c \uc720\ub9ac\ud558\uac8c \uc791\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n\uacb0\uad6d, \ub450 \ubd84\uc11d\uac00\uc758 \uc8fc\uc7a5\uc744 \uc885\ud569\uc801\uc73c\ub85c \uace0\ub824\ud560 \ub54c, \uc911\ub9bd\uc801\uc778 \uc811\uadfc\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. \ub9c8\uc774\ud06c\ub85c\uc18c\ud504\ud2b8\uc758 AI \ubc0f \ud074\ub77c\uc6b0\ub4dc \ubd80\ubb38\uc5d0\uc11c\uc758 \uc131\uc7a5 \uac00\ub2a5\uc131\uc744 \uc778\uc815\ud558\uba74\uc11c\ub3c4, \uc9c0\uc815\ud559\uc801 \ub9ac\uc2a4\ud06c\uc640 \uacbd\uc81c\uc801 \ubd88\ud655\uc2e4\uc131\uc744 \ucda9\ubd84\ud788 \uace0\ub824\ud574\uc57c \ud569\ub2c8\ub2e4. \ub530\ub77c\uc11c, \ub9e4\uc218 \uacb0\uc815\uc744 \ub0b4\ub9ac\uae30 \uc804\uc5d0 \ud3ec\ud2b8\ud3f4\ub9ac\uc624 \ub2e4\uac01\ud654\uc640 \ub9ac\uc2a4\ud06c \uad00\ub9ac \uc804\ub7b5\uc744 \ud568\uaed8 \uace0\ub824\ud558\ub294 \uac83\uc774 \uc911\uc694\ud569\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, MSFT\uc758 \uc8fc\uc2dd\uc744 \ub9e4\uc218\ud558\ub418, \ub2e4\ub978 \uc548\uc815\uc801\uc778 \uc790\uc0b0\uacfc\uc758 \uade0\ud615\uc744 \ub9de\ucd94\uc5b4 \ub9ac\uc2a4\ud06c\ub97c \ubd84\uc0b0\uc2dc\ud0a4\ub294 \uc804\ub7b5\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. \uc774\ub807\uac8c \ud558\uba74 \uc131\uc7a5 \uc7a0\uc7ac\ub825\uc744 \ucd94\uad6c\ud558\uba74\uc11c\ub3c4 \uadf9\ub2e8\uc801\uc778 \ubcc0\ub3d9\uc131\uc5d0 \ub300\ube44\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.", + "history": "\nRisky Analyst: \ubcf4\uc218\uc801\uc778 \ubd84\uc11d\uac00\uc640 \uc911\ub9bd\uc801\uc778 \ubd84\uc11d\uac00\uc758 \uc8fc\uc7a5\uc744 \ubc18\ubc15\ud558\uba70, \ub9c8\uc774\ud06c\ub85c\uc18c\ud504\ud2b8(MSFT)\uc5d0 \ub300\ud55c \ub9e4\uc218 \uacb0\uc815\uc744 \uc9c0\uc9c0\ud558\ub294 \uac15\ub825\ud55c \ub17c\ub9ac\ub97c \uc81c\uc2dc\ud558\uaca0\uc2b5\ub2c8\ub2e4.\n\n\uccab\uc9f8, \ubcf4\uc218\uc801\uc778 \ubd84\uc11d\uac00\uac00 \uc5b8\uae09\ud55c \uacbd\uc81c\uc801 \ubd88\ud655\uc2e4\uc131\uacfc \uc9c0\uc815\ud559\uc801 \uae34\uc7a5\uc5d0 \ub300\ud55c \uc6b0\ub824\ub294 \uc774\ud574\ud558\uc9c0\ub9cc, \uc774\ub7ec\ud55c \uc694\uc18c\ub4e4\uc774 \ubc18\ub4dc\uc2dc \ub9c8\uc774\ud06c\ub85c\uc18c\ud504\ud2b8\uc758 \uc131\uc7a5 \uac00\ub2a5\uc131\uc744 \uc81c\ud55c\ud558\ub294 \uac83\uc740 \uc544\ub2d9\ub2c8\ub2e4. \uc624\ud788\ub824, \ubbf8\uad6d \ub2ec\ub7ec\uc758 \ud558\ub77d\uacfc \uae08\ub9ac \uc778\ud558 \uae30\ub300\ub294 \uae30\uc5c5\uc758 \uc774\uc775\ub960\uc744 \ub192\uc774\uace0, \uc774\ub294 MSFT\uc758 \uc8fc\uac00 \uc0c1\uc2b9\uc5d0 \uae0d\uc815\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uac83\uc785\ub2c8\ub2e4. \ucd5c\uadfc\uc758 \uc778\ud50c\ub808\uc774\uc158 \ub370\uc774\ud130\ub294 \uc5f0\uc900\uc774 \uae08\ub9ac\ub97c \uc778\ud558\ud560 \uac00\ub2a5\uc131\uc744 \uc2dc\uc0ac\ud558\uace0 \uc788\uc73c\uba70, \uc774\ub294 \uae30\uc5c5\ub4e4\uc774 \uc790\uae08\uc744 \ub354 \uc800\ub834\ud558\uac8c \uc870\ub2ec\ud560 \uc218 \uc788\uac8c \ud574\uc90d\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ud658\uacbd\uc740 \ub9c8\uc774\ud06c\ub85c\uc18c\ud504\ud2b8\uc640 \uac19\uc740 \ub300\ud615 \uae30\uc220 \uae30\uc5c5\uc5d0\uac8c \uc720\ub9ac\ud558\uac8c \uc791\uc6a9\ud560 \uac83\uc785\ub2c8\ub2e4.\n\n\ub458\uc9f8, \uc911\ub9bd\uc801\uc778 \ubd84\uc11d\uac00\uac00 \uc5b8\uae09\ud55c MSFT\uc758 \ucd5c\uadfc \uc778\ub825 \uac10\ucd95\uc740 \ub2e8\uae30\uc801\uc778 \ubd80\uc815\uc801 \uc694\uc18c\ub85c \ubcf4\uc77c \uc218 \uc788\uc9c0\ub9cc, \uc774\ub294 \uc7a5\uae30\uc801\uc778 \ud6a8\uc728\uc131\uc744 \uc704\ud55c \uc804\ub7b5\uc801 \uacb0\uc815\uc785\ub2c8\ub2e4. \ub9c8\uc774\ud06c\ub85c\uc18c\ud504\ud2b8\ub294 AI\uc640 \ud074\ub77c\uc6b0\ub4dc \uc11c\ube44\uc2a4\uc5d0 \ub300\ud55c \ub300\uaddc\ubaa8 \ud22c\uc790\ub97c \ud1b5\ud574 \ubbf8\ub798 \uc131\uc7a5 \uac00\ub2a5\uc131\uc744 \uadf9\ub300\ud654\ud558\uace0 \uc788\uc73c\uba70, \uc774\ub7ec\ud55c \ud22c\uc790\ub294 \uacb0\uad6d \uae30\uc5c5\uc758 \uc218\uc775\uc131\uc744 \ub192\uc774\ub294 \ub370 \uae30\uc5ec\ud560 \uac83\uc785\ub2c8\ub2e4. \uc2e4\uc81c\ub85c OpenAI\uc640\uc758 \ud611\ub825\uc73c\ub85c \uc778\ud574 AI \ubd84\uc57c\uc5d0\uc11c\uc758 \uc218\uc775 \ubaa8\ub378\uc774 \uae09\uaca9\ud788 \uc99d\uac00\ud558\uace0 \uc788\uc73c\uba70, \uc774\ub294 MSFT\uc758 \ub9e4\ucd9c \uc131\uc7a5\uc5d0 \uc9c1\uc811\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uac83\uc785\ub2c8\ub2e4.\n\n\uc14b\uc9f8, Activision Blizzard \uc778\uc218\ub294 \ub9c8\uc774\ud06c\ub85c\uc18c\ud504\ud2b8\uc758 \ud3ec\ud2b8\ud3f4\ub9ac\uc624\ub97c \ub2e4\uac01\ud654\ud558\uace0 \uac8c\uc784 \uc0b0\uc5c5\uc5d0\uc11c\uc758 \uc785\uc9c0\ub97c \uac15\ud654\ud558\ub294 \uc911\uc694\ud55c \uc804\ub7b5\uc785\ub2c8\ub2e4. \uac8c\uc784 \uc0b0\uc5c5\uc740 \uc9c0\uc18d\uc801\uc73c\ub85c \uc131\uc7a5\ud558\uace0 \uc788\uc73c\uba70, \uc774 \uc778\uc218\ub294 MSFT\uac00 \uc774 \uc2dc\uc7a5\uc5d0\uc11c \uacbd\uc7c1\ub825\uc744 \uac16\ucd94\ub294 \ub370 \ud070 \ub3c4\uc6c0\uc774 \ub420 \uac83\uc785\ub2c8\ub2e4. \uc774\ub294 \ub2e8\uc21c\ud788 \uac8c\uc784\uc744 \ub118\uc5b4\uc11c, \ud074\ub77c\uc6b0\ub4dc\uc640 AI \uae30\uc220\uc744 \uacb0\ud569\ud55c \uc0c8\ub85c\uc6b4 \ube44\uc988\ub2c8\uc2a4 \ubaa8\ub378\uc744 \ucc3d\ucd9c\ud560 \uc218 \uc788\ub294 \uae30\ud68c\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4.\n\n\ub9c8\uc9c0\ub9c9\uc73c\ub85c, \uc560\ub110\ub9ac\uc2a4\ud2b8\ub4e4\uc774 \uc81c\uc2dc\ud55c \uae0d\uc815\uc801\uc778 \uac00\uaca9 \ubaa9\ud45c\ub294 MSFT\uc758 \uc131\uc7a5 \uac00\ub2a5\uc131\uc744 \uc798 \ubc18\uc601\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. Citi\uc758 \uac00\uaca9 \ubaa9\ud45c\uc778 $605\ub294 \ud604\uc7ac \uc8fc\uac00\uc5d0\uc11c \uc57d 26% \uc0c1\uc2b9\ud560 \uc5ec\uc9c0\ub97c \ubcf4\uc5ec\uc8fc\uba70, \uc774\ub294 \ud22c\uc790\uc790\ub4e4\uc5d0\uac8c \ub9e4\ub825\uc801\uc778 \uae30\ud68c\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uc131\uc7a5 \uc7a0\uc7ac\ub825\uc744 \uac04\uacfc\ud558\ub294 \uac83\uc740 \uc9c0\ub098\uce58\uac8c \ubcf4\uc218\uc801\uc778 \uc811\uadfc\uc785\ub2c8\ub2e4.\n\n\uacb0\ub860\uc801\uc73c\ub85c, \ub9c8\uc774\ud06c\ub85c\uc18c\ud504\ud2b8\ub294 \ud604\uc7ac\uc758 \uacbd\uc81c\uc801 \ud658\uacbd\uacfc \uae30\uc5c5\uc758 \uc804\ub7b5\uc801 \uacb0\uc815\ub4e4\uc744 \uace0\ub824\ud560 \ub54c, \ub9e4\uc218\ud558\uae30\uc5d0 \ub9e4\uc6b0 \uc801\ud569\ud55c \uc885\ubaa9\uc785\ub2c8\ub2e4. \uace0\uc704\ud5d8 \uace0\uc218\uc775\uc758 \uae30\ud68c\ub97c \uc801\uadf9\uc801\uc73c\ub85c \ucd94\uad6c\ud558\ub294 \uac83\uc774 \uc2dc\uc7a5\uc5d0\uc11c\uc758 \uacbd\uc7c1\ub825\uc744 \uc720\uc9c0\ud558\uace0, \uc7a5\uae30\uc801\uc778 \uc131\uc7a5\uc744 \uc774\ub04c\uc5b4\ub0bc \uc218 \uc788\ub294 \ucd5c\uc120\uc758 \ubc29\ubc95\uc785\ub2c8\ub2e4. \ub530\ub77c\uc11c, \uc6b0\ub9ac\ub294 MSFT\ub97c \ub9e4\uc218\ud558\ub294 \uacb0\uc815\uc744 \uc9c0\uc9c0\ud574\uc57c \ud569\ub2c8\ub2e4.\nSafe Analyst: \ub9ac\uc2a4\ud06c\ub97c \ucd5c\uc18c\ud654\ud558\uace0 \uc548\uc815\uc801\uc778 \uc131\uc7a5\uc744 \ucd94\uad6c\ud558\ub294 \uc785\uc7a5\uc5d0\uc11c, \ub9c8\uc774\ud06c\ub85c\uc18c\ud504\ud2b8(MSFT)\uc5d0 \ub300\ud55c \ub9e4\uc218 \uacb0\uc815\uc5d0 \ub300\ud574 \uba87 \uac00\uc9c0 \uc6b0\ub824\ub97c \uc81c\uae30\ud558\uace0 \uc2f6\uc2b5\ub2c8\ub2e4. \n\n\uccab\uc9f8, \uacbd\uc81c\uc801 \ubd88\ud655\uc2e4\uc131\uacfc \uc9c0\uc815\ud559\uc801 \uae34\uc7a5\uc5d0 \ub300\ud55c \ub9ac\uc2a4\ud06c\ub97c \uac04\uacfc\ud558\ub294 \uac83\uc740 \ub9e4\uc6b0 \uc704\ud5d8\ud569\ub2c8\ub2e4. \ubbf8\uad6d \ub2ec\ub7ec\uc758 \ud558\ub77d\uacfc \uae08\ub9ac \uc778\ud558 \uae30\ub300\uac00 \uae30\uc5c5 \uc774\uc775\ub960\uc5d0 \uae0d\uc815\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\ub2e4\ub294 \uc8fc\uc7a5\uc740 \uc774\ud574\ud558\uc9c0\ub9cc, \uc774\ub7ec\ud55c \uc694\uc18c\ub4e4\uc774 \ubc18\ub4dc\uc2dc \uc9c0\uc18d\uc801\uc778 \uc131\uc7a5\uc73c\ub85c \uc774\uc5b4\uc9c0\uc9c0\ub294 \uc54a\uc2b5\ub2c8\ub2e4. \uc9c0\uc815\ud559\uc801 \uae34\uc7a5\uc774 \uace0\uc870\ub418\ub294 \uc0c1\ud669\uc5d0\uc11c \uae00\ub85c\ubc8c \uc2dc\uc7a5\uc758 \ubcc0\ub3d9\uc131\uc774 \ucee4\uc9c8 \uc218 \uc788\uc73c\uba70, \uc774\ub294 MSFT\uc640 \uac19\uc740 \ub300\uae30\uc5c5\uc5d0\ub3c4 \ubd80\uc815\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, \uc774\ub780\uacfc\uc758 \uac08\ub4f1\uc774 \uc2ec\ud654\ub418\uba74 \uc6d0\uc790\uc7ac \uac00\uaca9\uc774 \uae09\ub4f1\ud558\uace0, \uc774\ub294 \uae30\uc5c5 \uc6b4\uc601 \ube44\uc6a9\uc5d0 \ubd80\ub2f4\uc744 \uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n\ub458\uc9f8, \uc778\ub825 \uac10\ucd95\uc774 \uc7a5\uae30\uc801\uc778 \ud6a8\uc728\uc131\uc744 \uc704\ud55c \uc804\ub7b5\uc801 \uacb0\uc815\uc774\ub77c\ub294 \uc8fc\uc7a5\uc740 \ub2e8\uae30\uc801\uc778 \uad00\uc810\uc5d0\uc11c\ub9cc \uc720\ud6a8\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc9c1\uc6d0 \uc218\ub97c \uc904\uc774\ub294 \uac83\uc740 \ub2e8\uae30\uc801\uc73c\ub85c \ube44\uc6a9 \uc808\uac10 \ud6a8\uacfc\ub97c \uac00\uc838\uc62c \uc218 \uc788\uc9c0\ub9cc, \uc774\ub294 \uae30\uc5c5\uc758 \ud601\uc2e0\uacfc \uc0dd\uc0b0\uc131\uc5d0 \ubd80\uc815\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud2b9\ud788, AI\uc640 \ud074\ub77c\uc6b0\ub4dc \uc11c\ube44\uc2a4\uc5d0 \ub300\ud55c \ub300\uaddc\ubaa8 \ud22c\uc790\uac00 \uc774\ub8e8\uc5b4\uc9c0\uace0 \uc788\ub294 \uc0c1\ud669\uc5d0\uc11c \uc778\ub825 \uac10\ucd95\uc740 \ud544\uc694\ud55c \uc778\uc7ac\ub97c \uc783\uac8c \ub9cc\ub4e4\uace0, \uacb0\uacfc\uc801\uc73c\ub85c \uae30\uc5c5\uc758 \uacbd\uc7c1\ub825\uc744 \uc57d\ud654\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n\uc14b\uc9f8, Activision Blizzard \uc778\uc218\uac00 \ud3ec\ud2b8\ud3f4\ub9ac\uc624 \ub2e4\uac01\ud654\uc5d0 \uae30\uc5ec\ud560 \uac83\uc774\ub77c\ub294 \uc8fc\uc7a5\uc740 \uae0d\uc815\uc801\uc774\uc9c0\ub9cc, \uc774 \uc778\uc218\ub85c \uc778\ud574 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub294 \ud1b5\ud569 \ubb38\uc81c\uc640 \ubb38\ud654\uc801 \ucda9\ub3cc\uc744 \uac04\uacfc\ud574\uc11c\ub294 \uc548 \ub429\ub2c8\ub2e4. \uac8c\uc784 \uc0b0\uc5c5\uc740 \ube60\ub974\uac8c \ubcc0\ud654\ud558\ub294 \uc2dc\uc7a5\uc774\uba70, \uacbd\uc7c1\uc774 \uce58\uc5f4\ud569\ub2c8\ub2e4. \uc778\uc218 \ud6c4 \ud1b5\ud569 \uacfc\uc815\uc5d0\uc11c \ubc1c\uc0dd\ud560 \uc218 \uc788\ub294 \ub9ac\uc2a4\ud06c\ub294 \uae30\uc5c5\uc758 \uc131\uacfc\uc5d0 \ubd80\uc815\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n\ub9c8\uc9c0\ub9c9\uc73c\ub85c, \uc560\ub110\ub9ac\uc2a4\ud2b8\ub4e4\uc758 \uae0d\uc815\uc801\uc778 \uac00\uaca9 \ubaa9\ud45c\ub294 \ud604\uc7ac\uc758 \uc2dc\uc7a5 \uc0c1\ud669\uc744 \ubc18\uc601\ud558\uace0 \uc788\uc9c0\ub9cc, \uc774\ub7ec\ud55c \uc804\ub9dd\uc774 \ud56d\uc0c1 \ud604\uc2e4\uc774 \ub418\ub294 \uac83\uc740 \uc544\ub2d9\ub2c8\ub2e4. \uc2dc\uc7a5\uc740 \uc608\uce21\ud560 \uc218 \uc5c6\ub294 \uc694\uc18c\ub4e4\ub85c \uc778\ud574 \uae09\ubcc0\ud560 \uc218 \uc788\uc73c\uba70, \uc9c0\ub098\uce58\uac8c \ub099\uad00\uc801\uc778 \uc804\ub9dd\uc740 \ud22c\uc790\uc790\ub4e4\uc5d0\uac8c \uc798\ubabb\ub41c \uc2e0\ud638\ub97c \uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \n\n\uacb0\ub860\uc801\uc73c\ub85c, \ub9c8\uc774\ud06c\ub85c\uc18c\ud504\ud2b8\uc5d0 \ub300\ud55c \ub9e4\uc218 \uacb0\uc815\uc740 \ub2e8\uae30\uc801\uc778 \uae30\ud68c\ub97c \ucd94\uad6c\ud558\ub294 \uac83\uc77c \uc218 \uc788\uc9c0\ub9cc, \uc7a5\uae30\uc801\uc778 \uc548\uc815\uc131\uacfc \uc9c0\uc18d \uac00\ub2a5\ud55c \uc131\uc7a5\uc744 \uace0\ub824\ud560 \ub54c, \ubcf4\ub2e4 \ubcf4\uc218\uc801\uc778 \uc811\uadfc\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. \ub9ac\uc2a4\ud06c\ub97c \ucd5c\uc18c\ud654\ud558\uace0 \uc790\uc0b0\uc744 \ubcf4\ud638\ud558\ub294 \uac83\uc774 \uad81\uadf9\uc801\uc73c\ub85c \uae30\uc5c5\uc758 \uc131\uacf5\uc744 \ubcf4\uc7a5\ud558\ub294 \uae38\uc785\ub2c8\ub2e4.\nNeutral Analyst: \uba3c\uc800, \ub9ac\uc2a4\ud06c\ub97c \uac10\uc218\ud558\ub294 \ubd84\uc11d\uac00\uc758 \uc8fc\uc7a5\uc744 \uc0b4\ud3b4\ubcf4\uba74, \ub9c8\uc774\ud06c\ub85c\uc18c\ud504\ud2b8(MSFT)\uc758 \uc131\uc7a5 \uac00\ub2a5\uc131\uc744 \uac15\uc870\ud558\uba70 \ub9e4\uc218 \uacb0\uc815\uc744 \uc9c0\uc9c0\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \uc774 \ubd84\uc11d\uc740 \uc9c0\ub098\uce58\uac8c \ub099\uad00\uc801\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uacbd\uc81c\uc801 \ubd88\ud655\uc2e4\uc131\uacfc \uc9c0\uc815\ud559\uc801 \uae34\uc7a5 \uac19\uc740 \uc678\ubd80 \uc694\uc778\uc774 \uae30\uc5c5\uc758 \uc131\uacfc\uc5d0 \ubbf8\uce58\ub294 \uc601\ud5a5\uc744 \uac04\uacfc\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, \uc774\ub780\uacfc\uc758 \uac08\ub4f1\uc774 \uc2ec\ud654\ub418\uba74 \uc6d0\uc790\uc7ac \uac00\uaca9\uc774 \uae09\ub4f1\ud560 \uc218 \uc788\uc73c\uba70, \uc774\ub294 \ub9c8\uc774\ud06c\ub85c\uc18c\ud504\ud2b8\uc758 \uc6b4\uc601 \ube44\uc6a9\uc5d0 \ubd80\ub2f4\uc744 \uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub530\ub77c\uc11c, \uc774\ub7ec\ud55c \uc678\ubd80 \uc694\uc778\ub4e4\uc774 \uae30\uc5c5\uc758 \uc131\uc7a5 \uac00\ub2a5\uc131\uc744 \uc81c\ud55c\ud560 \uc218 \uc788\ub2e4\ub294 \uc810\uc744 \uace0\ub824\ud574\uc57c \ud569\ub2c8\ub2e4.\n\n\ub610\ud55c, \uc778\ub825 \uac10\ucd95\uc774 \uc7a5\uae30\uc801\uc778 \ud6a8\uc728\uc131\uc744 \uc704\ud55c \uc804\ub7b5\uc801 \uacb0\uc815\uc774\ub77c\ub294 \uc8fc\uc7a5\uc740 \ub2e8\uae30\uc801\uc778 \uad00\uc810\uc5d0\uc11c\ub9cc \uc720\ud6a8\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc9c1\uc6d0 \uc218\ub97c \uc904\uc774\ub294 \uac83\uc774 \ube44\uc6a9 \uc808\uac10 \ud6a8\uacfc\ub97c \uac00\uc838\uc62c \uc218 \uc788\uc9c0\ub9cc, \uc774\ub294 \uae30\uc5c5\uc758 \ud601\uc2e0\uacfc \uc0dd\uc0b0\uc131\uc5d0 \ubd80\uc815\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud2b9\ud788 AI\uc640 \ud074\ub77c\uc6b0\ub4dc \uc11c\ube44\uc2a4\uc5d0 \ub300\ud55c \ub300\uaddc\ubaa8 \ud22c\uc790\uac00 \uc774\ub8e8\uc5b4\uc9c0\uace0 \uc788\ub294 \uc0c1\ud669\uc5d0\uc11c \uc778\ub825 \uac10\ucd95\uc740 \ud544\uc694\ud55c \uc778\uc7ac\ub97c \uc783\uac8c \ub9cc\ub4e4\uace0, \uacb0\uacfc\uc801\uc73c\ub85c \uae30\uc5c5\uc758 \uacbd\uc7c1\ub825\uc744 \uc57d\ud654\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n\ubc18\uba74, \ubcf4\uc218\uc801\uc778 \ubd84\uc11d\uac00\uc758 \uc8fc\uc7a5\uc740 \ub9ac\uc2a4\ud06c\ub97c \ucd5c\uc18c\ud654\ud558\uace0 \uc548\uc815\uc801\uc778 \uc131\uc7a5\uc744 \ucd94\uad6c\ud558\ub294 \ub370 \ucd08\uc810\uc744 \ub9de\ucd94\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \uc774 \uc811\uadfc\uc740 \uc9c0\ub098\uce58\uac8c \uc18c\uadf9\uc801\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uacbd\uc81c\uc801 \ubd88\ud655\uc2e4\uc131\uacfc \uc9c0\uc815\ud559\uc801 \uae34\uc7a5\uc5d0 \ub300\ud55c \uc6b0\ub824\ub294 \uc774\ud574\ud558\uc9c0\ub9cc, \uc774\ub7ec\ud55c \uc694\uc18c\ub4e4\uc774 \ubc18\ub4dc\uc2dc \uc9c0\uc18d\uc801\uc778 \uc131\uc7a5\uc73c\ub85c \uc774\uc5b4\uc9c0\uc9c0 \uc54a\ub294\ub2e4\ub294 \uc810\uc744 \uac15\uc870\ud574\uc57c \ud569\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, \ubbf8\uad6d \ub2ec\ub7ec\uc758 \ud558\ub77d\uacfc \uae08\ub9ac \uc778\ud558 \uae30\ub300\ub294 \uae30\uc5c5 \uc774\uc775\ub960\uc5d0 \uae0d\uc815\uc801\uc778 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc73c\uba70, \uc774\ub294 \ub9c8\uc774\ud06c\ub85c\uc18c\ud504\ud2b8\uc640 \uac19\uc740 \ub300\ud615 \uae30\uc220 \uae30\uc5c5\uc5d0\uac8c \uc720\ub9ac\ud558\uac8c \uc791\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n\uacb0\uad6d, \ub450 \ubd84\uc11d\uac00\uc758 \uc8fc\uc7a5\uc744 \uc885\ud569\uc801\uc73c\ub85c \uace0\ub824\ud560 \ub54c, \uc911\ub9bd\uc801\uc778 \uc811\uadfc\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. \ub9c8\uc774\ud06c\ub85c\uc18c\ud504\ud2b8\uc758 AI \ubc0f \ud074\ub77c\uc6b0\ub4dc \ubd80\ubb38\uc5d0\uc11c\uc758 \uc131\uc7a5 \uac00\ub2a5\uc131\uc744 \uc778\uc815\ud558\uba74\uc11c\ub3c4, \uc9c0\uc815\ud559\uc801 \ub9ac\uc2a4\ud06c\uc640 \uacbd\uc81c\uc801 \ubd88\ud655\uc2e4\uc131\uc744 \ucda9\ubd84\ud788 \uace0\ub824\ud574\uc57c \ud569\ub2c8\ub2e4. \ub530\ub77c\uc11c, \ub9e4\uc218 \uacb0\uc815\uc744 \ub0b4\ub9ac\uae30 \uc804\uc5d0 \ud3ec\ud2b8\ud3f4\ub9ac\uc624 \ub2e4\uac01\ud654\uc640 \ub9ac\uc2a4\ud06c \uad00\ub9ac \uc804\ub7b5\uc744 \ud568\uaed8 \uace0\ub824\ud558\ub294 \uac83\uc774 \uc911\uc694\ud569\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, MSFT\uc758 \uc8fc\uc2dd\uc744 \ub9e4\uc218\ud558\ub418, \ub2e4\ub978 \uc548\uc815\uc801\uc778 \uc790\uc0b0\uacfc\uc758 \uade0\ud615\uc744 \ub9de\ucd94\uc5b4 \ub9ac\uc2a4\ud06c\ub97c \ubd84\uc0b0\uc2dc\ud0a4\ub294 \uc804\ub7b5\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. \uc774\ub807\uac8c \ud558\uba74 \uc131\uc7a5 \uc7a0\uc7ac\ub825\uc744 \ucd94\uad6c\ud558\uba74\uc11c\ub3c4 \uadf9\ub2e8\uc801\uc778 \ubcc0\ub3d9\uc131\uc5d0 \ub300\ube44\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.", + "judge_decision": "1. \uc8fc\uc694 \ub17c\uc810 \uc694\uc57d \n- Risky Analyst (\uac15\uc138) \n \u2022 \u201c\ubbf8\uad6d \ub2ec\ub7ec \ud558\ub77d\uacfc \uae08\ub9ac \uc778\ud558 \uae30\ub300\ub294 MSFT\uc758 \uc774\uc775\ub960\uc744 \ub192\uc5ec \uc8fc\uac00 \uc0c1\uc2b9\uc744 \uacac\uc778\ud560 \uac83\u201d \n \u2022 \uc778\ub825 \uac10\ucd95(\uc804\uccb4\uc758 \uc57d 3%)\uc740 \ube44\uc6a9 \ud6a8\uc728\ud654\ub97c \uc704\ud55c \uc804\ub7b5\uc801 \uacb0\uc815\uc73c\ub85c, AI\u00b7\ud074\ub77c\uc6b0\ub4dc \ud575\uc2ec \uc601\uc5ed\uc5d0 \uc7ac\ud22c\uc790 \n \u2022 OpenAI \ud611\ub825\uacfc Activision Blizzard \uc778\uc218\ub97c \ud1b5\ud55c \uc2e0\uaddc \uc218\uc775 \ubaa8\ub378\u00b7\ud3ec\ud2b8\ud3f4\ub9ac\uc624 \ub2e4\uac01\ud654 \n \u2022 Citi\uc758 \ubaa9\ud45c\uc8fc\uac00 $605\ub294 \ud604\uc7ac \ub300\ube44 \uc57d 26% \uc0c1\uc2b9 \uc5ec\ub825 \uc81c\uc2dc \n\n- Safe Analyst (\ubcf4\uc218) \n \u2022 \uc9c0\uc815\ud559\uc801 \uae34\uc7a5(\ubbf8\u00b7\uc911, \uc911\ub3d9)\uacfc \uc6d0\uc790\uc7ac \uac00\uaca9 \uae09\ub4f1 \ub9ac\uc2a4\ud06c \uacfc\uc18c\ud3c9\uac00 \uacbd\uace0 \n \u2022 \uc778\ub825 \uac10\ucd95\uc774 \uc7a5\uae30 \ud601\uc2e0\uc131\uacfc \uae30\uc5c5 \ubb38\ud654\uc5d0 \ubbf8\uce60 \ubd80\uc815\uc801 \uc601\ud5a5 \uc6b0\ub824 \n \u2022 Activision \uc778\uc218 \ud6c4 \ud1b5\ud569 \ub9ac\uc2a4\ud06c(\ubb38\ud654 \ucda9\ub3cc\u00b7\uc6b4\uc601 \ud6a8\uc728 \uc800\ud558) \uc8fc\uc758 \n \u2022 \ub099\uad00\uc801 \ubaa9\ud45c\uc8fc\uac00\ub294 \uc2e4\uc81c \uc2e4\ud604\uae4c\uc9c0 \ubd88\ud655\uc2e4\uc131\uc774 \ud06c\ub2e4\uace0 \uc9c0\uc801 \n\n- Neutral Analyst (\uc911\ub9bd) \n \u2022 AI\u00b7\ud074\ub77c\uc6b0\ub4dc \uc131\uc7a5 \uc7a0\uc7ac\ub825 \uc778\uc815\ud558\ub098 \uc678\ubd80 \ub9ac\uc2a4\ud06c \ub3d9\uc2dc \uace0\ub824 \ud544\uc694 \n \u2022 \uc9c0\ub098\uce58\uac8c \uacf5\uaca9\uc801\u00b7\ubcf4\uc218\uc801 \uc811\uadfc \ubaa8\ub450 \ubb38\uc81c\ub85c, \u201c\ub9ac\uc2a4\ud06c \uad00\ub9ac\uc640 \uc131\uc7a5 \ucd94\uad6c\uc758 \uade0\ud615\u201d \uac15\uc870 \n \u2022 \ud3ec\ud2b8\ud3f4\ub9ac\uc624 \ub2e4\uac01\ud654\uc640 \ubd84\uc0b0\ud22c\uc790\ub97c \ud1b5\ud55c \ub9ac\uc2a4\ud06c \uc644\ud654 \uc81c\uc548 \n\n2. \uad8c\uace0\uc548 \ubc0f \uadfc\uac70 \n\uacb0\ub860: Buy \n- \uac15\uc138 \uce21\uc758 \u201cAI\u00b7\ud074\ub77c\uc6b0\ub4dc \ubd84\uc57c \ub9e4\ucd9c \uc131\uc7a5\uacfc OpenAI \ud611\ub825\uc73c\ub85c \uc778\ud55c \uc218\uc775 \ubaa8\ub378 \uae09\uc131\uc7a5\u201d \uc8fc\uc7a5\uc740 MSFT\uc758 \uc911\u00b7\uc7a5\uae30 \ud380\ub354\uba58\ud138\uc744 \ub4b7\ubc1b\uce68\ud569\ub2c8\ub2e4. \n- \uc9c0\uc815\ud559\uc801 \ub9ac\uc2a4\ud06c\u00b7\uc778\ub825 \uac10\ucd95 \uc6b0\ub824\ub294 \uc720\ud6a8\ud558\uc9c0\ub9cc, MSFT\ub294 \uae00\ub85c\ubc8c \ubd84\uc0b0 \uc778\ud504\ub77c\uc640 \ud604\uc9c0\ud654 \uc804\ub7b5\uc73c\ub85c \uad00\ub9ac \uac00\ub2a5\ud558\uba70, \uac10\ucd95 \uaddc\ubaa8(3%)\uac00 \uc9c0\ub098\uce58\uac8c \ud06c\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \n- \uae08\ub9ac \uc778\ud558 \uae30\ub300\ub294 \uc2e4\uc81c \uc7ac\ubb34\ube44\uc6a9 \uc808\uac10\uc73c\ub85c \uc774\uc5b4\uc9c8 \uac00\ub2a5\uc131\uc774 \ub192\uc544 \ub300\ud615 \uae30\uc220\uc8fc\uc758 \uc0c1\ub300\uc801 \ub9e4\ub825\ub3c4\ub97c \ub192\uc785\ub2c8\ub2e4. \n- Activision \ud1b5\ud569 \uc9c0\uc5f0 \ub9ac\uc2a4\ud06c\ub97c \uac10\uc548\ud558\ub354\ub77c\ub3c4 \uac8c\uc784\u00b7\ud074\ub77c\uc6b0\ub4dc\u00b7AI\uc758 \uc2dc\ub108\uc9c0 \ucc3d\ucd9c \uc2a4\ud1a0\ub9ac\ub294 \uc5ec\uc804\ud55c \uc131\uc7a5 \ub3d9\ub825\uc785\ub2c8\ub2e4. \n\n3. \uc218\uc815\ub41c \ud22c\uc790 \uc2e4\ud589 \uacc4\ud68d \n\uae30\uc874 \ud50c\ub79c(\ubd84\ud560\ub9e4\uc218\u00b7\ud3ec\uc9c0\uc158 8~10%\u00b7\uc190\uc808 \u201310% \ub4f1)\uc744 \ubc14\ud0d5\uc73c\ub85c, \ub17c\uc7c1\uc810\uc744 \ubc18\uc601\ud574 \ub9ac\uc2a4\ud06c \uad00\ub9ac\ub97c \uac15\ud654\ud569\ub2c8\ub2e4. \n\n\uac00. \ubd84\ud560 \ub9e4\uc218 \uc804\ub7b5 \n 1) \u2460\ud604\uc7ac \uc8fc\uac00 \ub300\ube44 \u20133% \ub3c4\ub2ec \uc2dc \uc804\uccb4 \ubaa9\ud45c \ubb3c\ub7c9\uc758 40% \ub9e4\uc218 \n \u2461\ucd94\uac00 \u20135% \ud558\ub77d \uc2dc \ub098\uba38\uc9c0 60% \ub9e4\uc218 \n 2) Activision \ud1b5\ud569 \uc9c4\ud589 \uc0c1\ud669(\ubd84\uae30\ubcc4 \uc2e4\uc801 \ubc1c\ud45c \uc2dc \ud1b5\ud569 \uc2dc\ub108\uc9c0 \uc9c0\ud45c) \ud655\uc778 \ud6c4, \ubbf8\uc2e4\ud604 \ub9ac\uc2a4\ud06c\uac00 \uacfc\ub3c4\ud560 \uacbd\uc6b0 \uc794\uc5ec \ubb3c\ub7c9 \uc77c\ubd80(10~20%)\ub97c \uc720\ubcf4 \n\n\ub098. \ud3ec\uc9c0\uc158 \ud06c\uae30 \ubc0f \ub9ac\uc2a4\ud06c \uad00\ub9ac \n \u2022 \uc804\uccb4 \ud3ec\ud2b8\ud3f4\ub9ac\uc624 \ub300\ube44 8% \ubaa9\ud45c \n \u2022 \uc9c0\uc815\ud559\uc801 \uc774\ubca4\ud2b8(\uc608: \uc911\ub3d9 \uae34\uc7a5 \uc9c0\ud45c, \ubbf8\u00b7\uc911 \ucca8\uc608 \ub300\ub9bd \uc9c0\ud45c) \ubc1c\uc0dd \uc2dc \ucd94\uac00\uc801 \ubc29\uc5b4 \uc218\ub2e8(\ud5e4\uc9c0\uc6a9 \ud48b\uc635\uc158 \ub9e4\uc785, \ubcc0\ub3d9\uc131 \uc9c0\uc218(VIX) \uc5f0\uacc4 \uc0c1\ud488 \uace0\ub824) \n \u2022 \uc190\uc808\ub77c\uc778 10% \uace0\uc815 \ub300\uc2e0 \u201c\ud2b8\ub808\uc77c\ub9c1 \uc2a4\ud0d1(\ucd5c\uace0\uac00 \ub300\ube44 \u201312%)\u201d \uc801\uc6a9\uc73c\ub85c \uae09\ub77d \uc2dc \uc790\ub3d9 \ubc29\uc5b4 \n\n\ub2e4. \ubaa8\ub2c8\ud130\ub9c1 \ud3ec\uc778\ud2b8 \n 1) Azure \ub9e4\ucd9c \uc131\uc7a5\ub960 \ubc0f \ud074\ub77c\uc6b0\ub4dc \ub9c8\uc9c4 \n 2) OpenAI \uad00\ub828 \ub9e4\ucd9c \uae30\uc5ec\ub3c4 \ubc0f \uc0c1\uc6a9\ud654 \uc81c\ud488 \ucd9c\uc2dc \uc18d\ub3c4 \n 3) Activision Blizzard \ud1b5\ud569 KPI(\uc0ac\uc6a9\uc790 \uc720\uc9c0\uc728, \uad50\ucc28 \ud310\ub9e4 \uc2e4\uc801 \ub4f1) \n 4) \uacbd\uc7c1\uc0ac(AWS\u00b7Google Cloud) \uac00\uaca9 \uc815\ucc45 \ubc0f \uae30\uc220 \ub85c\ub4dc\ub9f5 \ubcc0\ud654 \n 5) \uc9c0\uc815\ud559\uc801\u00b7\uac70\uc2dc\uacbd\uc81c \uc9c0\ud45c(\ubbf8\u00b7\uc911 \ubb34\uc5ed \uac08\ub4f1, \uc911\ub3d9 \uc9c0\uc815\ud559 \ub9ac\uc2a4\ud06c, \ubbf8\uad6d \uae08\ub9ac \uacb0\uc815) \n\n\ub77c. \ucd94\uac00 \ub300\uc751 \ubc29\uc548 \n \u2022 \ub2e8\uae30 \ubcc0\ub3d9\uc131 \ud655\ub300 \uc2dc \uc77c\ubd80(\ucd1d \ub9e4\uc785 \ubb3c\ub7c9\uc758 20%) \ucf5c\uc635\uc158\uc73c\ub85c \ub808\ubc84\ub9ac\uc9c0 \uc870\uc808 \n \u2022 \ubd84\uae30\ubcc4 \ub9ac\ubc38\ub7f0\uc2f1: \ubaa9\ud45c \uc218\uc775\ub960(1\ub144 20~25%) \ub2ec\uc131 \uc5ec\ubd80 \ud655\uc778 \ud6c4, \ubbf8\ub2ec \uc2dc \ub9ac\uc2a4\ud06c \ucd95\uc18c \ub610\ub294 \ubaa9\ud45c\uac00 \uc870\uc815 \n\n4. \ubc18\uc131 \ubc0f \uad50\ud6c8 \n\uc774\uc804\uc5d0\ub294 \uc9c0\ub098\uce58\uac8c \ubcf4\uc218\uc801 \uc811\uadfc\uc73c\ub85c \uc131\uc7a5 \uae30\ud68c\ub97c \ub193\uce5c \uacbd\ud5d8\uc744 \ubc18\uc601\ud574, \uc774\ubc88\uc5d0\ub294 \ud655\uc2e4\ud55c \ud380\ub354\uba58\ud138\uc744 \uc9c0\ub2cc MSFT\uc5d0 \ub300\ud574 \uc801\uadf9\uc801 \ub9e4\uc218 \uad00\uc810\uc744 \ucde8\ud569\ub2c8\ub2e4. \ub2e4\ub9cc Safe \uce21 \uc6b0\ub824\ub97c \uace0\ub824\ud574 \u201c\ud5e4\uc9c0 \ub3c4\uad6c \ud65c\uc6a9\u201d\uacfc \u201c\uc131\uacfc \uc9c0\ud45c \uae30\ubc18 \uc720\ubcf4 \uc804\ub7b5\u201d\uc744 \ub3c4\uc785, \uade0\ud615 \uc7a1\ud78c \ub9ac\uc2a4\ud06c\u00b7\ub9ac\ud134 \uad00\ub9ac\ub97c \uac15\ud654\ud558\uc5ec \ud22c\uc790 \ud310\ub2e8\uc758 \uba85\ud655\uc131\uacfc \uc548\uc804\uc131\uc744 \ub3d9\uc2dc\uc5d0 \ud655\ubcf4\ud588\uc2b5\ub2c8\ub2e4." + }, + "investment_plan": "\ud1a0\ub860\uc744 \uc815\ub9ac\ud574 \ubcf4\uba74, \uac15\uc138 \uce21\uc740 \ub9c8\uc774\ud06c\ub85c\uc18c\ud504\ud2b8\uc758 AI\u00b7\ud074\ub77c\uc6b0\ub4dc \ubd80\ubb38\uc5d0\uc11c\uc758 \ube60\ub978 \uc131\uc7a5\uacfc OpenAI \ud611\ub825\uc73c\ub85c \uc5bb\ub294 \uc218\uc775, Azure \uc810\uc720\uc728, Activision Blizzard \uc778\uc218\uc5d0 \ub530\ub978 \ud3ec\ud2b8\ud3f4\ub9ac\uc624 \ub2e4\uac01\ud654, \uadf8\ub9ac\uace0 \uae08\ub9ac \uc778\ud558 \uae30\ub300 \uc18d\uc5d0\uc11c\uc758 \ud380\ub354\uba58\ud138 \uac15\ud654\ub97c \uac15\uc870\ud588\uc2b5\ub2c8\ub2e4. \ubc18\uba74 \uc57d\uc138 \uce21\uc740 \ud074\ub77c\uc6b0\ub4dc\u00b7AI \uc2dc\uc7a5\uc758 \uacbd\uc7c1 \uc2ec\ud654(AWS\u00b7\uad6c\uae00), \ucd5c\uadfc 6,000\uba85 \uc774\uc0c1 \uc778\ub825 \uac10\ucd95\uc774 \ud601\uc2e0\ub825\u00b7\uae30\uc5c5 \ubb38\ud654\uc5d0 \ubbf8\uce60 \ubd80\uc815\uc801 \uc601\ud5a5, \uc9c0\uc815\ud559\uc801\u00b7\uac70\uc2dc\uacbd\uc81c\uc801 \ub9ac\uc2a4\ud06c(\ubbf8\uc911 \uac08\ub4f1\u00b7\uc911\ub3d9 \ubd88\uc548), \uadf8\ub9ac\uace0 \uc9c0\ub098\uce58\uac8c \ub099\uad00\uc801\uc778 \uc8fc\uac00 \uc608\uce21(Citi \ubcf4\uace0\uc11c)\uc744 \uc9c0\uc801\ud588\uc2b5\ub2c8\ub2e4.\n\n\uc81c\uac00 \ud310\ub2e8\ud558\uae30\uc5d0 \ub9c8\uc774\ud06c\ub85c\uc18c\ud504\ud2b8\ub294 \ub2e8\uae30\uc801 \ube44\uc6a9 \uc808\uac10 \ucc28\uc6d0\uc744 \ub118\uc5b4\uc11c\ub294 \uc7a5\uae30\uc801 \uc131\uc7a5 \uc2a4\ud1a0\ub9ac\ub97c \uac16\ucd94\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc778\ub825 \uac10\ucd95\uc740 \uc804\uccb4 \uc9c1\uc6d0\uc758 3% \uc815\ub3c4\ub85c, \ube44\uc6a9 \ud6a8\uc728\uc744 \uc81c\uace0\ud558\uace0 \ud575\uc2ec \ubd84\uc57c\uc5d0 \uc7ac\ud22c\uc790\ud558\uae30 \uc704\ud55c \uc804\ub7b5\uc77c \ubfd0\uc774\uba70, \uc5ec\uc804\ud788 AI\u00b7\ud074\ub77c\uc6b0\ub4dc \uc2dc\uc7a5\uc5d0\uc11c \uacbd\uc7c1 \uc6b0\uc704\ub97c \uc810\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc9c0\uc815\ud559\uc801 \ub9ac\uc2a4\ud06c\uac00 \ubd88\uac00\ud53c\ud558\ub098 \uae00\ub85c\ubc8c \ubd84\uc0b0 \uc778\ud504\ub77c\uc640 \ud604\uc9c0\ud654 \uc804\ub7b5\uc73c\ub85c \ub9ac\uc2a4\ud06c\ub97c \uad00\ub9ac\ud560 \uc218 \uc788\uace0, \uae08\ub9ac \uc778\ud558 \uac00\ub2a5\uc131\uc740 \uae30\uc5c5 \uc774\uc775\uc744 \ucd94\uac00\ub85c \ub4b7\ubc1b\uce68\ud560 \uc5ec\uc9c0\uac00 \ud07d\ub2c8\ub2e4. \ub530\ub77c\uc11c \ub9e4\uc218(Buy)\ub97c \ucd94\ucc9c\ud569\ub2c8\ub2e4.\n\n\ud22c\uc790 \uc2e4\ud589 \uacc4\ud68d\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4. \n1. \ucd94\ucc9c: \ub9e4\uc218(Buy) \n2. \uc774\uc720: \n - AI\u00b7\ud074\ub77c\uc6b0\ub4dc \ubd80\ubb38\uc5d0\uc11c\uc758 \uc9c0\uc18d\uc801\uc778 \ub9e4\ucd9c \uc131\uc7a5\uacfc \ub192\uc740 \uc2dc\uc7a5 \uc810\uc720\uc728 \n - OpenAI \ud611\ub825\uc73c\ub85c \uc778\ud55c \uc2e0\uaddc \uc218\uc775 \ubaa8\ub378 \uad6c\ucd95 \ubc0f \uc7a5\uae30 \uc131\uc7a5\uc131 \ud655\ubcf4 \n - Activision Blizzard \uc778\uc218\ub97c \ud1b5\ud55c \ud3ec\ud2b8\ud3f4\ub9ac\uc624 \ub2e4\uac01\ud654 \ubc0f \ucd94\uac00 \ub9e4\ucd9c\uc6d0 \ucc3d\ucd9c \n - \uac70\uc2dc \ud658\uacbd \uac1c\uc120(\uae08\ub9ac \uc778\ud558 \uae30\ub300)\uc73c\ub85c \uae30\uc5c5 \uc774\uc775\ub960 \uac15\ud654 \n3. \uad6c\uccb4\uc801 \uc2e4\ud589 \ubc29\uc548: \n \uac00. \ubd84\ud560 \ub9e4\uc218 \uc804\ub7b5 \n - \ud604 \uc8fc\uac00 \ub300\ube44 3% \ud558\ub77d \uc2dc 50% \ube44\uc911 \ub9e4\uc218, \ucd94\uac00 5% \ud558\ub77d \uc2dc \ub098\uba38\uc9c0 50% \ub9e4\uc218\ub85c \uc9c4\uc785 \n - \ud3c9\uade0 \uc9c4\uc785 \ub2e8\uac00\ub97c \ub0ae\ucdb0 \uc2dc\uc7a5 \ubcc0\ub3d9\uc131\uc5d0 \ub300\uc751 \n \ub098. \ud3ec\uc9c0\uc158 \ud06c\uae30 \ubc0f \ub9ac\uc2a4\ud06c \uad00\ub9ac \n - \uc804\uccb4 \ud3ec\ud2b8\ud3f4\ub9ac\uc624\uc758 8~10% \ube44\uc911\uc73c\ub85c \uc124\uc815 \n - \uc190\uc808\uac00\ub294 \uc9c4\uc785\uac00 \ub300\ube44 10% \ud558\ub77d \uc2dc \uc790\ub3d9 \uccad\uc0b0 \n \ub2e4. \ubaa8\ub2c8\ud130\ub9c1 \ud3ec\uc778\ud2b8 \n - Azure \ub9e4\ucd9c \uc131\uc7a5\ub960\uacfc \ud074\ub77c\uc6b0\ub4dc \ub9c8\uc9c4 \uc9c0\ud45c \n - OpenAI \uad00\ub828 \ub9e4\ucd9c \ube44\uc911 \ubc0f \uc2e0\uaddc AI \uc194\ub8e8\uc158 \uc0c1\uc6a9\ud654 \ud604\ud669 \n - \uacbd\uc7c1\uc0ac\uc758 \uac00\uaca9 \uc815\ucc45\u00b7\uae30\uc220 \ub85c\ub4dc\ub9f5 \ubcc0\ud654 \n - \uae00\ub85c\ubc8c \uc9c0\uc815\ud559 \ub9ac\uc2a4\ud06c(\ubbf8\uc911\u00b7\uc911\ub3d9) \ubc0f \uae08\ub9ac \uacb0\uc815 \ub3d9\ud5a5 \n \ub77c. \ucd94\uac00 \ub300\uc751 \n - \ub2e8\uae30 \uc870\uc815\uc774 \uc2ec\ud560 \uacbd\uc6b0 \ucf5c\uc635\uc158 \uc77c\ubd80 \ub9e4\uc785\uc73c\ub85c \ub808\ubc84\ub9ac\uc9c0 \ud655\ub300 \uac80\ud1a0 \n - \ub9e4 \ubd84\uae30 \uc2e4\uc801 \ubc1c\ud45c \ud6c4 \ub9ac\ubc38\ub7f0\uc2f1\ud558\uc5ec \ubaa9\ud45c \uc218\uc775\ub960(1\ub144 20~25%) \ub2ec\uc131 \uc5ec\ubd80 \uc810\uac80 \n\n\uc774\uc804 \uacb0\uc815\uc5d0\uc11c \uc9c0\ub098\uce58\uac8c \ubcf4\uc218\uc801\uc73c\ub85c \uc811\uadfc\ud574 \uae30\ud68c\ub97c \ub193\uce5c \uacbd\ud5d8\uc744 \ubc18\uc601\ud574, \uc774\ubc88\uc5d0\ub294 \uc7a5\uae30\uc801 \uc131\uc7a5 \ubaa8\uba58\ud140\uc774 \ud655\uc2e4\ud55c \uc885\ubaa9\uc5d0 \ub300\ud574 \uba85\ud655\ud788 \ub9e4\uc218 \uad00\uc810\uc744 \ucde8\ud558\uace0\uc790 \ud569\ub2c8\ub2e4. \uc2dc\uc7a5 \ubcc0\ub3d9\uc744 \uacc4\ub7c9\uc801\uc73c\ub85c \uad00\ub9ac\ud558\uba74\uc11c\ub3c4 \uc131\uc7a5\uc131\uc758 \ud575\uc2ec \ucd95\uc5d0\uc11c \uc774\ud0c8\ud558\uc9c0 \uc54a\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4.", + "final_trade_decision": "1. \uc8fc\uc694 \ub17c\uc810 \uc694\uc57d \n- Risky Analyst (\uac15\uc138) \n \u2022 \u201c\ubbf8\uad6d \ub2ec\ub7ec \ud558\ub77d\uacfc \uae08\ub9ac \uc778\ud558 \uae30\ub300\ub294 MSFT\uc758 \uc774\uc775\ub960\uc744 \ub192\uc5ec \uc8fc\uac00 \uc0c1\uc2b9\uc744 \uacac\uc778\ud560 \uac83\u201d \n \u2022 \uc778\ub825 \uac10\ucd95(\uc804\uccb4\uc758 \uc57d 3%)\uc740 \ube44\uc6a9 \ud6a8\uc728\ud654\ub97c \uc704\ud55c \uc804\ub7b5\uc801 \uacb0\uc815\uc73c\ub85c, AI\u00b7\ud074\ub77c\uc6b0\ub4dc \ud575\uc2ec \uc601\uc5ed\uc5d0 \uc7ac\ud22c\uc790 \n \u2022 OpenAI \ud611\ub825\uacfc Activision Blizzard \uc778\uc218\ub97c \ud1b5\ud55c \uc2e0\uaddc \uc218\uc775 \ubaa8\ub378\u00b7\ud3ec\ud2b8\ud3f4\ub9ac\uc624 \ub2e4\uac01\ud654 \n \u2022 Citi\uc758 \ubaa9\ud45c\uc8fc\uac00 $605\ub294 \ud604\uc7ac \ub300\ube44 \uc57d 26% \uc0c1\uc2b9 \uc5ec\ub825 \uc81c\uc2dc \n\n- Safe Analyst (\ubcf4\uc218) \n \u2022 \uc9c0\uc815\ud559\uc801 \uae34\uc7a5(\ubbf8\u00b7\uc911, \uc911\ub3d9)\uacfc \uc6d0\uc790\uc7ac \uac00\uaca9 \uae09\ub4f1 \ub9ac\uc2a4\ud06c \uacfc\uc18c\ud3c9\uac00 \uacbd\uace0 \n \u2022 \uc778\ub825 \uac10\ucd95\uc774 \uc7a5\uae30 \ud601\uc2e0\uc131\uacfc \uae30\uc5c5 \ubb38\ud654\uc5d0 \ubbf8\uce60 \ubd80\uc815\uc801 \uc601\ud5a5 \uc6b0\ub824 \n \u2022 Activision \uc778\uc218 \ud6c4 \ud1b5\ud569 \ub9ac\uc2a4\ud06c(\ubb38\ud654 \ucda9\ub3cc\u00b7\uc6b4\uc601 \ud6a8\uc728 \uc800\ud558) \uc8fc\uc758 \n \u2022 \ub099\uad00\uc801 \ubaa9\ud45c\uc8fc\uac00\ub294 \uc2e4\uc81c \uc2e4\ud604\uae4c\uc9c0 \ubd88\ud655\uc2e4\uc131\uc774 \ud06c\ub2e4\uace0 \uc9c0\uc801 \n\n- Neutral Analyst (\uc911\ub9bd) \n \u2022 AI\u00b7\ud074\ub77c\uc6b0\ub4dc \uc131\uc7a5 \uc7a0\uc7ac\ub825 \uc778\uc815\ud558\ub098 \uc678\ubd80 \ub9ac\uc2a4\ud06c \ub3d9\uc2dc \uace0\ub824 \ud544\uc694 \n \u2022 \uc9c0\ub098\uce58\uac8c \uacf5\uaca9\uc801\u00b7\ubcf4\uc218\uc801 \uc811\uadfc \ubaa8\ub450 \ubb38\uc81c\ub85c, \u201c\ub9ac\uc2a4\ud06c \uad00\ub9ac\uc640 \uc131\uc7a5 \ucd94\uad6c\uc758 \uade0\ud615\u201d \uac15\uc870 \n \u2022 \ud3ec\ud2b8\ud3f4\ub9ac\uc624 \ub2e4\uac01\ud654\uc640 \ubd84\uc0b0\ud22c\uc790\ub97c \ud1b5\ud55c \ub9ac\uc2a4\ud06c \uc644\ud654 \uc81c\uc548 \n\n2. \uad8c\uace0\uc548 \ubc0f \uadfc\uac70 \n\uacb0\ub860: Buy \n- \uac15\uc138 \uce21\uc758 \u201cAI\u00b7\ud074\ub77c\uc6b0\ub4dc \ubd84\uc57c \ub9e4\ucd9c \uc131\uc7a5\uacfc OpenAI \ud611\ub825\uc73c\ub85c \uc778\ud55c \uc218\uc775 \ubaa8\ub378 \uae09\uc131\uc7a5\u201d \uc8fc\uc7a5\uc740 MSFT\uc758 \uc911\u00b7\uc7a5\uae30 \ud380\ub354\uba58\ud138\uc744 \ub4b7\ubc1b\uce68\ud569\ub2c8\ub2e4. \n- \uc9c0\uc815\ud559\uc801 \ub9ac\uc2a4\ud06c\u00b7\uc778\ub825 \uac10\ucd95 \uc6b0\ub824\ub294 \uc720\ud6a8\ud558\uc9c0\ub9cc, MSFT\ub294 \uae00\ub85c\ubc8c \ubd84\uc0b0 \uc778\ud504\ub77c\uc640 \ud604\uc9c0\ud654 \uc804\ub7b5\uc73c\ub85c \uad00\ub9ac \uac00\ub2a5\ud558\uba70, \uac10\ucd95 \uaddc\ubaa8(3%)\uac00 \uc9c0\ub098\uce58\uac8c \ud06c\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \n- \uae08\ub9ac \uc778\ud558 \uae30\ub300\ub294 \uc2e4\uc81c \uc7ac\ubb34\ube44\uc6a9 \uc808\uac10\uc73c\ub85c \uc774\uc5b4\uc9c8 \uac00\ub2a5\uc131\uc774 \ub192\uc544 \ub300\ud615 \uae30\uc220\uc8fc\uc758 \uc0c1\ub300\uc801 \ub9e4\ub825\ub3c4\ub97c \ub192\uc785\ub2c8\ub2e4. \n- Activision \ud1b5\ud569 \uc9c0\uc5f0 \ub9ac\uc2a4\ud06c\ub97c \uac10\uc548\ud558\ub354\ub77c\ub3c4 \uac8c\uc784\u00b7\ud074\ub77c\uc6b0\ub4dc\u00b7AI\uc758 \uc2dc\ub108\uc9c0 \ucc3d\ucd9c \uc2a4\ud1a0\ub9ac\ub294 \uc5ec\uc804\ud55c \uc131\uc7a5 \ub3d9\ub825\uc785\ub2c8\ub2e4. \n\n3. \uc218\uc815\ub41c \ud22c\uc790 \uc2e4\ud589 \uacc4\ud68d \n\uae30\uc874 \ud50c\ub79c(\ubd84\ud560\ub9e4\uc218\u00b7\ud3ec\uc9c0\uc158 8~10%\u00b7\uc190\uc808 \u201310% \ub4f1)\uc744 \ubc14\ud0d5\uc73c\ub85c, \ub17c\uc7c1\uc810\uc744 \ubc18\uc601\ud574 \ub9ac\uc2a4\ud06c \uad00\ub9ac\ub97c \uac15\ud654\ud569\ub2c8\ub2e4. \n\n\uac00. \ubd84\ud560 \ub9e4\uc218 \uc804\ub7b5 \n 1) \u2460\ud604\uc7ac \uc8fc\uac00 \ub300\ube44 \u20133% \ub3c4\ub2ec \uc2dc \uc804\uccb4 \ubaa9\ud45c \ubb3c\ub7c9\uc758 40% \ub9e4\uc218 \n \u2461\ucd94\uac00 \u20135% \ud558\ub77d \uc2dc \ub098\uba38\uc9c0 60% \ub9e4\uc218 \n 2) Activision \ud1b5\ud569 \uc9c4\ud589 \uc0c1\ud669(\ubd84\uae30\ubcc4 \uc2e4\uc801 \ubc1c\ud45c \uc2dc \ud1b5\ud569 \uc2dc\ub108\uc9c0 \uc9c0\ud45c) \ud655\uc778 \ud6c4, \ubbf8\uc2e4\ud604 \ub9ac\uc2a4\ud06c\uac00 \uacfc\ub3c4\ud560 \uacbd\uc6b0 \uc794\uc5ec \ubb3c\ub7c9 \uc77c\ubd80(10~20%)\ub97c \uc720\ubcf4 \n\n\ub098. \ud3ec\uc9c0\uc158 \ud06c\uae30 \ubc0f \ub9ac\uc2a4\ud06c \uad00\ub9ac \n \u2022 \uc804\uccb4 \ud3ec\ud2b8\ud3f4\ub9ac\uc624 \ub300\ube44 8% \ubaa9\ud45c \n \u2022 \uc9c0\uc815\ud559\uc801 \uc774\ubca4\ud2b8(\uc608: \uc911\ub3d9 \uae34\uc7a5 \uc9c0\ud45c, \ubbf8\u00b7\uc911 \ucca8\uc608 \ub300\ub9bd \uc9c0\ud45c) \ubc1c\uc0dd \uc2dc \ucd94\uac00\uc801 \ubc29\uc5b4 \uc218\ub2e8(\ud5e4\uc9c0\uc6a9 \ud48b\uc635\uc158 \ub9e4\uc785, \ubcc0\ub3d9\uc131 \uc9c0\uc218(VIX) \uc5f0\uacc4 \uc0c1\ud488 \uace0\ub824) \n \u2022 \uc190\uc808\ub77c\uc778 10% \uace0\uc815 \ub300\uc2e0 \u201c\ud2b8\ub808\uc77c\ub9c1 \uc2a4\ud0d1(\ucd5c\uace0\uac00 \ub300\ube44 \u201312%)\u201d \uc801\uc6a9\uc73c\ub85c \uae09\ub77d \uc2dc \uc790\ub3d9 \ubc29\uc5b4 \n\n\ub2e4. \ubaa8\ub2c8\ud130\ub9c1 \ud3ec\uc778\ud2b8 \n 1) Azure \ub9e4\ucd9c \uc131\uc7a5\ub960 \ubc0f \ud074\ub77c\uc6b0\ub4dc \ub9c8\uc9c4 \n 2) OpenAI \uad00\ub828 \ub9e4\ucd9c \uae30\uc5ec\ub3c4 \ubc0f \uc0c1\uc6a9\ud654 \uc81c\ud488 \ucd9c\uc2dc \uc18d\ub3c4 \n 3) Activision Blizzard \ud1b5\ud569 KPI(\uc0ac\uc6a9\uc790 \uc720\uc9c0\uc728, \uad50\ucc28 \ud310\ub9e4 \uc2e4\uc801 \ub4f1) \n 4) \uacbd\uc7c1\uc0ac(AWS\u00b7Google Cloud) \uac00\uaca9 \uc815\ucc45 \ubc0f \uae30\uc220 \ub85c\ub4dc\ub9f5 \ubcc0\ud654 \n 5) \uc9c0\uc815\ud559\uc801\u00b7\uac70\uc2dc\uacbd\uc81c \uc9c0\ud45c(\ubbf8\u00b7\uc911 \ubb34\uc5ed \uac08\ub4f1, \uc911\ub3d9 \uc9c0\uc815\ud559 \ub9ac\uc2a4\ud06c, \ubbf8\uad6d \uae08\ub9ac \uacb0\uc815) \n\n\ub77c. \ucd94\uac00 \ub300\uc751 \ubc29\uc548 \n \u2022 \ub2e8\uae30 \ubcc0\ub3d9\uc131 \ud655\ub300 \uc2dc \uc77c\ubd80(\ucd1d \ub9e4\uc785 \ubb3c\ub7c9\uc758 20%) \ucf5c\uc635\uc158\uc73c\ub85c \ub808\ubc84\ub9ac\uc9c0 \uc870\uc808 \n \u2022 \ubd84\uae30\ubcc4 \ub9ac\ubc38\ub7f0\uc2f1: \ubaa9\ud45c \uc218\uc775\ub960(1\ub144 20~25%) \ub2ec\uc131 \uc5ec\ubd80 \ud655\uc778 \ud6c4, \ubbf8\ub2ec \uc2dc \ub9ac\uc2a4\ud06c \ucd95\uc18c \ub610\ub294 \ubaa9\ud45c\uac00 \uc870\uc815 \n\n4. \ubc18\uc131 \ubc0f \uad50\ud6c8 \n\uc774\uc804\uc5d0\ub294 \uc9c0\ub098\uce58\uac8c \ubcf4\uc218\uc801 \uc811\uadfc\uc73c\ub85c \uc131\uc7a5 \uae30\ud68c\ub97c \ub193\uce5c \uacbd\ud5d8\uc744 \ubc18\uc601\ud574, \uc774\ubc88\uc5d0\ub294 \ud655\uc2e4\ud55c \ud380\ub354\uba58\ud138\uc744 \uc9c0\ub2cc MSFT\uc5d0 \ub300\ud574 \uc801\uadf9\uc801 \ub9e4\uc218 \uad00\uc810\uc744 \ucde8\ud569\ub2c8\ub2e4. \ub2e4\ub9cc Safe \uce21 \uc6b0\ub824\ub97c \uace0\ub824\ud574 \u201c\ud5e4\uc9c0 \ub3c4\uad6c \ud65c\uc6a9\u201d\uacfc \u201c\uc131\uacfc \uc9c0\ud45c \uae30\ubc18 \uc720\ubcf4 \uc804\ub7b5\u201d\uc744 \ub3c4\uc785, \uade0\ud615 \uc7a1\ud78c \ub9ac\uc2a4\ud06c\u00b7\ub9ac\ud134 \uad00\ub9ac\ub97c \uac15\ud654\ud558\uc5ec \ud22c\uc790 \ud310\ub2e8\uc758 \uba85\ud655\uc131\uacfc \uc548\uc804\uc131\uc744 \ub3d9\uc2dc\uc5d0 \ud655\ubcf4\ud588\uc2b5\ub2c8\ub2e4." + } +} \ No newline at end of file diff --git a/web/frontend/src/pages/Analysis/Analysis.js b/web/frontend/src/pages/Analysis/Analysis.js index 1a71e1ec..950d0a5f 100644 --- a/web/frontend/src/pages/Analysis/Analysis.js +++ b/web/frontend/src/pages/Analysis/Analysis.js @@ -1,7 +1,7 @@ // web/frontend/src/pages/Analysis/Analysis.js import React, { useState, useEffect } from 'react'; -import { Card, Divider, Spin, Alert, Typography } from 'antd'; +import { Card, Divider, Spin, Alert, Typography, Row, Col } from 'antd'; import styled from 'styled-components'; import api from '../../services/api'; import { useWebSocket } from '../../contexts/WebSocketContext'; @@ -11,7 +11,7 @@ import AnalysisDisplay from './components/AnalysisDisplay'; const { Title, Paragraph } = Typography; const AnalysisContainer = styled.div` - max-width: 900px; + max-width: 100%; margin: 0 auto; padding: ${props => props.theme.spacing.lg}; `; @@ -107,7 +107,7 @@ const Analysis = () => { ๊ด€์‹ฌ ์žˆ๋Š” ์ข…๋ชฉ์— ๋Œ€ํ•œ ์‹ฌ์ธต ๋ถ„์„์„ ์‹œ์ž‘ํ•˜์„ธ์š”. - + {error && !currentSessionId && ( // Show top-level error only when no session is active props.theme.borderRadius.lg}; box-shadow: ${props => props.theme.shadows.lg}; margin-top: ${props => props.theme.spacing.lg}; + border-radius: ${props => props.theme.borderRadius.md}; + background-color: ${props => props.theme.colors.backgroundSecondary}; `; const TimelineContainer = styled.div` @@ -23,9 +25,6 @@ const TimelineContainer = styled.div` const ReportContainer = styled.div` margin-top: ${props => props.theme.spacing.lg}; - padding: ${props => props.theme.spacing.lg}; - background-color: #fafafa; - border-radius: ${props => props.theme.borderRadius.md}; `; const agentTagColors = { @@ -101,8 +100,7 @@ const AnalysisDisplay = ({ sessionId, status, progress, messages, finalReport, o {status === 'completed' && finalReport && ( - ์ตœ์ข… ๋ถ„์„ ๋ณด๊ณ ์„œ - {finalReport} + )} diff --git a/web/frontend/src/pages/Analysis/components/AnalysisForm.js b/web/frontend/src/pages/Analysis/components/AnalysisForm.js index cd2b6fd6..92f3475d 100644 --- a/web/frontend/src/pages/Analysis/components/AnalysisForm.js +++ b/web/frontend/src/pages/Analysis/components/AnalysisForm.js @@ -47,7 +47,7 @@ const AnalysisForm = ({ onStartAnalysis, loading }) => { return ( - ์ƒˆ ๋ถ„์„ ์‹œ์ž‘ + ์ƒˆ ๋ถ„์„ ์‹œ์ž‘
{ - +
+ + {overall_conclusion} + + ); + }; + + const renderFundamentalsReport = (data) => { + const { company_overview, financial_performance, stock_market_info, analyst_forecasts, insider_sentiment, summary } = data; + const fundamentalsColumns = [ + { title: '๋ฉ”ํŠธ๋ฆญ', dataIndex: 'metric', key: 'metric', width: '40%' }, + { title: '๊ฐ’', dataIndex: 'value', key: 'value', width: '60%' }, + ]; + return ( + <> + {company_overview} +
+
+
+ {insider_sentiment} + {summary} + + ); + }; + + const renderGenericReport = (data) => ( + +
+                {JSON.stringify(data, null, 2)}
+            
+
+ ); + + const reportRenderers = { + 'market': renderMarketReport, + 'fundamentals': renderFundamentalsReport, + // Add other specific renderers here + }; + + const tabItems = Object.entries(reports) + .filter(([key, data]) => data && !data.error) + .map(([key, data]) => { + const renderer = reportRenderers[key] || renderGenericReport; + // Capitalize first letter for label + const label = key.charAt(0).toUpperCase() + key.slice(1).replace('_', ' '); + return { + key: key, + label: `${label} ๋ฆฌํฌํŠธ`, + children: renderer(data), + }; + }); + + const getTagColor = (proposal) => { + switch (proposal?.toUpperCase()) { + case 'BUY': return 'green'; + case 'SELL': return 'red'; + case 'HOLD': return 'blue'; + default: return 'default'; + } + } return ( - - {mainTitle} - - - {Object.entries(parsedSections).map(([title, content]) => { - const sectionInfo = Object.values(reportSections).find(info => title.includes(Object.keys(reportSections).find(key => reportSections[key] === info))) || {}; - return ( - {sectionInfo.icon} {title}} - key={sectionInfo.key || title} - > - - {content} - - - ); - })} - - + + ์ตœ์ข… ๋ถ„์„ ๋ณด๊ณ ์„œ: {company_info.ticker} + ๋ถ„์„ ๊ธฐ์ค€์ผ: {company_info.analysis_date} + + ์ตœ์ข… ๊ฑฐ๋ž˜ ์ œ์•ˆ: + {final_decision.final_proposal} + + + + ); }; From 9f224354efc68111f1a042fa535085a1ab81c5a8 Mon Sep 17 00:00:00 2001 From: kimheesu Date: Fri, 13 Jun 2025 17:28:37 +0900 Subject: [PATCH 14/14] =?UTF-8?q?[add]=20=EC=B5=9C=EC=A2=85=EB=B6=84?= =?UTF-8?q?=EC=84=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Analysis/components/ReportDisplay.js | 153 +++--------------- 1 file changed, 19 insertions(+), 134 deletions(-) diff --git a/web/frontend/src/pages/Analysis/components/ReportDisplay.js b/web/frontend/src/pages/Analysis/components/ReportDisplay.js index bbf7153f..4860fdd2 100644 --- a/web/frontend/src/pages/Analysis/components/ReportDisplay.js +++ b/web/frontend/src/pages/Analysis/components/ReportDisplay.js @@ -1,8 +1,8 @@ -import React, { useState, useEffect } from 'react'; -import { Card, Tabs, Typography, Table, Tag, Row, Col, Spin, Alert } from 'antd'; +import React from 'react'; +import { Card, Typography } from 'antd'; import styled from 'styled-components'; -const { Title, Paragraph } = Typography; +const { Title } = Typography; const ReportWrapper = styled.div` padding: ${props => props.theme.spacing.md}; @@ -16,144 +16,29 @@ const SectionCard = styled(Card)` & .ant-card-head { background-color: ${props => props.theme.colors.backgroundSecondary}; } + & .ant-card-body { + padding-top: 16px; + padding-bottom: 16px; + } `; const ReportDisplay = ({ reportData }) => { - const [parsedData, setParsedData] = useState(null); - const [loading, setLoading] = useState(true); - const [error, setError] = useState(null); - - useEffect(() => { - if (reportData) { - setLoading(true); - setError(null); - try { - const data = JSON.parse(reportData); - if (data && data.reports) { - setParsedData(data); - } else { - throw new Error("Invalid report structure received."); - } - } catch (e) { - console.error("Failed to parse report JSON:", e); - setError({ - message: "๋ณด๊ณ ์„œ ํŒŒ์‹ฑ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.", - originalData: reportData - }); - } finally { - setLoading(false); - } - } - }, [reportData]); - - if (loading) { - return ; - } - - if (error) { - return ( - - -
-                    {error.originalData}
-                
-
- ); - } - - if (!parsedData) { - return ; - } - - const { company_info, reports, final_decision } = parsedData; - - const renderMarketReport = (data) => { - const { price_summary, indicator_analysis, overall_conclusion } = data; - const indicatorColumns = [ - { title: '์ง€ํ‘œ', dataIndex: 'indicator', key: 'indicator', width: '20%' }, - { title: '๊ฐ’', dataIndex: 'value', key: 'value', width: '15%' }, - { title: 'ํ•ด์„', dataIndex: 'interpretation', key: 'interpretation' }, - ]; - return ( - <> - {price_summary} - -
- - {overall_conclusion} - - ); - }; - - const renderFundamentalsReport = (data) => { - const { company_overview, financial_performance, stock_market_info, analyst_forecasts, insider_sentiment, summary } = data; - const fundamentalsColumns = [ - { title: '๋ฉ”ํŠธ๋ฆญ', dataIndex: 'metric', key: 'metric', width: '40%' }, - { title: '๊ฐ’', dataIndex: 'value', key: 'value', width: '60%' }, - ]; - return ( - <> - {company_overview} -
-
-
- {insider_sentiment} - {summary} - - ); - }; - - const renderGenericReport = (data) => ( - -
-                {JSON.stringify(data, null, 2)}
-            
-
- ); - - const reportRenderers = { - 'market': renderMarketReport, - 'fundamentals': renderFundamentalsReport, - // Add other specific renderers here - }; - - const tabItems = Object.entries(reports) - .filter(([key, data]) => data && !data.error) - .map(([key, data]) => { - const renderer = reportRenderers[key] || renderGenericReport; - // Capitalize first letter for label - const label = key.charAt(0).toUpperCase() + key.slice(1).replace('_', ' '); - return { - key: key, - label: `${label} ๋ฆฌํฌํŠธ`, - children: renderer(data), - }; - }); - - const getTagColor = (proposal) => { - switch (proposal?.toUpperCase()) { - case 'BUY': return 'green'; - case 'SELL': return 'red'; - case 'HOLD': return 'blue'; - default: return 'default'; - } + if (!reportData) { + return null; } return ( - ์ตœ์ข… ๋ถ„์„ ๋ณด๊ณ ์„œ: {company_info.ticker} - ๋ถ„์„ ๊ธฐ์ค€์ผ: {company_info.analysis_date} - - ์ตœ์ข… ๊ฑฐ๋ž˜ ์ œ์•ˆ: - {final_decision.final_proposal} - - - + +
+                    {reportData}
+                
+
); };