├── .DS_Store ├── .babelrc ├── .eslintrc.json ├── .gitignore ├── .vscode ├── extensions.json ├── launch.json ├── settings.json └── tasks.json ├── .vscodeignore ├── CHANGELOG.md ├── LICENSE.txt ├── README.md ├── assets ├── Errorlog.gif ├── ImportingSvelteFile.gif ├── OpeningComponent.gif ├── RS.png ├── ReSvelte.svg ├── ReSvelteLogo.svg ├── Sass.png ├── Svelte.png ├── Webview.png ├── WhiteResvelte.png ├── banner.png ├── react.png ├── smallResvelte.png ├── typescript.png ├── vscode.png ├── webpack.png └── webpack2.png ├── babel.config.js ├── package-lock.json ├── package.json ├── src ├── .DS_Store ├── App.jsx ├── SidebarParser.js ├── SidebarProvider.ts ├── __tests__ │ ├── App.test.jsx │ ├── application.test.ts │ └── test.js ├── components │ ├── componentNode.tsx │ ├── elementNode.tsx │ ├── errorMessage.tsx │ ├── fileNode.tsx │ └── performanceDisplay.tsx ├── extension.ts ├── parser │ ├── getAliases.ts │ └── parseTree.tsx ├── script.js ├── styles.scss └── types.ts ├── tsconfig.json └── webpack.config.js /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/ReSvelte/bbb1598bc00aec9219e9d1cba844fc74d7561c0c/.DS_Store -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["@babel/preset-env", "@babel/preset-react"], 3 | "plugins": ["@babel/plugin-transform-runtime"] 4 | } -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "parser": "@typescript-eslint/parser", 4 | "parserOptions": { 5 | "ecmaVersion": 6, 6 | "sourceType": "module" 7 | }, 8 | "plugins": [ 9 | "@typescript-eslint" 10 | ], 11 | "rules": { 12 | "@typescript-eslint/naming-convention": "warn", 13 | "@typescript-eslint/semi": "warn", 14 | "curly": "warn", 15 | "eqeqeq": "warn", 16 | "no-throw-literal": "warn", 17 | "semi": "off" 18 | }, 19 | "ignorePatterns": [ 20 | "out", 21 | "dist", 22 | "**/*.d.ts" 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | /dist 3 | /out 4 | **.vsix -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | // See http://go.microsoft.com/fwlink/?LinkId=827846 3 | // for the documentation about the extensions.json format 4 | "recommendations": ["dbaeumer.vscode-eslint", "amodio.tsl-problem-matcher"] 5 | } 6 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | // A launch configuration that compiles the extension and then opens it inside a new window 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | { 6 | "version": "0.2.0", 7 | "configurations": [ 8 | { 9 | "name": "Run Extension", 10 | "type": "extensionHost", 11 | "request": "launch", 12 | "args": [ 13 | "--extensionDevelopmentPath=${workspaceFolder}" 14 | ], 15 | "outFiles": [ 16 | "${workspaceFolder}/dist/**/*.js" 17 | ], 18 | "preLaunchTask": "${defaultBuildTask}" 19 | }, 20 | { 21 | "name": "Extension Tests", 22 | "type": "extensionHost", 23 | "request": "launch", 24 | "args": [ 25 | "--extensionDevelopmentPath=${workspaceFolder}", 26 | "--extensionTestsPath=${workspaceFolder}/out/test/suite/index" 27 | ], 28 | "outFiles": [ 29 | "${workspaceFolder}/out/**/*.js", 30 | "${workspaceFolder}/dist/**/*.js" 31 | ], 32 | "preLaunchTask": "tasks: watch-tests" 33 | } 34 | ] 35 | } 36 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | // Place your settings in this file to overwrite default and user settings. 2 | { 3 | "files.exclude": { 4 | "out": false, // set this to true to hide the "out" folder with the compiled JS files 5 | "dist": false // set this to true to hide the "dist" folder with the compiled JS files 6 | }, 7 | "search.exclude": { 8 | "out": true, // set this to false to include "out" folder in search results 9 | "dist": true // set this to false to include "dist" folder in search results 10 | }, 11 | // Turn off tsc task auto detection since we have the necessary tasks as npm scripts 12 | "typescript.tsc.autoDetect": "off" 13 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | // See https://go.microsoft.com/fwlink/?LinkId=733558 2 | // for the documentation about the tasks.json format 3 | { 4 | "version": "2.0.0", 5 | "tasks": [ 6 | { 7 | "type": "npm", 8 | "script": "watch", 9 | "problemMatcher": [ 10 | "$ts-webpack-watch", 11 | "$tslint-webpack-watch" 12 | ], 13 | "isBackground": true, 14 | "presentation": { 15 | "reveal": "never", 16 | "group": "watchers" 17 | }, 18 | "group": { 19 | "kind": "build", 20 | "isDefault": true 21 | } 22 | }, 23 | { 24 | "type": "npm", 25 | "script": "watch-tests", 26 | "problemMatcher": "$tsc-watch", 27 | "isBackground": true, 28 | "presentation": { 29 | "reveal": "never", 30 | "group": "watchers" 31 | }, 32 | "group": "build" 33 | }, 34 | { 35 | "label": "tasks: watch-tests", 36 | "dependsOn": [ 37 | "npm: watch", 38 | "npm: watch-tests" 39 | ], 40 | "problemMatcher": [] 41 | } 42 | ] 43 | } -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | .vscode/** 2 | .vscode-test/** 3 | node_modules/** 4 | .gitignore 5 | .yarnrc 6 | webpack.config.js 7 | vsc-extension-quickstart.md 8 | **/tsconfig.json 9 | **/.eslintrc.json 10 | **/*.map 11 | **/*.ts 12 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to the "resvelte" extension will be documented in this file. 4 | 5 | Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. 6 | 7 | ## [Unreleased] 8 | 9 | - Initial release -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2022 OSLabs Beta 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and 4 | associated documentation files (the "Software"), to deal in the Software without restriction, including 5 | without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 6 | copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the 7 | following conditions: 8 | 9 | The above copyright notice and this permission notice shall be included in all copies or substantial 10 | portions of the Software. 11 | 12 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT 13 | LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO 14 | EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 15 | ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 16 | DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | ReSvelte Logo 4 | 5 |
6 | 7 | 11 | 12 |
13 |

ReSvelte

14 | A Svelte component tree visualizer and metrics display tool 15 | 16 | Report Issues 17 | small ReSvelte logo 18 | Request a Feature 19 | 20 |
21 | 22 | # About ReSvelte 23 | 24 | As developers create Svelte applications, the component tree increasingly scales in size. Components are a delicate part of front end frameworks. Efficiently placing and correctly executing components are of high importance. 25 | 26 | Having more components re-rendering, will affect the general performance of the application. 27 | 28 | ReSvelte solves this issue. It is a performance developer tool that generates a Svelte component tree visualizer and a component rendering metrics display of your Svelte application within a Visual Studio Code extension. 29 | 30 | # Getting Started with Installation and Usage 31 | 32 | 1. If not already installed, install Visual Studio Code for your respective operating system. Download Visual Studio Code 33 | 34 | 2. Search for ReSvelte in the Visual Studio Code Extension MarketPlace and install. 35 | 36 | Download ReSvelte Here! 37 | 38 | 39 | 3. A ReSvelte icon should appear on your sidebar. You have successfully installed ReSvelte! 40 | 41 | 4. Upload your Svelte folder. If there is an error, you will see an error message. 42 | 43 | upload of Svelte document 44 | 45 | 5. The component tree visualizer should now be populated in the sidebar with the component name. Toggle through the down arrows to expand the tree. 46 | 47 | opening the component tree visualizer 48 | 49 | 6. Underneath the tree, the app performance shows the total number of components rendered in your application and the number of components that can re-render. An error log will also report any import issues. 50 | 51 | app performance with error log message 52 | 53 | ## Technology Stack 54 |
55 |
  • 56 | React logo 57 | React with React Hooks 58 |
  • 59 |
  • 60 | VSCode logo 61 | Visual Studio Code Extension API 62 |
  • 63 |
  • 64 | Typescript logo 65 | Typescript 66 |
  • 67 |
  • 68 | Svelte logo 69 | Svelte 70 |
  • 71 |
  • Svelte-Parse
  • 72 |
  • 73 | Webview logo 74 | WebView 75 |
  • 76 |
  • 77 | Webpack logo 78 | Webpack
  • 79 |
  • 80 | Sass/Css logo 81 | SCSS/SASS 82 |
  • 83 |
    84 | 85 | # Getting Started as a Contributor 86 | 87 | 1. Clone ReSvelte from GitHub 88 | 89 | 2. Open the ReSvelte folder in your VS Code IDE. 90 | 91 | 3. Run the command: `npm install` 92 | 93 | 4. Run the command: `npm run build` 94 | 95 | 5. Run the command: `npm run watch` 96 | 97 | 6. Press F5. Click "Debug Anyways". This will open the development extension to allow debugging and view the ReSvelte extension. 98 | 99 | 7. Click the 'RS' ReSvelte extension button on the left panel 100 | 101 | 8. Proceed to upload a Svelte folder 102 | 103 | 9. Press `command, shift, P` then type into the search bar "Developer: Open Webview Tools" to see the dev tools panel 104 | 105 | 10. If you make a change to the code, press the green restart button on the original code editor debugging bar. This will restart the development extension. Then repeat steps 7 and 8. 106 | 107 | ## What to Contribute 108 | 109 | ReSvelte is an open source tool. Contributions are what make the open source community such an amazing place to learn, inspire, create, and grow. Any contributions you make are greatly appreciated. Here are some features that could improve this application and build upon the core functionality: 110 | 111 |
  • Storing the paths of all files which would allow the user to click on a component and be taken to that file for further editing or confirmation
  • 112 |
  • Adding render time to the performance metrics
  • 113 |
  • Tracking memory usage of an imported application
  • 114 |
  • Adding a link in the component tree to show the hierarchy
  • 115 |
  • Automatically find components in the imported application that aren’t running as expected and draw the user to that area
  • 116 |
  • Implementing a time machine that will allow users to make changes without risking the current state of the application
  • 117 |
  • Live updating of extension
  • 118 | 119 | ### Suggestions 120 | 121 | We would love to hear your technical feedback! If you have suggestions, simply open an issue with the tag "enhancement". 122 | 123 | Don't forget to give this developer tool a star. Thank you for your contribution! 124 | 125 | # License 126 | Distributed under the MIT License. See `LICENSE` for more information 127 | 128 | # Contributors 129 |
    130 |
  • 131 | Hoon Park 132 | LinkedIn 133 | small ReSvelte logo 134 | GitHub 135 |
  • 136 |
  • 137 | Martin Ng 138 | LinkedIn 139 | small ReSvelte logo 140 | GitHub 141 |
  • 142 |
  • 143 | Jestyn Apuya 144 | LinkedIn 145 | small ReSvelte logo 146 | GitHub 147 |
  • 148 |
  • 149 | Steven Nguyen 150 | LinkedIn 151 | small ReSvelte logo 152 | GitHub 153 |
  • 154 |
  • 155 | Candie Hill 156 | LinkedIn 157 | small ReSvelte logo 158 | GitHub 159 |
  • 160 |
    161 | 162 | # Contact Us 163 | 164 | Email: resvelteadm@gmail.com 165 | 166 | Website: resvelte.com 167 | 168 | 169 | 170 | 171 | 172 | 173 | -------------------------------------------------------------------------------- /assets/Errorlog.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/ReSvelte/bbb1598bc00aec9219e9d1cba844fc74d7561c0c/assets/Errorlog.gif -------------------------------------------------------------------------------- /assets/ImportingSvelteFile.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/ReSvelte/bbb1598bc00aec9219e9d1cba844fc74d7561c0c/assets/ImportingSvelteFile.gif -------------------------------------------------------------------------------- /assets/OpeningComponent.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/ReSvelte/bbb1598bc00aec9219e9d1cba844fc74d7561c0c/assets/OpeningComponent.gif -------------------------------------------------------------------------------- /assets/RS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/ReSvelte/bbb1598bc00aec9219e9d1cba844fc74d7561c0c/assets/RS.png -------------------------------------------------------------------------------- /assets/ReSvelte.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 10 | 18 | 38 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /assets/ReSvelteLogo.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 10 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /assets/Sass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/ReSvelte/bbb1598bc00aec9219e9d1cba844fc74d7561c0c/assets/Sass.png -------------------------------------------------------------------------------- /assets/Svelte.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/ReSvelte/bbb1598bc00aec9219e9d1cba844fc74d7561c0c/assets/Svelte.png -------------------------------------------------------------------------------- /assets/Webview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/ReSvelte/bbb1598bc00aec9219e9d1cba844fc74d7561c0c/assets/Webview.png -------------------------------------------------------------------------------- /assets/WhiteResvelte.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/ReSvelte/bbb1598bc00aec9219e9d1cba844fc74d7561c0c/assets/WhiteResvelte.png -------------------------------------------------------------------------------- /assets/banner.png: -------------------------------------------------------------------------------- 1 | �PNG 2 |  3 | IHDR���Y��sRGB��� pHYs���+�iTXtXML:com.adobe.xmp 4 | 5 | 6 | 7 | 9 | 10 | 11 | 12 | 2022-04-05 13 | 82acbfaa-1473-4954-9910-57a673b2f68c 14 | 525265914179580 15 | 2 16 | 17 | 18 | 19 | 20 | 21 | 23 | VITAE 24 | 25 | 26 | 28 | Canva 29 | 30 | 31 | 32 | e(65 IDATx���wx��y����S� ��)Q�J��e5[�jd[�c;N�xϞ�d����]'{�ɞ=�ƛr�8�&q�-ي��"J�$�ER�H�b�$H�^S�����`@Q 0�}��$L� �����16�o�Rε�"""""W������d5^�j 33 | �""""��xEDDD$�)�����HVS�����+""""YM�WDDDD�������d5^�j 34 | �""""��xEDDD$�)�����HVS�����+""""YM�WDDDD�������d5^�j 35 | �""""��xEDDD$�)�����HVS�����+""""YM�WDDDD�������d5^�j 36 | �""""��xEDDD$�)�����HVS�����+""""YM�WDDDD�������d5^�j 37 | �""""��xEDDD$�)�����HVS�����+""""YM�WDDDD�������d5^�j 38 | �""""��xEDDD$�)�����HVS�����+""""YM�WDDDD�������d5^�j 39 | �""""��xEDDD$�)�����HVS�����+""""YM�WDDDD�������d5^�j 40 | �""""��xEDDD$�)�����HVS�����+""""YM�WDDDD�������d5^�j 41 | �""""��xEDDD$�)�����HVS�����+""""YM�WDDDD�������d5^�j 42 | �""""��xEDDD$�)�����HVS�����+""""YM�WDDDD�������d5^�j 43 | �""""��xEDDD$�)�����HVS�����+""""YM�WDDDD�������d5^�j 44 | �""""��xEDDD$�)�����HV \� "2Yk��M�$Ƙk}DD&^��]r�M��}|i7(�Ǚ�?�#��,"��+"סL7�~`M�� c-X;t~�yDc1�#"�"�F�FIx^��q���뒛�C~n9�09��yy�SVR”��JJ(.*&?/����dom�p8Dn(��`'"�/� �v译�4�D��"�20��xp���z���解�����:;i����} F� ���O$!�H�.E�TL)������2�WW1���ꪩ��RV\Dia� ���K ��P�WD&3^�F�,X���qC_ �-�mh�\�y��>�������?������~��p��)S(+-�(?���"*�ʘ:e 50 | S��)�RNAn�_� ��"'"���� 1~��PK@ڂ6 �D�:�81C��P�D��,f([�1�h4�@4�@���}}=������Js[�t�����CkG�mm��q�KQAyy���2���9ӧ�`�l��V3cZ5�*� s��ы��}>��xEdB�8I!��X���a��;}�3��q����uu� �lj�b��q���"�L�efM-sjk�^=�������G8$ 51 | r]����hkR�6y�#�ݨ�e�\l ��2LVH_�6t;��8u�R_v�%�yD� ��}���KGG;�--��?ϙ�N��q��9z����.�`�@ @qA!�f�dVm �j��p�lfO�A^^�_�����Ed�Q�� �B��T5�Z;�[�wp��Qꛛijme � ���Pk��r��%,�3���k����l��r � �%���mT��M1á�*���1!�$+��b�5���x����[[hhm��ٳ8v����� c NZ Ca~>Օ�L����ŋ��曙5sV���;X�WD&^�2�$'#�y4������lغ����~��� �1�������][˚ի�k�Jf�Ԑ��G87� `� ���S&{��bư } 8ƀ�Ð�Lj�����DZ3�yg�.���Is{;�ڡi��ˣ�����g�{�eͪ[(�/H�k�M��=RMD�ZS��kbh.mZE�Z�c 6$�������ʛo����'[��q�����Y5��~�J�^���ո��o�CU�K��^Y�6 ��X$���v��q6��������^���%pq�CYQ1w�������s)*.�u]�����ݷ��}."���\U�,$'�=C_o7'Ϟe�����y3�Ϝ�CRIa�UŲ����r��e�N��q\��& �z\��r���8�bqN�=û{����N�?Ϲ�F�#` �� X�p!��y'+�,az� rs��g;����1��K�WD��чխ���YK$Bcs3�a�������ih  52 | �S\P����Ϟ��YsX�psf���`���tU?��� N-��s��>��p��e��) �u��y���P���{9y���gϰ��}�K.z�����,ӫ��?k7/]�M˖3�f���c�l]I�c&"W���\�Zp\�q�oj���c���>{������>c�6u* f�b��e,_��کS)-,􏋧-�RȽz2�i1���#�%h���t]{�gϡC=u�ƖB� %EEL��fղeܴt9+-������S[6�G�rxE�wv��`����z�ݽ��a������188�q�͘���˹e�R�_DYI9��?E!m72�kgt��8��?����bׇ��8��D0  54 | 2uJ97�p�,_Κ�n��� ��'7y]zlE�rR���"c/hr�Sck �~k��{���O�70@"�`���9^�D2�䘫��>�o��O~�KN�;Gdp�q0���j����ܽ��ʦ��D��;6�(�L<�-xKm�a����7����ͼ�� �Z[Ix�Z 55 | ��Y�p_��#�q�-�B���Y��OJ�WD.���Y�q�������������'�c0X< 56 | ��;s&_��gyp��d�B�Qb 57 | 9�O�Ny^�c�@�����7l�� hlm�`��� 58 | q��7���}�% ��� ���e��υ�\ 59 | ^�X2m``�:�:�w�/��ͻv�:��P\X� �����k��5���mN��B��7n�������?��:��o��ٳ� `=�����nZ�������j���|b 60 | �"rQ2N]�{{���!6��on�Nw_/9�%EE�X��5�Vs��7S1��1���(�d��1c� ���y}뻼��}�8�/b�F�^]�k����`��Y䄱X�%-Z��O�WD.Jzx��� ���q6m{�-�vQ�Ѐ����rV,Zĺ�ng��%�TVb�7f���#c �1�����x�}l~o�O�������d�<��V��6�O�!'�i���|l 61 | �"rAcFQ%����8[w��[۷s��9�(.,d��|�S�ↅ���2�?��4;W�qF���X�sMMl߽�׶lf�ѣ$ � Y4w.�n����o��r*�K�8�Y����+"elap�����7��כ���S��q��̟5��޳��o��S+�88 /bJQ8Ȱ���H,Fݹ:^ݼ�W�~��MM��A� 62 | 63 | X�x1���)��~c�wK��/�D�WD�ȸ��u���!~���l޹����BA^޽��>}?sg�&`;?WADF������������<��lٵ�X<@Uy9��y��ԓ���A"��G���H:^2^����� ���/~���&�����_~�Vݸ���������Ǒi�ւ������7�_�|S��+�p���o~�5�W����^�^2��&��'N�w�=��;�'Xk)-.���}��������frٌy�e 8.'Ϟ�o�c�޹��Hc ��0O������|��r ����q��|ED�W�z��_�\c/m������\c#�ϝ�S=̚U�)/-�Z;b�?(@�Ցi~o�¹�F�o�į7m����q�7k&_����}����q����gV����+rɴ�U��9�O^y�m{���ۋ�8|f�:�x�A�_@8�/R��Lc�< ��}���Ͼ� �<�g-e��<�nO>�fN�^B��D�c 67 | �"׉L=����[[�����3'Μ%�QVR�7���{-��Ő�p2���VFT{���=�s <��+���W�Bܲl)����ܸx�>�8�\�xE�c®��F�� ?��?���~���ŋ�ï��Kn ��z��b2!e� 0 ����-����=�}8�aVM-���/rϝk�f�=�<�\xE�X����hii�O��=�o�B($ ��|�_��r*$#ΣP ��j�1A�;���_p�� �Ga~>_y�Q�~�s�`jq��(��d�L �"�8��}ȷ���9z��`��)�<��<��Ô��F\�B�L��M0HCC�}�Y���.�}�`��{��kO<�̙31�u��.��xE�P������k[���?Ock+�e�9|�s�g�m��4�T&�1��qh�����^� �S���`4�-˖�{_�7-���c� S�:��+�e�_�=k�������6��k����Nn8�7��W�� �/�Z�#Y"�����������~�+;F4gvm-���S�s����hw6�l��+�EF�]��:.gϟ��/��ƭ[�����￟'z����OU]�>C�7��`4��б��襗xs�v PUQ�ӟ�,�|�>J� 68 | 1�PE$k�� ��cLC ��S���O~��={���gjy9����y��R����+Y/u�"tY�d1�e����hnm�G/�HWO_x�L-�24���:�!"��*�"Y`�4�@�CG��_��o8t�8�x�ڪ*���/p�]k��tW� ��z;z{��??��`����5k�����z�T��n�y!�xE&�Law��C���1M��`f�4��_��U�8��u庒it�@���_�o�{�H4��8|��;�߾� ***��e����!2�)��LR�f�&�a�޽���'tuw�. f�����o�j�rlr����z�i��A��� ���g���������?������/�Ѭ^����+2I�>T;������ӿ�;���p]����5V,^ ����r]�����y�x�y����ǹu� 69 | �ӷ�Ō��!�z����xE&���K}��m�ӟr���@ �m7�ȷ���̛^|� �^��z4���Y���l������9u�x<��%K�7���,Y��AGFD&3^�Ift?b_?�7o�/�ę�zrB!��6���g�YS�*T"��[f �cǞ=��s���#cX�p!���3ܼl�1 70 | �"���G��?�ѵ�"rqF���b�{3?x���54P���#���7�� ӫ�1VaW$����1���*�L����F�i���l}=�S���:� �����A�Wd�s(�6���{��54RRT�o<�0_z�q���cЌ]�  71 | ��?�PUQ���ihi���::��ihnffM S+*�N�~~���k}D�e=�}�n��?�#�)*����|�/|��L-+v�1zaLj7��2g�L����>�V��?a�C|��8~�8�/��&���Ĥ�+2�e 72 | �<����ink# 73 | �Ƚ���}�)���\��6�H���� ����o��O=���jc��K/��k�1��)�Lx 74 | �"��LCGW7/�_�[;v���r�b����*��U����]��gt�u�5�V�G�0?��� ���K��u �5 75 | �"���2�ow �Wom�����f���|��_f�����]�]��ot� \��S����ZKK{;�����ػ��1 �Dd�P�� F�]�\���m�/�@kG5��|��'X�d��8�JF<��%/�K�?Ηy���('����_�ȉ ��&"���c 76 | s��1���=���ăp�m�t]?��U1b�P��[�<�Ck�2�����|���okU�Wd�R���F��4�KKS������6r�a��n{�3��`���"אM$(((�_|�V�XN�����6���/���W��+21(��L$�������w9~�,�@���W�̣�SV\4fc �:F�+�� jj��'�d��Z���ٯ��-���ʸ 77 | �"מ��5�^�@W_?���i�\�e�̙|��'�U3m�"5��ҟ�cp��M�V��ß������~���Oعw�qtE&^�kd����H�_l|�_k-�%%|��'�qѢ1��)��\鳮c� ���5<�n��4������>�O��Uk����+r�YkIx;��������^�����c��� ��O"rm��)�E<���ܱr%�`�CǏ�?�!u��X��+2(��\#Z��Թs��RW_O<�7~�G� Aw�STaWdb1ƀ��VW��c�������%�0�T�U��6xE��a�BGO/o�����bܽj5_}�) 78 | sC8F�vE&��G]��,Y�������Z~��[��}�P(NQ���xE�k-qcض�=�o~���Aj���ݧ����t� �®��3:��X�ܺ��?��X���~����?v�tE�!^��$}ޮ�'���3���������<���S,^�c���)�L\�����>�8w�r �x�g����_��с5�/� 79 | �"W���5`���~~���;|���\>�v-������d2"�z��\����.s�O'���{;y{�V��(�1W�W���+��5��ڸ��o�M8f�…|����RT8r�5UwE&���x��ӧ�ͧ�������^x�5;�"�ȵ��+r���.��Ii IDAT�^x�x"AUy9��?�g��QG��+2�9�r����i� �1X� ��ҟÎ�̮��O�GEY]=��蕗iln���B�ȕ��+r�a7���xi�F�# 80 | ��y���5}&��rE����Î! p�M+Ys�-��:���}\WAW�*R��BF��C__//mx�3�ϓ��̚����Î���~/�\A 81 | �"�Q�2�Y�u�8|� �l%2e��w����j� ���Q3���z�qǡ����[���Ң�+r)��\&�!ץ���W��H]c#e�E�w�̝9 ����,��y'kW��o��=��u�{ �x�Ө�A��R���{���6Y8{kn���PH�]�뜗HPXT�c��4�**i�����ilj�ћ`�+B�W�rsz���?{��>��iU����ol{�c��`�UK�r�M7c�� 83 | �"��`))*�ΛWQ[UE<����_���c��fZ�W�S��DCۀ�q9u�<�v僚����<���䅃(��Y��K�p�7 84 | �kl��W nh�J�W�Q���� {b�ѣ�]�����`Z�&"c��^0@N8�{n��꩕ F���c-�M8���+r(��|B����l߽���r�a~�ɧ0V3wEd|#~?$�^���s� 85 | �8UWǫ�7����$_�K��+� x֒�GO��Ç���]��Y3�C�d�LF�^cx���ͥ?a��=��6cW�W�R��������>�ݵ���. 86 | ��xx�:����iU����yܲl�.$p��1�ݻ�u��xE.�� �:{���10�IΛ�'��\��7�����?��t���c��:��8��|z]���-Fb v���نJ��X�z5S����$"��%KX�l�D���ɓش}���E��S���ZL @ss#������s�|����J� "�qX�#���������������׏5z��Tz��| �w=\;��S\Xȍ�SU1,��+"��$�Z�hK�ϧ�������ڊ1��\*^�K�8�}�l}=��T�W�j�2 87 | rBCO*UwE�b������U�]}+��Qꛚ���x�{E�(��\���.�'ϝ�������eތ̨��UmWD.Qz� ���nX��Y�hhi��������`V�^��E�W�c2�`c�lڱ���^ 88 | r�m�J�K�1�EH䊱���Lb��ǘ;{6�-�Z����9q�8���ȥP������v^ڸ��p�iS+Y4w>�@PU�+e�s�Z��5����Y���g�%���r��9>8|��`t�4�}#r�xE>.kٶg �͸��-˖3��&���U`D�k�8��]�� 89 | �=~B�������-aVm-�x���U}�"� p�o�Ȥb ^"��o�M�u).,d٢E�`1��\~�L7MM�i38}�P\ ˖�]wB����[;)á1fhc�ʊr�Ο��'8p�8g�멙V�QuW�cQ��C���l}=�O�$�3o�L�Λ^bh����"i2���ez���r8}��?`�k�����/)����~�w��t�:�$ ���-��eŒ%���;4�������^q#A׽�7OdRQK��E��C��w�`c̙��ʩX/��+2Z���8 %�3������_���������Bs3���v�7�2'a5������j����q]6���x�Z�<�IG�W�#�/ ��8���o`���RV-_��C/� 90 | �"�p�yr���_��?��ϡ�>�Zi-8ؼ�xsd�B�_k�Y/���ßO����kq�����e  91 | 8s�<����O&��%r ��A�"Xk1��ރ9��D<��fj�._�zwEFĚ���?� �ŋ�?�{X��_��v��7������Z���2�^��þ�f�J�>F���zSj������B�ϞK~n.==�z�&n�q%618���kI^���Y�}� M���B�t� ���*,z���]���}~��-!U�5�?�3��C�X�vǁ�8W��zr-���@��>�s��x�"'ǜ����V��g�d�̙x���ݻ��� �VU^����+r��z{z8v�$}����ڵ��tEƓ 92 | ��o���Ψ��‰�e��M��khi�G�1��;Z��08ug 20t�22�`��kj�7sץ���m����x 93 | �"e���J��X�p���S��0k�4Ν�M���zEFI���`�?J�0�b�����ÇbO��oS��As���0�u%�ui ����������*���.����+�͝KIQ�lywRT�E&^��a-u���77�.��\��X � �,t���#Ʌd�Ƞ�b��cأ� ����X,�4'+�\x�X~ D����M�ئF��;�kY�`ee��q�������_�==��5600���)+)U;��G1D#~P�� �t����'+�6/�|������ow�� ��(�������6��k���-�3] X���� �Eo�}���\�zf̀�r����{)��Ý7��s���H�s ��b��a~��&'r�(��d��B�������n �y3gRXT�k"��������M�1�Ȓ���"���m��� �&����X�L#�R�����I��q�!����`pd[Ř�k� 95 | ��z8���'N��{{�Qg^Ba�́�Sa���vX� 96 | �U�ד�����x�z�T;��p�$���6�-��SOw�S"F_��d-E,�=���s��yZ::�ZQ����xxE�e��� 98 | JgO fϦ��ט�í2 |��J��/U1mm���~R�w\��6�W99�#̌�/��ѯ���^�BA��ğ��ۋ ����u��c�J�?~ֿ�?�<�<�=�駇����^G��7��� 99 | ������q��߿���Z��0�f�8�kC�Wd����u��m�\S�x��� 100 | �VV*�Nz�R$=�����t9 101 | ��g�v��V��:ަ�_��~�o8w�}=8mm~kC '��j����>�@_����7�[��{ �x;�?�mx�m��ͨ��� �d���#�' 102 | ����<4��5�!����k-N0�� ���Dcq����F�q���W$^� l�2���L}S��KeyE�%��9��-='��AŐ�ș��:�����;�p�q�>�ot��{�/����^0�ҙj�O�"�����*x6�$ǚ�����@K+��u���a8t����8�u]L�9�����>���b�Ц�7�_�nh��˗��ڒ??��.GM��cƴj�*ʉD"�>w�����*�"�P����r�on������f�Ԓ���ꔛxƫ�0��Fؿ�� 103 | [���3~�f�yy�p����`�|()��rjV��*����?�� g�{s3-X���\q�upC��N*B[����4��Y��~OU��@�����z>�(��Ʌr��?�_���TE֘�-��/��ƌ ��͙������<{��Vz��E�,�5�m{ws�����>�aQuW$^� ����\c#�==TWV2�f��8�odbI��(�߀_� 104 | �mt��]��{;�o� w� O?w����+��>��&$twC]���!��U�D�[1�?�#���)�5���fx Lz�M{S2Z= -�ؖF(.���<��5��g�u��ݡ�!�g��^�:��齽����s��ALA��s\�Jo"AqQ1�g�d�t�������iU�n���(��d`��@u \���<�**�6�S�hF������‹/�˯��#�!��6����� =_�MX���,�:�s��q��gd�7]�}WT�/(;y��8S�m��0��=��6=�.���]��������y�Q#�����2��Z0� �"��V�L�%��7ŒZX���Enķi�7���yn(���ո�Co�M--�=��Z�D2R�Ic�����R��@0������B�{Q�D2���;�; [���B���� 105 | �Ӆ�����^�����[�f�P�5��*�f���M���m�S8�����;�\�?>���š������>��r� �A^.����S�k/>���chg΀���j�Űͭ�M��h��x��8�_�v�8�8�W����Kd T��QZTDO_/��-D����H&zf��������Ǚ�zr�a����K��)Ø���������b1���y����S��Ք���_�5��;�y ٱ<(�/���0Ư��>�o-|��ۜ�w�� ��-�XYk�6����5Ʌ��_9^qܰx��_w��O�����s��������84ׅ�iػoO� �0���с=v {����t��u �1L)-�rJ9=}}4���űzK.����8Z;:hnk# 106 | Q]YI^N�!�蝲��7ބ��m�z�:T}�Aw�ѡ������ޱk���/�f�~_j6bQ8v�96^�Z2F~��� ��oט/�}>� �Ѩ�oA,Y��o-���~����wL;r�_���6 ]���3ja�lLw�ߢ�eWW��~3$^1k�g-�����N�Ķ��m���7��?��(-����h4Jkg�~ v�}#"�ZD�0�@"��s��<�@ ���Jr�I*�N Ɋ<{>�ǎ��� �t;���ӎy\G/���&v�s�o}k�b8���4^r�dxw�/������ ��1n�/3Su����Q��ǻn����- ���� 107 | ��(͸���@eTUAy��@a��̟�k�5�������e��0s���`���Q\ S*0��p�a�[��C�+�]]���y�e�{���b��Kx��P^Z�g-�]�tvuRU>e��<�\ 108 | �"�C"���Ӹ�K ��� �����@{�@ �����þ�cCj�� �����:t��y��(�_`Wߌ����M^ބ|#4��>g����l�G�A_?$�ɝɂ0{6�w/�]��T L���߳���$G�f^$�:O��[��<������['��d��6Ʈ[ ��ם�N��?�oS������c� �K ��ܯҦ���f̄P��y�T!��'�Pȿ�� �c;:�� �������G�sx�!*�L!'������v<��r� �D���HRz؉�b;u 109 | �u�:e 110 | %�E�/�dB��;w«��`1j�=0v�j��CM8� $ё�;:�b���|����Y�r�ͱ�ϊ����b�w]�&#��>ڳ��?�.���웅��/������o< _~���2���m�Ea6�|�C[ ����a��yӊ`38=�cGȥ�ok�����C,6�5³����U�0}��F��Zz{��@Ŕ�7:�0TTB~潝~��G�.,�[+���Dz���Zڰ��crra��;���1c���).(����֎N<�����Jd$^�ђ�����C�2� 111 | ��F�7�X���e���BO���`g�‚yP>"�p���i��~��;d�H��X|�r ���Nk�m%�)��&�����J�18v̟=����/�m �m �}�W [�����}�A`�m0��;v �8[ �N 112 | AIq2$z�`�?��{�&/^�;v��s�7��+��g�&�@�AlA!�� ���ﬗIz����o[<��H~�s0��l�90��1�f����~߷~�2l}wh3;e 113 | �����~�����Wc *�L�0?����t���f�͹� 114 | �"� ���E^N�E��� -XS�wHUތ��3~�rp�Q��ш<� v�r��V?�Ͳ%�c'1[��{3�&1�y�p����׏�����rꘊ���)�tS�O@,�_hN�.Pe}x<���T�17&+�� �}���~��G���)(>2\���|�<�2[R2 115 | �UX����z�`z?v����p�� ~�mq��C!L04|���0�^��8�b�c'�?O46c��m;���G���ͅE ��͎��'1?z�q �W������`�RX���74�%���:@Yq1y9�x�GGw7�x��e�&� xEF�������A��ɹ�C�W��ܦl ���ǫ�GZ}D0�>ϻo�+i����͂�X�`6n�//؆.��*7c�_��ž>��ͅ¢̇�/�{3��+z�; 116 | M�~Ev�BX���|�&(��ay�6����� W�?�2��Zz��|=�����p�Z������Ɍ���.�UT��w5�y�������.'��B8�I����Cq�TS?���|��� �ƛ��~;�0�\�Xx JCw�����}�n�I]��0�r��9�������6�H}�=�"�ի�7y��XKaa9ɑ�흝�"� W�E�S 117 | �"��\S#�-K� 118 | ��X�����LU���}�Ah�����Z�&��I���5Z�JY�����Q�dw���yަ7�M{�nI- ! ���X���`朙a��v�.��a`vgs$@;��@���w���}/�ɬ6�V��9�U�2�ƽ7�U|��~�_��L���d��g2�T���о����⊐s� �j�ڛ�B����/,�|r���%���>��>��k IDAT{/|��b�v�|g�bn�~�_��7tgW2X�� 119 | {��cBv����'?�G�L۞ϟ������x����� '�ZK�Z�Ȩ������,�@.� 120 | ��!s'��TJ�E:-�5hw��\cqq0፣݆��d�p � �v 121 | y��7�5�xcu��D�c�w��:@ϟ�g�F�� c�����R� �lG)../S�ׇ;AXX�Ja ��E�����}���l=/�.nP$f�Ӏ��R�QDE{警���Lx.�ۑ�gRo�J&�J�x��a�^~pdL�ȁ 122 | -�L�rl]���Y9wf�/���u��Tj���������������Q�L�4���/q]k��8�ݧ���|��ޭ��Ϟ��:������m�)����%�뿆{��;bD��#�P�C6�����W���/!iO�����m"��� ��^��kh��j؟>���f�P� �5�eg ��;ϓI}K����;�0I1^m��ؓI�=��o�fg�� ��m�ss��f"�]�?-R�3��+Kp�kQFϛl� ����Z*��>���4 #ᵰ�%�Ih��ssh�\(P-�x�r����L�2/Ơ۰^)�RP߀;�D�'E �l 123 | IH�`t��^{3�Lȗ�t���[(Z ѓ*5�)%IZ�u9.�R�ur 124 | �f���%x��a�~�#�S@:��FR�A�|�tm* )a�yү�n���4�t�܏a޴�_� 125 | ��o�}����p]�wn�/|~��@��8>|�;��/u��$� ϗ�E 6�6��N43I���w� ��u�k%�K)8q]��� 1�;�Vù@�#R~�,��"�0�~�6"[3C.S�.�U�D��%�Gf`�.� �k�s��[n���,h�pQ�0�B+9łHD���5�; �����ҏ�#�)�g�R!��,./�Y�ū��ZX$�����sh�) 126 | TK%yǼ���l�./ �}�9�H�|��T*"n� ��$�Y[�(d�kd��P�� 7�����[%:�,"�J��':���h���>+�b=O���l� �+ ��j��:wZ~���� @K��X��؂�M!�����!>���D������ş��n�+�G׃'���{���3��Z���m? W^�=d�C]����=���3�a�W^�z�,����׾ ���u]ԙ9�����TQW^-�:v\��R=<�3��/�'׉l��kijG�벵F�s�k�FK�ؑךr\Y|8�Iׅ%�4$��З�^~���r���~ 127 | u�yX_�̧�Ȟ��`jB��h�t���� �L����&���VI�R�o����x��^ �8�B��ZS.���@��%|�$�L�.�?��=}�N�O����,���<�h�TQ������e��$��߂����ݻ;�H�XyCHD4���2��٦v\x�q�����C�)�`��@� 128 | �"����n�>�י,LM �4z^|�k�~Y"�ۑP��:���W�����Ԧϛ�����hn�%y�?�.�>���6T6-�t~�-v�c�?�K8��Cz;��0��s��#�luٕp�9�iH"~Mϓ�����)!�a��q�p���73/A �݂h|�r$J���CC���yXX��WrN�s��Ŀ/��,D��BȮI�Y�R�p�;.χ�k����s�r�kk�@C��>� �T��]�w���+ �:������V����������` ��E�f�fXR4�����u�_kجß��$��t�����/���Ŕ�� ! Fb������hM�o*�~���WD�ל�Jz9-�t�t�F� ~`}u۝����}(M�t�RQl6m���b �ģp��9堳���1��O�B}䣲-�e .LZ-���A����:�C�;�ƶ�׀�:����13+���D���@��v���f$ ������|}�M����,��ͽR��m6���3O����1y�E� ���x*-D��m���Enq������n6����ؐa��:��4(-��� ��4賾�BPzjn�Vt��t�� ��{��\$s ���Zd#�Ne8IL, 129 | ���*�&�y�C!�� ���^�naaa ��E�������—��B����C�ɿ��f"`�����K�&���P!/�;�@������J�X��D��G(%�+��� q2 �R�<���7�##0>)���`bJ 130 | $5Υ�ƛѣcaq �NwG�@2���p��D���q��'����[�:*�m�S"�q��s�H)�� �X�rEt�߽'�%��V�'�a�*� ��abu�����M��lɷC���Ľ���� qUH�x2i���^K2�2�H��r�+�H���a�`(��D�VK��� �E'b#ӻ���F����[G�.Z 131 | y�s�� ���g����8{�w_�X��ng(��t��i���d���֖�~It�R�L'�Q\��������x�^ ����;S��dH���ܔ��N &jI.E��o;6�����|~�7���~��5$�ʫĩ���m����O�>�y(���+$#>�|r:��مv=��$I��C���;/��`���C�Ru�01 'N����[���}�љ�DFWW���(�o?,��?��g`~n�,��G��L�f���#�(a�Cx�sҩ����0�m�G'❆뮒w��ђ�g��|V�z�$�#k0m�,v�'amC�|/��]��� ZK����"�h��|!tr0��>U��Sx~�u�j�E�-,,:����"��j4��nM�O�>A���r�@ �k��c���ܗ��_�*�||�CQ��+�0h`�,�����'$1h��2�C=���_���{�#�"<���)%�pb"���Z����T�,��F�SÜ�� '��RY N���0Z���{)�G)�����[X��a ��E��A��*���w�Z^�U��5[��It�lB�cEi�2����� �]#�ƸV�!2!����M�-�~��Ή'�=��O�\H�O�4� 133 | CI�*�$��� ��u$�-����F#z\�̟n��VCo��t�أRmk�eY��(c&+>�&��=�>�0s��%� 134 | Y|U���v�Hh|0a��b��u~>��md(�F\��JÑ���Z�بA&'��s]�/�^/.I��V;Z���?�4��j}]��y"c1�� HL����0>�:{�>(�3zp�� ��<�7]/��hFZ�B�-$>�������_NуFC����^���j��󨧏H�x�g ����QA��ue;]kԳG��~(m���<���_��k_�hu�y u�6zlD� &Imaa�Jf�/��6Nx� �Nl��e�Bzk5t:+���w +��0��1�؁�Z��ղ̩��eIHl�"�k�������P�L���Q��;)���#e�Ϳ��:Ix3;;�6�*2.�D�S�P�1��R�O>�A)Ś��ZXXt�^ �L�7��� 136 | �e༆p 137 | Ν �� ��N����(_�$����|�����}Ǒ$����' ���d?wBz_HD�"�J���O�8<� �O�4f ���!�J�� �߇�s���+h6�Gz�0�F q~�nha4]�h^��Kոtz��:�j��Ţ$N�mzߋ�Ԏ�؞t6�o�}J$�^��%����>���0���D��[�2˴Z�2�da���Ju�:J��9q~��pgDU���lAT�Bk�.���n��D�/w�IV{�(zzF��ϣ %T�V��Q��q� �������Bai9\8����4�w���O�W�g~�JI�c趠�F�|G��)}�P�R>�l�86�ka1��ZX$�j� ��s]��m��<�Kk!��`mu`����s]�����[`�n�6��p� |훨��I���oC.6갹�����L56.�C�}G�|��#����k�M�*v� �ׄ{��f��U�~����ѼƯ���6�M��'�������r��n?4������ї"���z�!f�"#>�J��ƨo �3e�7����?��(�m��e��.��z�����m������r��8a�܍M� �~���<�����s�;�;�B�,�E�K� ����`�&zh��7���� ��N�w�c�1�+b.��p��o�щP���o��m��ja�����a#Q��绛͊�q6�Xk(C�nx����D�u)����mn���E,ᵰH"��}y� 138 | ���s�ZZ6�71E'(ѯ����X �<���n�˿�6�$;QΠ-��@m ΜF�R�����iQ)h�ak 67$��|d��o뇑�8�x����X���/D�K_鲉��\=�� 139 | ����6�¿���Op�5��ξ�4���L��M��K�6[����m# �\%B��Hg�ܳgQ���N���I�$�6������*� 140 | Cx�V���[��,/�\�R�CC�%�z�1��6~�C��Q����//Aue���M�� �M�;�Vr����Y���k��AؽU �.�u��w�x��-{^D�cϳ�?�Z �}�������(��J�G�P��Z�r9�8��& �y�K:�B)��f�� ������¢q��r^�b8�Y+��O�w���o�[n�$�t�1}ݳ }� ��Gv����Z ΟG�� Z�����fΜ�#OK9�S�D ��&� R�l�>)vq��05z��^�y)H�+Ī�K���oDvO08��CʇG������o������CIöH�">�B�H�.�HW˰�,T@�c.'���ٰ��`���� �kvn�IJ4��M�`����<|�hY�m�՘���8�ss�[Ű��sr��#s\�� 141 | ��zp����/ʳ=�q"6':��k���;�Hz� �~iI�m� ���v��� ���jm-��;�:"�����%y�%��e�f�n#�}` ���@���H/ 142 | Fgx�l�{�b]�ŷ~}����Wu��UJ�{Ţ����t�h3��y �o� i+�]Z����/�N�O���m���߅�G%���/i�faf����n�᷈�8V���^k.�V���?!�B}��d���a�Ƚ��c������x�������h���Ll+=6��0^}�e m���\N��J��z� ��0����R*W_w5������*� ;ğ"]]�nnI��D�GK�������4��s]7��"���x����x����A$�����ݐ���R�,��:�,t��FG�M����:�؊-�����|FF#iD�y��7�h�d�ea�*�%���y � ��C"]�j_�Е��C6�'���#J�#���'İ��( )E 143 | ��r:Z�F�%b�..I�>#}]Y��~>�)pP�����W��ҳw/�گ�ŗ�* U��lc�fأ����!T�����H�@� ���p���H��o��"�A8�P���n ����潫xAh[�_s=�r��O <�OF�Z��M�gp@}��.ߗ��g�Bb��ͣ�8(�\ߗ_x�TX��n��G��#�x? q� �+�ˍô7l�`�ط��7�՗�s�[d2��F�_P 144 | ������τ��o;���¢��ZX$a�Y��^�A+��(��x�&a^���##��TGP�����$2��٬D�ѯf6օD�_��+�?�C��g$Q"rՕ�և8��Ο�?�������aϞH+�B5��s��p� �_��蒿�e��7[� X��Io<�����Q�����htܖl t� 145 | B���.�e����������@�>*����ڒ-���h�Yh��á0�I1/P+5ԑ#��� d3Q�7'L�[_��wyE��k�!�>�#~�(*�A_vXc�-�w�w�ǟ�SL$6}f.:�b��d��P���l���J��!���oB��VI0�����D ����}o�TD���{;�/Z�9Bx�4c ��E��ZX$`^J)5����/���-/�!I:��*���x��|��Eص[���8{n��]�p@)��7oL�P���807������w�8��?�q��D�k0>��+R!�}!K���x�΁�����|� �� R������v[J1�����a��ؽ10���z&�u���m�1�����GǪ|A������ҾFFЌ�7)A��뮁���;�yH�\U,���y6�! �@���<Þ���qn��=�g�}d. 146 | �� 147 | ��J������{�jR�>����n�- BX*%!pA ��&:�2D���8B�~��s_��5,����8�TJ"���,�t��}�9�{��*Y��?�aI���OJb�)����Wk��}�����������:�4��� �ҝ�(ʁ\����%2��`"B AS 148 | 149 | E)��8Rx���� 3����o��P˫�O�ڒ9)aj셉1t>�+ ��j�AԽ�Kd�ي�� �2�.6^a��G����v����+�Y[G���\g{��V ��E��_�;�D}�.�j ����m)��x��oy�8h���͍�s��@�H����Bb���%�Nwf�����%� 8�-\�M���$�K�y�����S'��~R����(ዸR��������,jq}�/����@�f��\Ɏ# T:Pq� ��>���4K�ӯ�U�ϔ��� �H�4b��@z{�������\F���Q'Ow樟WoW?���W�?굯'N�4�v$i�;«�T��*�zU,궫��榲9ȅ��M8r�ڿBZ��J�'G�#%)�P�������+��M�� 150 | p� 151 | � |���,�t����)%��ٌ,F|��/�s0�0'�m>s��%�;��8�m�a�,��~N��u�TJ�Ǟ�gP��o���"��^*J��p��u7��Y����w�N��VP������쎢F�^��J�iaa� Kx-,p'��i5��;� h-ZصU8q�;;�߱�#���q�ݞ������jP��O`ccx�2�ղT�2[��� ��=�5J��V�'�� �1���j�EVO4����A�[R�uzZ"��p��J��ݨw��N����c�w�C�>*�=��1�W���G8��ۊ�4 �&��>��޻u�������܁��S��5W� 9��P��\���P�?����1�� V��5_l�2���nbg��8�Π�#03 G��>�GU�y���nHN��Ex��,�V7`��}��A��*3�}�A�kl���y.�����u݅ ����BW�ps�俕��@G2GE���4L�����4�b���;t�d�fdT��~�X90REML�&���ך Lb� ;2]����"'� ��V����vq 8uz�m`�E���d�JIT�ٔ��F|B]_,¾��B2�e��#�K��DlSiy��˶^���ǟ�Tq�n��� ��^#��u8�,��DŽ�����<�z�^Ⱦ�dzQ��d��R珠Si��?�z�)IN$+������g�w߁��ab2"ŭ&j�[LҚR�rap�Ƕ�9���)Էn�hS��&���;wHվ��IkXZ�D��d�r=�|��k-�wy&2)�P�J���� �)q�؎�Ʊ��z�1x��<�Z��0 ���Sm*� �3�����>��� {fae9څ�D7����TD��n�� 152 | ��C׋LF"��n �0����wB+'*<:�*zg�u%�;1!��8v���罱� IDAT���� ��rX�ka��H��H��K-��KK����Ջ�J%yi�Zb���P'O��D Eٚ~�A8y�' 153 | +���Jn�1�P��d��ȐR����0{~�7�+Kll��o���=g�c��w�� b@}ua}�$�XB��!Xq��B��Dl��W)!�oZ)����̳r�Oӫ�6���sϋ/�����$I 154 | h���^���O��'� +���/w�Wxu�$���fK�Qs����\�:���L���H��b9*e���.�>d�( ̝G�~|��B�wHv;���Y7��q;�0ɬ�>9!il��VՉOG� 3��L��@��]#n ��B������8LM�WW�� X]R_,Ez฼E�(�� 155 | CT�"�/�bI4�ɄD.|FGQ##=d���u��A@;V���ia�ʄ%� ���"��l�{P 156 | �M)��g�x����Mx�)�#G�p��ˋ�CN���륬�u7Iֽ��OIu�8iH��oǎJ_�6N���6]��]vP����.��~ԓO����0�D�6�r�����: �n���q$�2|���L9P���Vk�?��4�k�� Pې�!Ǟ����~6�� q�k�-�����;?�$�ٵ5)�b0:&>���:"m^\iO�%�����#����ݻ���e�����%��|'�Mוߏ��|�Y�\�nF��Dx�mXXXt�^ ���A�/�K3/���=�����.�rP�B�~7<� ��5D�_��ڼ�J�M�w�󹨘���3Yh���3��}�� 159 | y�� 160 | %:"_���/Ѯ��{o���2�U��>w](�ff�X9��P�7z��ֻ^��A)Te��>x�8��'����lJ4z|ΞA���&�"»�F6��x_XD=���א $��(m71��"��h�B���mXZ�����" Dú�gN�������d���Ư�o�=}I&��'�o��+��j=1G&P�Ί_��,:l��\���z�������}&&az6*�⺨JE����*7�?�-:�cJ@\��mo��N��3g�<�R�C�$qg�^@t��uW���¢��ZX$��/�v� K��[�/J� �ȑ��]�3iԣ��V�VLp)�܆�d���� r���A�����LV^�M8~VW�r��y&�.���I�����{U'���ݾG�VV䚙�$H�;���� ��r)O<3+��x���E'W��������n�����e� �TU��~q互`��8i���'��a�I,\ �}����u�,��C���V*r�7Pkk"���\D� 7��V17�>�f>�{ ��˼�e�I�f�{fe���% �f[�Q(�3���sX*�]#vk��S>�삑��DP���mvV�:�χ�����x�{����P��L"����}�d�"I�K��XX��^ ��B4�Z�� 161 | ��̀-��e����w|q�d�o����^G�v�D'K%�ȖB�`��J���Q�������)AR���W*%/u堂�d���'�iO��˃�ə��B>*\P�ұ��z� ��� ٭���l������������$3�GsF�����y�9�ZH�Rb?U� 1\����^���qB�:��:ꁇD˝Ʉ�9���d�~�F�q%�]������E�y�A�L��$$%%I�x����R����|sî1���A�����2^;L�D����J$���y��y�����&���C�,d�X�#�i�Ԕ$�)���Ы�"q�X��~;� K|�\�j��J���/��ƺ��Ɔ�^ �^X�ka�@*��U�f�Im#4���V�v��q��D�����f�G��B�Gc�G}����)t&c�bKe��z�&�\X,g�$^����@x@�"�ӹ�o~K*��gP|ܙ��c~��B�>�y7|����煺IW��=�,����x��$�ױ�����PVP��dh V�evқm!�"��^�D�A�Riq9x�Q!�Fҡ�&�F+��W�T�jn�x+��%���RD*S)��-�h'O�Ϟ�EG�3�ݻZ��#������-U��3���i!��|ϓ��jU�qmM�H���vx��X%�TZ����w;: 162 | �"��KDL�Z-6�ҕa�h �W1,ᵰ�Ck2�T�4�M xi#&Z�SOm��żT�#K�'%\����h:�j5$�.\Xo�a���#�5hK;��5����_����!�}��ZK��� �>�9���_��3�L�tZ�� 7^/��iz���D�C�d�WS9p.s���5�B�66�R��Љ�:�؄�=(Q�tZ��T�*��o� 163 | yԣO��0ZR0�WF���z�^)����=2�,v�L�i�|�;�Q�����q/]9�O���S�{qEHl�%ψ�J��Vu;|@�t\I�#���ؘ�~zZ��ZX`ø���2C�}O|� !��a���Ą�9�?����(#0 w�vsb�%���C�h����$&��$��¢ ��ZX$�N�!!p�j�i5�x����;�֒��Kb�ҕh�g��б�R���|�Z��$TU*=��pAHV?�Љp�4�ߑ�U���?/� �T��N�<�LI1��8��K*��r������������B�.�H��hJ�n'�|�d�tH4��0:�͖?�<�cT�? O>%}N�PJ${v�-7��x?!e�WV#W���,�JYl���{�˫(ׁ��D��a�=O]�1�3cM�г��Ŋ.���ȓ6�B�r3�p=�/�&���A.#��JE�i�,��х%v{��P������2ٰJ�+�3 .Gu<�;%����8b 8>!2��m��~Q�~d�ߤ��r���M�֔ 164 | �Cx)v�,,~�` ��E����+��-6�[� 165 | /1�}���޸!�Y�$���E}��4p�=��T_��Ȇ���-R�ZM���*�Zd��;}T�5H�|Z��������KD�ym �߾� 166 | ^ ���T?��3������p�Tw��AH�06��~��ݹA�v\�Z��]!jN�y B]�M��بD0w�J����72��i��a�U} �9��� �,��g`e��Z�<]�^��I&��q�:#U�u���W��]�)�Vki���cv,,�� ��y��BJ� �5�<��V*0:. ���B@���>|��/ڋ��F2�c�'���ɳV*����-�h��s0`~z��?��V�F��z�@kʅ���ZX�%� �S))/���-6��(���EKL�ڱc; b�����:(�k��K��|�_��Ѯ:�����¼���%bf^��M!ff���X:2��p?�җ����|�Ї�KT2�3��p�T���|)� �?'�Ggs�\���пJ[|!��~m(W�� 167 | jm5��gF��Hx�-Q�w�}�����Y�p6D��&�s'�����I����O]udAd��Z� 168 | S�RJ����rЧOI���4����_*-��R9*uM�\'�CM��¦ـR ��&�s��`H���6L��<ł݄��P]m?�O��h6%���E��fa���ZX$����� ��٨�_���RR``yep���5�0;#���G#-e�XS��tƎ�� ]��z�"��0�LvX��Jӷ�]/֎�41ޮ���n�- J7��(yO�.���S�����@;. 169 | RG%Z=1�?:�#�������X$1��Lfa�:�tZ�S'?)�Wsݭ�O���O��&��$p�~uF"���R 170 | xi ��"�h�*da���͉�q����g��s�ʰZ˱Ͱ��y��)!�ٌ$#����(zjB����pF�[A4��+��BF �tݐ�:���1E���¨n*-�8N�Pj��I�Pm쾌on+�Mh�vD_��4|���_�>mW�yl���Ӏ��Q٬$>es��f1������GU��f�5 �Q�2">��+�otT���J`Jk����}t:-D�0�ꊫĵ`zR�V�� ]b�&߇���S�-�5�A�cA��%��g����O��u_.��x��=~Ğ��1���ǚ��lV�K�����l��F��V�jx�6�ka���ZX��H� J������:$�/��D'��d�|�������b�?; x�TY{�i�V].¡�p�!��XD&�P_��hR����q@����p�DySYX[C�8�r�3og�~���-��8�g��V��Q&�Έ�����~�QJ��_|\�����I���xo56��}��g�?�����)+���h����H�g���<�������޾&��Ju�:~l� ����Ǝ���>ndTȮA:$��vW���*q=*U8|9�:��h���J:%zU�sjW2�B!  R��XBML@�,�t{�!勿mEt���,̣[}�v�ٰ?�+��1I��AQ�K�P �+�lԥ*$P-��� �^ �(����B��5�:�8/I�p���^�Z��qH�����{��{jsC�1ۖ�D���Q��rW2TW�q���u !�[[�yTiD�Ȗ�D��H��zv����Se��!M�4��+�=�L���_!ID��{�Vo�"�)�`����~VFЯ�9:E'�b뵰���FE+��+*09!r�t�3e���&؏��*��cݚV��L.�$8�\B��{�R��j��Q_WiWUGab}� �j�v�ҝq�H�P33p��؞���%�{+t��'��9gh��-�Qcc☀�O�����̌�-��NN����X�5��\�v�X,@���M|m$ZA��e�-q��. }` ��E욞B9������t �[Rͫ��_�!���3��[%��T}� *���Ag��Ry{������@���Dv7�PG�����q'h5#��U\�2zz���8,��ɮ֢�}����n��t�x�������k���eѝj�D_\+�O�<���.���uW�SB|> 172 | E!}A �����ǓOEs7H{����f��z�X�� �����H�Ů�O����WW�[[b٥u���H$8�?Z_,Д�s����:� �2�TJJ���"����ƑN�vxl��u� ?��;�ŋ�KG��Cg�C�� 5�O�P㓒����q!����X�R��4׉ 174 | L� ���������8F����A���!�:rAg���Q�� ��ѕ8���B��@��F�Tc�e���J����g��N�p�Q*�{�e3I�z��n�.�0$��65�~�k���Q,I%/C��)�����~L4�f~���:���`l}�5pˍ�44�H���}�h(����#�FwF���փ"�⇻�����u���o�:�[�b��\��U��,$�����X�ְ�hrqe��f���*��e��|XXD���¢�j�D.���j����z�N6��<���»���~�ua|,:�q� �GF�B��݉Q'Om�>���脑Wx1��� 8~<"���t� p�C��l��r���酉Xg�B�-�� ߽��A,���(�)F�E��9��$��)� �G�� p`_���4L̈́>�a[٬|����N����R�yeE쿴�>(�̔ة��%�Y��Ak��W�[L�>j|,�<�3O�q���J�/H�x�. ��u!�6��H�9q�hq�T&#��&��x���-{��h��&˫k��X�[X��^ �h|�cz|��gϱ�����&��(;��#'�8�:Ex��}ա����v�N��e��,.Jt����Y�Zmx�hoG�"��oEdCC��D���"u�HK���\Il� 175 | 4��vH0�Q��D��c�ss�O�WW�]�����V�rŃ(��sP�397�Z-!�o{3\v�ןwzF4��m�G�QD�u�mo�r�w݁:~B*�Z�m����J,"k:����ݱE�$�Q�*�k��N�F���5Vו�l�{� �fwR�)�h�Cy~�s��j��}y�P4� �76���J�L&������UKx-,���󘝘���3\\Y������T 176 | t[2�7���[Ю+:�@GY뮃�P뺨�It� ��'��Zm{B�yb�e�\R�����aTǁ��_r�J�v3�B�r�|A��<_�^&+$��;���] :�:0�0�nz����Uԗ�&�����>W�w*bdސ�v�\�~�0=� tzt 5:�M*�iI���;�k�E{.z�IX_����ɡ��Bjw�J��%_����u��`#�I 177 | �$ 178 | ay������<����ZkG������&h�H��o ��E_X�ka"ns�{{w�����cqi���u�$���R��� t6�f�#�tb,JJJ�"�*��r]T�,��VK� �F� 179 | �&Fx�ֿ+������K_�V�kt���1񦝘�T�RŢx��� � I���E=��Du�-�Ȯ֐I�o}-욁�Q�O����ÉS2'�D.���������[^��6J�3�/hC� 180 | �{b�S��P!�g�p�5��G�h?&l�C�O��$*�ww8���1�ȿ�$۪��'��ǁy�[����j5|�c�Z���h��A����%�Ih�㧸|�~Z�6�f��q���K*>a��� ��4���K5��Z�(n��qa�����L� v�8�����DZg�"Bm�'8.�����Cr,&BhH)�J ��{ѵMx�-bE�ˉܡ��D��< ��6<��?��"��$����u�o�^s�X��v�"��P�܇z�I!ͦJZ���1�M�� ��һox-��+mţ�A v�B��@>/��H������rp�(jeE�k�%�4�\�rU�M�U9�T+���V_,���� �������+kk���0^�u�*z]����" (�e��,���l�87?�fc��r��4Bv/\z �ib<��*���)�r�@����� 181 | Ν���'��:6jבȬ����K_�D�{Z�Kԁ� ��w�w�"}��Xv��ĩ��Hja����*�� ���~��a9�0��݂�З]�~�ԣO�N����LHOE1�on�$�ꮾ.?,�MSJ���.���#��jtT�ҡ_2�D�0r���'�z�k��5�sA9��%)5pC�;6��W�x%Cu�v��Y]_窩iƪ#lS����U Kx-,�"�Z*2;1����-̳�� ��� �.�Z�{]X����r�����B���FHY,���,XZҷ����1����|������$��X��J�g��w� <2�K��wo�ǽB{�|^s�}��F��r��]hσ���Պx�.�ʟ ���Uq<0�,$��lF$�c05.r��>k-s��P� I�^���|�#5�܏�-���f���IXP赚X�ToU6����Qq���^��W5�㰵���� 4�MF�F���W�>%qX�ka����<{f�9�0Ϲ�y�7댔J/L��qS0�K���Wܶ� IDATR�����#�N�Ey��kkE5m ��GrߗH콷��}[���v����&#���eW�Ⲉ��k�"E��zȦ%� 5���Yq�P 182 | ��C�.�TBPbkV[Gol�m�"����m*%�`٬\/���e���dPc�Bx�d] V�SR���#6���BA�ZY���hDe�d!�Ke4U ��ŤV#kaš벺����2��0V�R,��ݧ�ZX|��^ �:�� _(�{f�;��5��k(&������������}j ����`*�U-K�����j���o����B77Q'��ÏH���t �t��nIG��@��Du�C�����+峕��׾�ӨJ56W>��e� >?��2W�|��U�H:�[-��fbLBt��%9�\R�W:�"5P�nl�ݑ^Ļv̗��M�O��~��z$ ��X@�������E�e�����N��9���� Kx-,�@~:+%�5lln���H���\jšR��. e��k�\�$5?����0�'$+<.��.Nѯ?�ڧϢ>�%!o�k"gD�Ux���f"��6w�}�W��n������7�B`���<&�$���|��4:�ya�����`sC4��& 183 | !�=�7m�:� #�%!����q!���{����Ru��}r:��١c�֭ �a; !���K�_\�T(096��veda1��ZX�G�O��V��8;w�f; �]��F"���z���;vl�ЦRa�p��������j�X�@��� A�A�c�r�����"�̹�����v[��7���=3 P[ �ɐ]��Q���o�>�J*U!ܻwKD6��n4P͆8D4��fK���-:�l�/RiY`��ɀ�ĵjE�������(]��~�v�%��Ap����+.���(zq���3���L�ۏ��T�M��uW�KE�|s�{A�5:��]{PՑi�*�`j:J�K��Z.�����P�`��p^Ш��W��"����rBtK%!��Ƴ�H��A�Kt-�0�K�q�X_��(�(��L�O�r����X�ka�@�e�j1=1���4O=ƹ�j5�9�d�ck2��IJq�Ԇ�:>IRau2sL*%��Qg�D�={�k�λ"����IA�.\���A������|+��P��SR���B5[���Q�v]!��2�� �9WJH|��M"�F; 184 | U,��� 185 | c "��س�/�W��$�-]����!VD"�-]^��8�qP�+�>>!R 3�IM� !I��`�E�s]�WV8��sd3vMMQ*��ђ] ������b�A@�Pfvr�u��p���yf��.��4[p��dœ�bІ�z^T� �$&C�ҩζ~_�ď�m߁��H���t2jil�.?��������2��*xi��4�t��J��$:`�8��B I ���X�CW�~�f�Ag���q��BɲÅd7��Q�^߀�js-t��"��q��������CBW�F_-� `�.��9~�4�l���vQ�e�q .�#���UKx-,���=�LOS-�87?����.;����Հ�g��bÎ/������"c0S��O���ҷ�_���_���p~��v��bIg����|}�u���Ȯi&��+���g`~NH��Մ��+�����0q�b52��'���*�$�-f��>t%��"G��h�Z�Њ�-'�.J���q**˜�At]� 186 | �dt��Z9~�ͭ-F*���"M�d�¢?,ᵰ�)G�gv��J��Os��y��6��ؖ�*%��ͺ���m��HhX� �,��m�+�Ew;-�}}�6���ĝ�c�P�JJk�&&���<{�ϟ9��z�l��s�榔�m6�l K+�љt����u}�8lǁ�4�N��#x��@V��!y�zٌD@�F���R�"��./R��ezF�i��d`f�/HA�+��-hlA���H�u% �� �Ag�B�=��L�h� %qc(��;A��w��7�6,,���8l��<��Sx�Ǯ�I�F��lK �$,ᵰ��@S,��� �J����,-/3R� &��7weY�����#�4R�y�k 189 | $��0ǁ7� ]�÷oC=� �/���ٔc�(�ZA����(�sQD��\^*�nYF6'z[וjm��h�6�"NHx�#�:��B�Dc}_�������ہŏ����ɳg9;?��y읝e�RFYw ������b�\����q�����p����@)`uE�����]?�|)yk�#^�!��������l����һ3���,��v W�S"Y�Tq ��W3��Q���ܤ5X��wI��ʪ8#�����t��F��s��@��*!��.雄}�[��5w=���gv�L�P�cI���X�ka1���\v��l���y�in���a hq��ݚ֤�HtlT"��+QXMTvv�5�Q^�~:���*��>�`eM$�}H�RBp�g�T����Z���w�,P��"��2� 5�6��9�ƭ�qD7\,�3B:�2�y"��!��U�н�߽�53��ܳW� 190 | ��NXX �%�C�� �#��NNr���~�!���� ~<�lffa��>�\� !FN��]309��\����VK������cd1�����L������j5#�/�A���P��1��v��&�g!�ڷ�]qj�Cy!y!���0�M���ȸR��Z�^���,ɵx5C��&�ϝ<���Z�6�w�ⲽ�!h�Sw������ZX ��G)&G�\��>s���;ƅ��=;+ %��� 191 | S��w������ypTg����{N/�־ ���jv#vl�n�m��ƃ}��w�$S��T��TR�JU��[���TMRs�x�3w<�xl�c�f5��!�oh����n m�D��T�$Aw�}�����}����'�Y�L\od v�t���L(t����#��{�J����mc��$�%.���hJ�x��χ�̂���tW�cv�x�������;(��\�xg��}��Dp��Ç����i�u]3"�B�W�[tm������# ��4�����]�8|�է4_����S֬���D� 192 | aG���R(*�Y׉o�е���*z�w��b���BJ 193 | f�Plb�x���b��y�����g�P|��;��-sp{���-��Zd`C4c�ô��1$7��'�hB�Z(��\AW؍�R<���y�\:���;w��3�^Í$>��~�gb7m����(�pr��=�=Ca0ҳ ��[�r���~�ޡ 5�+��hl���v�zf/_�{�Xb��IK�� ��1��k��"r��A��…r��XN4%?7���ǃU�� 194 | �"Wc ����,*��ٳ=}��� 195 | ���&6I�֓���#ǖ.��0\(�WI���StUr��Ê�3t-p���}�ڷ�����`r�ħ!�w�+�={z�s1�`=�3��Ou�E6~�)� %Æ1i�D|���� R����FU2��'����Op��q,������\7k�y�GN�"#5��S�0477�0V�]���+r���,� 200 | 1����!y|S^Η����ڢb"rc���F���Z㐟�����J�� "7J�W�9���4n<nj�Ö]�(+/W���u�n�8��:̜2�q#Gb�������+r�N8���#3f���Ι�2���M4����D��t?GC{{o|�!���fe1w�t222@� "7E�W�&c���L�0��Ç��;��q�R���"rU]a�8[w����3D�Q���C������F�W��(���k-�q��<2s&�@��j>ܴ |��7!U����"�]����V2��X0{i�X�)��$^���u��L�8������ߧ����\�Q��z=78.�v��Ĺ�D�QƎ��� ։��O� 201 | �"7N�W�u����c�������~.VW����*�""���/� ͗�ظ}55�C!V,^L(��^&�� 202 | �"����B!Ξð!C���d�g�P^�Q�WD�(l߷�݇�y����K���/�E��)��܄^U^c���=u*�@��ee���O��4;SD��6>l����/v��` �_�\IFzF� d�]����+r�.�)� �~�;dgd�E���;} 203 | ����+"�E=��G����:;;�5e 204 | ��΅XTAW�R��E�1�yL?�����p����_}EkG;8�O^ 205 | �"������/�y�WT�֒��ʳ��驩ݗU��5xEn��'%����]IVz:�h�M;������zyE�����y1 �f������3o�t�M��ݷ+"���ȭ�y�>��+V���AYE���NsK+V'2��p��� _l���E�ssy������� c��@�W�����X��c�-)����M_}ű�'{UntR��3�=k�?�v�`�p]��S�0���1�UM�6P��E�'6����a���b�@��� 206 | >޼���F.o��+r?r|>�j+y{�:.��2���'��'/;[� "����m�X0{s|������ˁ�G�%/r_���Ϸ�����a攖2}ʃ�Ɖ�{A�]�[M�W��9���b ʲE���Dž� 207 | >��sj��A'3����p��s������|���ffb� 208 | �"����-�u�r���f�Ng�ԩ�|>���Ŏ}���mK��F�6�h$���}���j�~? ��aҸq]�K�P$�)���f9YY,}d>���4����>������{.f�����v|l޹�O�n��,cG�`��Ť��{UwU���xEn�^U^���)��?s&~���Ǐ�ʛo�/��+��z��PVy�?~��Z[ �Y�h�JFb�Q�]��L�W�63֒�����0n�H,�ކ lݱ��_�uI�W$i�;���u��w��H�i'�z�r\b8�N�"���2�ۤg�Ʊ1�M�ȓ���������������8�B�H������v��͛i��dhn.���3��`�˪�+r�(������x�Gyh�4���Ο��o�M[g Ϣ�+�$��e��p����6~�Ū*>?Z��ѣƨ�A�R���z�Ĭ%3=���y�!99x��鶭l۵kL�� 209 | �"�>k-�lڶ�/���������z�I�v*��A 210 | �"�Y���c��I�^���RY[�{�s���8 211 | �"����=��5�?v�5�6�����a���g�% 212 | u_���+r(���}Oh��\�#ӧ�F����n�HcK3V'>�{V��$ץ���w�}��s����%<8~�6�� xE�4k���䟼�#��hlnfݖ-� )�nmP�W��d���y|�y��� ���i<�p!�`PL�� 213 | �"w��F�8n?X���P��� 214 | �]��o�����(��z�>?����K{G�� 215 | X�|9# 216 | q��#\� "w������f����;���G��y���e�gi�踋�RD�W��뺴�\���_R��@j8̪'�d�ԩ8 217 | �"w���Ի�c�M��<�� ��b���Zv�ك�c������h��{�7;}����#�g�������^�SuW��R���z���<�Ç����(�ϧ������?r�� �Q��z�����7m� p�EE�^����!���+r�(���E�1��y�f�ؼy��B9y�_��*Ս�X�]�D��ǣ������H���T~�r%3'O�x�^���+r�)�����y��d���O2���@ ��۶�7ޠ��O�Wd��:"O�;ǫo�MYE�����yr�������;O�W�.���`�et�p^~�9ƍ�q�ݰ��7�#�hr�� e�����7֬e���D���?����^�d 218 | �"w��� `�k�:q?]����4���yc�Z�ص����"�@�E�1�r���5�}���_p����Ӧ�^"/; c�^/lE��Q�������X0�a��~�g=.VW�w���ɓ���E�_̳�pؾ{o�[G}S�G��g/�%��vE^������Z�a�����U�wtp��I~��7������ ��Y��s��a~��)��"/;��ZŔ��Z�\�AF�Wd�U ��q�'�W�|�b"�[w��wo�Iu}S�J�B����w"����p����� 219 | 'Ξ%-f��,zx>~cz�S�xE!������^|�9S����p�f��h ����f�*��>}�/�8�TU�?~�+�:DZj*�-�'����"���� ѷ��F#�(�OW���ѣi����5k�x�gt�b����+r��mc�����߯�ʧ۶�0o� ��g�����*� . 220 | �"��1��D��K��I�x���(),����W�z��۶aG�D�k-�j���[o���I �:~?���Q8,vrE-^�A�g� �\�Ϟ���/gHN����o��;v��~X�W����2�a�kj�͵��O�Ec�(*�g/���1c�-RS�|xE9��SRX�d �<�8驩\������/v��5�z� ���vå�6�[�o�����fr23��?�!3���ۑDd�Q��Yii��r%�-�u]�](���7l��5��B��-г�k=K[g���~�k�RS�@j(�����G���XGaW䞠�+2H�=yZk����o~�c̞M,���2~�߰��a�몧W�&�}�$�Æ����oRUWGJ ����Oyt�b\�]�{��� �s�1<�Դ4����{�͘�g=��=�/~� 221 | ���bzEn@�cų��`��������چ�)A��~������S��=F�W���jc1��0�����yӦ�Á�����^�ЩSx�*�\�^[_��IDAT �,D�æ/6��_�BmC�i��`�Ӭ|� B>��uvE� 222 | �"���J/`#�������9��8��W���C���X��=+"��������n�'��?�U��������G���d��B��� 223 | �"�������_�����c��z����r������)/��b9#��S0$��lP��E��T����7~�/_������B�X����}���<m,!r�R���� ���ΡdX!U55\�����EN�=CqaEC5#T�[t��mji�O��wޡ���@ ��'��V���+��8�g�٪�:E�1}�D����3���غw�X��#F��?�1�f�Hly����܏���x[Zyw�G��f ������O�_���ZAnF�^4�$^�{T�d!f��� ��+���Ν�*ο~�e?�P�u��U߰k�Ɩv���}^_����|>���yv� 224 | ��~��cF�ޤ�+r�����������ٴc>������8���]<������ D�8�--��k�͏?�����`���яxz�2�:VD�] 225 | �"��~'r�GgG;������[�����H�ϭ�e+H�0�^ :�K��8 ��Omu5��W�`�F|�KVz:��/_⻏���{����{��H�z�����}�5�ٰ��K�H �Y������ ��V{�$���uc��8�/^}�m{�NIaxA?~�y��p)>W/E���H�9S�8ͭ������i�Z.VW�.O̟ϏW�f�����+�J�W�5�֎�w���='Ϟ#%d�ر��s�1�\|���9�"II�W$�� �å�v>�����>��9O�z���J��{�65�n�f^{�}.TV�:�f��G��S'L�qL�:D���H�>�'�n���޽�9p�8��1���<�4K��'=5��+I���>������?���7RS_��8�X���Z��1���1'��+��xE�T�?t�b:v���{|�m�㐟���G�{˟bHN���=�oص��ة����ٶgM-�d���Š�x�� ���jj��}A�W$I��3���*^_��W�~�!-�G���?OIa!x^��)�`����9>v����y�U��>M{GcF���?Ϣy�I �����c]$y)��$���7��-�y�߼�������� �q�[:���2��0���6o����]�,o�����_Q�؀斖�/_z���������"�N�W�>�/���:r�����g��c�b1���_���>�)��hG�e�;��:������ț~@j8̲E �� /R�����Զ#rR��O X�u]�_(��o�ɧ۷�t��uY����b��K�;�] 226 | 227 | rw �8������]����_��ɓ8�0,?�V���'�$=5 ���uE�S 228 | �"���#�P����?��>�\�:#7����y�f�����>�@�Af�Fb1Ε]`����'�PY[K(dʸq���s,�5�q4oZ�>��+r��9��bh��d��}��v �������\�7�K����Ѥ�}����y�&0x�qiima�޽��~={������l��?�g�\�#FbT�xE�[U˰��e���Z�m�BM]i�0njaْ%<���deea�X��^���zΕ��lj3��hӧlض��UUXk?j��/g����J��ؘ®� 229 | �"�����P��ʖ/�����ӧ��|�fe1�,�_�� c���耷�P!�€�7�C4�Ϸ���u8v�H4J��g��٬~껔N����k�q)r�S����^ Q�q��i���������]�1%%�Z���˗�����. 230 | r������L�y~��;|�m���Xk�����˖�l�R 231 | ����) "ҏ��Tz\���f6l��o�~��/b�% 2�L��Ĉ�b��4�WnڀA�u�D"lܾ�W�z���������9S��^~�����&Zr4MDD��+"�� ƀ1�8s�_��u6��I[G;����O?�SK������]s�ބB� l�]Ҭ�q]:c1N�=���g�}�����fg��SO�U��`m|�^���cNDzR��~~K١���w֭��us��Yc0�0k����̜:��� ��8��&W6�<]k C�g����'۶�?����qH ��9y2?��j�N���o[�3�K�WD4`��������������Ś*:;#dgf�d�\�\�� L 3-���mf�c����L]���z���ɇ�6���!�1��B�9������%K����F�z\��5S����P�mlݻ��۷���*kj�<�QÇ�`�,��_���b�é���}�?�јGUm{�m[ٱ?u�����2r�pΞÒ�fL��ޛH�q$"�B�WD�I���!j����]����m�>x�چ��aJ� c���̟5� �� 232 | ��':(���MI�p�k�c灃l�r;_9BEM �h�1%�<2s�><�F�&=5 ��k�3��#"�F�WD�ٕ�.#���|�w���/���q�Œ^�#3g��#�3r��7`PQxIWl�����Fٸ};����]R]WG[{;�99,�3��,`� d����;"rxE�� 3������XQ��_�卵k9v� ��@ ���b��}���!�Ce�Ea��6`�5�{�� ��s� �u��b�P�E�g�b�b�N�BFZ*Ƴ�!!�nJ��> 233 | �"rC 234 | 5�Z��j���p�f^�` �5��<�P0HA^˗,�ŧ�Kvvv����+�cⷥ`sϸRE�c�E"�>x�?��>�����c �@�҉x��g���TR��pb�˷��$D�P���v�1f���f �n����H$���#=-�g{��.]JqQ)����x��@�Fag�������,��w�(��]��iko'�y��Ì1��˗������~/|@��"rk(���-�m>�Z��<ɚ��u� 'ϝ#���b�eg��y,y�!ƎIff6A���<g�ݳ@A�n�Re�k�B C{g���r;ƺ-[�y����㐓���Q��7sO-YBNv�"�,��ȭ��+"����qˑS��b�.v��ϱS�ink����!99L�8�i�&1}�$� +"#�����{7Д��a���k��h�P��ȉӧ�w�(���ɓD�QRC!�ss�6q"sJ��p� 2�r0^�i���~ 235 | �"r� �˩s�9p�������ST�����LVz:����0z43&O�1c��Kz8 ����M|!����7�81�Xk�U���]�ȁ�G�w�('ϝ�܅ X /;��aØ9e 236 | �,��qc���±^���t߶��D�vR����J3X��GUm-'Μf����?v�g�R��H(dHn.� 237 | (�0��c`�J 238 | ��86�a����ts��a���8�M�ΟcߡC=}���Z���֣dX�F�d��IL�2��a��HK�X�������+�xE�p�/����^jk�bE�eס��ܷ��55��A��ii�).fܘ�<8n�'M"77�]����� �r���g�D::9��9�>r���Np��Iʫ���줽���ǸQ��[:��'3���de� 239 | ���!q{ 240 | �"r(���7p��\�xp���g��Ub�s.��d ����,,d�ر̟1���'�����ͳW�������-�vs��bC�RYY����fׁ�b�o��imk,��fL��c����(*N8ı��E�"r�)���]ѫ́�� ֳ8����D::�����c|��v<@sK �H��� ��� '+���dz`�l攖�_���Z�^?�~��`�� 241 | ��]/ 0N�����8]VƖ��غ{�.\�Rk+M��x������CX�p!K�>Ĉ�BRS�q/���U���  242 | �"2(��������BUM ������l�\�imo���uq]�p(ČI�X\)�ݩPw����7l���` D=C,����FCc5���łg�q��)��>CeM-�q �s] 244 | � aX~>ŅØ1y 245 | f�"++�X���+Q���D�WD�+��_b�tt�s��|��g㡭+�z�����[���A�w����TkL�;����zt�b�w���젹����j�jj�������o**8WVFyU�X ��G0���NI�0?��%%� g�ȑ�5���!�`c�����\��(���=��x����q�8D;;���㛊 246 | *k�8{�<�.\�bu5M�ʹ$zQ[��0Ɛ��Nnv9�Ydgd0$7���|�򇒗�K8�JJ0�pJ�PJ�P @ ����L�׉@|�����|ݞ!9�VAW_-��%�`{\̋Fh����A[{G�sMM�TTWS^Y���j��kl��!���ю뺤�����N8%���,�FIa!ÇRT0���|�3�?�����"r/S��{Ҁ"�uܮ�(�ZZhhn���%�k�9_^���\�����������҂R�RSI� ���A���r33���";++���AR����)� �`���8.�cp�8`�D�M�oc�ҋ�T�<�X,F��h�줽����N�;:i��H|����AӥF��m�������F.�����Ik[�Z�}��X���OvF���dgf���MIAŅ� 6�̌,2���L ��8�^;�)�ȽN�WD�i�8���8t�U��tD��wDhmo����ʚZ�jj��������xu���*>;�|>~�����/�s�pJ 247 | ����ϡP 248 | ���P��˺.��`�8ݻ�y���x^|�h,F,񹭽���vZ�ں�nK|����q4J$#��F��<<o�(�ϧ�`(�C���G~nC����GFz&�` 249 | )A�ųcKh�fIR 250 | �"�4l�����^� 251 | �n�x+AC,f��"��4���HCS���T��QYSCEuu�sM �u�D"���lW��WB���!~���;!��ez����hNOK� oC�r��6$/^���$;3��L�>��5���L��w��;��""�2^IZ�6�������(��`��Zϋ�E"D��:"��۩��������z���ol���)��h���b`��P{�_��[eFj*ٙdgd%>g���AVF�%�xh�i�~�A������d�o��c��_S��d��+"���N��ޔ��"��j���н��OU���:{����mwW� L�ڵ�����Z ����+L�P������H�5m��mne�����p+"r��n����J!�����`+"ru 252 | �""W�P)"ros����xEDDD$�)�����HRS�����+""""IM�WDDDD�������$5^Ij 253 | �""""��xEDDD$�)�����HRS�����+""""IM�WDDDD�������$5^Ij 254 | �""""��xEDDD$�)�����HRS�����+""""IM�WDDDD�������$5^Ij 255 | �""""��xEDDD$�)�����HRS�����+""""IM�WDDDD�������$5^Ij 256 | �""""��xEDDD$�)�����HRS�����+""""IM�WDDDD�������$5^Ij 257 | �""""��xEDDD$�)�����HRS�����+""""IM�WDDDD�������$5^Ij 258 | �""""��xEDDD$�)�����HRS�����+""""IM�WDDDD�������$5^Ij 259 | �""""��xEDDD$�)�����HRS�����+""""IM�WDDDD�������$5^Ij 260 | �""""��xEDDD$�)�����HRS�����+""""IM�WDDDD�������$5^Ij 261 | �""""��xEDDD$�)�����HRS�����+""""IM�WDDDD�������$5^Ij 262 | �""""��xEDDD$�)�����HRS�����+""""IM�WDDDD�������$5^Ij 263 | �""""��xEDDD$�)�����HRS�����+""""IM�WDDDD����V�7�VgIEND�B`� -------------------------------------------------------------------------------- /assets/react.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/ReSvelte/bbb1598bc00aec9219e9d1cba844fc74d7561c0c/assets/react.png -------------------------------------------------------------------------------- /assets/smallResvelte.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/ReSvelte/bbb1598bc00aec9219e9d1cba844fc74d7561c0c/assets/smallResvelte.png -------------------------------------------------------------------------------- /assets/typescript.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/ReSvelte/bbb1598bc00aec9219e9d1cba844fc74d7561c0c/assets/typescript.png -------------------------------------------------------------------------------- /assets/vscode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/ReSvelte/bbb1598bc00aec9219e9d1cba844fc74d7561c0c/assets/vscode.png -------------------------------------------------------------------------------- /assets/webpack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/ReSvelte/bbb1598bc00aec9219e9d1cba844fc74d7561c0c/assets/webpack.png -------------------------------------------------------------------------------- /assets/webpack2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/ReSvelte/bbb1598bc00aec9219e9d1cba844fc74d7561c0c/assets/webpack2.png -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = function (api) { 2 | api.cache(true); 3 | return { 4 | plugins: ['macros'], 5 | presets: [ 6 | ['@babel/preset-env', {targets: {node: 'current'}}], 7 | '@babel/preset-typescript', 8 | ['@babel/preset-react', {runtime: 'automatic'}] 9 | ], 10 | }; 11 | }; 12 | 13 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "resvelte", 3 | "displayName": "ReSvelte", 4 | "publisher": "ReSvelte", 5 | "description": "Developer tool for Svelte", 6 | "icon": "assets/WhiteResvelte.png", 7 | "version": "1.0.7", 8 | "engines": { 9 | "vscode": "^1.66.0" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "https://github.com/oslabs-beta/ReSvelte" 14 | }, 15 | "categories": [ 16 | "Other" 17 | ], 18 | "activationEvents": [ 19 | "onCommand:resvelte.helloWorld", 20 | "onView:ReSvelte-Sidebar" 21 | ], 22 | "main": "./out/extension.js", 23 | "contributes": { 24 | "viewsContainers": { 25 | "activitybar": [ 26 | { 27 | "id": "resvelte-sidebar-view", 28 | "title": "ReSvelte", 29 | "icon": "assets/ReSvelteLogo.svg" 30 | } 31 | ] 32 | }, 33 | "views": { 34 | "resvelte-sidebar-view": [ 35 | { 36 | "type": "webview", 37 | "id": "ReSvelte-Sidebar", 38 | "name": "ReSvelte", 39 | "icon": "assets/ReSvelteLogo.svg", 40 | "contextualTitle": "ReSvelte" 41 | } 42 | ] 43 | }, 44 | "commands": [ 45 | { 46 | "command": "resvelte.helloWorld", 47 | "title": "Hello World" 48 | }, 49 | { 50 | "command": "resvelte.start", 51 | "title": "Start ReSvelte" 52 | } 53 | ] 54 | }, 55 | "scripts": { 56 | "vscode:prepublish": "npm run package", 57 | "compile": "webpack", 58 | "watch": "webpack --watch && tsc -p . -w --outDir out", 59 | "package": "webpack --mode production --devtool hidden-source-map", 60 | "compile-tests": "tsc -p ./", 61 | "watch-tests": "", 62 | "pretest": "npm run compile-tests && npm run compile && npm run lint", 63 | "lint": "eslint src --ext ts", 64 | "test": "node ./out/test/runTest.js", 65 | "build": "tsc -p ./ && webpack", 66 | "jest": "jest" 67 | }, 68 | "devDependencies": { 69 | "@babel/core": "^7.17.9", 70 | "@babel/plugin-transform-runtime": "^7.17.0", 71 | "@babel/preset-env": "^7.16.11", 72 | "@babel/preset-react": "^7.16.7", 73 | "@babel/preset-typescript": "^7.16.7", 74 | "@testing-library/jest-dom": "^5.16.4", 75 | "@testing-library/react": "^13.1.1", 76 | "@types/glob": "^7.2.0", 77 | "@types/mocha": "^9.1.0", 78 | "@types/node": "14.x", 79 | "@types/vscode": "^1.66.0", 80 | "@typescript-eslint/eslint-plugin": "^5.16.0", 81 | "@typescript-eslint/parser": "^5.16.0", 82 | "@vscode/test-electron": "^2.1.3", 83 | "babel-core": "^6.26.3", 84 | "babel-jest": "^28.0.2", 85 | "babel-loader": "^8.2.4", 86 | "babel-polyfill": "^6.26.0", 87 | "babel-preset-es2015": "^6.24.1", 88 | "babel-preset-stage-0": "^6.24.1", 89 | "eslint": "^8.11.0", 90 | "file-loader": "^6.2.0", 91 | "glob": "^7.2.0", 92 | "jest": "^28.0.2", 93 | "mocha": "^9.2.2", 94 | "react-test-renderer": "^18.1.0", 95 | "sass": "^1.50.0", 96 | "sass-loader": "^12.6.0", 97 | "style-loader": "^3.3.1", 98 | "ts-loader": "^9.2.8", 99 | "typescript": "^4.5.5", 100 | "webpack": "^5.72.0", 101 | "webpack-cli": "^4.9.2" 102 | }, 103 | "dependencies": { 104 | "acorn": "^8.7.0", 105 | "acorn-walk": "^8.2.0", 106 | "babel-plugin-macros": "^3.1.0", 107 | "core-js": "^3.21.1", 108 | "css-loader": "^6.7.1", 109 | "file-loader": "^6.2.0", 110 | "path": "^0.12.7", 111 | "react": "^18.0.0", 112 | "react-dom": "^18.0.0", 113 | "react-icons": "^4.3.1", 114 | "react-jsx": "^1.0.0", 115 | "react-redux": "^7.2.8", 116 | "regenerator-runtime": "^0.13.9", 117 | "svelte-parse": "^0.1.0" 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /src/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/ReSvelte/bbb1598bc00aec9219e9d1cba844fc74d7561c0c/src/.DS_Store -------------------------------------------------------------------------------- /src/App.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { useState } from "react"; 3 | import './styles.scss'; 4 | 5 | import sidebarParser from "./SidebarParser"; 6 | import PerfomanceDisplay from './components/performanceDisplay'; 7 | import ErrorMessage from './components/errorMessage'; 8 | import parseTree from './parser/parseTree'; 9 | 10 | 11 | const App = () => { 12 | 13 | const [isUploaded, setUploaded] = useState(false); 14 | const [newProject, setNewProject] = useState(false); 15 | 16 | const [filesDisplay, setReactFiles] = useState([]); 17 | const [root, setRoot] = useState(); // reference line 107 18 | 19 | const [errorLog, setError] = useState([]); 20 | const [totalComponents, setTotalComponents] = useState(0); 21 | const [totalRerendering, setTotalRerendering] = useState(0); 22 | 23 | 24 | const svelteFiles = []; 25 | let mainFile; 26 | 27 | 28 | const reset = () => { 29 | setUploaded(false); 30 | setError([]); 31 | setTotalComponents(0); 32 | setTotalRerendering(0); 33 | setReactFiles([]); 34 | setRoot(); 35 | }; 36 | 37 | //////////////////STRETCH FEATURE : Create a render tree function so that user may upload another file at any given moment and it will rerender tree/////////////////// 38 | 39 | // handler for when user uploads folder 40 | // grab only svelte files and pass them into the parser 41 | // parser will return a root node of the application 42 | // invoke the component tree builder with the returned node from parser 43 | 44 | const changeHandler = async (files) => { 45 | console.log('Inside upload handler'); 46 | 47 | // File is an object that is inside of FileList 48 | 49 | const output = []; 50 | 51 | // clean up code, refactor; no need to look at node_modules (only needs to look through folder where components could potentionally be) 52 | 53 | /* 54 | loop below handles: 55 | 1. finds svelte files 56 | 2. parses through each svelte file using sidebarparser which return a fileObj 57 | 3. makes the fileObj which has the filename, children and data(parsed file that contains parsed children) 58 | 4. finds the app.svelte file (main application file) in fileObj 59 | 5. pushed the fileObj to the svelteFiles array 60 | 61 | */ 62 | 63 | 64 | for (let i = 0; i < files.length; i++) { 65 | // checking if last 7 characters is .svelte 66 | if (files[i].name.slice(-7) === '.svelte'){ 67 | 68 | const fileObj = await sidebarParser(files[i]); 69 | 70 | if(fileObj.fileName === 'App.svelte' || fileObj.fileName === 'app.svelte'){ 71 | mainFile = fileObj; 72 | } 73 | 74 | svelteFiles.push(fileObj); 75 | 76 | 77 | // react component rendering (TEMPORARY) 78 | // shows all the components that should be in the tree 79 | output.push(
  • {files[i].name}
  • ); 80 | 81 | } 82 | }; 83 | 84 | // invalid svelte project error 85 | if (svelteFiles.length === 0) { return setError([...errorLog, ,]);}; 86 | if (!mainFile) {return setError([...errorLog, ]);}; 87 | 88 | console.log('Imported Files:', svelteFiles); 89 | console.log('Building tree...'); 90 | setRoot(parseTree(mainFile, svelteFiles, setTotalComponents, setTotalRerendering, setError, errorLog)); 91 | 92 | 93 | /////// test uploading errors ////////// 94 | setReactFiles(output); 95 | setUploaded(true); 96 | 97 | 98 | 99 | }; 100 | 101 | 102 | 103 | 104 | return( 105 |
    106 | {isUploaded ? 107 | ( 108 |
    109 | 110 |
    111 | {/*

    Current project: {mainFile.fileName}

    */} 112 |

    Imported components:

    113 | {filesDisplay} 114 |
    115 | 116 |

    Component Tree

    117 | 118 |
    119 | {root} 120 |
    121 | 122 | 123 | 124 | {newProject? 125 | ( 126 |
    127 | Upload project

    128 | { 130 | reset(); 131 | console.log('input:',event.target) 132 | changeHandler(event.target.files); 133 | 134 | } 135 | } id='uploadButton' directory="" webkitdirectory="" type="file" > 136 |
    137 | ) 138 | : 139 | ( 140 |
    141 | Want to start a new project? {setNewProject(true)}} id='newProject'>Click here! 142 |
    ) 143 | } 144 | 145 |
    146 | ): 147 | ( 148 | 149 |
    150 |

    Upload Project

    151 | Please import your project folder below 152 |
    153 |
    154 | 155 | { 157 | changeHandler(event.target.files); 158 | } 159 | } id='uploadButton' directory="" webkitdirectory="" type="file" > 160 | 161 | { 162 | errorLog.length === 0 ? 163 | null 164 | : 165 |
    166 |

    Please upload another folder

    167 | {errorLog} 168 |
    169 | } 170 | 171 | 172 |
    173 | ) 174 | } 175 |
    ) 176 | }; 177 | 178 | export default App; 179 | 180 | 181 | 182 | -------------------------------------------------------------------------------- /src/SidebarParser.js: -------------------------------------------------------------------------------- 1 | import { parse } from 'svelte-parse'; 2 | const svelteParser = parse; 3 | 4 | 5 | // check later if async is necessary here 6 | async function sidebarParser(file) { 7 | // if this file has already been parsed, dont parse again 8 | // if(svelteFiles.(file.name).parsedData) return; 9 | 10 | //check later if 87 and 88 need to be here or in the return 11 | const fileObj ={}; 12 | const childComponents = []; 13 | 14 | //returning a function that is a promise, takes in 2 params, resolve is a function that sets the status of promise to finished, reject is a catch 15 | return new Promise( async (resolve, reject) => { 16 | 17 | var reader = new FileReader(); 18 | // 97-113 is like a .then 19 | // svelte parser needs a string, below converts to string and stores in reader 20 | // file is an object? 21 | reader.readAsText(file); 22 | reader.onerror = reject; 23 | // .onload runs once the above finishes 24 | reader.onload = () => { 25 | 26 | // console.log('this is the result', reader.result) 27 | 28 | // check if we have parsed this component before 29 | // if (svelteFiles.some(e => e.fileName === file.fileName)) return; 30 | // stores the parsed version of the file 31 | const parsedData = svelteParser({ value: reader.result}); 32 | 33 | 34 | 35 | // data has filename and children 36 | for(let i = 0; i < parsedData.children.length; i++){ 37 | 38 | // checking for just svelteelement and svelte component and svelte script and pushing into childComponents 39 | // svelte element any type of tags that allow us to write anything inside it

    etc. 40 | // svelte component the import at the top of file e.g. import FileButton from ./Button.svelte 41 | // svelte script basically anything in script tag 42 | 43 | if(parsedData.children[i].type === 'svelteElement' || parsedData.children[i].type === 'svelteComponent' || parsedData.children[i].type === 'svelteScript' || parsedData.children[i].type === 'svelteBranchingBlock'){ 44 | // need to parse again? children aren't parsed 45 | 46 | // parse the svelte element but not components and push that as a children !!!!!!!!!!!!!!!!!!!!!!!!!!! Maybe 47 | childComponents.push(parsedData.children[i]); 48 | 49 | } 50 | 51 | 52 | 53 | 54 | }; 55 | // store parsed data 56 | // elements in svelte files in app.jsx 57 | fileObj.fileName = file.name; // name of file 58 | fileObj.children = childComponents; // an array 59 | //fileObj.parsedData = parsedData; // data object //might not need if able to parse line 122 60 | 61 | // returning whole fileObj of the current file 62 | // used in app.jsx line 63 63 | resolve(fileObj); 64 | }; 65 | 66 | 67 | }); 68 | } 69 | 70 | 71 | export default sidebarParser; 72 | -------------------------------------------------------------------------------- /src/SidebarProvider.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from 'vscode'; 2 | 3 | 4 | export class SidebarProvider implements vscode.WebviewViewProvider { 5 | [x: string]: any; 6 | public _view?: vscode.WebviewView; //made everything public for now 7 | public _doc?: vscode.TextDocument; // made public 8 | 9 | constructor( 10 | public readonly _extensionUri: vscode.Uri, // made public 11 | ) { } 12 | 13 | 14 | 15 | public resolveWebviewView( 16 | webviewView: vscode.WebviewView, 17 | context: vscode.WebviewViewResolveContext, 18 | _token: vscode.CancellationToken, 19 | ) { 20 | this._view = webviewView; 21 | 22 | webviewView.webview.options = { 23 | // Allow scripts in the webview 24 | enableScripts: true, 25 | 26 | localResourceRoots: [ 27 | this._extensionUri 28 | ] 29 | }; 30 | 31 | 32 | webviewView.webview.html = this._getHtmlForWebview(webviewView.webview); 33 | 34 | webviewView.webview.onDidReceiveMessage(data => { 35 | switch (data.type) { 36 | } 37 | }); 38 | } 39 | 40 | public revive(panel: vscode.WebviewView) { 41 | this._view = panel; 42 | } 43 | 44 | 45 | public _getHtmlForWebview(webview: vscode.Webview) { // made public 46 | // Get the local path to main script run in the webview, then convert it to a uri we can use in the webview. 47 | const scriptUri = webview.asWebviewUri(vscode.Uri.joinPath(this._extensionUri, 'dist', 'sidebar.js')); 48 | 49 | 50 | // Do the same for the stylesheet. 51 | // const styleResetUri = webview.asWebviewUri(vscode.Uri.joinPath(this._extensionUri, 'media', 'reset.css')); 52 | // const styleVSCodeUri = webview.asWebviewUri(vscode.Uri.joinPath(this._extensionUri, 'media', 'vscode.css')); 53 | // const styleMainUri = webview.asWebviewUri(vscode.Uri.joinPath(this._extensionUri, 'media', 'main.css')); 54 | 55 | // Use a nonce to only allow a specific script to be run. 56 | 57 | 58 | return ` 59 | 60 | 61 | 62 | 63 | 64 | ReSvelte 65 | 66 | 67 |
    Loading extension...
    68 | 69 | 70 | `; 71 | } 72 | } -------------------------------------------------------------------------------- /src/__tests__/App.test.jsx: -------------------------------------------------------------------------------- 1 | import { render, fireEvent, screen } from '@testing-library/react'; 2 | 3 | import App from "../App"; 4 | 5 | describe('rendering App', () => { 6 | 7 | test('renders upload project text', () => { 8 | render(); 9 | const element = screen.getByText(/Upload Project/i); 10 | expect(element).toBeInTheDocument(); 11 | }); 12 | 13 | }); 14 | -------------------------------------------------------------------------------- /src/__tests__/application.test.ts: -------------------------------------------------------------------------------- 1 | // import { render, fireEvent, screen } from '@testing-library/react'; 2 | // import React from 'react' 3 | // import '@testing-library/jest-dom' 4 | 5 | // import App from '../src/App.jsx'; 6 | 7 | 8 | // test('renders upload project text', () => { 9 | // render() 10 | // const Element = screen.getByText(/Upload Project/i); 11 | // expect(Element).toBeInTheDocument(); 12 | // }) 13 | 14 | 15 | // describe('rendering App' () => { 16 | 17 | // const {Element} = await screen.getByText(/Upload Project/i); 18 | 19 | // }) 20 | // expect(Element).toBeInTheDocument(); 21 | // }) 22 | 23 | 24 | // //rendering APP should either show imported components, component tree, and , and new project OR please import your project folder below 25 | 26 | 27 | 28 | // function sum(a, b) { 29 | // const array = [1,2,3] 30 | // return a + b; 31 | // } 32 | 33 | // describe('App.jsx', () => { 34 | // it('adds 1 + 2 to equal 3', () => { 35 | // expect(sum(1, 2)).toBe(4); 36 | // }); 37 | // }); 38 | 39 | -------------------------------------------------------------------------------- /src/__tests__/test.js: -------------------------------------------------------------------------------- 1 | import App from '../src/extension.ts'; 2 | import React from 'React'; 3 | import { render, screen, waitFor } from '@testing-library/react'; 4 | // import vscode from '../src/extension.ts'; 5 | 6 | describe('unit test for components', () => { 7 | let state; 8 | 9 | beforeEach(() => { 10 | let text; 11 | const props = { 12 | label: 'Svelte', 13 | text: 'Components', 14 | }; 15 | 16 | beforeAll(() => { 17 | text = render(); 18 | }); 19 | 20 | test('Renders the passed-in text with the label', () => { 21 | expect(text.getByText("Svelte:").nextSibling).toHaveTextContent('Components'); 22 | }); 23 | 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /src/components/componentNode.tsx: -------------------------------------------------------------------------------- 1 | import React, { FC , useState } from "react"; 2 | import { IoIosArrowDown, IoIosArrowUp } from "react-icons/io"; 3 | import {nodeTypes} from '../types'; 4 | 5 | const componentNode : FC = (props) : JSX.Element => { 6 | 7 | const [showChildren, setShow] = useState(false); 8 | 9 | return ( 10 |
    11 |
    12 | Component 13 |
    Name: {props.fileName}
    14 |
    Children: {props.children ? props.children.length : 0}
    15 | {props.children ? ( 16 | showChildren ? ( 17 | 23 | ) : ( 24 | 30 | ) 31 | ) : null} 32 |
    33 | 34 |
    {showChildren ? props.children : null}
    35 |
    36 | ) 37 | } 38 | 39 | export default componentNode; -------------------------------------------------------------------------------- /src/components/elementNode.tsx: -------------------------------------------------------------------------------- 1 | import React ,{ FC , useState} from "react"; 2 | import { IoIosArrowDown, IoIosArrowUp } from "react-icons/io"; 3 | import { AiFillFolder, AiFillFolderOpen } from "react-icons/ai"; 4 | import { nodeTypes } from '../types'; 5 | 6 | const elementNode : FC = (props) : JSX.Element => { 7 | 8 | const [showChildren, setShow] = useState(false); 9 | 10 | return ( 11 |
    12 | { 13 | // if there are children 14 | props.children ? ( 15 | // if current state of showchildren is truthy 16 | showChildren ? ( 17 | // create up arrow icon 18 | 27 | ) : ( 28 | // otherwise create down arrow icon 29 | 38 | ) 39 | ) : // if no child don't show any button 40 | null 41 | } 42 | 43 |
    44 | {/* if showchildren is truthy, show childlist, otherwise show nothing */} 45 | {showChildren ? props.children : null} 46 |
    47 |
    48 | ); 49 | }; 50 | 51 | export default elementNode; -------------------------------------------------------------------------------- /src/components/errorMessage.tsx: -------------------------------------------------------------------------------- 1 | import React, { FC } from "react"; 2 | import '../styles.scss'; 3 | 4 | import { errorMessageTypes } from "../types"; 5 | 6 | const errorMessage : FC = (props) => { 7 | 8 | return( 9 |
    10 | {props.errorCode} : {props.errorMessage} 11 |
    12 | ); 13 | }; 14 | 15 | export default errorMessage; -------------------------------------------------------------------------------- /src/components/fileNode.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import "../styles.scss"; 3 | 4 | import { FC } from "react"; 5 | 6 | import ElementNode from '../components/elementNode'; 7 | import ComponentNode from '../components/componentNode'; 8 | 9 | import { fileNode } from '../types'; 10 | 11 | 12 | const fileNode: FC = (props) => { 13 | 14 | console.log('children:', props.children) 15 | 16 | 17 | return ( 18 |
    19 | { 20 | //if filetype is svelteelement, run code below 21 | props.fileType === "svelteElement" ? ( 22 | 23 | ) : ( 24 | 25 | ) 26 | } 27 |
    28 | ); 29 | } 30 | 31 | export default fileNode; -------------------------------------------------------------------------------- /src/components/performanceDisplay.tsx: -------------------------------------------------------------------------------- 1 | import React, {FC, useState} from 'react'; 2 | import '../styles.scss'; 3 | 4 | import { performanceDisplayTypes } from '../types'; 5 | 6 | const performanceDisplay : FC = (props) => { 7 | 8 | return ( 9 |
    10 |

    App Performance

    11 | 12 |
    13 |
    14 | {/*
    15 | Graphs 16 |
    */} 17 |
    18 | Components 19 |
    20 | 21 |
    22 |

    Total

    23 | {props.totalComponents} 24 |
    25 | 26 | 27 |
    28 |

    Re-rendering

    29 | {props.totalRerendering} 30 |
    31 | 32 |
    33 |
    34 |
    35 | 36 |
    37 | Error Log 38 | {props.errorLog} 39 |
    40 |
    41 | 42 |
    43 | ); 44 | }; 45 | 46 | export default performanceDisplay; -------------------------------------------------------------------------------- /src/extension.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from 'vscode'; 2 | 3 | import { SidebarProvider } from './SidebarProvider'; 4 | 5 | 6 | export function activate(context: vscode.ExtensionContext) { 7 | 8 | console.log('Congratulations, your extension "resvelte" is now active!'); 9 | 10 | 11 | const sidebarProvider = new SidebarProvider(context.extensionUri); 12 | context.subscriptions.push( 13 | vscode.window.registerWebviewViewProvider('ReSvelte-Sidebar', sidebarProvider) 14 | ); 15 | 16 | // context.subscriptions.push( 17 | // vscode.commands.registerCommand("resvelte.createTree", async (uri: vscode.Uri | undefined) => { 18 | // await vscode.commands.executeCommand('workbench.view.extension.Resvelte-Sidebar'); 19 | // // sidebarProvider.statusButtonClicked(uri); 20 | // }) 21 | // ); 22 | }; 23 | 24 | 25 | 26 | 27 | // this method is called when your extension is deactivated 28 | export function deactivate() {} 29 | -------------------------------------------------------------------------------- /src/parser/getAliases.ts: -------------------------------------------------------------------------------- 1 | 2 | const getAliases = (file ) : object => { 3 | // traverse the children of the parsedData 4 | // grab only svelteComponents 5 | //