Created
August 18, 2016 16:12
-
-
Save 526avijitgupta/a123f23409979dfa676c6b103a8284ba to your computer and use it in GitHub Desktop.
This file has been truncated, but you can view the full file.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Checking if node.js is installed in /Users/aviato/github/oppia/oppia_tools | |
| Generating list of installed node modules... | |
| Generation completed. | |
| Checking whether Google App Engine is installed in /Users/aviato/github/oppia/oppia_tools/google_appengine_1.9.19/google_appengine | |
| Environment setup completed. | |
| Installing third-party JS libraries and zip files. | |
| Checking whether gulp is installed | |
| Checking whether through2 is installed | |
| Checking whether yargs is installed | |
| Checking whether gulp-concat is installed | |
| Checking whether gulp-clean-css is installed | |
| Checking whether gulp-util is installed | |
| Checking whether jscs is installed | |
| Checking whether gulp-sourcemaps is installed | |
| Checking whether gulp-minify is installed | |
| Checking whether Skulpt is installed in third_party | |
| Checking if pip is installed on the local machine | |
| Checking if numpy is installed in /Users/aviato/github/oppia/oppia_tools/pip_packages | |
| Checking if pylint is installed in /Users/aviato/github/oppia/oppia_tools/pip_packages | |
| Checking if webtest is installed in third_party | |
| Installing pre-push hook for git | |
| Symlink already exists | |
| 15:43:34 ERROR core.controllers.dashboard_test: 3.3 secs | |
| ---------------------------------------- | |
| ---------------------------------------- | |
| Error 1 | |
| test_no_explorations (core.controllers.dashboard_test.DashboardHandlerTest) ... ok | |
| test_one_rating_for_single_exploration (core.controllers.dashboard_test.DashboardStatisticsTest) ... ERROR:root:Exception raised: 'exp_id_1' | |
| ERROR | |
| ====================================================================== | |
| ERROR: test_one_rating_for_single_exploration (core.controllers.dashboard_test.DashboardStatisticsTest) | |
| ---------------------------------------------------------------------- | |
| Traceback (most recent call last): | |
| File "/Users/aviato/github/oppia/oppia/core/controllers/dashboard_test.py", line 189, in test_one_rating_for_single_exploration | |
| response = self.get_json(feconf.DASHBOARD_DATA_URL) | |
| File "/Users/aviato/github/oppia/oppia/core/tests/test_utils.py", line 234, in get_json | |
| json_response = self.testapp.get(url, params) | |
| File "/Users/aviato/github/oppia/oppia/../oppia_tools/webtest-1.4.2/webtest/app.py", line 758, in get | |
| expect_errors=expect_errors) | |
| File "/Users/aviato/github/oppia/oppia/../oppia_tools/webtest-1.4.2/webtest/app.py", line 1120, in do_request | |
| self._check_status(status, res) | |
| File "/Users/aviato/github/oppia/oppia/../oppia_tools/webtest-1.4.2/webtest/app.py", line 1156, in _check_status | |
| res) | |
| AppError: Bad response: 500 Internal Server Error (not 200 OK or 3xx redirect for http://localhost/dashboardhandler/data) | |
| <!DOCTYPE html> | |
| <html ng-app="oppia" ng-controller="Base" itemscope itemtype="http://schema.org/Organization"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes"> | |
| <!-- Tiles for Internet Explorer. --> | |
| <meta name="application-name" content="SITE_NAME"> | |
| <meta name="msapplication-TileColor" content="#ffffff"> | |
| <meta name="msapplication-square70x70logo" content="http://localhost/assets/images/logo/msapplication-tiny.png"> | |
| <meta name="msapplication-square150x150logo" content="http://localhost/assets/images/logo/msapplication-square.png"> | |
| <meta name="msapplication-wide310x150logo" content="http://localhost/assets/images/logo/msapplication-wide.png"> | |
| <meta name="msapplication-square310x310logo" content="http://localhost/assets/images/logo/msapplication-large.png"> | |
| <!-- The itemprops are for G+ sharing. --> | |
| <meta itemprop="name" content="Personalized Online Learning from Oppia"> | |
| <meta itemprop="description" content="Oppia is a free, open-source learning platform. Join the community to create or try an exploration today!"> | |
| <!-- The og tags are for Facebook sharing. --> | |
| <meta property="og:title" content="Personalized Online Learning from Oppia"> | |
| <meta property="og:site_name" content="Oppia"> | |
| <meta property="og:url" content="http://localhost/dashboardhandler/data"> | |
| <meta property="og:description" content="Oppia is a free, open-source learning platform. Join the community to create or try an exploration today!"> | |
| <meta property="og:type" content="article"> | |
| <meta property="og:image" content="http://localhost/assets/images/logo/288x288_logo_mint.png"> | |
| <link rel="apple-touch-icon" href="/assets/images/logo/favicon.png"> | |
| <!-- The title is bound to the rootScope. The content of the block | |
| maintitle can be a string or a translation id. If it is a translation it | |
| will be replaced by its translation when the page is loading. If it is a | |
| string it would be displayed as is. This is the only way to translate | |
| the page title because the head of the file is outside the scope of | |
| any other controller. --> | |
| <title itemprop="name" translate=" | |
| I18N_ERROR_PAGE_TITLE_500 | |
| "></title> | |
| <link rel="stylesheet" type="text/css" media="screen" | |
| href="https://fonts.googleapis.com/css?family=Capriola|Rubik|Roboto|Material+Icons|Open+Sans:400,600"> | |
| <link rel="stylesheet" type="text/css" media="screen" | |
| href="/third_party/generated/css/third_party.css"> | |
| <link rel="stylesheet" type="text/css" media="screen" | |
| href="/css/oppia.css"> | |
| <script> | |
| var GLOBALS = { | |
| ACTIVITY_STATUS_PRIVATE: JSON.parse( | |
| '\"private\"'), | |
| ACTIVITY_STATUS_PUBLIC: JSON.parse( | |
| '\"public\"'), | |
| ACTIVITY_STATUS_PUBLICIZED: JSON.parse( | |
| '\"publicized\"'), | |
| ADDITIONAL_ANGULAR_MODULES: [], | |
| ALL_CATEGORIES: JSON.parse('[\"Algebra\", \"Algorithms\", \"Architecture\", \"Arithmetic\", \"Art\", \"Astronomy\", \"Biology\", \"Business\", \"Calculus\", \"Chemistry\", \"Combinatorics\", \"Computing\", \"Economics\", \"Education\", \"Engineering\", \"English\", \"Environment\", \"Gaulish\", \"Geography\", \"Geometry\", \"Government\", \"Graph Theory\", \"History\", \"Languages\", \"Latin\", \"Law\", \"Logic\", \"Mathematics\", \"Medicine\", \"Music\", \"Philosophy\", \"Physics\", \"Poetry\", \"Probability\", \"Programming\", \"Puzzles\", \"Reading\", \"Spanish\", \"Sport\", \"Statistics\", \"Trigonometry\", \"Welcome\"]'), | |
| ALL_LANGUAGE_CODES: JSON.parse('[{\"code\": \"en\", \"description\": \"English\"}, {\"code\": \"ar\", \"description\": \"\\u0627\\u0644\\u0639\\u0631\\u0628\\u064a\\u0629 (Arabic)\"}, {\"code\": \"bg\", \"description\": \"\\u0431\\u044a\\u043b\\u0433\\u0430\\u0440\\u0441\\u043a\\u0438 (Bulgarian)\"}, {\"code\": \"ca\", \"description\": \"catal\\u00e0 (Catalan)\"}, {\"code\": \"zh\", \"description\": \"\\u4e2d\\u6587 (Chinese)\"}, {\"code\": \"hr\", \"description\": \"hrvatski (Croatian)\"}, {\"code\": \"cs\", \"description\": \"\\u010de\\u0161tina (Czech)\"}, {\"code\": \"da\", \"description\": \"dansk (Danish)\"}, {\"code\": \"nl\", \"description\": \"Nederlands (Dutch)\"}, {\"code\": \"tl\", \"description\": \"Filipino (Filipino)\"}, {\"code\": \"fi\", \"description\": \"suomi (Finnish)\"}, {\"code\": \"fr\", \"description\": \"fran\\u00e7ais (French)\"}, {\"code\": \"de\", \"description\": \"Deutsch (German)\"}, {\"code\": \"el\", \"description\": \"\\u03b5\\u03bb\\u03bb\\u03b7\\u03bd\\u03b9\\u03ba\\u03ac (Greek)\"}, {\"code\": \"he\", \"description\": \"\\u05e2\\u05d1\\u05e8\\u05d9\\u05ea (Hebrew)\"}, {\"code\": \"hi\", \"description\": \"\\u0939\\u093f\\u0928\\u094d\\u0926\\u0940 (Hindi)\"}, {\"code\": \"hu\", \"description\": \"magyar (Hungarian)\"}, {\"code\": \"id\", \"description\": \"Bahasa Indonesia (Indonesian)\"}, {\"code\": \"it\", \"description\": \"italiano (Italian)\"}, {\"code\": \"ja\", \"description\": \"\\u65e5\\u672c\\u8a9e (Japanese)\"}, {\"code\": \"ko\", \"description\": \"\\ud55c\\uad6d\\uc5b4 (Korean)\"}, {\"code\": \"lv\", \"description\": \"latvie\\u0161u (Latvian)\"}, {\"code\": \"lt\", \"description\": \"lietuvi\\u0173 (Lithuanian)\"}, {\"code\": \"no\", \"description\": \"Norsk (Norwegian)\"}, {\"code\": \"fa\", \"description\": \"\\u0641\\u0627\\u0631\\u0633\\u06cc (Persian)\"}, {\"code\": \"pl\", \"description\": \"polski (Polish)\"}, {\"code\": \"pt\", \"description\": \"portugu\\u00eas (Portuguese)\"}, {\"code\": \"ro\", \"description\": \"rom\\u00e2n\\u0103 (Romanian)\"}, {\"code\": \"ru\", \"description\": \"\\u0440\\u0443\\u0441\\u0441\\u043a\\u0438\\u0439 (Russian)\"}, {\"code\": \"sr\", \"description\": \"\\u0441\\u0440\\u043f\\u0441\\u043a\\u0438 (Serbian)\"}, {\"code\": \"sk\", \"description\": \"sloven\\u010dina (Slovak)\"}, {\"code\": \"sl\", \"description\": \"sloven\\u0161\\u010dina (Slovenian)\"}, {\"code\": \"es\", \"description\": \"espa\\u00f1ol (Spanish)\"}, {\"code\": \"sv\", \"description\": \"svenska (Swedish)\"}, {\"code\": \"th\", \"description\": \"\\u0e20\\u0e32\\u0e29\\u0e32\\u0e44\\u0e17\\u0e22 (Thai)\"}, {\"code\": \"tr\", \"description\": \"T\\u00fcrk\\u00e7e (Turkish)\"}, {\"code\": \"uk\", \"description\": \"\\u0443\\u043a\\u0440\\u0430\\u0457\\u043d\\u0441\\u044c\\u043a\\u0430 (Ukrainian)\"}, {\"code\": \"vi\", \"description\": \"Ti\\u1ebfng Vi\\u1ec7t (Vietnamese)\"}]'), | |
| ASSET_DIR_PREFIX: JSON.parse('\"\"'), | |
| can_create_collections: JSON.parse( | |
| 'false'), | |
| CAN_SEND_ANALYTICS_EVENTS: JSON.parse( | |
| 'false'), | |
| csrf_token: JSON.parse('\"1471535014/kOieX0euygOcLEDTb_qbXQ==\"'), | |
| DEFAULT_LANGUAGE_CODE: JSON.parse( | |
| '\"en\"'), | |
| DEV_MODE: JSON.parse('true'), | |
| INVALID_NAME_CHARS: JSON.parse('\":#/|_%\u003c\u003e[]{}\\ufffd\\\\\\u007f\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f\"'), | |
| MINIFICATION: JSON.parse('false'), | |
| /* A list of functions to be called when an exploration is completed */ | |
| POST_COMPLETION_HOOKS: [], | |
| preferredSiteLanguageCode: JSON.parse( | |
| 'null'), | |
| RTE_COMPONENT_SPECS: JSON.parse('{\"Collapsible\": {\"preview_url_template\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABNQAAABoCAIAAAC2bTrDAAAMFWlDQ1BJQ0MgUHJvZmlsZQAASImV%0AlwdUk8kWx%2BcrKYSEFoiAlNCbIL1K7x3pYCMkAUKJIRBU7MiigmtBRQQruiqi4loAWWxYsLAI2OsL%0AIior62LBhsqbJIA%2B9%2B1558058%2BWXO/fe%2Bc98M9%2BZAUDRniUQZKNKAOTw84XRgT7MxKRkJkkMEIAB%0AVaALjFjsPIF3VFQY%2BMfy7hb0huW6pSTXP/v916LM4eaxAUCiIKdy8tg5kI8BgGuyBcJ8AAid0G4w%0AJ18g4beQVYVQIABEsoTTZawl4VQZW0t9YqN9IfsBQKayWMJ0ABQk%2BZkF7HSYR0EA2ZrP4fEh74Ds%0Awc5gcSCLIU/KyZkNWZEK2TT1uzzp/5EzdTwni5U%2BzrKxSAvZj5cnyGbN%2Bz%2Bn43%2BXnGzRWB/6sFIz%0AhEHRkjHDeduXNTtUwlA70sJPjYiErAL5Eo8j9ZfwvQxRUNyo/wA7zxfOGWAAgAIOyy8UMpxLlCHK%0AivMeZVuWUBoL/dEIXn5w7CinCmdHj%2BZHC7h5/jFjnMENDhvNuYKfHTHG29J4AcGQ4UpDjxVmxCbI%0AdKLnC3jxEZAVIHfmZcWEjvo/KszwjRjzEYqiJZoNIb9NEwZEy3ww9Zy8sXFhVmyWVIM6ZK/8jNgg%0AWSyWyM1LDBvTxuH6%2Bcs0YBwuP25UMwZXl0/0aGyJIDtq1B/bxs0OjJbNM3Y4ryBmLLY7Hy4w2Txg%0AjzNZIVEy/dg7QX5UrEwbjoMw4Av8ABOIYE0Fs0Em4HUMNA7Af7KWAMACQpAOuMBy1DIWkSBt4cNn%0ADCgEf0LigrzxOB9pKxcUQPuXcavsaQnSpK0F0ogs8BRyDq6Je%2BBueBh8esFqizvjLmNxTMWxXon%2B%0ARD9iEDGAaDaugw1VZ8MqBLy/275FEp4SugiPCTcJYsJdEApbuXDMEoX88ZHFgyfSLKP/Z/GKhD8o%0AZ4JwIIZxAaOjS4XR/WM%2BuDFU7YD74O5QP9SOM3BNYInbw5F4455wbA7Q%2Br1C0biKb3P5Y38Sfd%2BP%0AcdSuYK7gMKoidVy/77jXj1l8v5sjDvwN/dETW4Edxdqws9hlrAVrBEzsNNaEtWMnJTy%2BEp5IV8JY%0Ab9FSbVkwD2/Mx7rOut/68996Z40qEErfN8jnzs2XbAjf2YJ5Ql56Rj7TG36RucxgPttqEtPW2sYR%0AAMn3Xfb5eMOQfrcRxpVvttwzALiUQmP6NxvLAIATTwGgv/tmM3gNt9daAE52skXCApkNlzwIgAIU%0A4c7QADrAAJjCMdkCR%2BAGvIA/CAGRIBYkgZlw1jNADlQ9BywAS0EJKANrwUZQBbaDXWAfOAiOgEbQ%0AAs6Ci%2BAq6AQ3wX24NvrACzAI3oFhBEFICA2hIxqILmKEWCC2iDPigfgjYUg0koSkIOkIHxEhC5Bl%0ASBlSjlQhO5Fa5FfkBHIWuYx0IXeRHqQfeY18QjGUiqqi2qgxOhl1Rr3RUDQWnYGmo7loIVqMrkYr%0A0Rr0ANqAnkWvojdRMfoCHcIAJo8xMD3MEnPGfLFILBlLw4TYIqwUq8BqsENYM3zX1zExNoB9xIk4%0AHWfilnB9BuFxOBvPxRfhq/AqfB/egJ/Hr%2BM9%2BCD%2BlUAjaBEsCK6EYEIiIZ0wh1BCqCDsIRwnXIA7%0Aqo/wjkgkMogmRCe4N5OImcT5xFXErcR64hliF7GXOEQikTRIFiR3UiSJRconlZA2kw6QTpO6SX2k%0AD2R5si7ZlhxATibzyUXkCvJ%2B8ilyN/kZeVhOSc5IzlUuUo4jN09ujdxuuWa5a3J9csMUZYoJxZ0S%0AS8mkLKVUUg5RLlAeUN7Iy8vry7vIT5XnyS%2BRr5Q/LH9Jvkf%2BI1WFak71pU6niqirqXupZ6h3qW9o%0ANJoxzYuWTMunrabV0s7RHtE%2BKNAVrBSCFTgKixWqFRoUuhVeKsopGil6K85ULFSsUDyqeE1xQElO%0AyVjJV4mltEipWumE0m2lIWW6so1ypHKO8irl/cqXlZ%2BrkFSMVfxVOCrFKrtUzqn00jG6Ad2XzqYv%0Ao%2B%2BmX6D3qRJVTVSDVTNVy1QPqnaoDqqpqNmrxavNVatWO6kmZmAMY0YwI5uxhnGEcYvxaYL2BO8J%0A3AkrJxya0D3hvfpEdS91rnqper36TfVPGkwNf40sjXUajRoPNXFNc82pmnM0t2le0ByYqDrRbSJ7%0AYunEIxPvaaFa5lrRWvO1dmm1aw1p62gHagu0N2uf0x7QYeh46WTqbNA5pdOvS9f10OXpbtA9rfsH%0AU43pzcxmVjLPMwf1tPSC9ER6O/U69Ib1TfTj9Iv06/UfGlAMnA3SDDYYtBoMGuoahhsuMKwzvGck%0AZ%2BRslGG0yajN6L2xiXGC8XLjRuPnJuomwSaFJnUmD0xppp6muaY1pjfMiGbOZllmW806zVFzB/MM%0A82rzaxaohaMFz2KrRdckwiSXSfxJNZNuW1ItvS0LLOsse6wYVmFWRVaNVi8nG05Onrxuctvkr9YO%0A1tnWu63v26jYhNgU2TTbvLY1t2XbVtvesKPZBdgttmuye2VvYc%2B132Z/x4HuEO6w3KHV4Yujk6PQ%0A8ZBjv5OhU4rTFqfbzqrOUc6rnC%2B5EFx8XBa7tLh8dHV0zXc94vqXm6Vbltt%2Bt%2BdTTKZwp%2Bye0uuu%0A785y3%2Bku9mB6pHjs8BB76nmyPGs8H3sZeHG89ng98zbzzvQ%2B4P3Sx9pH6HPc572vq%2B9C3zN%2BmF%2Bg%0AX6lfh7%2BKf5x/lf%2BjAP2A9IC6gMFAh8D5gWeCCEGhQeuCbgdrB7ODa4MHQ5xCFoacD6WGxoRWhT4O%0AMw8ThjWHo%2BEh4evDH0QYRfAjGiNBZHDk%2BsiHUSZRuVG/TSVOjZpaPfVptE30gui2GHrMrJj9Me9i%0AfWLXxN6PM40TxbXGK8ZPj6%2BNf5/gl1CeIE6cnLgw8WqSZhIvqSmZlByfvCd5aJr/tI3T%2BqY7TC%2BZ%0AfmuGyYy5My7P1JyZPfPkLMVZrFlHUwgpCSn7Uz6zIlk1rKHU4NQtqYNsX/Ym9guOF2cDp5/rzi3n%0APktzTytPe57unr4%2BvT/DM6MiY4Dny6vivcoMytye%2BT4rMmtv1kh2QnZ9DjknJecEX4WfxT8/W2f2%0A3NldAgtBiUCc65q7MXdQGCrck4fkzchryleFR512kanoJ1FPgUdBdcGHOfFzjs5Vnsuf2z7PfN7K%0Aec8KAwp/mY/PZ89vXaC3YOmCnoXeC3cuQhalLmpdbLC4eHHfksAl%2B5ZSlmYt/b3Iuqi86O2yhGXN%0AxdrFS4p7fwr8qa5EoURYcnu52/LtK/AVvBUdK%2B1Wbl75tZRTeqXMuqyi7PMq9qorP9v8XPnzyOq0%0A1R1rHNdsW0tcy197a53nun3lyuWF5b3rw9c3bGBuKN3wduOsjZcr7Cu2b6JsEm0SV4ZVNm023Lx2%0A8%2BeqjKqb1T7V9Vu0tqzc8n4rZ2v3Nq9th7Zrby/b/mkHb8ednYE7G2qMayp2EXcV7Hq6O3532y/O%0Av9Tu0dxTtufLXv5e8b7ofedrnWpr92vtX1OH1onq%2Bg9MP9B50O9g0yHLQzvrGfVlh8Fh0eE/fk35%0A9daR0COtR52PHjpmdGzLcfrx0gakYV7DYGNGo7gpqanrRMiJ1ma35uO/Wf22t0Wvpfqk2sk1pyin%0Aik%2BNnC48PXRGcGbgbPrZ3tZZrffPJZ67cX7q%2BY4LoRcuXQy4eK7Nu%2B30JfdLLZddL5%2B44nyl8arj%0A1YZ2h/bjvzv8frzDsaPhmtO1pk6XzuauKV2nuj27z173u37xRvCNqzcjbnbdirt15/b02%2BI7nDvP%0A72bffXWv4N7w/SUPCA9KHyo9rHik9ajmX2b/qhc7ik/2%2BPW0P455fL%2BX3fviSd6Tz33FT2lPK57p%0APqt9bvu8pT%2Bgv/OPaX/0vRC8GB4o%2BVP5zy0vTV8e%2B8vrr/bBxMG%2BV8JXI69XvdF4s/et/dvWoaih%0AR%2B9y3g2/L/2g8WHfR%2BePbZ8SPj0bnvOZ9Lnyi9mX5q%2BhXx%2BM5IyMCFhClvQogMGKpqUB8HovALQk%0AeHaA9ziKguz%2BJS2I7M4oJfBPLLujSQs8uez1AiBuCQBh8IyyDVYjyFT4Kzl%2Bx3oB1M5uvI6WvDQ7%0AW1kuKrzFED6MjLzRBoDUDMAX4cjI8NaRkS%2B7odi7AJzJld37JIUIz/g7NCTUflsJ/Fj%2BDdjNazxy%0As4mXAAAACXBIWXMAABYlAAAWJQFJUiTwAAAEJ2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6%0AeG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAi%0APgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRm%0ALXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAg%0AICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgICAgICAg%0AICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iCiAgICAgICAgICAg%0AIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAg%0AeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIj4KICAgICAgICAgPHRpZmY6%0AUmVzb2x1dGlvblVuaXQ%2BMTwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPHRpZmY6Q29t%0AcHJlc3Npb24%2BNTwvdGlmZjpDb21wcmVzc2lvbj4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24%2B%0AMTQ0PC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZm%0AOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xNDQ8L3RpZmY6WVJlc29s%0AdXRpb24%2BCiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4xMjM2PC9leGlmOlBpeGVsWERp%0AbWVuc2lvbj4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT4xPC9leGlmOkNvbG9yU3BhY2U%2BCiAg%0AICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj4xMDQ8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgog%0AICAgICAgICA8ZGM6c3ViamVjdD4KICAgICAgICAgICAgPHJkZjpCYWcvPgogICAgICAgICA8L2Rj%0AOnN1YmplY3Q%2BCiAgICAgICAgIDx4bXA6TW9kaWZ5RGF0ZT4yMDE2LTA0LTAyVDIxOjA0OjA5PC94%0AbXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5QaXhlbG1hdG9yIDMuMDwv%0AeG1wOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8%0AL3g6eG1wbWV0YT4KzNxgGQAAJwlJREFUeAHtnc2upVW1hg8IFGgsQSuCmNgmsUGDFoREGtCwyTUQ%0AL4C%2BaAT6tNFwBV4AMaFJoGXDhgltG4im%2BJGjAQqE8%2Bz1VL01zvzW3rXdVXtVYr2zMXjnmONnfs8u%0Ak2%2B49s9d33zzzf90lUAJlEAJlEAJlEAJlEAJlEAJlMB5Erj7PIu3dgmUQAmUQAmUQAmUQAmUQAmU%0AQAkcEejw2X8HJVACJVACJVACJVACJVACJVAC506gw%2Be5I26DEiiBEiiBEiiBEiiBEiiBEiiBDp/9%0AN1ACJVACJVACJVACJVACJVACJXDuBDp8njviNiiBEiiBEiiBEiiBEiiBEiiBEujw2X8DJVACJVAC%0AJVACJVACJVACJVAC506gw%2Be5I26DEiiBEiiBEiiBEiiBEiiBEiiBDp/9N1ACJVACJVACJVACJVAC%0AJVACJXDuBDp8njviNiiBEiiBEiiBEiiBEiiBEiiBErjn9AiuXLnyr3/967PPPkN8/fXXp09sZAmU%0AQAmUQAmUQAmUQAmUQAmUwH8lgbvvvvu%2B%2B%2B574IEHvvOd7yBOeMa7vvnmmxOOc/SPf/zjww8/zLai%0ABEqgBEqgBEqgBEqgBEqgBEqgBEKAKfShhx763ve%2BF88iTjV8/vWvf%2BUDTzKpdeHChaVEtyVQAiVQ%0AAiVQAiVQAiVQAiVQAncygS%2B%2B%2BOLjjz%2BGAB%2BB/uhHP9qL4sbD5yeffPLRRx/dc889ly5d2luizhIo%0AgRIogRIogRIogRIogRIogRK4fPnyV1999f3vf//BBx/c0rjBLxxifmXyJK2T55ZdPSVQAiVQAiVQ%0AAiVQAiVQAiVQAiHg2MjnlwyScUacNHzy46D//Oc/CeW7bZNQUQIlUAIlUAIlUAIlUAIlUAIlUAJ7%0ACTA88utpGSS3v13oBsPn559/TsX%2BnOderHWWQAmUQAmUQAmUQAmUQAmUQAlMAg6PDJL/wfBJKOvL%0AL7%2BchapLoARKoARKoARKoARKoARKoARK4GQCDJJOlDPspE8%2Bievf85ywqkugBEqgBEqgBEqgBEqg%0ABEqgBG5IYO8gedLwyah6w6INKIESKIESKIESKIESKIESKIESKIGFwHacPGn4XJK7LYESKIESKIES%0AKIESKIESKIESKIGzETh2%2BNzOqWdr0KwSKIESKIESKIESKIESKIESKIE7kMAyVB47fN6BaPrIJVAC%0AJVACJVACJVACJVACJVAC50Sgw%2Bc5gW3ZEiiBEiiBEiiBEiiBEiiBEiiB6wQ6fF5nUVUCJVACJVAC%0AJVACJVACJVACJXBOBDp8nhPYli2BEiiBEiiBEiiBEiiBEiiBErhOoMPndRZVJVACJVACJVACJVAC%0AJVACJVAC50Sgw%2Bc5gW3ZEiiBEiiBEiiBEiiBEiiBEiiB6wQ6fF5nUVUCJVACJVACJVACJVACJVAC%0AJXBOBDp8nhPYli2BEiiBEiiBEiiBEiiBEiiBErhO4J7r8vwVf2P0rrvu%2Bvrrr23F1sX2mvxGPe9C%0ACltsVraG4Z/xWz0DaLQNOLMnlU8u62lsRPpa5zibsAgjt01n5e0p6blwSiFOiEx8xEyM3p7urbk3%0Afol0GxuRXITtsBFxzrCpjVx6bQPwGDPj0Ti1BNx9990n1Jk1q0ugBEqgBEqgBEqgBEqgBELgcMOn%0A7%2Bt5id%2BOoBzpRLByRV76T1iEEUxA4iPinNWMT8yZhcVTOWJb0KNYhGvexAfEo5g3j7ayWyrMRm4X%0Au8TM9JmLTiQi7RRYxTxKukezQo4iUlxPqiUAMWPQLv3Xdv/veY/uNBYx7LSzLBq/Hk6Xo2WbAEt5%0AmvRZP5FLhW5LoARKoARKoARKoARKoAROIHC44dPXd1/ctYyaCJYiW66LU%2BvbP5aPm7BTuNUaTwrb%0APG2c8ewVJ4fNgjP9hKzlyC12u2bB%2BTh%2Btrb30Sgys6L1zxYcxZmnUGSbgAQjEqMgBsEyOAEzBX3K%0AlSLb%2BFwGkeW/CoLxmOJlFrtU41RPspaAvVuzTNFOjx3xI2L31qmzBEqgBEqgBEqgBEqgBA5D4N//%0A/vcHH3zw4YcfXr58mY6XLl36wQ9%2B8PDDD99zz%2BEGvdM/6eHu5Nu8N2OiQOBBsECGZetCzwfgXZ9h%0ADCeWxZGeGaMTS4X4CYueYsZM/169N3hbeW9YnIis%2BaQ4bUpBlw9IDNvcR03wdOY0Ii2m4NQu1reI%0AHhMNThgikVzGeCM9WiJzdJyYvVJhG2yYl9ECgTU9Znk97oYQV/wE42SLiFNxGpt0g7dFuA/19atP%0AU7YxJVACJVACJVACJVACJXBrCXz55ZfvvPPO22%2B//e6773766adL8YsXLz755JNPP/30U089de%2B9%0A9y6nt3F7/eOs5RJHL/5ff/2Xv/wF/yOPPLKcnmFLNbJ4cXexZeZEY1lHza4tnKnvpOGYwaTB%2Bta3%0AvqXIkWKmRCsIUMzKx3mW3GxTJJ69YmnhFuviERGxVGCbB%2BG50No47aslPmLqq9Wv/Sf1cdjCYGvu%0ATUzYjDR%2BWk5de69x7fDqf%2B2%2BOLfpeq7d/ep/r/1buI4r1WjtP4C9uI6rv/caS3AeCkG7ZUuwfvp6%0AywScULxHJVACJVACJVACJVACJXALCfAi%2BtZbb73xxhvvv//%2BDcs%2B%2BuijL7zwwrPPPnvgF1c%2BjOVu%0AP/nJT3xvzz0PN3yCiYmCxohMm1999dVu9jyaQtHL1EQwmDJjOHbG5kiUE%2Bhx2u4%2BPB0V0xmPYtY5%0AzjNT9tbEmbXMVORyRBeXX5s8r05iEHvt0ppSAWij9DX9apvdf8xNgEJnwo67idUSrMiWUvFMHaeP%0Ak61i3iSU8u8k1/NuARVhTU8tOLtEb%2B%2BTI0UsguB5aq4eNK231ZaH6rYESqAESqAESqAESqAEbiGB%0Av/3tby%2B99NJ77733H9V87LHHXnnlFb4X9z/Kupng2z98Zi7ild2hApvh08kTy6mRCF70WRkwGDtd%0AeBBYT%2BGCiA0mnYvfgUHLUUSy9oqUWqrN4JRahFtsZqqIjz76CD/fkP3ggw/mMRV0zErTvR5OKeJK%0A5Tm2ecnkKnQmS5HIsFUkNwEInLFTGENBhDbClARna3ftfIQ8Bc6PP/4YSwrfyC4i/w0suOy%2B3E3n%0AXpvICB%2BZy%2BDRmZo6tXur1VkCJVACJVACJVACJVAC50TgT3/6E5PnJ598cob6Dz300Msvv/z444%2Bf%0AIfcMKccNn4f7mU8uzVt7LINERlC%2BZTmD6GeffYZmEeBcwbcpX7hwAUu6i6nDOswGeNAZEiLinJ50%0AN2tajvauma6enpkyq6k9RWfxUCyfDmcKMnX7sFiejhhHIAISQzW301ok9RGpTxfAfvHFFzipCUMS%0AU5ZqySIFDXks/gceeCCXUdjRC2AjFj9bjiyiUMdjwLRHtXaLGK8x73/07%2BDat2RfC/wfHopb8USk%0AzHsSsNxHTxL3ClNiieECqUMLNUJ9mpp7G9VZAiVQAiVQAiVQAiVQAmcmwOT54osvMjWcrQIf5JD%2B%0A2muvHWz%2B3HvPww2fvLt7AwTv9y5GCwhimSgYfq5cuaJ/RjqaMnzef//9eQaKOHgQz3gQPyJbRbaJ%0AIdeFBxGbgIjkzlJTG5lqlrJmjuLkqhxhM1Cl%2Bxw%2BcdKCp8OySI%2BIU08sKS7p2UK20PMCTGvEp4LX%0Ay5UQRFIEP5F8GCte47XexERKufUO88gA74OO0J87zxRjsN6fmy/LIyxZ3JP76OGq3nNbNjdcGnkN%0ArTE%2BHVph8WxtarzaLLRiFqwugRIogRIogRIogRIogVtOwO%2B2PfPk6X1I/9WvfvXb3/72kN9/u6A4%0A3PBp4zntoJ0xAPH55587/PhO72v9fLknkg/xKEIAyw%2B%2BqDBj5rPh9yiWLNNTZFfpyKlHEWsi21RQ%0Azy2epeziYavHXg5XWp7IXIQDFWMPz%2BVDOQiRS7t0zHSEB%2B0WbZ0UpyBIsSz7UocWZmFd2ytZh1yE%0A9W2B9Saxudi1Ykf/xZll8dj4l3izDJv35%2BZ5hImLm8gKp6y8p2XpYsFYRfw0mjfRnwqcolOKUzwp%0ANXOnTsGKEiiBEiiBEiiBEiiBErjlBHjzPPN32y6X4fNPSr3%2B%2But5SV4Cznt70OHTV3bGBsScNPjA%0Ak4lCD2//PDM6L/1BQ5YTFIKF3%2BAwwhm9pLvd5V0dQdXTk1xEmm7rxGO8TZc6OlPQU20eXGGMAxWP%0Aw9CFZdFlNnLr0WINs/jRuHltObzRxSMfalbG46k3Id7L8OXIJ4rGY003QO2VcrEZMJ833c2dWd5c%0Af25y7frr8Mn1iKea1yOeyNzTUoudW7tMy6lLnpSiOB4q%2B9RuY5fcua0ugRIogRIogRIogRIogXMi%0AwO%2B2Pfk3DD3xxBO//OUv%2BfOeXIA/%2BPnqq6/%2B8Y9/PO4ylKLgc889d1zAufoPN3zyEs%2BTTOvMg2Wu%0AwM/y1R%2BRSAcD/HiIRDBy7GKPglnSmSnWwZ%2BAhFnW9FidsQiWKYtdCnqa1hYkV8%2BuzFWTGB4BnQfn%0AWYjgGZ2s8rAOPxzNC3iqZVJixWMby87hjbJs5aa1smXJyk0iOOKGZKU4Hpdd5q1SLcIYKrgoe01e%0A/f8FLLXEk0WYd8j9EdwfJ8JTLIkE45EAIqWobHeFjaI9mtYA0iXJER4KKuhlLls01tZqtl0lUAIl%0AUAIlUAIlUAIlcN4E%2BIzqjTfeOLnLz3/%2BcydPwhBsTxg%2BiaHgM888c1v%2B/ufhhk%2BeMy/uiKxMFzLN%0AuOJswFa/W7IcRRBzNkg1hPFYU7Q6PZ3Bak5nosHWj001K2tT0Apza5FYj3y6WJ/OCcohKqOU9U1P%0AayclhiUSWQ5gVPaSOrXUzMJjNcJmfZwzBW0pEglzpbU3We6TggQbaQB1XNZUL7mmpCwxuYw3z%2BTM%0A1lNaWJBcRO45W1MwWwU2XdCU0uMFYIgHq5P/EVKZI5wsq5nOlhjD8LhN5YoSKIESKIESKIESKIES%0AuOUE3nnnnRv%2BPc9ljFy22ytRkLI/%2B9nPtkfn7Tno8Ll9GN/v43e00Kmd7/qcssVvmEdsXY4oags6%0AXRBmpE4Ckm4wW47Q2hmfRJ1uLWu1JC41c6ow0XZpirC1RdCzS1I4jZ8ZiV8FZK/ZIsEeYbPAgqaX%0ARcLEpt4hwWzxE2OY1uK2MyD3QXClXfj%2B4TPdTaQIKXuLz5vkA0/SWRx5ajqaCtx59qUsfi%2BJno3U%0AsQgic3PhJJ6tpaxmqeTaejnitKsESqAESqAESqAESqAEzoPA22%2B/fU5l/8uHT1/ZtRBERDNFMGPo%0AjJUyw4AC68iBYCRwKrAIljCXHlMMM1KrP1ls0Ys1BptE60xP9N50nbOjNdN3EUTy%2BEsXU7QeSYnH%0AZN7DWoQABEfEIK5S2P3naG7bTZ5Yjoi0ThpZISluZ5hlvcO0qUMAgyLWhd%2BwVEZYH5EKBFtBMVMS%0Av7v70djsI1iQSBJxXu13rU76WsqtLaaep1SwDsO8kXpwgje3RVhBgfYofmvWlkAJlEAJlEAJlEAJ%0AlMAtJ8Cb8LvvvnvLy1KQsrzG8yZ8HsVPqHnofrmKb/zT5ijCV3xsFrMBp84DCPx4sBlR3OIxLPWX%0ALHP3Wpwuc9FTuL0a8f9nV5z2XWJmMAFzJSVPFEGYiXqwfsZoelokHuERBFxsr8mj/5pCGMvK2Bkw%0AKxtmZOIJMDGnGQIVibTyvMDe4mTNFGNmll9WLpl0KpOCx1xv4q1irelRrIlanfBkoSmV1gSkF8LI%0A5CJY%2BBW1JVACJVACJVACJVACJXB%2BBD744INPP/10W5/fMMQPdubba3/605/OGLa/%2Bc1v9PAjo2%2B%2B%0A%2Beb2R0Apy59v%2BfGPfzwTD6APPXzyNp%2BnUmOZuR0z0L7x5/1egc34ZIBFHEuwrO2gkvoIV1pHbBt5%0ARDziWt7VO%2Bs0YElMwZm%2BOElZFgF4ljC3009fBiSekWHJUz04eWovaalZf0fluuHIyBl//Xgz4BFG%0ATa3Fba0Tv%2BMfNiPcrEy7k4ubbopdfGQTYxHR8wIUN0ubI6%2BXS8760Qi6G0MdW2Atsi2of7HEnzJy%0ASey2BEqgBEqgBEqgBEqgBE5DgF9duzcsv9t27%2BkPdytHTKrPP/98thEU/28ePnlTn%2B/3bLMcYJxV%0AcCYMNOo5aRAgMo5YZmG3wydhaWGW2xA3AEudWE/xEKw1V39OZ7zpeNIl2niDCXPNrXqGLR62lAUR%0Ay7BsdQoHfa381WfJdgpyXXbxSIYJs6O99lor0BHB5EkimiJY42fZvcVJNN1S2pmbyyByB51siY9z%0ACv3a1Dc%2BLfCzdFpcO2smeFt8eqpLoARKoARKoARKoARK4PwIXL58eW/x/G7bvaeL87jg44ov6bd2%0Ae%2BhPPrm9b/m%2B3zsJoBGOMUwCBmTSyAM7ZVnBgcHBRpvhk62nRtposTlKZLpEcORNpgeN36XWGhm7%0ATbyWdPTfvUXinGXRlGKZ5eeceerUTApi0W5N3x1eD1jS2VLZeDoanMSI3XWuXskpzjq5pBWslqv6%0ARbFIKpCO1iLsmL7pOD0659HURKY4/miLu7Wanr25BqSUIs6KEiiBEiiBEiiBEiiBEiiBsxG4DcMn%0AF/XVX%2BFIEJsRNM/DhMAyYObidKRx7JzDJ2GczvqZcKzj1GQLPAptEpO%2BnBKwLCP3xpu7xLPFr3Mr%0AcmrufHCunVJLImEpaGKsFThVYHMUYTpbuzuFZqvT4OOKWMHixM8vDdqtdVKBbbLizJXSbnb3SvFE%0AJCt1tsKYmUIMTixgWUtKalaUQAmUQAmUQAmUQAmUwOEJXLp0aW9TvmP2uM8zt/HHfe/uccW3FW6h%0A59DDp6/7PIAv%2BhEOAJ565JCQUQHhqSlsXQ420147uT58MlcQgDUXm6XTLfXJnV3wZ4vm1Mi0jnMm%0AGoM11%2BBpzcKzFQlLkdQxePoXTTs7KrbWUnnk2Qtt/OxiwPSkI8Gcuk1YIvVk4FRoicnFCMsXJbfi%0A1LIKu5iiTtO00zNtikwn2joRbOnL0j/tkthtCZRACZRACZRACZRACRyYwHET5quvvrr8wiF%2BzDN3%0A%2B/vf//7nP//Zrb9wKEdTHFd8xtxyfejhc3kAXvfxzJf%2BqR02MnJEWIQti5HG5VYPdjZyi13azakj%0AKRHeJHXwE08vA2ITn0i7sN0e4eRU/1akwnHCK2kthVYkZcYczVW7D0tx0tQjPAbj4XGiFVtPKi/C%0A1jgjDKBsVr40csOfGK9hJM4cLQW9M6cRVmA7U3TmyCKmnGC5A6fYCLdLyixeXQIlUAIlUAIlUAIl%0AUAKHIfDII49cvHhx%2Bwtv%2Be218xfY8rtt5/DJ5PnrX//65BtS9uGHHz455jxOb%2BfwySs%2Bj5QX/UW7%0AdcDYO2bg3Lv2YkqXCEcOp46kUDDaC3hJGzFBJR2R4AhTsjVXZ8pyGv8Sn5gp0tELz220wmpx5gHx%0Ae6UcIXQ6HOr3B0rRGRTJcu29z6ymnmHbxJxyRHy2Uyx12BocwUNxvZkytelYv6xTeBQmEXybd7Qx%0AFIyYxRdNzOLptgRKoARKoARKoARKoARuIQHeVJ988sk//OEPt7CmpSh7%2BD/ySevbOXz65Px5U39c%0A063v9L79M3jo3Fpnm23AMhJYZ7EOG04dObLFUnBWmzMPYSbOeLV2Ji7PNcM4YhsPwsFPfxK58JyR%0AvD8t9k5NcSpIJNIWeMyy8lHj3Z9IxenK/OlRptDtfYhPI7U1Uxnn9Gy3eLbLFPxLHTy080uA4HoE%0AeMmlizXzpLNFnDBx4XFZH238co3ZoroESqAESqAESqAESqAEDkbg6aefPo/hk7IHe4TZ6DYMn/P9%0Anqs4/3gn3v4ZMBIQ4akjR27PqelYI/XMAP1XJ4wxwjF74MQuibPFrIbfSIuzjQeRjgj9WrazCDr%2B%0A1DFFyym3wrqMISv3985ufQRvpSXedFMIoA5OtpYyMcGchrZOLB6WR1bzMpayGmGWwqqxtjDMrelo%0AtwbMCvitoziK29XRJh5BGLeyIFu7TGvwrsCRITJ2CnW%2B%2BorcgVOX6eh5h2j8oRFnRQmUQAmUQAmU%0AQAmUQAnccgJPPfXUo48%2B%2Bv77759QmR/snKfLdh6pKUjZrf8AnsMNn77W563dLU/oqz%2Bfufm0%2BrH4%0AM11ETCI4GUhmJBqnK9WokxlDQZiCz5rRrlSmpprEOK3pB4N8VMs2RwinNQR%2Bs6jJ9lrt6zOn/uTm%0AqvjVWFEgZhGfggtzc6wC7eKUlQo41d7BJ6KaYQiWt%2BWIYDryUDgJsDt%2BlkUizLJmSiGOyu0W8ZwS%0Ar%2BXIYA5zHzxx0tr0RHKk3kUd8cyKh2po/Fh7oXXubnFkKMJyG6FfexxDg%2B2FJVg9RdolrKIESqAE%0ASqAESqAESqAEzoPAvffe%2B8ILL7zyyisnFH/zzTefeOIJf4EQv9uW7QnBHFGQsifHnNPp4YZPp4Xl%0AMXjXZwKZTjxEshCMFtnicQDAoknRsnU6isgRgnT8DjnoCLRbThHLBdxyFD%2B9bGdN9c539RPRnCJm%0AInq7Zlm0KVbDckmfiCNy7ehtOWJZEA9iWrYhZryN0JZCsEzHY0cnap1oAvR7B6wCp0W0trZaPNbk%0ASA%2BJlsVaMwGm%2Byy5EjHJNdI6%2BClFcNIRWRypk4tgpSw60HYnR1sWAQqdWOpMbVlvlbshpl9dWwIl%0AUAIlUAIlUAIlUALnRODZZ5/9/e9//9577x1Xn18%2B9Pzzzx93uvgfe%2BwxCi7Og20PN3wuL/d5y2cG%0AYPLmnZ6FU4szW4cfiThRcMQWy7CENcD5xK3BtsiModDp1OEEgod4WyMyzBBvHaxl7W5wZjaEYcQo%0A0gJhSmwqGJle3oEKLvwsNGEz12vnY8%2BIlLX1vAYe65DrfRKMny74eQQWp2g8pNtdSxinWBZHtqBI%0A9PQYhodcF5EI/fNi%2BLm/uVrrE4PAkxTSbWc6mlO1MQQsldmaYjA2wl48aT783GJMNQV2dlTHk5iK%0AEiiBEiiBEiiBEiiBErjlBHjt5JPPX/ziF5988slNFn/ooYcodRvfYw83fIYUAwOTgBPFbii4Pnw6%0AdYCDhSYFQYy5BqudOvAwF2Gt5hBiPNZGVHC6wOOiAsLxY9a3MgUVBCiwlKI4S4HF6SXRLI7YLk48%0ALJtSjaUHa6S9SOdoV%2Ba6ybxn8NWrX/vPrtj1X9OK2zDyvS3WpYdTuxtpMAG7Z7r%2BrctuTfRhSUeQ%0A6308In1ZFufUB%2BDU7%2BNFkI71GgSgsV6D/9OBLTr%2BXCDXRlgcYS5fTeLnCiucxMxFcdZ8dmN04mft%0AQq5%2BIDxz7ahntqsugRIogRIogRIogRIogUMS4M%2BiMDS%2B%2BOKLvGOfuS9v0S%2B//PJt%2BQsrufP6Hp%2BD%0A8xC%2Bx/Ou70DC1hmAt3y/7ZifjnWQ8Ai/12ALLNP1eIQlnsWXgZpUw5OyeNxSnOWMQbqReKiJk/jl%0AYZM1e5HFsiOWRLa5EnfA6TBjukdYnLNX/IRZHw8BbJdFfcvi9/JY7nzfffdZ0HYeUYRqRFqfRD3e%0A2Tt4RDyRaNsRgAfLMosW8yb43QqZrZXtmzuEFQFUYPHVJIUw08kimC1dvABPgcdbJZ1TFkXwkMgp%0AKYRRyi2P7wVMMYx4stLImt6Nm7i1FJGEUXN3xyPjrfCwjLQyOi3sMj1eZgZUl0AJlEAJlEAJlEAJ%0AlMA5EXj88cdfe%2B21l1566Wyff/KZJ5MnRc7peqcse7jhkxd339d9v8fy0u8YgOC6aqcILAunwYpY%0ABIv4LMcVUmZ8GjlU7IaLqwOGmgAEpRC7kkeGaUQd5%2BxCPAG0YxZi2YIAgzlloJrFnRLx8IzEIEwx%0A/sKFC%2BmLSKOIOBEWcViiWoTtUicQEBxxAY/SF2eCaWQYlprYtJ5aJ1NfThHE29pnSU0TsbTGsgjm%0A1DAtiQjtkm4LsoBsgJWdOQl2pR3CFD2282Kpj%2BB0bg3gEbJyap15Zz21JVACJVACJVACJVACJXAb%0ACTA6/u53v2P%2BPOHnP/dej5/z5IPT2/uZpxc73PBJP8YG3umxvvozJ/Dqr9%2BJwpEDp%2BOEA4ABCUO4%0AErMITymIsJfFbbp4PLpa8Zj/pD7B3DApijjJ5uYZPjPVKJbu3m029GHTK8IYe1GEalpFyhKQapbC%0Aw6l1PLWI1mBODeO5WGl6gkiXbbXUtNRSkFNStDZNhdS0L9splkSzkjKD1bNLWiCgka3cYuNHzHbR%0A3AedLUK2O19NCZRACZRACZRACZRACRyCAAPk66%2B//tZbb73xxhsn//0Vb8NfVeF32/IbhnzLPcQV%0AT%2Bxx0OGTm/jYvMozO82L%2BfbPuII/Q8s2IBUQzieL3aZYGZvZI8KjWdOyFuE0W7uQyMdxKRiBMynL%0A8Mnnk2RtB0WLmxVLFzvOh0pl21HNta1pLqekE5wiswLaOjqJIR7gZkneOqajcS4ec7GWwqpJmZHz%0A6%2BjRTEmu6SbO9HgSsE0hxrC0Zmu8wW5noprnRWDnwkM8nhRBsCjuUYTO3WFNCZRACZRACZRACZRA%0ACRyOAO%2Blzz333DPPPPPOO%2B%2B8/fbb77777qeffrq0v3jx4pNPPvn000/z9zzzjZBLzG3ZHm745J2e%0AacSXeO2cP/EYwPt9pp0QmVlqhw0CEHMlBUHkDZdhM2vRFMdjCy6WWYXKaL7zFssPNzpoofnuUGN4%0AOtYyfM77LI3c2igdFVgStRS3tV3cWpYA1qTh5fVjE2Y1T7EUmVkpMsX2i2LBWdb4ZKVm/AlebrLc%0AJxcjPssUI7U5Oi6egCUrW0XoRehP5eMEHYV2XED9JVACJVACJVACJVACJXB%2BBBgpf7ZbfAz2wQcf%0A8Oc9L1%2B%2BTLtLly7xBz/5gJQx5Py6n7ny4e7E%2Bzpv9s4JvLg7zDCe4XTraEdAVp4qIwEiTsLQBk%2BR%0AgJmlXjxEzoJJ3Aq7JN0At1yexRTqffzkk%2BfCeTR97tYu5MiYYlPt7JUnwjmfi21SENaZ1XCyzFKY%0AYkG0y6MlgO3sNe9A1glHnM6C6qTPROvkDsmK8MiwVEiWYWwRau3MSnCciYxIhXgQrIWkF/DIamic%0AeiL454on7SpKoARKoARKoARKoARK4PAEmDZ%2BvFuHb32GjocbPr2cb/BzzsTjIMoMwJs9i8gIdF7x%0AFdkmcom3URKTFbE9SspWpAuCG3pzRJbj5ZUrV8zldwgtR9lyAbTd8xRLx7TDP7VZybUU1pXTJcUt%0Ap1nER0cQZqQW/yKOjq99XZKFsNpSc0bu8o6%2BoFkzZWoClsSkKGbwCR1n1jYlninQy3beJEfzGrNL%0AdQmUQAmUQAmUQAmUQAmUwGkIHG745CXed3qu5Qu995sv984qCZsPsKTMGPX0JHEWT9/FmeC9wmCK%0Au2YRjhgm%2BaT729/%2B9g9/%2BEOOvvvd7%2BZnPp05GU0VBM%2B1t5dOGk2RLen4LRIRpylu1Vt7wqlH6RVB%0AEXU8ERylYMTJ8V4pwVOk7FZsGyXRgqdJSZHkKrARVtPqnJ5F82VN3%2BWo2xIogRIogRIogRIogRIo%0AgS2Bww2fszdv9ry4H73170Te432bxypMISa5U%2BOcYVPvjU9uBGFTJ2sKyxKGUGvxsPwglJ/oZew0%0AS78DZyxOtEc3bGp9q009E5dSbI3HkpItIhXiTGREwoyZFSxoZEolUbGtnMiImTLjpyZmxk89w6ZO%0A2RkcJ2IGb3U8ETN30bSYYcd1XLK6LYESKIESKIESKIESKIESkMBBh0/e3fPKzjDmd9v6Qu%2BRmpiE%0AcUude79gOSI%2Beomc/qkN23qW9GXLtb0bia48SO7gnLm1lDJlqblsicGTLsspWwO02SYs/r0Vcpr4%0AbRgxOo0xBc82N0UWkchZJzE5jSdiHi2584j4bA3LNqWm2J7GEzFrztzofKERy90SU1ECJVACJVAC%0AJVACJVACJXAcgYMOn1xivuvzEn/cteovgdtIYP4rzTUYOPV38gyTihIogRIogRIogRIogRI4PYGO%0Af6dn1cgSKIESKIESKIESKIESKIESKIEzEujweUZwTSuBEiiBEiiBEiiBEiiBEiiBEjg9gQ6fp2fV%0AyBIogRIogRIogRIogRIogRIogTMS6PB5RnBNK4ESKIESKIESKIESKIESKIESOD2BDp%2BnZ9XIEiiB%0AEiiBEiiBEiiBEiiBEiiBMxLo8HlGcE0rgRIogRIogRIogRIogRIogRI4PYEOn6dn1cgSKIESKIES%0AKIESKIESKIESKIEzEujweUZwTSuBEiiBEiiBEiiBEiiBEiiBEjg9gQ6fp2fVyBIogRIogRIogRIo%0AgRIogRIogTMS6PB5RnBNK4ESKIESKIESKIESKIESKIESOD2BGwyfd999g4DTd2pkCZRACZRACZRA%0ACZRACZRACZTAnUBg7yB5g9nynnvuuRPQ9BlLoARKoARKoARKoARKoARKoARuFYG9g%2BSxw%2Bddd91F%0A4/vvv/9WtW%2BdEiiBEiiBEiiBEiiBEiiBEiiBO4GAg6RDZZ732OGTCEIfeOCBJSGZFSVQAiVQAiVQ%0AAiVQAiVQAiVQAiWwEDhukDxp%2BKTEfffdd/HixaVWtyVQAiVQAiVQAiVQAiVQAiVQAiWwlwAjJIPk%0A9uiub775ZuvV8/Vu/Xu3joupvwRKoARKoARKoARKoARKoARKoARC4Fu7xe8cWn7t0Em/T4hPS1km%0A/O9unTCpplNFCZRACZRACZRACZRACZRACZTAnUaA4fG7u8UIuRslj36L0FwnffJJHNOmn39ir1y5%0A8tlnn33xxRdfffVVp9AJsboESqAESqAESqAESqAESqAE7kwCzJn8btsLFy7wC4P4btujjzt3C/8C%0A5AbDJ9GMnRlBEaylRLclUAIlUAIlUAIlUAIlUAIlUAJ3MgE/6szYidjSOOnbbo0mzYGTcrvZ82j4%0A7Ai6RVlPCZRACZRACZRACZRACZRACdxpBPyE0%2BETy/yoZ8vhxp98muPY6czZyXPLsZ4SKIESKIES%0AKIESKIESKIESuDMJLPPncRBOO3yan7Ez4ri69ZdACZRACZRACZRACZRACZRACfzXE8jkecMn/c%2BG%0AzxuWa0AJlEAJlEAJlEAJlEAJlEAJlEAJbAns%2BTHQbVA9JVACJVACJVACJVACJVACJVACJXAzBDp8%0A3gy95pZACZRACZRACZRACZRACZRACZyKQIfPU2FqUAmUQAmUQAmUQAmUQAmUQAmUwM0Q6PB5M/Sa%0AWwIlUAIlUAIlUAIlUAIlUAIlcCoCHT5PhalBJVACJVACJVACJVACJVACJVACN0Ogw%2BfN0GtuCZRA%0ACZRACZRACZRACZRACZTAqQh0%2BDwVpgaVQAmUQAmUQAmUQAmUQAmUQAncDIEOnzdDr7klUAIlUAIl%0AUAIlUAIlUAIlUAKnItDh81SYGlQCJVACJVACJVACJVACJVACJXAzBDp83gy95pZACZRACZRACZRA%0ACZRACZRACZyKQIfPU2FqUAmUQAmUQAmUQAmUQAmUQAmUwM0Q%2BD9kSf0dBz/9NQAAAABJRU5ErkJg%0Agg%3D%3D%0A\", \"frontend_name\": \"collapsible\", \"icon_data_url\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAK%0AT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AU%0AkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN/rXX%0APues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh%2BPDwrIsAHvgAB%0AeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAt%0AAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3%0AAMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dX%0ALh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP%2B%0A5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw%2BH48PEWhkLnZ2eXk%0A5NhKxEJbYcpXff5nwl/AV/1s%2BX48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd%0A0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA%0A4vcAAPK7b8HUKAgDgGiD4c93/%2B8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzA%0ABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/ph%0ACJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5%0Ah1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2B%0AQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhM%0AWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQ%0AAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIo%0AUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdp%0Ar%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZ%0AD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61Mb%0AU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%0A/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllir%0ASKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79u%0Ap%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6Vh%0AlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1%0Amz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lO%0Ak06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N/T0HDYfZDqsdWh1%2Bc7Ry%0AFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3I%0AveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE/C5%2BVMGvfrH5PQ0%2BB%0AZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV/MN8C3yLfLT8Nvnl%2BF30N/I/9k/3r/%0A0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p%0ADoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5q%0APNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIs%0AOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5%0AhCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQ%0ArAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9%0ArGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1d%0AT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaX%0ADm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7%0AvPY07NXbW7z3/T7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3S%0APVRSj9Yr60cOxx%2B%2B/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKa%0ARptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO%0A32oPb%2B%2B6EHTh0kX/i%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21%0Ae2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfV%0AP1v%2B3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF/6i%0A/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8%0AIH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq%0AYAAAOpgAABdvkl/FRgAAAGhJREFUeNpinDp16n8GCgALlGYkU/9/JgYKwTAwABaIDK9fv25gYGCo%0AJ1Jfo6ioaAO6CxoYGBgaidEMVYvVC4QMQdGMKwxwGYKhGV8gohuCVTNKIOIwBBsbuwGioqKEDBnk%0ACYnsLA0YAIp6E64EMj9YAAAAAElFTkSuQmCC%0A\", \"is_complex\": true, \"is_block_element\": true, \"tooltip\": \"Insert collapsible block\", \"customization_arg_specs\": [{\"default_value\": \"Sample Header\", \"schema\": {\"type\": \"unicode\"}, \"name\": \"heading\", \"description\": \"The heading for the collapsible block\"}, {\"default_value\": \"You have opened the collapsible block.\", \"schema\": {\"type\": \"html\", \"ui_config\": {\"hide_complex_extensions\": true}}, \"name\": \"content\", \"description\": \"The content of the collapsible block\"}], \"backend_name\": \"Collapsible\", \"requires_fs\": false}, \"Tabs\": {\"preview_url_template\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABNQAAAFgCAIAAAD8SbMaAAAMFWlDQ1BJQ0MgUHJvZmlsZQAASImV%0AlwdUk8kWx%2BcrKYSEFoiAlNCbIL1K7x3pYCMkAUKJIRBU7MiigmtBRQQruiqi4loAWWxYsLAI2OsL%0AIior62LBhsqbJIA%2B9%2B1558058%2BWXO/fe%2Bc98M9%2BZAUDRniUQZKNKAOTw84XRgT7MxKRkJkkMEIAB%0AVaALjFjsPIF3VFQY%2BMfy7hb0huW6pSTXP/v916LM4eaxAUCiIKdy8tg5kI8BgGuyBcJ8AAid0G4w%0AJ18g4beQVYVQIABEsoTTZawl4VQZW0t9YqN9IfsBQKayWMJ0ABQk%2BZkF7HSYR0EA2ZrP4fEh74Ds%0Awc5gcSCLIU/KyZkNWZEK2TT1uzzp/5EzdTwni5U%2BzrKxSAvZj5cnyGbN%2Bz%2Bn43%2BXnGzRWB/6sFIz%0AhEHRkjHDeduXNTtUwlA70sJPjYiErAL5Eo8j9ZfwvQxRUNyo/wA7zxfOGWAAgAIOyy8UMpxLlCHK%0AivMeZVuWUBoL/dEIXn5w7CinCmdHj%2BZHC7h5/jFjnMENDhvNuYKfHTHG29J4AcGQ4UpDjxVmxCbI%0AdKLnC3jxEZAVIHfmZcWEjvo/KszwjRjzEYqiJZoNIb9NEwZEy3ww9Zy8sXFhVmyWVIM6ZK/8jNgg%0AWSyWyM1LDBvTxuH6%2Bcs0YBwuP25UMwZXl0/0aGyJIDtq1B/bxs0OjJbNM3Y4ryBmLLY7Hy4w2Txg%0AjzNZIVEy/dg7QX5UrEwbjoMw4Av8ABOIYE0Fs0Em4HUMNA7Af7KWAMACQpAOuMBy1DIWkSBt4cNn%0ADCgEf0LigrzxOB9pKxcUQPuXcavsaQnSpK0F0ogs8BRyDq6Je%2BBueBh8esFqizvjLmNxTMWxXon%2B%0ARD9iEDGAaDaugw1VZ8MqBLy/275FEp4SugiPCTcJYsJdEApbuXDMEoX88ZHFgyfSLKP/Z/GKhD8o%0AZ4JwIIZxAaOjS4XR/WM%2BuDFU7YD74O5QP9SOM3BNYInbw5F4455wbA7Q%2Br1C0biKb3P5Y38Sfd%2BP%0AcdSuYK7gMKoidVy/77jXj1l8v5sjDvwN/dETW4Edxdqws9hlrAVrBEzsNNaEtWMnJTy%2BEp5IV8JY%0Ab9FSbVkwD2/Mx7rOut/68996Z40qEErfN8jnzs2XbAjf2YJ5Ql56Rj7TG36RucxgPttqEtPW2sYR%0AAMn3Xfb5eMOQfrcRxpVvttwzALiUQmP6NxvLAIATTwGgv/tmM3gNt9daAE52skXCApkNlzwIgAIU%0A4c7QADrAAJjCMdkCR%2BAGvIA/CAGRIBYkgZlw1jNADlQ9BywAS0EJKANrwUZQBbaDXWAfOAiOgEbQ%0AAs6Ci%2BAq6AQ3wX24NvrACzAI3oFhBEFICA2hIxqILmKEWCC2iDPigfgjYUg0koSkIOkIHxEhC5Bl%0ASBlSjlQhO5Fa5FfkBHIWuYx0IXeRHqQfeY18QjGUiqqi2qgxOhl1Rr3RUDQWnYGmo7loIVqMrkYr%0A0Rr0ANqAnkWvojdRMfoCHcIAJo8xMD3MEnPGfLFILBlLw4TYIqwUq8BqsENYM3zX1zExNoB9xIk4%0AHWfilnB9BuFxOBvPxRfhq/AqfB/egJ/Hr%2BM9%2BCD%2BlUAjaBEsCK6EYEIiIZ0wh1BCqCDsIRwnXIA7%0Aqo/wjkgkMogmRCe4N5OImcT5xFXErcR64hliF7GXOEQikTRIFiR3UiSJRconlZA2kw6QTpO6SX2k%0AD2R5si7ZlhxATibzyUXkCvJ%2B8ilyN/kZeVhOSc5IzlUuUo4jN09ujdxuuWa5a3J9csMUZYoJxZ0S%0AS8mkLKVUUg5RLlAeUN7Iy8vry7vIT5XnyS%2BRr5Q/LH9Jvkf%2BI1WFak71pU6niqirqXupZ6h3qW9o%0ANJoxzYuWTMunrabV0s7RHtE%2BKNAVrBSCFTgKixWqFRoUuhVeKsopGil6K85ULFSsUDyqeE1xQElO%0AyVjJV4mltEipWumE0m2lIWW6so1ypHKO8irl/cqXlZ%2BrkFSMVfxVOCrFKrtUzqn00jG6Ad2XzqYv%0Ao%2B%2BmX6D3qRJVTVSDVTNVy1QPqnaoDqqpqNmrxavNVatWO6kmZmAMY0YwI5uxhnGEcYvxaYL2BO8J%0A3AkrJxya0D3hvfpEdS91rnqper36TfVPGkwNf40sjXUajRoPNXFNc82pmnM0t2le0ByYqDrRbSJ7%0AYunEIxPvaaFa5lrRWvO1dmm1aw1p62gHagu0N2uf0x7QYeh46WTqbNA5pdOvS9f10OXpbtA9rfsH%0AU43pzcxmVjLPMwf1tPSC9ER6O/U69Ib1TfTj9Iv06/UfGlAMnA3SDDYYtBoMGuoahhsuMKwzvGck%0AZ%2BRslGG0yajN6L2xiXGC8XLjRuPnJuomwSaFJnUmD0xppp6muaY1pjfMiGbOZllmW806zVFzB/MM%0A82rzaxaohaMFz2KrRdckwiSXSfxJNZNuW1ItvS0LLOsse6wYVmFWRVaNVi8nG05Onrxuctvkr9YO%0A1tnWu63v26jYhNgU2TTbvLY1t2XbVtvesKPZBdgttmuye2VvYc%2B132Z/x4HuEO6w3KHV4Yujk6PQ%0A8ZBjv5OhU4rTFqfbzqrOUc6rnC%2B5EFx8XBa7tLh8dHV0zXc94vqXm6Vbltt%2Bt%2BdTTKZwp%2Bye0uuu%0A785y3%2Bku9mB6pHjs8BB76nmyPGs8H3sZeHG89ng98zbzzvQ%2B4P3Sx9pH6HPc572vq%2B9C3zN%2BmF%2Bg%0AX6lfh7%2BKf5x/lf%2BjAP2A9IC6gMFAh8D5gWeCCEGhQeuCbgdrB7ODa4MHQ5xCFoacD6WGxoRWhT4O%0AMw8ThjWHo%2BEh4evDH0QYRfAjGiNBZHDk%2BsiHUSZRuVG/TSVOjZpaPfVptE30gui2GHrMrJj9Me9i%0AfWLXxN6PM40TxbXGK8ZPj6%2BNf5/gl1CeIE6cnLgw8WqSZhIvqSmZlByfvCd5aJr/tI3T%2BqY7TC%2BZ%0AfmuGyYy5My7P1JyZPfPkLMVZrFlHUwgpCSn7Uz6zIlk1rKHU4NQtqYNsX/Ym9guOF2cDp5/rzi3n%0APktzTytPe57unr4%2BvT/DM6MiY4Dny6vivcoMytye%2BT4rMmtv1kh2QnZ9DjknJecEX4WfxT8/W2f2%0A3NldAgtBiUCc65q7MXdQGCrck4fkzchryleFR512kanoJ1FPgUdBdcGHOfFzjs5Vnsuf2z7PfN7K%0Aec8KAwp/mY/PZ89vXaC3YOmCnoXeC3cuQhalLmpdbLC4eHHfksAl%2B5ZSlmYt/b3Iuqi86O2yhGXN%0AxdrFS4p7fwr8qa5EoURYcnu52/LtK/AVvBUdK%2B1Wbl75tZRTeqXMuqyi7PMq9qorP9v8XPnzyOq0%0A1R1rHNdsW0tcy197a53nun3lyuWF5b3rw9c3bGBuKN3wduOsjZcr7Cu2b6JsEm0SV4ZVNm023Lx2%0A8%2BeqjKqb1T7V9Vu0tqzc8n4rZ2v3Nq9th7Zrby/b/mkHb8ednYE7G2qMayp2EXcV7Hq6O3532y/O%0Av9Tu0dxTtufLXv5e8b7ofedrnWpr92vtX1OH1onq%2Bg9MP9B50O9g0yHLQzvrGfVlh8Fh0eE/fk35%0A9daR0COtR52PHjpmdGzLcfrx0gakYV7DYGNGo7gpqanrRMiJ1ma35uO/Wf22t0Wvpfqk2sk1pyin%0Aik%2BNnC48PXRGcGbgbPrZ3tZZrffPJZ67cX7q%2BY4LoRcuXQy4eK7Nu%2B30JfdLLZddL5%2B44nyl8arj%0A1YZ2h/bjvzv8frzDsaPhmtO1pk6XzuauKV2nuj27z173u37xRvCNqzcjbnbdirt15/b02%2BI7nDvP%0A72bffXWv4N7w/SUPCA9KHyo9rHik9ajmX2b/qhc7ik/2%2BPW0P455fL%2BX3fviSd6Tz33FT2lPK57p%0APqt9bvu8pT%2Bgv/OPaX/0vRC8GB4o%2BVP5zy0vTV8e%2B8vrr/bBxMG%2BV8JXI69XvdF4s/et/dvWoaih%0AR%2B9y3g2/L/2g8WHfR%2BePbZ8SPj0bnvOZ9Lnyi9mX5q%2BhXx%2BM5IyMCFhClvQogMGKpqUB8HovALQk%0AeHaA9ziKguz%2BJS2I7M4oJfBPLLujSQs8uez1AiBuCQBh8IyyDVYjyFT4Kzl%2Bx3oB1M5uvI6WvDQ7%0AW1kuKrzFED6MjLzRBoDUDMAX4cjI8NaRkS%2B7odi7AJzJld37JIUIz/g7NCTUflsJ/Fj%2BDdjNazxy%0As4mXAAAACXBIWXMAABYlAAAWJQFJUiTwAAAEJ2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6%0AeG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAi%0APgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRm%0ALXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAg%0AICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgICAgICAg%0AICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iCiAgICAgICAgICAg%0AIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAg%0AeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIj4KICAgICAgICAgPHRpZmY6%0AUmVzb2x1dGlvblVuaXQ%2BMTwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPHRpZmY6Q29t%0AcHJlc3Npb24%2BNTwvdGlmZjpDb21wcmVzc2lvbj4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24%2B%0AMTQ0PC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZm%0AOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xNDQ8L3RpZmY6WVJlc29s%0AdXRpb24%2BCiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4xMjM2PC9leGlmOlBpeGVsWERp%0AbWVuc2lvbj4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT4xPC9leGlmOkNvbG9yU3BhY2U%2BCiAg%0AICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj4zNTI8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgog%0AICAgICAgICA8ZGM6c3ViamVjdD4KICAgICAgICAgICAgPHJkZjpCYWcvPgogICAgICAgICA8L2Rj%0AOnN1YmplY3Q%2BCiAgICAgICAgIDx4bXA6TW9kaWZ5RGF0ZT4yMDE2LTA0LTAyVDIxOjA0OjMxPC94%0AbXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5QaXhlbG1hdG9yIDMuMDwv%0AeG1wOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8%0AL3g6eG1wbWV0YT4K6FkWAQAAQABJREFUeAHsnWGTXEmSVbvVPewu7IJhGBif%2Bf%2B/ic%2BYYRgGBsva%0ATEviRJzMW673slKpklRSSzdG7eXhcf26x30vc14oq0q/vn///peOKlAFqkAVqAJVoApUgSpQBapA%0AFagCX1OBN1%2BTvNxVoApUgSpQBapAFagCVaAKVIEqUAWWAj189j6oAlWgClSBKlAFqkAVqAJVoApU%0Aga%2BuQA%2BfX13iFqgCVaAKVIEqUAWqQBWoAlWgClSBHj57D1SBKlAFqkAVqAJVoApUgSpQBarAV1eg%0Ah8%2BvLnELVIEqUAWqQBWoAlWgClSBKlAFqkAPn70HqkAVqAJVoApUgSpQBapAFagCVeCrK9DD51eX%0AuAWqQBWoAlWgClSBKlAFqkAVqAJV4PfHJfjrX//6f//v//1//%2B//4bx79%2B7xxCKrQBV4UIE3b978%0Aq3/1r/7hH/7h3/ybf4PzYFZhVaAKVIEqUAWqQBWoAlXg%2B1fg1/fv3z/S5f/6X//rf/yP//EIspgq%0AUAU%2BXwFOof/%2B3//7f/fv/t3nU5WhClSBKlAFqkAVqAJVoAp8Dwo8dPj8b//tv/3zP/8z7f7jP/7j%0Av/23/5YPZHgy/h66bw9V4AdTgO8p4DsL/vf//t//5//8H7b2r//1v/7P//k//2B77HaqQBWoAlWg%0AClSBKlAFfk4FPn749DNPTps8BP/93//9zylTd10FXlmBf/mXf%2BEvfTiL/of/8B/6%2Becri99yVaAK%0AVIEqUAWqQBWoAl9DgY98gMmHMH63bU%2BeX0P9claB5xTgL3r8zPN//s//ycvwOVjjVaAKVIEqUAWq%0AQBWoAlXgz6LARw6f/IYhdvJP//RP/czzz3JF2%2BcPowAvOl56fPjpy/CH2Vc3UgWqQBWoAlWgClSB%0AKvBzKvCRwye/2xZdeAL%2BOdXprqvAt1XAl54vw2/bSatXgSpQBapAFagCVaAKVIHPVOAjh0%2B/36//%0A5MNnqtz0KvAyBXzp9dtuX6Zes6pAFagCVaAKVIEqUAW%2BKwU%2Bcvj03/Ps77b9rq5Zm/l5FPCl58vw%0A59l1d1oFqkAVqAJVoApUgSrwQyrwkcPnD7nnbqoKVIEqUAWqQBWoAlWgClSBKlAFXlmBHj5fWfCW%0AqwJVoApUgSpQBapAFagCVaAK/IwK9PD5M1717rkKVIEqUAWqQBWoAlWgClSBKvDKCvTw%2BcqCt1wV%0AqAJVoApUgSpQBapAFagCVeBnVKCHz5/xqnfPVaAKVIEqUAWqQBWoAlWgClSBV1agh89XFrzlqkAV%0AqAJVoApUgSpQBapAFagCP6MCPXz%2BjFe9e64CVaAKVIEqUAWqQBWoAlWgCryyAj18vrLgLVcFqkAV%0AqAJVoApUgSpQBapAFfgZFejh82e86t1zFagCVaAKVIEqUAWqQBWoAlXglRX47g6f79%2B/f2UJWq4K%0AVAEV%2BFKvPl7DfRn3pqoCVaAKVIEqUAWqQBU4KPD7Yf6aU590f/31V5zY12ygtT5JgXky4Xp9Um7B%0AfxIFXnhZbx41E3wh6deR7Pvs6uvstaxVoApUgSpQBapAFfi%2BFHi9w6cnTHev74EzR5qcPxP5fKle%0A54x0p%2BHXaeDzhbrJcGdf56XX3%2Bm5h8MuXr%2BlQwN/uil/pbBVfdlpMce6ue9FdVz49ZeXFZi8j/ir%0A7ge1z5MPGunfqDyiajFVoApUgSpQBapAFXixAq90%2BOSJdp4E8A8nh0zjvHhLSZwVE6zzOQrk6lTb%0Az5Hxe8jl29v3UXNZxz6qfXA8e7zPO2lX%2BsfJvgxyb%2BeJ6rkOv1V7T53VqwJVoApUgSpQBarAT6PA%0AKx0%2BD2eVnGHiILgYIgfwzWsxEwU8knWTqsFHFDgI7vRbaX5o5pH%2Bi5kKXE%2BenMj8a6D9WeT79TGh%0An0rePKqdz2lPsCdv1ll0WTmnfwj9yCw84h5nuyau7V39xSHD%2B/ExLKuP036k3S5XgSpQBapAFagC%0AVaAKnBR4pcMndTkwcFbR2oZHiEScijz1uQIB3F/NiSjMN/EfDT6efqexx0lu9vOp6dn7TbaPBg8b%0AcTrtZPBqEjkXPUdm4k3/UPrFmJkI5/1O7q9Oqh/M99NOtr9lXzJcfs8XxzP8d%2BuMNs9pTDmVsXQc%0Al%2BPcxh8S1o2xXrQ7Zbs7XQ6iY3Zkvc4vjB8QXzMNymaJbT9Msb1lV/zSy5WdrwjArhbJOIKmtUE%2B%0AcupWgSpQBapAFagCVaAKvFSB1zt8%2BqB/fd699JuDzTx7gGGAmMH4cQ5bNsWs%2BMGcI1nSuUl7M3hI%0AZHoHRt2s3u8hsAP/zfhzVDfBB8KPTkOig40zc%2B3h0IlT8RP8Mv/Ac5iGc8ZnP/hZmvGbiQk%2B7oST%0AKtZK5HGSb4jcn38i0bqBPZgte3F/eWdo98ercZ/e9nny2vElhentkx0fqrK2T3aryJ7u2ZVgZ67I%0AM2Olb27X9/QpdEjcxQSaA9ytUHu3qrkQ2siv63PPdabeZFfGHQGXghdaYPt9KdM6VaAKVIEqUAWq%0AQBWoAp%2BkwCsdPnkK9Onc5pgyzn5az%2BohkngcAD4REjk8GqZinLA950zaM%2BbALyApcZKYuiaeAUHG%0A%2BSjmQHWzpbC9wEkDOPo68eV0a6meKbAEX1CdFAvN3BmZvphzxLgt4dtPYJ/Z3rmxSWiVGZn478en%0AT5r0JLUOWR609ld%2BFPT9u8tHn75EOZP5mec6qO1z2vWle8lken01H7e4PlrcKYtkH10pgn858%2BFc%0AuI6JT%2BFrdyBSZXV%2BQayPLJldp4vHFfYIHv/ibD%2B310pZAqDDL2/2ZJ1C1/88iC6e3eacGqytAlWg%0AClSBKlAFqkAVeKECr3T45DFvPQnuB0HtfiK8RFxyByIvz8VjU0mfYNeNHBIP08H0rJsSZ8S5nwPm%0AnDsbYPWjDBBKMp1ZRYYHqWbiC/zZyTuOInvMxmjGfkJ%2BmBq/GQx5cu84AetkmpRzJEs4NAAgbcSZ%0AmM/05U%2BV2U%2BCn1niy6Z7hPPluM5Xl1PZ5aPOfbH3%2Bc34Qqzz3DqobX%2B9aPe4Hu3WKv%2BT9rq4szxi%0ALrvSF4MHUA90V05TVpU9Jj%2BB/R4BwQ5f1/jq6REAzp5eT40LYzMri4qcpN%2B/W7uz4d0EWastjp2m%0A7X/v%2BDpZlKvbjipQBapAFagCVaAKVIEvq8BrHD59Ekzf6yHwNLKqwyFhnhOAE0%2BSflJExq7MPQDw%0ANXY6yZWZaUq4lPhkmP6E2VhIXJpgfAkNCohNLZ1pgzmwpURyg8QRfHMpqxM/fbIOI4dP42Ggyps3%0Ab2JxHMBwhOGHfPoJ6pyXEtGJTfzAMKepTjAt6Z/TBc/0g39OkeoAO09J/Cj5OesVIvsQyAVaR7Z1%0APNslsXic0C6HtH1uW0sLtU5jS0kmntV2mNm7lbUU2izLcezrv7Drk899piOCz3yf99a5c3Ne8Ocv%0AlsZKukoAkn/3sEtwetxEq73r6ua67mJ9iMvhc1t8STaLnax7eJH89obPP9/T3Ju119Xzhu7Wz801%0AUgWqQBWoAlWgClSBKvAiBV7j8JnG1mPqdcwjDT6PkKyAvDxL%2BrDrA%2Bb1wfaaur6GU2c9gu4hw3W2%0AvoYT/5zIqsHYYHAO6Ytuk2BnIkhGIjgMMdMmuNefjLnMN80TT%2BImhipOAEbCmHgi03H1kCLAJSzD%0ACxSrEx7SGcA4f2qZ4geAQ5zgZJ6rN%2BOkBKOPPTvBHBzLxeKQm6k8pBgx1%2BCMzPiBP9OZZe6M4BM0%0AnpTvz9kHLPTe5zqPZ8jPCS2%2BN7V6oaVb4pLue3TliefLotl2rV0Oh4sf8D4fKsgvb0BtFuLrzth3%0AxzYfyLP4F%2BGFU8fIWrjyc45d3yW7/qymwiN%2BnTnXbfz%2B7f6zNsXh0yb3PUDOb%2Bum/fW33xbr%2Bze/%0A/MbeOYVaY2GWNJeD8gp2VIEqUAWqQBWoAlWgCnyWAq93%2BFyPfR8OzjMeaQy7j/UYeXk03I%2BU%2B6GW%0ACJgz%2BGbKSvtwCINB52xdsg1tMDDhY3Oywg/VISW5Yg4WniSGP85zVFbXQpgBHt/06YfwBY7tRed1%0Aecaww9mJkd9%2B%2Bw2Up1BX04%2BEh05m8KZvMBYnAyr8A6FFDaqPkfgHPAyR7rCU6awy/STiyDNX9V2y%0AhxB%2Bf85FR9SkbayfEHJU24fPdQRdQvPfOnauIxl2/%2BFMdslZpzuOZ/vTRQ9qC87q5Xy4Tp7vTN%2B5%0A%2B%2BS5zQ5iliyXu3i5l7G5KL//rOagXU2uwqsHzPpLD16VUKyPK/e48oDiI9m9nV/evvvl7dtf/tib%0AwvcTUdAkrt7e/JJ3QBp899sv%2BxxqV7vMldMKtVWgClSBKlAFqkAVqAKfo0AevT6H5NNyeYQcJ5qL%0AC4WPljy4Z4R3PXZ%2BePhk6ipgnKRwBIofR0DYDo5Uq8CHI1nweLIKIY4kH2asGXFsAKaEyqyzPfNI%0AFeQsHX/SpmJS7jiCzylpY16gt2/fOmX1X/7lXyz693//92jC4ORJHIe4znPk9gMmjekncnCYPjfC%0AcKjFNBH92KToCDv7E0Z1p3GYhl9ffgCJT7D%2BrDX5v5VvV26OHTLF3x8MvudSv33Pae3dOqetg9r6%0A5G8dG/fRcb%2B0Lgpcstar8vJ9rZtq7Wm/IIH5meewnBIvB9FNuE6oS%2BHD%2BU7R5V%2BNLW81yWEyg888%0AaYbX%2BvrckrXF/CSzWTT2x9v1sSf2D3a0fbulIgdWUn777dd379/85TcCUK5Wll0ffvL16Ztvry/3%0A1K9TBapAFagCVaAKVIEq8BIFXvXwuR4jryPHG842f/zxx1//%2Blfa5yTz%2B%2B%2B/e5JZD5PXhz6SwGsB%0AkwIYJFaMFgC5MqzkPQ4YpnOQwhR7HsLggNNVHKdhSJbt0RsOGDaSdKbxkxgHBnytJOE0yCoMc9iG%0A8djp4N8fsAGQM8hZl04YHjtz%2BDQIjER2ShsMpp4/4XGKlTzMcbKjg%2BP0pqUocUYc2JimxNwFGKY0%0AQEs6wvDTg04iZweA/NPOdFLOIwCW8LWhyup343jM8p/05ADG0W4dI/d3qP6yzmxv3//1j3c4NPzb%0Am19/X3Ii7Lr01%2B%2B6XblvVxaHVcC466T6F9AbtC3LS8w3v/36d39582ZdHM%2Bim2efPOGf12bV22Ox%0Ara724fP6ieWqsPB0cjk6/sbvp33/63qxEd11QaxEutrnZ3rj5PnHH%2B//tk7Ua4ObeYFI%2BYe/%2B51t%0A7KZoaTGsMygUqzf7ughlV7VVoApUgSpQBapAFagCn6PAVz98rme9MZgyPEhgOdgw/va3v3GYWU%2Bm%0Ae6xHwA8PMKaANwW7aRbzeuDcgyBZLnn2MC5G5ptWqlgZgoQEWgacWpA4Aswyxb2EBwC5sSE8O6QQ%0AnFQSGpfBNmJxGC4dLNPzkMoUVnf2hcFperA0lu1o3ZdxfJBkcsmiBhHPn0okwB5AyuxUPxEc/TjA%0AZsQ4pa2ODQAHcu3ayfbB48iAA964FnBGIjcB6QH89APGceROQw2Q3hgs4WMtN/008K2c%2BWp0a76W%0AeEntkx4nz3Xm5G9R1p99VHv7hoPc2hnHyn2yXL1zz7LIWY5EYH/7A7J1Ntyar0vDKQ4LZmVx0Hv/%0AjiOoQYR5undvCbG5LiVsjOZoj/%2BRuMnXh5a/v%2BMbZX99zy8LYtAeZ2P%2Bty/Z2gv38OptbYeT59/2%0AWXp9BLo3Bclf3vz6N37Kc99Hq6X1Ql9VoNjfDwwT0cVI4Hoxb7W7K34EcTuv0SpQBapAFagCVaAK%0A/FwKfN3DJw%2BRPJOtR8k9lFZ/PRruzzx18IPE4TFwPsyBIQvL8PzjVMwEGwGGk3H/ktpPuopDlgx%2B%0AlEqckwbB9Rh%2BHQFTUV9Lk1fIx7%2BSAggrSah07ME9TmucRJyDTUmZM52wZOnMHqjrYBcZRoSZQjME%0AiTg8fxJkCJh1wTjVMYXIdJzOoPwpHQeMVSg0B3Gmch7iLJ0HGILTMk2H%2Bk6TK9jq3g9EmALAnsHi%0Ak/7NHTbMUWod/i6Xbt94u28u5v6ccH%2BfKufJ9X2qnMX4Uchf3755u86Q67tbL3KRsT9d9MPSdVhd%0AZ09OgpdX3v6Ekxzq8NOVWx54dnoEvy2GdwrWBqmCQyO0wt98QAgpn6/uk%2Bebv6yfReUAuQqwL76t%0Adznr5Lnwy%2B5NsReOx39bbzjEF2a1xo7WX3mxLTqk8wWmAO9Z7O5y4db%2BN%2BVKunS%2BvA/H93aVP%2Byu%0AsypQBapAFagCVaAKfC8KfMXDpw9wWAbb1ZnWswTHG7%2BTlgc4Dxv7eXA9TeaRTmTwEroqGMsgjgW2%0AZ8tMkuckP7Q0pzB4psq3%2BMoZWsCzN/ykH8oRP0QyTYps04rxqIONs/a2BwC%2BHmyYdVL6gJTBoBj7%0Ad0c5duoYFEYKU5UhkmGEJfqcPQBgerBmGT8sJUjcuqmOI1gp3ML0jQDT0Z6bIcLSwQaWfnDiBy8n%0ARanCludmWbKZA5W5CX5D53Ibrk/zngZB/qAsp7v1aeHbd3zP7fo%2B1bfrqvHCQqp98vzw8MlpcB/t%0Alt2XBfDbBV7bveD356VcjXf7m25RnKWL8E/1P2jGO2W3dD1A7oPufmmtHJj3/cDrfU13qfW9s5C/%0A28fddc3WjkxfTfKTrLtVjqOcYKmwfrftL3/88ofHTj7wXIfVNd6tnwYle5GvbzDeva4ynzig%2Bn4u%0A%2Bif2XngVqAJVoApUgSpQBb6WAl/x8Dlb5lEs0/WINw4VnG14lMTuZ9Z1gATJE3we4jf8cggRbEQ8%0AlnTBxBOEBD8WR2acwzAOibRxgMFAkAOGtCzphMqUJAJgJJhCwROZvgAjWHM3xyLBEbDF4LF6HWwY%0A9hALBl%2BrY5b2UG4iZTARWAZ1c1FwHOnqgJ%2B18CGBFjvjMrvqkpHpuzqtGOtOS5wS0QGH1UzdVCyE%0A%2BFiHFfWNTzsxVtdekvcX8NbCetjGBqBvP9aa1QP7ho5iXHV4ulLctpdD2vohyf0R6PphTsLrUEcW%0Af5%2Bwfl0QH36us9n6j3uUT0rXoW4fQdclB8zv6tm/SPbNO1Lec%2BQkcUXWS2dBLoKP8%2BYH98oiufDz%0A1U8v17d6X3/sk2Z4BXAL7A8v1yeWVOd3Dr2jNcgvylqL8%2BiFmy%2BQrj9xSPh1f6a6q1xXF8E%2BHcOw%0AjrOXbq%2B8F/oHvpj4ALCQKlAFqkAVqAJVoAr8RAp8xcPnzccvnstRF7ueJ6%2BHHD/5JE6KT/YceHQI%0AghQM3sE0l0hYEnEcsgUmz5xOf1e4nP30sfI4FXzl3k%2Bo%2BymeVVuaJzQiIUldIqk4/QkIm45LKcpO%0A3ayWOIDYOAkeqhB3hHCmsASecZH4emkuR8/9FwQCQNKASCNaE1eL1%2BOxnGFO%2Bh0H8AGffnTMnVtI%0AxdR1FZ7zBjf9kzkAsmCV2MRT16K05GkzcSKAWSVX8jgh%2BeYOLa0T1r7gNMMBb%2B10n8rWYe/9%2BuST%0Ajz3Xz3y%2B5X64oPk7Dy5svu2WMEuePHHY9zrZbWI2vsH7Z0TXX5Xsb8FdR7ldlsuyJdivhyejLHtO%0AK4tpvYrWB5KX76G1SRrYh08UXoROf3vLT5byQ6XkXNg3%2BNLRtRoZsLkjPvjk51EvH4q%2B%2B20FLzq8%0A3z%2BnCnTxr5/3pN3rxbTH2ipQBapAFagCVaAKVIEXKvAVD5/njvYj7uXkuZ4O9/BQwSGHGU/tHjvJ%0A9SyBM2E5gUjOgy0RkThMM87VpUqiDuTGrYKFxwhUMAvDcclyZiWRoIPmr%2B56cnYIi50OvuOKXdXx%0AtTisZkduU2swq3GISzitPGKMh3MG7cHSbmTa2RI%2BbXjuktxcLHFG2suq6ZQLUv9gmTqEzWbwnQqw%0ABLVEMmU1%2B8IBpr0wji92ldU4QiTE1xHsEkjG3uIyk4d4MDMuT1bFfEM7t5M2uNH2fcdhjLH8yw9/%0A/rGOl%2BsAtrTk4t44fC7wTvHcuA%2BE%2BwPS9ZmnH3jue3hdjhRczn7hfRC5BPeXdfq7Hjt3b/vFsK/p%0A7%2BtFuX5%2BlJ/S/H2XXufGdb1YvhJuxemZovvPmmdxVVgF9h8v9A4thtVWRxWoAlWgClSBKlAFqsBX%0AUeAbHD7dB4%2BWjPWsuwfnHCOsEuBRUcvUuDBsYCwBYxDR0RrHOli9us9%2BlXNaoDLrWP0AYCld4bAF%0Ahg5InOBB4mOn4zQRwcnCCYBOOOoQ0WazAPC1BhNJburOpWQlKCw9UCvDTTF11ZRJSyTpnEhBphlT%0Aznam4J9HUmxj9iCYEh7/RFoxdXGAac/k9yMpDUxffEpQl%2BHZmyWrEMHHkiIeZzZwmIr5FhZlPnxF%0A2PE%2B7dE7l5nDpN9Jy6%2BK3a9L2lynuP23CuvzwDXnDr8iuTX4417WGY9Lc/2e2338I7C%2BTTbjg/J7%0AghGQpc2/q%2Bx/rGXTLxQC8/OaVHnLD2ryiSW4S%2BcXDtvbvzZod0Jx%2BtldLY%2B9TwFMX9tRFL9ev1v3%0A0rGUab9OFagCVaAKVIEqUAWqwAsVeNXDJz2uh70PRw45hsGsZ8Q9sidPPiIDC5LINWM9weIn8RGH%0AdGDSHsiJe5zIapAyG88WcNYB9PpNqrYNxixTDjarKTEdwG6NoJ2cd3qOHErM6UGcTA9t2PncV/ZC%0AiuBJq895zD4nLRFG0p2Kx8cJOE5W00AYiLgqWMsqjuMOoYl3rP1g4wDWh1xmrgI9uFOpiLBKcN4q%0AggVgJcn0%2B3G4AOsabLv8faTkRMdh0vMnh0%2BmAJa87/axbx/NiInx5Olnj2iETtwgKLL/TdDlMN0V%0APjj0rYqX8FrMSzbBxU83%2B2C5yPfCvvXA8kOe65tjjW%2BUFbbdr36MpUF78tzW9qj94XnSTi7nz63F%0A4KtbBapAFagCVaAKVIEq8KUUeO3DZ/pej4zXwYM7LpYHVQCxOqJYZQgLCQAGQR1s0sWwdIgcpgKw%0AB0cqwC656hTryBKO7WE9eWINigGPc8278VXYwaaKu2N63ma2PDE3CtwNpTcbAIsTtQ9dMaUWq2dK%0AlvLJp6vmSoVvFs7MnZ27nZkrgynTgoHNo6AM5k4GeWZk%2BqmCM5mtmCBOmHFYpai5XGUitDGHR1CR%0A0ppuyndq17lrNXv9s85163S3PwLFRyH%2B4/zGv5vidlxd588F27mX785dBzwOd2RNfDb%2B4cVf4PPY%0AbdgPv2lodbX/2xdi/b6jNVZH68sHA7b9FkBwXYF1BuYP36C7/hXQ5aw/bG2fh32zWPm3eviAt5Mq%0AUAWqQBWoAlWgClSBL6HAtzl8%2BtC4HiH3YCNXdz1M8tjIMOgeebgXEEcYQcGx4g9WNlOwZE2AU/nn%0AKlkH5MyKb6LWQ4jnz7QaZlLSSdJxJgN%2BIhMzmwGTKY6%2Bjv5MvOlbxUICUvcwJe6YPESYskEsFbMk%0AktNXgkTU4ayGGGyGPExD6FKmOJZOZE6nHwBOCM9sEpqIdRg8MJDLKtbjrrRM2Zfjmv30ldVJ8j37%0A%2B55bDeJwbfcfNrLPn9uuhcuB7fKqYPl6QM3hk0McEi3B%2BQc/OXnuHxVdtAqxquxD7DVwOSheZJqg%0AdbS0gcsVp5m1vv5b7qZadA5Tt1X11QKt7H/Ac58/PYVe7FoicbW67ZWmX6tAFagCVaAKVIEqUAW%2B%0ArgLf5vB52JMP7AbXI%2Bd1%2BCBpJJhMr6inrzPXaBhwGACwTwnrSXaVw8aZq4JX5odZSTFRm0PI9Txy%0AOTDLTAok%2BAcqc2fRc8RyJsqADaGOGOxzw%2BqsmmsV/QRnbpYIJjeAkLBZAXMprVoFDI4WGL4ALMMP%0AEnHCEN8qC7RXdQwGLGGm51WWTBQplXjAhyHGVW3wOuDjHHIznel/Yj8vxP0pIwe%2BS2BfKHzuQV%2Bs%0Ay7/cV%2BtYyKlz/S7ZdfbkmIghdhlXb0XBLcDlf0%2BoRbvY/LMyUmVlrYu5Enfydi9mM%2B0Fb5b9%2B2/5%0A6VM%2Bqc7Hnjh0tg6lEm3kZpMQ21EFqkAVqAJVoApUgSrw1RT4Lg6fPE4yeHZnm/nczGA27tRHf22W%0ATMz07JBrcDp3sqwleKZAkmmqwDOHR6wZCfI5B07wc3VG8B0TcNMHlngIEzQSO4%2BCASc9WYfIAcnU%0AARtIsphiGSYyZYlxwe0vIrEeO00Rb27SccAIwIFnLpmiBYOjnQ5%2BUvSDEcb0PFhikDhzDWpJiTPT%0AJ%2BZP73s45ErqXARBlnVQJMbVvvrruDi12vqseyAn1qMaK3sxM5bZJfi6dN38a%2BHDQS1WtiV5VV6%2B%0AwfV1cSS4Onz6aU8//Fw/Bbq/C3d1S6WF3iT7i2aHlttRBapAFagCVaAKVIEq8OUV%2BDaHz/3oyNPh%0AceSkkQWeYvE5deSgogZ5%2Bo8kRgAnMp0QEjxgLEE8jmCRdxIn/8G3mdhUnMyuWjfpItMJ8dmAU8Ei%0As%2Bp08oQ/QR3iLunos4QTzvjEDQrDD36yEWR4OATDkDBxHS2rOFpJtCvtOox44Lx5VwAAO9P1YcbR%0AnleJnLPsKvacdW3qg68HWOre4TmkfD/TpePWEoOo%2B8/eLGc1fsZ162wcHweNOTrujw%2Bvm%2BCvF3DX%0Af45Ft2CbdvmX/54im5DTIJHF6eAr59X1Nxk7ZR0tF8vubsM2/trhU7er/0WykYtsOYuWDzlXIT78%0AXH%2BRsSiI8MGrrW3KZXbqrlpTBapAFagCVaAKVIEq8NUU%2BDaHT7azn/g%2BMJwxGC5h9XF4mgfHwQaf%0AgTOf7/dzoyv7YfPiri8uYaHCZghh6oHhpkPwkEVkcB9dqQ5RmbEMlrBzgwazlzgiQ7iS9zCOaxUd%0Al2JZMhEbpPiDDX9SdMiauU5ZOrAd0pkyDn9HYNC4fmrJRvBAm0KJ4zDQTXCcmQuAKblfcOyyH5iP%0A3g9fvIcvuJ2PUF2Oavuctg9tnPF%2BW/%2BcyS/8Xll8BvfduhDbslP05mc%2BWXm7qVldL9DLvXnB75WL%0AWSvX1S3rhc0fEF6RDYTWK%2Bnl3LO9tDrkPWEB1zHy2glBE5/sCvEfP3a6loLf508Y/LbbdcTdSwvr%0An51Fyq40W69fBapAFagCVaAKVIEq8IUUeO3D53p4/HDwTO9gR6xgmQbClOfc%2BZEaSzl/HkQwPcGQ%0A4Bw4xexn6P0cvUvjhcHcQ1YISccHP2vFd/UwTa5OVu2BHSUiM3ZGnCZ3Tg0aIQXHjcz2ph/aOKaY%0AGztX4%2BvIb93gLeGVCp5gBkH8LJmYtufUYKyFuBZgItRMNFdy4jha49jHR2hxGN4A0xKEbS9ejORO%0AHi/0nSDX8ezayvIv5zo2vv78vn9tEH/Zc13axz%2BuI596vl//Fuj6XPHd%2B1/551j4pz73C%2BKDC3xl%0Anl831focktPgb0thvK3nBkG7zrQXy%2B80Wp9RwrmaXB9j2hj4yx%2B/rNUx9pTOcpZeKN9TFgN97iY8%0ASC%2BqlctX/9uTwVa3ClSBKlAFqkAVqAJV4Esp8NqHz/TtwzqP9Y75T0RmaT2WXg%2BfnDoY/uMWxOeR%0AJpxxTNTCjxMLxngYdCw0GUwBLF4rYEbW8hhkQQiMbrGsaIXImXh6YBW8iekHmGOSEJlTaWNZnZwh%0ANIXpwbkUuHIeyjmVxMQJwJ9Bl7DineLPqXisIymHKXEirqJYYDoHzrlKVsqFAYD82onXDxLH9OC9%0AXlidxEk8BEMVtnOh7zSyOvactjz%2B4x8m%2BY1/nuS39X21a23fNTjrRMoyV2YfDn/b/xbor2/fcYp7%0A%2B44b3lflOiuOsc6Oiaxcvgf2coy8EK4X6AqvJF46659C4fzJLyziQ9d1sVe6AIDrvLr/0Mc%2BPV6W%0ATN/9Lh7G5gO1ut%2BD8%2Bfl%2BLr6ocSaXg6l%2BLuJa%2BJOvnKuYEcVqAJVoApUgSpQBarA5yvwGodPnvzy%0ATE/Hl0fB6xcf4jl8soSvZdHHfabkrnPn9eSpj13PpfuYB%2BbmuFZ4OnkmYuImeDKQGAeGb2O2kUSX%0AUm7GxdMYjoADm2BX8V3FuhcjTBnp5FCIqSRxmKZDwTJok45DJEUlCXLC9AGcg1mSKlPBcs4sYJlO%0AQpHYQ%2BdnsFkTD8a2A45juZurkyf46QCY3bJExPawDttwSV8Mq5nKyXSSf3/%2BpT3a9FyH4591unvD%0Ar4ddJ8/9sec7/iVTJF875ZyWwyd/t8IRkcPn2/W7ZLF/8Mknf/i0cY3Ljrez0ocCSxv%2BrAPk%2Buc3%0AL7SroV2IFO5TXtvv1qF3VQnbTtyHz/WpLM2sa0Ti%2Bg97dZ5qrWU%2B41w2x07%2BaujN%2Btxz0ZLopVts%0AC8y4HFk332a6kj/R1qsCVaAKVIEqUAWqQBV4qQKvcfikNx7rfCbdT3gX4zM9cT/2BJYjKAif6QkC%0A8MBJxH9CE4tP3PHc3lPLQpniSHsleOLBk02wiTOdVdNjRWKFuQVhsgUgBjtXwZCYs7StAEgn%2BI4k%0ATsJwugpSBu081gKQM45T7bXIB1%2BzlJRUObQ0p/rkmoVlhFd/xy6XmO07zRJgfbMAhBMHZoaRaROM%0AM1fxJ6dLRBbXlQ0nPeAwvKY6O3C5drK5GowA7M1aVvxO7W79crzcZ8Lf0fw3frfwGz7e3MohxeXE%0A6MXkc/11%2BOQs9/aXP5b18On5k4u0/8dulzOv/tLmeo7dp9l9/lz1F3adhtfJc/07oYuQC0J5LxAI%0A/reOrL95avWTz6its/jt0MIra/1Zif75bTfk4XN9wOu%2BrjDxmwXTUQWqQBWoAlWgClSBKvAlFXil%0AwyctXx8JV/f4DJ7aPap5%2BCRy//DJUQoMlsR5WlOPHCFSa9XYAzxftTjBk5JBED9LJpqVxAR1LBQM%0A6SBlwKFD/QkLg0upDj6%2BDgAcLVnikx5n9nbgVK5JS1Y4BU/rEpGD81zK7OomD8FgBKRt407nFmY8%0AKTbA0twRq4mLTNtZMn7HkmLFiTFiV9MSdykWB8ABA5WAyfkd%2BtxS61i5ml0fBe4D4fo4kfPY73z6%0AuX7jLK8a7ul1E65j281PPte/ovnrm7fvOIWuTz7Xh59cF5j53zo3bu9p9%2Btot/XJUZYa%2BFGMK8I1%0AWafOd7%2B%2BW6%2BJdZVzfCUd/D4x7vOnXSXZOpfXypqscn7Kuj78XCl8i7B0a%2B/rlypdeRbVOM3ubPlq%0Aq0AVqAJVoApUgSpQBb6UAq93%2BKRjnhIdPK/zSLmf29dp7fffVxssffTwSYoffubwSeJ6Or01rtWe%0Ajp2JmILNCA8RydKqfSY3DjA3QoqdE/GnUmmPJXmwSSGIb8RCaeDsABMjTxIPbHK6agpZOac9IpT8%0AKWdR%2BzkERaaTJMZJbiJx0nbSjQDIUvaSJVbhZBqbxsJ8dmwj8ftTYZSIc%2BgnXQEQFssSg6uvY2Jg%0AEn6Plr2u23ydBXHZOp1zvOQw9u7NL7%2Bvn/bkRn3HZ5/rGLl3vX850DqFmsqrZH3yuQ6f7/nwEIc/%0A6%2BPQdXm4ZCRdVL%2B8nLYKs9Y%2B0F5OnquB1cjK2cfXi91UTzzA1hGR4/H%2B/HMx7NfT7v/CsFjWxtZ/%0AnFr30j4h0yfnYX6HL98zfP1%2BY9Ivn6Puc%2By6fFuNna9ZbB1VoApUgSpQBapAFagCX0SBVz180vF6%0AvNvDh3We2pnl5OaUpQtoPQquwQkqg1V9nkkdYvB1sKTHTjZpA7sSXJ6Uw6Aj2D6xhwOGq3TCUhIt%0ASnAypxk7SWO2EeR0WHKqIzI8lsZKGCeEdqVKYOxnUuGHzazkzrrTnzAbCAkOyJvWLPEza1aPP2EB%0Ay2AnSn3oynRhZ2tjxGeHmc7cVNSJjcgB6wQwb4yAKRH8uatvGuFK7ZcVpz1fMfvYuT4R5ADGj3ou%0ArRaA2bqR2cfeSz6r3MlgfnnL37lw%2BHzLN9/yW4fmJ5/eDfvYmguw97xydznEmR%2BlXl/oa/ly%2BFy/%0AcGjx8N/kMHH9SOpvb/wI9PpusRqVxypsaHe%2Bz6ucq/dnnm6N76BYKozPUdfuLufPzcNqGt5OTRWo%0AAlWgClSBKlAFqsDnK/B6h08f1umYB3T79ixB3MOnznq4vD5O4oPk0ZOIR6nY9WB6HVGBAL5ZBvEd%0A4QwYR/yVZuUaCSa5pDsSEUNQhzgO1g7lPPCYKzJLqW7pTAEcSOTXSkV1HG1oyfK0mU6cSohlCJbE%0AiDbV4xDH16ZEEhMJJs6kFR/LUhIPTjA6IsOJkzH59UM1l8AzjdVJxJTY6eCfx6GQgBw%2BcyGMA8Yx%0A5fuxtLRF2I1h9re0rmPY%2BjuUd5zofuH22R8Pcm/xja92zkGRwyKR5eyTGyT85h5Op5zpPHlyFt1/%0A64LasPq/lb2vwEUA9Vjllkae95YTmai30tdYdv3A6b58lz6QlD98XLneNDh/Xr9p9koIeJXYhBw9%0Al7tPz7xM18eei4XK79e%2B8HfWOsHCc93a7svMVXoPGllNdlSBKlAFqkAVqAJVoAp8pgKvdPjk2W09%0ATu6xHu/24HmXAPG/%2B7u/wzIIE7ks7y8CWALsacqj1IZfzGZdhrm%2BPPiTSl%2BAVrwsRDINJulUP58x%0ATAkGJx2GTSqWcII0qJ3V08AMAjN%2BIAkbvWVJsBJNG8KUTnoi5oqMNTgxJhKxqEt2OLPOKak4Ew8w%0AaW8iQ55ayQ1hnCwFfHACsFbqxjn0EJiJFjKo/tiMrKbKd%2BXQ3nqh7GMnjXH78AOey%2BwDGIexHbt8%0AAy03375xAXhidHMrzMeinDb9ac998lw3KvFtFsCxvupfD5m8GmDxHKsFsl4i%2B0h4Idm3/Wbb4b0k%0AjOx1mOTQuH88dR1B13c9Q7mOx3vsY6ef7K73mE29Nrz%2BSVJO2esDXVraOyJRKj71xd88e6fXO3y/%0AdiHpqAJVoApUgSpQBapAFfhcBV7p8GmbPBfG4WkRnwjPmlodglkSvx9GlyF%2BOFABJi7nTQuDJDr6%0AEyl5eM5sJvpsy/mTqb5USRfmaoKyiRRAIafpQcxMScSunIqfVBLOZiZnhNKZnAcSsowEg8Mw0R7C%0APHMT1DELe06x1Tu5kyrg4Ce/5FY5ZDk1K0vpx/ZMzyqO5eKk6HTiHxLNmvfGZDuAzz1PwKv5%2B/Kw%0A61VwXat1LvPbUznC7SknLz7T5LfX7mPkUuiiklqRsZJZXJ98cn57w3fFr9%2BMu38/0Ho5r0PeflF6%0AKxy2dhXTo%2ByFE8xqZENpZ5Mwvzi7wcuqyHUS9tD42%2BJZJ1gbXQzuanNBseLrn1rZHr9Qm%2B/rZX%2Bu%0ArurrHLtOob/wfrTAO31vApe3pq3SBb7wV/cjX2F4HPwRri5XgSpQBapAFagCVeBHUeCrHz59AvNR%0ALA9kPK%2Bvx7s9ssQMMFNW9QVgCTpM5FyUoBhWA9bJkx%2BOfpwgzUruYRoeE7FUZ4QHhxSGjgAj2FSZ%0APPjA5pLI2Dhgpp8U0mXQmVYMWQz6xObkuWOXlg7pYZ4VxceKSSLT6QM75GYaGI4juTgZMjAFoz2D%0AUyVgHVOSK6fBicR3qhWWLMuZFRtnwpKoAwap8XNjEGEcYN/PdOv71A5TLh79cvr6hVfV8tapkrt8%0A3zx7I5ej3dpW9sZdz/mT307kr6VdJ9X1eeI6ql10tgjTp2rrdMd/2262XTCcLO47Cbs49m012K5U%0Au4195rx%2BaMlHl%2BtDy72L1eOmvWyMSwPvOm7uivxKpHGeJLSyVu6FYTWTbe7dj/Y/wV0sHVWgClSB%0AKlAFqkAVqAIfKvDVD5%2BznA9kPFfq%2BNQOgAgDhziOq1gdlxbiOjxZmTj5b/qSTDthUDo9O4GtPvaY%0ABwxXCV%2BbuhxB5QnbJMEHn0icmZLEm0HTY3EckzmJHB4UiojBVCTLlKQzFbOxFzODpph1sEkU7xTf%0Aca4VKgAHcFKSRQQ/sFlLcGxo47A08fhzKrM25eJIe3PqUgBgGN7MuUNCa8WZ8s19bnnPV5ct7C/0%0AyQFsf/zHX1vw8SD/KMnlA0JvWVP2fWPCOtzxYl3nz/3DmVhfTNtqbu/1evetU2h8oevVuGjWB5Cb%0A/xK%2BMO%2BZWUvzcW5c508Pjfv0Ccaf%2BTRjnz/9%2BU92xVj78Bgsz76C606b29ygDdxdbqrbZjF%2BDHM7%0As9EqUAWqQBWoAlWgCvxMCrzq4VNh51Oaj%2BzraXM/c7KEbzBXQTxxhrA4wRjJVCeFzk6QMzF%2BHGDm%0AYudIHAeweB1941gHuVf3QpgpziHlMJ2A8NgMS9OR03QsMmIzXNXKk9y5JJ7IdGYWftKTCNiU2Czh%0ApNBziRMs/mCZWmI6%2BHNIPiPx015IsjRbmj6AEMZJ1mEVgJjYc6GZ%2B5343JVcN86c%2B6C3LAdJtsBP%0AcvJzkE%2BKI8VVjXEjs04KnykyeNmu0%2BK%2BCxbnHvvLps5%2B18tg/6fzZHf0mrXYGMtc0o9y0sY%2Baa7m%0Af%2BUX1e7PLQmu8%2Bflf4sRhmX3NumVj2f3Vj/86HNtbfNsxs2c3a70R4bX/RFkMVWgClSBKlAFqkAV%0A%2BJkVeL3D53w%2B41mSo5HfPUvcR0usvsgDfsK4YMen0VNkpoM/TM%2BXfBJOP7kwSBJHEqbisTrE46SQ%0AuZmenaTEuclDMFSzkwTNkgQb51BR/LQiD%2BlOzU2JgzMTJ35mzULGpw3DnZSJmX540lUiccQnK87s%0AKulxSH/OD3Mw/o1J8NNJuZn1Tf10tM5Wa7La3Qc%2BPP5w8Fzhp5PX8jzVjb732RPc9ayYc%2BbFeUof%0ASRf3Srin1Fz0a/iZ52pqT1cfy1mLy71EL9eFvHX4XB2vP/PkaTZp6/NPsljmaI3dLG5tkbqpZRfn%0A4rkEV84qt%2BYdVaAKVIEqUAWqQBWoAl9GgVc6fK7HujGcroe9EXe6nnn3ce6wZByO9ay8R5xB/Kw7%0A2W6CPsomw7QHHpZCEieYT23gzBAqnUMn4ScxnUhyk%2BqQHvKZcicx%2BOlMPH5aAhM/ThJnlsFg4twB%0AZ%2BmQm3j4D84k158R0g/TEB6WgLlZ%2Bc9ZRs7xSfiavp1cXkaevvYHnryuLh8SsqN19Lq80HZvN9tf%0Ax7rLC3Id6vZr/OmEONMP%2B9tHvPGWMFwPmJfAtYVdx9PgpRu%2BrJY20T43rvnFmcUA7PPnuh0X2zpR%0A7lOlIBnMJR7CSVG/ClSBKlAFqkAVqAJV4Asp8EqHz9ntzcdYAS5NOxMnxsf98%2BqdyHN1nzsznKnC%0AECcthSTOOZ3IIVHMzRSDN0kMhirOjJsekjgTg3/IJRJkHFMO9pB4AM9pkHEOVE6TMmHTP8BukhC8%0An5IqSZ/46d8EJDgdsw6WQjfZZuK39f1rH093tKoyOJzM%2BM1BHupGh%2BvcdjkR%2BuVytNxHzn2ou4Q9%0Av63VC3yQDHcv3kQkeCk5qPysdVNf8gXT8%2BUUuXT/oPDKvo61gTW/HJMNL/il5BV7OT%2Bv6HXPV4p%2B%0ArQJVoApUgSpQBapAFfgMBb7B4dNufTQ/PKMbnFbwAfay/Up7ziXuk/d56RCZDPHNzfQOWzBn2nMD%0AAR%2BWEg/JOXJYguGMOUfMMn4zJbRn58CWng9xEg%2BR55AHWCo%2BFw/g7CTlzqaCOaQ/F5%2BwYOLM1e/W%0A59i5TlbrPLbcfWFw1gFsfXuqx7Rr92vuiLcSVxoJlxPaTr6sB3bNu/n1NnifARftoeKaHnnXPIfH%0Ai/MB5kqySTehPW/3ShcGA09TUbVVoApUgSpQBapAFagCX0aB1z588oCe8wY7YMqYW3F6MyjM9ANg%0AMrzAf5ztjJyRF/c2SQ7931kK8oChjRnBn5qTNVdDMp1zylw9MzzCf7OowZl%2BE3ao/rLpc5v6pIo3%0AwQQZU3amL2vydbIuJ899mHs6ln14Y9zewCmawOEjx8c3EgZT9qeu12PhZFmNptmnA%2BJT%2BlNspuk/%0AoZh/MLnOj8EzRyNVoApUgSpQBapAFagCn6fAax8%2B73ebJ/h5GjmkfM%2BP9V%2Bjt7MUH60yAabPiHqe%0AI9H5uZQAzs4dtgP4gHyu1gF2IHnZlFrP0T4Xf6QQue7iEfB3gjkejT3XEd0fh97bTk5/33gnTx%2Bz%0A0tHl3Di%2BXfZWd8%2B3vle22Uz3DrG3iBurAlWgClSBKlAFqkAVeEyBb3P49Fk/T%2B1OD4%2B8BrOLw2ri%0A38qZ7X3V3mahF2z2BekvSHlBY6b8qLVeLMjrJ3oJ1sH8%2BsHiNfL8ae1Wl1/qk8NneZ5dOHTzaW1/%0AmHw5ht6iWOWPh/YPkzurAlWgClSBKlAFqkAVuK/Atzl8pqfnzh7n%2BDkiyf2D33NZaeDgvIztU6sc%0AimZ6v3pg03mu9AuoJm3954Q9KDN1fjDlwPCdTD1Wafmm3DU%2BPGk9d/S7nNNuHdc%2BYWuyfw5JP678%0ABLkLrQJVoApUgSpQBarAt1HgGxw%2Bn3tGN/7c6nPyfCr%2BOR7jX5btfq3z6hes/gWpzn02EgXU%2BQdT%0A%2B8NTZ/Z627kcSp87m95Oeib6RUie4W64ClSBKlAFqkAVqAJV4Jsr8OY1O/jBntFfU7rWqgJVoApU%0AgSpQBapAFagCVaAK/KkVeNXD559aqTZfBapAFagCVaAKVIEqUAWqQBWoAi9WoIfPF0vXxCpQBapA%0AFagCVaAKVIEqUAWqQBV4VIEePh9VqrgqUAWqQBWoAlWgClSBKlAFqkAVeLECPXy%2BWLomVoEqUAWq%0AQBWoAlWgClSBKlAFqsCjCvTw%2BahSxVWBKlAFqkAVqAJVoApUgSpQBarAixXo4fPF0jWxClSBKlAF%0AqkAVqAJVoApUgSpQBR5VoIfPR5UqrgpUgSpQBapAFagCVaAKVIEqUAVerMB3dPh8//79i7fRxCrw%0AzRXoDfzNL0EbqAJVoApUgSpQBapAFfieFfiODp%2B//vrr96xUe6sC9xXoDXxfn65WgSpQBapAFagC%0AVaAK/OQKfEeHz5/8SnT7VaAKVIEqUAWqQBWoAlWgClSBH1iBHj5/4IvbrVWBKlAFqkAVqAJVoApU%0AgSpQBb4XBXr4/F6uRPuoAlWgClSBKlAFqkAVqAJVoAr8wAr08PkDX9xurQpUgSpQBapAFagCVaAK%0AVIEq8L0o8N0dPvsrQ7%2BXW6N9PKxAb9qHpSqwClSBKlAFqkAVqAJV4OdV4Ls7fPZXhv68N%2BOfdue9%0Aaf%2B0l66NV4EqUAWqQBWoAlWgCryeAt/d4fP1tt5KVaAKVIEqUAWqQBWoAlWgClSBKvBaCvTw%2BVpK%0At04VqAJVoApUgSpQBapAFagCVeAnVuD3j%2B79H//xHz%2BKKaAKVIGvpMB//I//8b//9//%2BX//rf/1K%0A/KWtAlWgClSBKlAFqkAVqAJfQ4H/8l/%2By4H2I598cvL8T//pPx1yOq0CVeDVFPinf/onzp%2BvVq6F%0AqkAVqAJVoApUgSpQBarAV1Lg1/6izq%2BkbGmrQBWoAlWgClSBKlAFqkAVqAJVIAp85JPP4OpUgSpQ%0ABapAFagCVaAKVIEqUAWqQBV4sQI9fL5YuiZWgSpQBapAFagCVaAKVIEqUAWqwKMK9PD5qFLFVYEq%0AUAWqQBWoAlWgClSBKlAFqsCLFejh88XSNbEKVIEqUAWqQBWoAlWgClSBKlAFHlWgh89HlSquClSB%0AKlAFqkAVqAJVoApUgSpQBV6sQA%2BfL5auiVWgClSBKlAFqkAVqAJVoApUgSrwqAI9fD6qVHFVoApU%0AgSpQBapAFagCVaAKVIEq8GIFevh8sXRNrAJVoApUgSpQBapAFagCVaAKVIFHFejh81GliqsCVaAK%0AVIEqUAWqQBWoAlWgClSBFyvQw%2BeLpWtiFagCVaAKVIEqUAWqQBWoAlWgCjyqQA%2BfjypVXBWoAlWg%0AClSBKlAFqkAVqAJVoAq8WIEePl8sXROrQBWoAlWgClSBKlAFqkAVqAJV4FEFevh8VKniqkAVqAJV%0AoApUgSpQBapAFagCVeDFCvTw%2BWLpmlgFqkAVqAJVoApUgSpQBapAFagCjyrQw%2BejShVXBapAFagC%0AVaAKVIEqUAWqQBWoAi9WoIfPF0vXxCpQBapAFagCVaAKVIEqUAWqQBV4VIEePh9VqrgqUAWqQBWo%0AAlWgClSBKlAFqkAVeLECPXy%2BWLomVoEqUAWqQBWoAlWgClSBKlAFqsCjCvTw%2BahSxVWBKlAFqkAV%0AqAJVoApUgSpQBarAixXo4fPF0jWxClSBKlAFqkAVqAJVoApUgSpQBR5VoIfPR5UqrgpUgSpQBapA%0AFagCVaAKVIEqUAVerEAPny%2BWrolVoApUgSpQBapAFagCVaAKVIEq8KgCPXw%2BqlRxVaAKVIEqUAWq%0AQBWoAlWgClSBKvBiBXr4fLF0TawCVaAKVIEqUAWqQBWoAlWgClSBRxXo4fNRpYqrAlWgClSBKlAF%0AqkAVqAJVoApUgRcr0MPni6VrYhWoAlWgClSBKlAFqkAVqAJVoAo8qkAPn48qVVwVqAJVoApUgSpQ%0ABapAFagCVaAKvFiBHj5fLF0Tq0AVqAJVoApUgSpQBapAFagCVeBRBXr4fFSp4qpAFagCVaAKVIEq%0AUAWqQBWoAlXgxQr08Pli6ZpYBapAFagCVaAKVIEqUAWqQBWoAo8q0MPno0oVVwWqQBWoAlWgClSB%0AKlAFqkAVqAIvVqCHzxdL18QqUAWqQBWoAlWgClSBKlAFqkAVeFSBHj4fVaq4KlAFqkAVqAJVoApU%0AgSpQBapAFXixAj18vli6JlaBKlAFqkAVqAJVoApUgSpQBarAowr08PmoUsVVgSpQBapAFagCVaAK%0AVIEqUAWqwIsV6OHzxdI1sQpUgSpQBapAFagCVaAKVIEqUAUeVaCHz0eVKq4KVIEqUAWqQBWoAlWg%0AClSBKlAFXqxAD58vlq6JVaAKVIEqUAWqQBWoAlWgClSBKvCoAj18PqpUcVWgClSBKlAFqkAVqAJV%0AoApUgSrwYgV6%2BHyxdE2sAlWgClSBKlAFqkAVqAJVoApUgUcV6OHzUaWKqwJVoApUgSpQBapAFagC%0AVaAKVIEXK9DD54ula2IVqAJVoApUgSpQBapAFagCVaAKPKpAD5%2BPKlVcFagCVaAKVIEqUAWqQBWo%0AAlWgCrxYgR4%2BXyxdE6tAFagCVaAKVIEqUAWqQBWoAlXgUQV6%2BHxUqeKqQBWoAlWgClSBKlAFqkAV%0AqAJV4MUK9PD5YumaWAWqQBWoAlWgClSBKlAFqkAVqAKPKtDD56NKFVcFqkAVqAJVoApUgSpQBapA%0AFagCL1agh88XS9fEKlAFqkAVqAJVoApUgSpQBarAN1Pg/fv336z2iwr/%2Bqfr%2BEXbbFIVqAJVoApU%0AgSpQBapAFagCVaAKfEsF%2Bsnnt1S/tatAFagCVaAKVIEqUAWqQBWoAj%2BJAj18/iQXutusAlWgClSB%0AKlAFqkAVqAJVoAp8SwV6%2BPyW6rd2FagCVaAKVIEqUAWqQBWoAlXgJ1Ggh8%2Bf5EJ3m1WgClSBKlAF%0AqkAVqAJVoApUgW%2BpQA%2Bf31L91q4CVaAKVIEqUAWqQBWoAlWgCvwkCvTw%2BZNc6G6zClSBKlAFqkAV%0AqAJVoApUgSrwLRXo4fNbqt/aVaAKVIEqUAWqQBWoAlWgClSBmwr8eP8oZv%2Bdz5sXusEqUAWqQBWo%0AAlWgClSBKlAFqkAV%2BJIK9JPPL6lmuapAFagCVaAKVIEqUAWqQBWoAlXgpgKfcPj88T72valIg1Wg%0AClSBKlAFqkAVqAJVoApUgSrwxRW4ffj81HOm%2BOfsF2%2B6hM8pwCU4j%2BfAjVeBKlAFqkAVqAJVoApU%0AgSpQBV5NgYd%2B5pPzzK%2B/PoR8pG%2BoHoEV84gCXJpHYMF8PfHvdPL1imZfL3Zutv09N/zinTbxOQV6%0AD9xU5qYsN5EfDb74BXW/hxfTfrThbwi4ueU/6U5v7gVt/6Tb%2BaS74mfee4R6ToQAdF75frjf1Ss3%0Ac5DiPP1zdXvu/07k5ta%2BN/3v9N%2Blz1Hg3pHycGdwTxwin1P4Zbm9L7/sJfgcPT%2Bnk8%2Bp%2B7I758/V%0A7cv22Kz7CnzOPXCf%2Bbz6%2Bnf4uYdHIq%2Bpybmfs0qf08%2BZ7Vzx%2B4n8eDv9nB15Xf5cV9Cef85dP/c6%0A%2Bnw1JvOXuh8%2Bp6sv1cPc133/z9Xt/b24%2BuPt6JFdF3Nfgd9zc/Aa4xbJK23eLsaxjPt0z62G9jlA%0A45%2BvwHNX547455Q74M/vsAxVoAr86RTwXaLvDF/kwp3fcr8I7Tcn%2BVH39c2FbQM/iQJ9Bf0kF/pl%0A2%2BT2%2BMH%2BL/iDDzPdnq8B9qmjVa/p31fwOZmei99nc/Vzch/h/xNhDhdiTqc/FZv%2Bndtv0M8AAEAA%0ASURBVJ0%2BCJNh1roZucl2M3inpS%2B1dO4W5kPw3Ns58qX6Kc/rK3C43DZwCH7%2BFf98hldT5rD3m4J8%0AZjPPqfFc/NzSIXIz8WbwMzv/GumHvRxKnFfP%2BzpHDiTfZHruPG2cl85bOEeS/qdwzns8R857PEf%2B%0AFJu93%2BR54%2BfIZHhOhOfiM/dx/9zDIXKz3M3g40U/CXno55B7Xj33do4cSL7h9Nw/zRyC5/7PkW%2B4%0AhZb%2Bsgr8%2Bu7dOy8w90Eca3hn5P6I83gH89Z5zn%2BcTeTk%2BdTcr41/RKLP739W0U8kzkGrFI3zUSnu%0AIw%2BFDtMz%2BYHtMD3jv3jk0OFhei536PAwPeMb%2Bf4VOFz0w/Tc/2de9EfSv3YP503NyKF6pnEm%2BAX%2B%0AQYHDVMIZPNc9R2YbM5f4YTqR34P/3F6eix96PuzuMD2AX236XPPPxQ%2BNzV1M/wD7etNH%2BvxoY5Nk%0A%2BjfbPrAdpjdTPjX4qT18Kv9z%2BHPdROLM3MPeD1OQ58hMf9A/lz5HJtWh6GE6kV/Kf66f5%2BKz7rm9%0Ac2Tiv4l/2Mhhem7psIXD9Iz/3iIf3SAN/%2Bk29cVFXh9vMhQChwLaODeDz/VxFtRI4ofpczw34yG5%0AufpdBaNhuvqyzc%2BLcvYPRafmH23jo4CQ42SbZyewEJ6dYF7HSZPpfEbSg31%2B827TT50vq0Auuk6m%0As8rhHphLj/i5eR4Bizm08QKGx2tNZOoe1DjESfmkliY4fpz7bOfSiaTzUJ2dYL5P57CXOZ3%2BbN49%0Afs87PXQ%2Bp9PPps57SSSY13dmq5/aT3LPTjYi52SefmBf0EkzcH7tWmk7Re84s5lH/JC/2LnTTDjT%0AydkJ5us56dASczr9NHBuMpFgvh9nbkF/Ruwz/Z%2Bd72cjn9TJYY/Z1yeR/KjgDz75ZJMRS4fPRRPB%0An4CbihzEdRobh9wDcrKl4sRMP%2BCbwax%2BbSd93iw0V2/2eTN4k4rgZBNDxKCOdiLlx56d56qIfG71%0AHE8DqWskyJQmMn0Bn1outI87h36%2B/4Yf31qRjytwvg3Od0LY5o16/xYN7YRNP5yPOGEDfIfkztIj%0AVcDMQk6jRpwzTPLHqweJM314MpXzbGnDTliavkjTz3aunjm/VSQbSQOJHJxMg8Q5b3OqN/2Z9TX8%0Am%2B2lUFYPTqZB4nzzTd3sisYS/1RhTTzb7Pprbzmdp%2BInOZ%2B63wP5oTpTI2ebxFQ8KwMmq8E/F5yA%0A%2BNbNVOfczISd2zj3cI4cSjw%2BnaVnewd/9nwgPzR86O0wPeS%2BwvS5Dc4dHTD0nLZ1Mk3D50iWXtk5%0ANH%2BnepA3m78ZvMP2wyw9/cIhthSNcDJy/ozD0s39R8SDw3QO0pnKEGdyTv9cKCmz4cDmaoIH5z7/%0AAfz49EB7mIYnHQrIVMBzWUnHEYOd43x1YJ7DRCKT6o5/H0lpc9OD/Im7KoltzFrGD%2BAJeM6/35VZ%0AN2kNxh6clPviDYcZ55HmJ376Nzc1AWf/kXIvoD0Xev2IW3tB8/O6T39u4eY9cLPi/Qbu63/IPUzP%0A/STyODIpzzlSYecAnOk5MZuKI34iXYqFLf6E4U%2BSyWMDRvDnUrLInenxxWcK/jAEHIKvME3duaOz%0ATycG3ULsYUdOw/lg/weSO1mPME%2BM/n1LuWxHP1MS09ukvdPhF1mataZ/IE9vhzjTZOE4DOJPcHZ6%0AoHJ6AM/E5/w7iWGLA8nNuiGfyAR1DomHVaYzVx/rcDX%2BIVdmLAMMVoBT/ESMgzkwPDg1MRYnfhio%0AxSCOTRBnTs2aq9OfyBnXv5N7aGZOzz5sFsIyAGBTLr6JiX/USeJzyE8lnDyHXWQ6ObOXdGIEnkTw%0AZ8oscYAdlu4nnsGfE5kdTv/AmU2BiX/A/NjTde%2Byw4Nl6mFG6zT%2BBJOrcJFvTuPjvHnzBnsYB3Fl%0APgRJSZXpBCYg01dwzn3OyPRnM3Mjj/d8YHOKzThcKeIWpQQjssdhlfhs7OBnNc4BwNQq9uDUNrJk%0ACgznwRLBWJFfw0YKyGfDth07S5%2B7na3qT3x8%2Be8Agvwazp%2Bouq0%2BLsKXkjR1cW6OtETFOYgzzaoO%0ADIdIYAHHOSOJhCHOGSbDczzPxcNzBsxa%2BE6x8719%2BukzVDqZptbBASBGRwtmOk5nYvohuJr7cIg8%0A06bEBEzaL%2BvT1CS0nxk5%2BMHrxN5xwpCtHRwA1v1o9VB9jpMtHEiyBeIHP9M4yT3sJVMAj2xKws/Z%0AuAz2c24vfaaf6cxV/TDozP8fnIWyzemE%2BXO2M9vAT9E4ArQpFGeu4j8XP8DOU8vF4sx3EqaMZFkF%0A67Dudfb0bEAkKTrnyATMEokbjMXJAIOPlTYNxMlS2G5G5urjvqXB24/OR6cAnuvWtgEEo/%2BV7JRu%0Alsi%2BEjTiNqcFEHA0j8NqdhqqBGfk833bsNxH2dLzGZmlOAdMSrza1g4NfD/TyyefaQjJGLxrOKZP%0AxCkWvBZnioh/nhoE7/kHm3KmhyrOBMSXGYxO4mfnDuBcIpE7WbNE8AkmojMtGGmxxM8lZiQ8Z%2BZE%0AcIBlXC/U0/ViyaIwM5giOAMEdvJIlQhgE0nRz9LBsYSWJW8MpnHEr/JjpDqxA%2BEnTe%2Bkp6UDYRrG%0AyUi3RM4Np1uW7lQ0MQw6H8Uf2nvxNHXTxrn0OZJyh3TiidzJSnqKxvloVvgPJHempHyU9k56liCB%0AikFEJzcAjkEssDkOt4HpATsFT%2BQwCD63epMkQXgklCH2wM%2BUFJFz6Rw5r85a%2BBno4EgEZxaSfNpJ%0ADjjVcW4O8SzpJMVC1tISoRlshilYmc%2BXxriwlEgWDlRzqj%2BDN7NmygQn/X4Wq8nCcZB7dW9EZJYW%0Ay0616cSlTD/VuZ9OQ48QCot1GyTqTGtQTku7HW1q3e8qsM93KJS2YTv7sxN9MDOYHpKLM0duXZHm%0Aeh3xc%2Bve5Ax5epskc3X6UNGAEZ1pic9agmckVGSd4%2BdI8Dipa5ApQwWmnUgI5Ywmk5AlGGLnkvEZ%0Aic9S/DgziO/I1WEa5GpoXBrjRMBgA/viTnqwNy1Vbk7T1ep1j8O9RBbhFzd5MxfOO4T3V92Idu4I%0A36sQZrejdVM3mwn%2BSzmzf/37dSf%2B0EOWdKYFOWmnf1g6cP7A0/Uzn2wvqjFlMMW%2Bfft2z5ajj3Up%0AeKVBSgfTg%2BOUm%2BkwLgnX10kI40T0icRPxQk4%2B0FmaTLf9M8pyZ3OzCXuNDbOTMkWdFiKM2H6k3/6%0ArIYcx0uTC5SpGPnR/LfffpvKz7oHcrvSBoZjV7HJwnFYGh/nGlvvVpJg04ARplkN7XQgcXqonmmc%0Am1lJn04a0zn0nHIw0542DlMGGO0sqp9C4TljPrr0XArxA3%2BQ5/jsMH6cm4mTJP45JbkHJynEP5o1%0AwQeeO9OP0t7JPSzRACMvFu9YbZCUO1x6IgwBpONMy9TVjXq6T5IS5umEIc5cnYTxJ0B/logf54w3%0AQsU5ooZv8k4nILXSSRyWQB4KsZqhkkzjZAnnkCiVpeelwU%2BhpEMopzbx0MaxSvqMc4gzPaQImPaQ%0A69LMmj6r4rGfNFIRtuxx7fb61kScAUwb/H1ngqefLJr8qC9AZOzN3XkFgwkzpbORvafL%2By1xBjBt%0A8AdHwvuYQ8p5mq7sHEAcwenk4EyqkJh%2BuGMlFAOJw/26fSI6pONP5vimO52Y6bN66CSlZzowshz6%0AsThzgMn0OT%2BAc%2BnogOMAgzObufSxvxzUmEtWmT0QOUwPnWSKk4o4GXaiNSindb1A8V2KxTn4RmKf%0A6y0AHerixKY3ndlbloLHsT2s3SpgZLSHBzuxnwmevh2Kmf5zEePTmhU7xc82wVt0buT%2BdmaTs9xz%0AcTDn/k08xz%2BHJDuNc2gP8jlYZRobsMFM7zgUOoDPkTvp33Dpd/q2V6yDbrgtvDPWoXOPP/74gwju%0AXrmcMUBGOJwM45lyG2VwFrIKEQHZPHF8bYJgiIRKXxjBwHAO07l08A%2BFDhUFn9kCiwNyUuHPkaJp%0AXseNm/tIFTil0kkJL8Tl8uwvuTSpiNppQ8elA2GWcJKrQzkcAYesQydWxxoPFfsN0tsAzIFz8uOD%0AP0TEE7%2BfmFwZDpYpI33qGMSSCzkdEo9uTrGuApsNmGWr0zcS%2B1xKAJ/kHArNKYWcWhF/lr5ZRXxI%0A4kzwmWTCpj%2BzbvoBx7kJO1cUdjN%2Bh%2BqABznH4U5IJ7nogPEhcQQgCVOc2dgV%2BPSOSiRZccyKlS1U%0AIQybjoCbhKQQB3BenZFDCbKIRATfSZge3uSTBVWGFW01Ng0EFiVxWFVMrCnBZ4pD0JHGmOIbhBmM%0APET0dVySIT7TwxBM8OyQleAhK9P7ABlSfYLxHe4r/jX8tJre4GGwWYbLLOHDgMVnlbhOsnBuDsHY%0Am6uHoLRaluIIy6pOrg7T5/ww0ABjbenupsCkpeTO6ll93AmnhNgM24aKCFYkNsMlpikn0rg8kmAz%0AjEtIbrZMfAuwLqUlpJU/zAadshTHotKKiQUDJ3YOVy2UcjrAcJJ%2BcFi6D5h4K1pdBfJO4lQAKZbW%0Aqgk%2BTpYSJE7wwR6ApZ%2BDb2nsbC/BWddy8%2BrICdhmUmI6WQI24x/17SFdMdU3PlfxYcNayw4DUz0t%0AMDBBmnWnkwP4JtLqH6UyN%2BDg02d2iqMfsG2wBSJzO0zvd8hqeg5bImfnjDlHzllGDsibU4IZZOGb%0AS59zuEcirGqnY8ojNrkBnyNZ%2Bq6cp2%2B7jV7eE1jfO7CcPB34jHXXXP8qmn0%2BN9inS6jM4IGeQboO%0AkSSC9ApNa3pIBCcYh/j0M4VKn1XGZMY/TMUEH8d47My6ybmJn0xoIdwarC2znL2H%2BSabqxadACJe%0Agn01luHqYA2Kt1wiaE6cQQP2ICGRMLuknR0SsZMgkwU/PjbVUxGwVJSGTWtXIRdwIE8VGaYF7xa0%0ASUwKcYbTs2/EDmfPQcJvh2xntg3AVrGzaOpOBz%2BwOGYdpgYftPQwkZnGYVX%2BWBw71ybdlNg4APRD%0ANZ2k6wQZZ%2B5u%2BuCD0cn0wHmYhkTnMD3T3kxPlnhKM7xdsY7zTZsbNQ7pUpEeqlmRVQE6%2BskKcqav%0AVsYIJgw4vljCE1rBTsWLwYcycfzQ4jjFsmUtCvha8D1kCiIm6VaZtbIU5tTFiXRuIVNoD5uS59wb%0AyAxWBUxmIqHVT3uzt7QnAzbOLG3zRqaf9OkIm%2BCUnrnW0mYvcRLHIRhwaKFig3kvAqMP8ma5xzuU%0AYe6CSNLtZE6DFOaSMDt3U0SykemIt%2BePbgpAyunMokbOmEPKnAasI1taTf%2BpQi7IjPu3K%2BBJ5QsK%0AThzijLB5KQ//V3iH3C2EwaldyelSYEyzlzisEifLFBwrTh4ZYgNOik4AcWwA66BoRt5JIghLSbQH%0A7GHYHkjbsxOz4scJmw49JBJfJ%2B3hQG5L%2BiGH9tAMU2tNC3428JyfTg54pmkJn2ZsAyfDCHY6TqWl%0AaFrNm0MirDoEa0mf0/gg8YPHERmHVSNp4DmqcAaQREnYIBG3mUsQMBWzhTg2hrXJlDDyXDCwg5Na%0AxJ/zD5wPMoQQ2vOQxL1ka8DwCWIDIBhfB0sw%2B03wB3A%2B%2BG237kftvEV8IvHk%2Bbe//e18yCFF%2BaKs%0AEcVKkFcIdxuWITOOieIVfVqbkSFWcJYyDUDHuGyCse7rYF0lSKK%2BTqaHdHnONrS%2BwJyamzsMh10n%0AqBMbBiIHXwzBLFEFPR1eHX2r0zy1GKbMveiHP47xJMJDeoKzyfRgLkhGquMYNwUSIl50LFMsAAvJ%0AH3KZY3HSAE6GcUhwMix6tgBm0G5tOBZHHkvQIYMgllx6dswGxLMqf2x4pkOiU%2Bz0E8SRysgZM1dn%0A0ZuJ6VMHDM5kMIvIYVidYBrQyVSA6QfLNLA4wR/AlHApTpCHXKexh9UDbUhwnkuhIleW4R2LzXta%0Amrle8A/%2BxuRQGrB47SyHn%2BlsKf5OfTI04wQAjulY2og1KAN%2BqIzHBiCPNmAda2G3DBcp8h4SNVwV%0ATKJFU0gnhLNEMJERx5eSbABwJkN4BGDTGw7XCOuSncgspzYNQMtqpnFIxw9/2BJnlVzxcZJubqxO%0AYDgZLOnjMCyU7bgXrUEA2V0cc%2BVhg%2BCxrLrZCJtCONaKlSFWZGziB8duDxYMEZHTCcyNxBJ3I9pM%0AYUgD3hJ3NuWOZlFLa41PjJGbVti0kqTJ2Xn4wdOkFgCOY7aEDz4D2Ly%2B%2BC6Z4lWzFhtXAQFhxpEz%0ANo5LIqcv%2BezBEnYyG0iu%2B8oUBgmlCrnxCZsAfMi1OBTVRgEcxuH9JAzQKog6xMeBZxa1HxLvOHYy%0AW7KQcW06xKExVWLJ1UM/xsHMTtLDnU6yZANOLWEkNiXsJF3ZG6tEYgVjQ6ti8xXkmwOY9JxmTEx6%0AehBwxhOZKfhzkM40JGcnqzoz181Gf/cow7wHDnsBkFYF358Gn07MyjSNHeKTPCQ4h8QZmT6wDLfm%0AVCp1ZpvuDoc4FowArMPdXWdPd34iP4azDp9u3v3oK5k3is8lnjzzjDJvGpTyvlFcrWz6rqI44/ff%0Af5cWSzwpqTv7YZVpMJlKflhidRKaFaQ7yr7mFAzTST59GcSLnP6MEFcWLVNWbYPG3D5BHDldspac%0A00IScvESYuXPO3suDXGX4LRcCoUh5QLGCYxVL5ZKal3FpgF9O5GHZhyhZTVsue44ALAw4wBgyH8g%0ANygg1n4yFZN0%2B4nFOQwqEsFem7185mMcHpgpoXS2ypLdEmcAEIaFShuHqWPCpj9Xr9gPXn0J4pho%0AxBL4sxa%2B02SRMocNJxKYiVr3noglSME5Wxksaop44xOf9AAOeEmyOvH4mYYTJ74A7Zk2sJ1xMUkB%0Az5Yd3AZ5Q8MnKGxf6nUbEJxXPyQ4h7qHogCMzJT47p1yNhNr3I7tAT/OJIwvWFisQXuAk6ml5cfH%0AcdBDRFAKLBGG7QFL29LKFs4DM1OWvPEiIw5sU0mmsoXcQpe2rtfINrSkCJZfTvEwsySDjR3IXZ3k%0A8c065KaQzsSYaBw7y9mYpY0DEE/zDDYy5c2%2BwLAaJI78ErJTNsjI/3Xiqy02PZhibqxtpCUdsnRM%0AibUBbfpJcPLjT5hbw84BgGlgpqSB%2B5sCBl4rg%2BmxOAwBBx%2B8kcTDFkdOLB0e7jHTQTIUCqtjUFph%0AsVK5fQgzjJMiGzy5jjisbu6np6B0HmYi%2Bqk%2BmyGYFNWmtJvSsSUxMlhxkrA6efQFYyfSYCrSWEb2%0AbnXv81iDgiezdzKrVJl3dTDP9XaIM4Vcq5NIgla3k1iDYNypPRBUpXMbRACL1xo5xANY0OsIxgBV%0AaMORGyaXj7iAWByGubanaPScdwYjFMI5l0s6jqvYDFOcBkk5fIctXWcfvMquW1xfATjVicW57HZ/%0Ayf0ZPA042BEQLM0QgQ3nvp2AIG0DmxJpJsEZCf7AZnwip39YZcmhXFowcDLYDvsCgDWRIFN9YfF/%0AeOf3ufPzbtEudwkO7ya%2BoeAn0TtGZZfA19dnpMwtlbsKxwHY28vScoZZqsW4hxjc9GkcBhwsiTqT%0AM8y5G3Dip1bI5WSKk0LADoOlQ4Tpmdl%2B2KxLvE2E0ybJCtXsSj%2BrYiYyl4Mr4vnTEmAoarp7UR98%0A2LS26pXFZ5jFKmC6xTJMZykjYB0rYqHKmG3I4/a94vrGw28Dk5yKrGrtBAsgflrCSTM4aQnHeKwR%0AbFrVMZ5a6TPv6UQODafowZFk2uyCYOL6WtqbU32zEg/GvRCfTmDqGYnA6BuXU6pIgRPfpQObWVqX%0AhGEdwetY6xC8Yp9udQAED7BMU3Q6MhsRKcMknwzZu05S3LKXfr%2BfPb2niaFE7gFg8%2BqHBMe6RrCz%0A1UyzGmf2bCfqP9lo%2BDDce0jkN4gFDAkWEhODZJUg1ohVtKTkhaAOvI0QwbcxYSbKgI0TQhyQTrFi%0AbAPpoFLAOABYDU9yLae1AZrB0eKINF1mIsZxiFAd5ti0JGfAkieIE2S6SkRHMH4c4%2BLdDhZmfeIu%0AiT/onCkOgNmP2wk5bOzLwVLekYxbxUL2NjuE2SVhpDDwiesYt5Z92ozWThLHSYlUsXOs10hrMFQ6%0ApqST657W7ZFNEbQxLHhbTa1DAwKw03EqknSXLBorhrrA5oWw%2BeSCp405JDQdC1IwVjasJLyCZDae%0ANnIdddh4%2BG1P8tDGsbQYUnC0M4tajOzIHgxKm/RDUeICJixgGMQTwQFjV4Ldu1Xm3n0/IRJndpIG%0AJMciiDa17OrcG3XtTSf9RKs46VAMcQZV7FPHIADrppN0mAamox97cGCbYNuYQSOWPojG1EEnDmH4%0AaRVyBh16F0U6bid9lsRgZy18SLQuyaNlKVNXRRK3%2Buwnzcg/bUqYHhJTJMGyzRCaHs2JuxHayBDj%0AFB9HOyMJBmAzTKeTDm1pruIzJo8R7cRPwqziEKd/rY5I%2B3RfRAyCn/3L8/PYp7PQec8RCMcbBctN%0AwxuKU7VbQu7/P8NGSnxWE/HG4uVBui8SLgMjr5NUNzHTEOIkqOOSFh7ZcGBgTGYjcwvxXQohzkxM%0AxTDoxAKIH04cg7LZG7smKOF5U6ZMhpCYNa0w36Q8dvrUSESYIqS6%2BBQFQ8R0U5gCBmCrBHEcBO05%0ADUxH5skmLRhGCLk0xFGAITiX3rqAcXbSMvo2LInNkMUqvln2Zha0OFSxpTiuxrpqD/7fs0gAcDIg%0ApwrDVvWxNoC1KMhwmhsGlsRgHTOCfxgzMUskxtdJFRwH8ThiyEqfbgSAPWPxQzV1iD/ZbMBcfa0Y%0AqaafBiY45XACjmNQTKzpTHH0sWljx56UCZXOJBFJoiOJIt0yl57BbZC/u2HV0mTl0uvIgLVKKppi%0A0NVp0xJOkDr2gD/1B0a6PR/uupQWow3YhmFjhIRVplqCjg15KqoCPiNqidCSsGvS%2BgoPwwiOhQJz%0AGphbgAdHy3Z0iGymp%2BtI1mTDB8lYl2cPp2LIdbO8Qolk2BjTdJhuxUgyLXGmqS5%2B2smZQinBKmCH%0A%2B53WVUu4C%2BX1ZsMneGjmUAJmd4p0eefE8YYknVWrp88wEMFnFUeYvZEr5mbu7EcfMI4pqSK5S6y6%0Au%2BnMLNPTz/1N2SQWPEh4TJwkRBzuTnuNffCVJYeb1YqwQzr3QmiZEmeQlU5QTJ9g2IUdrApgw4bP%0AICuEXD6qYBksTfLwT9pUZNVhMyQyzY5M8UJQ3eGUKqzOHrI1HOOHKkxlFuk9gw%2BPcfFM1/b2sBaW%0A0trc50ZA2YbkYYZcBh3jbA2Y1lpaFTivyox1AMaJ1XHJWliatCWR1sUSjG85S2NTdzo3/Qk2PTCX%0AbAarbpcLdv1ib7aatu0TCxWDJlGMkRsJPFPjYrBWl0RLJCTyZL84cwkfsG0crEtaS8TOJfxM9bFQ%0AuUGsU3Jt2P4F0Ex2kY3oHOJzqp9m4sw2CKaZOEHipEr8mR5fniSGCidyGZTHS8P1kmG2zcYJEpk2%0AzD%2Bqsw6f7tkdqnt8pujCi8K4UmIRV3/iEZfEYHTkl4e7Dem10DJIYUwSGdKA6U7PlkQZsLQkZ2Cs%0AMpjasDcE1R1McdKtSJvZeZdc02UQnL0zPaxaIgBWIbQrwUQkN5HVyUA/dnXgSa7grPpmlXd568Iv%0ALRZCqotPXaYqQLoVidiY3caagnXjadWpVnIJY12yE9l8iwSAQ0s4xNMS%2BAO5/QgALwkwfMlNT5ab%0Aytbg1xeMLxLHYatRQJgNU4IhwG6NzIZhk9BErUEsPNpsME5WSQl%2B%2BgZlEJxVqzhlF07B4KSiQh3k%0AYppaOFcNLrfBQauwZb%2BzectZOjbkQab/m/hzYhhwJok%2BdjYjJiTTkUc8KQyunY5UgNm%2BFzf3gK8j%0AdZDcRK97GAhCYgmL4uMY0QYwg9MXbxta6mYKMs3nrrPugZmpw/awkGCt5ZQIGC1xnDkOt0FEUAeQ%0AUsFgV4mcqUIrWMGxlKCT2MTDKZWFQqJjG1gHJDZALjzSuoW//OUvYVABkGCsYgmRWNhicVJUBlLM%0A0oY2MB3j2A2//H8QpRnpDQcAeEtTF4V5r3b4zmMzaSOO/JBDwvD/NAH7LppCLNmA%2BJtNpkOzKKED%0A2PTk2if2INGhKxKzL3zAGclNymxpbsoeTDxvKo3N9PjyYNnawTIFJsCNY2HLMCjM6t72ufmtkiz6%0ABIZNouRpJg5bdkQNHCOkmC6b%2B2UVh0h6ExbCOFacLZHCqpa4gFndOy33GGDJSZkVmRqXQd9WLSfY%0AWtMXT/xQdIrJfZ6pUtgGuWnD9FjiDjuxyrRuNh1mSWZsBkv4E5Cl9IxjUEJKs0eCWLdvuZDgGBE/%0ArUuJTORcShzH0iijSnlbyFWzvTQpnkQGheyWVmFgcC9pjc9OsvHJEBIFh8cBhgjpu84Hb1/w00wG%0AAMDCYo2kUKaCjcsQNjE2TJA2sHY1d2EJI/hZ0rHnuZqWdNKJPdy0KRH%2BSWIKkeS6yjQwlyIRTrLc%0AEZdJfNomLoYIDjZsP7xz45NPdTnbgxaKOIOJ4Ki7Fgxs3lhEvL24DOiOzxKOGGxIZGZVJzYAO/Si%0AwpMrDYApliXT8VmlAUde3kzTIfwSYk1MLkvCsHFsA5txWCUuFc2w2fDb8CQHae61wafHo5C7faY2%0AIz5v7tmRVVRVEcJACkWtRSFSeL%2BzIksm0htZDOJY8AyWQnJ27ASb5nGEmb751tUh7lukEVYpB7nj%0AwEww6TYTAOmmpDd7sAGl0BpPos4Em2JETq8OJWiVuD0zNY61KOADrRGsAJvXziD%2BHJAw1SYehkR0%0ADhWZ0qHpKUeHyhuwcjGVFrz7mnJFB2DWktD96hu3XMh1smSJaSWk4iEl0%2BTqJNei2rQx9bcTmbWh%0AIksdtAqSXMAZEcHXAnEaS7qJWHIdLKWKW3CKn/gdJzCc9KATtkP1c135gU2knYffVaf4ietgLer2%0ADzZUJM5ac18wOGbzRMTQc3oDwFSbvdie4GTpTNrcljgWImUyE0zWbE8//ZuLfW6n6cGUQ3u2NG1q%0A2Qz74iaxCg5IIuGcdX3XzXN59jXJ9bNTqIDl7Qjf21IxsWnGRMpZGutGRJoFjzD7FJDE2apauSkB%0AWGtlKl7L1jINYDruyIo2I7mFiNCbrYpJLWDwaAniSxXCTHEyDnuHmRJhhsS6WC9K/i%2BDJWBTNDBM%0AYSbO6s2RJkOL4wZNJDe7ZskLalfYNAZY/rlfVwWTCw8Yp0kEb2k24vA2IwjYHkgxSye5OADEpBYY%0Aa8FsRSxB2MCkyUNRSls3NzkRMNkOuZAw1cqDNULQBuyHuI7WpdgshSQOS4fcLFHIQQRHEuoymGpn%0AiQMPS6QAC%2BbsADAYJxgSrYil3FQPxRTNoE0Ks3l8nFDN24kU7iis18j2ZiEZwiMJsJBQjlUjrgpO%0Ak5BzKe1KsP2kSqapNSP64TzwpB%2Bq0IODFOJYh77IWJBnH7xgEymKY%2Bk4boFgHMFYCXUSNP1MFQCO%0AmLk1ySVEaqbS0rZTIvgmzp4n7Y/qf3D4nKLr59LixH9Oi2h3uAbiSUdoXx7znZcsmW/ShpNVaXWw%0A6ZCrKGEAoTKdOHUdvjni5z3RG2IS2lJISAfj0LdQLEhWAzMuIVujPSJyMnXYmFbmtKdzqbdpSbcZ%0AHWsF70aYEgcGP7T2MC1LToEBJsuRRDu0LiTEsalLrnUnZwjllAprHEKGhFhfbFhGRACQxiYzQZaE%0AHS6uKQLMTXV2lLdvfPsJbQoFD0AMEVYZkNMeUwZLeUO3Z1YdIEMbZxNcSIDJFryRYHTMjR/MOQsk%0AMPH0FsegeOWiVdqezGBYkpy4W2N3Z61YshnApmjNdUlmebA2gBUzrUvBJ8VIEnEyko6TcbOT0EYN%0AIvCYRYo6sCqACAOAbRBc134MbhiRYECyAgMDX4sDeVqVyqL6h6U51Z9ga2EzxFDCirv40yslbJDY%0ABrAgveJg3L6WKQCDWKtjM1JaGTIF7CA9hNfY5SZkeuBhKgYessjFUTocpoyw4QhOloRaO6ErHK8L%0AvuVkhlZMepANawkdgyDdINa3hUxJZzW5yZrtpUQc8RZyX16svFMxBQxAfstROiMvvcMuUsIGJBcD%0AiW9HWOKUsAGRSQSMnx3JgCWLERgAfOIiUyIS0SpBphKaaJbWFDFuUPAZbz/YNJxcHC8llnS7FWYV%0A68qJTQPBxGEpw6Bs4YdK0YDhw2bbuShuOX2aCAyeVJn9SGIk8dDiOOwKEsqlGZacEjnzh9lWqZ69%0AgLcWV5NVc1PdHWHdFLcZPrVAhoQUSJxibU8H60g5ciUXhs%2BSvrtLLSpSjqETa0vyhJxpNiKPFa/1%0AV1ezbpoMQCcwwbHGzYrNqhUnP9Uh9FqwOslDBR7/0ICJh%2BCckiJmWgCwUUhxDhoinR1iLWqr2pAH%0AQ9tS4TAoZC03bpZUshkXBn6/May/amfVt4ikW4J%2B0qENg2RJHmxoceaYS/EtNC1Lbsq6NkbEOHaO%0AbF8w02RlSSdZtIQfa4dpQMegKZNnkogJTzjPGDgdptgkEZDuThkR/8AJMmw/vPN0%2BGTbyqr0ajSt%0AChrJBTgAJMEiHJhcAKb4ycVfr5Lr/99YEYyJz4k%2Br5MYCeGB0PdiSQ6EtuHrZ7455oWUjUNIrjZt%0AkJ69SJVOTJxTwcahojd8Od2v3QKzVVbl5BWeF7mNzVo2I21S3JFgrIVA0j8%2BI1vAcYqVNlkUJULc%0AJl1VWCIMlhhpRjAROffiE6cwrKXhSUSH7TNUWP7JI5vkrIok8XBxQ26ue9n6LeMlxiFuUWEplJZM%0AdEpR%2B8mqzu736Q2dzq1uq%2BG0Z5fgwcnuMnU1djIQtAETtWEwRbyW3uZUJL3Rrf//YYrx2QBZN%2BUy%0AKKfV/z97b7jm5pEjWX8729/9X/DO7LOHPMVTUL4kVbYld1tC/oAikYEAMsgqO0fdPaixqDUqSDwG%0AMGOJHNuJ55DgxraKjLRiowJYtp4APJX9jOrCkWQK8YFLEfmPZULwc4TgGE5iuXfPgUQ4JUkhEUGW%0A3Y0Ob2tliRMc%2BH74QbBqzmAGZRaNGozuJg81k17q%2BOnwCJE0AXY3Y7TFEWM6hlfu4s4gh8JD0wyn%0ADgBQnHKXmlRJsHxGlYksaufnAjYPHzUurjjJBJVNHMDRlOpXxPzlkKyTWCW2XMKMMZkEfp9CUgA/%0AOJjOyfyBxvCCUzkFW%2BibhUZkqSLaumkTgQa2nKhX8C2PxhHJmJ7OwaZFakpOAWCVt%2BiCB5lGFTKt%0Ay0Ij316AN/K%2BcqxSTWY6aD6UvvlNS94jolLzjpSYJ87hEWd47247aTYlZjVVro4eic88aFoBEzWn%0AdRgIlrNlzSs7mFpwAGRc0ORjlwTzYO8FaCo/kT7NOYM6EKjyXuoo4pwe0U7B2gFI2rF2dulfqwDi%0AujuM11HfKytr5NSkBEYibxQ0pLNFi6m%2BaiWtKnpapKSjRkrfo8iAyHaPqY0lD%2BCp%2BrkHR2Vm0J/r%0AR8YRy76N4Qy2kFD062EjCfMKSnULCDL96eO0f4g0JOXkHWx%2BpnWEkOCc8%2BjlGJG7S0CCM2vXnL/y%0AaHEE1wgThaPwOmEX4QgMH2ChAxwic2DVZgszRK%2BfCWTQYcgADs/TCo92U/yXxB%2BPT66tNYC5sKyF%0AZWG8A1dinkI9CrCF4xJrOnwACzDbwZm1qhkfMp9qMO3rr2NrTSYioNH8Cb//evz4LySQbzzIrDkS%0AR8jeJ/0mVCIBjpkZVSOjpvUR2DowGXC/qQVOO0sgsyATyVsFDRyZZE2hgW81A4DhsKaCIiTh3w9v%0AQWNVYOskRTJJCTpS%2BSZxF2SLlFuiNDpmMuWuWWiG7v4%2BpZAMW9a1UFlNmP8gFNuRckUEcxII1JJh%0AcYq%2Bk1joad98Z4DmsmTGx8mH%2BfDNBCLc%2Bg0bxdLsUqwEcC%2B6hYasED7D97MA%2BVBgq4KXyqv%2BuTJ9%0AUM2o543RDAI1O7WL24M5t1WRrBZA%2BXeXtar5MaVsLQPzkXEdn531Uh%2ByVdPDMgBpnvp9ILIaDILL%0A4e1Opu3j/MmfcQANIJBtLzXBHNlXfcvBJDnljvMTt9YqC9WBbHki5onQWiW7aYIqWA5fMJPVAjjl%0ACJqTENkaAS45xLk4SodybjcXmcT5fOdWzaalClmSREoU6QsvIImCIjatpJEaJqCgzJpOnWoBzEPs%0AVGCc90ocAN%2BtOmD4XDYOW2q9qQNMpnyiSQgwKWfZ1zwxcwBWIaszxSyi1gEoFBjV9C4ONpmS7Qhf%0A4MxTBGzt00t5qixRkSmlIBlvJAB78dmXcvJmiC3yLi%2BiOBlMk4OU4m450hm24HQCqnWkICIRBNIU%0AR/9oEdkbeZ1%2B2OVbwhEc1agSeJc%2BGvJwYLIgEFNQpGheGkwLvYKRDBwbqd9P1vw3q%2Bu3yEJqkc1b%0Addg2Ur04apF0MOLBjBNI4QARBJwCVNYTlYkV6gA0QMljkuYpL0gN4AXR6aaooclSHOCX6p77xNAg%0AuMRE9R/p259VzWFmrY1gkmShwCQsm5on6SlbsVP1UfqvCpVAY1XitkZuPU35IFtOlEBsyYyfjoS8%0AZQueWwnwAVME7EhGHSt2VKE6UwSOIkXAXIkA8gECIlhNZM46ToLKU%2Bp3wJ9/8%2Bltc1yn7h/rx7/J%0Agf2ymtToSQMjUj77zLDF7skhz3YuOGwrFEMjo0hRZpO4hW%2BGmCxHfd782Lz6QUpwFpKkY%2BWBRoLg%0AKhNwGGJVAgWZEOBiKlezAaqSQxeA0YwECmPSy2G8AlhQVEGOIkkBoEUAIGtGzLZeZFgOYzQDB0C0%0ABZFriiWw5ZTIQpyjmlorzTxHdDz%2BcWuhtSlTy5oe9qDyCCbK8sXO%2BfRGtIgPjS0idLy2VnAq1%2BIA%0Ax8DqU9iafMiupx0pYZ4iwFrILAXJoMC3iEjyQ%2B7x46lXRr9yxz9U4KNw17vVqtCEdqxRAxwEtnKK%0AZQRHZGvfpj1ABAuRPXwgYwkD87Xxm0MSPktxjsCNdAAF04FJJh%2Ba5yZ3X4orQqLtx/GLP%2BQb62it%0AIldM66pSZTB%2BIUuGwJbvc0n5ClYiOSnBMUPX9OK0AJBURAVlKZx5jpSSyZEEy5MVwLH2Gp3KH%2Bd%2B%0AqAV2p4RtvZqTJNOSJ2Pr5uRo/nYFq6CIHR3bFhYaPTVvbGZbNwl8jloJpgDTRWaCxGVaSISDGiCC%0AHV%2B1gD8VcsbvCUcVJgsgTyGGsKZLZjxVlugwNiK6YD7gbYDmb3KBvWwdR/15r%2BMIZTlTGZEWfLCx%0ApFd2i7jjARQhHssuJAFWIciWaCb%2BvGxVnQY8opyFoFJu5TgVRwDiPErWpJwE2c41C%2BsuoITFwHYH%0A08t2RnQoLybLKWRF1I9GEppHKM8vjD9WZjhi3do/ljNQizhqbol%2BUnOejiiN6QDRHDUmwDX54GM9%0AWB9fY0%2BTop0XNw/Z2QXEyfciR1SqiBrLX0rEZEmCGybwsOrjz/KRU6CF2CMEHb7W5o0cTSmSt7HG%0APyXJsKwFMCqnlFDo50jsgzYzBcM2qt1d9SM4sBE%2BWatecSR4Kr%2BrCe43%2BPj3E3BJW7id4knZlyFd%0AfUubZyqIrzrXjEMqQkTcDEzHM2OMfNX5fTKfj09dxhQ/Nr98YD/jI/rjBHnmVcDcqsDTSh03CWbZ%0AC84ElSgIjcyd/hnk0N0facvZ8k0iQyxDDR1d/tgY%2BxXJkS0sKdb0Uf35p/zmDMw8w7B1KSWNjNvH%0A4ed/H5XBmgoModmmjvhzmsf8yDY8oI%2BmpATHMDYDwAyyAqoA5G3EPABjVRLkl0wKhakmVpDZqKoF%0AmNMUPHJ%2BxcG0LsqkxBYAF5yWTpqfIyFYeadmUOvIvmzh0Jcjl7N5WuQIDLlM4Jq0xREtV4dox6Ov%0AmhUyWNgS%2BHIAXJ/ozylMCZx6ZWJGAfrWqQkNviVFlY30PQBbk0dswoMwy1OjF/lb47HMyC9S4qhe%0Axy4yuTXrmiGJqgqexgGQv0bELeHIiWyRyKya5RImuYwlkFt5Pjm1g9YMYMjRvCZbCGA/0D5xmJNg%0A3xkboCTApSDlqBFdHjWA%2BkTH4zRBAFvzRDkAl0eP3Td/WgiBEtUA3ouvKMAkNQymDrOBWZxCbsGB%0AwCKjAkARo0kFi/DBxgnCN8XxFa2wazzcun0cMuPcSz9CggKyARls0SwCmJ8ogNMFTRahffQY/4rJ%0AqRM2HsAJJeuG0d8GRK2zY/rw5yTguaI1nvrkAUTz0ag1D2Ak8JUAmVNLVJPmjYozyffBLTcCX2vJ%0AJAVwK83IMADHs4V5BEkW5RCfitQCBQRTM2/tnF8RG3llmXC8BVulUCMDh0XGwhkVKUKz1qYOU2sV%0A5tZCSqzyiCq2HMlH0y/MjP5weURkNQPgrnf7/giKHJG0iy2Is5btHM9JHCP9CgHXZXfJnLoFJEsG%0A2fIcOQDRZa1NiZCP2NHM%2BzEpS97FFmByRscm0yojIHJErUAa47kFeCQ5EQBHRPPOMH8uuAuLz47o%0AqWQvPj9fsL8ZaloXyTYy1g6grJmiXeZgr47MK%2BKQt4mffQRwINfOrZnaOR53ARjNeJepEG4AgYJh%0AQOKKGCOgc2TkR/gNwe3xqS9eXkx0zQ9YbOSjAmAftPJgRchDSEGXJUcAwCFaNWNJyUbKWX1F5JAR%0AOEM/JP1c2eJeeqttxfQHKR1nVpNox6oEkonHzPBbHEGYyyMygJlPvJEE9bqWVA4nrD59%2BzgO4LTQ%0AAgeuEbKqEUmybSTAMVhMycZaBNThlAwLEaK1s6/YPPPzOd7pt7/oYPl73AHIQ4DvMmmUXJSgpk3J%0AsIX8UXz/Q0LRIziUGK19FSsU2GJG8m0BR3eP4KDP4mrGgEeKQGZNBchsp13TK47QIVpuIdGVUQKU%0Ar2OgT/LNsuo21ljw272qhdARmEZGAIsj4sFh63L%2Bx%2B5jbG7K3dWkli33yg01KalpgCOXp3HoQt5J%0AIgtiBiIcJW6jAa7r6C4BQYCRSaqCbB7gHf349OQpc0qJU%2BsIwHISI%2BIuj4hU2ZQuJQUJNht5dQJT%0AXB2jBOIUAXcjLui94AeYjQ%2BXv%2BX2VLIKSh3lujS9muSj9TxCzTXnf%2BT%2BPwS9Re0YjPIIB4BMxugR%0AWL7gSvDURpaYIbI0REy0XHPY2ott1wfXwvKOBAgCvE6yE3QkIHZKO7D63S5AviNoFJoByCEJUHBG%0AT9PxCtaSFBDJywE4UqeCtpBlBtwSHQwFxyvDNqPALgc2qjCxg5ExSaRKQY9m9zvrmwDTiwBgghnA%0AX2jxUgg4hlEaGACBBUBHrKy4WIkZyUQFSUJ43P7TEL8wHqVgXwvDckzKRDN9MzPKbDyZbBWEmbLM%0A%2BAKl5EgWq2BrIkdmYnLH%2BVOgGrGSnLGQ2OKIhYKy5N0Sj%2B4KTnFFpHna2B3JN08X8imQPBYE1Sxn%0ABgjywfxrMN8oFpdlC0cCVS2OXGVmi5ICj5rHpsaSAsdoGJIzM/OJMBuLRoGOagFA6tjWEVnn7EYA%0Akq4KZ/kUDCs4ZcEPmQ97JU%2Bm%2BFX%2ByvxVM59/89kNMwXg8jM%2BIh/e4/z2TWWxxXeA8Z77%2BIr0odIF%0AGpGMHQMdSWgbDSZNk7KdNHrxk%2BP3SRqY5Ky10KiOfKNMNF1s408a2CNizIBJoutD6/EHSeDj8FO/%0AgY9GDUBJOABZnCz3RV/bZ3z0v/1JiRyT1pp3MAmIm2T78Svn8YdD1rrulhcpDwOUtep6JMFTIttG%0AAnAXmmdONJlzC9aWyE2rZrEqMiXpNVf6k/OUXFLmFBeTDzgh20BH6jBDHyXfardkPJV8lHMUQbty%0ATD69JFRe3jGIlpjXB6uIbO1OdJl57G5/TmU1zXgkU1nwUQ7TJKAjk0XAXLRwmVSfO7JVCvyg3P6s%0AFn05lkh2MOPMgyML2nZ0zacpiCmAfyzyra5PBlr5eVny0QDHJz5vnSHpqDmVj0ZTGdySNrdk2KqM%0AoJqCsKfSqhUwW%2BPBT%2Boqy%2Bm8FEz5/k7i6Pi2c8pCR0Cc5RNHmADC3IK7xTHkQbsqO2o3Yntdis8I%0Ap44AXCrDli5EW89Rw5zaxcnB%2BNM/Hx2yyZUy%2BTTGnCARgHl0XI0aeJzc/nSwGUmmMFuAFX/aAgXy%0AOqMaOhlFhvuicGs5vqX1pVY8FTqtcALn8StXbLaYdjQqeGCY5OWLZwmYZLIeSaYphU8/x0OhiwA4%0AMioSMwc8LR9wDJpikXGWeEqGI2LLfCICWszuYLcCIuVyGnUeSUaKU5f8ukgwQpBJrBAgniAaF1RQ%0AcQtlHrfjyGXJjLOvOpzyYcFnK3YGFUiylfkqfjR7/AHtAT%2BtKMkVOHXsGcm3hWCvORh37EsFE773%0AeqqW1ASUsK5ewblerSsI4NhoRsXLANJhNk8BEjgSA8iwBJUIzFtLbGbGbvL6SrYQ8UMqwVuzx6IW%0AmL4YpucHcHskH0q/y5/fPD7xQge5PfjN8sOWdnw2fKgUmiSyoM0PdVpbOwGFntq60xTUMU9E3O9Q%0AkSR40hQ0c9WZfE4dwGhJyldZh/SCdqnco2uUZmzIwGxREnJ4gqRsyhZws/u%2B%2BG3ygB9/ckq5nMkE%0AuxKU5jDz%2Bk9/Sqm19RHdeqoysgeY2%2BNqFDL37H5gTp3TQqSmwhVLIM6RHOC4AluXpxWiWeZB%2Bfyz%0AI/nHADM5jY0mATmAF/eCEPznBHlOncGqqQlGFkIuwZnYkkNhqklwNnCTiNmacQyjGaPliaRDxjkr%0AZ8vVVFAc7EoQICafsprFgASYlNhOMGdIRMJHv3vJrdPjB8fTgyN5HkV4mlSwFg6WCKfgFKKZLwYq%0ADHCvqcD2utB3cTSlSNZxAjkzI44PkFPmIMxaONEAFLoFsGDyBRAQJVRuvvK6kGFxHQF58PEvDR4V%0A4cySXDoIbGcXaXEETiWtyd0WZwlJZYnwKwFwd69PpBexQk5nFSK3yvELtl4UwiwK0rEQZcFxWov4%0AAZguMoDy9QXMJNjMJICPmd3Kud3n25XCbPpmjKo1sC3AeRpmHkF2mQRDDk8mOAVng%2BlyKv852D8N%0AH4cf3yLLp8jEKVMlBkQwScx8OUxLBppHjhFnKsCHdiyTRJgsNb8bn3ZsEtWc4ZjHI6JjTFB3AKe3%0Aae6XRRZay7xHYU7nvdwSIRTjkITM1pXIQfbUm/aVICnfex2/ZDh1cmNVsx2Y5aUECOqVHRUxSjBS%0AwgK7JIMpJ7INfDDGHT2tke1mTK0WXpCSuepCMk0Jc6vazMBR0OhRc07AEdv0p8jEEsiwKgczv/NE%0AoKMcokn5kqu1qbWU9CMsJnpEFasqkmBNM3paBMghgltUgdU5gNsi4Ddc3zw%2BuT9O6aPGmdG%2BIh8A%0An5OEkgC/E0YIAv7VmSO2mtvHA2BxJDhO3do9HIeSiVUw9gVyiz7M%2BFNqVokPZgQ0XdFgqjwFyczF%0A9ecW/LSqLgAHEKR8bMsLlAUD6Oibc748zXMk36nmbGBuB202Arcet//mT04RJFJoLdExbOTWzI1x%0AXx4VFWFbr6cZT2k/aTLjpznB5M/8xMzF1pgtZVRgO9tBZgtZHWvFr2KTaCLbCdJX6hCHaccaubUX%0A5Mrrov7cTrJ4xphKuaWLrQEuTgGcEi13m1Q6E3SqSFE1T%2BEL5mmFnSqrdUS2xpjNU0myAE6LAtv5%0AuROpUmGWg90WA4iIAdeleBGm4jABr/h9CeXEnI0aAMDKkCtAjSTx2s4x0LeFkaSaRcpJas71lMyx%0AKDRzBeRJ0sjoVvJtiPti%2B4DffFjSKkHh1ZLD6UEub2Gn5QMSuLgi5pkKUHTIPiyO5qp7zsMHs2Yh%0AW6p0mDxVxKkjeSYlw2lIMiy3Rvni1OYWrMJxGkfCPBUfeZNzvLBgRshsj0WyYQLeyEt1NXsV0YFP%0ALCMwU5e75WfgFFmiBwG25g9NGrE4ero8JVKFFIAoLgpmnkzLWreqHUcmiQ1QBhAZ/RZ3mVg%2BmbrM%0AqvA8hTy7THwcUdUYgTQlH7FT%2BB1NnbB95xY%2BiwyxduqQdHkkLY5HCU4OR9KKgNwWzEJqcViOYPYC%0Au%2BV545dK2WaLICBCc4nl13GWIzLLu9S8QgMDqCVKi3wIztM4gEmjKRlbiyWEK6SqQsBBUMQYzVoi%0AGWf2yJiCgOhSBGw5ZPnGycFbxY0Q6gJo3erv66PB/Q9KKCddo07tSyRTYUmBZBSqElgVmWT4NwGf%0Aj88uD8BHrdGmGTPRz4PYksYHWcbPQykNVdl8pyUPJoJWzWhylky1MCXiRARFgDjm7FKS66QJmBzK%0AuWnxJjdWJsgZJzc4dcR2CV8JR2aKKH68PI8nKBxbNLMTkgfMq4kle31/OM3M2EhzGJJuia5oE9il%0ADExx%2BdnoiiGTrOqqU0amW/hVVQu4LvmQuXs4AJ8jtgKiR1%2BM1LYoAVsIUKrTjiRwyiLJR8ZgbQHq%0AzEI/u5mxNqmAOp7a0SjBSMYuVQGOpBkJ12iXvnWpHb2kWe4RmYPTqXliagJFivDLiztyHn5YkgKI%0AYYqJfg3KO8A1HrJs0bdjakiRTNPBlKp8gldNyR8L5bk4ZYsUQP2A%2BiaJtYtgLXOiAIGtOuZJAliH%0AglIlJyERwXFkCS2iNWGzBeDINN7muE8iECuoWqclzc/tgQ%2BRWgP8whBNBtxOHTJszRcrBziwAOab%0ApspK8DOdjaxVTVxraXUPkJcjYUZ1UptHlDiDyUNhbsVHZDuXIjY6vqgdAexIpJbtVHiKdZijafXE%0AiOg58Uqr3WzdkH3zzRDJxHQ84lwOaQZ8gMl8heslgFamEpRJXq/DHfXW1nAoaQyl5jZBmRJM2nRm%0AyguKCB6LIzJOKJZMcm6jBaxymDmSeWhHkoxrtjvKbfog3v6UYB7cun7cyco5tmpyRJ7l16xGJmfk%0ACM51ocCRH5xqVxEySJmfc5Z0QqWMHVl1TDJPxTPazhIGpiMZAdEhPZU5O1Z1CDqGTPE1WqImmF6q%0ATTx1UJuCYmNSJQFzaeOcoZIGsG9jkFcBoA8ySVYimSgoDxALfrf4L82dFk8LOgWw9E7gD8Y9/XlU%0ALUz%2Bfc4tx34SbAXEfloAkCPAgW9UXJEZIU9Nj0iywALxrAore8SDf2yphX8oMLaLI8AhyPb6/EtB%0AwdnFcgngjibudAIIbJ3EjkTBHM8S5zRf9CMgyqk1wEV%2BAmlPY7cQONtMKkX06KkIvSqUT6ZCS8zM%0AcrtcIxySBz/9%2BDrDFlCL%2BmaOR5UrblJsiYTygdoJygdSPph%2BWJ0yTwRqaeqReMZXF4ejwhVUEpBD%0APFZNy5O5Vtmo7xtb3bZq8slI7mg6D5PT2YutSauMihvJ2HcSUDA5Iz8ycFBzwXnA259uG4aMZGLz%0AAOwyZc3IUZAMOikoLoGjp9OmnFpVaiKopiCMmgQV7FKvo12nlhD5v9yTBNi3vF3cVgVovJmcWEI0%0AgFUHp47TSe8i85VLnl4Hm/piWkO75sk0XqdmbOqvVjJszR%2B4pFJGySoUnbNIoR0F6ZTH9rBVV47t%0AytuLbaAjAfzDh0nwiEwcsC0a1UkilI9WCYAxiC6ZFHIvMZHt4/z2p9spRVKR643MGG//CLz/d0%2BM%0AkQF2UXmW1HcOI4Z8XVdaGUBqT8FkiqFdk0%2BPnMQjcFVHo3k1aZHtFT%2BFCa7zyJ8c8cwfVR6ZFDPD%0A3EYQIOhpyvEb3ozbkteplJKAZlVTv3YlEwSED3HJxFaEWXIXePLp9LlY1XaCQyf9OgrMQ2br73wy%0AbJEySb5aANvZxW3JtgCWMwAotAqssuLEfiOB3UoofxMaP7Bgx3Aqq2akEAWihPiKOAaxH2ryLBTg%0AV2VtUQ6xzAR2n5krTqEBACYlK8IAqQHsSLQqEfPXLr9b5vNvPufNtcmMThG1Wx9xttPpLEm2RL4c%0AfQxkwhyJEQT4dTFDVJPoALWuyhIFPZVc4VOQ2hUgxQzm7aJC4hKOK3BKhjh/BsxYSGSRaZmZkUZz%0AO7FHXJaktgAazLyckjZinlatAYpTyJr5MHlbCG68x8cRltAktVa8Lmwnji%2BQrHhHtmDr96H8bCFu%0AKreToPKMjOGHG1nlyRHrA9jJ60U7kooQZ/dEIIOPODtaRfR2HQFIukymA3CkI9qUEoFVKZgkzhav%0AcGSvzBZwtSuaALXAVZkjCUg1VRlO%2BXJ6o0MEsmqx2XOEAABAAElEQVQpuO2m5ieNjNPOpF9%2BWtio%0ArU1rnawZaIqgCRAb/dBtRGSq%2B/k3HEc1IojI0c7hZ63DK2WeKG0qmCE6DBHMslfArTpqEpnWJQ3Z%0AaICbyuPbHoBjuVKUW3Ln3gKnZJQVT0ItFElKTkyAd0x2HtmlIwBkVp8RGGUzfspgaLPLxEqRmZry%0AiUiJIYg78lQpWxBZNuUUTGzdD7/JeGRrZ5ZTJMkpfgqMVFkCsMVU6EMheSzKU7DWRgzszPUVzPFs%0AZDRPRN%2BYbB1hmry1vN9ixgpnC/HR4l798a22Vy0EJOW0bdSAykQyLO/rla8Xr0t8q4q002QAHOIx%0A0rGdghwpS5zALbHacMAjtt7XMdwSWynEB3gK4Bbg7hLwFiqnkGblaZKZ%2BGB6ek1e83SU5mxuwdU6%0AMFtBTeeofedJSgiwndhTopO0LWOekghX8FRwKlCisQDXbDTLObUQ0Gch7qi8gG9svxCSbWCq5opA%0ACfm2AMcgqVrb2e76MwJfgmpEFhkjfHWILvKA%2BobLz3IxZIAlHyqPP7yF0Zw0C/Nn/lBzxIIGH9Bl%0A2ZJ08jvlI5i3JPG2E4Dt2PWPASCwFEF2jm0XjuRMHTMVBtT5reLzx6cWZFMgEzGXpLGkND4Dyjni%0AK0KG/9s5mKWmAA5Vflrq3CmfX2LIqhErjCMgcopOzMiWKCKW06gBFWpxKNiIZB3VfKM2CdD8OQE0%0Ap72kHWRpMGnXV5kkNC8LFlQY4IheLP6/DhARMXZTmKy2B0CWU%2BOdePO/puAWhcdsZDoNPE1ymnjY%0ADL1sJzDpkJMZPgDbllUOQFSQOFtPMvgoaaS%2BqF2ZI%2BcEJAJwayHbOGacgS7ouPxvg5gnVqiOyvBv%0An%2BhjsTUPH5FKwCp4WkwqZpn01SQG4CAI4SBfMxKIx0LKe5lvnnuTz6CgnKsD5BWpnAwY38oAamQS%0AddzyR0DbPvvdUbWoeQSN%2BxLVt68RcTi6AbbWjvUFVJj4tSkcFmQ/LJhwDikIKnCUFMAW8u8ynx9Q%0ATPNT8Irl1KVe3N1vI7MhSIRjudOStKq8p2xZ6MzZ2E4FOUVOK3GA4lMOyiwmpCMEsOJUkXTdKbeg%0A%2BNSxinwcaWaQAshxKluQOfKHgmok5zLJSJ3WC0GTM8KsdaAxUK4c7KUc2KZ8ZJJJuhBJx0YfBl3%2B%0AmGOoTKHtZlMwyhKIcJpEUDvBjBKKANbRotbO74%2B28eNK9z%2BQVVkRdaZUMwNYXNffAK9%2BD3gXNOUX%0AKaShvQDXizeAMzT/MV40lGWWOYAKJAHGugPIEFmcKjXLrS0m0nUA80YwU7Oqkrbqt23%2BoztbpCAf%0AeTMeKUVEDRp%2Bgr1LR4JDBL5zSnYY8FQoeQC3xBqBnWECadc8VST96J3NyIRqliTTUk1CX5unzEo4%0ABVtI0/ICPrXmF8hM03LiVPAHh2SAYVhoIqKOCugfaw4gx%2Bil5imFHClIVLwS%2BGAGMO%2BWDNuiZJWN%0AqjUqIH0ILEsQcWwB0SXHciLLcgsfrI9/OnRU08Thd1qScpoaAfxKKQOAVhXb2RopByByNJfiRk5/%0A2/Xu8Zkp85PARD4DjjCayFG2gs0Iwn2iZPxI/JCILfPGCgVEliJExMPk6w7giBUAQyjezu5rlngX%0AaXWvqkYeRZg6fjWPpirUCA4lk6PCQYtvX7aC5gG4KAcoYrSWRq3UoqnGtiPIfATdS4LbquYYNIXP%0A0ccc385QSYDasMCxi%2BnUOiBfhQZOTQW2AXA07sVvQKJ36Y6VCw5xy9VE1knmVxRsnuhSB1zVgd3O%0AMRDpt7MtlCqqSWQeP02B00KjCtw/Y2A6mCXSiILUnMQo06hXkAHOQJ4WRMnpVCuYZDNdB%2BCp%2BaPd%0AFJQWv6bkVSNyUy5Ilb6BW3EoZHkLLsI/JFi6RyTfgmZTMhwhBdM5wfad3eulPlunnVFNoqteApJ2%0ApMTyGeso56Fxu4uF3VECkbzd05dpVLCqQKcqsG1OfVCTU8ZThMhyW7k0tgAU5BDJlJSTYJxokole%0As60EI0cMZq1Mfev0/iF/fNDeJR2AtDIS1GQwlpriI9q01jJTmL3qovLk1BqAvkfciOVFnMHTOlYF%0AP%2BwpVS7yqrH1p2PObxUEez2NlhNVdjwHQzM1pOZgDlwmQB5sVUmAkwjo1djlrepSAGjeyGSTKGuh%0Awx9q6XMLvxhdPP7sW7mnRkq8i4OJOXIwtmBHap74ZNSfEb6NTLqNUIlATbvQ0UbqK0L5VJgYgiJ3%0AysdHn4cpz2lNVmh5s6lTxJkwQB0iebrwkQnIuBwYzbaAOtoFnQkcoBL4DUMLsArFMpYofsQUAB5d%0AQSUosyDYrtrZ3eS0wnJrwQAitMl5iivkFPdc9FIKhTRl1lpxYgowEfGfjwGkVCPKJDqJvfoxATz6%0Af/7fzhJ3vKZSky0EIls1G4%2BtHAglm9lM4uqkqSCxpQiaFM4hwSbJS0bE5bbCaGQ6EiMCYDmVp2Ay%0AVLXqi1EkbQ2QaRWR7uG76qfyLLEqwm8L3j0%2B/TyIfgYBPzAdLAlw4f4D3n6G/Tzwl/yMHhnnB2Y5%0ATESKFnIEn2HUlAmtz/WYkyMy1LIciS1kf0QB6ngKvhM/yGFA4wHMp2bHInkIRoEdjVUJpHGErMN0%0ALxsd29k6hQnsMn%2BPTGcsh%2BPiiEWLukDwpmZStpBohvJ8KMkR%2BbmdOKlApwCXrWckD985iR9z3/%2Bw%0AnWrQyDFzBMj%2Bs9A5/bibuVr4E9tCTSKylNzcuf9CCaiTmsPLn9iMauanIL2UReeQgmYV0Rs5GDE1%0Aq9giwu1kkjxKLLeqiH5GBZrH7uo3CTTLzRBdJAXzChNzWl9A7QSeEq8lynrEHeHrf0D3TFZei/6Z%0Ayr3mj4N9G5tTaom2U615OHLNXuLHycdvA8uVbQZ7Ecmw5ByC6QAkJGWVsapOzbCFwPxvesWEDHYS%0AZa2i3It3NbtAtsTtNSKCgpoJskXHQhWuhWTmGNbOaInWSeaUOfmqo6ksGQgkWX7EXseq1CgnQ0mn%0A8JmQqHK3vgt/iDuAMakUBOXVcR6ObgONT4QMRw7QGBDsS60/vwBOk1Lc2hrdhnv8RuIIBWNqaarD%0AKYtTfxz6oTBfhOxS3JJ7q495suhB/PiTwWamEsDMNz/KYPuWtIrYdQDeCMDyCEFlLTyk3CbOtisj%0AxdYIYKmAMtgIgMCyHY3kAFzk543EtpNQxkIjybmt9UweWB00HUxAVAoFlqMSwZbf0x8YJnwz3shL%0AqcARSw5xLqTYznkSsSNbmxKhoWOMRkajbMFpWzO1swuFAqLYAYjwWZRHAJjslC3YFoDrslblekEj%0Af0S2qtmCiCyr7pR7ZGGayXpqCViavh2RkhY0FnwzMhFRYf66gzaHAVNiRoXbuOMrjZTl5h3v1uz%2B%0A%2B5BCCP1CaMLGUFy%2B48FxqgQ5VZZoa6r%2B%2B7//WxEy8ufYyja2ClNHKWVTcAxrGQMwB1atksab3R1J%0AHZlU4Y8ZoltoVpkhaa/Z8doasprXqL4TJgVgmZTw28aXj0/c8ZOY3vHR4r5m4SCg07ZUmST2Vchf%0ANf1iderWo5iUq088qthSIhOaX4j5s%2BSn22dsOVsXfMgkzTunOE27u70TP8IkwHlIfvxpVbUAluPB%0AABDJyAbYlOhpjejiv5TMDMmb3GMp9djd/lTE29V00mxHxgWnjwDxMKcw2SYOJhlBnWMeySZnTIQk%0AIm3jk2d1U7qIJVDiXeaN1DFChgl2eSk/X2QVUbCt/Fn1qP4cjxL4DjMvrpSnRmgtNME2nVGCtaoZ%0AyR8iKijSVFxKnA7lZPySgBMh%2BdQuyxGHSXQ7vVKBo6nGlgVZ4FTNIHi6hR85BZuqRpTQ5KlZm6xG%0AGR3YCc1Q7lLNXnz6MP//%2B8oNOoLtTkn6FSo7j1Q%2B2rmlSqax%2BwJYdGmZqR38BNWfOtIoaaoaUdWy%0AUA6NuJdXtqkdZ19ljYk3IeUqKyuhFk9rS0pDSjBjnDegYZzWKD9lZjsmhADT%2Bb071786AAEmOsbr%0AbLYrH1l9Y4OhVlOxR9BkNg8jsdzKbAbyXMeOViFCBkwSXNJCo3k5flLqgK//imkvZ6Mcpuboj5ik%0Aq46Ik2m2Y8K20FiKT2BTaeHE5ROZx1WmElo7gBd0EnGcOiqVoGoom/m427j4o%2B0HAR0yRoB9ccbJ%0AydfXMeCYIdKCaOY62JwQ5tyGqXVg49zCcQb7GpsKZlcLkGQhRaRcBU6bDeApaiwJd%2BJHL7FxDlaL%0AvjlmbAcftaNRo/oPJvs6SV1qoY4ck3Ea/j7yZ1C/UwCFHJdBYerTYq6Ojnb2TUTBz65Dn0LIaAKM%0AZkjCJ2OtY2RgAAKY6KovSdv1JXRCR1LNSKGtBSoQYaqA86mZ6V4Ap7U7NNr5T0kAiwzL0%2B6luI1I%0AekGkzCtOkkJfngzAklZVY6Pg8sg4J0yw5BRBxwlvgz7%2BaY4gHPjed05oL7uDEy9DEkwJ0VOkrPKI%0AfL0EbaXZumkncHIF03FstnWJ9ruBJ49PTMEFTMwdgfZpEBkI4I4EFsK8fg8stIroV0QaW5ecIpqz%0AqpIH/WMAvw3%2B/PQjND9j%2BOiQAczBSNLCaeWY6S4A80QXBIAEayl3lYTjMsOpEz6In7%2B5lHrQb3%2BS%0AIVrofeubPgCpp1sbEfWhjgBlifkwlSH0WdQ3rwKVoMOaM4BLCiRcacfwELz17KuCN/U63ohIOZkp%0AIhmRFBSsnHyCzmw5cQKxBKdKcyqTZEUQpA84WrD1lKgOUaBOpwEViPcBP0I6VFHOr3gP3FpLZtoF%0AZiWCQpPLvA/y8Xa1HQQXWxdMQeMB4BRnHgzZ%2BFH/%2BMMx2CkYU6lELHfLkUY15xU4rXzFvTVflZaZ%0ABqDEoapiqw6RZNHkbGomjgpTxxm8o5GMBGuJXqptmqlZMgstaRJKINvL281IniVhapZkMPKUzBlk%0A8r2CZjsyEKoCTOypMZ2ZBD9dDt/R1BR3BDOvAOStvc1x/yJ1az5rsZ9yzsufN0XE8mnmHInTODLt%0AZUw5WmRbNxLAcglEurRMUtK9Erw2IlOhYxfJg4uA5qHKYTCHf8vMIpNexKmIgRQg9O%2BRJuGgOde9%0A7iPAaZWfZP2xr3n4MJvfS5GcmUPTQkVmJJ9%2BtxZ0X/nOFp/T%2BnJEft7aYZonshnnT9DZjEp15HYS%0AjuE5kux9G8kWFtLd32ndCNCtLSemUC2cBjYprY4CZ0iwdvOb49jwj4GTddRj/vQ9JarTVgBNHadV%0AZEpx6roSrFXZK%2BQSW/DR1JGKD%2BHbd2%2Bu8gAU4B%2BTkydpCQS3dtTAIsDBjDABRo5QALNQc9S5LekR%0AhQ5jR5iWz8nLqJOyCnRk%2BXXy8yUiS5JIOzsSyVPimlIcubUphfzguGx9dHRmdRSXUFTNOBUgsyh3%0A3eYeTiKogmPMQntRBVAEJgSGJPkY9vYndyQvhwj/o9n9jzoG1FR2ji1GwZGMjmHtMbm91DE2wy8P%0Anjw%2B552xw88AEwEY56kfMFhb/STc6j4EOW7T9MOIA3hKU2pWWXLlOyGD8e1x%2BRk7toNRhRSRI3XU%0At5ZvXsny3ssBKp80jhSfjahSwUKxBKeas0nm%2BpEFTkXV4Ywj1dTtjE3ytBdM5ic2T9cxSbvZUXzP%0AfeQ7beDZHdz8OsbW5EHzCiWtoiR9QFJO6yfLvz9xNTBJgDpeCj4Zb2R39Ukm6zzkLSweAEIjJfge%0AwJ9NbZ2sWznqNJJVtpvRGYiITJ1EUOBqfHW7oOWQybBwaf7r5l3m9iuYjoo7iQOQYcG5/izYXQLR%0AARqjrd0lRBZwlEigIwunD4qUd04dm5H83DYALVg64NfGeHfl8x%2BrlNcIHUqIiDSJ4OjCtjXJShmR%0AAswIkwyFljh2OoKpBmapBrBwXrYSG3lfL0h0S2RBaE1NMKfowFefKJM8X4OGhOlKJ/A4uf3ZSIF5%0AOnHtTLpFk63Kgnmq5lRuBqb1ynzKOWBGDlWKK1ghgDt2zesYkynWTyOZOWdk53ESMMu%2BXcdbJNgA%0A1/GohWac5ZbcRh9vTrHiXfnW/vKz0GwAbxG/Ued1UuZUflO1RYHTurtVTQ5jVCVmy5pV1%2BvUGiCT%0AaKFxypJh2/KafSvK11RBaI2tuMxae8rWjEDskVVzsDITTMLT4R0M2tGRbbVdyt/t3o6B%2BygV6VI1%0A8hc7Y6t/xLaWIwiwF9Hfn0bNkaZ4tQAzztM/Spyf00mIKSB6SvT6xFeGzyN/U/mh2Cjl5hc4uVcz%0A3gZ6LGv7WBVMFgARTnPahSSAPKsSMHlNmB/TnMcBrFX5rnErZJGHoKYZkza1NgUJko1MMrfguRQh%0AOs/8cKdREFD24mIiTRVvKpSlkeezcIFZNuWUQlczuz1E4lfb2DKpQoHFnMUpZWHlszU0RThlofAY%0A9vYnmdlLzaNdHe3u6bxCCgDybiPI12EVbjd5/AM62m8FXj4%2BMQsjivilp2RY01kzRr3jdH6cFnYE%0AsNwYMwJS4uJTPsla%2B6H2g9RnLEFm%2BkchA7DqleYcYw4wmX577t%2Bij3/P6xSggpxGYgs2KceOFbKV%0A42C09kiahUYzM5J3zXZk4DQPgNOjHRzazWu2bQwzFSo4u8%2BjOfZkOgxVTWWVrWvK1pmhsfhkmdnP%0A16uZh2PhFKkdnIaX4LTkJ3Bb0r5T0BZvImRO7WtETUFjmop0Tbs8jU4454yGiPfq9yZb%2B8Kn47RL%0AjGnkVZCcWo3gKDuPmh9a%2Bawg48U9kpPgFaQG/xCcCmJijSZgSLcBt2oiSxe/JMT5nWHrSDCpdQCi%0At07E7mznANdeEiQTU7MF8bjsIWg7Y40ESqXcKeTG6JQurq4cID/HULaIFIR0AByxVKuRY3t0REuI%0AcmYsCbiuyRTLQR9gl1k1%2BZPZBZ15XtyMZMunOKf%2By0fXTDYaHJIOQ2QbFnhqoVgOYwCMMCVUItMt%0AHAZgJTJ1ZkcJXKRF1RWbTI0uTkKj%2BTuBLUt9yXO8ZtCiukzm%2B9komTOA4wtma05r8eZSciAzqnFK%0AeVNvQZ7lHY1mPLXckdSEI1DE2jkJp26P6ORzJFuUARyrGeo1M5IdZg5gHmaXOn6tMTOn0KitY8re%0ASFljjSy5VumY7frmsDVvL/WVmr382uSq4rPEaSsJNFWjYoKLDOCap4v/EOwUtTk8BOcn6fy1A9gx%0AE9RX6to3soWVT74Ypu38mPqwHIxCgOV0hMxgiQM4IpOURyRblrv1NGcAzVPSjL3Up9YJacRqQrcc%0AXZsicujM1hz5QRwfx9SZYzOAR0XHu848x0bhupSqMICyR0QBGa/QqE1r3mHkE49emFNGzhzeOe1O%0APjA1Kdfhq1QTpvnLg/PxiQWamGUALCOJX2BNn86aMULwyJJJU5BMHE/jeCTtiJM5MTT6%2BoXwQ/UX%0Ajdh87dJsYAh85%2BbXTsEIgFlea6WkIQIwWu7p5EjwC2eMj6Y61sb0p8KOU2q2s5BYreVw6gJmyUEN%0ArNqhCV8fuqOgZKDyo68zECmME4Dccp62ldTC1uTl5JsfrjERaBTWyCpOWYeHqHVad2gHluMtio50%0A3R75pAAqp%2B%2BE8ZMyf40oOIlSYqIKXJmFM2wBqnFKOxdH2UWGrYJpAsK2uEt%2BSpE8liVN7iS1nmrX%0AwiPDVrXvxro8Bd7dGYh16TuTDw9jPv%2BxKr9bqz/vCDZ5RPPXyb1UM0yQbF2mZo2umkfhUWWLrtat%0A%2Bw4I5iRgNTky7/aQotH8XsE5RGZtQx7A7RFRJuNFBEYEAUUBmWNR2BGA5UWOK3c7G0Hjt4FkmUTs%0A6o7J3hTfLubxXNB4Ju1bC5NdVnLMvntTRFl1ZBIjKHWNXqR8jZqkHwSAK3GqxLYGz6qp6SRPZ4NG%0AeWS3CdZLcbcOeVRNhSuuRIVjkrbO7zXBADP1BeAYyQQBJKUdZjZGecFRqwIigk6zIoJj0GuCybdj%0AXdjG/PjwHr/e50epgswiXeA0ucM0ko0oLFMjrVC/f%2BaafNqIQk75KWPR7ujYPE8BguSVdSSjIjOW%0AJ2mje8Nv/kuGXvlqlMMTncGmXby%2Bs53YI8c7Ikdw5iKDvjNc/%2BZzzoAU5EOQWibnUkdTZ77GyuUT%0AGSZ8BfAToZFzAp5%2BxJLheMHUagowCQGRwweOZNYRgJqyHUUTKHhESyzPQ4DKSs0SM1YVAZpD7Mvj%0AzNbGtNGM16a1ppbCFCYwD1NlRTCK1fDpwPmt1vn49PKaBcbHrMEsMmwB%2BWsmjuWexgGYL86jiSMc%0AQM4R5dh6fqh9tH660viGwQTLJ3IK0%2B8iynWMIN98rdlGnsxwOoLyADs6qvnEo3nKVNfZJiccQCqs%0ACJGMESCh4ed4/vhpBfku%2BxRYqJrRvuUFTxs14QTwJfdZVCvN6/jjeny4EI4ZyMTvN7iCB1kmcS7V%0AvEKDUa5C8Z74JlSS2vQ/WWtUVq3CK0DKQjUl1NVPjW0fnLSuD7ja1QBTWWb%2BNwmC3sJJyjcDgKRR%0AjjMccfYSFwEsFcSzV/oThBuYjEkUbJ0JfW3MTHHKI6eQTlN5ZP4pzbFt3QA2Uj8C4KpzzUx%2B2NZF%0A8%2BoTvd0RzR%2BRQjLoEHGAkqsUpk1vD4KC6oA99RbggPlrlEA8AEzViIFruZlJuNM/vqg5YFKavcD8%0AQojsHb3m7FLhARzPpPioisAM0IzyG4DtpB0mz1MLi/VSiq3gVZRveZ7428CfCJN2bLw5G4Tr10D%2B%0AvJqZ5gmg2QzJQp61EiwxOsnEZPqM0oSA1KtlC%2BJ1UUKti9MH/MzwDSHvGDPCaJLys1xlR5r5MFWT%0AI5NIu6Mq/YAikuH3Oc6PEg4ESuqoLHwMPDyMZgtLTFplL/Vth45LgoViWz/OP742syM0OQHI4QAc%0AZ1DcqA44IO7xABCT9yKIZ5Fvqrb2paNLvoXEY82OHsmvyiQ0BwCwOEXcGeh%2BvD/Js%2BoOmJoWIsLA%0ADaOg0cIZK48PIDm3E8tXwWH6fAFmPFUETDmRo3RqKiDPzMabBfclebZTtniIJAWwFhmAW2KFDnOM%0AGm32tYrY4lTZPrIy9kIcsr1oMcHsaD5ZQH3VmVEaJQrq83S7jlPwl8fPH59dG7/AWNYHQyaXpckx%0Amsn3QIIHge1Uk3%2BQ5cSUH5O%2BLL8WxvmhcqQagO8c%2BMZ%2B8BHxi3ioRbOWKIEYmBy/UmaM0mampoLb%0AEI/ZILslMg9qRNat2X2ho1S02VGdohwJxo4QQ6ckeX4CieSPdvUVFO%2BDfIaUBR3ADwfgXFentbDW%0AGJ%2BZWX2ybjm1HHJMLgKGAICvbF2ksY0/gfmiM7BNxEzRfKcwWQgSGUBlQflZe2N/b6mmlNya%2BpEZ%0Ak6kpfadd5omWtwXAZJFXygkRnBy3DQBoDHGEWQU2H5g08FeW8xQP0PXNK0g7bkScDphxkmhUeXcA%0Ai7yxwUoGrpzIgOOmc1vhVYrMTE5B8STETBzg7a6xI4DLIcHoeHdbeEoGS101nYQPlW8/2YYUvIkN%0ADyd9k1ahD7DLzIiL0mQaLZkOxLGRBK72/o5TzZLZpVPAXPaSf0RontLaozlDJqgm86owe2lXhYIi%0AzI7S4cotfyg4IuNs8AFM5ZajJuQILMHTOJWTcdlX8tOS5oEPftTd/pxV6pgUFytJSkD%2ByDAeGW8t%0AiJmIV3DL6bz1MQOcZphH1QJQKJovUiKO4zBHlHM0stZCr2Ocv9w8pfwQZOvHl2YtJrAFUR1FZq9w%0A%2BpYgbkYAjanArKPjVE7EgYvHSCpMqTL3DrcnHwtsBCjltD07%2Bzs9ZqM1pw5gu6LibK8dOwJAKDoG%0AEU0iY3hkF9rR2gVmOVgDQIPPFk1HQgEwB2g88tEkm4kAQI11BeY7SspJ5mBztnQopEQRk8S50tcQ%0Atl5hcpq57pyKo1EILiZrciqAj1EVqTbNaws4jMetBbl9lBwtrlv4ituU7ex%2BJCXDZzF5ywzR7gG3%0Av3Z89/jMCA3CCAwFE1n5MmlyPDpo8asVzBjnAHEA4TgMwGdp9EMtAwdsiRy2LGnkjx8SjiwJsJ0d%0AwW7tftO6r1nl0YwP1jc/MCTlqMmWqZjHkYz2IkpOJ2BfdV5xyktGDXF6ua2RY9SR07BHZSwkBmxh%0AxmjtzBwzu40wW8xaaX5e4AmqJW%2BJZOL0EBqnJOXHYXtgM9JmVLypAGJB2JI0D5DgwS//CqDDkRFQ%0A0wPEgTldAjeJHAtLSiapaXBcdoz2SH/zrSBJYUeS2c4qdUwWJ5gKMw/uSDC3ZQDhyr31NTaM4rNW%0AEfKtMlO/ZLQD2GLGgzDVOJrbp%2BIlAWIjtXSx0fyUTRrJRzPjlihAKj5kvgN%2BDYxwjl6QLUztJjRW%0A/JE7oRxiIEb6ZMQTRDuSDnPEOHbhRhK8JsnjjrYrSk7E/HVLpmXJVQEC7ehLjOOWDCsFgIQDTIL8%0AI7YNWKIavQDEQGPYiCqPpOGM5hAhcMriSPIVyInZVv6M9i0DcKE/gdtb18fiFPjBvv%2Bh1BzmwGy7%0A1CRPkUkAe%2BtHz1s7mxYPoJR9wQ1QC/lt4zdPJYKpH55VDkx0UQWAUHmC5G%2Bf4uMdCKdhAiVnBgXX%0AbAF%2BpD//eUQG/fL3bh/PTnDijSfTLXjmwa5uDXi67ELs5SmAjAKyjn177d0Xzz8ywK7TGI%2Betz8t%0Af9qxI2lxjknQl%2BkMdHy8Pb/5H%2BL2lGh3QYVogomNNGmQ5Qc8NSpyRLZlBJAVYWBAUTCVwbO28qdN%0AOWU5v5go03YqhxMxE1kwFTpK4QBJASLPJPxD9pjzqDr03SI481NfnMgVSKgcq3XbmH60q/ivl/n4%0ASK4X66PCF38S%2BnnI2VkFrW2EQEeC8ldwMCdf8oyezk9U7CfKaVNRNdfxzaup/BlfDVBru1xL0owJ%0AZy4LiXOw8OE2hfETKXMFTznQWLUQZIVHxQC0A7NlzZHaAuTfGANP8pxNmtF5ZhU4MmD%2BoJqvENBF%0A0JlYTrFCAMlrjDlBl5pAPOMUtFHtnqrN5CvshJ3WDuDiCCBhNn1j16P09uf0Kh3U7DvjdYbZ%2Blpy%0ArTUTU8FrU/PHabQJxDMqTqPW9MFT4iyZ2KZG8xPPzGQemNZkjMeR23TegKNQ5uSn300Fti7ZVnCV%0ARbN1fBnIx7fdbHEVnPwKryCafQ9CjcqbaSuYyVkCdh18e10v2DDwKTQGSk5wYLauo8rt4/D8xes8%0AhwOHArWHiGrNLHgVLUehNX8WSDYbwEmMh0ueqma0tugA0dqSccUMPE6%2B%2BbNCQTEw2UkFOAW3FRc9%0ATQFNZY/LmvfISMncTqyaHQ/9GlU%2ByU5lieXGKQ52W6FVxlcfpVXXqMgUJOP2SM4u117OXCHAlY2C%0AxO1rVE2F4gRg1GZ8yH/zJy1YvDl9drq10BY%2BNe9vz4%2BAXa8co93sKLZf%2BAB0hGDfpzPQy8a9PwFm%0AGgPNZLueyt7FKI17Aa7R02IlUyHcqVJ6ZWyq2QIaJVYZzdgO5kzeeGNNJtgugiLg6VKGI0AR0Gyq%0ApXmIWGXSkghjwG9ghFmVfu04VfCQrXy2njhCUtPwQ/OVeCK/Bvj89lzvk3cCYuBKJpNl0sgEnvI7%0ADTylmZQzY%2BQ%2BTjJ8osSZiUbtdXFKMo61xZkHy5z8rixoexQmOAeb5DmYjczUdCqIKw%2BQ9%2BhpvB/e%0AQre4Nu30PbipjI/7wGxtcSN9uxyVKPj28LZrto5k3ivOEMfC63XMTBo4wfBTUNVxl7aCGS059OdW%0AQgq1%2BApQp1qAeEZ0agc4Vl0quUmMBYFdNMrFAmMEQdvJBM%2BSdA6O2y/G2Sh8zFC%2B7oC5Gsymr8qP%0AkZIlP/FBm1uaug3M0ynyCsOfR5U/TXpHOLa7budRUgIFidcFgeTkH/ocmYlz8Mtfgcw3/JQDU%2BSa%0ALAOY2Coa2UtQ5NS8NAtnJJ/a5IiPOAuPKpjXAUq%2B0eHokJoDhxNXqnwjAea6ypKh6rrMK4tChWK3%0AVEm4gqf8klYRKzTTVjBjJXMYknMbPkC1swvic3HEtngw51ZstNGB1Zm0MHxLZvR0dp8KMW%2BV365k%0AU6DQ2gkmzdP48whttt92uO1MFqe%2BXWaENltUNXVIlhcbU2arZoBtD79efYBojs2/B/bSA7BlcWRE%0AzTFsVzz62tTYkY2IvjyJjeERfBvRywdnz845iTRla5G4GeKxHLvhA9CSsqStYEYJSQHm4pStHOKh%0AU36CxK8gmpopByIcICnyzTBFwHNbeeQy0tKBIEcg7jTyFL9i%2BDFtlI7bBNsKkgK0OAJPwlH1S27f%0APT65MIZiCj9gRD8qXZhG59ph0OQcR1eRp4QrLc1A3QEuqgDFlC0hHgCCmVmiQrWCaILJmfiouspe%0AxztGakvt0etae21d5gpUU/bapVOvMLcTe0pMv8wBqop5BZVEJiOeZDExUGF8qiwMdCTZWvAVHAS3%0ARjWfZjoKTOWJn5bP5BucTl0ExzYaQDxB%2BrM2/EqKKqUqFxx8kzGv4CAcat/d1i5mmQBH4KM1WzMz%0AKnIUpnyASevoadIWcQDXDMlr7ZE5tlPwelSLecEjOSfpaE6iLNHVEdvZfbaYmpPzXTw1Jz4K55wT%0AH7S2k3PMCcdGxUBHgBQCMwm%2Bbk3OWG2g02tTMxAEs%2BQVVq3CYzvz4EQExACFYhWmDoUsMgHx5E%2Bd%0AFKyaUuJrIfmZvJYcmZQDszz8CpjvVHGiasXA0T3mNW/GeNWfp9fJX011dDkKqaowMBuB50UmPpSr%0AqoWZKXtr9vi3KUFVUw0FF0lA8SCzTSRw5ZiZOlO8x2fPPzPykWXd3pr3Nd97JDhqBvHsNbFqZK5j%0AOMzs7uuXjAoN4APYSHeAR9Bmd7scjZQyOcmvsCJWFS2fR4egasQAZPEbkY4m%2BKPzH12Sus7M0aux%0AObrqpHCclhcQBekDWFNQXOYKLCEmVUYw87N8KpenZOJD6hfbfunxqX3TxC%2B68MWSL9Jo%2BorZBzY/%0AUfjlKxTMeL1LVcdRIkd%2BNroemUkzcGUeUz1tV3ng0Jn5iSct5aMjnI7iXzMdCa5dXpXEDBxS7wut%0AqjZQleDYHi2ezpzUU/KRTJ/8xJOWYGCe/kVc08AhaNMZITRJVYIZD51ZdRwlcuTd1uuNwtPCLyaP%0A7sd2ztAkBzhKju2rMb5Iq9crnfJvBN8cVR6YHb%2BCKwTUSDDjpIVf6UtILf4b8IY8u0yFV/k47wnz%0Adq%2B6HwrHtkZXcDCPbe3mDFeRMkd5%2BQMkS37iSUtKMGO0aud4JaMBUpvJA8/Cg39sj0K3s5zMsT1K%0ApuBTPJNHbcqCtk%2BbztNDp%2B3R61VJtEAKgveFVlUboLbCK5gtOp3JiWeL9AMyExHMCKFTybN24tl0%0A4sqTDfja7PlH3kU5yixfngGfnfeTz8fn7DUxUm3DArsY694w5u1ia5%2B%2Bxka6jqE4TQVtG%2BMAKByZ%0A6/YQObbxlUrwANeqmZE8M%2BFAjQTpH/lX2%2B/q/FFBGqV5BXOMqfwKT/6BEz/ySV0BzJJH1S%2B5/QOP%0Az3n/w9mrZQdh1v4J/EW1xggcvdIJHISftL3Oc83MkSZ%2BOtK1fNLen8acXSaOAHiVn5xru1dVV%2BbU%0AeY9n7cRVzaYTR7iCpzpX2tPMV1r8Ff2nTUt%2Bt/tsPfFV4btSlijyRfIsqeMPB18ZZt594jnMV3Qm%0A/2fgr88wmdcbfSXzdP5kA09pJa%2BNOvoK%2BGIXpP5Eo1cls%2BnETwd%2BJfKUPJPvC2ffiacC%2BL3IQWb7%0ARipymoGOAlNn4ggTXHXel1z5U%2B0pvgqaeSp1TV4z3%2B1y7VjJm6M4s%2BMb/qRZa%2BZNydMWVx1ph86x%0ATeq7IP3AtWSKhwPxXynM/LWqjIDYOl59NkKt5Zvz6csTToMFUA4LygiKs/XEVjmAr80ZG%2By73et7%0AzMP2ae2VVuaNVJypOXEEwFd0vk6D%2BarR10XeKCDyZs27TDxLruLXzOS/wof%2BFJmY8mP7SvCXyX/1%0A8Ykvh4l/gwV/ouMXP78/ofzX7/tjZ/uiGmNP5tOLP00e971ypuxB/knbL3a8jvp%2Bni/KJvKH9P%2Bo%0AeF3egC8O8MXWX1R7M8%2Bboy/O8Ebh1dHXx/5JMzwd4I/2eiry6spfzL%2Bf4Ti9DnDNvOl7qL1hzqM/%0A1MLCP9doNp34iwP82KZzAPB3Z/h69%2B9K1fpnaCb%2BRfBTZ3gjfj26%2BnbNXC915VyVr1U/NvOHOl4H%0A/vowf1ujNyM1v4D4dKXAzK757CQDwTiZYNTKXEGngqJvTraBmLO7M1wnuTYqk06ZAxy3OE7n9rtS%0Akb%2BuWckVfL3drJ2t/6jCrJ2ab/AfbTGlvt7uTZeryDUzm/6q%2BEtPSnzEnTdu/me6Mz/Rf9zwP8TS%0A6cAU/ENuvCd/vcUr5hzsD%2BEp%2BH7IPyT7S5LXqz5WrfgNvzDzO5Abgt/QjcOBH769uv2fZvJ//oQ/%0A6kO53nQqf/1zecV8rz97/Qx87f5qzr/Y/doIwZ/Uq1EPfbfEljOwrYQ55yLvVgI45nfBlIXsttYH%0AmGp2PN6ccwzITXJ0mTr/Luxs/4GD/bsM%2BXl9%2Bxr8vBb/mcpfelLyFcQg41%2B/xs/%2BQr//LH9296/4%0A82rCvzLbK8338/yVju%2BVf97pm5v%2BE6/z84xS%2BR9ql2P/wA/0jQ/zI/iBHZP94XdJ%2BSvgixdX6mdc%0A/ytD/ljOmyv/2Au%2BafTmRj92hjeNXh29H/vfPt6rsf9Q/v0dr1L/xFu/v%2BOPutH7Ljr5o3pdP5eZ%0AqYuAGJg0MDM7dsDkQftDW3tRUtNb%2B/sqmaB96952EsIBxML/FsCcf6Lvv31sZ341/M8bz45/Wv/V%0AwH/iI/gnlnzp8flPvNjO/KMceP%2Bj9ern51r1ivmj5lyddWAdWAfWgXXgZzhw/SeaXfafaz/DbTWf%0Ael5S0HaO0YciaPtHP7Kn4vUNIDuZs2l4zjDxHHvxOvD7OLCPz9/ns96brgPrwDqwDqwD68A68E9y%0AYD7tnLtMYN6n113A02M7S97jo0tbQdtEaiRoC2Hi%2BAvWgd/NgX18/m6f%2BN53HVgH1oF1YB1YB9aB%0Af5gD12feNcOVrg%2B8a%2BbP3Xy2e4XnAEffY/vnZtiqdeAXcGAfn7/Ah7hXWAfWgXVgHVgH1oF14Nd3%0AYL76vnLbH/vku3a/Zpjq2vSa%2Bcrwy1kHfkkH9vH5S36se6l1YB1YB9aBdWAdWAd%2BTQeePvnmVX/q%0AY%2B%2B73f%2B2SWajxevAP8WBfXz%2BUz6pnXMdWAfWgXVgHVgH1oF14NOB6zvwpz47a3zt21Hg75mkdgvW%0AgX%2BKA/v4/Kd8UjvnOrAOrAPrwDqwDqwD68A6sA6sA/9gB/7rK7N/5f/A8xWd5awD68A6sA6sA%2BvA%0AOrAOrAPrwDqwDvyeDnzn8TmfnRP/nmbtrdeBdWAdWAfWgXVgHVgH1oF1YB1YB/6cA//lk/KLD0to%0AX2T%2BuWm2ah1YB9aBdWAdWAfWgXVgHVgH1oF14Jd04F/XW/G85L8kfTwy53bip/916klI/ymz0wXr%0AwDqwDqwD68A6sA6sA%2BvAOrAOrAO/sANPHp/ztj4jiT5Hrw/Ip%2B/MqRCWeVWIsGAdWAfWgXVgHVgH%0A1oF1YB1YB9aBdeBXdeDz8dkLk6v6UCwGpgt/7hmp1Ndr5c%2B%2BE39dZ1YtXgfWgXVgHVgH1oF1YB1Y%0AB9aBdWAd%2BJsd%2BHx8Ho3ng3Niabz63jwjn74Y50PxTa36TxWOCdl%2BV%2Bdaspl1YB1YB9aBdWAdWAfW%0AgXVgHVgH1oG/34Enj09fdEec2/mMfDOxJRJ6rLKtfBK%2BqBMtETJvdCat2gXrwDqwDqwD68A6sA6s%0AA%2BvAOrAOrAN/swP/6//%2B3/87W/KQ8y0nCMfxOUcMdDSBhWUks72COBMc5cc2EUuO7dSZ%2BIu0WbJ4%0AHVgH1oF1YB1YB9aBdWAdWAfWgXXghzhwPj55i/rSE4RrxhNuLvJsOxUcb0WT0iIHjtq2iQQ6AlQe%0AmKeTcOTfH13Jm1kH1oF1YB1YB9aBdWAdWAfWgXVgHfjrDnw8PnvgAXp2Alj0MNqMx57rv/7rvwTk%0AAY2iVIJVRZM8S6oNTJFDKp3AlJo4tZhlXtEiLFgH1oF1YB1YB9aBdWAdWAfWgXVgHfiBDnzz3/nk%0Amdf6n//5n/vb8/YXocfj02cneZ5wrWYiDzaWBMgMSCA5OeBZHj7UrlLpxCxz6JuX9opzlOx2HVgH%0A1oF1YB1YB9aBdWAdWAfWgXXgLzrw%2Bfj0PTYfnL0/fXxC4LXG8vFJdJl0DkVmNB9ngo66g4VsAa6w%0AgHKAIkUzxAkoPzKekleE7cSSN64D68A6sA6sA%2BvAOrAOrAPrwDqwDvwMB26Pz95pABevTV6eLrE0%0A33uPV%2Bfnn5zOFx0iU9ZTCSpEDsBhWSj4GOXx964dpSBgCPjqTLWwNMrL3Do9Sq55TzeuA%2BvAOrAO%0ArAPrwDqwDqwD68A6sA78QAc%2B/uazlx7Av/z0zfnf//3fgP/zf/4PLX2n8YTjvfe///f/LgJ81xHh%0AyAyw7RQw8dNrVAigNbElXxEifVlwzHSabPlKZgZZtpADFS5YB9aBdWAdWAfWgXVgHVgH1oF1YB34%0AsQ78i6dXij3zenny%2BOTvP3l8RuPBxpOPxyeLIyLbHnVKqQO2yjdenEB9D2C5L8%2BiatYSb%2B/O%2BxJz%0ACkhHTGzBBRMnh0YkyyxYB9aBdWAdWAfWgXVgHVgH1oF1YB34SQ48/5vPj//E7f/8T49PHoFO4BPu%0A/va8BfK%2B63zmyTkenyR9413jcSsfq8fj0/enR0rdX523wADOUwsFa%2BRsRMqLgEkDc2qJ%2BY3rwDqw%0ADqwD68A6sA6sA%2BvAOrAOrAM/1oHP/8EhdXv48eTjCcrjk8XffPoChONjj/fbv/71L5%2BgYBZ51hQB%0A92K0sDgBmDWZYNsRXU5FpIXtjD0%2Ba63abZTHggmtKIGtgAiRqHjJBevAOrAOrAPrwDqwDqwD68A6%0AsA6sAz/Qgc//waEeeLz3wPMvP3l/siVPY990POfI%2BPj0afd463085GAqOGf1mTczB6akwo935%2BMP%0Aj1Do2dl70tZTqmEko8GQKBCjceQ85AUdLVgH1oF1YB1YB9aBdWAdWAfWgXVgHfixDnzzN588w1y8%0A1gBEn6D3v/68/S8P2Ztn23x5Xh%2Bf0Cg/4pu5JUewtZGmLjm8En1P0tS%2BbqsV%2BPiMiQLlKkQo08uT%0ATPgQ3O06sA6sA%2BvAOrAOrAPrwDqwDqwD68BfceCb/84nQj7JiD75enwKyMPxBejzzxcg0ffefLxJ%0ANqrcoCXNXLdkPh6d9z/YsmrNq7LuDnMoO4w0/uPBPj4tb04AmkTygXQWrAPrwDqwDqwD68A6sA6s%0AA%2BvAOrAO/EAHvvmbz3RvT73Hf/GSZyePNx%2BfADg82HjX3V%2BFtzzvQKJJT4mUv4kcdSou3jt/BFsQ%0A3cPxLzNnd7APyENQJrNRzvuTU2gtTmvkEZFFEo544zqwDqwD68A6sA6sA%2BvAOrAOrAPrwI9y4JvH%0AJ08vdHuVAXz4%2BQjkhekRzzMyvgB93ZHxEThfbqmpecTrBeQ3wGzdkU/Kno6zqbMly5GzWctgLMu9%0ATiLkbSpIYcE6sA6sA%2BvAOrAOrAPrwDqwDqwD68CPcuCbxyeiPfMEvuiIPQXBt2fc/T%2Bz6mkvQPNN%0AxmmCMtvGuQKZRfsqZXlSbDml%2BzVPhjyv5fl3nmaILESoZWBriWLArnVgHVgH1oF1YB1YB9aBdWAd%0AWAfWgR/uwPn4nA168s0k2OcfT7hehr7cZowmOCJb1tP3nuJFW8gvUujTEeCQ8QXk72/M27sU7Ja3%0AKIu/DoVDuU9QMKcpA66Zebp4HVgH1oF1YB1YB9aBdWAdWAfWgXXgTzjw7vF5f7V9PMyOFxqdeKTZ%0Aj4cc4BVB2oyRKxHEAVxXnI56QDoM244gs%2BWdCfAVyrOTTCumABqgwQC71oF1YB1YB9aBdWAdWAfW%0AgXVgHVgHfqADLx%2BfPvboBHDximPra828c/hsm/F93lo0pQGsZav4EaVZFRbAtNwS3pYCTpmWI96c%0AAP/Ln999fyaubNsF68A6sA6sA%2BvAOrAOrAPrwDqwDqwDf9GB8/Hpm7AIcPGE40lGs153s3FHEopX%0AoFq1c9uTT7U4AGhu5R9VHDlVkQwPUWmA49nZ3396KavUJ9qLpKD8gnVgHVgH1oF1YB1YB9aBdWAd%0AWAfWgT/twPn4TMiXG5EXGosHG5FTXmVFgRkLe8gdNE9nTL83HsCqMq/4R%2B3TAah1ZiKEHpwCMia5%0AlLimbMWBOcbidWAdWAfWgXVgHVgH1oF1YB1YB9aBP%2BHAN49PH13zacfbjC2R/%2BQq6mCeZIAiwMWj%0A7rvtD33FTVqLFDo%2BCAG185QtRyxAq6MyiDRJs6GmuJEtCykihdKSqnzBOrAOrAPrwDqwDqwD68A6%0AsA6sA%2BvAD3Hgm8enir3iBLzQ/F%2BI5bRHGqDt/R338ZBTgVNfdEQzxgQBt0fkfcVRnC2CKdholitS%0AnEfhqtQ0KlucY6NWSSIAkhyZ2bgOrAPrwDqwDqwD68A6sA6sA%2BvAOvCnHfh8fPrKKgJ8HPLyBBDJ%0A%2BEIrAnjCkWcBGIKMS3yMBQ0po%2BJupT1KPx6uvhLToQo8y81YC2ZxytZJ2IKNAMXVPCIcMld%2BtbbY%0AuA6sA%2BvAOrAOrAPrwDqwDqwD68A68Kcd%2BHh88tDieUZs%2BTjkzcnDzJenbzZoNDOSgebLzULfeMZo%0AHIGNyhZrJ5lC1QBwUuOUFZmjMHlo9/NbqBBsR%2BMkwPEuzj%2B7JFUVmXAiC9aBdWAdWAfWgXVgHVgH%0A1oF1YB1YB/6QA59/81kZby2XT0Renj4%2Bew3C9JHWEw7gIg%2BQ0EOOrYIANYuPVrfXKXxWOm6NnLri%0AowA2CedxfvsTBTMQpFk1yVM8nOBUW7wOrAPrwDqwDqwD68A6sA6sA%2BvAOvDXHbg9Pnl08QDzhWbs%0Accizk6N//etfvuh8p9lV7FuxaHLSJPuuO8Tt4hG0BAFHOzLqEBUpWtVWIB9MC67QdTxNylrJYTgR%0AFqwD68A6sA6sA%2BvAOrAOrAPrwDqwDvwQB578x255qvH2483mk5I2PMx6Ddq1B5scYzRLij7nfPgR%0A0Tf6JvRUcgqAY9nXmJRbmAzg2E3CUV14PPcEPWpTEBBRc6RARwvWgXVgHVgH1oF1YB1YB9aBdWAd%0AWAf%2BnAOf/7FbXlw%2Bt3qz%2Bf40z5HLNmAAkceeMdDRMRA6LZ%2BdvkJJpkmtSzWxjcAJWnIU9uy0FrLt%0AuAXL96e4vimkvGAdWAfWgXVgHVgH1oF1YB1YB9aBdeBnOPAvHmC963yt8TYjQ%2BSpBugdSPuYAiJL%0AQjSTk9wbL33A0xegtU%2BlOJr3T9NG1zHI1843Z%2B9PWh/dp9rEs%2BPidWAdWAfWgXVgHVgH1oF1YB1Y%0AB9aBP%2B3A53/sVgleZTzkiDzYzPAU5D3m6642PgWJrflihEY%2BMsAXHXEuX4CTlppAnZKTOXEEgGN0%0ASjvvYvQVWnQAo4NVuGAdWAfWgXVgHVgH1oF1YB1YB9aBdeAHOvD5PziEqA8wHmNgHnK28W0G5l1n%0AptP56gt3GjkwX55hTsG2Kx5q5ZOaIPIEyqLM/C2enWBjyWOSlMmHF6wD68A6sA6sA%2BvAOrAOrAPr%0AwDqwDvwVB17%2Bdz4R9fXFiy7gI7B%2BPvbYHq%2B%2BgyZfkSLAlZo6qb0Ckx9%2BOgD6EHxkgn12CubLE%2Bwk%0AM6a8YB1YB9aBdWAdWAfWgXVgHVgH1oF14K878Pkfu%2BX9xusLRd9gU9q/8/SBN/M%2BMsu3nZyJ0ydZ%0AF5NkZvlTbHIKiiMDwvWykS/Ma%2BR0Pj4Tb6pARwvWgXVgHVgH1oF1YB1YB9aBdWAdWAf%2BqAPf/M0n%0AxTzefG71KiNpxnddDdr23rM8wiuAmoLGg/ZGtqOnJdcx6nLr9%2B0j08yreOjvdh1YB9aBdWAdWAfW%0AgXVgHVgH1oF14C868Pn4VIj3mIC/D%2BQ554uODPlwLctcQZwrsEWNroTUOBKXCRxVV1r6ABclD/gk%0A06lAfXiCjevAOrAOrAPrwDqwDqwD68A6sA6sA3/FgdvjkyeWj7frW6tMnGuz%2BSCc%2BMo0k6atD9pU%0AeIUtmaevMrWgqX2LgckJK7hxHVgH1oF1YB1YB9aBdWAdWAfWgXXghzhw/s0nor7KBD7w%2BFvQmT8a%0AXx%2BBEK7JZGf5NXktPDLHdqq96TufmtDq%2Byo/OUeL3a4D68A6sA6sA%2BvAOrAOrAPrwDqwDvxRB548%0APpXgVcYzbz7SXr364lAYZyaPmd4cwZynqs3MlKrXTL7CiQSOXjN/HL3S3Pw6sA6sA%2BvAOrAOrAPr%0AwDqwDqwD68AXHfh8fPr6IvKoOyJax9vslfoXaa/Kj3xqT9%2BZnR5Vka%2BEa4baa/KaOVrsdh1YB9aB%0AdWAdWAfWgXVgHVgH1oF14A858Pn4fFrGM6yXWOAp02QPv4PzldqjZAr%2BofL35L9y%2BnTCTa4D68A6%0AsA6sA%2BvAOrAOrAPrwDqwDnzXgSePT59nxh6TbMNvRN8/7d4Uvjr64YL/9kavBtj8OrAOrAPrwDqw%0ADqwD68A6sA6sA7%2BwA//ydff1N57MrzxEv%2B7az9D8YvevX/yLgktbB9aBdWAdWAfWgXVgHVgH1oF1%0AYB24OvClv8/kqbmPtKt3m1kH1oF1YB1YB9aBdWAdWAfWgXVgHfiiA196fH5Ra2nrwDqwDqwD68A6%0AsA6sA%2BvAOrAOrAPrwFMHbv8PPHetA%2BvAOrAOrAPrwDqwDqwD68A6sA6sAz/VgX18/lR7V3wdWAfW%0AgXVgHVgH1oF1YB1YB9aBdeDmwD4%2B93uwDqwD68A6sA6sA%2BvAOrAOrAPrwDrw0x3Yx%2BdPt3gbrAPr%0AwDqwDqwD68A6sA6sA%2BvAOvCjHLj%2Bfx65Zn5Urx%2Brs/%2BDQz/Wz1VbB9aBdWAdWAfWgXVgHVgH1oF1%0AYB144sB3/ubzn/KGfnKzTa0D68A6sA6sA%2BvAOrAOrAPrwDqwDvzHOLB/8/kf81HsIOvAOrAOrAPr%0AwDqwDqwD68A6sA78ug58528%2Bf92L783WgXVgHVgH1oF1YB1YB9aBdWAdWAf%2BPgf28fn3eb2d1oF1%0AYB1YB9aBdWAdWAfWgXVgHfhtHdjH52/70e/F14F1YB1YB9aBdWAdWAfWgXVgHfj7HNjH59/n9XZa%0AB9aBdWAdWAfWgXVgHVgH1oF14Ld14EuPz/3fvP1tvx978XVgHVgH1oF1YB1YB9aBdWAd%2BLc48Ou9%0AwvZ/7fbf8kXapuvAOrAOrAPrwDqwDqwD68A6sA78Xg586W8%2Bfy9L9rbrwDqwDqwD68A6sA6sA%2BvA%0AOrAOrAM/2oF9fP5oR1dvHVgH1oF1YB1YB9aBdWAdWAfWgXXg4sA%2BPi%2BWbGIdWAfWgXVgHVgH1oF1%0AYB1YB9aBdeBHO7CPzx/t6OqtA%2BvAOrAOrAPrwDqwDqwD68A6sA5cHNjH58WSTawD68A6sA6sA%2BvA%0AOrAOrAPrwDqwDvxoB/bx%2BaMdXb11YB1YB9aBdWAdWAfWgXVgHVgH/rID%2B/9q5S9buALrwDqwDqwD%0A68A6sA6sA%2BvAOrAOrAO/nwP7N5%2B/32e%2BN14H1oF1YB1YB9aBdWAdWAfWgXXgb3dgH59/u%2BXbcB1Y%0AB9aBdWAdWAfWgXVgHVgH1oHfz4F9fP5%2Bn/neeB1YB9aBdWAdWAfWgXVgHVgH1oG/3YF9fP7tlm/D%0AdWAdWAfWgXVgHVgH1oF1YB1YB34/B/bx%2Bft95nvjdWAdWAfWgXVgHVgH1oF1YB1YB/52B/bx%2Bbdb%0Avg3XgXVgHVgH1oF1YB1YB9aBdWAd%2BP0c2Mfn7/eZ743XgXVgHVgH1oF1YB1YB9aBdeCf78A/7v8R%0A6P/6x038z/%2BS/L/27B1XQiAGoqhGYgPsf5EsgUlLBESUE5/M7yO3%2BnR0hRsQIECAAAECBAgQIEBg%0AnYAvn%2Bue3IUJECBAgAABAgQIECAwLyA%2B582dSIAAAQIECBAgQIAAgXUC4nPdk7swAQIECBAgQIAA%0AAQIE5gXE57y5EwkQIECAAAECBAgQILBOQHyue3IXJkCAAAECBAgQIECAwLyA%2BJw3dyIBAgQIECBA%0AgAABAgTWCYjPATiAYgAAA/xJREFUdU/uwgQIECBAgAABAgQIEJgXEJ/z5k4kQIAAAQIECBAgQIDA%0AOgHxue7JXZgAAQIECBAgQIAAAQLzAuJz3tyJBAgQIECAAAECBAgQWCcgPtc9uQsTIECAAAECBAgQ%0AIEBgXkB8zps7kQABAgQIECBAgAABAusExOe6J3dhAgQIECBAgAABAgQIzAuIz3lzJxIgQIAAAQIE%0ACBAgQGCdgPhc9%2BQuTIAAAQIECBAgQIAAgXmB4/3I67re/8FfCRAgQIAAAQIECBAgQIDAQ%2BA8z8dv%0AfPl8gPiRAAECBAgQIECAAAECBL4X%2BN33/f1WGwkQIECAAAECBAgQIECAQAj48hkYRgIECBAgQIAA%0AAQIECBDoCIjPjqutBAgQIECAAAECBAgQIBAC4jMwjAQIECBAgAABAgQIECDQERCfHVdbCRAgQIAA%0AAQIECBAgQCAExGdgGAkQIECAAAECBAgQIECgIyA%2BO662EiBAgAABAgQIECBAgEAIiM/AMBIgQIAA%0AAQIECBAgQIBAR0B8dlxtJUCAAAECBAgQIECAAIEQEJ%2BBYSRAgAABAgQIECBAgACBjoD47LjaSoAA%0AAQIECBAgQIAAAQIhID4Dw0iAAAECBAgQIECAAAECHQHx2XG1lQABAgQIECBAgAABAgRCQHwGhpEA%0AAQIECBAgQIAAAQIEOgLis%2BNqKwECBAgQIECAAAECBAiEgPgMDCMBAgQIECBAgAABAgQIdATEZ8fV%0AVgIECBAgQIAAAQIECBAIAfEZGEYCBAgQIECAAAECBAgQ6AiIz46rrQQIECBAgAABAgQIECAQAuIz%0AMIwECBAgQIAAAQIECBAg0BEQnx1XWwkQIECAAAECBAgQIEAgBMRnYBgJECBAgAABAgQIECBAoCMg%0APjuuthIgQIAAAQIECBAgQIBACIjPwDASIECAAAECBAgQIECAQEdAfHZcbSVAgAABAgQIECBAgACB%0AEBCfgWEkQIAAAQIECBAgQIAAgY6A%2BOy42kqAAAECBAgQIECAAAECISA%2BA8NIgAABAgQIECBAgAAB%0AAh0B8dlxtZUAAQIECBAgQIAAAQIEQkB8BoaRAAECBAgQIECAAAECBDoC4rPjaisBAgQIECBAgAAB%0AAgQIhID4DAwjAQIECBAgQIAAAQIECHQExGfH1VYCBAgQIECAAAECBAgQCAHxGRhGAgQIECBAgAAB%0AAgQIEOgIiM%2BOq60ECBAgQIAAAQIECBAgEALiMzCMBAgQIECAAAECBAgQINAREJ8dV1sJECBAgAAB%0AAgQIECBAIATEZ2AYCRAgQIAAAQIECBAgQKAjID47rrYSIECAAAECBAgQIECAQAiIz8AwEiBAgAAB%0AAgQIECBAgEBH4A9xf67VNlopBgAAAABJRU5ErkJggg%3D%3D%0A\", \"frontend_name\": \"tabs\", \"icon_data_url\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1%2BjfqAAAACXBIWXMAAAsTAAALEwEAmpwYAAAD%0AGGlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjaY2BgnuDo4uTKJMDAUFBUUuQe5BgZERmlwH6e%0AgY2BmYGBgYGBITG5uMAxIMCHgYGBIS8/L5UBFTAyMHy7xsDIwMDAcFnX0cXJlYE0wJpcUFTCwMBw%0AgIGBwSgltTiZgYHhCwMDQ3p5SUEJAwNjDAMDg0hSdkEJAwNjAQMDg0h2SJAzAwNjCwMDE09JakUJ%0AAwMDg3N%2BQWVRZnpGiYKhpaWlgmNKflKqQnBlcUlqbrGCZ15yflFBflFiSWoKAwMD1A4GBgYGXpf8%0AEgX3xMw8BSMDVQYqg4jIKAUICxE%2BCDEESC4tKoMHJQODAIMCgwGDA0MAQyJDPcMChqMMbxjFGV0Y%0ASxlXMN5jEmMKYprAdIFZmDmSeSHzGxZLlg6WW6x6rK2s99gs2aaxfWMPZ9/NocTRxfGFM5HzApcj%0A1xZuTe4FPFI8U3mFeCfxCfNN45fhXyygI7BD0FXwilCq0A/hXhEVkb2i4aJfxCaJG4lfkaiQlJM8%0AJpUvLS19QqZMVl32llyfvIv8H4WtioVKekpvldeqFKiaqP5UO6jepRGqqaT5QeuA9iSdVF0rPUG9%0AV/pHDBYY1hrFGNuayJsym740u2C%2B02KJ5QSrOutcmzjbQDtXe2sHY0cdJzVnJRcFV3k3BXdlD3VP%0AXS8Tbxsfd99gvwT//ID6wIlBS4N3hVwMfRnOFCEXaRUVEV0RMzN2T9yDBLZE3aSw5IaUNak30zky%0ALDIzs%2BZmX8xlz7PPryjYVPiuWLskq3RV2ZsK/cqSql01jLVedVPrHzbqNdU0n22VaytsP9op3VXU%0AfbpXta%2Bx/%2B5Em0mzJ/%2BdGj/t8AyNmf2zvs9JmHt6vvmCpYtEFrcu%2BbYsc/m9lSGrTq9xWbtvveWG%0AbZtMNm/ZarJt%2Bw6rnft3u%2B45uy9s/4ODOYd%2BHmk/Jn58xUnrU%2BfOJJ/9dX7SRe1LR68kXv13fc5N%0Am1t379TfU75/4mHeY7En%2B59lvhB5efB1/lv5dxc%2BNH0y/fzq64Lv4T8Ffp360/rP8f9/AA0ADzT6%0AlvFdAAAAIGNIUk0AAHolAACAgwAA%2Bf8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAD8SURBVHja%0ApNHNKsRhFMfxz/OfZ4QG5X1hRUKRl4S9O2AnJTfhDmzYKJcg2chGyg1QsmUzgxIbGRYshshjM14W%0AYuEsz%2B%2B8/M73hOT3yP7QxZ/TW7OV7YJbzwvhpxU7c3WbHXoV7d9EVqctm0wCSOpNaVGS06ylKZLW%0AJwa6Pu08eNXnSp1jlben4YjWdmdeJDkvuvS7lFdA5XWpmBEEUSavrLkqPzowzlt1bibKKysYda3G%0Ag0OD2r44ZKIztZJjyZ0jQxplAuJK6lXQYM%2B8DUc6PZupdvfVrqYYlJQE506MKTvVYxcfZ3%2BCGql0%0AxyG5w/vFtYvv0MK/n/VnwfsAqHVGROrL2mcAAAAASUVORK5CYII%3D%0A\", \"is_complex\": true, \"is_block_element\": true, \"tooltip\": \"Insert tabs (e.g. for hints)\", \"customization_arg_specs\": [{\"default_value\": [{\"content\": \"This set of tabs shows some hints. Click on the other tabs to display the relevant hints.\", \"title\": \"Hint introduction\"}, {\"content\": \"This is a first hint.\", \"title\": \"Hint 1\"}], \"schema\": {\"items\": {\"type\": \"dict\", \"properties\": [{\"schema\": {\"type\": \"unicode\", \"validators\": [{\"id\": \"is_nonempty\"}]}, \"name\": \"title\", \"description\": \"Tab title\"}, {\"schema\": {\"type\": \"html\", \"ui_config\": {\"hide_complex_extensions\": true}}, \"name\": \"content\", \"description\": \"Tab content\"}]}, \"type\": \"list\", \"ui_config\": {\"add_element_text\": \"Add new tab\"}}, \"name\": \"tab_contents\", \"description\": \"The tab titles and contents.\"}], \"backend_name\": \"Tabs\", \"requires_fs\": false}, \"Image\": {\"preview_url_template\": \"/imagehandler/\u003c[explorationId]\u003e/\u003c[filepath]\u003e\", \"frontend_name\": \"image\", \"icon_data_url\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAK%0AT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AU%0AkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN/rXX%0APues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh%2BPDwrIsAHvgAB%0AeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAt%0AAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3%0AAMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dX%0ALh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP%2B%0A5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw%2BH48PEWhkLnZ2eXk%0A5NhKxEJbYcpXff5nwl/AV/1s%2BX48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd%0A0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA%0A4vcAAPK7b8HUKAgDgGiD4c93/%2B8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzA%0ABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/ph%0ACJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5%0Ah1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2B%0AQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhM%0AWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQ%0AAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIo%0AUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdp%0Ar%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZ%0AD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61Mb%0AU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%0A/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllir%0ASKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79u%0Ap%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6Vh%0AlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1%0Amz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lO%0Ak06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N/T0HDYfZDqsdWh1%2Bc7Ry%0AFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3I%0AveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE/C5%2BVMGvfrH5PQ0%2BB%0AZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV/MN8C3yLfLT8Nvnl%2BF30N/I/9k/3r/%0A0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p%0ADoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5q%0APNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIs%0AOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5%0AhCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQ%0ArAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9%0ArGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1d%0AT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaX%0ADm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7%0AvPY07NXbW7z3/T7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3S%0APVRSj9Yr60cOxx%2B%2B/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKa%0ARptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO%0A32oPb%2B%2B6EHTh0kX/i%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21%0Ae2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfV%0AP1v%2B3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF/6i%0A/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8%0AIH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq%0AYAAAOpgAABdvkl/FRgAAANNJREFUeNqk07FKA0EUBdCzScQEU9hMYy/4GWls9AfMD4QUYiFCChuL%0AiI1YLLidln6B4BcFkS2DYLc2E1gnUeLuheExb95c7rszL6uqShv0iqJoxdCLMWt4v%2BokiVssY9wK%0AKcEVhrhoSnCPT%2BT/9WCF67hAWZb1sxzvuIMQwk%2BCpDjFMc7xhWd8/NZCFy9YYBRzu3iMLzXA5V8e%0AzDDGAd5wijkOazUT7G3y4Ag3tX0frxva2ccZnlIFD9jZ0vzpmoIQwkmTr9jREisFjQcqazvO3wMA%0A9cMlpZdjmFYAAAAASUVORK5CYII%3D%0A\", \"is_complex\": false, \"is_block_element\": true, \"tooltip\": \"Insert image\", \"customization_arg_specs\": [{\"default_value\": \"\", \"schema\": {\"obj_type\": \"Filepath\", \"type\": \"custom\"}, \"name\": \"filepath\", \"description\": \"The name of the image file. (Allowed extensions: gif, jpeg, jpg, png.)\"}, {\"default_value\": \"\", \"schema\": {\"type\": \"unicode\"}, \"name\": \"caption\", \"description\": \"Caption for image (optional)\"}, {\"default_value\": \"\", \"schema\": {\"type\": \"unicode\"}, \"name\": \"alt\", \"description\": \"Alternative text (for screen readers)\"}], \"backend_name\": \"Image\", \"requires_fs\": true}, \"Video\": {\"preview_url_template\": \"https://img.youtube.com/vi/\u003c[video_id]\u003e/hqdefault.jpg\", \"frontend_name\": \"video\", \"icon_data_url\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAK%0AT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AU%0AkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN/rXX%0APues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh%2BPDwrIsAHvgAB%0AeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAt%0AAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3%0AAMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dX%0ALh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP%2B%0A5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw%2BH48PEWhkLnZ2eXk%0A5NhKxEJbYcpXff5nwl/AV/1s%2BX48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd%0A0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA%0A4vcAAPK7b8HUKAgDgGiD4c93/%2B8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzA%0ABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/ph%0ACJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5%0Ah1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2B%0AQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhM%0AWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQ%0AAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIo%0AUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdp%0Ar%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZ%0AD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61Mb%0AU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%0A/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllir%0ASKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79u%0Ap%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6Vh%0AlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1%0Amz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lO%0Ak06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N/T0HDYfZDqsdWh1%2Bc7Ry%0AFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3I%0AveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE/C5%2BVMGvfrH5PQ0%2BB%0AZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV/MN8C3yLfLT8Nvnl%2BF30N/I/9k/3r/%0A0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p%0ADoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5q%0APNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIs%0AOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5%0AhCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQ%0ArAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9%0ArGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1d%0AT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaX%0ADm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7%0AvPY07NXbW7z3/T7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3S%0APVRSj9Yr60cOxx%2B%2B/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKa%0ARptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO%0A32oPb%2B%2B6EHTh0kX/i%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21%0Ae2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfV%0AP1v%2B3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF/6i%0A/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8%0AIH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq%0AYAAAOpgAABdvkl/FRgAAAFxJREFUeNrskVEKwDAIQ%2BPYaXOgXNf9zGKZ3YT9Nj%2BWGsLDmLvjj854%0ASHIABiBmpeEhaVNAMuS5CnkS3GoTrALGguS0kFQSHAXBl%2BwtoFNJ6wYZGSvPbmG3EB/XAJZSMar4%0AdzYxAAAAAElFTkSuQmCC%0A\", \"is_complex\": false, \"is_block_element\": true, \"tooltip\": \"Insert video\", \"customization_arg_specs\": [{\"default_value\": \"\", \"schema\": {\"type\": \"unicode\"}, \"name\": \"video_id\", \"description\": \"The YouTube id for this video. This is the 11-character string after \'v=\' in the video URL.\"}, {\"default_value\": 0, \"schema\": {\"type\": \"int\", \"validators\": [{\"min_value\": 0, \"id\": \"is_at_least\"}]}, \"name\": \"start\", \"description\": \"Video start time in seconds: (leave at 0 to start at the beginning.)\"}, {\"default_value\": 0, \"schema\": {\"type\": \"int\", \"validators\": [{\"min_value\": 0, \"id\": \"is_at_least\"}]}, \"name\": \"end\", \"description\": \"Video end time in seconds: (leave at 0 to play until the end.)\"}, {\"default_value\": false, \"schema\": {\"type\": \"bool\"}, \"name\": \"autoplay\", \"description\": \"Autoplay this video once the question has loaded?\"}], \"backend_name\": \"Video\", \"requires_fs\": false}, \"Link\": {\"preview_url_template\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAK%0AT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AU%0AkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN/rXX%0APues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh%2BPDwrIsAHvgAB%0AeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAt%0AAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3%0AAMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dX%0ALh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP%2B%0A5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw%2BH48PEWhkLnZ2eXk%0A5NhKxEJbYcpXff5nwl/AV/1s%2BX48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd%0A0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA%0A4vcAAPK7b8HUKAgDgGiD4c93/%2B8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzA%0ABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/ph%0ACJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5%0Ah1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2B%0AQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhM%0AWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQ%0AAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIo%0AUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdp%0Ar%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZ%0AD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61Mb%0AU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%0A/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllir%0ASKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79u%0Ap%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6Vh%0AlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1%0Amz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lO%0Ak06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N/T0HDYfZDqsdWh1%2Bc7Ry%0AFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3I%0AveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE/C5%2BVMGvfrH5PQ0%2BB%0AZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV/MN8C3yLfLT8Nvnl%2BF30N/I/9k/3r/%0A0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p%0ADoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5q%0APNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIs%0AOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5%0AhCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQ%0ArAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9%0ArGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1d%0AT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaX%0ADm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7%0AvPY07NXbW7z3/T7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3S%0APVRSj9Yr60cOxx%2B%2B/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKa%0ARptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO%0A32oPb%2B%2B6EHTh0kX/i%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21%0Ae2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfV%0AP1v%2B3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF/6i%0A/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8%0AIH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq%0AYAAAOpgAABdvkl/FRgAAAPRJREFUeNrs0iFLQ2EUxvHfe%2B%2B1C/oVbtBkEwVBMMhmWln1U5gM2tdX%0AbMYV2waiQQTRJgxmWPEDKKy7u9dygmUYFiweOJxznufPE17elHO2ShVWrL8PqPr9PuzhEvuhP%2BEC%0Az3Ev9SscYYhPXAfQwQPacS/1K/Twjt3pdDrDTkppsyzLTtM0t1CWZdM0zWPO%2BQqvdV2f4wW9AlsY%0AYRbpo5xzdz6fr%2BWci5xzEXs3OMEOsV3gDS2sh9lKKQ2qqvpKKS1SSovYB8EJto1JhbNIm9R1fRPA%0AATKOYw5D%2B/jxBhs4KXCPQ4xxGj0O7e43P/1/5dUDvgcAxfNbLF3L5REAAAAASUVORK5CYII%3D%0A\", \"frontend_name\": \"link\", \"icon_data_url\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAK%0AT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AU%0AkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN/rXX%0APues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh%2BPDwrIsAHvgAB%0AeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAt%0AAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3%0AAMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dX%0ALh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP%2B%0A5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw%2BH48PEWhkLnZ2eXk%0A5NhKxEJbYcpXff5nwl/AV/1s%2BX48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd%0A0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA%0A4vcAAPK7b8HUKAgDgGiD4c93/%2B8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzA%0ABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/ph%0ACJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5%0Ah1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2B%0AQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhM%0AWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQ%0AAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIo%0AUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdp%0Ar%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZ%0AD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61Mb%0AU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%0A/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllir%0ASKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79u%0Ap%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6Vh%0AlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1%0Amz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lO%0Ak06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N/T0HDYfZDqsdWh1%2Bc7Ry%0AFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3I%0AveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE/C5%2BVMGvfrH5PQ0%2BB%0AZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV/MN8C3yLfLT8Nvnl%2BF30N/I/9k/3r/%0A0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p%0ADoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5q%0APNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIs%0AOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5%0AhCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQ%0ArAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9%0ArGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1d%0AT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaX%0ADm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7%0AvPY07NXbW7z3/T7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3S%0APVRSj9Yr60cOxx%2B%2B/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKa%0ARptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO%0A32oPb%2B%2B6EHTh0kX/i%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21%0Ae2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfV%0AP1v%2B3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF/6i%0A/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8%0AIH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq%0AYAAAOpgAABdvkl/FRgAAAPRJREFUeNrs0iFLQ2EUxvHfe%2B%2B1C/oVbtBkEwVBMMhmWln1U5gM2tdX%0AbMYV2waiQQTRJgxmWPEDKKy7u9dygmUYFiweOJxznufPE17elHO2ShVWrL8PqPr9PuzhEvuhP%2BEC%0Az3Ev9SscYYhPXAfQwQPacS/1K/Twjt3pdDrDTkppsyzLTtM0t1CWZdM0zWPO%2BQqvdV2f4wW9AlsY%0AYRbpo5xzdz6fr%2BWci5xzEXs3OMEOsV3gDS2sh9lKKQ2qqvpKKS1SSovYB8EJto1JhbNIm9R1fRPA%0AATKOYw5D%2B/jxBhs4KXCPQ4xxGj0O7e43P/1/5dUDvgcAxfNbLF3L5REAAAAASUVORK5CYII%3D%0A\", \"is_complex\": false, \"is_block_element\": false, \"tooltip\": \"Insert link\", \"customization_arg_specs\": [{\"default_value\": \"https://www.example.com\", \"schema\": {\"obj_type\": \"SanitizedUrl\", \"type\": \"custom\"}, \"name\": \"url\", \"description\": \"The link URL. If no protocol is specified, HTTPS will be used.\"}, {\"default_value\": \"\", \"schema\": {\"type\": \"unicode\"}, \"name\": \"text\", \"description\": \"The link text. If left blank, the link URL will be used.\"}], \"backend_name\": \"Link\", \"requires_fs\": false}, \"Math\": {\"preview_url_template\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAdhAAAHYQGVw7i2AAAK%0AT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AU%0AkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN/rXX%0APues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh%2BPDwrIsAHvgAB%0AeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAt%0AAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3%0AAMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dX%0ALh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP%2B%0A5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw%2BH48PEWhkLnZ2eXk%0A5NhKxEJbYcpXff5nwl/AV/1s%2BX48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd%0A0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA%0A4vcAAPK7b8HUKAgDgGiD4c93/%2B8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzA%0ABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/ph%0ACJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5%0Ah1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2B%0AQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhM%0AWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQ%0AAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIo%0AUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdp%0Ar%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZ%0AD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61Mb%0AU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%0A/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllir%0ASKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79u%0Ap%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6Vh%0AlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1%0Amz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lO%0Ak06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N/T0HDYfZDqsdWh1%2Bc7Ry%0AFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3I%0AveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE/C5%2BVMGvfrH5PQ0%2BB%0AZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV/MN8C3yLfLT8Nvnl%2BF30N/I/9k/3r/%0A0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p%0ADoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5q%0APNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIs%0AOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5%0AhCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQ%0ArAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9%0ArGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1d%0AT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaX%0ADm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7%0AvPY07NXbW7z3/T7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3S%0APVRSj9Yr60cOxx%2B%2B/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKa%0ARptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO%0A32oPb%2B%2B6EHTh0kX/i%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21%0Ae2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfV%0AP1v%2B3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF/6i%0A/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8%0AIH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq%0AYAAAOpgAABdvkl/FRgAAAG5JREFUeNqkU8ENACEIE%2BK0HYh1uZeGeBhA%2BhNpbSGSqo4OZpUgIvtF%0AAMQvZAC0ziUHi2jBL7mtk3nLdqufMchuIWq29%2BEWvOZwBl6DV0sPMSL/BDzbaQGPnBFkz3bG%2BhYQ%0AET3XVXFB3d/Io4lvALiqS97J4oUVAAAAAElFTkSuQmCC%0A\", \"frontend_name\": \"math\", \"icon_data_url\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAdhAAAHYQGVw7i2AAAK%0AT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AU%0AkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN/rXX%0APues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh%2BPDwrIsAHvgAB%0AeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAt%0AAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3%0AAMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dX%0ALh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP%2B%0A5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw%2BH48PEWhkLnZ2eXk%0A5NhKxEJbYcpXff5nwl/AV/1s%2BX48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd%0A0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA%0A4vcAAPK7b8HUKAgDgGiD4c93/%2B8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzA%0ABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/ph%0ACJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5%0Ah1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2B%0AQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhM%0AWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQ%0AAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIo%0AUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdp%0Ar%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZ%0AD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61Mb%0AU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%0A/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllir%0ASKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79u%0Ap%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6Vh%0AlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1%0Amz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lO%0Ak06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N/T0HDYfZDqsdWh1%2Bc7Ry%0AFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3I%0AveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE/C5%2BVMGvfrH5PQ0%2BB%0AZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV/MN8C3yLfLT8Nvnl%2BF30N/I/9k/3r/%0A0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p%0ADoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5q%0APNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIs%0AOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5%0AhCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQ%0ArAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9%0ArGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1d%0AT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaX%0ADm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7%0AvPY07NXbW7z3/T7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3S%0APVRSj9Yr60cOxx%2B%2B/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKa%0ARptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO%0A32oPb%2B%2B6EHTh0kX/i%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21%0Ae2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfV%0AP1v%2B3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF/6i%0A/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8%0AIH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq%0AYAAAOpgAABdvkl/FRgAAAG5JREFUeNqkU8ENACEIE%2BK0HYh1uZeGeBhA%2BhNpbSGSqo4OZpUgIvtF%0AAMQvZAC0ziUHi2jBL7mtk3nLdqufMchuIWq29%2BEWvOZwBl6DV0sPMSL/BDzbaQGPnBFkz3bG%2BhYQ%0AET3XVXFB3d/Io4lvALiqS97J4oUVAAAAAElFTkSuQmCC%0A\", \"is_complex\": false, \"is_block_element\": false, \"tooltip\": \"Insert mathematical formula\", \"customization_arg_specs\": [{\"default_value\": \"\\\\frac{x}{y}\", \"schema\": {\"obj_type\": \"MathLatexString\", \"type\": \"custom\"}, \"name\": \"raw_latex\", \"description\": \"The raw string to be displayed as LaTeX.\"}], \"backend_name\": \"Math\", \"requires_fs\": false}}'), | |
| SYSTEM_USERNAMES: JSON.parse('[\"admin\", \"OppiaMigrationBot\"]'), | |
| SUPPORTED_SITE_LANGUAGES: JSON.parse( | |
| '{\"en\": \"English\", \"pt\": \"Portugu\\u00eas\", \"vi\": \"Ti\\u1ebfng Vi\\u1ec7t\", \"hi\": \"\\u0939\\u093f\\u0928\\u094d\\u0926\\u0940\", \"id\": \"Bahasa Indonesia\", \"es\": \"Espa\\u00f1ol\"}'), | |
| userIsLoggedIn: JSON.parse('true') | |
| }; | |
| </script> | |
| <!--[if lt IE 9]> | |
| <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> | |
| <![endif]--> | |
| <!--[if gte IE 9]><!--> | |
| <!-- jquery.js, angular.js and jquery-ui.js are removed from bundled js because they need to be at the header. Including | |
| bundled js at the header will block rendering.--> | |
| <script src="/third_party/static/jquery-2.1.1/jquery.min.js"> | |
| </script> | |
| <!--<![endif]--> | |
| <script src="/third_party/static/jqueryui-1.10.3/jquery-ui.min.js"> | |
| </script> | |
| <script src="/third_party/static/angularjs-1.4.7/angular.min.js"></script> | |
| <script src="/third_party/static/jquery-ui-touch-punch-0.3.1/jquery.ui.touch-punch-improved.js"></script> | |
| <!-- See http://docs.mathjax.org/en/latest/start.html#mathjax-cdn --> | |
| <script type="text/x-mathjax-config"> | |
| MathJax.Hub.Config({ | |
| skipStartupTypeset: true, | |
| messageStyle: 'none', | |
| 'HTML-CSS': { | |
| showMathMenu: false | |
| } | |
| }); | |
| MathJax.Hub.Configured(); | |
| </script> | |
| <script src="/third_party/static/MathJax-2.6.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> | |
| </head> | |
| <body> | |
| <div class="oppia-base-container" ng-class="{'oppia-sidebar-menu-open': sidebarIsShown, 'oppia-sidebar-menu-closed': !sidebarIsShown}" ng-swipe-left="closeSidebarOnSwipe()" ng-swipe-right="openSidebarOnSwipe()"> | |
| <div class="oppia-content-container"> | |
| <div id="wrapper"> | |
| <div class="oppia-main-body"> | |
| <!-- Top navigation. --> | |
| <nav class="navbar navbar-default oppia-navbar oppia-prevent-selection" role="navigation"> | |
| <div class="navbar-container"> | |
| <div class="navbar-header protractor-test-navbar-header pull-left"> | |
| <a ng-if="windowIsNarrow" ng-click="openSidebar()" class="navbar-brand oppia-navbar-menu oppia-transition-200"> | |
| <i class="material-icons oppia-navbar-menu-icon"></i> | |
| </a> | |
| <a class="oppia-navbar-brand-name oppia-transition-200" href="/" focus-on="<[LABEL_FOR_CLEARING_FOCUS]>"> | |
| <img ng-src="<[getStaticImageUrl('/logo/288x128_logo_white.png')]>" class="oppia-logo" ng-class="windowIsNarrow ? 'oppia-logo-small' : 'oppia-logo-wide'"> | |
| </a> | |
| <!-- This is needed for the correct image to appear when an exploration is shared using G+. --> | |
| <a style="display: none;"> | |
| <img ng-src="<[getStaticImageUrl('/logo/288x128_logo_mint.png')]>" itemprop="image"> | |
| </a> | |
| </div> | |
| <div ng-cloak class="navbar-header pull-right"> | |
| <ul class="nav oppia-navbar-nav oppia-navbar-profile"> | |
| <li class="dropdown pull-right"> | |
| <a class="dropdown-toggle oppia-navbar-dropdown-toggle" data-toggle="dropdown" ng-mouseover="onMouseoverProfilePictureOrDropdown($event)" ng-mouseleave="onMouseoutProfilePictureOrDropdown($event)"> | |
| <div class="oppia-navbar-profile-picture-container" ng-cloak> | |
| <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEwAAABMCAYAAADHl1ErAAAAAXNSR0IArs4c6QAADhtJREFUeAHt%0AXHlwVdUZ/859jyxmIQESyCaglC0iAgkJIntrIpvKphSwY2ttxbFOp9R/cGGqdhykLaMVO2OtoyRS%0ACEKNEpYKyBIVQ1iNkBhNMCtb8shiQpJ3b7/fTW7m5uUlecu9L4nTM5Pce8895zvf93vnnPud833f%0AEdQLKXb5jsC6%2BuZERZbHKaSMYRbGKERxgpQQUkSIIigEbAmFavlfrUKiVhCVcFa%2BIJEvJOlCcNCA%0AnNKMFQ0o58vEfPgmhS5Mn0ot8n2KIs8lIZJJUfy8almIJqbxhRDSIbJKe2s%2BXvWlV/RcrGwqYGGp%0A20bI1LyaeVmjKMrodp4EycGBAy6MjgsrSxozqG7O5GgxcVREeEigNDAwwBpmsUiRKGu3y1caGlts%0AtQ3yjbOFV6sPnypXTuRXBReU2GLqGprHkUKSRlMIUcD3WyUakGbbt7JYyzf6agpgYfe9O8kui/U8%0AnB7UhJIkUTljwrBTTz449mZKUlyCEBTnjTCKQiX7T5ScfGP3Rf9j5ysny7IyTKXHPwYP690WSXnZ%0AtvcXp71pw1ldQwELm59%2BlyzbX%2BbeNL%2Btscb4EYOyNz2ZWD99wtAFnGdxxoQBefbs85f3rHsjJyiv%0AuGo60wsATe51WZJkWW/LWnXGgDZUEoYAFr58x0B7beOLPHGv5XnFIpGoS0mKOfze%2Bpmj/f2smNR9%0Alm42teQ/8vLRgv0nyuZwVwtm1Ows5BZLSMBz1RkrbnjLiNeAhaWmPWgn%2BxYeejwkRMu9idH7tm%2BY%0AE8/z0EhvmfOmPs9/RQ9tOJx3IKc8lUixkqBKC1nW2vat3u0NXY8Bi1%2B%2Bw6%2BktnETD7%2BnwEB4iP/p%0AL/5xf03U4IBZ3jBkdN2K641Hkn/7YWh17c1JoM3D9PW4kIB1eRkrmjxpyyPAeK4aLttbPuAhOIU5%0AaHpm1cTMZ1ffuRT8eMKED%2BooL6Wd%2B2Bj%2BtnFUGeYyVzJYl3Kc9sld9t2W8Dw%2BWkTWuz2fdxQ9ACr%0A9P3Jfy7%2BZuSw0HnuNtwb5Ysqaw4mPJb5k%2BYW%2BVZuv9xqsaRWZ60%2B7w4vbgEWnrJ1hp3kTO5ZYUPC%0AAnK%2B3bYiitWDWHca7O2yrI6U3r5yR8U1W2MiC2%2BzkLS4ev%2BaY67y1a749VQBYLUIZT/AGhUTduS7%0Af68Y39/AgozgGbxDBsgCmSBbT/Jr710CDMMQPYvHf2DC2Mj9p95efA8TCNKI9MNrEGSALJAJskFG%0AV%2BTocUhigrfbWz5jYtH4VdrAMksBdYVnI8vYJ/8q83hhmW0WEy23WKx39/Qh6LaHQXXA1xBgYc5i%0AsBL4/scCFoC3QCbIBhkhK2TGi65St4CpeharDvgaYoJnIv15GHaFQRBkg4w8p02BzF0VRH6XgEGD%0AV5VS1rOgOvTHCb47wfXvIBtkhE4JmSG7/r3%2B3ilg6toQyx1OUEr7i56lF8zde8gIWVEPSz1g4IyG%0AU8CwkMbaEMudNg3eWd0fXR5khcyQXcXAiYSdAMMWDY/ltVhIY23IdXr8kjqh21%2BzRKvMogUYAAtH%0AQToBhv0sbNFg16GvLaQdmTfjGTJDdmCgYuHQSIfe07pTSqewn3V9z6qrvb1F48Crzx6xNTR4QXoE%0A9tN4c2%2ByfufWqudC3VbmAYzNPwZrkf6dL%2B4LSm5Q9vkrVH79B6qs%2BoH8B1goatAtNCIqmOZOiabw%0A4G5VJMNYREdhDD7ae6J0USsmtEwj3t7DYLCwK83f8WbbzauZP7/kq53SxiY7vfmfC5R24Fv6prTr%0ADVEWgqbfEUlPLY2nlKkxGv%2BmXbFzG7H4/eE8g/tZyO92zbDSPoe1WncUgT14X4G189Nimvjobnrh%0AX6e6BQuo8DCho2crafnzB2n%2BMwe4PL5H5iVgACx4wEltli%2B1sXbA%2BGkNcmCwUN%2BY%2BI%2B3WOjZt3Lp%0Al68cpQoefu6m4%2Bcqae7TWfTfk%2BXuVnWrvA4LFRtUVockjKxKc8sJmMJsWWsiON/U9eJvNmXTtk%2B%2B%0AdYt5Z4WZX0p/bjYtmBbn7LURefaw%2BVuvwoQnBliTYCxu7WFskQb1WROjcvliKlibM/IMAQv8siD0%0A643H6etiGx7NSBbYUlXCbRipgKnme859Ysl4jwwDrnKaV2SjDe%2B0tu9qnZ7KsQWch/YxVpt6KunZ%0AexieUVPDSIJjCC86k3lwyikJ0di%2BMS09/3au2iuMbuDr4mpKN2CIO%2BMLVnpgA4yAlVRX1ziV4fOD%0ArwOv2k2bDM4UVvEkXeaMJ0PyXn3/nCF0HIkAE2ADjICVpChiLArBMcSxsJHPmdmXjCTXiVZRRS19%0AVVTdKd%2BIDA0bYCW1%2BWcRvGiMIN4Vjb1flHb1yrD8rM9LDKOlJ6RhA6ww6au%2BD3A50hcy%2Bt5sRRP8%0AFpSYo8zqsBnDPax13oJ/ltEgafSqam5SU7NdezTtWsHrTzOShg2wYtWP3SQ5wZnNjMZA80Z9s1mk%0AO9CtMakdDRtgJcGnFK3C869D6wY%2BRISp7loGUnROKtKkdtqxYawkzQGXdwNUN0nnrHiXGxxoJf40%0Ae0fEhdpRg29xoZT7RTRsgJV%2B8e0%2BJTdqJIwd4kZpz4pOGWN%2BG5Lq2s38wQHXMzZdq2XiAlllgP2%2B%0AaH6yOX4xGjbAinejlVq0CG9l10T3rNT99wwnf96KMyvNuHMoDR0UaAr5dmwYK1YrhAoYXLtNaa2N%0A6DAW5vFF6qLClGZeeHSyKXRBVMMGWLFaoUZYEPzgTWuxjfC6lROI/RgMb2bZ7JGUaOIcqWEDrDDp%0A50MCBA0YLokDQRgx0p%2BdTezH4PDG88dxI8LotaeneU7AhZo6bPK5hwkVMERYuFDX6yLT2JDx99/f%0ATVY2anibYiOCaPuGuayydDB%2BeUu2U30NG2AlCaFcRAmEo3QqaVLGynm30a6X5sHz2uMWksZH0pHX%0AF9CIYeb/zho2CAqTgoMDvoTXCmJ3EI7isQRuVpw9KYqytyykhxk8qASuJoD84mNTKGvjveSLFQQw%0AUeOaGCNE0Flqvs5o8b/9gZ8xwyMmj404NComZJyrzHtbLjTIjxZNv1X9C/S30pXqRrLVdd4lh7Ej%0AOX4oPfHAOHrzD9Np9l1RZMHnygeJ45kOZXxaPJ6byr6WueotdfAjhI73rGdu2ZXnn5oY7QM2OjZx%0Ax8hw%2BvPjCepf2bUfqJz/Llc1qHpb1OBAiosMpoFB5i%2BtOnLV%2BoTgL9ypYYZ8bZ0tOd6QmuUNbCiF%0AMoN9GPM0TCbeXYoZcgvhr48kOyLlVF6AESf1UwV7G88jBbC/ISqsjzDb62wAC9UmydhoAaz6b/tW%0AcIgQul7ntI8woMNCxQZstQOGSFYeqQriDeGI0Ud47jU2gIEae8kmtlZsWllpB6zNO2UXZwcg3rDX%0AOO0jDbdhEIDoXs1zB6y1A4YHhP3iiuBMOJXh3tfJzuZ/qBbfX65nR5UGqmto8TUL2OoqAgZoWMNE%0AY6KTMhOa%2Bt4ehCDfmxjz8c4X5y3UChp5hVk/j63Vpwuu0zdlNVTIrkuFfC1hkOobO%2B//Qw8LD/an%0A26JDaFRsKI2KCWU76kCaOi6CoHYYnZY9d/DjAzllC/lDmFWz75EFevqdFmGIkbbL9hREsiI40yg/%0A11wGhxex9PlXV%2BjEhatUU99ZQdUzpr%2BH08n1mkb1L%2BfiVf0rGs5Lo2nxkXT3HUPZ0S7WawAhsxrF%0Ay6HPwKJDY/zQqYehAPey1%2BDgDxfsSxkPwZPYaTmU7S7BPWDXkWLafayYLlWaaidW2cASK5nBWzJz%0AOD3AG5YebCgqw5dvP4PoXab1Oveu3znK5xQIOPW31DZchL/6M6vv2sn%2B68scK3b1jDlo%2B6Hv6G87%0A8ij/e1M3cbtiQc3HML4vKZbWrbyTpowe3G1Z7SVH7e7cmHZmGXePSmtI4FhnQfVOAQMBNfhdse/C%0AwvzsO/cf6ykapKlZpq0HCmlzxlc%2B6U2akK5c2XJNf3x4At3D29hdJUTrTnz0wxlwOrEIy5Kugum7%0ABAyEtaGJwKVrH63mrSDn0besEdNTmz9XJ%2B6uGOoL%2BbAr/OXJJIoM77jryx%2Bh0iGL0mSENnc1FDX%2B%0AO6gVWqZ2RfQ9I5oLQgj75fxO/q%2BvpJ9TnXTxlevr6cPjlyj5iUx2bb%2BsZ7UesqlgsayQWf/S8b7b%0AHobC3QWYrv3rZ%2BwuXuhIs88/Y4v8vfWz4BvrdoBpj4BBejWE2W4/yupTGMJ%2BD21O/emf3j1t2bTN%0ArYD8PgWkv7/FflvUwE8uFFelMAg2i8Uy05UTBlwCTAWtLUieJ8XA2MiQIxXX6xNYI%2B6XC3Wep%2Br5%0Axz/Jsszij1qDVREprp4s4DJgGmjaMQzcUA5bgaNkRTbH3GxSf5SEVMoxRBUMlrnHMIB//Arounxb%0AjgZZuWWtSzlokmyGkwWv4Bm8QwZ1GLpxZgUYcquHaRLgQ6A/SobJ4IiGpeyc7RE9ja55V/aKEOID%0A5s/3R8loQjkeVsTzwmmeF2oYuFlamT5xFeII/4qh3LMmgR/oWT4/rEgPhONxWEKifUJW4mWikfpy%0Avr5nBbNIkUQeD8BU7lm9fxyWHgDHA9fYQlzHg/0w/6qjuZzqdKwvb/J9PveiAl4Hz%2BE5q%2B8duKYX%0AHjHSjkf6sXkqWyEZK4QFLIQ51iihWrr2CJKCeE6fzm2pax8Grm8e6acHDffth0YSLdF9CCoZvFye%0A55okRU7gIetV1AkPuRJZSCfZUdefezJMYf3v0MhOwHVzLKlQxAWSRJlQlDr%2BzrPcUjjbGwbyBB2m%0ACKH62/K7KwywjWM8b5CQq%2BH9x%2B%2BCSVZiFKH8eI4ldQQOz4jJ/P/Bt86QcSFPPVqZA50Qu4NwFK7i%0A3tHK7HEEJ5reOFr5fwkK97jkk8ywAAAAAElFTkSuQmCC%0A" class="oppia-navbar-profile-picture img-circle"> | |
| <span class="caret" style="margin-top: 10px;"></span> | |
| <div class="oppia-navbar-dashboard-indicator ng-cloak" ng-if="numUnseenNotifications > 0"> | |
| <span class="oppia-navbar-dashboard-indicator-text"> | |
| <[numUnseenNotifications]> | |
| </span> | |
| </div> | |
| <div style="display: none;" class="oppia-user-email"> | |
| owner1@example.com | |
| </div> | |
| </div> | |
| </a> | |
| <ul class="dropdown-menu ng-cloak oppia-navbar-dropdown" role="menu" ng-mouseover="onMouseoverProfilePictureOrDropdown($event)" ng-mouseleave="onMouseoutProfilePictureOrDropdown($event)" ng-show="profileDropdownIsActive"> | |
| <li> | |
| <a ng-click="onMouseoutProfilePictureOrDropdown($event)" href="/profile/owner1"> | |
| <strong>owner1</strong> | |
| </a> | |
| </li> | |
| <hr class="oppia-top-right-menu-item-separator"> | |
| <li> | |
| <a ng-click="onMouseoutProfilePictureOrDropdown($event)" href="/dashboard"> | |
| <span translate="I18N_TOPNAV_DASHBOARD"></span> | |
| </a> | |
| </li> | |
| <li> | |
| <a ng-click="onMouseoutProfilePictureOrDropdown($event)" href="/notifications_dashboard"> | |
| <span translate="I18N_TOPNAV_NOTIFICATIONS"></span> | |
| <span ng-if="numUnseenNotifications > 0"> | |
| (<[numUnseenNotifications]>) | |
| </span> | |
| </a> | |
| </li> | |
| <li> | |
| <a ng-click="onMouseoutProfilePictureOrDropdown($event)" href="/preferences"> | |
| <span translate="I18N_TOPNAV_PREFERENCES"></span> | |
| </a> | |
| </li> | |
| <hr class="oppia-top-right-menu-item-separator"> | |
| <li> | |
| <a ng-click="onMouseoutProfilePictureOrDropdown($event)" href="/logout?return_url=http%3A%2F%2Flocalhost%2Fdashboardhandler%2Fdata"> | |
| <span translate="I18N_TOPNAV_LOGOUT"></span> | |
| </a> | |
| </li> | |
| </ul> | |
| </li> | |
| </ul> | |
| <ul class="nav oppia-navbar-nav"> | |
| <ul ng-if="windowIsNarrow" class="nav oppia-navbar-tabs-narrow"> | |
| <create-activity-button></create-activity-button> | |
| </ul> | |
| <ul ng-if="!windowIsNarrow" class="nav oppia-navbar-tabs"> | |
| <create-activity-button></create-activity-button> | |
| <li> | |
| <div class="pull-right oppia-navbar-button-container"> | |
| <a href="/donate" class="btn oppia-navbar-button oppia-navbar-hide-on-small-width protractor-test-create-activity oppia-transition-200" | |
| <span translate="I18N_TOPNAV_DONATE"></span> | |
| </a> | |
| </div> | |
| </li> | |
| <li class="dropdown oppia-navbar-clickable-dropdown pull-right"> | |
| <a class="oppia-navbar-tab"> | |
| <span translate="I18N_TOPNAV_ABOUT"></span> | |
| <span class="caret"></span> | |
| </a> | |
| <ul class="dropdown-menu oppia-navbar-dropdown" ng-mouseover="onMouseoverDropdownMenu($event)" ng-mouseleave="onMouseoutDropdownMenu($event)"> | |
| <li><a href="/about" translate="I18N_TOPNAV_ABOUT_OPPIA"></a></li> | |
| <li><a href="/teach" translate="I18N_TOPNAV_TEACH_WITH_OPPIA"></a></li> | |
| <li><a href="https://oppiablog.blogspot.com" translate="I18N_TOPNAV_BLOG" target="_blank"></a></li> | |
| <li><a href="/forum" translate="I18N_TOPNAV_FORUM"></a></li> | |
| <li><a href="/contact" translate="I18N_TOPNAV_CONTACT_US"></a></li> | |
| </ul> | |
| </li> | |
| <li class="oppia-clickable-navbar-element pull-right"> | |
| <a class="oppia-navbar-tab" href="/library" translate="I18N_TOPNAV_LIBRARY"></a> | |
| </li> | |
| </ul> | |
| </ul> | |
| </div> | |
| <div class="collapse navbar-collapse ng-cloak"> | |
| </div> | |
| </div> | |
| </nav> | |
| <div class="oppia-top-of-page-padding"> | |
| </div> | |
| <div ng-cloak> | |
| <div class="oppia-toast-container toast-top-center"> | |
| <div ng-repeat="warning in (alertsService.warnings | limitTo:5) track by $index" class="toast toast-warning oppia-toast"> | |
| <button type="button" class="toast-close-button" ng-click="alertsService.deleteWarning(warning)" role="button">×</button> | |
| <div class="toast-message"> | |
| <[warning.content]> | |
| </div> | |
| </div> | |
| </div> | |
| <div> | |
| <div ng-repeat="message in alertsService.messages track by $index"> | |
| <alert-message message-object="message" message-index="$index"></alert-message> | |
| </div> | |
| </div> | |
| <div ng-show="loadingMessage" class="oppia-loading-fullpage"> | |
| <div class="oppia-align-center"> | |
| <span translate="<[loadingMessage]>"></span> | |
| <span class="oppia-loading-dot-one">.</span> | |
| <span class="oppia-loading-dot-two">.</span> | |
| <span class="oppia-loading-dot-three">.</span> | |
| </div> | |
| </div> | |
| <div ng-show="!loadingMessage"> | |
| <div class="oppia-content" ng-controller="Error"> | |
| <br> | |
| <div class="oppia-wide-panel oppia-error-wide-container"> | |
| <div class="oppia-wide-panel-content protractor-test-error-container"> | |
| <h4> | |
| <span translate="I18N_ERROR_HEADER_500"></span> | |
| - System Error | |
| </h4> | |
| <br> | |
| <img ng-src="<[oopsMintImgUrl]>" alt="Oops!" width="299" height="142"/> | |
| <p><h3> | |
| <h3 translate="I18N_ERROR_MESSAGE_500"></h3> | |
| </p> | |
| <p><span translate="I18N_ERROR_NEXT_STEPS" translate-values="{issueTrackerUrl: 'https://github.com/oppia/oppia/issues/new', homeUrl: '/'}"></span></p> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="oppia-footer-padding"> | |
| </div> | |
| <footer class="oppia-footer"> | |
| <div class="oppia-footer-container"> | |
| <div class="row"> | |
| <div class="col-sm-3"> | |
| <h4 translate="I18N_FOOTER_ABOUT_ALL_CAPS"></h4> | |
| <ul> | |
| <li><a href="/about" translate="I18N_FOOTER_ABOUT"></a></li> | |
| <li><a href="/about#foundation" translate="I18N_FOOTER_OPPIA_FOUNDATION"></a></li> | |
| <li><a href="/terms" translate="I18N_FOOTER_TERMS_OF_SERVICE"></a></li> | |
| <li><a href="/privacy" translate="I18N_FOOTER_PRIVACY_POLICY"></a></li> | |
| <li><a href="/contact" translate="I18N_FOOTER_CONTACT_US"></a></li> | |
| </ul> | |
| </div> | |
| <div class="col-sm-3"> | |
| <h4 translate="I18N_FOOTER_TEACH_LEARN_ALL_CAPS"></h4> | |
| <ul> | |
| <li><a href="/teach#teach" translate="I18N_FOOTER_TEACH"></a></li> | |
| <li><a href="/teach#playbook" translate="I18N_FOOTER_PARTICIPATION_PLAYBOOK"></a></li> | |
| <li><a href="/library" translate="I18N_FOOTER_BROWSE_LIBRARY"></a></li> | |
| <li><a href="/forum" translate="I18N_FOOTER_FORUM"></a></li> | |
| </ul> | |
| </div> | |
| <div class="col-sm-3"> | |
| <h4 translate="I18N_FOOTER_CONTRIBUTE_ALL_CAPS"></h4> | |
| <ul> | |
| <li><a href="/contact" translate="I18N_FOOTER_GET_INVOLVED"></a></li> | |
| <li><a href="/donate" translate="I18N_FOOTER_DONATE"></a></li> | |
| <li><a href="/about#credits" translate="I18N_FOOTER_CREDITS"></a></li> | |
| </ul> | |
| </div> | |
| <div class="col-sm-3"> | |
| <h4><span translate="I18N_LANGUAGE_FOOTER_VIEW_IN"></span></h4> | |
| <ul ng-controller="I18nFooter"> | |
| <select ng-model="currentLanguageCode" | |
| ng-change="changeLanguage()" | |
| ng-options="langCode as langName for (langCode, langName) in supportedSiteLanguages" | |
| class="protractor-test-i18n-language-selector" | |
| style="color: black;"> | |
| </select> | |
| </ul> | |
| </div> | |
| </div> | |
| </div> | |
| </footer> | |
| </div> | |
| </div> | |
| </div> | |
| <noscript> | |
| <div class="oppia-page-cards-container"> | |
| <div class="md-default-theme oppia-page-card oppia-long-text"> | |
| <h2> | |
| <span translate="I18N_SPLASH_JAVASCRIPT_ERROR_TITLE"></span> | |
| <i class="material-icons"></i> | |
| </h2> | |
| <p translate="I18N_SPLASH_JAVASCRIPT_ERROR_DESCRIPTION" | |
| translate-values="{hrefUrl: 'http://www.enable-javascript.com/'}"></p> | |
| <p translate="I18N_SPLASH_JAVASCRIPT_ERROR_THANKS"></p> | |
| </div> | |
| </div> | |
| </noscript> | |
| <nav class="oppia-sidebar-menu" ng-controller="SideNav" ng-class="{'oppia-sidebar-menu-transition': pageHasLoaded}"> | |
| <div class="oppia-sidebar-header"> | |
| <div class="oppia-sidebar-logo-container"> | |
| </div> | |
| </div> | |
| <ul> | |
| <li > | |
| <a href="/library"> | |
| <i class="material-icons oppia-sidebar-menu-icon"></i> | |
| <span translate="I18N_SIDEBAR_LIBRARY_LINK"></span> | |
| </a> | |
| </li> | |
| <li > | |
| <a href="/about"> | |
| <i class="material-icons oppia-sidebar-menu-icon"></i> | |
| <span translate="I18N_SIDEBAR_ABOUT_LINK"></span> | |
| </a> | |
| </li> | |
| <li > | |
| <a href="/teach"> | |
| <i class="material-icons oppia-sidebar-menu-icon"></i> | |
| <span translate="I18N_SIDEBAR_TEACH_WITH_OPPIA"></span> | |
| </a> | |
| </li> | |
| <li > | |
| <a href="/donate"> | |
| <i class="material-icons oppia-sidebar-menu-icon"></i> | |
| <span translate="I18N_SIDEBAR_DONATE"></span> | |
| </a> | |
| </li> | |
| <li> | |
| <a href="https://oppiablog.blogspot.com" target="_blank"> | |
| <img ng-src="<[getStaticImageUrl('/sidebar/blogger.png')]>" class="oppia-sidebar-menu-icon"> | |
| <span translate="I18N_SIDEBAR_BLOG"></span> | |
| </a> | |
| </li> | |
| <li > | |
| <a href="/contact"> | |
| <i class="material-icons oppia-sidebar-menu-icon"></i> | |
| <span translate="I18N_SIDEBAR_CONTACT_US"></span> | |
| </a> | |
| </li> | |
| </ul> | |
| <div class="oppia-sidebar-footer"> | |
| <div> | |
| <span="I18N_SIDEBAR_FOLLOW_US"></span>: | |
| </div> | |
| <a href="https://plus.google.com/109898456505810251700/about" target="_blank"> | |
| <img ng-src="<[getStaticImageUrl('/social/gplus.png')]>"> | |
| </a> | |
| <a href="https://www.youtube.com/channel/UC5c1G7BNDCfv1rczcBp9FPw" target="_blank"> | |
| <img ng-src="<[getStaticImageUrl('/social/youtube.png')]>"> | |
| </a> | |
| <a href="https://www.facebook.com/oppiaorg" target="_blank"> | |
| <img ng-src="<[getStaticImageUrl('/social/fb.png')]>"> | |
| </a> | |
| <a href="https://twitter.com/oppiaorg" target="_blank"> | |
| <img ng-src="<[getStaticImageUrl('/social/twitter.png')]>"> | |
| </a> | |
| </div> | |
| </nav> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="oppia-dev-mode"> | |
| Dev Mode | |
| </div> | |
| <script type="text/ng-template" id="components/imageUploader"> | |
| <style> | |
| .image-uploader-drop-area { | |
| background: #eee; | |
| height: 200px; | |
| width: 100%; | |
| } | |
| .image-uploader-text { | |
| color: #888; | |
| font-size: 2em; | |
| height: 100%; | |
| margin: 0 auto; | |
| padding-top: 80px; | |
| text-align: center; | |
| width: 100%; | |
| } | |
| .image-uploader-is-active { | |
| background: red; | |
| } | |
| .image-uploader-file-input-container { | |
| margin-top: 20px; | |
| } | |
| .image-uploader-file-input { | |
| margin-top: 10px; | |
| } | |
| </style> | |
| <div class="image-uploader-drop-area"> | |
| <div class="image-uploader-text" translate="I18N_DIRECTIVES_DRAG_IMAGE_HERE"></div> | |
| </div> | |
| <div class="image-uploader-file-input-container"> | |
| <span translate="I18N_DIRECTIVES_OR_SELECT_FILE"></span> | |
| <input type="file" class="image-uploader-file-input" ng-class="fileInputClassName"> | |
| </div> | |
| </script> | |
| <!-- SCHEMA-BASED EDITOR TEMPLATES --> | |
| <script type="text/ng-template" id="schemaBasedEditor/master"> | |
| <schema-based-choices-editor ng-if="schema().choices" local-value="$parent.localValue" | |
| schema="schema()" choices="schema().choices" | |
| is-disabled="isDisabled()"> | |
| </schema-based-choices-editor> | |
| <schema-based-bool-editor ng-if="schema().type === 'bool' && !schema().choices" | |
| local-value="$parent.localValue" is-disabled="isDisabled()" | |
| allow-expressions="allowExpressions()" | |
| label-for-focus-target="labelForFocusTarget()"> | |
| </schema-based-bool-editor> | |
| <schema-based-int-editor ng-if="schema().type === 'int' && !schema().choices" | |
| local-value="$parent.localValue" is-disabled="isDisabled()" | |
| allow-expressions="allowExpressions()" | |
| validators="schema().validators" | |
| label-for-focus-target="labelForFocusTarget()" | |
| on-input-blur="onInputBlur" | |
| on-input-focus="onInputFocus"> | |
| </schema-based-int-editor> | |
| <schema-based-float-editor ng-if="schema().type === 'float' && !schema().choices" | |
| local-value="$parent.localValue" is-disabled="isDisabled()" | |
| allow-expressions="allowExpressions()" | |
| validators="schema().validators" | |
| label-for-focus-target="labelForFocusTarget()" | |
| on-input-blur="onInputBlur" | |
| on-input-focus="onInputFocus"> | |
| </schema-based-float-editor> | |
| <schema-based-unicode-editor ng-if="schema().type === 'unicode' && !schema().choices" | |
| local-value="$parent.localValue" is-disabled="isDisabled()" | |
| validators="schema().validators" ui-config="schema().ui_config" | |
| allow-expressions="allowExpressions()" | |
| label-for-focus-target="labelForFocusTarget()" | |
| on-input-blur="onInputBlur" | |
| on-input-focus="onInputFocus"> | |
| </schema-based-unicode-editor> | |
| <schema-based-html-editor ng-if="schema().type === 'html' && !schema().choices" | |
| local-value="$parent.localValue" is-disabled="isDisabled()" | |
| allow-expressions="allowExpressions()" | |
| label-for-focus-target="labelForFocusTarget()" | |
| ui-config="schema().ui_config"> | |
| </schema-based-html-editor> | |
| <schema-based-list-editor ng-if="schema().type === 'list' && !schema().choices" | |
| local-value="$parent.localValue" is-disabled="isDisabled()" | |
| item-schema="schema().items" len="schema().len" | |
| ui-config="schema().ui_config" validators="schema().validators" | |
| allow-expressions="allowExpressions()" | |
| label-for-focus-target="labelForFocusTarget()"> | |
| </schema-based-list-editor> | |
| <schema-based-dict-editor ng-if="schema().type === 'dict' && !schema().choices" | |
| local-value="$parent.localValue" is-disabled="isDisabled()" | |
| property-schemas="schema().properties" | |
| allow-expressions="allowExpressions()" | |
| label-for-focus-target="labelForFocusTarget()"> | |
| </schema-based-dict-editor> | |
| <schema-based-custom-editor ng-if="schema().type === 'custom' && !schema().choices" | |
| obj-type="schema().obj_type" local-value="$parent.localValue" | |
| is-disabled="isDisabled()"> | |
| </schema-based-custom-editor> | |
| </script> | |
| <script type="text/ng-template" id="schemaBasedEditor/choices"> | |
| <select class="form-control" ng-model="$parent.$parent.localValue" | |
| ng-options="choice as choice for choice in choices()" required | |
| ng-disabled="isDisabled()"> | |
| </select> | |
| </script> | |
| <script type="text/ng-template" id="schemaBasedEditor/expression"> | |
| <input type="text" ng-model="localValue" class="form-control" ng-disabled="isDisabled()" | |
| required require-is-valid-expression focus-on="<[labelForFocusTarget()]>"> | |
| </script> | |
| <script type="text/ng-template" id="schemaBasedEditor/bool"> | |
| <div class="input-group"> | |
| <span ng-if="!expressionMode"> | |
| <input type="checkbox" ng-model="$parent.localValue" ng-disabled="isDisabled()" | |
| focus-on="<[labelForFocusTarget()]>"> | |
| </span> | |
| <span ng-if="allowExpressions()"> | |
| <schema-based-expression-editor ng-if="expressionMode" is-disabled="isDisabled()" | |
| local-value="$parent.$parent.localValue" | |
| param-names="paramNames" output-type="bool" | |
| label-for-focus-target="labelForFocusTarget()"> | |
| </schema-based-expression-editor> | |
| <span class="input-group-btn"> | |
| <button type="button" class="btn btn-default" ng-click="toggleExpressionMode()" ng-disabled="isDisabled()"> | |
| <span ng-if="!expressionMode">E</span> | |
| <span ng-if="expressionMode"><del>E</del></span> | |
| </button> | |
| </span> | |
| </span> | |
| </div> | |
| </script> | |
| <script type="text/ng-template" id="schemaBasedEditor/int"> | |
| <div class="input-group"> | |
| <span ng-if="!expressionMode"> | |
| <md-input-group class="long oppia-blue-on-focus md-default-theme" style="margin: 0px;"> | |
| <input type="number" ng-model="$parent.localValue" ng-disabled="isDisabled()" | |
| required apply-validation="validators()" focus-on="<[labelForFocusTarget()]>" | |
| ng-blur="onInputBlur()" ng-focus="onInputFocus()"> | |
| </md-input-group> | |
| </span> | |
| <span ng-if="allowExpressions()"> | |
| <schema-based-expression-editor ng-if="expressionMode" is-disabled="isDisabled()" | |
| local-value="$parent.$parent.localValue" | |
| param-names="paramNames" output-type="int" | |
| ng-keypress="onKeypress($event)" | |
| label-for-focus-target="labelForFocusTarget()"> | |
| </schema-based-expression-editor> | |
| <span class="input-group-btn"> | |
| <button type="button" class="btn btn-default" ng-click="toggleExpressionMode()" ng-disabled="isDisabled()"> | |
| <span ng-if="!expressionMode">E</span> | |
| <span ng-if="expressionMode"><del>E</del></span> | |
| </button> | |
| </span> | |
| </span> | |
| </div> | |
| </script> | |
| <script type="text/ng-template" id="schemaBasedEditor/float"> | |
| <span ng-model="localValue" ui-validate="'validate($value)'"> | |
| <span ng-form="floatForm"> | |
| <span ng-if="!expressionMode"> | |
| <input type="text" ng-model="$parent.localValue" class="form-control protractor-test-float-form-input" | |
| name="floatValue" ng-attr-placeholder="<['I18N_FORMS_TYPE_NUMBER' | translate]>" ng-disabled="isDisabled()" | |
| require-is-float apply-validation="validators()" | |
| focus-on="<[labelForFocusTarget()]>" ng-keypress="onKeypress($event)" | |
| ng-blur="onBlur()" ng-focus="onFocus()" style="display: inline;"> | |
| <span ng-if="hasLoaded && !isUserCurrentlyTyping && hasFocusedAtLeastOnce" | |
| style="font-size: 0.85em; position: absolute;" | |
| tabindex="-1" focus-on="<[labelForErrorFocusTarget]>"> | |
| <span ng-if="floatForm.floatValue.$error.isFloat && floatForm.floatValue.$viewValue" class="oppia-form-error" aria-live="assertive" translate="I18N_FORMS_TYPE_NUMBER_INVALID_DECIMAL"></span> | |
| <span ng-if="!floatForm.floatValue.$error.isFloat && floatForm.floatValue.$error.isAtLeast" | |
| class="oppia-form-error" aria-live="assertive" translate="I18N_FORMS_TYPE_NUMBER_AT_LEAST" translate-values="{minValue: <[minValue]>}"></span> | |
| <span ng-if="!floatForm.floatValue.$error.isFloat && floatForm.floatValue.$error.isAtMost" | |
| class="oppia-form-error" aria-live="assertive" translate="I18N_FORMS_TYPE_NUMBER_AT_MOST" translate-values="{maxValue: <[maxValue]>}"></span> | |
| </span> | |
| </span> | |
| <span ng-if="allowExpressions()"> | |
| <schema-based-expression-editor ng-if="expressionMode" is-disabled="isDisabled()" | |
| local-value="$parent.$parent.localValue" | |
| param-names="paramNames" output-type="float" | |
| label-for-focus-target="labelForFocusTarget()"> | |
| </schema-based-expression-editor> | |
| <span class="input-group-btn"> | |
| <button type="button" class="btn btn-default" ng-click="toggleExpressionMode()" ng-disabled="isDisabled()"> | |
| <span ng-if="!expressionMode">E</span> | |
| <span ng-if="expressionMode"><del>E</del></span> | |
| </button> | |
| </span> | |
| </span> | |
| </span> | |
| </span> | |
| </script> | |
| <script type="text/ng-template" id="schemaBasedEditor/unicode"> | |
| <span ng-if="!allowExpressions()"> | |
| <textarea ng-if="!getCodingMode() && getRows()" | |
| ng-model="$parent.$parent.localValue" | |
| rows="<[getRows()]>" | |
| placeholder="<[getPlaceholder()]>" | |
| ng-disabled="isDisabled()" | |
| class="form-control" focus-on="<[labelForFocusTarget()]>" | |
| ng-blur="onInputBlur()" | |
| ng-focus="onInputFocus()"> | |
| </textarea> | |
| <span ng-if="!getCodingMode() && !getRows()"> | |
| <input type="text" ng-disabled="isDisabled()" class="form-control" | |
| ng-model="$parent.$parent.localValue" ng-blur="onInputBlur()" | |
| ng-focus="onInputFocus()" focus-on="<[labelForFocusTarget()]>" | |
| ng-keypress="onKeypress($event)" placeholder="<[getPlaceholder()]>" apply-validation="validators()" | |
| style="display: inline;"> | |
| </span> | |
| <!-- Note that we do not yet support ng-blur for the code editor. --> | |
| <div ng-if="getCodingMode()" style="border: 1px solid #ccc;"> | |
| <div ui-codemirror | |
| ng-model="$parent.$parent.localValue" | |
| ui-codemirror-opts="codemirrorOptions" | |
| ui-refresh="codemirrorStatus"> | |
| </div> | |
| </div> | |
| </span> | |
| <!-- Note that we do not yet support ng-blur for the expression editor. --> | |
| <span ng-if="allowExpressions()"> | |
| <span ng-if="isDisabled()" | |
| ng-class="{'oppia-disabled-contenteditable': isDisabled()}" | |
| ng-bind-html="getDisplayedValue()"> | |
| </span> | |
| <span ng-if="!isDisabled()"> | |
| <unicode-with-parameters-editor local-value="$parent.$parent.localValue" | |
| allowed-parameter-names="allowedParameterNames" | |
| focus-on="<[labelForFocusTarget()]>"> | |
| </unicode-with-parameters-editor> | |
| </span> | |
| </span> | |
| </script> | |
| <script type="text/ng-template" id="schemaBasedEditor/html"> | |
| <text-angular-rte ng-if="!isDisabled()" html-content="$parent.localValue" | |
| ui-config="uiConfig()"> | |
| </text-angular-rte> | |
| <span ng-if="isDisabled()" | |
| ng-class="{'oppia-disabled-contenteditable': isDisabled()}" | |
| ng-bind-html="localValue"> | |
| </span> | |
| </script> | |
| <script type="text/ng-template" id="schemaBasedEditor/dict"> | |
| <div role="form"> | |
| <div ng-repeat="property in propertySchemas()"> | |
| <div class="form-group"> | |
| <label for="<[fieldIds[property.name]]>"><[getHumanReadablePropertyDescription(property)]></label> | |
| <!-- TODO(sll): This is in the wrong place. It should be on the input field. --> | |
| <div id="<[fieldIds[property.name]]>"> | |
| <schema-based-editor schema="property.schema" is-disabled="isDisabled()" | |
| local-value="localValue[property.name]" | |
| allow-expressions="allowExpressions()" | |
| label-for-focus-target="$index === 0 ? labelForFocusTarget() : ''"> | |
| </schema-based-editor> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </script> | |
| <script type="text/ng-template" id="schemaBasedEditor/list"> | |
| <table style="width: 100%;"> | |
| <tr ng-repeat="item in localValue track by $index"> | |
| <td> | |
| <schema-based-editor schema="itemSchema()" is-disabled="isDisabled()" local-value="localValue[$index]" | |
| allow-expressions="allowExpressions()" | |
| label-for-focus-target="getFocusLabel($index)" | |
| on-input-blur="($last ? lastElementOnBlur : showAddItemButton)" | |
| on-input-focus="($last ? hideAddItemButton : showAddItemButton)"> | |
| </schema-based-editor> | |
| </td> | |
| <td ng-if="!len && (!minListLength || localValue.length > minListLength)" style="vertical-align: top;"> | |
| <button class="oppia-delete-list-entry-button oppia-transition-200 protractor-test-delete-list-entry" type="button" | |
| ng-click="deleteElement($index)" | |
| ng-disabled="isDisabled()"> | |
| <i class="material-icons md-18"></i> | |
| </button> | |
| </td> | |
| </tr> | |
| </table> | |
| <div ng-if="showDuplicatesWarning && hasDuplicates()" class="oppia-form-error" aria-live="assertive"> | |
| Please ensure that the list has no duplicates. | |
| </div> | |
| <!-- The margin-left is added here to left-align the button with the previous list items. --> | |
| <div style="height: 30px; margin-top: 4px;"> | |
| <button ng-show="!isOneLineInput || isAddItemButtonPresent" | |
| ng-if="!len && (maxListLength === null || localValue.length < maxListLength)" | |
| type="button" class="btn btn-default btn-sm protractor-test-add-list-entry" ng-click="addElement()" | |
| ng-disabled="isDisabled()" style="margin-left: 0;"> | |
| <[addElementText]> | |
| </button> | |
| </div> | |
| </script> | |
| <script type="text/ng-template" id="schemaBasedEditor/custom"> | |
| <object-editor obj-type="<[objType]>" value="$parent.$parent.localValue" always-editable="true"> | |
| </object-editor> | |
| </script> | |
| <!-- SCHEMA-BASED VIEWER TEMPLATES --> | |
| <script type="text/ng-template" id="schemaBasedViewer/master"> | |
| <schema-based-primitive-viewer ng-if="(schema().type === 'bool' || schema().type === 'int' || schema().type == 'float')" local-value="$parent.localValue"> | |
| </schema-based-primitive-viewer> | |
| <schema-based-custom-viewer ng-if="schema().type === 'custom'" obj-type="schema().obj_type" | |
| local-value="$parent.localValue"> | |
| </schema-based-custom-viewer> | |
| <schema-based-dict-viewer ng-if="schema().type === 'dict'" property-schemas="schema().properties" | |
| local-value="$parent.localValue"> | |
| </schema-based-dict-viewer> | |
| <schema-based-html-viewer ng-if="schema().type === 'html'" local-value="$parent.localValue"> | |
| </schema-based-html-viewer> | |
| <schema-based-list-viewer ng-if="schema().type === 'list'" item-schema="schema().items" | |
| local-value="$parent.localValue"> | |
| </schema-based-list-viewer> | |
| <schema-based-unicode-viewer ng-if="schema().type === 'unicode'" local-value="$parent.localValue"> | |
| </schema-based-unicode-viewer> | |
| </script> | |
| <script type="text/ng-template" id="schemaBasedViewer/primitive"> | |
| <span ng-class="{'label label-info': isExpression(localValue)}"> | |
| <[localValue]> | |
| </span> | |
| </script> | |
| <script type="text/ng-template" id="schemaBasedViewer/custom"> | |
| <[localValue]> | |
| </script> | |
| <script type="text/ng-template" id="schemaBasedViewer/dict"> | |
| <div role="form"> | |
| <div ng-repeat="property in propertySchemas()"> | |
| <div class="form-group"> | |
| <label><[getHumanReadablePropertyDescription(property)]></label> | |
| <div> | |
| <schema-based-viewer schema="property.schema" local-value="localValue[property.name]"> | |
| </schema-based-viewer> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </script> | |
| <script type="text/ng-template" id="schemaBasedViewer/html"> | |
| <span ng-bind-html="localValue"> | |
| </span> | |
| </script> | |
| <script type="text/ng-template" id="schemaBasedViewer/list"> | |
| <table class="table"> | |
| <tr ng-repeat="item in localValue track by $index"> | |
| <td> | |
| <schema-based-viewer schema="itemSchema()" local-value="localValue[$index]"> | |
| </schema-based-viewer> | |
| </td> | |
| </tr> | |
| </table> | |
| </script> | |
| <script type="text/ng-template" id="schemaBasedViewer/unicode"> | |
| <span ng-bind-html="getDisplayedValue()"> | |
| </span> | |
| </script> | |
| <!-- MODALS --> | |
| <script type="text/ng-template" id="modals/editParamName"> | |
| <div class="modal-header"> | |
| <h3>Edit parameter name</h3> | |
| </div> | |
| <div class="modal-body"> | |
| <strong>Parameter name</strong> | |
| <select class="form-control" ng-model="currentParamName" | |
| ng-options="option.value as option.name for option in paramOptions"> | |
| </select> | |
| </div> | |
| <div class="modal-footer"> | |
| <input type="submit" class="btn btn-default" value="Cancel" ng-click="cancel()"> | |
| <input type="submit" class="btn btn-success" value="Done" ng-click="save(currentParamName)" | |
| ng-disabled="!currentParamName"> | |
| </div> | |
| </script> | |
| <script type="text/ng-template" id="modals/customizeRteComponent"> | |
| <div class="modal-header"> | |
| <h3>Customize This Component</h3> | |
| </div> | |
| <div class="modal-body"> | |
| <!-- Provide a sink to move the focus into while the modal loads. --> | |
| <input ng-if="modalIsLoading" type="text" focus-on="tmpFocusPoint"> | |
| <form name="form.schemaForm"> | |
| <div ng-repeat="customizationArgSpec in customizationArgSpecs track by $index" style="margin-bottom: 25px;"> | |
| <strong><[customizationArgSpec.description]></strong> | |
| <div style="margin-top: 15px;"> | |
| <schema-based-editor local-value="tmpCustomizationArgs[$index].value" schema="customizationArgSpec.schema"> | |
| </schema-based-editor> | |
| </div> | |
| </div> | |
| </form> | |
| </div> | |
| <div class="modal-footer"> | |
| <input type="submit" class="btn btn-default" value="Cancel" ng-click="cancel()"> | |
| <input type="submit" class="btn btn-success protractor-test-close-rich-text-component-editor" value="Done" ng-click="save()" ng-disabled="form.schemaForm.$invalid"> | |
| </div> | |
| </script> | |
| <script src="/third_party/generated/js/third_party.js"></script> | |
| <script type="text/ng-template" id="summaryTile/collection"> | |
| <md-card class="oppia-activity-summary-tile bottom-card"> | |
| <div class="title-section" style="background-color: <[getThumbnailBgColor()]>;"></div> | |
| <md-card class="oppia-activity-summary-tile middle-card"> | |
| <div class="title-section" style="background-color: <[getThumbnailBgColor()]>;"></div> | |
| <md-card class="oppia-activity-summary-tile top-card"> | |
| <a ng-href="<[getCollectionLink()]>"> | |
| <div class="title-section" style="background-color: <[getThumbnailBgColor()]>;"> | |
| <img class="thumbnail-image" ng-src="<[getThumbnailIconUrl()]>"> | |
| <h2 class="activity-title"><[getCollectionTitle()]></h2> | |
| </div> | |
| <div> | |
| <div class="objective"> | |
| <[getObjective() | truncateAndCapitalize: 45]> | |
| <span ng-if="!getObjective()">No objective specified.</span> | |
| </div> | |
| <ul layout="row" class="metrics" layout-align="space-between center"> | |
| <li> | |
| <span> | |
| COLLECTION (<[getNodeCount()]>) | |
| </span> | |
| </li> | |
| <li> | |
| <span ng-if="!wasRecentlyUpdated()"> | |
| <[getLastUpdatedDatetime()]> | |
| </span> | |
| <span ng-if="wasRecentlyUpdated()" class="recently-updated"> | |
| UPDATED | |
| </span> | |
| </li> | |
| </ul> | |
| </div> | |
| <div class="title-section-mask top-card-mask"></div> | |
| </a> | |
| </md-card> | |
| <div class="title-section-mask"></div> | |
| </md-card> | |
| <div class="title-section-mask"></div> | |
| </md-card> | |
| </script> | |
| <style> | |
| .middle-card, .top-card { | |
| box-shadow: -1px -1px 5px 0 rgba(0, 0, 0, 0.26); | |
| margin: -158px 3px; | |
| z-index: 11; | |
| } | |
| .bottom-card { | |
| box-shadow: 8px 10px 5px 0 rgba(0, 0, 0, 0.26); | |
| margin: 4px 8px 12px -4px; | |
| } | |
| .oppia-library-carousel-tiles .oppia-activity-summary-tile.middle-card.oppia-activity-summary-tile.top-card { | |
| margin: -158px 6px; | |
| } | |
| .oppia-library-carousel-tiles .oppia-activity-summary-tile.bottom-card { | |
| margin: 4px 10px 12px 4px; | |
| } | |
| </style> | |
| <script type="text/ng-template" id="summaryTile/exploration"> | |
| <md-card class="oppia-activity-summary-tile" ng-class="{'small-width': !isWindowLarge}"> | |
| <a ng-href="<[getExplorationLink()]>" target="<[openInNewWindow ? '_blank' : '_self']>"> | |
| <div class="title-section" style="background-color: <[getThumbnailBgColor()]>;"> | |
| <img class="thumbnail-image" ng-src="<[getThumbnailIconUrl()]>"> | |
| <h2 class="activity-title protractor-test-exp-summary-tile-title"> | |
| <span ng-if="isWindowLarge"><[getExplorationTitle()|truncate:40]></span> | |
| <span ng-if="!isWindowLarge"><[getExplorationTitle()|truncate:40]></span> | |
| </h2> | |
| <!-- Note that if this is ng-if instead, the avatar area will not detect a mouseover and the tile will behave incorrectly. --> | |
| <div ng-show="isWindowLarge && avatarsList.length > 0" class="exploration-summary-avatars" ng-show="avatarsList.length > 0"> | |
| <div> | |
| <circular-image ng-if="avatarsList.length > 0" | |
| src="avatarsList[0].image" | |
| link="avatarsList[0].link" | |
| tooltip="<[avatarsList[0].tooltipText | truncate:14]>" | |
| tooltip-placement="right"> | |
| </circular-image> | |
| </div> | |
| <div class="avatars-num-minus-one contributor-indicator contributor-indicator-background" ng-show="avatarsList.length > 1"> | |
| <span ng-if="!isCommunityOwned()">+</span><[avatarsList.length - 1]> | |
| </div> | |
| <div class="all-avatars" style="display: none;"> | |
| <div ng-repeat="avatar in avatarsList | limitTo:MAX_AVATARS_TO_DISPLAY-1:1"> | |
| <circular-image src="avatar.image" | |
| link="avatar.link" | |
| tooltip="<[avatar.tooltipText | truncate:14]>" | |
| tooltip-placement="right"> | |
| </circular-image> | |
| </div> | |
| <div style="position: relative;" ng-show="avatarsList.length > MAX_AVATARS_TO_DISPLAY"> | |
| <div class="exploration-black-profile"></div> | |
| <div class="num-remaining-avatars" ng-show="avatarsList.length > MAX_AVATARS_TO_DISPLAY"> | |
| +<[avatarsList.length - MAX_AVATARS_TO_DISPLAY]> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="title-section-mask"></div> | |
| <div ng-attr-section="<[isWindowLarge ? undefined : 'right-section']>"> | |
| <div ng-if="isWindowLarge" class="objective protractor-test-exp-summary-tile-objective"> | |
| <span ng-if="getObjective()"> | |
| <[getObjective() | truncateAndCapitalize: 40]> | |
| </span> | |
| <span ng-if="!getObjective()" translate="I18N_LIBRARY_NO_OBJECTIVE"> | |
| </span> | |
| </div> | |
| <ul layout="row" class="metrics" layout-align="space-between center"> | |
| <li> | |
| <span class="protractor-test-exp-summary-tile-rating" ng-class="{'rating-disabled': !getAverageRating()}"> | |
| <span class="fa fa-star fa-lg" tooltip="<['I18N_LIBRARY_RATINGS_TOOLTIP' | translate]>" tooltip-placement="top"> | |
| </span> | |
| <span ng-if="getAverageRating()"> | |
| <[getAverageRating() | number:1]> | |
| </span> | |
| <span ng-if="!getAverageRating()" translate="I18N_LIBRARY_N/A"> | |
| </span> | |
| </span> | |
| </li> | |
| <li> | |
| <span class="fa fa-eye fa-lg" tooltip="<['I18N_LIBRARY_VIEWS_TOOLTIP' | translate]>" tooltip-placement="top"> | |
| </span> | |
| <[getNumViews() | summarizeNonnegativeNumber]> | |
| </li> | |
| <li> | |
| <span ng-if="!wasRecentlyUpdated()"> | |
| <[getLastUpdatedDatetime()]> | |
| </span> | |
| <span ng-if="wasRecentlyUpdated()" class="recently-updated" translate="I18N_LIBRARY_UPDATED"> | |
| </span> | |
| </li> | |
| </ul> | |
| </div> | |
| </a> | |
| </md-card> | |
| </script> | |
| <script type="text/ng-template" id="components/ratingSummary"> | |
| <span style="<[getCursorStyle()]>" ng-mouseleave="leaveArea()"> | |
| <span ng-if="ratingValue || isEditable" ng-repeat="star in stars" class="fa <[star.cssClass]> protractor-test-rating-star" ng-click="clickStar(star.value)" ng-mouseenter="enterStar(star.value)"></span> | |
| </span> | |
| </script> | |
| <script type="text/ng-template" id="components/createActivityButton"> | |
| <div class="pull-right oppia-navbar-button-container"> | |
| <button class="btn oppia-navbar-button oppia-navbar-hide-on-small-width protractor-test-create-activity oppia-transition-200" | |
| ng-click="initCreationProcess()" ng-disabled="creationInProgress"> | |
| <span translate="I18N_CREATE_EXPLORATION_CREATE"></span> | |
| </button> | |
| </div> | |
| </script> | |
| <script type="text/ng-template" id="components/activityTilesInfinityGrid"> | |
| <div infinite-scroll="showMoreActivities()" infinite-scroll-distance="1" | |
| infinite-scroll-disabled="endOfPageIsReached || searchResultsAreLoading"> | |
| <div ng-repeat="activity in allActivitiesInOrder track by $index" style="display: inline-block;"> | |
| <collection-summary-tile ng-if="activity.activity_type === 'collection'" | |
| collection-id="activity.id" | |
| collection-title="activity.title" | |
| last-updated-msec="activity.last_updated_msec" | |
| node-count="activity.node_count" | |
| objective="activity.objective" | |
| thumbnail-icon-url="activity.thumbnail_icon_url" | |
| thumbnail-bg-color="activity.thumbnail_bg_color" | |
| style="margin-right: 3px;"> | |
| </collection-summary-tile> | |
| <exploration-summary-tile ng-if="activity.activity_type === 'exploration'" | |
| exploration-id="activity.id" | |
| exploration-title="activity.title" | |
| last-updated-msec="activity.last_updated_msec" | |
| objective="activity.objective" | |
| category="activity.category" | |
| ratings="activity.ratings" | |
| thumbnail-icon-url="activity.thumbnail_icon_url" | |
| thumbnail-bg-color="activity.thumbnail_bg_color" | |
| num-views="activity.num_views" | |
| contributors-summary="activity.human_readable_contributors_summary" | |
| is-community-owned="activity.community_owned" | |
| is-community-editable="activity.community_editable" | |
| class="protractor-test-exp-summary-tile"> | |
| </exploration-summary-tile> | |
| </div> | |
| </div> | |
| <div class="oppia-search-results-loading-message" | |
| ng-if="searchResultsAreLoading"> | |
| Loading more results | |
| <loading-dots></loading-dots> | |
| </div> | |
| </script> | |
| <style> | |
| .oppia-search-results-loading-message { | |
| background-color: #e9e9e9; | |
| bottom: 0; | |
| color: #000; | |
| height: 30px; | |
| margin-top: 15px; | |
| opacity: 0.9; | |
| padding-top: 5px; | |
| text-align: center; | |
| width: 100%; | |
| z-index: 50; | |
| } | |
| </style> | |
| <script type="text/ng-template" id="components/loadingDots"> | |
| <span class="oppia-loading-dot-one">.</span> | |
| <span class="oppia-loading-dot-two">.</span> | |
| <span class="oppia-loading-dot-three">.</span> | |
| </script> | |
| <script> | |
| // Copyright 2014 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| /** | |
| * @fileoverview Initialization and basic configuration for the Oppia module. | |
| */ | |
| // TODO(sll): Remove the check for window.GLOBALS. This check is currently | |
| // only there so that the Karma tests run, since it looks like Karma doesn't | |
| // 'see' the GLOBALS variable that is defined in base.html. We should fix this | |
| // in order to make the testing and production environments match. | |
| var oppia = angular.module( | |
| 'oppia', [ | |
| 'ngMaterial', 'ngAnimate', 'ngSanitize', 'ngTouch', 'ngResource', | |
| 'ui.bootstrap', 'ui.sortable', 'infinite-scroll', 'ngJoyRide', 'ngImgCrop', | |
| 'ui.validate', 'textAngular', 'pascalprecht.translate', 'ngCookies', | |
| 'toastr' | |
| ].concat( | |
| window.GLOBALS ? (window.GLOBALS.ADDITIONAL_ANGULAR_MODULES || []) | |
| : [])); | |
| oppia.config([ | |
| '$compileProvider', '$httpProvider', '$interpolateProvider', | |
| '$locationProvider', | |
| function( | |
| $compileProvider, $httpProvider, $interpolateProvider, | |
| $locationProvider) { | |
| // This improves performance by disabling debug data. For more details, | |
| // see https://code.angularjs.org/1.5.5/docs/guide/production | |
| $compileProvider.debugInfoEnabled(false); | |
| // Set the AngularJS interpolators as <[ and ]>, to not conflict with | |
| // Jinja2 templates. | |
| $interpolateProvider.startSymbol('<['); | |
| $interpolateProvider.endSymbol(']>'); | |
| // Prevent the search page from reloading if the search query is changed. | |
| $locationProvider.html5Mode(false); | |
| if (window.location.pathname === '/search/find') { | |
| $locationProvider.html5Mode(true); | |
| } | |
| // Set default headers for POST and PUT requests. | |
| $httpProvider.defaults.headers.post = { | |
| 'Content-Type': 'application/x-www-form-urlencoded' | |
| }; | |
| $httpProvider.defaults.headers.put = { | |
| 'Content-Type': 'application/x-www-form-urlencoded' | |
| }; | |
| // Add an interceptor to convert requests to strings and to log and show | |
| // warnings for error responses. | |
| $httpProvider.interceptors.push([ | |
| '$q', '$log', 'alertsService', function($q, $log, alertsService) { | |
| return { | |
| request: function(config) { | |
| if (config.data) { | |
| config.data = $.param({ | |
| csrf_token: GLOBALS.csrf_token, | |
| payload: JSON.stringify(config.data), | |
| source: document.URL | |
| }, true); | |
| } | |
| return config; | |
| }, | |
| responseError: function(rejection) { | |
| // A rejection status of -1 seems to indicate (it's hard to find | |
| // documentation) that the response has not completed, | |
| // which can occur if the user navigates away from the page | |
| // while the response is pending, This should not be considered | |
| // an error. | |
| if (rejection.status !== -1) { | |
| $log.error(rejection.data); | |
| var warningMessage = 'Error communicating with server.'; | |
| if (rejection.data && rejection.data.error) { | |
| warningMessage = rejection.data.error; | |
| } | |
| alertsService.addWarning(warningMessage); | |
| } | |
| return $q.reject(rejection); | |
| } | |
| }; | |
| } | |
| ]); | |
| } | |
| ]); | |
| oppia.config(['$provide', function($provide) { | |
| $provide.decorator('$log', ['$delegate', function($delegate) { | |
| var _originalError = $delegate.error; | |
| if (window.GLOBALS && !window.GLOBALS.DEV_MODE) { | |
| $delegate.log = function() {}; | |
| $delegate.info = function() {}; | |
| // TODO(sll): Send errors (and maybe warnings) to the backend. | |
| $delegate.warn = function() { }; | |
| $delegate.error = function(message) { | |
| if (String(message).indexOf('$digest already in progress') === -1) { | |
| _originalError(message); | |
| } | |
| }; | |
| // This keeps angular-mocks happy (in tests). | |
| $delegate.error.logs = []; | |
| } | |
| return $delegate; | |
| }]); | |
| }]); | |
| oppia.config(['toastrConfig', function(toastrConfig) { | |
| angular.extend(toastrConfig, { | |
| allowHtml: false, | |
| iconClasses: { | |
| error: 'toast-error', | |
| info: 'toast-info', | |
| success: 'toast-success', | |
| warning: 'toast-warning' | |
| }, | |
| positionClass: 'toast-bottom-right', | |
| messageClass: 'toast-message', | |
| progressBar: false, | |
| tapToDismiss: true, | |
| timeOut: 1500, | |
| titleClass: 'toast-title' | |
| }); | |
| }]); | |
| // Returns true if the user is on a mobile device. | |
| // See: http://stackoverflow.com/a/14301832/5020618 | |
| oppia.factory('deviceInfoService', ['$window', function($window) { | |
| return { | |
| isMobileDevice: function() { | |
| return typeof $window.orientation !== 'undefined'; | |
| }, | |
| hasTouchEvents: function() { | |
| return 'ontouchstart' in $window; | |
| } | |
| }; | |
| }]); | |
| // Overwrite the built-in exceptionHandler service to log errors to the backend | |
| // (so that they can be fixed). | |
| oppia.factory('$exceptionHandler', ['$log', function($log) { | |
| return function(exception, cause) { | |
| var messageAndSourceAndStackTrace = [ | |
| '', | |
| 'Cause: ' + cause, | |
| 'Source: ' + window.location.href, | |
| exception.message, | |
| String(exception.stack) | |
| ].join('\n'); | |
| // Catch all errors, to guard against infinite recursive loops. | |
| try { | |
| // We use jQuery here instead of Angular's $http, since the latter | |
| // creates a circular dependency. | |
| $.ajax({ | |
| type: 'POST', | |
| url: '/frontend_errors', | |
| data: $.param({ | |
| csrf_token: GLOBALS.csrf_token, | |
| payload: JSON.stringify({ | |
| error: messageAndSourceAndStackTrace | |
| }), | |
| source: document.URL | |
| }, true), | |
| contentType: 'application/x-www-form-urlencoded', | |
| dataType: 'text', | |
| async: true | |
| }); | |
| } catch (loggingError) { | |
| $log.warn('Error logging failed.'); | |
| } | |
| $log.error.apply($log, arguments); | |
| }; | |
| }]); | |
| // Service for HTML serialization and escaping. | |
| oppia.factory('oppiaHtmlEscaper', ['$log', function($log) { | |
| var htmlEscaper = { | |
| objToEscapedJson: function(obj) { | |
| return this.unescapedStrToEscapedStr(JSON.stringify(obj)); | |
| }, | |
| escapedJsonToObj: function(json) { | |
| if (!json) { | |
| $log.error('Empty string was passed to JSON decoder.'); | |
| return ''; | |
| } | |
| return JSON.parse(this.escapedStrToUnescapedStr(json)); | |
| }, | |
| unescapedStrToEscapedStr: function(str) { | |
| return String(str) | |
| .replace(/&/g, '&') | |
| .replace(/"/g, '"') | |
| .replace(/'/g, ''') | |
| .replace(/</g, '<') | |
| .replace(/>/g, '>'); | |
| }, | |
| escapedStrToUnescapedStr: function(value) { | |
| return String(value) | |
| .replace(/"/g, '"') | |
| .replace(/'/g, '\'') | |
| .replace(/</g, '<') | |
| .replace(/>/g, '>') | |
| .replace(/&/g, '&'); | |
| } | |
| }; | |
| return htmlEscaper; | |
| }]); | |
| // Service for converting dates in milliseconds since the Epoch to | |
| // human-readable dates. | |
| oppia.factory('oppiaDatetimeFormatter', ['$filter', function($filter) { | |
| return { | |
| // Returns just the time if the local datetime representation has the | |
| // same date as the current date. Otherwise, returns just the date if the | |
| // local datetime representation has the same year as the current date. | |
| // Otherwise, returns the full date (with the year abbreviated). | |
| getLocaleAbbreviatedDatetimeString: function(millisSinceEpoch) { | |
| var date = new Date(millisSinceEpoch); | |
| if (date.toLocaleDateString() === new Date().toLocaleDateString()) { | |
| // The replace function removes 'seconds' from the time returned. | |
| return date.toLocaleTimeString().replace(/:\d\d /, ' '); | |
| } else if (date.getFullYear() === new Date().getFullYear()) { | |
| return $filter('date')(date, 'MMM d'); | |
| } else { | |
| return $filter('date')(date, 'shortDate'); | |
| } | |
| }, | |
| // Returns just the date. | |
| getLocaleDateString: function(millisSinceEpoch) { | |
| var date = new Date(millisSinceEpoch); | |
| return date.toLocaleDateString(); | |
| }, | |
| // Returns whether the date is at most one week before the current date. | |
| isRecent: function(millisSinceEpoch) { | |
| var ONE_WEEK_IN_MILLIS = 7 * 24 * 60 * 60 * 1000; | |
| return new Date().getTime() - millisSinceEpoch < ONE_WEEK_IN_MILLIS; | |
| } | |
| }; | |
| }]); | |
| // Service for validating things and (optionally) displaying warning messages | |
| // if the validation fails. | |
| oppia.factory('validatorsService', [ | |
| '$filter', 'alertsService', function($filter, alertsService) { | |
| return { | |
| /** | |
| * Checks whether an entity name is valid, and displays a warning message | |
| * if it isn't. | |
| * @param {string} input - The input to be checked. | |
| * @param {boolean} showWarnings - Whether to show warnings in the | |
| * butterbar. | |
| * @return {boolean} True if the entity name is valid, false otherwise. | |
| */ | |
| isValidEntityName: function(input, showWarnings, allowEmpty) { | |
| input = $filter('normalizeWhitespace')(input); | |
| if (!input && !allowEmpty) { | |
| if (showWarnings) { | |
| alertsService.addWarning('Please enter a non-empty name.'); | |
| } | |
| return false; | |
| } | |
| for (var i = 0; i < GLOBALS.INVALID_NAME_CHARS.length; i++) { | |
| if (input.indexOf(GLOBALS.INVALID_NAME_CHARS[i]) !== -1) { | |
| if (showWarnings) { | |
| alertsService.addWarning( | |
| 'Invalid input. Please use a non-empty description consisting ' + | |
| 'of alphanumeric characters, spaces and/or hyphens.' | |
| ); | |
| } | |
| return false; | |
| } | |
| } | |
| return true; | |
| }, | |
| isValidExplorationTitle: function(input, showWarnings) { | |
| if (!this.isValidEntityName(input, showWarnings)) { | |
| return false; | |
| } | |
| if (input.length > 40) { | |
| if (showWarnings) { | |
| alertsService.addWarning( | |
| 'Exploration titles should be at most 40 characters long.'); | |
| } | |
| return false; | |
| } | |
| return true; | |
| }, | |
| // NB: this does not check whether the card name already exists in the | |
| // states dict. | |
| isValidStateName: function(input, showWarnings) { | |
| if (!this.isValidEntityName(input, showWarnings)) { | |
| return false; | |
| } | |
| if (input.length > 50) { | |
| if (showWarnings) { | |
| alertsService.addWarning( | |
| 'Card names should be at most 50 characters long.'); | |
| } | |
| return false; | |
| } | |
| return true; | |
| }, | |
| isNonempty: function(input, showWarnings) { | |
| if (!input) { | |
| if (showWarnings) { | |
| // TODO(sll): Allow this warning to be more specific in terms of what | |
| // needs to be entered. | |
| alertsService.addWarning('Please enter a non-empty value.'); | |
| } | |
| return false; | |
| } | |
| return true; | |
| } | |
| }; | |
| }]); | |
| oppia.constant('LABEL_FOR_CLEARING_FOCUS', 'labelForClearingFocus'); | |
| // Service for setting focus. This broadcasts a 'focusOn' event which sets | |
| // focus to the element in the page with the corresponding focusOn attribute. | |
| // Note: This requires LABEL_FOR_CLEARING_FOCUS to exist somewhere in the HTML | |
| // page. | |
| oppia.factory('focusService', [ | |
| '$rootScope', '$timeout', 'deviceInfoService', 'LABEL_FOR_CLEARING_FOCUS', | |
| function($rootScope, $timeout, deviceInfoService, LABEL_FOR_CLEARING_FOCUS) { | |
| var _nextLabelToFocusOn = null; | |
| return { | |
| clearFocus: function() { | |
| this.setFocus(LABEL_FOR_CLEARING_FOCUS); | |
| }, | |
| setFocus: function(name) { | |
| if (_nextLabelToFocusOn) { | |
| return; | |
| } | |
| _nextLabelToFocusOn = name; | |
| $timeout(function() { | |
| $rootScope.$broadcast('focusOn', _nextLabelToFocusOn); | |
| _nextLabelToFocusOn = null; | |
| }); | |
| }, | |
| setFocusIfOnDesktop: function(newFocusLabel) { | |
| if (!deviceInfoService.isMobileDevice()) { | |
| this.setFocus(newFocusLabel); | |
| } | |
| }, | |
| // Generates a random string (to be used as a focus label). | |
| generateFocusLabel: function() { | |
| return Math.random().toString(36).slice(2); | |
| } | |
| }; | |
| } | |
| ]); | |
| // Service for manipulating the page URL. | |
| oppia.factory('urlService', ['$window', function($window) { | |
| return { | |
| getUrlParams: function() { | |
| var params = {}; | |
| var parts = $window.location.href.replace( | |
| /[?&]+([^=&]+)=([^&]*)/gi, function(m, key, value) { | |
| params[key] = value; | |
| }); | |
| return params; | |
| }, | |
| isIframed: function() { | |
| return !!(this.getUrlParams().iframed); | |
| }, | |
| getPathname: function() { | |
| return window.location.pathname; | |
| } | |
| }; | |
| }]); | |
| // Service for computing the window dimensions. | |
| oppia.factory('windowDimensionsService', ['$window', function($window) { | |
| var onResizeHooks = []; | |
| $window.onresize = function() { | |
| onResizeHooks.forEach(function(hookFn) { | |
| hookFn(); | |
| }); | |
| }; | |
| return { | |
| getWidth: function() { | |
| return ( | |
| $window.innerWidth || document.documentElement.clientWidth || | |
| document.body.clientWidth); | |
| }, | |
| registerOnResizeHook: function(hookFn) { | |
| onResizeHooks.push(hookFn); | |
| } | |
| }; | |
| }]); | |
| // Service for sending events to Google Analytics. | |
| // | |
| // Note that events are only sent if the CAN_SEND_ANALYTICS_EVENTS flag is | |
| // turned on. This flag must be turned on explicitly by the application | |
| // owner in feconf.py. | |
| oppia.factory('siteAnalyticsService', ['$window', function($window) { | |
| var CAN_SEND_ANALYTICS_EVENTS = GLOBALS.CAN_SEND_ANALYTICS_EVENTS; | |
| // For definitions of the various arguments, please see: | |
| // developers.google.com/analytics/devguides/collection/analyticsjs/events | |
| var _sendEventToGoogleAnalytics = function( | |
| eventCategory, eventAction, eventLabel) { | |
| if ($window.ga && CAN_SEND_ANALYTICS_EVENTS) { | |
| $window.ga('send', 'event', eventCategory, eventAction, eventLabel); | |
| } | |
| }; | |
| // For definitions of the various arguments, please see: | |
| // developers.google.com/analytics/devguides/collection/analyticsjs/ | |
| // social-interactions | |
| var _sendSocialEventToGoogleAnalytics = function( | |
| network, action, targetUrl) { | |
| if ($window.ga && CAN_SEND_ANALYTICS_EVENTS) { | |
| $window.ga('send', 'social', network, action, targetUrl); | |
| } | |
| }; | |
| return { | |
| // The srcElement refers to the element on the page that is clicked. | |
| registerStartLoginEvent: function(srcElement) { | |
| _sendEventToGoogleAnalytics( | |
| 'LoginButton', 'click', $window.location.pathname + ' ' + srcElement); | |
| }, | |
| registerNewSignupEvent: function() { | |
| _sendEventToGoogleAnalytics('SignupButton', 'click', ''); | |
| }, | |
| registerClickBrowseLibraryButtonEvent: function() { | |
| _sendEventToGoogleAnalytics( | |
| 'BrowseLibraryButton', 'click', $window.location.pathname); | |
| }, | |
| registerClickCreateExplorationButtonEvent: function() { | |
| _sendEventToGoogleAnalytics( | |
| 'CreateExplorationButton', 'click', $window.location.pathname); | |
| }, | |
| registerCreateNewExplorationEvent: function(explorationId) { | |
| _sendEventToGoogleAnalytics('NewExploration', 'create', explorationId); | |
| }, | |
| registerCreateNewExplorationInCollectionEvent: function(explorationId) { | |
| _sendEventToGoogleAnalytics( | |
| 'NewExplorationFromCollection', 'create', explorationId); | |
| }, | |
| registerCreateNewCollectionEvent: function(collectionId) { | |
| _sendEventToGoogleAnalytics('NewCollection', 'create', collectionId); | |
| }, | |
| registerCommitChangesToPrivateExplorationEvent: function(explorationId) { | |
| _sendEventToGoogleAnalytics( | |
| 'CommitToPrivateExploration', 'click', explorationId); | |
| }, | |
| registerShareExplorationEvent: function(network) { | |
| _sendSocialEventToGoogleAnalytics( | |
| network, 'share', $window.location.pathname); | |
| }, | |
| registerOpenEmbedInfoEvent: function(explorationId) { | |
| _sendEventToGoogleAnalytics('EmbedInfoModal', 'open', explorationId); | |
| }, | |
| registerCommitChangesToPublicExplorationEvent: function(explorationId) { | |
| _sendEventToGoogleAnalytics( | |
| 'CommitToPublicExploration', 'click', explorationId); | |
| }, | |
| // Metrics for tutorial on first creating exploration | |
| registerTutorialModalOpenEvent: function(explorationId) { | |
| _sendEventToGoogleAnalytics( | |
| 'TutorialModalOpen', 'open', explorationId); | |
| }, | |
| registerDeclineTutorialModalEvent: function(explorationId) { | |
| _sendEventToGoogleAnalytics( | |
| 'DeclineTutorialModal', 'click', explorationId); | |
| }, | |
| registerAcceptTutorialModalEvent: function(explorationId) { | |
| _sendEventToGoogleAnalytics( | |
| 'AcceptTutorialModal', 'click', explorationId); | |
| }, | |
| // Metrics for visiting the help center | |
| registerClickHelpButtonEvent: function(explorationId) { | |
| _sendEventToGoogleAnalytics( | |
| 'ClickHelpButton', 'click', explorationId); | |
| }, | |
| registerVisitHelpCenterEvent: function(explorationId) { | |
| _sendEventToGoogleAnalytics( | |
| 'VisitHelpCenter', 'click', explorationId); | |
| }, | |
| registerOpenTutorialFromHelpCenterEvent: function(explorationId) { | |
| _sendEventToGoogleAnalytics( | |
| 'OpenTutorialFromHelpCenter', 'click', explorationId); | |
| }, | |
| // Metrics for exiting the tutorial | |
| registerSkipTutorialEvent: function(explorationId) { | |
| _sendEventToGoogleAnalytics( | |
| 'SkipTutorial', 'click', explorationId); | |
| }, | |
| registerFinishTutorialEvent: function(explorationId) { | |
| _sendEventToGoogleAnalytics( | |
| 'FinishTutorial', 'click', explorationId); | |
| }, | |
| // Metrics for first time editor use | |
| registerEditorFirstEntryEvent: function(explorationId) { | |
| _sendEventToGoogleAnalytics( | |
| 'FirstEnterEditor', 'open', explorationId); | |
| }, | |
| registerFirstOpenContentBoxEvent: function(explorationId) { | |
| _sendEventToGoogleAnalytics( | |
| 'FirstOpenContentBox', 'open', explorationId); | |
| }, | |
| registerFirstSaveContentEvent: function(explorationId) { | |
| _sendEventToGoogleAnalytics( | |
| 'FirstSaveContent', 'click', explorationId); | |
| }, | |
| registerFirstClickAddInteractionEvent: function(explorationId) { | |
| _sendEventToGoogleAnalytics( | |
| 'FirstClickAddInteraction', 'click', explorationId); | |
| }, | |
| registerFirstSelectInteractionTypeEvent: function(explorationId) { | |
| _sendEventToGoogleAnalytics( | |
| 'FirstSelectInteractionType', 'click', explorationId); | |
| }, | |
| registerFirstSaveInteractionEvent: function(explorationId) { | |
| _sendEventToGoogleAnalytics( | |
| 'FirstSaveInteraction', 'click', explorationId); | |
| }, | |
| registerFirstSaveRuleEvent: function(explorationId) { | |
| _sendEventToGoogleAnalytics( | |
| 'FirstSaveRule', 'click', explorationId); | |
| }, | |
| registerFirstCreateSecondStateEvent: function(explorationId) { | |
| _sendEventToGoogleAnalytics( | |
| 'FirstCreateSecondState', 'create', explorationId); | |
| }, | |
| // Metrics for publishing explorations | |
| registerSavePlayableExplorationEvent: function(explorationId) { | |
| _sendEventToGoogleAnalytics( | |
| 'SavePlayableExploration', 'save', explorationId); | |
| }, | |
| registerOpenPublishExplorationModalEvent: function(explorationId) { | |
| _sendEventToGoogleAnalytics( | |
| 'PublishExplorationModal', 'open', explorationId); | |
| }, | |
| registerPublishExplorationEvent: function(explorationId) { | |
| _sendEventToGoogleAnalytics( | |
| 'PublishExploration', 'click', explorationId); | |
| } | |
| }; | |
| }]); | |
| // Service for debouncing function calls. | |
| oppia.factory('oppiaDebouncer', [function() { | |
| return { | |
| // Returns a function that will not be triggered as long as it continues to | |
| // be invoked. The function only gets executed after it stops being called | |
| // for `wait` milliseconds. | |
| debounce: function(func, millisecsToWait) { | |
| var timeout; | |
| var context; | |
| var args; | |
| var timestamp; | |
| var result; | |
| var later = function() { | |
| var last = new Date().getTime() - timestamp; | |
| if (last < millisecsToWait && last > 0) { | |
| timeout = setTimeout(later, millisecsToWait - last); | |
| } else { | |
| timeout = null; | |
| result = func.apply(context, args); | |
| if (!timeout) { | |
| context = null; | |
| args = null; | |
| } | |
| } | |
| }; | |
| return function() { | |
| context = this; | |
| args = arguments; | |
| timestamp = new Date().getTime(); | |
| if (!timeout) { | |
| timeout = setTimeout(later, millisecsToWait); | |
| } | |
| return result; | |
| }; | |
| } | |
| }; | |
| }]); | |
| // Service for assembling extension tags (for gadgets and interactions). | |
| oppia.factory('extensionTagAssemblerService', [ | |
| '$filter', 'oppiaHtmlEscaper', function($filter, oppiaHtmlEscaper) { | |
| return { | |
| formatCustomizationArgAttrs: function(element, customizationArgSpecs) { | |
| for (var caSpecName in customizationArgSpecs) { | |
| var caSpecValue = customizationArgSpecs[caSpecName].value; | |
| element.attr( | |
| $filter('camelCaseToHyphens')(caSpecName) + '-with-value', | |
| oppiaHtmlEscaper.objToEscapedJson(caSpecValue)); | |
| } | |
| return element; | |
| } | |
| }; | |
| }]); | |
| // Add a String.prototype.trim() polyfill for IE8. | |
| if (typeof String.prototype.trim !== 'function') { | |
| String.prototype.trim = function() { | |
| return this.replace(/^\s+|\s+$/g, ''); | |
| }; | |
| } | |
| // Add an Object.create() polyfill for IE8. | |
| if (typeof Object.create !== 'function') { | |
| (function() { | |
| var F = function() {}; | |
| Object.create = function(o) { | |
| if (arguments.length > 1) { | |
| throw Error('Second argument for Object.create() is not supported'); | |
| } | |
| if (o === null) { | |
| throw Error('Cannot set a null [[Prototype]]'); | |
| } | |
| if (typeof o !== 'object') { | |
| throw TypeError('Argument must be an object'); | |
| } | |
| F.prototype = o; | |
| return new F(); | |
| }; | |
| })(); | |
| } | |
| // Service for code normalization. Used by the code REPL and pencil code | |
| // interactions. | |
| oppia.factory('codeNormalizationService', [function() { | |
| var removeLeadingWhitespace = function(str) { | |
| return str.replace(/^\s+/g, ''); | |
| }; | |
| var removeTrailingWhitespace = function(str) { | |
| return str.replace(/\s+$/g, ''); | |
| }; | |
| var removeIntermediateWhitespace = function(str) { | |
| return str.replace(/\s+/g, ' '); | |
| }; | |
| var normalizeCaseInStrings = function(str) { | |
| // Note that this only takes into account single-line strings. It also | |
| // tries to properly account for escaped characters. | |
| var inSingleQuotedString = false; | |
| var inDoubleQuotedString = false; | |
| var answer = ''; | |
| for (var i = 0; i < str.length; i++) { | |
| if (str[i] === '\\') { | |
| answer += str[i]; | |
| i++; | |
| if (i < str.length) { | |
| answer += str[i]; | |
| } | |
| } else if (inSingleQuotedString) { | |
| answer += str[i].toLowerCase(); | |
| if (str[i] === '\'') { | |
| inSingleQuotedString = false; | |
| } | |
| } else if (inDoubleQuotedString) { | |
| answer += str[i].toLowerCase(); | |
| if (str[i] === '"') { | |
| inDoubleQuotedString = false; | |
| } | |
| } else { | |
| if (str[i] === '\'') { | |
| inSingleQuotedString = true; | |
| } else if (str[i] === '"') { | |
| inDoubleQuotedString = true; | |
| } | |
| answer += str[i]; | |
| } | |
| } | |
| // If the string is invalid (with regards to quotation marks), just return | |
| // it without normalization. | |
| if (inSingleQuotedString || inDoubleQuotedString) { | |
| answer = str; | |
| } | |
| return answer; | |
| }; | |
| return { | |
| getNormalizedCode: function(codeString) { | |
| /* | |
| * Normalizes a code string (which is assumed not to contain tab | |
| * characters). In particular: | |
| * | |
| * - Strips out lines that start with '#' (comments), possibly preceded by | |
| * whitespace. | |
| * - Trims trailing whitespace on each line, and normalizes multiple | |
| * whitespace characters within a single line into one space | |
| * character. | |
| * - Removes blank newlines. | |
| * - Make the indentation level four spaces. | |
| */ | |
| // TODO(sll): Augment this function to strip out comments that occur at | |
| // the end of a line. However, be careful with lines where '#' is | |
| // contained in quotes or the character is escaped. | |
| var FOUR_SPACES = ' '; | |
| // Maps the number of spaces at the beginning of a line to an int | |
| // specifying the desired indentation level. | |
| var numSpacesToDesiredIndentLevel = { | |
| 0: 0 | |
| }; | |
| var codeLines = removeTrailingWhitespace(codeString).split('\n'); | |
| var normalizedCodeLines = []; | |
| codeLines.forEach(function(line) { | |
| if (removeLeadingWhitespace(line).indexOf('#') === 0) { | |
| return; | |
| } | |
| line = removeTrailingWhitespace(line); | |
| if (!line) { | |
| return; | |
| } | |
| var numSpaces = line.length - removeLeadingWhitespace(line).length; | |
| var existingNumSpaces = Object.keys(numSpacesToDesiredIndentLevel); | |
| var maxNumSpaces = Math.max.apply(null, existingNumSpaces); | |
| if (numSpaces > maxNumSpaces) { | |
| // Add a new indentation level | |
| numSpacesToDesiredIndentLevel[numSpaces] = existingNumSpaces.length; | |
| } | |
| // This is set when the indentation level of the current line does not | |
| // start a new scope, and also does not match any previous indentation | |
| // level. This case is actually invalid, but for now, we take the | |
| // largest indentation level that is less than this one. | |
| // TODO(sll): Bad indentation should result in an error nearer the | |
| // source. | |
| var isShortfallLine = | |
| !numSpacesToDesiredIndentLevel.hasOwnProperty(numSpaces) && | |
| numSpaces < maxNumSpaces; | |
| // Clear all existing indentation levels to the right of this one. | |
| for (var indentLength in numSpacesToDesiredIndentLevel) { | |
| if (Number(indentLength) > numSpaces) { | |
| delete numSpacesToDesiredIndentLevel[indentLength]; | |
| } | |
| } | |
| if (isShortfallLine) { | |
| existingNumSpaces = Object.keys(numSpacesToDesiredIndentLevel); | |
| numSpaces = Math.max.apply(null, existingNumSpaces); | |
| } | |
| var normalizedLine = ''; | |
| for (var i = 0; i < numSpacesToDesiredIndentLevel[numSpaces]; i++) { | |
| normalizedLine += FOUR_SPACES; | |
| } | |
| normalizedLine += normalizeCaseInStrings(removeIntermediateWhitespace( | |
| removeLeadingWhitespace(line))); | |
| normalizedCodeLines.push(normalizedLine); | |
| }); | |
| return normalizedCodeLines.join('\n'); | |
| } | |
| }; | |
| }]); | |
| (function() {// Copyright 2014 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| /** | |
| * @fileoverview Oppia's base controller. | |
| */ | |
| // TODO(sll): Get this to read from a common JSON file; it's replicated in | |
| // feconf. | |
| oppia.constant('CATEGORY_LIST', GLOBALS.ALL_CATEGORIES || []); | |
| // We use a slash because this character is forbidden in a state name. | |
| oppia.constant('PLACEHOLDER_OUTCOME_DEST', '/'); | |
| oppia.constant('DEFAULT_RULE_NAME', 'Default'); | |
| oppia.constant('CLASSIFIER_RULESPEC_STR', 'FuzzyMatches'); | |
| // Feature still in development. | |
| // NOTE TO DEVELOPERS: This should be synchronized with the value in feconf. | |
| oppia.constant('ENABLE_STRING_CLASSIFIER', false); | |
| oppia.constant('DEFAULT_CLASSIFIER_RULE_SPEC', { | |
| rule_type: 'FuzzyMatches', | |
| inputs: { | |
| training_data: [] | |
| } | |
| }); | |
| oppia.constant('EVENT_HTML_CHANGED', 'htmlChanged'); | |
| oppia.constant('PARAMETER_TYPES', { | |
| REAL: 'Real', | |
| UNICODE_STRING: 'UnicodeString' | |
| }); | |
| oppia.constant('INTERACTION_DISPLAY_MODE_INLINE', 'inline'); | |
| oppia.constant('OBJECT_EDITOR_URL_PREFIX', '/object_editor_template/'); | |
| // The maximum number of nodes to show in a row of the state graph. | |
| oppia.constant('MAX_NODES_PER_ROW', 4); | |
| // The following variable must be at least 3. It represents the maximum length, | |
| // in characters, for the name of each node label in the state graph. | |
| oppia.constant('MAX_NODE_LABEL_LENGTH', 15); | |
| // If an $http request fails with the following error codes, a warning is | |
| // displayed using alertsService. | |
| oppia.constant('FATAL_ERROR_CODES', [400, 401, 404, 500]); | |
| // Global utility methods. | |
| oppia.controller('Base', [ | |
| '$scope', '$http', '$rootScope', '$window', '$timeout', '$document', '$log', | |
| 'alertsService', 'LABEL_FOR_CLEARING_FOCUS', 'siteAnalyticsService', | |
| 'windowDimensionsService', 'UrlInterpolationService', | |
| function( | |
| $scope, $http, $rootScope, $window, $timeout, $document, $log, | |
| alertsService, LABEL_FOR_CLEARING_FOCUS, siteAnalyticsService, | |
| windowDimensionsService, UrlInterpolationService) { | |
| $rootScope.DEV_MODE = GLOBALS.DEV_MODE; | |
| $scope.alertsService = alertsService; | |
| $scope.LABEL_FOR_CLEARING_FOCUS = LABEL_FOR_CLEARING_FOCUS; | |
| // If this is nonempty, the whole page goes into 'Loading...' mode. | |
| $rootScope.loadingMessage = ''; | |
| if (GLOBALS.userIsLoggedIn) { | |
| // Show the number of unseen notifications in the navbar and page title, | |
| // unless the user is already on the dashboard page. | |
| $http.get('/notificationshandler').then(function(response) { | |
| var data = response.data; | |
| if ($window.location.pathname !== '/') { | |
| $scope.numUnseenNotifications = data.num_unseen_notifications; | |
| if ($scope.numUnseenNotifications > 0) { | |
| $window.document.title = ( | |
| '(' + $scope.numUnseenNotifications + ') ' + | |
| $window.document.title); | |
| } | |
| } | |
| }); | |
| } | |
| $scope.getStaticImageUrl = UrlInterpolationService.getStaticImageUrl; | |
| // This method is here because the trigger for the tutorial is in the site | |
| // navbar. It broadcasts an event to tell the exploration editor to open the | |
| // editor tutorial. | |
| $scope.openEditorTutorial = function() { | |
| $scope.$broadcast('openEditorTutorial'); | |
| }; | |
| // The following methods and listeners relate to the global navigation | |
| // sidebar. | |
| $scope.openSidebar = function() { | |
| if (!$scope.sidebarIsShown) { | |
| $scope.sidebarIsShown = true; | |
| $scope.pendingSidebarClick = true; | |
| } else { | |
| $scope.sidebarIsShown = false; | |
| $scope.pendingSidebarClick = false; | |
| } | |
| }; | |
| // TODO(sll): use 'touchstart' for mobile. | |
| $document.on('click', function() { | |
| if (!$scope.pendingSidebarClick) { | |
| $scope.sidebarIsShown = false; | |
| } else { | |
| $scope.pendingSidebarClick = false; | |
| } | |
| $scope.$apply(); | |
| }); | |
| $scope.profileDropdownIsActive = false; | |
| $scope.onMouseoverProfilePictureOrDropdown = function(evt) { | |
| angular.element(evt.currentTarget).parent().addClass('open'); | |
| $scope.profileDropdownIsActive = true; | |
| }; | |
| $scope.onMouseoutProfilePictureOrDropdown = function(evt) { | |
| angular.element(evt.currentTarget).parent().removeClass('open'); | |
| $scope.profileDropdownIsActive = false; | |
| }; | |
| $scope.onMouseoverDropdownMenu = function(evt) { | |
| angular.element(evt.currentTarget).parent().addClass('open'); | |
| }; | |
| $scope.onMouseoutDropdownMenu = function(evt) { | |
| angular.element(evt.currentTarget).parent().removeClass('open'); | |
| }; | |
| $scope.onLoginButtonClicked = function(loginUrl) { | |
| siteAnalyticsService.registerStartLoginEvent('loginButton'); | |
| $timeout(function() { | |
| $window.location = loginUrl; | |
| }, 150); | |
| return false; | |
| }; | |
| var doesNavbarHaveSearchBar = function() { | |
| return ( | |
| $window.location.pathname.indexOf('/search') === 0 || | |
| $window.location.pathname.indexOf('/library') === 0); | |
| }; | |
| var navbarCutoffWidthPx = doesNavbarHaveSearchBar() ? 1171 : 800; | |
| $scope.windowIsNarrow = ( | |
| windowDimensionsService.getWidth() <= navbarCutoffWidthPx); | |
| $scope.openSidebarOnSwipe = function() { | |
| if ($scope.windowIsNarrow) { | |
| if (!$scope.sidebarIsShown) { | |
| $scope.sidebarIsShown = true; | |
| $scope.pendingSidebarClick = true; | |
| } | |
| } | |
| }; | |
| $scope.closeSidebarOnSwipe = function() { | |
| if ($scope.windowIsNarrow) { | |
| if ($scope.sidebarIsShown) { | |
| $scope.sidebarIsShown = false; | |
| $scope.pendingSidebarClick = false; | |
| } | |
| } | |
| }; | |
| windowDimensionsService.registerOnResizeHook(function() { | |
| $scope.windowIsNarrow = ( | |
| windowDimensionsService.getWidth() <= navbarCutoffWidthPx); | |
| $scope.$apply(); | |
| // If the window is now wide, and the sidebar is still open, close it. | |
| if (!$scope.windowIsNarrow) { | |
| $scope.sidebarIsShown = false; | |
| } | |
| }); | |
| $scope.pageHasLoaded = false; | |
| $scope.pendingSidebarClick = false; | |
| $scope.sidebarIsShown = false; | |
| $timeout(function() { | |
| $scope.pageHasLoaded = true; | |
| }, 500); | |
| } | |
| ]); | |
| })(); | |
| (function() {// Copyright 2014 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| /** | |
| * @fileoverview Directives that are not associated with reusable components. | |
| * NB: Reusable component directives should go in the components/ folder. | |
| */ | |
| // HTML bind directive that trusts the value it is given and also evaluates | |
| // custom directive tags in the provided value. | |
| oppia.directive('angularHtmlBind', ['$compile', '$timeout', | |
| 'EVENT_HTML_CHANGED', function($compile, $timeout, EVENT_HTML_CHANGED) { | |
| return { | |
| restrict: 'A', | |
| link: function(scope, elm, attrs) { | |
| scope.$watch(attrs.angularHtmlBind, function(newValue) { | |
| // Inform child components that the value of the HTML string has | |
| // changed, so that they can perform any necessary cleanup. | |
| scope.$broadcast(EVENT_HTML_CHANGED); | |
| $timeout(function() { | |
| elm.html(newValue); | |
| $compile(elm.contents())(scope); | |
| }, 10); | |
| }); | |
| } | |
| }; | |
| }]); | |
| oppia.directive('mathjaxBind', [function() { | |
| return { | |
| restrict: 'A', | |
| controller: [ | |
| '$scope', '$element', '$attrs', function($scope, $element, $attrs) { | |
| $scope.$watch($attrs.mathjaxBind, function(value) { | |
| var $script = angular.element( | |
| '<script type="math/tex">' | |
| ).html(value === undefined ? '' : value); | |
| $element.html(''); | |
| $element.append($script); | |
| MathJax.Hub.Queue(['Reprocess', MathJax.Hub, $element[0]]); | |
| }); | |
| } | |
| ] | |
| }; | |
| }]); | |
| // Highlights the text of an input field when it is clicked. | |
| oppia.directive('selectOnClick', [function() { | |
| return { | |
| restrict: 'A', | |
| link: function(scope, elm) { | |
| elm.bind('click', function() { | |
| this.select(); | |
| }); | |
| } | |
| }; | |
| }]); | |
| // A popover that is shown when its label is hovered or clicked upon, and | |
| // disappears when focus moves away from its label. | |
| oppia.directive('customPopover', ['$sce', function($sce) { | |
| return { | |
| restrict: 'A', | |
| template: ( | |
| '<div style="cursor: pointer;" ng-click="showPopover()"><[label]></div>' | |
| ), | |
| link: function(scope, elt, attrs) { | |
| scope.label = attrs.popoverLabel; | |
| $(elt).popover({ | |
| trigger: 'hover', | |
| html: true, | |
| content: $sce.getTrustedHtml( | |
| '<pre class="oppia-pre-wrapped-text">' + attrs.popoverText + | |
| '</pre>'), | |
| placement: attrs.popoverPlacement | |
| }); | |
| }, | |
| controller: ['$scope', '$element', function($scope, $element) { | |
| $scope.isShown = false; | |
| $element.on('shown.bs.popover', function() { | |
| $scope.isShown = true; | |
| }); | |
| $element.on('hidden.bs.popover', function() { | |
| $scope.isShown = false; | |
| }); | |
| $scope.showPopover = function() { | |
| if (!$scope.isShown) { | |
| $element.popover('show'); | |
| } | |
| }; | |
| }] | |
| }; | |
| }]); | |
| // When set as an attr of an <input> element, moves focus to that element | |
| // when a 'focusOn' event is broadcast. | |
| oppia.directive('focusOn', [ | |
| 'LABEL_FOR_CLEARING_FOCUS', function(LABEL_FOR_CLEARING_FOCUS) { | |
| return function(scope, elt, attrs) { | |
| scope.$on('focusOn', function(e, name) { | |
| if (name === attrs.focusOn) { | |
| elt[0].focus(); | |
| } | |
| // If the purpose of the focus switch was to clear focus, blur the | |
| // element. | |
| if (name === LABEL_FOR_CLEARING_FOCUS) { | |
| elt[0].blur(); | |
| } | |
| }); | |
| }; | |
| } | |
| ]); | |
| oppia.directive('imageUploader', [function() { | |
| return { | |
| restrict: 'E', | |
| scope: { | |
| height: '@', | |
| onFileChanged: '=', | |
| width: '@' | |
| }, | |
| templateUrl: 'components/imageUploader', | |
| link: function(scope, elt) { | |
| var onDragEnd = function(e) { | |
| e.preventDefault(); | |
| $(elt).removeClass('image-uploader-is-active'); | |
| }; | |
| $(elt).bind('drop', function(e) { | |
| onDragEnd(e); | |
| scope.onFileChanged( | |
| e.originalEvent.dataTransfer.files[0], | |
| e.originalEvent.dataTransfer.files[0].name); | |
| }); | |
| $(elt).bind('dragover', function(e) { | |
| e.preventDefault(); | |
| $(elt).addClass('image-uploader-is-active'); | |
| }); | |
| $(elt).bind('dragleave', onDragEnd); | |
| // We generate a random class name to distinguish this input from | |
| // others in the DOM. | |
| scope.fileInputClassName = ( | |
| 'image-uploader-file-input' + Math.random().toString(36).substring(5)); | |
| angular.element(document).on( | |
| 'change', '.' + scope.fileInputClassName, function(evt) { | |
| scope.onFileChanged( | |
| evt.currentTarget.files[0], | |
| evt.target.value.split(/(\\|\/)/g).pop()); | |
| }); | |
| } | |
| }; | |
| }]); | |
| oppia.directive('mobileFriendlyTooltip', ['$timeout', function($timeout) { | |
| return { | |
| restrict: 'A', | |
| scope: true, | |
| controller: ['$scope', 'deviceInfoService', function( | |
| $scope, deviceInfoService) { | |
| $scope.opened = false; | |
| $scope.deviceHasTouchEvents = deviceInfoService.hasTouchEvents(); | |
| }], | |
| link: function(scope, element) { | |
| var TIME_TOOLTIP_CLOSE_DELAY_MOBILE = 1000; | |
| if (scope.deviceHasTouchEvents) { | |
| element.on('touchstart', function() { | |
| scope.opened = true; | |
| scope.$apply(); | |
| }); | |
| element.on('touchend', function() { | |
| // Set time delay before tooltip close | |
| $timeout(function() { | |
| scope.opened = false; | |
| }, TIME_TOOLTIP_CLOSE_DELAY_MOBILE); | |
| }); | |
| } else { | |
| element.on('mouseenter', function() { | |
| scope.opened = true; | |
| scope.$apply(); | |
| }); | |
| element.on('mouseleave', function() { | |
| scope.opened = false; | |
| scope.$apply(); | |
| }); | |
| }; | |
| } | |
| }; | |
| }]); | |
| oppia.directive('scrollOnClick', function() { | |
| return { | |
| restrict: 'A', | |
| scope: { | |
| isDropdownOpen: '=isDropdownOpen', | |
| isPrivate: '=isPrivate' | |
| }, | |
| link: function(scope, element) { | |
| var isDisabled; | |
| scope.$watch('isDropdownOpen', function() { | |
| isDisabled = scope.isDropdownOpen || scope.isPrivate; | |
| }); | |
| element.on('click', function() { | |
| if (!isDisabled) { | |
| $('html, body').animate({ | |
| scrollTop: element.offset().top - 60 | |
| }, 'slow'); | |
| } | |
| }); | |
| } | |
| }; | |
| }); | |
| })(); | |
| (function() {// Copyright 2014 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| /** | |
| * @fileoverview Filters for Oppia. | |
| */ | |
| oppia.constant('RULE_SUMMARY_WRAP_CHARACTER_COUNT', 30); | |
| oppia.filter('spacesToUnderscores', [function() { | |
| return function(input) { | |
| return input.trim().replace(/ /g, '_'); | |
| }; | |
| }]); | |
| oppia.filter('underscoresToCamelCase', [function() { | |
| return function(input) { | |
| return input.replace(/_+(.)/g, function(match, group1) { | |
| return group1.toUpperCase(); | |
| }); | |
| }; | |
| }]); | |
| oppia.filter('camelCaseToHyphens', [function() { | |
| return function(input) { | |
| var result = input.replace(/([a-z])?([A-Z])/g, '$1-$2').toLowerCase(); | |
| if (result[0] === '-') { | |
| result = result.substring(1); | |
| } | |
| return result; | |
| }; | |
| }]); | |
| // Filter that truncates long descriptors. | |
| oppia.filter('truncate', ['$filter', function($filter) { | |
| return function(input, length, suffix) { | |
| if (!input) { | |
| return ''; | |
| } | |
| if (isNaN(length)) { | |
| length = 70; | |
| } | |
| if (suffix === undefined) { | |
| suffix = '...'; | |
| } | |
| if (!angular.isString(input)) { | |
| input = String(input); | |
| } | |
| input = $filter('convertToPlainText')(input); | |
| return ( | |
| input.length <= length ? input : ( | |
| input.substring(0, length - suffix.length) + suffix)); | |
| }; | |
| }]); | |
| oppia.filter('truncateAtFirstLine', [function() { | |
| return function(input) { | |
| if (!input) { | |
| return input; | |
| } | |
| var pattern = /(\r\n|[\n\v\f\r\x85\u2028\u2029])/g; | |
| // Normalize line endings then split using the normalized delimiter. | |
| var lines = input.replace(pattern, '\n').split('\n'); | |
| var firstNonemptyLineIndex = -1; | |
| var otherNonemptyLinesExist = false; | |
| for (var i = 0; i < lines.length; i++) { | |
| if (lines[i].length > 0) { | |
| if (firstNonemptyLineIndex === -1) { | |
| firstNonemptyLineIndex = i; | |
| } else { | |
| otherNonemptyLinesExist = true; | |
| break; | |
| } | |
| } | |
| } | |
| var suffix = otherNonemptyLinesExist ? '...' : ''; | |
| return ( | |
| firstNonemptyLineIndex !== -1 ? | |
| lines[firstNonemptyLineIndex] + suffix : ''); | |
| }; | |
| }]); | |
| // Filter that rounds a number to 1 decimal place. | |
| oppia.filter('round1', [function() { | |
| return function(input) { | |
| return Math.round(input * 10) / 10; | |
| }; | |
| }]); | |
| // Filter that replaces all {{...}} in a string with '...'. | |
| oppia.filter('replaceInputsWithEllipses', [function() { | |
| var pattern = /\{\{\s*(\w+)\s*(\|\s*\w+\s*)?\}\}/g; | |
| return function(input) { | |
| return input ? input.replace(pattern, '...') : ''; | |
| }; | |
| }]); | |
| // Filter that truncates a string at the first '...'. | |
| oppia.filter('truncateAtFirstEllipsis', [function() { | |
| var pattern = /\.\.\./g; | |
| return function(input) { | |
| if (!input) { | |
| return ''; | |
| } | |
| var matchLocation = input.search(pattern); | |
| return matchLocation === -1 ? input : (input.substring(0, matchLocation)); | |
| }; | |
| }]); | |
| oppia.filter('wrapTextWithEllipsis', ['$filter', function($filter) { | |
| return function(input, characterCount) { | |
| if (typeof input === 'string' || input instanceof String) { | |
| input = $filter('normalizeWhitespace')(input); | |
| if (input.length <= characterCount || characterCount < 3) { | |
| // String fits within the criteria; no wrapping is necessary. | |
| return input; | |
| } | |
| // Replace characters counting backwards from character count with an | |
| // ellipsis, then trim the string. | |
| return input.substr(0, characterCount - 3).trim() + '...'; | |
| } else { | |
| return input; | |
| } | |
| }; | |
| }]); | |
| // Filter that returns true iff an outcome has a self-loop and no feedback. | |
| oppia.filter('isOutcomeConfusing', [function() { | |
| return function(outcome, currentStateName) { | |
| return ( | |
| outcome.dest === currentStateName && | |
| !outcome.feedback.some(function(feedbackItem) { | |
| return feedbackItem.trim().length > 0; | |
| }) | |
| ); | |
| }; | |
| }]); | |
| // Filter that changes {{...}} tags into the corresponding parameter input | |
| // values. Note that this returns an HTML string to accommodate the case of | |
| // multiple-choice input and image-click input. | |
| oppia.filter('parameterizeRuleDescription', [ | |
| 'INTERACTION_SPECS', function(INTERACTION_SPECS) { | |
| return function(rule, interactionId, choices) { | |
| if (!rule) { | |
| return ''; | |
| } | |
| if (!INTERACTION_SPECS.hasOwnProperty(interactionId)) { | |
| console.error('Cannot find interaction with id ' + interactionId); | |
| return ''; | |
| } | |
| var description = INTERACTION_SPECS[interactionId].rule_descriptions[ | |
| rule.rule_type]; | |
| if (!description) { | |
| console.error( | |
| 'Cannot find description for rule ' + rule.rule_type + | |
| ' for interaction ' + interactionId); | |
| return ''; | |
| } | |
| var inputs = rule.inputs; | |
| var finalDescription = description; | |
| var PATTERN = /\{\{\s*(\w+)\s*(\|\s*\w+\s*)?\}\}/; | |
| var iter = 0; | |
| while (true) { | |
| if (!description.match(PATTERN) || iter === 100) { | |
| break; | |
| } | |
| iter++; | |
| var varName = description.match(PATTERN)[1]; | |
| var varType = description.match(PATTERN)[2]; | |
| if (varType) { | |
| varType = varType.substring(1); | |
| } | |
| var replacementText = '[INVALID]'; | |
| // Special case for MultipleChoiceInput, ImageClickInput, and | |
| // ItemSelectionInput. | |
| if (choices) { | |
| if (varType === 'SetOfHtmlString') { | |
| replacementText = '['; | |
| var key = inputs[varName]; | |
| for (var i = 0; i < key.length; i++) { | |
| replacementText += key[i]; | |
| if (i < key.length - 1) { | |
| replacementText += ','; | |
| } | |
| } | |
| replacementText += ']'; | |
| } else { | |
| // The following case is for MultipleChoiceInput | |
| for (var i = 0; i < choices.length; i++) { | |
| if (choices[i].val === inputs[varName]) { | |
| replacementText = '\'' + choices[i].label + '\''; | |
| } | |
| } | |
| } | |
| // TODO(sll): Generalize this to use the inline string representation of | |
| // an object type. | |
| } else if (varType === 'MusicPhrase') { | |
| replacementText = '['; | |
| for (var i = 0; i < inputs[varName].length; i++) { | |
| if (i !== 0) { | |
| replacementText += ', '; | |
| } | |
| replacementText += inputs[varName][i].readableNoteName; | |
| } | |
| replacementText += ']'; | |
| } else if (varType === 'CoordTwoDim') { | |
| var latitude = inputs[varName][0] || 0.0; | |
| var longitude = inputs[varName][1] || 0.0; | |
| replacementText = '('; | |
| replacementText += ( | |
| inputs[varName][0] >= 0.0 ? | |
| latitude.toFixed(2) + '\xb0N' : | |
| -latitude.toFixed(2) + '\xb0S'); | |
| replacementText += ', '; | |
| replacementText += ( | |
| inputs[varName][1] >= 0.0 ? | |
| longitude.toFixed(2) + '\xb0E' : | |
| -longitude.toFixed(2) + '\xb0W'); | |
| replacementText += ')'; | |
| } else if (varType === 'NormalizedString') { | |
| replacementText = '"' + inputs[varName] + '"'; | |
| } else if (varType === 'Graph') { | |
| replacementText = '[reference graph]'; | |
| } else { | |
| replacementText = inputs[varName]; | |
| } | |
| description = description.replace(PATTERN, ' '); | |
| finalDescription = finalDescription.replace(PATTERN, replacementText); | |
| } | |
| return finalDescription; | |
| }; | |
| }]); | |
| // Filter that removes whitespace from the beginning and end of a string, and | |
| // replaces interior whitespace with a single space character. | |
| oppia.filter('normalizeWhitespace', [function() { | |
| return function(input) { | |
| if (typeof input === 'string' || input instanceof String) { | |
| // Remove whitespace from the beginning and end of the string, and | |
| // replace interior whitespace with a single space character. | |
| input = input.trim(); | |
| input = input.replace(/\s{2,}/g, ' '); | |
| return input; | |
| } else { | |
| return input; | |
| } | |
| }; | |
| }]); | |
| oppia.filter('convertToPlainText', [function() { | |
| return function(input) { | |
| var strippedText = input.replace(/(<([^>]+)>)/ig, ''); | |
| strippedText = strippedText.replace(' ', ' '); | |
| var trimmedText = strippedText.trim(); | |
| if (trimmedText.length === 0) { | |
| return strippedText; | |
| } else { | |
| return trimmedText; | |
| } | |
| }; | |
| }]); | |
| oppia.filter('summarizeAnswerGroup', [ | |
| '$filter', 'RULE_SUMMARY_WRAP_CHARACTER_COUNT', | |
| function($filter, RULE_SUMMARY_WRAP_CHARACTER_COUNT) { | |
| return function(answerGroup, interactionId, answerChoices, shortenRule) { | |
| var summary = ''; | |
| var outcome = answerGroup.outcome; | |
| var hasFeedback = outcome.feedback.length > 0 && outcome.feedback[0]; | |
| if (answerGroup.rule_specs) { | |
| var firstRule = $filter('convertToPlainText')( | |
| $filter('parameterizeRuleDescription')( | |
| answerGroup.rule_specs[0], interactionId, answerChoices)); | |
| summary = 'Answer ' + firstRule; | |
| if (hasFeedback && shortenRule) { | |
| summary = $filter('wrapTextWithEllipsis')( | |
| summary, RULE_SUMMARY_WRAP_CHARACTER_COUNT); | |
| } | |
| summary = '[' + summary + '] '; | |
| } | |
| if (hasFeedback) { | |
| summary += $filter('convertToPlainText')(outcome.feedback[0]); | |
| } | |
| return summary; | |
| }; | |
| }]); | |
| oppia.filter('summarizeDefaultOutcome', [ | |
| '$filter', 'RULE_SUMMARY_WRAP_CHARACTER_COUNT', | |
| function($filter, RULE_SUMMARY_WRAP_CHARACTER_COUNT) { | |
| return function( | |
| defaultOutcome, interactionId, answerGroupCount, shortenRule) { | |
| if (!defaultOutcome) { | |
| return ''; | |
| } | |
| var summary = ''; | |
| var feedback = defaultOutcome.feedback; | |
| var hasFeedback = feedback.length > 0 && feedback[0]; | |
| if (interactionId === 'Continue') { | |
| summary = 'When the button is clicked'; | |
| } else if (answerGroupCount > 0) { | |
| summary = 'All other answers'; | |
| } else { | |
| summary = 'All answers'; | |
| } | |
| if (hasFeedback && shortenRule) { | |
| summary = $filter('wrapTextWithEllipsis')( | |
| summary, RULE_SUMMARY_WRAP_CHARACTER_COUNT); | |
| } | |
| summary = '[' + summary + '] '; | |
| if (hasFeedback) { | |
| summary += $filter('convertToPlainText')(defaultOutcome.feedback[0]); | |
| } | |
| return summary; | |
| }; | |
| }]); | |
| // Filter that summarizes a large number to a decimal followed by | |
| // the appropriate metric prefix (K, M or B). For example, 167656 | |
| // becomes 167.7K. | |
| // Users of this filter should ensure that the input is a non-negative number. | |
| oppia.filter('summarizeNonnegativeNumber', [function() { | |
| return function(input) { | |
| input = Number(input); | |
| // Nine zeros for billions (e.g. 146008788788 --> 146.0B). | |
| // Six zeros for millions (e.g. 146008788 --> 146.0M). | |
| // Three zeros for thousands (e.g. 146008 --> 146.0K). | |
| // No change for small numbers (e.g. 12 --> 12). | |
| return ( | |
| input >= 1.0e+9 ? (input / 1.0e+9).toFixed(1) + 'B' : | |
| input >= 1.0e+6 ? (input / 1.0e+6).toFixed(1) + 'M' : | |
| input >= 1.0e+3 ? (input / 1.0e+3).toFixed(1) + 'K' : | |
| input); | |
| }; | |
| }]); | |
| // Note that this filter does not truncate at the middle of a word. | |
| oppia.filter('truncateAndCapitalize', [function() { | |
| return function(input, maxNumberOfCharacters) { | |
| var words = input.trim().match(/\S+/g); | |
| // Capitalize the first word and add it to the result. | |
| var result = words[0].charAt(0).toUpperCase() + words[0].slice(1); | |
| // Add the remaining words to the result until the character limit is | |
| // reached. | |
| for (var i = 1; i < words.length; i++) { | |
| if (!maxNumberOfCharacters || | |
| result.length + 1 + words[i].length <= maxNumberOfCharacters) { | |
| result += ' '; | |
| result += words[i]; | |
| } else { | |
| result += '...'; | |
| break; | |
| } | |
| } | |
| return result; | |
| }; | |
| }]); | |
| oppia.filter('removeDuplicatesInArray', [function() { | |
| return function(input) { | |
| return input.filter(function(val, pos) { | |
| return input.indexOf(val) === pos; | |
| }); | |
| }; | |
| }]); | |
| })(); | |
| (function() {// Copyright 2015 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| /** | |
| * @fileoverview Translation functions for Oppia. | |
| * | |
| * @author milagro.teruel@gmail.com (Milagro Teruel) | |
| */ | |
| // Translations of strings that are loaded in the front page. They are listed | |
| // here to be loaded synchronously with the script to prevent a FOUC or | |
| // Flash of Untranslated Content. | |
| // See http://angular-translate.github.io/docs/#/guide/12_asynchronous-loading | |
| oppia.constant('DEFAULT_TRANSLATIONS', { | |
| I18N_LIBRARY_PAGE_TITLE: 'Library', | |
| I18N_LIBRARY_LOADING: 'Loading', | |
| I18N_SIGNUP_PAGE_SUBTITLE: 'Registration', | |
| I18N_SIGNUP_PAGE_TITLE: 'Oppia', | |
| I18N_LIBRARY_SEARCH_PLACEHOLDER: 'What are you curious about?', | |
| I18N_LIBRARY_ALL_LANGUAGES: 'All Languages', | |
| I18N_LIBRARY_LANGUAGES_EN: 'English', | |
| I18N_LIBRARY_ALL_CATEGORIES: 'All Categories', | |
| I18N_TOPNAV_SIGN_IN: 'Sign in', | |
| I18N_SPLASH_PAGE_TITLE: 'Oppia: Teach, Learn, Explore', | |
| I18N_SIGNUP_REGISTRATION: 'Registration', | |
| I18N_SIGNUP_LOADING: 'Loading' | |
| }); | |
| oppia.controller('I18nFooter', [ | |
| '$http', '$rootScope', '$scope', '$translate', '$timeout', | |
| function($http, $rootScope, $scope, $translate, $timeout) { | |
| // Changes the language of the translations. | |
| var preferencesDataUrl = '/preferenceshandler/data'; | |
| var siteLanguageUrl = '/save_site_language'; | |
| $scope.supportedSiteLanguages = GLOBALS.SUPPORTED_SITE_LANGUAGES; | |
| if (GLOBALS.userIsLoggedIn && GLOBALS.preferredSiteLanguageCode) { | |
| $translate.use(GLOBALS.preferredSiteLanguageCode); | |
| } | |
| // The $timeout seems to be necessary for the dropdown to show anything | |
| // at the outset, if the default language is not English. | |
| $timeout(function() { | |
| // $translate.use() returns undefined until the language file is fully | |
| // loaded, which causes a blank field in the dropdown, hence we use | |
| // $translate.proposedLanguage() as suggested in | |
| // http://stackoverflow.com/a/28903658 | |
| $scope.currentLanguageCode = $translate.use() || | |
| $translate.proposedLanguage(); | |
| }, 50); | |
| $scope.changeLanguage = function() { | |
| $translate.use($scope.currentLanguageCode); | |
| if (GLOBALS.userIsLoggedIn) { | |
| $http.put(siteLanguageUrl, { | |
| site_language_code: $scope.currentLanguageCode | |
| }); | |
| } | |
| }; | |
| }]); | |
| oppia.config([ | |
| '$translateProvider', 'DEFAULT_TRANSLATIONS', | |
| function($translateProvider, DEFAULT_TRANSLATIONS) { | |
| var availableLanguageKeys = []; | |
| var availableLanguageKeysMap = {}; | |
| for (var prop in GLOBALS.SUPPORTED_SITE_LANGUAGES) { | |
| availableLanguageKeys.push(prop); | |
| availableLanguageKeysMap[prop + '*'] = prop; | |
| } | |
| availableLanguageKeysMap['*'] = 'en'; | |
| $translateProvider | |
| .registerAvailableLanguageKeys( | |
| availableLanguageKeys, availableLanguageKeysMap) | |
| .useStaticFilesLoader({ | |
| prefix: GLOBALS.ASSET_DIR_PREFIX + '/assets/i18n/', | |
| suffix: '.json' | |
| }) | |
| // The use of default translation improves the loading time when English is | |
| // selected | |
| .translations('en', DEFAULT_TRANSLATIONS) | |
| .fallbackLanguage('en') | |
| .determinePreferredLanguage() | |
| .useCookieStorage() | |
| // The messageformat interpolation method is necessary for pluralization. | |
| // Is optional and should be passed as argument to the translate call. See | |
| // https://angular-translate.github.io/docs/#/guide/14_pluralization | |
| .addInterpolation('$translateMessageFormatInterpolation') | |
| // The strategy 'sanitize' does not support utf-8 encoding. | |
| // https://github.com/angular-translate/angular-translate/issues/1131 | |
| // The strategy 'escape' will brake strings with raw html, like hyperlinks | |
| .useSanitizeValueStrategy('sanitizeParameters') | |
| .forceAsyncReload(true); | |
| }]); | |
| // Service to dynamically construct translation ids for i18n. | |
| oppia.factory('i18nIdService', function() { | |
| return { | |
| // Construct a translation id for library from name and a prefix. | |
| // Ex: 'categories', 'art' -> 'I18N_LIBRARY_CATEGORIES_ART' | |
| getLibraryId: function(prefix, name) { | |
| return ( | |
| 'I18N_LIBRARY_' + prefix.toUpperCase() + '_' + | |
| name.toUpperCase().split(' ').join('_')); | |
| } | |
| }; | |
| }); | |
| })(); | |
| (function() {// Copyright 2016 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| /** | |
| * @fileoverview Controllers for side nav. | |
| */ | |
| oppia.controller('SideNav', [ | |
| '$scope', 'UrlInterpolationService', | |
| function( | |
| $scope, UrlInterpolationService) { | |
| $scope.getStaticImageUrl = UrlInterpolationService.getStaticImageUrl; | |
| } | |
| ]); | |
| })(); | |
| (function() {// Copyright 2014 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| /** | |
| * @fileoverview Directives for schema-based form builders. | |
| */ | |
| // NOTE TO DEVELOPERS: This forms framework accepts an external event | |
| // named 'schemaBasedFormsShown'. This should be called by clients | |
| // when these forms first come into view. | |
| // The conditioning on window.GLOBALS.RTE_COMPONENT_SPECS is because, in the | |
| // Karma tests, this value is undefined. | |
| oppia.constant( | |
| 'RTE_COMPONENT_SPECS', | |
| window.GLOBALS.RTE_COMPONENT_SPECS ? window.GLOBALS.RTE_COMPONENT_SPECS : {}); | |
| // Service for retrieving parameter specifications. | |
| oppia.factory('parameterSpecsService', ['$log', function($log) { | |
| var paramSpecs = {}; | |
| var ALLOWED_PARAM_TYPES = ['bool', 'unicode', 'float', 'int']; | |
| return { | |
| addParamSpec: function(paramName, paramType) { | |
| if (ALLOWED_PARAM_TYPES.indexOf(paramType) === -1) { | |
| $log.error('Invalid parameter type: ' + paramType); | |
| return; | |
| } | |
| paramSpecs[paramName] = { | |
| type: paramType | |
| }; | |
| }, | |
| getParamType: function(paramName) { | |
| if (!paramSpecs.hasOwnProperty(paramName)) { | |
| $log.error('No parameter with name ' + paramName + ' found.'); | |
| return null; | |
| } | |
| return paramSpecs[paramName].type; | |
| }, | |
| getAllParamsOfType: function(paramType) { | |
| var names = []; | |
| for (var paramName in paramSpecs) { | |
| if (paramSpecs[paramName].type === paramType) { | |
| names.push(paramName); | |
| } | |
| } | |
| return names.sort(); | |
| }, | |
| getAllParams: function() { | |
| var names = []; | |
| for (var paramName in paramSpecs) { | |
| names.push(paramName); | |
| } | |
| return names.sort(); | |
| } | |
| }; | |
| }]); | |
| oppia.filter('convertHtmlToUnicode', [function() { | |
| return function(html) { | |
| return angular.element('<div>' + html + '</div>').text(); | |
| }; | |
| }]); | |
| // Escapes the {, } and \ characters, and then converts | |
| // <oppia-parameter>name</oppia-parameter> tags to {{name}}. | |
| oppia.filter('convertHtmlWithParamsToUnicode', ['$filter', function($filter) { | |
| var escapeSpecialChars = function(str) { | |
| // Note that order is important here! Backslashes must be replaced before | |
| // the others, since doing either of the others first may give rise to | |
| // extra backslashes. | |
| return ($filter('convertHtmlToUnicode')(str)) | |
| .replace(/([\\\{\}])/g, '\\$1'); | |
| }; | |
| var PARAM_OPENING_TAG = '<oppia-parameter>'; | |
| var PARAM_CLOSING_TAG = '</oppia-parameter>'; | |
| return function(html) { | |
| return html.split(PARAM_OPENING_TAG).map(function(value) { | |
| return value.split(PARAM_CLOSING_TAG).map(function(value2) { | |
| return escapeSpecialChars(value2); | |
| }).join('}}'); | |
| }).join('{{'); | |
| }; | |
| }]); | |
| oppia.filter('convertUnicodeToHtml', [ | |
| '$sanitize', 'oppiaHtmlEscaper', function($sanitize, oppiaHtmlEscaper) { | |
| return function(text) { | |
| return $sanitize(oppiaHtmlEscaper.unescapedStrToEscapedStr(text)); | |
| }; | |
| } | |
| ]); | |
| // Converts {{name}} substrings to <oppia-parameter>name</oppia-parameter> tags | |
| // and unescapes the {, } and \ characters. This is done by reading the given | |
| // string from left to right: if we see a backslash, we use the following | |
| // character; if we see a '{{', this is the start of a parameter; if | |
| // we see a '}}'; this is the end of a parameter. | |
| oppia.filter('convertUnicodeWithParamsToHtml', ['$filter', function($filter) { | |
| var assert = function(b) { | |
| if (!b) { | |
| throw 'Invalid unicode-string-with-parameters: ' + text; | |
| } | |
| }; | |
| return function(text) { | |
| // The parsing here needs to be done with more care because we are replacing | |
| // two-character strings. We can't naively break by {{ because in strings | |
| // like \{{{ the second and third characters will be taken as the opening | |
| // brackets, which is wrong. We can't unescape characters because then the | |
| // { characters that remain will be ambiguous (they may either be the | |
| // openings of parameters or literal '{' characters entered by the user. | |
| // So we build a standard left-to-right parser which examines each | |
| // character of the string in turn, and processes it accordingly. | |
| var textFragments = []; | |
| var currentFragment = ''; | |
| var currentFragmentIsParam = false; | |
| for (var i = 0; i < text.length; i++) { | |
| if (text[i] === '\\') { | |
| assert( | |
| !currentFragmentIsParam && text.length > i + 1 && | |
| { | |
| '{': true, | |
| '}': true, | |
| '\\': true | |
| }[text[i + 1]]); | |
| currentFragment += text[i + 1]; | |
| i++; | |
| } else if (text[i] === '{') { | |
| assert( | |
| text.length > i + 1 && !currentFragmentIsParam && | |
| text[i + 1] === '{'); | |
| textFragments.push({ | |
| type: 'text', | |
| data: currentFragment | |
| }); | |
| currentFragment = ''; | |
| currentFragmentIsParam = true; | |
| i++; | |
| } else if (text[i] === '}') { | |
| assert( | |
| text.length > i + 1 && currentFragmentIsParam && | |
| text[i + 1] === '}'); | |
| textFragments.push({ | |
| type: 'parameter', | |
| data: currentFragment | |
| }); | |
| currentFragment = ''; | |
| currentFragmentIsParam = false; | |
| i++; | |
| } else { | |
| currentFragment += text[i]; | |
| } | |
| } | |
| assert(!currentFragmentIsParam); | |
| textFragments.push({ | |
| type: 'text', | |
| data: currentFragment | |
| }); | |
| var result = ''; | |
| textFragments.forEach(function(fragment) { | |
| result += ( | |
| fragment.type === 'text' ? | |
| $filter('convertUnicodeToHtml')(fragment.data) : | |
| '<oppia-parameter>' + fragment.data + '</oppia-parameter>'); | |
| }); | |
| return result; | |
| }; | |
| }]); | |
| // TODO(sll): This whole directive needs to be rewritten to not rely on | |
| // jWysiwyg. | |
| oppia.directive('unicodeWithParametersEditor', ['$modal', function($modal) { | |
| return { | |
| restrict: 'E', | |
| scope: { | |
| allowedParameterNames: '&', | |
| localValue: '=' | |
| }, | |
| template: ( | |
| '<div class="input-group">' + | |
| ' <textarea ng-disabled="!hasFullyLoaded"></textarea>' + | |
| ' <span class="input-group-btn">' + | |
| ' <button type="button" class="btn btn-default"' + | |
| ' ng-click="insertNewParameter()">+P</button>' + | |
| ' </span>' + | |
| '</div>'), | |
| controller: [ | |
| '$scope', '$element', '$filter', '$timeout', | |
| function($scope, $element, $filter, $timeout) { | |
| if (!$scope.allowedParameterNames().length) { | |
| console.error( | |
| 'The unicode-with-parameters editor should not be used if there ' + | |
| 'are no unicode parameters available.'); | |
| return; | |
| } | |
| // This is a bit silly. It appears that in contenteditables (in Chrome, | |
| // anyway) the cursor will stubbornly remain within the oppia-parameter | |
| // element (even though it should be outside it). However the behavior is | |
| // correct for images -- so we use images to delimit it. It's still hard | |
| // to do selection before the element if it's the first thing in the doc, | |
| // after the element if it's the last thing in the doc, or between two | |
| // consecutive elements. See this bug for a demonstration: | |
| // | |
| // https://code.google.com/p/chromium/issues/detail?id=242110 | |
| var INVISIBLE_IMAGE_TAG = ( | |
| '<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAA' + | |
| 'BAAEAAAICTAEAOw=="></img>'); | |
| var PARAM_CONTAINER_CLASS = 'oppia-parameter-container'; | |
| $scope._createRteParameterTag = function(paramName) { | |
| var el = $( | |
| '<span class="' + PARAM_CONTAINER_CLASS + '" ' + | |
| 'contenteditable="false">' + | |
| INVISIBLE_IMAGE_TAG + | |
| '<oppia-parameter>' + | |
| paramName + | |
| '</oppia-parameter>' + | |
| INVISIBLE_IMAGE_TAG + | |
| '</span>'); | |
| var domNode = el.get(0); | |
| domNode.ondblclick = function() { | |
| $scope.openEditParameterModal(paramName, domNode); | |
| }; | |
| return domNode; | |
| }; | |
| // Convert a unicode string into its RTE representation. | |
| $scope._convertUnicodeToRte = function(str) { | |
| var html = $filter('convertUnicodeWithParamsToHtml')(str); | |
| var elt = $('<div>' + html + '</div>'); | |
| elt.find('oppia-parameter').replaceWith(function() { | |
| return $scope._createRteParameterTag(this.textContent); | |
| }); | |
| return elt.html(); | |
| }; | |
| // Convert an RTE representation into a unicode string by removing all | |
| // insertion points and replacing <oppia-parameter> tags with {{...}}. | |
| $scope._convertRteToUnicode = function(rte) { | |
| var elt = $('<div>' + rte + '</div>'); | |
| // Strip out all additional attributes and class names from the | |
| // <oppia-parameter> tag before conversion to a unicode string. | |
| elt.find('.' + PARAM_CONTAINER_CLASS).replaceWith(function() { | |
| return $('<oppia-parameter/>').text(this.textContent).get(0); | |
| }); | |
| return $filter('convertHtmlWithParamsToUnicode')(elt.html()); | |
| }; | |
| var rteNode = $element[0].querySelector('textarea'); | |
| // A pointer to the editorDoc in the RTE iframe. Populated when the RTE | |
| // is initialized. | |
| $scope.editorDoc = null; | |
| $scope.hasFullyLoaded = false; | |
| // If eltToReplace is null, a new element should be inserted at the | |
| // current caret. | |
| $scope.openEditParameterModal = function(currentParamName, eltToReplace) { | |
| return $modal.open({ | |
| templateUrl: 'modals/editParamName', | |
| backdrop: true, | |
| resolve: { | |
| allowedParameterNames: function() { | |
| return $scope.allowedParameterNames(); | |
| } | |
| }, | |
| controller: [ | |
| '$scope', '$modalInstance', 'allowedParameterNames', | |
| function($scope, $modalInstance, allowedParameterNames) { | |
| $scope.currentParamName = currentParamName; | |
| $scope.paramOptions = allowedParameterNames.map( | |
| function(paramName) { | |
| return { | |
| name: paramName, | |
| value: paramName | |
| }; | |
| } | |
| ); | |
| $scope.cancel = function() { | |
| $modalInstance.dismiss('cancel'); | |
| }; | |
| $scope.save = function(paramName) { | |
| $modalInstance.close(paramName); | |
| }; | |
| } | |
| ] | |
| }).result.then(function(paramName) { | |
| var el = $scope._createRteParameterTag(paramName); | |
| if (eltToReplace === null) { | |
| var doc = $(rteNode).wysiwyg('document').get(0); | |
| $(rteNode).wysiwyg( | |
| 'insertHtml', '<span class="insertionPoint"></span>'); | |
| eltToReplace = $scope.editorDoc.querySelector('.insertionPoint'); | |
| } | |
| // Note that this removes the contenteditable="false" and ondblclick | |
| // attributes of el (but they are eventually replaced during the | |
| // normalization of the RTE content step). Also, we need to save the | |
| // change explicitly because the wysiwyg editor does not auto-detect | |
| // replaceWith() events. | |
| $(eltToReplace).replaceWith(el); | |
| $(rteNode).wysiwyg('save'); | |
| }); | |
| }; | |
| $scope.insertNewParameter = function() { | |
| $scope.openEditParameterModal($scope.allowedParameterNames()[0], null); | |
| }; | |
| var rteContentMemento = $scope._convertUnicodeToRte($scope.localValue); | |
| $scope.currentlyEditing = false; | |
| $scope.$watch('localValue', function() { | |
| if (!$scope.currentlyEditing) { | |
| // This is an external change. | |
| rteContentMemento = $scope._convertUnicodeToRte($scope.localValue); | |
| $(rteNode).wysiwyg('setContent', rteContentMemento); | |
| } | |
| }, true); | |
| $scope._normalizeRteContent = function(content) { | |
| // TODO(sll): Write this method to validate rather than just normalize. | |
| // The only top-level tags should be oppia-parameter tags. Each of these | |
| // tags should have a contenteditable=false attribute, a dblclick | |
| // handler that opens the parameter modal, and content consisting of a | |
| // valid parameter name of type unicode surrounded by two invisible | |
| // image tags. | |
| var elt = $('<div>' + content + '</div>'); | |
| elt.find('.' + PARAM_CONTAINER_CLASS).replaceWith(function() { | |
| return $scope._createRteParameterTag(this.textContent.trim()); | |
| }); | |
| return elt.html(); | |
| }; | |
| $scope.init = function() { | |
| $(rteNode).wysiwyg({ | |
| autoGrow: true, | |
| autoSave: true, | |
| controls: {}, | |
| css: '/css/rte_single_line.css', | |
| debug: true, | |
| events: { | |
| // Prevent dragging, since this causes weird things to happen when | |
| // a user selects text containing all or part of parameter tags and | |
| // then drags that text elsewhere. | |
| dragstart: function(e) { | |
| e.preventDefault(); | |
| }, | |
| // Prevent use of keyboard shortcuts for bold, italics, etc. Also | |
| // prevent pasting, newlines and tabbing. | |
| keydown: function(e) { | |
| var aKey = 65; | |
| var cKey = 67; | |
| var xKey = 88; | |
| var zKey = 90; | |
| var vKey = 86; | |
| if (e.ctrlKey) { | |
| if (e.keyCode === 86) { | |
| e.preventDefault(); | |
| alert( | |
| 'Pasting in string input fields is currently not ' + | |
| 'supported. Sorry about that!'); | |
| } else if ( | |
| e.keyCode !== aKey && e.keyCode !== cKey && | |
| e.keyCode !== xKey && e.keyCode !== zKey) { | |
| e.preventDefault(); | |
| } | |
| } | |
| // Disable the enter key. Contenteditable does not seem to support | |
| // deletion of newlines. Also disable the tab key. | |
| if (e.keyCode === 13 || e.keyCode === 9) { | |
| e.preventDefault(); | |
| } | |
| }, | |
| paste: function(e) { | |
| e.preventDefault(); | |
| }, | |
| save: function() { | |
| var currentContent = $(rteNode).wysiwyg('getContent'); | |
| if (currentContent === null || currentContent === undefined) { | |
| return; | |
| } | |
| // Normalize the new content. If a validation error occurs, | |
| // revert to the memento, and update the external and internal | |
| // values. Otherwise, update the external and internal values | |
| // with the normalized content, and update the memento as well. | |
| var normalizedContent = ''; | |
| try { | |
| normalizedContent = $scope._normalizeRteContent(currentContent); | |
| } catch (unusedException) { | |
| console.error('Error parsing RTE content: ' + currentContent); | |
| normalizedContent = rteContentMemento; | |
| } | |
| if (normalizedContent !== currentContent) { | |
| $(rteNode).wysiwyg('setContent', normalizedContent); | |
| } | |
| // Update the external value. The $timeout removes the '$apply in | |
| // progress' errors which get triggered if a parameter was edited. | |
| $timeout(function() { | |
| $scope.$apply(function() { | |
| $scope.currentlyEditing = true; | |
| $scope.localValue = $scope._convertRteToUnicode( | |
| normalizedContent); | |
| // TODO(sll): This is a somewhat hacky solution. Can it be | |
| // cleaned up? | |
| $timeout(function() { | |
| $scope.currentlyEditing = false; | |
| }, 50); | |
| }); | |
| }); | |
| // Update the memento. | |
| rteContentMemento = normalizedContent; | |
| } | |
| }, | |
| iFrameClass: 'wysiwyg-content', | |
| initialContent: rteContentMemento, | |
| maxHeight: 30, | |
| rmUnusedControls: true | |
| }); | |
| $scope.editorDoc = $(rteNode).wysiwyg('document')[0].body; | |
| // Add dblclick handlers to the various nodes, since they get stripped | |
| // in the initialization. | |
| var elts = Array.prototype.slice.call( | |
| $scope.editorDoc.querySelectorAll('.' + PARAM_CONTAINER_CLASS)); | |
| elts.forEach(function(elt) { | |
| elt.ondblclick = function() { | |
| $scope.openEditParameterModal($(elt).text(), elt); | |
| }; | |
| }); | |
| $scope.hasFullyLoaded = true; | |
| }; | |
| $scope.init(); | |
| // TODO(sll): If two RTEs share the same data source, and one RTE saves | |
| // a change to the data, the other RTE should be updated. However, if we | |
| // just place a $scope.$watch on the data source, then typing in a single | |
| // RTE is going to call that method, and this will replace the content of | |
| // the RTE -- which is normally not an issue, but in this case it | |
| // moves the cursor back to the beginning of the doc and frustrates the | |
| // user. We should find a solution for this -- although it probably is | |
| // not a common use case to have multiple unicode RTEs referencing the | |
| // same data source, there is a problem in that although the Cancel | |
| // button does update the data model, it does not update the appearance | |
| // of the RTE. | |
| }] | |
| }; | |
| }]); | |
| oppia.factory('schemaDefaultValueService', [function() { | |
| return { | |
| // TODO(sll): Rewrite this to take validators into account, so that | |
| // we always start with a valid value. | |
| getDefaultValue: function(schema) { | |
| if (schema.choices) { | |
| return schema.choices[0]; | |
| } else if (schema.type === 'bool') { | |
| return false; | |
| } else if (schema.type === 'unicode' || schema.type === 'html') { | |
| return ''; | |
| } else if (schema.type === 'list') { | |
| return [this.getDefaultValue(schema.items)]; | |
| } else if (schema.type === 'dict') { | |
| var result = {}; | |
| for (var i = 0; i < schema.properties.length; i++) { | |
| result[schema.properties[i].name] = this.getDefaultValue( | |
| schema.properties[i].schema); | |
| } | |
| return result; | |
| } else if (schema.type === 'int' || schema.type === 'float') { | |
| return 0; | |
| } else { | |
| console.error('Invalid schema type: ' + schema.type); | |
| } | |
| } | |
| }; | |
| }]); | |
| oppia.factory('schemaUndefinedLastElementService', [function() { | |
| return { | |
| // Returns true if the input value, taken as the last element in a list, | |
| // should be considered as 'undefined' and therefore deleted. | |
| getUndefinedValue: function(schema) { | |
| if (schema.type === 'unicode' || schema.type === 'html') { | |
| return ''; | |
| } else { | |
| return undefined; | |
| } | |
| } | |
| }; | |
| }]); | |
| oppia.filter('sanitizeHtmlForRte', ['$sanitize', function($sanitize) { | |
| var _EXTENSION_SELECTOR = '[class^=oppia-noninteractive-]'; | |
| return function(html) { | |
| var wrapper = document.createElement('div'); | |
| wrapper.innerHTML = html; | |
| // Save the unsanitized extensions. | |
| var unsanitizedExtensions = $(wrapper).find(_EXTENSION_SELECTOR); | |
| wrapper.innerHTML = $sanitize(wrapper.innerHTML); | |
| var sanitizedExtensions = $(wrapper).find(_EXTENSION_SELECTOR); | |
| for (var i = 0; i < sanitizedExtensions.length; i++) { | |
| var el = sanitizedExtensions[i]; | |
| var attrs = unsanitizedExtensions[i].attributes; | |
| for (var j = 0; j < attrs.length; j++) { | |
| var attr = attrs[j]; | |
| // Reinstate the sanitized widget attributes. | |
| if (attr.name.indexOf('-with-value') !== -1 && | |
| !el.hasAttribute(attr.name)) { | |
| el.setAttribute(attr.name, attr.value); | |
| } | |
| } | |
| } | |
| return wrapper.innerHTML; | |
| }; | |
| }]); | |
| oppia.factory('rteHelperService', [ | |
| '$filter', '$log', '$interpolate', 'explorationContextService', | |
| 'RTE_COMPONENT_SPECS', 'oppiaHtmlEscaper', | |
| function($filter, $log, $interpolate, explorationContextService, | |
| RTE_COMPONENT_SPECS, oppiaHtmlEscaper) { | |
| var _RICH_TEXT_COMPONENTS = []; | |
| Object.keys(RTE_COMPONENT_SPECS).sort().forEach(function(componentId) { | |
| _RICH_TEXT_COMPONENTS.push({ | |
| backendName: RTE_COMPONENT_SPECS[componentId].backend_name, | |
| customizationArgSpecs: angular.copy( | |
| RTE_COMPONENT_SPECS[componentId].customization_arg_specs), | |
| name: RTE_COMPONENT_SPECS[componentId].frontend_name, | |
| iconDataUrl: RTE_COMPONENT_SPECS[componentId].icon_data_url, | |
| previewUrlTemplate: | |
| RTE_COMPONENT_SPECS[componentId].preview_url_template, | |
| isComplex: RTE_COMPONENT_SPECS[componentId].is_complex, | |
| isBlockElement: RTE_COMPONENT_SPECS[componentId].is_block_element, | |
| requiresFs: RTE_COMPONENT_SPECS[componentId].requires_fs, | |
| tooltip: RTE_COMPONENT_SPECS[componentId].tooltip | |
| }); | |
| }); | |
| var _createCustomizationArgDictFromAttrs = function(attrs) { | |
| var customizationArgsDict = {}; | |
| for (var i = 0; i < attrs.length; i++) { | |
| var attr = attrs[i]; | |
| if (attr.name === 'class' || attr.name === 'src' || | |
| attr.name === '_moz_resizing') { | |
| continue; | |
| } | |
| var separatorLocation = attr.name.indexOf('-with-value'); | |
| if (separatorLocation === -1) { | |
| $log.error('RTE Error: invalid customization attribute ' + attr.name); | |
| continue; | |
| } | |
| var argName = attr.name.substring(0, separatorLocation); | |
| customizationArgsDict[argName] = oppiaHtmlEscaper.escapedJsonToObj( | |
| attr.value); | |
| } | |
| return customizationArgsDict; | |
| }; | |
| return { | |
| createCustomizationArgDictFromAttrs: function(attrs) { | |
| return _createCustomizationArgDictFromAttrs(attrs); | |
| }, | |
| createToolbarIcon: function(componentDefn) { | |
| var el = $('<img/>'); | |
| el.attr('src', componentDefn.iconDataUrl); | |
| el.addClass('oppia-rte-toolbar-image'); | |
| return el.get(0); | |
| }, | |
| // Returns a DOM node. | |
| createRteElement: function(componentDefn, customizationArgsDict) { | |
| var el = $('<img/>'); | |
| if (explorationContextService.isInExplorationContext()) { | |
| customizationArgsDict = angular.extend(customizationArgsDict, | |
| { | |
| explorationId: explorationContextService.getExplorationId() | |
| } | |
| ); | |
| } | |
| var interpolatedUrl = $interpolate( | |
| componentDefn.previewUrlTemplate, false, null, true)( | |
| customizationArgsDict); | |
| if (!interpolatedUrl) { | |
| $log.error( | |
| 'Error interpolating url : ' + componentDefn.previewUrlTemplate); | |
| } else { | |
| el.attr('src', interpolatedUrl); | |
| } | |
| el.addClass('oppia-noninteractive-' + componentDefn.name); | |
| if (componentDefn.isBlockElement) { | |
| el.addClass('block-element'); | |
| } | |
| for (var attrName in customizationArgsDict) { | |
| el.attr( | |
| $filter('camelCaseToHyphens')(attrName) + '-with-value', | |
| oppiaHtmlEscaper.objToEscapedJson(customizationArgsDict[attrName])); | |
| } | |
| return el.get(0); | |
| }, | |
| // Replace <oppia-noninteractive> tags with <img> tags. | |
| convertHtmlToRte: function(html) { | |
| // If an undefined or empty html value is passed in, then the same type | |
| // of value should be returned. Without this check, | |
| // convertHtmlToRte(undefined) would return 'undefined', which is not | |
| // ideal. | |
| if (!html) { | |
| return html; | |
| } | |
| var elt = $('<div>' + html + '</div>'); | |
| var that = this; | |
| _RICH_TEXT_COMPONENTS.forEach(function(componentDefn) { | |
| elt.find('oppia-noninteractive-' + componentDefn.name).replaceWith( | |
| function() { | |
| return that.createRteElement( | |
| componentDefn, | |
| _createCustomizationArgDictFromAttrs(this.attributes)); | |
| } | |
| ); | |
| }); | |
| return elt.html(); | |
| }, | |
| // Replace <img> tags with <oppia-noninteractive> tags. | |
| convertRteToHtml: function(rte) { | |
| // If an undefined or empty rte value is passed in, then the same type | |
| // of value should be returned. Without this check, | |
| // convertRteToHtml(undefined) would return 'undefined', which is not | |
| // ideal. | |
| if (!rte) { | |
| return rte; | |
| } | |
| var elt = $('<div>' + rte + '</div>'); | |
| _RICH_TEXT_COMPONENTS.forEach(function(componentDefn) { | |
| elt.find( | |
| 'img.oppia-noninteractive-' + componentDefn.name | |
| ).replaceWith(function() { | |
| // Look for a class name starting with oppia-noninteractive-*. | |
| var tagNameMatch = /(^|\s)(oppia-noninteractive-[a-z0-9\-]+)/.exec( | |
| this.className); | |
| if (!tagNameMatch) { | |
| $log.error('RTE Error: invalid class name ' + this.className); | |
| } | |
| var jQueryElt = $('<' + tagNameMatch[2] + '/>'); | |
| for (var i = 0; i < this.attributes.length; i++) { | |
| var attr = this.attributes[i]; | |
| if (attr.name !== 'class' && attr.name !== 'src') { | |
| jQueryElt.attr(attr.name, attr.value); | |
| } | |
| } | |
| return jQueryElt.get(0); | |
| }); | |
| }); | |
| return elt.html(); | |
| }, | |
| getRichTextComponents: function() { | |
| return angular.copy(_RICH_TEXT_COMPONENTS); | |
| } | |
| }; | |
| } | |
| ]); | |
| // Add RTE extensions to textAngular toolbar options. | |
| oppia.config(['$provide', function($provide) { | |
| $provide.decorator('taOptions', [ | |
| '$delegate', '$document', '$modal', '$timeout', 'focusService', | |
| 'taRegisterTool', 'rteHelperService', 'alertsService', | |
| 'explorationContextService', 'PAGE_CONTEXT', | |
| function( | |
| taOptions, $document, $modal, $timeout, focusService, | |
| taRegisterTool, rteHelperService, alertsService, | |
| explorationContextService, PAGE_CONTEXT) { | |
| taOptions.disableSanitizer = true; | |
| taOptions.forceTextAngularSanitize = false; | |
| taOptions.classes.textEditor = 'form-control oppia-rte-content'; | |
| taOptions.setup.textEditorSetup = function($element) { | |
| $timeout(function() { | |
| $element.trigger('focus'); | |
| }); | |
| }; | |
| // The refocusFn arg is a function that restores focus to the text editor | |
| // after exiting the modal, and moves the cursor back to where it was | |
| // before the modal was opened. | |
| var _openCustomizationModal = function( | |
| customizationArgSpecs, attrsCustomizationArgsDict, onSubmitCallback, | |
| onDismissCallback, refocusFn) { | |
| $document[0].execCommand('enableObjectResizing', false, false); | |
| var modalDialog = $modal.open({ | |
| templateUrl: 'modals/customizeRteComponent', | |
| backdrop: 'static', | |
| resolve: {}, | |
| controller: [ | |
| '$scope', '$modalInstance', '$timeout', | |
| function($scope, $modalInstance, $timeout) { | |
| $scope.customizationArgSpecs = customizationArgSpecs; | |
| // Without this code, the focus will remain in the background RTE | |
| // even after the modal loads. This switches the focus to a | |
| // temporary field in the modal which is then removed from the DOM. | |
| // TODO(sll): Make this switch to the first input field in the modal | |
| // instead. | |
| $scope.modalIsLoading = true; | |
| focusService.setFocus('tmpFocusPoint'); | |
| $timeout(function() { | |
| $scope.modalIsLoading = false; | |
| }); | |
| $scope.tmpCustomizationArgs = []; | |
| for (var i = 0; i < customizationArgSpecs.length; i++) { | |
| var caName = customizationArgSpecs[i].name; | |
| $scope.tmpCustomizationArgs.push({ | |
| name: caName, | |
| value: ( | |
| attrsCustomizationArgsDict.hasOwnProperty(caName) ? | |
| attrsCustomizationArgsDict[caName] : | |
| customizationArgSpecs[i].default_value) | |
| }); | |
| } | |
| $scope.cancel = function() { | |
| $modalInstance.dismiss('cancel'); | |
| }; | |
| $scope.save = function() { | |
| $scope.$broadcast('externalSave'); | |
| var customizationArgsDict = {}; | |
| for (var i = 0; i < $scope.tmpCustomizationArgs.length; i++) { | |
| var caName = $scope.tmpCustomizationArgs[i].name; | |
| customizationArgsDict[caName] = ( | |
| $scope.tmpCustomizationArgs[i].value); | |
| } | |
| $modalInstance.close(customizationArgsDict); | |
| }; | |
| }] | |
| }); | |
| modalDialog.result.then(onSubmitCallback, onDismissCallback); | |
| // 'finally' is a JS keyword. If it is just used in its ".finally" form, | |
| // the minification process throws an error. | |
| modalDialog.result['finally'](refocusFn); | |
| }; | |
| rteHelperService.getRichTextComponents().forEach(function(componentDefn) { | |
| var buttonDisplay = rteHelperService.createToolbarIcon(componentDefn); | |
| var canUseFs = explorationContextService.getPageContext() === | |
| PAGE_CONTEXT.EDITOR; | |
| taRegisterTool(componentDefn.name, { | |
| display: buttonDisplay.outerHTML, | |
| tooltiptext: componentDefn.tooltip, | |
| disabled: function() { | |
| // Disable components that affect fs for non-editors. | |
| return !canUseFs && componentDefn.requiresFs; | |
| }, | |
| onElementSelect: { | |
| element: 'img', | |
| filter: function(elt) { | |
| return elt.hasClass('oppia-noninteractive-' + componentDefn.name); | |
| }, | |
| action: function(event, $element) { | |
| event.preventDefault(); | |
| var textAngular = this; | |
| if (!canUseFs && componentDefn.requiresFs) { | |
| var FS_UNAUTHORIZED_WARNING = 'Unfortunately, only ' + | |
| 'exploration authors can make changes involving files.'; | |
| alertsService.addWarning(FS_UNAUTHORIZED_WARNING); | |
| // Without this, the view will not update to show the warning. | |
| textAngular.$editor().$parent.$apply(); | |
| return; | |
| } | |
| // Move the cursor to be immediately after the clicked widget. | |
| // This prevents users from overwriting the widget. | |
| var elRange = rangy.createRange(); | |
| elRange.setStartAfter($element.get(0)); | |
| elRange.setEndAfter($element.get(0)); | |
| var elSelection = rangy.getSelection(); | |
| elSelection.removeAllRanges(); | |
| elSelection.addRange(elRange); | |
| var savedSelection = rangy.saveSelection(); | |
| // Temporarily pauses sanitizer so rangy markers save position | |
| textAngular.$editor().$parent.isCustomizationModalOpen = true; | |
| _openCustomizationModal( | |
| componentDefn.customizationArgSpecs, | |
| rteHelperService.createCustomizationArgDictFromAttrs( | |
| $element[0].attributes), | |
| function(customizationArgsDict) { | |
| var el = rteHelperService.createRteElement( | |
| componentDefn, customizationArgsDict); | |
| $element[0].parentNode.replaceChild(el, $element[0]); | |
| textAngular.$editor().updateTaBindtaTextElement(); | |
| }, | |
| function() {}, | |
| function() { | |
| // Re-enables the sanitizer now that the modal is closed. | |
| textAngular.$editor( | |
| ).$parent.isCustomizationModalOpen = false; | |
| textAngular.$editor().displayElements.text[0].focus(); | |
| rangy.restoreSelection(savedSelection); | |
| }); | |
| return false; | |
| } | |
| }, | |
| action: function() { | |
| var textAngular = this; | |
| var savedSelection = rangy.saveSelection(); | |
| textAngular.$editor().wrapSelection( | |
| 'insertHtml', '<span class="insertionPoint"></span>'); | |
| // Temporarily pauses sanitizer so rangy markers save position. | |
| textAngular.$editor().$parent.isCustomizationModalOpen = true; | |
| _openCustomizationModal( | |
| componentDefn.customizationArgSpecs, | |
| {}, | |
| function(customizationArgsDict) { | |
| var el = rteHelperService.createRteElement( | |
| componentDefn, customizationArgsDict); | |
| var insertionPoint = ( | |
| textAngular.$editor().displayElements.text[0].querySelector( | |
| '.insertionPoint')); | |
| var parent = insertionPoint.parentNode; | |
| parent.replaceChild(el, insertionPoint); | |
| textAngular.$editor().updateTaBindtaTextElement(); | |
| }, | |
| function() { | |
| // Clean up the insertion point if no widget was inserted. | |
| var insertionPoint = ( | |
| textAngular.$editor().displayElements.text[0].querySelector( | |
| '.insertionPoint')); | |
| if (insertionPoint !== null) { | |
| insertionPoint.remove(); | |
| } | |
| }, | |
| function() { | |
| // Re-enables the sanitizer now that the modal is closed. | |
| textAngular.$editor().$parent.isCustomizationModalOpen = false; | |
| textAngular.$editor().displayElements.text[0].focus(); | |
| rangy.restoreSelection(savedSelection); | |
| } | |
| ); | |
| } | |
| }); | |
| }); | |
| return taOptions; | |
| } | |
| ]); | |
| }]); | |
| oppia.directive('textAngularRte', [ | |
| '$filter', 'oppiaHtmlEscaper', 'rteHelperService', '$timeout', | |
| function( | |
| $filter, oppiaHtmlEscaper, rteHelperService, $timeout) { | |
| return { | |
| restrict: 'E', | |
| scope: { | |
| htmlContent: '=', | |
| uiConfig: '&' | |
| }, | |
| template: ( | |
| '<div text-angular="" ta-toolbar="<[toolbarOptionsJson]>" ' + | |
| ' ta-paste="stripFormatting($html)" ng-model="tempContent"' + | |
| ' placeholder="<[placeholderText]>">' + | |
| '</div>'), | |
| controller: ['$scope', function($scope) { | |
| // Currently, operations affecting the filesystem are allowed only in | |
| // the editor context. | |
| $scope.isCustomizationModalOpen = false; | |
| var toolbarOptions = [ | |
| ['bold', 'italics'], | |
| ['ol', 'ul', 'pre', 'indent', 'outdent'], | |
| [] | |
| ]; | |
| if ($scope.uiConfig() && $scope.uiConfig().placeholder) { | |
| $scope.placeholderText = $scope.uiConfig().placeholder; | |
| } | |
| rteHelperService.getRichTextComponents().forEach( | |
| function(componentDefn) { | |
| if (!($scope.uiConfig() && | |
| $scope.uiConfig().hide_complex_extensions && | |
| componentDefn.isComplex)) { | |
| toolbarOptions[2].push(componentDefn.name); | |
| } | |
| } | |
| ); | |
| $scope.toolbarOptionsJson = JSON.stringify(toolbarOptions); | |
| var _convertHtmlToRte = function(html) { | |
| return rteHelperService.convertHtmlToRte(html); | |
| }; | |
| $scope.stripFormatting = function(html) { | |
| return $filter('sanitizeHtmlForRte')(html); | |
| }; | |
| $scope.init = function() { | |
| $scope.tempContent = _convertHtmlToRte($scope.htmlContent); | |
| }; | |
| $scope.init(); | |
| $scope.$watch('tempContent', function(newVal) { | |
| // Sanitizing while a modal is open would delete the markers that | |
| // save and restore the cursor's position in the RTE. | |
| var displayedContent = $scope.isCustomizationModalOpen ? newVal : | |
| $filter('sanitizeHtmlForRte')(newVal); | |
| $scope.htmlContent = rteHelperService.convertRteToHtml( | |
| displayedContent); | |
| }); | |
| // It is possible for the content of the RTE to be changed externally, | |
| // e.g. if there are several RTEs in a list, and one is deleted. | |
| $scope.$on('externalHtmlContentChange', function() { | |
| $timeout(function() { | |
| $scope.tempContent = _convertHtmlToRte($scope.htmlContent); | |
| }); | |
| }); | |
| }] | |
| }; | |
| } | |
| ]); | |
| // The names of these filters must correspond to the names of the backend | |
| // validators (with underscores converted to camelcase). | |
| // WARNING: These filters do not validate the arguments supplied with the | |
| // validator definitions in the schema; these are assumed to be correct. | |
| oppia.filter('isAtLeast', [function() { | |
| return function(input, args) { | |
| return (input >= args.minValue); | |
| }; | |
| }]); | |
| oppia.filter('isAtMost', [function() { | |
| return function(input, args) { | |
| return (input <= args.maxValue); | |
| }; | |
| }]); | |
| oppia.filter('isNonempty', [function() { | |
| return function(input) { | |
| return Boolean(input); | |
| }; | |
| }]); | |
| oppia.filter('isFloat', [function() { | |
| return function(input) { | |
| var FLOAT_REGEXP = /(?=.*\d)^\-?\d*(\.|\,)?\d*\%?$/; | |
| // This regex accepts floats in the following formats: | |
| // 0. | |
| // 0.55.. | |
| // -0.55.. | |
| // .555.. | |
| // -.555.. | |
| // All examples above with '.' replaced with ',' are also valid. | |
| // Expressions containing % are also valid (5.1% etc). | |
| var viewValue = ''; | |
| try { | |
| var viewValue = input.toString().trim(); | |
| } catch (e) { | |
| return undefined; | |
| } | |
| if (viewValue !== '' && FLOAT_REGEXP.test(viewValue)) { | |
| if (viewValue.slice(-1) === '%') { | |
| // This is a percentage, so the input needs to be divided by 100. | |
| return parseFloat( | |
| viewValue.substring(0, viewValue.length - 1).replace(',', '.') | |
| ) / 100.0; | |
| } else { | |
| return parseFloat(viewValue.replace(',', '.')); | |
| } | |
| } else { | |
| return undefined; | |
| } | |
| }; | |
| }]); | |
| oppia.directive('applyValidation', ['$filter', function($filter) { | |
| return { | |
| require: 'ngModel', | |
| restrict: 'A', | |
| link: function(scope, elm, attrs, ctrl) { | |
| // Add validators in reverse order. | |
| if (scope.validators()) { | |
| scope.validators().forEach(function(validatorSpec) { | |
| var frontendName = $filter('underscoresToCamelCase')( | |
| validatorSpec.id); | |
| // Note that there may not be a corresponding frontend filter for | |
| // each backend validator. | |
| try { | |
| $filter(frontendName); | |
| } catch (err) { | |
| return; | |
| } | |
| var filterArgs = {}; | |
| for (key in validatorSpec) { | |
| if (key !== 'id') { | |
| filterArgs[$filter('underscoresToCamelCase')(key)] = angular.copy( | |
| validatorSpec[key]); | |
| } | |
| } | |
| var customValidator = function(viewValue) { | |
| ctrl.$setValidity( | |
| frontendName, $filter(frontendName)(viewValue, filterArgs)); | |
| return viewValue; | |
| }; | |
| ctrl.$parsers.unshift(customValidator); | |
| ctrl.$formatters.unshift(customValidator); | |
| }); | |
| } | |
| } | |
| }; | |
| }]); | |
| // This should come before 'apply-validation', if that is defined as | |
| // an attribute on the HTML tag. | |
| oppia.directive('requireIsFloat', ['$filter', function($filter) { | |
| return { | |
| require: 'ngModel', | |
| restrict: 'A', | |
| link: function(scope, elm, attrs, ctrl) { | |
| var floatValidator = function(viewValue) { | |
| var filteredValue = $filter('isFloat')(viewValue); | |
| ctrl.$setValidity('isFloat', filteredValue !== undefined); | |
| return filteredValue; | |
| }; | |
| ctrl.$parsers.unshift(floatValidator); | |
| ctrl.$formatters.unshift(floatValidator); | |
| } | |
| }; | |
| }]); | |
| oppia.directive('requireIsValidExpression', | |
| ['parameterSpecsService', 'expressionEvaluatorService', | |
| function(parameterSpecsService, expressionEvaluatorService) { | |
| // Create a namescope environment from the parameter names. The values of the | |
| // parameters do not matter. | |
| var params = {}; | |
| parameterSpecsService.getAllParams().forEach(function(name) { | |
| params[name] = true; | |
| }); | |
| return { | |
| require: 'ngModel', | |
| restrict: 'A', | |
| link: function(scope, elm, attrs, ctrl) { | |
| var validator = function(value) { | |
| ctrl.$setValidity('isValidExpression', | |
| expressionEvaluatorService.validateExpression(value, [params])); | |
| return value; | |
| }; | |
| ctrl.$parsers.unshift(validator); | |
| ctrl.$formatters.unshift(validator); | |
| } | |
| }; | |
| }]); | |
| // Prevents timeouts due to recursion in nested directives. See: | |
| // | |
| // http://stackoverflow.com/q/14430655 | |
| oppia.factory('recursionHelper', ['$compile', function($compile) { | |
| return { | |
| /** | |
| * Manually compiles the element, fixing the recursion loop. | |
| * @param {DOM element} element | |
| * @param {function|object} link - A post-link function, or an object with | |
| * function(s) registered via pre and post properties. | |
| * @return {object} An object containing the linking functions. | |
| */ | |
| compile: function(element, link) { | |
| // Normalize the link parameter | |
| if (angular.isFunction(link)) { | |
| link = { | |
| post: link | |
| }; | |
| } | |
| // Break the recursion loop by removing the contents, | |
| var contents = element.contents().remove(); | |
| var compiledContents; | |
| return { | |
| pre: (link && link.pre) ? link.pre : null, | |
| post: function(scope, element) { | |
| // Compile the contents. | |
| if (!compiledContents) { | |
| compiledContents = $compile(contents); | |
| } | |
| // Re-add the compiled contents to the element. | |
| compiledContents(scope, function(clone) { | |
| element.append(clone); | |
| }); | |
| // Call the post-linking function, if any. | |
| if (link && link.post) { | |
| link.post.apply(null, arguments); | |
| } | |
| } | |
| }; | |
| } | |
| }; | |
| }]); | |
| /********************************************************************* | |
| * | |
| * DIRECTIVES FOR SCHEMA-BASED EDITORS | |
| * | |
| *********************************************************************/ | |
| oppia.directive('schemaBasedEditor', [function() { | |
| return { | |
| scope: { | |
| schema: '&', | |
| isDisabled: '&', | |
| localValue: '=', | |
| allowExpressions: '&', | |
| labelForFocusTarget: '&', | |
| onInputBlur: '=', | |
| onInputFocus: '=' | |
| }, | |
| templateUrl: 'schemaBasedEditor/master', | |
| restrict: 'E' | |
| }; | |
| }]); | |
| oppia.directive('schemaBasedChoicesEditor', [ | |
| 'recursionHelper', function(recursionHelper) { | |
| return { | |
| scope: { | |
| localValue: '=', | |
| // The choices for the object's value. | |
| choices: '&', | |
| // The schema for this object. | |
| // TODO(sll): Validate each choice against the schema. | |
| schema: '&', | |
| isDisabled: '&' | |
| }, | |
| templateUrl: 'schemaBasedEditor/choices', | |
| restrict: 'E', | |
| compile: recursionHelper.compile, | |
| controller: ['$scope', function($scope) { | |
| $scope.getReadonlySchema = function() { | |
| var readonlySchema = angular.copy($scope.schema()); | |
| delete readonlySchema.choices; | |
| return readonlySchema; | |
| }; | |
| }] | |
| }; | |
| } | |
| ]); | |
| oppia.directive('schemaBasedExpressionEditor', [function() { | |
| return { | |
| scope: { | |
| localValue: '=', | |
| isDisabled: '&', | |
| // TODO(sll): Currently only takes a string which is either 'bool', 'int' | |
| // or 'float'. May need to generalize. | |
| outputType: '&', | |
| labelForFocusTarget: '&' | |
| }, | |
| templateUrl: 'schemaBasedEditor/expression', | |
| restrict: 'E' | |
| }; | |
| }]); | |
| oppia.directive('schemaBasedBoolEditor', [function() { | |
| return { | |
| scope: { | |
| localValue: '=', | |
| isDisabled: '&', | |
| allowExpressions: '&', | |
| labelForFocusTarget: '&' | |
| }, | |
| templateUrl: 'schemaBasedEditor/bool', | |
| restrict: 'E', | |
| controller: [ | |
| '$scope', 'parameterSpecsService', | |
| function($scope, parameterSpecsService) { | |
| if ($scope.allowExpressions()) { | |
| $scope.paramNames = parameterSpecsService.getAllParamsOfType('bool'); | |
| $scope.expressionMode = angular.isString($scope.localValue); | |
| $scope.$watch('localValue', function(newValue) { | |
| $scope.expressionMode = angular.isString(newValue); | |
| }); | |
| $scope.toggleExpressionMode = function() { | |
| $scope.expressionMode = !$scope.expressionMode; | |
| $scope.localValue = ( | |
| $scope.expressionMode ? $scope.paramNames[0] : false); | |
| }; | |
| } | |
| } | |
| ] | |
| }; | |
| }]); | |
| oppia.directive('schemaBasedIntEditor', [function() { | |
| return { | |
| scope: { | |
| localValue: '=', | |
| isDisabled: '&', | |
| allowExpressions: '&', | |
| validators: '&', | |
| labelForFocusTarget: '&', | |
| onInputBlur: '=', | |
| onInputFocus: '=' | |
| }, | |
| templateUrl: 'schemaBasedEditor/int', | |
| restrict: 'E', | |
| controller: [ | |
| '$scope', 'parameterSpecsService', | |
| function($scope, parameterSpecsService) { | |
| if ($scope.localValue === undefined) { | |
| $scope.localValue = 0; | |
| } | |
| $scope.onKeypress = function(evt) { | |
| if (evt.keyCode === 13) { | |
| $scope.$emit('submittedSchemaBasedIntForm'); | |
| } | |
| }; | |
| if ($scope.allowExpressions()) { | |
| $scope.paramNames = parameterSpecsService.getAllParamsOfType('int'); | |
| $scope.expressionMode = angular.isString($scope.localValue); | |
| $scope.$watch('localValue', function(newValue) { | |
| $scope.expressionMode = angular.isString(newValue); | |
| }); | |
| $scope.toggleExpressionMode = function() { | |
| $scope.expressionMode = !$scope.expressionMode; | |
| $scope.localValue = ( | |
| $scope.expressionMode ? $scope.paramNames[0] : 0); | |
| }; | |
| } | |
| } | |
| ] | |
| }; | |
| }]); | |
| oppia.directive('schemaBasedFloatEditor', [function() { | |
| return { | |
| scope: { | |
| localValue: '=', | |
| isDisabled: '&', | |
| allowExpressions: '&', | |
| validators: '&', | |
| labelForFocusTarget: '&', | |
| onInputBlur: '=', | |
| onInputFocus: '=' | |
| }, | |
| templateUrl: 'schemaBasedEditor/float', | |
| restrict: 'E', | |
| controller: [ | |
| '$scope', '$filter', '$timeout', 'parameterSpecsService', | |
| 'focusService', | |
| function( | |
| $scope, $filter, $timeout, parameterSpecsService, focusService) { | |
| $scope.hasLoaded = false; | |
| $scope.isUserCurrentlyTyping = false; | |
| $scope.hasFocusedAtLeastOnce = false; | |
| $scope.labelForErrorFocusTarget = focusService.generateFocusLabel(); | |
| $scope.validate = function(localValue) { | |
| return $filter('isFloat')(localValue) !== undefined; | |
| }; | |
| $scope.onFocus = function() { | |
| $scope.hasFocusedAtLeastOnce = true; | |
| if ($scope.onInputFocus) { | |
| $scope.onInputFocus(); | |
| } | |
| }; | |
| $scope.onBlur = function() { | |
| $scope.isUserCurrentlyTyping = false; | |
| if ($scope.onInputBlur) { | |
| $scope.onInputBlur(); | |
| } | |
| }; | |
| // TODO(sll): Move these to ng-messages when we move to Angular 1.3. | |
| $scope.getMinValue = function() { | |
| for (var i = 0; i < $scope.validators().length; i++) { | |
| if ($scope.validators()[i].id === 'is_at_least') { | |
| return $scope.validators()[i].min_value; | |
| } | |
| } | |
| }; | |
| $scope.getMaxValue = function() { | |
| for (var i = 0; i < $scope.validators().length; i++) { | |
| if ($scope.validators()[i].id === 'is_at_most') { | |
| return $scope.validators()[i].max_value; | |
| } | |
| } | |
| }; | |
| $scope.onKeypress = function(evt) { | |
| if (evt.keyCode === 13) { | |
| if (Object.keys($scope.floatForm.floatValue.$error).length !== 0) { | |
| $scope.isUserCurrentlyTyping = false; | |
| focusService.setFocus($scope.labelForErrorFocusTarget); | |
| } else { | |
| $scope.$emit('submittedSchemaBasedFloatForm'); | |
| } | |
| } else { | |
| $scope.isUserCurrentlyTyping = true; | |
| } | |
| }; | |
| if ($scope.localValue === undefined) { | |
| $scope.localValue = 0.0; | |
| } | |
| if ($scope.allowExpressions()) { | |
| $scope.paramNames = parameterSpecsService.getAllParamsOfType('float'); | |
| $scope.expressionMode = angular.isString($scope.localValue); | |
| $scope.$watch('localValue', function(newValue) { | |
| $scope.expressionMode = angular.isString(newValue); | |
| }); | |
| $scope.toggleExpressionMode = function() { | |
| $scope.expressionMode = !$scope.expressionMode; | |
| $scope.localValue = ( | |
| $scope.expressionMode ? $scope.paramNames[0] : 0.0); | |
| }; | |
| } | |
| // This prevents the red 'invalid input' warning message from flashing | |
| // at the outset. | |
| $timeout(function() { | |
| $scope.hasLoaded = true; | |
| }); | |
| } | |
| ] | |
| }; | |
| }]); | |
| oppia.directive('schemaBasedUnicodeEditor', [function() { | |
| return { | |
| scope: { | |
| localValue: '=', | |
| isDisabled: '&', | |
| validators: '&', | |
| uiConfig: '&', | |
| allowExpressions: '&', | |
| labelForFocusTarget: '&', | |
| onInputBlur: '=', | |
| onInputFocus: '=' | |
| }, | |
| templateUrl: 'schemaBasedEditor/unicode', | |
| restrict: 'E', | |
| controller: ['$scope', '$filter', '$sce', 'parameterSpecsService', | |
| function($scope, $filter, $sce, parameterSpecsService) { | |
| $scope.allowedParameterNames = parameterSpecsService.getAllParamsOfType( | |
| 'unicode'); | |
| $scope.doUnicodeParamsExist = ($scope.allowedParameterNames.length > 0); | |
| if ($scope.uiConfig() && $scope.uiConfig().rows && | |
| $scope.doUnicodeParamsExist) { | |
| $scope.doUnicodeParamsExist = false; | |
| console.log( | |
| 'Multi-row unicode fields with parameters are not currently ' + | |
| 'supported.'); | |
| } | |
| if ($scope.uiConfig() && $scope.uiConfig().coding_mode) { | |
| // Flag that is flipped each time the codemirror view is | |
| // shown. (The codemirror instance needs to be refreshed | |
| // every time it is unhidden.) | |
| $scope.codemirrorStatus = false; | |
| var CODING_MODE_NONE = 'none'; | |
| $scope.codemirrorOptions = { | |
| // Convert tabs to spaces. | |
| extraKeys: { | |
| Tab: function(cm) { | |
| var spaces = Array(cm.getOption('indentUnit') + 1).join(' '); | |
| cm.replaceSelection(spaces); | |
| // Move the cursor to the end of the selection. | |
| var endSelectionPos = cm.getDoc().getCursor('head'); | |
| cm.getDoc().setCursor(endSelectionPos); | |
| } | |
| }, | |
| indentWithTabs: false, | |
| lineNumbers: true | |
| }; | |
| if ($scope.isDisabled()) { | |
| $scope.codemirrorOptions.readOnly = 'nocursor'; | |
| } | |
| // Note that only 'coffeescript', 'javascript', 'lua', 'python', 'ruby' | |
| // and 'scheme' have CodeMirror-supported syntax highlighting. For other | |
| // languages, syntax highlighting will not happen. | |
| if ($scope.uiConfig().coding_mode !== CODING_MODE_NONE) { | |
| $scope.codemirrorOptions.mode = $scope.uiConfig().coding_mode; | |
| } | |
| setTimeout(function() { | |
| $scope.codemirrorStatus = !$scope.codemirrorStatus; | |
| }, 200); | |
| // When the form view is opened, flip the status flag. The | |
| // timeout seems to be needed for the line numbers etc. to display | |
| // properly. | |
| $scope.$on('schemaBasedFormsShown', function() { | |
| setTimeout(function() { | |
| $scope.codemirrorStatus = !$scope.codemirrorStatus; | |
| }, 200); | |
| }); | |
| } | |
| $scope.onKeypress = function(evt) { | |
| if (evt.keyCode === 13) { | |
| $scope.$emit('submittedSchemaBasedUnicodeForm'); | |
| } | |
| }; | |
| $scope.getPlaceholder = function() { | |
| if (!$scope.uiConfig()) { | |
| return ''; | |
| } else { | |
| return $scope.uiConfig().placeholder; | |
| } | |
| }; | |
| $scope.getRows = function() { | |
| if (!$scope.uiConfig()) { | |
| return null; | |
| } else { | |
| return $scope.uiConfig().rows; | |
| } | |
| }; | |
| $scope.getCodingMode = function() { | |
| if (!$scope.uiConfig()) { | |
| return null; | |
| } else { | |
| return $scope.uiConfig().coding_mode; | |
| } | |
| }; | |
| $scope.getDisplayedValue = function() { | |
| return $sce.trustAsHtml( | |
| $filter('convertUnicodeWithParamsToHtml')($scope.localValue)); | |
| }; | |
| }] | |
| }; | |
| }]); | |
| oppia.directive('schemaBasedHtmlEditor', [function() { | |
| return { | |
| scope: { | |
| localValue: '=', | |
| isDisabled: '&', | |
| allowExpressions: '&', | |
| labelForFocusTarget: '&', | |
| uiConfig: '&' | |
| }, | |
| templateUrl: 'schemaBasedEditor/html', | |
| restrict: 'E' | |
| }; | |
| }]); | |
| oppia.directive('schemaBasedListEditor', [ | |
| 'schemaDefaultValueService', 'recursionHelper', 'focusService', | |
| 'schemaUndefinedLastElementService', | |
| function( | |
| schemaDefaultValueService, recursionHelper, focusService, | |
| schemaUndefinedLastElementService) { | |
| return { | |
| scope: { | |
| localValue: '=', | |
| isDisabled: '&', | |
| // Read-only property. The schema definition for each item in the list. | |
| itemSchema: '&', | |
| // The length of the list. If not specified, the list is of arbitrary | |
| // length. | |
| len: '=', | |
| // UI configuration. May be undefined. | |
| uiConfig: '&', | |
| allowExpressions: '&', | |
| validators: '&', | |
| labelForFocusTarget: '&' | |
| }, | |
| templateUrl: 'schemaBasedEditor/list', | |
| restrict: 'E', | |
| compile: recursionHelper.compile, | |
| controller: ['$scope', function($scope) { | |
| var baseFocusLabel = ( | |
| $scope.labelForFocusTarget() || | |
| Math.random().toString(36).slice(2) + '-'); | |
| $scope.getFocusLabel = function(index) { | |
| // Treat the first item in the list as a special case -- if this list | |
| // is contained in another list, and the outer list is opened with a | |
| // desire to autofocus on the first input field, we can then focus on | |
| // the given $scope.labelForFocusTarget(). | |
| // NOTE: This will cause problems for lists nested within lists, since | |
| // sub-element 0 > 1 will have the same label as sub-element 1 > 0. | |
| // But we will assume (for now) that nested lists won't be used -- if | |
| // they are, this will need to be changed. | |
| return ( | |
| index === 0 ? baseFocusLabel : baseFocusLabel + index.toString()); | |
| }; | |
| $scope.isAddItemButtonPresent = true; | |
| $scope.addElementText = 'Add element'; | |
| if ($scope.uiConfig() && $scope.uiConfig().add_element_text) { | |
| $scope.addElementText = $scope.uiConfig().add_element_text; | |
| } | |
| // Only hide the 'add item' button in the case of single-line unicode | |
| // input. | |
| $scope.isOneLineInput = true; | |
| if ($scope.itemSchema().type !== 'unicode' || | |
| $scope.itemSchema().hasOwnProperty('choices')) { | |
| $scope.isOneLineInput = false; | |
| } else if ($scope.itemSchema().ui_config) { | |
| if ($scope.itemSchema().ui_config.coding_mode) { | |
| $scope.isOneLineInput = false; | |
| } else if ( | |
| $scope.itemSchema().ui_config.hasOwnProperty('rows') && | |
| $scope.itemSchema().ui_config.rows > 2) { | |
| $scope.isOneLineInput = false; | |
| } | |
| } | |
| $scope.minListLength = null; | |
| $scope.maxListLength = null; | |
| $scope.showDuplicatesWarning = false; | |
| if ($scope.validators()) { | |
| for (var i = 0; i < $scope.validators().length; i++) { | |
| if ($scope.validators()[i].id === 'has_length_at_most') { | |
| $scope.maxListLength = $scope.validators()[i].max_value; | |
| } else if ($scope.validators()[i].id === 'has_length_at_least') { | |
| $scope.minListLength = $scope.validators()[i].min_value; | |
| } else if ($scope.validators()[i].id === 'is_uniquified') { | |
| $scope.showDuplicatesWarning = true; | |
| } | |
| } | |
| } | |
| while ($scope.localValue.length < $scope.minListLength) { | |
| $scope.localValue.push( | |
| schemaDefaultValueService.getDefaultValue($scope.itemSchema())); | |
| } | |
| $scope.hasDuplicates = function() { | |
| var valuesSoFar = {}; | |
| for (var i = 0; i < $scope.localValue.length; i++) { | |
| var value = $scope.localValue[i]; | |
| if (!valuesSoFar.hasOwnProperty(value)) { | |
| valuesSoFar[value] = true; | |
| } else { | |
| return true; | |
| } | |
| } | |
| return false; | |
| }; | |
| if ($scope.len === undefined) { | |
| $scope.addElement = function() { | |
| if ($scope.isOneLineInput) { | |
| $scope.hideAddItemButton(); | |
| } | |
| $scope.localValue.push( | |
| schemaDefaultValueService.getDefaultValue($scope.itemSchema())); | |
| focusService.setFocus( | |
| $scope.getFocusLabel($scope.localValue.length - 1)); | |
| }; | |
| var _deleteLastElementIfUndefined = function() { | |
| var lastValueIndex = $scope.localValue.length - 1; | |
| var valueToConsiderUndefined = ( | |
| schemaUndefinedLastElementService.getUndefinedValue( | |
| $scope.itemSchema())); | |
| if ($scope.localValue[lastValueIndex] === | |
| valueToConsiderUndefined) { | |
| $scope.deleteElement(lastValueIndex); | |
| } | |
| }; | |
| $scope.lastElementOnBlur = function() { | |
| _deleteLastElementIfUndefined(); | |
| $scope.showAddItemButton(); | |
| }; | |
| $scope.showAddItemButton = function() { | |
| $scope.isAddItemButtonPresent = true; | |
| }; | |
| $scope.hideAddItemButton = function() { | |
| $scope.isAddItemButtonPresent = false; | |
| }; | |
| $scope._onChildFormSubmit = function(evt) { | |
| if (!$scope.isAddItemButtonPresent) { | |
| /** | |
| * If form submission happens on last element of the set (i.e the | |
| * add item button is absent) then automatically add the element | |
| * to the list. | |
| */ | |
| if (($scope.maxListLength === null || | |
| $scope.localValue.length < $scope.maxListLength) && | |
| !!$scope.localValue[$scope.localValue.length - 1]) { | |
| $scope.addElement(); | |
| } | |
| } else { | |
| /** | |
| * If form submission happens on existing element remove focus | |
| * from it | |
| */ | |
| document.activeElement.blur(); | |
| } | |
| evt.stopPropagation(); | |
| }; | |
| $scope.$on('submittedSchemaBasedIntForm', $scope._onChildFormSubmit); | |
| $scope.$on( | |
| 'submittedSchemaBasedFloatForm', $scope._onChildFormSubmit); | |
| $scope.$on( | |
| 'submittedSchemaBasedUnicodeForm', $scope._onChildFormSubmit); | |
| $scope.deleteElement = function(index) { | |
| // Need to let the RTE know that HtmlContent has been changed. | |
| $scope.$broadcast('externalHtmlContentChange'); | |
| $scope.localValue.splice(index, 1); | |
| }; | |
| } else { | |
| if ($scope.len <= 0) { | |
| throw 'Invalid length for list editor: ' + $scope.len; | |
| } | |
| if ($scope.len !== $scope.localValue.length) { | |
| throw 'List editor length does not match length of input value: ' + | |
| $scope.len + ' ' + $scope.localValue; | |
| } | |
| } | |
| }] | |
| }; | |
| } | |
| ]); | |
| oppia.directive('schemaBasedDictEditor', [ | |
| 'recursionHelper', function(recursionHelper) { | |
| return { | |
| scope: { | |
| localValue: '=', | |
| isDisabled: '&', | |
| // Read-only property. An object whose keys and values are the dict | |
| // properties and the corresponding schemas. | |
| propertySchemas: '&', | |
| allowExpressions: '&', | |
| labelForFocusTarget: '&' | |
| }, | |
| templateUrl: 'schemaBasedEditor/dict', | |
| restrict: 'E', | |
| compile: recursionHelper.compile, | |
| controller: ['$scope', function($scope) { | |
| $scope.getHumanReadablePropertyDescription = function(property) { | |
| return property.description || '[' + property.name + ']'; | |
| }; | |
| $scope.fieldIds = {}; | |
| for (var i = 0; i < $scope.propertySchemas().length; i++) { | |
| // Generate random IDs for each field. | |
| $scope.fieldIds[$scope.propertySchemas()[i].name] = ( | |
| Math.random().toString(36).slice(2)); | |
| } | |
| }] | |
| }; | |
| } | |
| ]); | |
| oppia.directive('schemaBasedCustomEditor', [ | |
| 'recursionHelper', function(recursionHelper) { | |
| return { | |
| scope: { | |
| localValue: '=', | |
| // The class of the object being edited. | |
| objType: '=' | |
| }, | |
| templateUrl: 'schemaBasedEditor/custom', | |
| restrict: 'E', | |
| compile: recursionHelper.compile | |
| }; | |
| } | |
| ]); | |
| /********************************************************************* | |
| * | |
| * DIRECTIVES FOR SCHEMA-BASED VIEWERS | |
| * | |
| *********************************************************************/ | |
| oppia.directive('schemaBasedViewer', [function() { | |
| return { | |
| scope: { | |
| schema: '&', | |
| localValue: '=' | |
| }, | |
| templateUrl: 'schemaBasedViewer/master', | |
| restrict: 'E' | |
| }; | |
| }]); | |
| oppia.directive('schemaBasedPrimitiveViewer', [function() { | |
| return { | |
| scope: { | |
| localValue: '=' | |
| }, | |
| templateUrl: 'schemaBasedViewer/primitive', | |
| restrict: 'E', | |
| controller: ['$scope', function($scope) { | |
| $scope.isExpression = function(value) { | |
| return angular.isString(value); | |
| }; | |
| }] | |
| }; | |
| }]); | |
| oppia.directive('schemaBasedUnicodeViewer', [function() { | |
| return { | |
| scope: { | |
| localValue: '=' | |
| }, | |
| templateUrl: 'schemaBasedViewer/unicode', | |
| restrict: 'E', | |
| controller: ['$scope', '$filter', '$sce', function($scope, $filter, $sce) { | |
| $scope.getDisplayedValue = function() { | |
| return $sce.trustAsHtml($filter('convertUnicodeWithParamsToHtml')( | |
| $scope.localValue)); | |
| }; | |
| }] | |
| }; | |
| }]); | |
| oppia.directive('schemaBasedHtmlViewer', [function() { | |
| return { | |
| scope: { | |
| localValue: '=' | |
| }, | |
| templateUrl: 'schemaBasedViewer/html', | |
| restrict: 'E' | |
| }; | |
| }]); | |
| oppia.directive('schemaBasedListViewer', [ | |
| 'recursionHelper', function(recursionHelper) { | |
| return { | |
| scope: { | |
| localValue: '=', | |
| // Read-only property. The schema definition for each item in the list. | |
| itemSchema: '&' | |
| }, | |
| templateUrl: 'schemaBasedViewer/list', | |
| restrict: 'E', | |
| compile: recursionHelper.compile | |
| }; | |
| } | |
| ]); | |
| oppia.directive('schemaBasedDictViewer', [ | |
| 'recursionHelper', function(recursionHelper) { | |
| return { | |
| scope: { | |
| localValue: '=', | |
| // Read-only property. An object whose keys and values are the dict | |
| // properties and the corresponding schemas. | |
| propertySchemas: '&' | |
| }, | |
| templateUrl: 'schemaBasedViewer/dict', | |
| restrict: 'E', | |
| compile: recursionHelper.compile, | |
| controller: ['$scope', function($scope) { | |
| $scope.getHumanReadablePropertyDescription = function(property) { | |
| return property.description || '[' + property.name + ']'; | |
| }; | |
| }] | |
| }; | |
| } | |
| ]); | |
| oppia.directive('schemaBasedCustomViewer', [ | |
| 'recursionHelper', function(recursionHelper) { | |
| return { | |
| scope: { | |
| localValue: '=', | |
| // The class of the object being edited. | |
| objType: '=' | |
| }, | |
| templateUrl: 'schemaBasedViewer/custom', | |
| restrict: 'E', | |
| compile: recursionHelper.compile | |
| }; | |
| } | |
| ]); | |
| })(); | |
| (function() {// Copyright 2016 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| /** | |
| * @fileoverview Factory for handling warnings and info messages. | |
| */ | |
| oppia.factory('alertsService', ['$log', function($log) { | |
| var alertsService = { | |
| /** | |
| * Each element in each of the arrays here is an object with two keys: | |
| * - type: a string specifying the type of message or warning. | |
| * Possible types - "warning", "info" or "success". | |
| * - content: a string containing the warning or message. | |
| */ | |
| /** | |
| * Array of "warning" messages. | |
| */ | |
| warnings: [], | |
| /** | |
| * Array of "success" or "info" messages. | |
| */ | |
| messages: [] | |
| }; | |
| // This is to prevent infinite loops. | |
| var MAX_TOTAL_WARNINGS = 10; | |
| var MAX_TOTAL_MESSAGES = 10; | |
| /** | |
| * Adds a warning message. | |
| * @param {string} warning - The warning message to display. | |
| */ | |
| alertsService.addWarning = function(warning) { | |
| $log.error(warning); | |
| if (alertsService.warnings.length >= MAX_TOTAL_WARNINGS) { | |
| return; | |
| } | |
| alertsService.warnings.push({ | |
| type: 'warning', | |
| content: warning | |
| }); | |
| }; | |
| /** | |
| * Adds a warning in the same way as addWarning(), except it also throws an | |
| * exception to cause a hard failure in the frontend. | |
| * @param {string} warning - The warning message to display. | |
| */ | |
| alertsService.fatalWarning = function(warning) { | |
| alertsService.addWarning(warning); | |
| throw new Error(warning); | |
| }; | |
| /** | |
| * Deletes the warning from the warnings list. | |
| * @param {Object} warningObject - The warning message to be deleted. | |
| */ | |
| alertsService.deleteWarning = function(warningObject) { | |
| var warnings = alertsService.warnings; | |
| var newWarnings = []; | |
| for (var i = 0; i < warnings.length; i++) { | |
| if (warnings[i].content !== warningObject.content) { | |
| newWarnings.push(warnings[i]); | |
| } | |
| } | |
| alertsService.warnings = newWarnings; | |
| }; | |
| /** | |
| * Clears all warnings. | |
| */ | |
| alertsService.clearWarnings = function() { | |
| alertsService.warnings = []; | |
| }; | |
| /** | |
| * Adds a message, can be info messages or success messages. | |
| * @param {string} type - Type of message | |
| * @param {string} message - Message content | |
| */ | |
| alertsService.addMessage = function(type, message) { | |
| if (alertsService.messages.length >= MAX_TOTAL_MESSAGES) { | |
| return; | |
| } | |
| alertsService.messages.push({ | |
| type: type, | |
| content: message | |
| }); | |
| }; | |
| /** | |
| * Deletes the message from the messages list. | |
| * @param {Object} messageObject - Message to be deleted. | |
| */ | |
| alertsService.deleteMessage = function(messageObject) { | |
| var messages = alertsService.messages; | |
| var newMessages = []; | |
| for (var i = 0; i < messages.length; i++) { | |
| if (messages[i].type !== messageObject.type || | |
| messages[i].content !== messageObject.content) { | |
| newMessages.push(messages[i]); | |
| } | |
| } | |
| alertsService.messages = newMessages; | |
| }; | |
| /** | |
| * Adds an info message. | |
| * @param {string} message - Info message to display. | |
| */ | |
| alertsService.addInfoMessage = function(message) { | |
| alertsService.addMessage('info', message); | |
| }; | |
| /** | |
| * Adds a success message. | |
| * @param {string} message - Success message to display | |
| */ | |
| alertsService.addSuccessMessage = function(message) { | |
| alertsService.addMessage('success', message); | |
| }; | |
| /** | |
| * Clears all messages. | |
| */ | |
| alertsService.clearMessages = function() { | |
| alertsService.messages = []; | |
| }; | |
| return alertsService; | |
| }]); | |
| })(); | |
| (function() {// Copyright 2014 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| /** | |
| * @fileoverview Service for returning information about an exploration's | |
| * context. | |
| */ | |
| oppia.constant('PAGE_CONTEXT', { | |
| EDITOR: 'editor', | |
| LEARNER: 'learner', | |
| OTHER: 'other' | |
| }); | |
| oppia.constant('EDITOR_TAB_CONTEXT', { | |
| EDITOR: 'editor', | |
| PREVIEW: 'preview' | |
| }); | |
| oppia.factory('explorationContextService', [ | |
| '$window', 'PAGE_CONTEXT', 'EDITOR_TAB_CONTEXT', | |
| function($window, PAGE_CONTEXT, EDITOR_TAB_CONTEXT) { | |
| var _pageContext = null; | |
| var _explorationId = null; | |
| return { | |
| // Returns a string representing the current tab of the editor (either | |
| // 'editor' or 'preview'), or null if the current tab is neither of these, | |
| // or the current page is not the editor. | |
| getEditorTabContext: function() { | |
| var hash = $window.location.hash; | |
| if (hash.indexOf('#/gui') === 0) { | |
| return EDITOR_TAB_CONTEXT.EDITOR; | |
| } else if (hash.indexOf('#/preview') === 0) { | |
| return EDITOR_TAB_CONTEXT.PREVIEW; | |
| } else { | |
| return null; | |
| } | |
| }, | |
| // Returns a string representing the context of the current page. | |
| // This is either PAGE_CONTEXT.EDITOR or PAGE_CONTEXT.LEARNER. | |
| // If the current page is not one in either EDITOR or LEARNER then | |
| // return PAGE_CONTEXT.OTHER | |
| getPageContext: function() { | |
| if (_pageContext) { | |
| return _pageContext; | |
| } else { | |
| var pathnameArray = $window.location.pathname.split('/'); | |
| for (var i = 0; i < pathnameArray.length; i++) { | |
| if (pathnameArray[i] === 'explore') { | |
| _pageContext = PAGE_CONTEXT.LEARNER; | |
| return PAGE_CONTEXT.LEARNER; | |
| } else if (pathnameArray[i] === 'create') { | |
| _pageContext = PAGE_CONTEXT.EDITOR; | |
| return PAGE_CONTEXT.EDITOR; | |
| } | |
| } | |
| return PAGE_CONTEXT.OTHER; | |
| } | |
| }, | |
| isInExplorationContext: function() { | |
| return (this.getPageContext() === PAGE_CONTEXT.EDITOR || | |
| this.getPageContext() === PAGE_CONTEXT.LEARNER); | |
| }, | |
| // Returns a string representing the explorationId (obtained from the | |
| // URL). | |
| getExplorationId: function() { | |
| if (_explorationId) { | |
| return _explorationId; | |
| } else { | |
| // The pathname should be one of /explore/{exploration_id} or | |
| // /create/{exploration_id} . | |
| var pathnameArray = $window.location.pathname.split('/'); | |
| for (var i = 0; i < pathnameArray.length; i++) { | |
| if (pathnameArray[i] === 'explore' || | |
| pathnameArray[i] === 'create') { | |
| _explorationId = pathnameArray[i + 1]; | |
| return pathnameArray[i + 1]; | |
| } | |
| } | |
| throw Error( | |
| 'ERROR: explorationContextService should not be used outside the ' + | |
| 'context of an exploration.'); | |
| } | |
| }, | |
| // Following variable helps to know whether exploration editor is | |
| // in main editing mode or preview mode. | |
| isInExplorationEditorMode: function() { | |
| return (this.getPageContext() === PAGE_CONTEXT.EDITOR && | |
| this.getEditorTabContext() === EDITOR_TAB_CONTEXT.EDITOR); | |
| } | |
| }; | |
| } | |
| ]); | |
| })(); | |
| (function() {// Copyright 2014 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| // About this service: | |
| // In the exploration player, a video should only autoplay when it is first seen | |
| // on a new card, and not when the learner clicks back to previous cards in | |
| // their exploration playthrough. This service maintains a list of videos that | |
| // have been played, so that we know not to autoplay them on a second pass. | |
| // | |
| // Caveat: if the same video is shown twice in the exploration, the second and | |
| // subsequent instances of that video will not autoplay. We believe this | |
| // occurrence is rare, and have not accounted for it here. If it turns out | |
| // to be an issue, we may need to instead assign a unique id to each rich-text | |
| // component and use that id instead to determine whether to suppress | |
| // autoplaying. | |
| oppia.factory('autoplayedVideosService', [function() { | |
| var autoplayedVideosDict = {}; | |
| return { | |
| addAutoplayedVideo: function(videoId) { | |
| autoplayedVideosDict[videoId] = true; | |
| }, | |
| hasVideoBeenAutoplayed: function(videoId) { | |
| return Boolean(autoplayedVideosDict[videoId]); | |
| } | |
| }; | |
| } | |
| ]); | |
| })(); | |
| (function() {// Copyright 2016 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| /** | |
| * @fileoverview search service for activityTilesInfinityGrid | |
| */ | |
| oppia.constant('SEARCH_DATA_URL', '/searchhandler/data'); | |
| oppia.factory('searchService', [ | |
| '$http', '$rootScope', '$translate', 'SEARCH_DATA_URL', | |
| function($http, $rootScope, $translate, SEARCH_DATA_URL) { | |
| var _lastQuery = null; | |
| var _lastSelectedCategories = {}; | |
| var _lastSelectedLanguageCodes = {}; | |
| var _searchCursor = null; | |
| // Appends a suffix to the query describing allowed category and language | |
| // codes to filter on. | |
| var _getSuffixForQuery = function(selectedCategories, selectedLanguageCodes) { | |
| var querySuffix = ''; | |
| var _categories = ''; | |
| for (var key in selectedCategories) { | |
| if (selectedCategories[key]) { | |
| if (_categories) { | |
| _categories += '" OR "'; | |
| } | |
| _categories += key; | |
| } | |
| } | |
| if (_categories) { | |
| querySuffix += '&category=("' + _categories + '")'; | |
| } | |
| var _languageCodes = ''; | |
| for (var key in selectedLanguageCodes) { | |
| if (selectedLanguageCodes[key]) { | |
| if (_languageCodes) { | |
| _languageCodes += '" OR "'; | |
| } | |
| _languageCodes += key; | |
| } | |
| } | |
| if (_languageCodes) { | |
| querySuffix += '&language_code=("' + _languageCodes + '")'; | |
| } | |
| return querySuffix; | |
| }; | |
| var hasReachedEndOfPage = function() { | |
| return _searchCursor === null; | |
| }; | |
| var updateSearchFields = function(itemsType, urlComponent, | |
| selectionDetails) { | |
| var itemCodeGroup = urlComponent.match(/=\("[A-Za-z%20" ]+"\)/); | |
| var itemCodes = itemCodeGroup ? itemCodeGroup[0] : null; | |
| var EXPECTED_PREFIX = '=("'; | |
| var EXPECTED_SUFFIX = '")'; | |
| if (!itemCodes || | |
| itemCodes.indexOf(EXPECTED_PREFIX) !== 0 || | |
| itemCodes.lastIndexOf(EXPECTED_SUFFIX) !== | |
| itemCodes.length - EXPECTED_SUFFIX.length) { | |
| throw Error('Invalid search query url fragment for ' + | |
| itemsType + ': ' + urlComponent); | |
| return; | |
| } | |
| var items = itemCodes.substring( | |
| EXPECTED_PREFIX.length, itemCodes.length - EXPECTED_SUFFIX.length | |
| ).split('" OR "'); | |
| var selections = selectionDetails[itemsType].selections; | |
| for (var i = 0; i < items.length; i++) { | |
| selections[items[i]] = true; | |
| } | |
| }; | |
| var _isCurrentlyFetchingResults = false; | |
| var numSearchesInProgress = 0; | |
| var getQueryUrl = function(searchUrlQueryString) { | |
| return SEARCH_DATA_URL + '?q=' + searchUrlQueryString; | |
| }; | |
| return { | |
| getSearchUrlQueryString: function(searchQuery, selectedCategories, | |
| selectedLanguageCodes) { | |
| return encodeURIComponent(searchQuery) + | |
| _getSuffixForQuery(selectedCategories, selectedLanguageCodes); | |
| }, | |
| // Note that an empty query results in all activities being shown. | |
| executeSearchQuery: function( | |
| searchQuery, selectedCategories, selectedLanguageCodes, | |
| successCallback) { | |
| var queryUrl = getQueryUrl( | |
| this.getSearchUrlQueryString( | |
| searchQuery, selectedCategories, selectedLanguageCodes)); | |
| _isCurrentlyFetchingResults = true; | |
| numSearchesInProgress++; | |
| $http.get(queryUrl).then(function(response) { | |
| var data = response.data; | |
| _lastQuery = searchQuery; | |
| _lastSelectedCategories = angular.copy(selectedCategories); | |
| _lastSelectedLanguageCodes = angular.copy(selectedLanguageCodes); | |
| _searchCursor = data.search_cursor; | |
| numSearchesInProgress--; | |
| if ($('.oppia-search-bar-input').val() === searchQuery) { | |
| $rootScope.$broadcast( | |
| 'initialSearchResultsLoaded', data.activity_list); | |
| _isCurrentlyFetchingResults = false; | |
| } else { | |
| console.log('Mismatch'); | |
| console.log('SearchQuery: ' + searchQuery); | |
| console.log('Input: ' + $('.oppia-search-bar-input').val()); | |
| } | |
| }, function() { | |
| numSearchesInProgress--; | |
| }); | |
| // Translate the new explorations loaded. | |
| $translate.refresh(); | |
| if (successCallback) { | |
| successCallback(); | |
| } | |
| }, | |
| isSearchInProgress: function() { | |
| return numSearchesInProgress > 0; | |
| }, | |
| // The following takes in the url search component as an argument and the | |
| // selectionDetails. It will update selectionDetails with the relevant | |
| // fields that were extracted from the url. It returns the unencoded search | |
| // query string. | |
| updateSearchFieldsBasedOnUrlQuery: function( | |
| urlComponent, selectionDetails) { | |
| var urlQuery = urlComponent.substring('?q='.length); | |
| // The following will split the urlQuery into 3 components: | |
| // 1. query | |
| // 2. categories (optional) | |
| // 3. language codes (default to 'en') | |
| var querySegments = urlQuery.split('&'); | |
| if (querySegments.length > 3) { | |
| throw Error('Invalid search query url: ' + urlQuery); | |
| } | |
| for (var i = 1; i < querySegments.length; i++) { | |
| var urlComponent = decodeURIComponent(querySegments[i]); | |
| var itemsType = null; | |
| if (urlComponent.indexOf('category') === 0) { | |
| itemsType = 'categories'; | |
| } else if (urlComponent.indexOf('language_code') === 0) { | |
| itemsType = 'languageCodes'; | |
| } else { | |
| console.error('Invalid search query component: ' + urlComponent); | |
| continue; | |
| } | |
| try { | |
| updateSearchFields(itemsType, urlComponent, selectionDetails); | |
| } catch (error) { | |
| selectionDetails[itemsType].selections = {}; | |
| throw error; | |
| } | |
| } | |
| return decodeURIComponent(querySegments[0]); | |
| }, | |
| loadMoreData: function(successCallback, failureCallback) { | |
| // If a new query is still being sent, or the end of the page has been | |
| // reached, do not fetch more results. | |
| if (_isCurrentlyFetchingResults || hasReachedEndOfPage()) { | |
| failureCallback(hasReachedEndOfPage()); | |
| return; | |
| } | |
| var queryUrl = getQueryUrl( | |
| this.getSearchUrlQueryString( | |
| _lastQuery, _lastSelectedCategories, _lastSelectedLanguageCodes)); | |
| if (_searchCursor) { | |
| queryUrl += '&cursor=' + _searchCursor; | |
| } | |
| _isCurrentlyFetchingResults = true; | |
| $http.get(queryUrl).then(function(response) { | |
| _searchCursor = response.data.search_cursor; | |
| _isCurrentlyFetchingResults = false; | |
| if (successCallback) { | |
| successCallback(response.data, hasReachedEndOfPage()); | |
| } | |
| }); | |
| } | |
| }; | |
| }]); | |
| })(); | |
| (function() {// Copyright 2016 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| /** | |
| * @fileoverview Directive for an infinitely-scrollable view of activity tiles | |
| */ | |
| oppia.directive('activityTilesInfinityGrid', [function() { | |
| return { | |
| restrict: 'E', | |
| templateUrl: 'components/activityTilesInfinityGrid', | |
| controller: [ | |
| '$scope', '$rootScope', 'searchService', | |
| function($scope, $rootScope, searchService) { | |
| $scope.endOfPageIsReached = false; | |
| $scope.allActivitiesInOrder = []; | |
| // Called when the first batch of search results is retrieved from the | |
| // server. | |
| $scope.$on( | |
| 'initialSearchResultsLoaded', function(evt, activityList) { | |
| $scope.allActivitiesInOrder = activityList; | |
| } | |
| ); | |
| $scope.showMoreActivities = function() { | |
| if (!$rootScope.loadingMessage && !$scope.endOfPageIsReached) { | |
| $scope.searchResultsAreLoading = true; | |
| searchService.loadMoreData(function(data, endOfPageIsReached) { | |
| $scope.allActivitiesInOrder = | |
| $scope.allActivitiesInOrder.concat( | |
| data.activity_list); | |
| $scope.endOfPageIsReached = endOfPageIsReached; | |
| $scope.searchResultsAreLoading = false; | |
| }, function(endOfPageIsReached) { | |
| $scope.endOfPageIsReached = endOfPageIsReached; | |
| $scope.searchResultsAreLoading = false; | |
| }); | |
| } | |
| }; | |
| } | |
| ] | |
| }; | |
| }]); | |
| })(); | |
| (function() {// Copyright 2016 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| /** | |
| * @fileoverview Directive for Alert Messages | |
| */ | |
| oppia.directive('alertMessage', [function() { | |
| return { | |
| restrict: 'E', | |
| scope: { | |
| getMessage: '&messageObject', | |
| getMessageIndex: '&messageIndex' | |
| }, | |
| template: '<div class="oppia-alert-message"></div>', | |
| controller: [ | |
| '$scope', 'alertsService', 'toastr', | |
| function($scope, alertsService, toastr) { | |
| $scope.alertsService = alertsService; | |
| $scope.toastr = toastr; | |
| } | |
| ], | |
| link: function(scope) { | |
| var message = scope.getMessage(); | |
| if (message.type === 'info') { | |
| scope.toastr.info(message.content, { | |
| onHidden: function() { | |
| scope.alertsService.deleteMessage(message); | |
| } | |
| }); | |
| } else if (message.type === 'success') { | |
| scope.toastr.success(message.content, { | |
| onHidden: function() { | |
| scope.alertsService.deleteMessage(message); | |
| } | |
| }); | |
| } | |
| } | |
| }; | |
| }]); | |
| })(); | |
| (function() {// Copyright 2014 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| /** | |
| * @fileoverview Modal and functionality for the create collection button. | |
| */ | |
| // TODO(bhenning): Refactor this to match the frontend design spec and reduce | |
| // duplicated code between CollectionCreationService and | |
| // ExplorationCreationService. | |
| oppia.factory('CollectionCreationService', [ | |
| '$http', '$window', '$rootScope', '$timeout', 'alertsService', | |
| 'UrlInterpolationService', 'siteAnalyticsService', | |
| function( | |
| $http, $window, $rootScope, $timeout, alertsService, | |
| UrlInterpolationService, siteAnalyticsService) { | |
| var CREATE_NEW_COLLECTION_URL_TEMPLATE = ( | |
| '/collection_editor/create/<collection_id>'); | |
| var collectionCreationInProgress = false; | |
| return { | |
| createNewCollection: function() { | |
| if (collectionCreationInProgress) { | |
| return; | |
| } | |
| collectionCreationInProgress = true; | |
| alertsService.clearWarnings(); | |
| $rootScope.loadingMessage = 'Creating collection'; | |
| $http.post('/collection_editor_handler/create_new', {}).then( | |
| function(response) { | |
| siteAnalyticsService.registerCreateNewCollectionEvent( | |
| response.data.collectionId); | |
| $timeout(function() { | |
| $window.location = UrlInterpolationService.interpolateUrl( | |
| CREATE_NEW_COLLECTION_URL_TEMPLATE, { | |
| collection_id: response.data.collectionId | |
| } | |
| ); | |
| }, 150); | |
| }, function() { | |
| $rootScope.loadingMessage = ''; | |
| } | |
| ); | |
| } | |
| }; | |
| } | |
| ]); | |
| })(); | |
| (function() {// Copyright 2016 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| /** | |
| * @fileoverview Summary tile for collections. | |
| */ | |
| oppia.constant( | |
| 'COLLECTION_VIEWER_URL', '/collection/<collection_id>'); | |
| oppia.directive('collectionSummaryTile', [function() { | |
| return { | |
| restrict: 'E', | |
| scope: { | |
| getCollectionId: '&collectionId', | |
| getCollectionTitle: '&collectionTitle', | |
| getObjective: '&objective', | |
| getNodeCount: '&nodeCount', | |
| getLastUpdatedMsec: '&lastUpdatedMsec', | |
| getThumbnailIconUrl: '&thumbnailIconUrl', | |
| getThumbnailBgColor: '&thumbnailBgColor' | |
| }, | |
| templateUrl: 'summaryTile/collection', | |
| controller: [ | |
| '$scope', 'oppiaDatetimeFormatter', 'UrlInterpolationService', | |
| 'COLLECTION_VIEWER_URL', function($scope, oppiaDatetimeFormatter, | |
| UrlInterpolationService, COLLECTION_VIEWER_URL) { | |
| $scope.getLastUpdatedDatetime = function() { | |
| return oppiaDatetimeFormatter.getLocaleAbbreviatedDatetimeString( | |
| $scope.getLastUpdatedMsec()); | |
| }; | |
| $scope.wasRecentlyUpdated = function() { | |
| return oppiaDatetimeFormatter.isRecent($scope.getLastUpdatedMsec()); | |
| }; | |
| $scope.getCollectionLink = function() { | |
| return UrlInterpolationService.interpolateUrl( | |
| COLLECTION_VIEWER_URL, { | |
| collection_id: $scope.getCollectionId() | |
| } | |
| ); | |
| }; | |
| } | |
| ] | |
| }; | |
| }]); | |
| })(); | |
| (function() {// Copyright 2016 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| /** | |
| * @fileoverview Directive for the Create Exploration/Collection button. | |
| */ | |
| oppia.directive('createActivityButton', [function() { | |
| return { | |
| restrict: 'E', | |
| templateUrl: 'components/createActivityButton', | |
| controller: [ | |
| '$scope', '$timeout', '$window', '$modal', 'ExplorationCreationService', | |
| 'CollectionCreationService', 'siteAnalyticsService', 'urlService', | |
| function( | |
| $scope, $timeout, $window, $modal, ExplorationCreationService, | |
| CollectionCreationService, siteAnalyticsService, urlService) { | |
| $scope.creationInProgress = false; | |
| $scope.showUploadExplorationModal = ( | |
| ExplorationCreationService.showUploadExplorationModal); | |
| $scope.onRedirectToLogin = function(destinationUrl) { | |
| siteAnalyticsService.registerStartLoginEvent('createActivityButton'); | |
| $timeout(function() { | |
| $window.location = destinationUrl; | |
| }, 150); | |
| return false; | |
| }; | |
| $scope.initCreationProcess = function() { | |
| // Without this, the modal keeps reopening when the window is resized. | |
| if ($scope.creationInProgress) { | |
| return; | |
| } | |
| $scope.creationInProgress = true; | |
| if (!GLOBALS.can_create_collections) { | |
| ExplorationCreationService.createNewExploration(); | |
| } else if (urlService.getPathname() !== '/dashboard') { | |
| $window.location.replace('/dashboard?mode=create'); | |
| } else { | |
| $modal.open({ | |
| templateUrl: 'modals/createActivity', | |
| backdrop: true, | |
| controller: [ | |
| '$scope', '$modalInstance', 'UrlInterpolationService', | |
| function($scope, $modalInstance, UrlInterpolationService) { | |
| $scope.chooseExploration = function() { | |
| ExplorationCreationService.createNewExploration(); | |
| $modalInstance.close(); | |
| }; | |
| $scope.chooseCollection = function() { | |
| CollectionCreationService.createNewCollection(); | |
| $modalInstance.close(); | |
| }; | |
| $scope.cancel = function() { | |
| $modalInstance.dismiss('cancel'); | |
| }; | |
| $scope.explorationImgUrl = ( | |
| UrlInterpolationService.getStaticImageUrl( | |
| '/activity/exploration.svg')); | |
| $scope.collectionImgUrl = ( | |
| UrlInterpolationService.getStaticImageUrl( | |
| '/activity/collection.svg')); | |
| }], | |
| windowClass: 'oppia-creation-modal' | |
| }).result.then(function() {}, function() { | |
| $scope.creationInProgress = false; | |
| }); | |
| } | |
| }; | |
| // If the user clicked on a 'create' button to get to the dashboard, | |
| // open the create modal immediately (or redirect to the exploration | |
| // editor if the create modal does not need to be shown). | |
| if (urlService.getUrlParams().mode === 'create') { | |
| if (!GLOBALS.can_create_collections) { | |
| ExplorationCreationService.createNewExploration(); | |
| } else { | |
| $scope.initCreationProcess(); | |
| } | |
| } | |
| } | |
| ] | |
| }; | |
| }]); | |
| })(); | |
| (function() {// Copyright 2016 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| /** | |
| * @fileoverview Functionality for the create exploration button and upload | |
| * modal. | |
| */ | |
| oppia.factory('ExplorationCreationService', [ | |
| '$http', '$modal', '$timeout', '$rootScope', '$window', | |
| 'alertsService', 'siteAnalyticsService', 'UrlInterpolationService', | |
| function( | |
| $http, $modal, $timeout, $rootScope, $window, | |
| alertsService, siteAnalyticsService, UrlInterpolationService) { | |
| var CREATE_NEW_EXPLORATION_URL_TEMPLATE = '/create/<exploration_id>?new'; | |
| var explorationCreationInProgress = false; | |
| return { | |
| createNewExploration: function() { | |
| if (explorationCreationInProgress) { | |
| return; | |
| } | |
| explorationCreationInProgress = true; | |
| alertsService.clearWarnings(); | |
| $rootScope.loadingMessage = 'Creating exploration'; | |
| $http.post('/contributehandler/create_new', { | |
| }).then(function(response) { | |
| siteAnalyticsService.registerCreateNewExplorationEvent( | |
| response.data.explorationId); | |
| $timeout(function() { | |
| $window.location = UrlInterpolationService.interpolateUrl( | |
| CREATE_NEW_EXPLORATION_URL_TEMPLATE, { | |
| exploration_id: response.data.explorationId | |
| } | |
| ); | |
| }, 150); | |
| return false; | |
| }, function() { | |
| $rootScope.loadingMessage = ''; | |
| explorationCreationInProgress = false; | |
| }); | |
| }, | |
| showUploadExplorationModal: function() { | |
| alertsService.clearWarnings(); | |
| $modal.open({ | |
| backdrop: true, | |
| templateUrl: 'modals/uploadActivity', | |
| controller: [ | |
| '$scope', '$modalInstance', function($scope, $modalInstance) { | |
| $scope.save = function() { | |
| var returnObj = {}; | |
| var file = document.getElementById('newFileInput').files[0]; | |
| if (!file || !file.size) { | |
| alertsService.addWarning('Empty file detected.'); | |
| return; | |
| } | |
| returnObj.yamlFile = file; | |
| $modalInstance.close(returnObj); | |
| }; | |
| $scope.cancel = function() { | |
| $modalInstance.dismiss('cancel'); | |
| alertsService.clearWarnings(); | |
| }; | |
| } | |
| ] | |
| }).result.then(function(result) { | |
| var yamlFile = result.yamlFile; | |
| $rootScope.loadingMessage = 'Creating exploration'; | |
| var form = new FormData(); | |
| form.append('yaml_file', yamlFile); | |
| form.append('payload', JSON.stringify({})); | |
| form.append('csrf_token', GLOBALS.csrf_token); | |
| $.ajax({ | |
| contentType: false, | |
| data: form, | |
| dataFilter: function(data) { | |
| // Remove the XSSI prefix. | |
| return JSON.parse(data.substring(5)); | |
| }, | |
| dataType: 'text', | |
| processData: false, | |
| type: 'POST', | |
| url: 'contributehandler/upload' | |
| }).done(function(data) { | |
| $window.location = UrlInterpolationService.interpolateUrl( | |
| CREATE_NEW_EXPLORATION_URL_TEMPLATE, { | |
| exploration_id: data.explorationId | |
| } | |
| ); | |
| }).fail(function(data) { | |
| var transformedData = data.responseText.substring(5); | |
| var parsedResponse = JSON.parse(transformedData); | |
| alertsService.addWarning( | |
| parsedResponse.error || 'Error communicating with server.'); | |
| $rootScope.loadingMessage = ''; | |
| $scope.$apply(); | |
| }); | |
| }); | |
| } | |
| }; | |
| } | |
| ]); | |
| })(); | |
| (function() {// Copyright 2015 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| /** | |
| * @fileoverview Component for an exploration summary tile. | |
| */ | |
| oppia.directive('explorationSummaryTile', [function() { | |
| return { | |
| restrict: 'E', | |
| scope: { | |
| getCollectionId: '&collectionId', | |
| getExplorationId: '&explorationId', | |
| getExplorationTitle: '&explorationTitle', | |
| getLastUpdatedMsec: '&lastUpdatedMsec', | |
| getNumViews: '&numViews', | |
| getObjective: '&objective', | |
| getCategory: '&category', | |
| getRatings: '&ratings', | |
| getContributorsSummary: '&contributorsSummary', | |
| getThumbnailIconUrl: '&thumbnailIconUrl', | |
| getThumbnailBgColor: '&thumbnailBgColor', | |
| // If this is not null, the new exploration opens in a new window when the | |
| // summary tile is clicked. | |
| openInNewWindow: '@openInNewWindow', | |
| isCommunityOwned: '&isCommunityOwned', | |
| // If the screen width is below the threshold defined here, the mobile | |
| // version of the summary tile is displayed. This attribute is optional: | |
| // if it is not specified, it is treated as 0, which means that the | |
| // desktop version of the summary tile is always displayed. | |
| mobileCutoffPx: '@mobileCutoffPx' | |
| }, | |
| templateUrl: 'summaryTile/exploration', | |
| link: function(scope, element) { | |
| element.find('.exploration-summary-avatars').on('mouseenter', | |
| function() { | |
| element.find('.mask').attr('class', | |
| 'exploration-summary-tile-mask mask'); | |
| // As animation duration time may be 400ms, .stop(true) is used to | |
| // prevent the effects queue falling behind the mouse movement. | |
| // .hide(1) and .show(1) used to place the animation in the effects | |
| // queue. | |
| element.find('.avatars-num-minus-one').stop(true).hide(1, | |
| function() { | |
| element.find('.all-avatars').stop(true).slideDown(); | |
| } | |
| ); | |
| } | |
| ); | |
| element.find('.exploration-summary-avatars').on('mouseleave', | |
| function() { | |
| element.find('.mask').attr('class', 'top-section-mask mask'); | |
| element.find('.all-avatars').stop(true).slideUp(400, function() { | |
| element.find('.avatars-num-minus-one').stop(true).show(1); | |
| }); | |
| } | |
| ); | |
| }, | |
| controller: [ | |
| '$scope', '$http', | |
| 'oppiaDatetimeFormatter', 'RatingComputationService', | |
| 'windowDimensionsService', 'UrlInterpolationService', | |
| function( | |
| $scope, $http, | |
| oppiaDatetimeFormatter, RatingComputationService, | |
| windowDimensionsService, UrlInterpolationService) { | |
| var contributorsSummary = $scope.getContributorsSummary() || {}; | |
| $scope.contributors = Object.keys( | |
| contributorsSummary).sort( | |
| function(contributorUsername1, contributorUsername2) { | |
| var commitsOfContributor1 = contributorsSummary[ | |
| contributorUsername1].num_commits; | |
| var commitsOfContributor2 = contributorsSummary[ | |
| contributorUsername2].num_commits; | |
| return commitsOfContributor2 - commitsOfContributor1; | |
| } | |
| ); | |
| $scope.avatarsList = []; | |
| $scope.contributors.forEach(function(contributorName) { | |
| var DEFAULT_PROFILE_IMAGE_PATH = ( | |
| UrlInterpolationService.getStaticImageUrl( | |
| '/avatar/user_blue_72px.png')); | |
| var avatarData = { | |
| image: contributorsSummary[ | |
| contributorName].profile_picture_data_url || | |
| DEFAULT_PROFILE_IMAGE_PATH, | |
| tooltipText: contributorName | |
| }; | |
| if (GLOBALS.SYSTEM_USERNAMES.indexOf(contributorName) === -1) { | |
| avatarData.link = '/profile/' + contributorName; | |
| } | |
| $scope.avatarsList.push(avatarData); | |
| }); | |
| if ($scope.isCommunityOwned()) { | |
| var COMMUNITY_OWNED_IMAGE_PATH = ( | |
| UrlInterpolationService.getStaticImageUrl( | |
| '/avatar/fa_globe_72px.png')); | |
| var COMMUNITY_OWNED_TOOLTIP_TEXT = 'Community Owned'; | |
| var communityOwnedAvatar = { | |
| image: COMMUNITY_OWNED_IMAGE_PATH, | |
| tooltipText: COMMUNITY_OWNED_TOOLTIP_TEXT | |
| }; | |
| $scope.avatarsList.unshift(communityOwnedAvatar); | |
| } | |
| $scope.MAX_AVATARS_TO_DISPLAY = 5; | |
| $scope.getAverageRating = function() { | |
| return RatingComputationService.computeAverageRating( | |
| $scope.getRatings()); | |
| }; | |
| $scope.getLastUpdatedDatetime = function() { | |
| return oppiaDatetimeFormatter.getLocaleAbbreviatedDatetimeString( | |
| $scope.getLastUpdatedMsec()); | |
| }; | |
| $scope.wasRecentlyUpdated = function() { | |
| return oppiaDatetimeFormatter.isRecent($scope.getLastUpdatedMsec()); | |
| }; | |
| $scope.getExplorationLink = function() { | |
| var result = '/explore/' + $scope.getExplorationId(); | |
| if ($scope.getCollectionId()) { | |
| result += ('?collection_id=' + $scope.getCollectionId()); | |
| } | |
| return result; | |
| }; | |
| if (!$scope.mobileCutoffPx) { | |
| $scope.mobileCutoffPx = 0; | |
| } | |
| $scope.isWindowLarge = ( | |
| windowDimensionsService.getWidth() >= $scope.mobileCutoffPx); | |
| windowDimensionsService.registerOnResizeHook(function() { | |
| $scope.isWindowLarge = ( | |
| windowDimensionsService.getWidth() >= $scope.mobileCutoffPx); | |
| $scope.$apply(); | |
| }); | |
| } | |
| ] | |
| }; | |
| }]); | |
| })(); | |
| (function() {// Copyright 2016 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| /** | |
| * @fileoverview Directive for displaying animated loading dots. | |
| */ | |
| oppia.directive('loadingDots', function() { | |
| return { | |
| restrict: 'E', | |
| templateUrl: 'components/loadingDots' | |
| }; | |
| }); | |
| })(); | |
| (function() {// Copyright 2014 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| /** | |
| * @fileoverview Directives for the object editors. | |
| */ | |
| // Individual object editor directives are in extensions/objects/templates. | |
| oppia.directive('objectEditor', ['$compile', '$log', function($compile, $log) { | |
| return { | |
| scope: { | |
| alwaysEditable: '@', | |
| initArgs: '=', | |
| isEditable: '@', | |
| objType: '@', | |
| value: '=' | |
| }, | |
| link: function(scope, element) { | |
| // Converts a camel-cased string to a lower-case hyphen-separated string. | |
| var directiveName = scope.objType.replace( | |
| /([a-z])([A-Z])/g, '$1-$2').toLowerCase(); | |
| if (directiveName) { | |
| element.html( | |
| '<' + directiveName + '-editor></' + directiveName + '-editor>'); | |
| $compile(element.contents())(scope); | |
| } else { | |
| $log.error('Error in objectEditor: no editor type supplied.'); | |
| } | |
| }, | |
| restrict: 'E' | |
| }; | |
| }]); | |
| })(); | |
| (function() {// Copyright 2014 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| /** | |
| * @fileoverview Service for computing the average rating. | |
| */ | |
| oppia.factory('RatingComputationService', [function() { | |
| var areRatingsShown = function(ratingFrequencies) { | |
| var MINIMUM_ACCEPTABLE_NUMBER_OF_RATINGS = 1; | |
| var totalNumber = 0; | |
| for (var value in ratingFrequencies) { | |
| totalNumber += ratingFrequencies[value]; | |
| } | |
| return totalNumber >= MINIMUM_ACCEPTABLE_NUMBER_OF_RATINGS; | |
| }; | |
| return { | |
| computeAverageRating: function(ratingFrequencies) { | |
| if (!areRatingsShown(ratingFrequencies)) { | |
| return undefined; | |
| } else { | |
| var totalNumber = 0; | |
| var totalValue = 0.0; | |
| for (var value in ratingFrequencies) { | |
| totalValue += value * ratingFrequencies[value]; | |
| totalNumber += ratingFrequencies[value]; | |
| } | |
| if (totalNumber === 0) { | |
| return undefined; | |
| } | |
| return totalValue / totalNumber; | |
| } | |
| } | |
| }; | |
| }]); | |
| })(); | |
| (function() {// Copyright 2014 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| /** | |
| * @fileoverview Directive for displaying summary rating information. | |
| */ | |
| oppia.directive('ratingDisplay', [function() { | |
| return { | |
| // This will display a star-rating based on the given data. The attributes | |
| // passed in are as follows: | |
| // - isEditable: true or false; whether the rating is user-editable. | |
| // - onEdit: should be supplied iff isEditable is true, and be a function | |
| // that will be supplied with the new rating when the rating is changed. | |
| // - ratingValue: an integer 1-5 giving the rating | |
| restrict: 'E', | |
| scope: { | |
| isEditable: '=', | |
| onEdit: '=', | |
| ratingValue: '=' | |
| }, | |
| templateUrl: 'components/ratingSummary', | |
| link: function(scope, element) { | |
| // This is needed in order for the scope to be retrievable during Karma | |
| // unit testing. See http://stackoverflow.com/a/29833832 for more | |
| // details. | |
| element[0].isolateScope = function() { | |
| return scope; | |
| }; | |
| }, | |
| controller: ['$scope', function($scope) { | |
| var POSSIBLE_RATINGS = [1, 2, 3, 4, 5]; | |
| $scope.stars = POSSIBLE_RATINGS.map(function(starValue) { | |
| return { | |
| cssClass: 'fa-star-o', | |
| value: starValue | |
| }; | |
| }); | |
| var STATUS_ACTIVE = 'active'; | |
| var STATUS_INACTIVE = 'inactive'; | |
| var STATUS_RATING_SET = 'rating_set'; | |
| $scope.status = STATUS_INACTIVE; | |
| var displayValue = function(ratingValue) { | |
| for (var i = 0; i < $scope.stars.length; i++) { | |
| $scope.stars[i].cssClass = ( | |
| ratingValue === undefined ? 'fa-star-o' : | |
| ratingValue < $scope.stars[i].value - 0.75 ? 'fa-star-o' : | |
| ratingValue < $scope.stars[i].value - 0.25 ? 'fa-star-half-o' : | |
| 'fa-star'); | |
| if ($scope.status === STATUS_ACTIVE && | |
| ratingValue >= $scope.stars[i].value) { | |
| $scope.stars[i].cssClass += ' oppia-rating-star-active'; | |
| } | |
| } | |
| }; | |
| displayValue($scope.ratingValue); | |
| $scope.$watch('ratingValue', function() { | |
| displayValue($scope.ratingValue); | |
| }); | |
| $scope.clickStar = function(starValue) { | |
| if ($scope.isEditable && $scope.status === STATUS_ACTIVE) { | |
| $scope.status = STATUS_RATING_SET; | |
| $scope.ratingValue = starValue; | |
| displayValue(starValue); | |
| $scope.onEdit(starValue); | |
| } | |
| }; | |
| $scope.enterStar = function(starValue) { | |
| if ( | |
| $scope.isEditable && | |
| ($scope.status === STATUS_ACTIVE || | |
| $scope.status === STATUS_INACTIVE)) { | |
| $scope.status = STATUS_ACTIVE; | |
| displayValue(starValue); | |
| } | |
| }; | |
| $scope.leaveArea = function() { | |
| $scope.status = STATUS_INACTIVE; | |
| displayValue($scope.ratingValue); | |
| }; | |
| $scope.getCursorStyle = function() { | |
| return 'cursor: ' + ($scope.isEditable ? 'pointer' : 'auto'); | |
| }; | |
| }] | |
| }; | |
| }]); | |
| })(); | |
| (function() {// Copyright 2014 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| /** | |
| * @fileoverview Directive for the select2 autocomplete component. | |
| */ | |
| oppia.directive('select2Dropdown', [function() { | |
| // Directive for incorporating select2 dropdowns. | |
| return { | |
| restrict: 'E', | |
| scope: { | |
| // Whether to allow multiple choices. In order to do so, the value of | |
| // this attribute must be the exact string 'true'. | |
| allowMultipleChoices: '@', | |
| choices: '=', | |
| // An additional CSS class to add to the select2 dropdown. May be | |
| // undefined. | |
| dropdownCssClass: '@', | |
| // A function that formats a new selection. May be undefined. | |
| formatNewSelection: '=', | |
| // The message shown when an invalid search term is entered. May be | |
| // undefined, in which case this defaults to 'No matches found'. | |
| invalidSearchTermMessage: '@', | |
| item: '=', | |
| // The regex used to validate newly-entered choices that do not | |
| // already exist. Use ".^" to reject all new choices. | |
| newChoiceRegex: '@', | |
| onSelectionChange: '&', | |
| placeholder: '@', | |
| // Whether select2 is in tagging mode. | |
| tagMode: '@', | |
| width: '@' | |
| }, | |
| template: '<input type="hidden">', | |
| controller: ['$scope', '$element', function($scope, $element) { | |
| $scope.newChoiceValidator = new RegExp($scope.newChoiceRegex); | |
| var select2Options = { | |
| allowClear: false, | |
| data: $scope.choices, | |
| multiple: $scope.allowMultipleChoices === 'true', | |
| placeholder: $scope.placeholder, | |
| width: $scope.width || '250px', | |
| createSearchChoice: function(term, data) { | |
| if ($(data).filter(function() { | |
| return this.text.localeCompare(term) === 0; | |
| }).length === 0) { | |
| return term.match($scope.newChoiceValidator) ? { | |
| id: term, | |
| text: term | |
| } : null; | |
| } | |
| }, | |
| formatResult: function(queryResult) { | |
| var doesChoiceMatchText = function(choice) { | |
| return choice.id === queryResult.text; | |
| }; | |
| if ($scope.choices && $scope.choices.some(doesChoiceMatchText)) { | |
| return queryResult.text; | |
| } else { | |
| if ($scope.formatNewSelection) { | |
| return $scope.formatNewSelection(queryResult.text); | |
| } else { | |
| return queryResult.text; | |
| } | |
| } | |
| }, | |
| formatNoMatches: function(searchTerm) { | |
| if ($scope.invalidSearchTermMessage && | |
| !searchTerm.match($scope.newChoiceValidator)) { | |
| return $scope.invalidSearchTermMessage; | |
| } else { | |
| return 'No matches found'; | |
| } | |
| } | |
| }; | |
| if ($scope.tagMode) { | |
| select2Options.tags = []; | |
| } | |
| if ($scope.dropdownCssClass) { | |
| select2Options.dropdownCssClass = $scope.dropdownCssClass; | |
| } | |
| var select2Node = $element[0].firstChild; | |
| // Initialize the dropdown. | |
| $(select2Node).select2(select2Options); | |
| $(select2Node).select2('val', $scope.item); | |
| // Update $scope.item when the selection changes. | |
| $(select2Node).on('change', function(e) { | |
| $scope.item = e.val; | |
| $scope.$apply(); | |
| $scope.onSelectionChange(); | |
| $scope.$apply(); | |
| }); | |
| // Respond to external changes in $scope.item | |
| $scope.$watch('item', function(newValue) { | |
| $(select2Node).select2('val', newValue); | |
| }); | |
| }] | |
| }; | |
| }]); | |
| })(); | |
| (function() {// Copyright 2015 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| /** | |
| * @fileoverview Service to construct URLs by inserting variables within them as | |
| * necessary to have a fully-qualified URL. | |
| */ | |
| oppia.factory('UrlInterpolationService', ['alertsService', | |
| function(alertsService) { | |
| // http://stackoverflow.com/questions/203739 | |
| var _isString = function(value) { | |
| return (typeof value === 'string') || (value instanceof String); | |
| }; | |
| var validateResourcePath = function(resourcePath) { | |
| if (!resourcePath) { | |
| alertsService.fatalWarning( | |
| 'Empty path passed in method.'); | |
| } | |
| var RESOURCE_PATH_STARTS_WITH_FORWARD_SLASH = /^\//; | |
| // Ensure that resourcePath starts with a forward slash. | |
| if (!resourcePath.match(RESOURCE_PATH_STARTS_WITH_FORWARD_SLASH)) { | |
| alertsService.fatalWarning( | |
| 'Path must start with \'\/\': \'' + new String(resourcePath) + | |
| '\'.'); | |
| } | |
| }; | |
| var getCachePrefixedUrl = function(resourcePath) { | |
| validateResourcePath(resourcePath); | |
| return GLOBALS.ASSET_DIR_PREFIX + resourcePath; | |
| }; | |
| return { | |
| /** | |
| * Given a formatted URL, interpolates the URL by inserting values the URL | |
| * needs using the interpolationValues object. For example, urlTemplate | |
| * might be: | |
| * | |
| * /createhandler/resolved_answers/<exploration_id>/<escaped_state_name> | |
| * | |
| * interpolationValues is an object whose keys are variables within the URL. | |
| * For the above example, interpolationValues may look something like: | |
| * | |
| * { 'exploration_id': '0', 'escaped_state_name': 'InputBinaryNumber' } | |
| * | |
| * If a URL requires a value which is not keyed within the | |
| * interpolationValues object, this will return null. | |
| */ | |
| interpolateUrl: function(urlTemplate, interpolationValues) { | |
| if (!urlTemplate) { | |
| alertsService.fatalWarning( | |
| 'Invalid or empty URL template passed in: \'' + | |
| new String(urlTemplate) + '\''); | |
| return null; | |
| } | |
| // http://stackoverflow.com/questions/4775722 | |
| if (!(interpolationValues instanceof Object) || ( | |
| Object.prototype.toString.call( | |
| interpolationValues) === '[object Array]')) { | |
| alertsService.fatalWarning( | |
| 'Expected an object of interpolation values to be passed into ' + | |
| 'interpolateUrl.'); | |
| return null; | |
| } | |
| // Valid pattern: <alphanum> | |
| var INTERPOLATION_VARIABLE_REGEX = /<(\w+)>/; | |
| // Invalid patterns: <<stuff>>, <stuff>>>, <> | |
| var EMPTY_VARIABLE_REGEX = /<>/; | |
| var INVALID_VARIABLE_REGEX = /(<{2,})(\w*)(>{2,})/; | |
| // Parameter values can only contain alphanumerical characters, spaces, | |
| // hyphens or underscores. | |
| var VALID_URL_PARAMETER_VALUE_REGEX = /^(\w| |_|-)+$/; | |
| if (urlTemplate.match(INVALID_VARIABLE_REGEX) || | |
| urlTemplate.match(EMPTY_VARIABLE_REGEX)) { | |
| alertsService.fatalWarning( | |
| 'Invalid URL template received: \'' + urlTemplate + '\''); | |
| return null; | |
| } | |
| var escapedInterpolationValues = {}; | |
| for (var varName in interpolationValues) { | |
| var value = interpolationValues[varName]; | |
| if (!_isString(value)) { | |
| alertsService.fatalWarning( | |
| 'Parameters passed into interpolateUrl must be strings.'); | |
| return null; | |
| } | |
| // Ensure the value is valid. | |
| if (!value.match(VALID_URL_PARAMETER_VALUE_REGEX)) { | |
| alertsService.fatalWarning( | |
| 'Parameter values passed into interpolateUrl must only contain ' + | |
| 'alphanumerical characters, hyphens, underscores or spaces: \'' + | |
| value + '\''); | |
| return null; | |
| } | |
| escapedInterpolationValues[varName] = encodeURIComponent(value); | |
| } | |
| // Ensure the URL has no nested brackets (which would lead to indirection | |
| // in the interpolated variables). | |
| var filledUrl = angular.copy(urlTemplate); | |
| var match = filledUrl.match(INTERPOLATION_VARIABLE_REGEX); | |
| while (match) { | |
| var varName = match[1]; | |
| if (!escapedInterpolationValues.hasOwnProperty(varName)) { | |
| alertsService.fatalWarning('Expected variable \'' + varName + | |
| '\' when interpolating URL.'); | |
| return null; | |
| } | |
| filledUrl = filledUrl.replace( | |
| INTERPOLATION_VARIABLE_REGEX, | |
| escapedInterpolationValues[varName]); | |
| match = filledUrl.match(INTERPOLATION_VARIABLE_REGEX); | |
| } | |
| return filledUrl; | |
| }, | |
| /** | |
| * Given an resource path, returns the relative url path to that resource | |
| * prefixing the appropriate cache_slug to it. | |
| */ | |
| getStaticResourceUrl: function(resourcePath) { | |
| return getCachePrefixedUrl(resourcePath); | |
| }, | |
| /** | |
| * Given an image path, returns the complete url path to that image | |
| * prefixing the appropriate cache_slug to it. | |
| */ | |
| getStaticImageUrl: function(imagePath) { | |
| validateResourcePath(imagePath); | |
| return getCachePrefixedUrl('/assets/images' + imagePath); | |
| }, | |
| /** | |
| * Given a gadget type, returns the complete url path to that | |
| * gadget type image, prefixing the appropriate cache_slug to it. | |
| */ | |
| getGadgetImgUrl: function(gadgetType) { | |
| if (!gadgetType) { | |
| alertsService.fatalWarning( | |
| 'Empty gadgetType passed in getGadgetImgUrl.'); | |
| } | |
| return getCachePrefixedUrl('/extensions/gadgets/' + gadgetType + | |
| '/static/images/' + gadgetType + '.png'); | |
| }, | |
| /** | |
| * Given an interaction id, returns the complete url path to the thumbnail | |
| * image for the interaction, prefixing the appropriate cache_slug to it. | |
| */ | |
| getInteractionThumbnailImageUrl: function(interactionId) { | |
| if (!interactionId) { | |
| alertsService.fatalWarning( | |
| 'Empty interactionId passed in getInteractionThumbnailImageUrl.'); | |
| } | |
| return getCachePrefixedUrl('/extensions/interactions/' + | |
| interactionId + '/static/' + interactionId + '.png'); | |
| } | |
| }; | |
| }]); | |
| })(); | |
| (function() {// Copyright 2014 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| oppia.factory('expressionSyntaxTreeService', [ | |
| '$log', 'expressionParserService', 'PARAMETER_TYPES', | |
| function($log, expressionParserService, PARAMETER_TYPES) { | |
| // Exceptions that can be thrown from the evaluation of expressions. | |
| var ExpressionError = function() { | |
| }; | |
| ExpressionError.prototype = new Error(); | |
| ExpressionError.prototype.constructor = ExpressionError; | |
| var ExprUndefinedVarError = function(varname, envs) { | |
| this.varname = varname; | |
| this.envs = envs; | |
| }; | |
| ExprUndefinedVarError.prototype = new ExpressionError(); | |
| ExprUndefinedVarError.prototype.constructor = ExprUndefinedVarError; | |
| ExprUndefinedVarError.prototype.name = 'ExprUndefinedVarError'; | |
| ExprUndefinedVarError.prototype.toString = function() { | |
| return this.name + ': ' + this.varname + ' not found in ' + this.envs; | |
| }; | |
| var ExprWrongNumArgsError = function(args, expectedMin, expectedMax) { | |
| this.args = args; | |
| this.expectedMin = expectedMin; | |
| this.expectedMax = expectedMax; | |
| }; | |
| ExprWrongNumArgsError.prototype = new ExpressionError(); | |
| ExprWrongNumArgsError.prototype.constructor = ExprWrongNumArgsError; | |
| ExprWrongNumArgsError.prototype.name = 'ExprWrongNumArgsError'; | |
| ExprWrongNumArgsError.prototype.toString = function() { | |
| return this.name + ': {' + this.args + '} not in range [' + | |
| this.expectedMin + ',' + this.expectedMax + ']'; | |
| }; | |
| var ExprWrongArgTypeError = function(arg, actualType, expectedType) { | |
| this.arg = arg; | |
| this.actualType = actualType; | |
| this.expectedType = expectedType; | |
| }; | |
| ExprWrongArgTypeError.prototype = new ExpressionError(); | |
| ExprWrongArgTypeError.prototype.constructor = ExprWrongArgTypeError; | |
| ExprWrongArgTypeError.prototype.name = 'ExprWrongArgTypeError'; | |
| ExprWrongArgTypeError.prototype.toString = function() { | |
| if (this.arg === null) { | |
| return this.name + ': Type ' + this.actualType + | |
| ' does not match expected type ' + this.expectedType; | |
| } | |
| return this.name + ': ' + this.arg + ' has type ' + this.actualType + | |
| ' which does not match expected type ' + this.expectedType; | |
| }; | |
| var getParamsUsedInExpression = function(expression) { | |
| var _findParams = function(parseTree) { | |
| var paramsFound = []; | |
| if (parseTree instanceof Array) { | |
| if (parseTree[0] === '#') { | |
| paramsFound.push(parseTree[1]); | |
| } else { | |
| for (var i = 1; i < parseTree.length; i++) { | |
| paramsFound = paramsFound.concat(_findParams(parseTree[i])); | |
| } | |
| } | |
| } | |
| var uniqueParams = []; | |
| for (var i = 0; i < paramsFound.length; i++) { | |
| if (uniqueParams.indexOf(paramsFound[i]) === -1) { | |
| uniqueParams.push(paramsFound[i]); | |
| } | |
| } | |
| return uniqueParams.sort(); | |
| }; | |
| var parsed = expressionParserService.parse(expression); | |
| return _findParams(parsed); | |
| }; | |
| // Checks if the args array has the expectedNum number of elements and | |
| // throws an error if not. If optional expectedMax is specified, it | |
| // verifies the number of args is in [expectedNum, expectedMax] range | |
| // inclusive. | |
| var verifyNumArgs = function(args, expectedNum, expectedMax) { | |
| if (expectedMax === undefined) { | |
| expectedMax = expectedNum; | |
| } | |
| if (args.length >= expectedNum && args.length <= expectedMax) { | |
| return; | |
| } | |
| throw new ExprWrongNumArgsError(args, expectedNum, expectedMax); | |
| }; | |
| var _verifyArgTypesMatchExpectedType = function(argTypes, expectedType) { | |
| for (var i = 0; i < argTypes.length; i++) { | |
| if (argTypes[i] !== expectedType) { | |
| throw new ExprWrongArgTypeError(null, argTypes[i], expectedType); | |
| } | |
| } | |
| return true; | |
| }; | |
| var _verifyArgTypesMatch = function(argType1, argType2) { | |
| if (argType1 !== argType2) { | |
| throw new ExprWrongArgTypeError(null, argType1, argType2); | |
| } | |
| return true; | |
| }; | |
| var applyFunctionToParseTree = function(parsed, envs, func) { | |
| return func(parsed, envs.concat(system)); | |
| }; | |
| /** | |
| * Looks up a variable of the given name in the env. Here the variable | |
| * can be system or user defined functions and parameters, as well as | |
| * system operators. | |
| * @param {string} name The name to look up. | |
| * @param {!Array.<!Object>} envs Represents a nested name space | |
| * environment to look up the name in. The first element is looked up | |
| * first (i.e. has higher precedence). | |
| * @throws {ExprUndefinedVarError} The named variable was not found in | |
| * the given environment. | |
| */ | |
| var lookupEnvs = function(name, envs) { | |
| // Parameter value look up. | |
| var value; | |
| if (envs.some(function(env) { | |
| if (env.hasOwnProperty(name)) { | |
| value = env[name]; | |
| return true; | |
| } | |
| return false; | |
| })) { | |
| return value; | |
| } | |
| throw new ExprUndefinedVarError(name, envs); | |
| }; | |
| // Coerces the argument to a Number, and throws an error if the result | |
| // is NaN. | |
| var _coerceToNumber = function(originalValue) { | |
| var coercedValue = (+originalValue); | |
| if (!isNaN(coercedValue)) { | |
| return coercedValue; | |
| } | |
| throw new ExprWrongArgTypeError( | |
| originalValue, typeof originalValue, 'Number'); | |
| }; | |
| // Coerces all values in the given argument array to Number, and throws | |
| // an error if the result is NaN. | |
| var _coerceAllArgsToNumber = function(args) { | |
| for (var i = 0; i < args.length; i++) { | |
| args[i] = _coerceToNumber(args[i]); | |
| } | |
| return args; | |
| }; | |
| // NOTE TO DEVELOPERS: When adding a new reserved word to this object, | |
| // please first ensure that existing explorations do not use this | |
| // parameter name. Also, to prevent future explorations using it, | |
| // modify feconf.INVALID_PARAMETER_NAMES accordingly. | |
| // TODO(kashida): Document all operators input and output contracts. | |
| // Arguments: | |
| // args: for eval(): list of values of the evaluated sub-expression | |
| // for getType(): list of types of the evaluated sub-expression | |
| var system = { | |
| '+': { | |
| eval: function(args) { | |
| verifyNumArgs(args, 1, 2); | |
| var numericArgs = _coerceAllArgsToNumber(args); | |
| return numericArgs.length === 1 ? numericArgs[0] : | |
| numericArgs[0] + numericArgs[1]; | |
| }, | |
| getType: function(args) { | |
| verifyNumArgs(args, 1, 2); | |
| _verifyArgTypesMatchExpectedType(args, PARAMETER_TYPES.REAL); | |
| return PARAMETER_TYPES.REAL; | |
| } | |
| }, | |
| '-': { | |
| eval: function(args) { | |
| verifyNumArgs(args, 1, 2); | |
| var numericArgs = _coerceAllArgsToNumber(args); | |
| return numericArgs.length === 1 ? -numericArgs[0] : | |
| numericArgs[0] - numericArgs[1]; | |
| }, | |
| getType: function(args) { | |
| verifyNumArgs(args, 1, 2); | |
| _verifyArgTypesMatchExpectedType(args, PARAMETER_TYPES.REAL); | |
| return PARAMETER_TYPES.REAL; | |
| } | |
| }, | |
| '*': { | |
| eval: function(args) { | |
| verifyNumArgs(args, 2); | |
| var numericArgs = _coerceAllArgsToNumber(args); | |
| return numericArgs[0] * numericArgs[1]; | |
| }, | |
| getType: function(args) { | |
| verifyNumArgs(args, 2); | |
| _verifyArgTypesMatchExpectedType(args, PARAMETER_TYPES.REAL); | |
| return PARAMETER_TYPES.REAL; | |
| } | |
| }, | |
| '/': { | |
| eval: function(args) { | |
| verifyNumArgs(args, 2); | |
| var numericArgs = _coerceAllArgsToNumber(args); | |
| return numericArgs[0] / numericArgs[1]; | |
| }, | |
| getType: function(args) { | |
| verifyNumArgs(args, 2); | |
| _verifyArgTypesMatchExpectedType(args, PARAMETER_TYPES.REAL); | |
| return PARAMETER_TYPES.REAL; | |
| } | |
| }, | |
| '%': { | |
| eval: function(args) { | |
| verifyNumArgs(args, 2); | |
| var numericArgs = _coerceAllArgsToNumber(args); | |
| return numericArgs[0] % numericArgs[1]; | |
| }, | |
| getType: function(args) { | |
| verifyNumArgs(args, 2); | |
| _verifyArgTypesMatchExpectedType(args, PARAMETER_TYPES.REAL); | |
| return PARAMETER_TYPES.REAL; | |
| } | |
| }, | |
| '<=': { | |
| eval: function(args) { | |
| verifyNumArgs(args, 2); | |
| var numericArgs = _coerceAllArgsToNumber(args); | |
| return numericArgs[0] <= numericArgs[1]; | |
| }, | |
| getType: function(args) { | |
| verifyNumArgs(args, 2); | |
| _verifyArgTypesMatchExpectedType(args, PARAMETER_TYPES.REAL); | |
| return PARAMETER_TYPES.UNICODE_STRING; | |
| } | |
| }, | |
| '>=': { | |
| eval: function(args) { | |
| verifyNumArgs(args, 2); | |
| var numericArgs = _coerceAllArgsToNumber(args); | |
| return numericArgs[0] >= numericArgs[1]; | |
| }, | |
| getType: function(args) { | |
| verifyNumArgs(args, 2); | |
| _verifyArgTypesMatchExpectedType(args, PARAMETER_TYPES.REAL); | |
| return PARAMETER_TYPES.UNICODE_STRING; | |
| } | |
| }, | |
| '<': { | |
| eval: function(args) { | |
| verifyNumArgs(args, 2); | |
| var numericArgs = _coerceAllArgsToNumber(args); | |
| return numericArgs[0] < numericArgs[1]; | |
| }, | |
| getType: function(args) { | |
| verifyNumArgs(args, 2); | |
| _verifyArgTypesMatchExpectedType(args, PARAMETER_TYPES.REAL); | |
| return PARAMETER_TYPES.UNICODE_STRING; | |
| } | |
| }, | |
| '>': { | |
| eval: function(args) { | |
| verifyNumArgs(args, 2); | |
| var numericArgs = _coerceAllArgsToNumber(args); | |
| return numericArgs[0] > numericArgs[1]; | |
| }, | |
| getType: function(args) { | |
| verifyNumArgs(args, 2); | |
| _verifyArgTypesMatchExpectedType(args, PARAMETER_TYPES.REAL); | |
| return PARAMETER_TYPES.UNICODE_STRING; | |
| } | |
| }, | |
| '!': { | |
| eval: function(args) { | |
| verifyNumArgs(args, 1); | |
| return !args[0]; | |
| }, | |
| getType: function(args) { | |
| verifyNumArgs(args, 1); | |
| _verifyArgTypesMatchExpectedType( | |
| args, PARAMETER_TYPES.UNICODE_STRING); | |
| return PARAMETER_TYPES.UNICODE_STRING; | |
| } | |
| }, | |
| '==': { | |
| eval: function(args) { | |
| verifyNumArgs(args, 2); | |
| return args[0] === args[1]; | |
| }, | |
| getType: function(args) { | |
| verifyNumArgs(args, 2); | |
| return PARAMETER_TYPES.UNICODE_STRING; | |
| } | |
| }, | |
| '!=': { | |
| eval: function(args) { | |
| verifyNumArgs(args, 2); | |
| return args[0] !== args[1]; | |
| }, | |
| getType: function(args) { | |
| verifyNumArgs(args, 2); | |
| return PARAMETER_TYPES.UNICODE_STRING; | |
| } | |
| }, | |
| '&&': { | |
| eval: function(args) { | |
| // TODO(kashida): Make this short-circuit. | |
| verifyNumArgs(args, 2); | |
| return Boolean(args[0] && args[1]); | |
| }, | |
| getType: function(args) { | |
| verifyNumArgs(args, 2); | |
| _verifyArgTypesMatchExpectedType( | |
| args, PARAMETER_TYPES.UNICODE_STRING); | |
| return PARAMETER_TYPES.UNICODE_STRING; | |
| } | |
| }, | |
| '||': { | |
| eval: function(args) { | |
| // TODO(kashida): Make this short-circuit. | |
| verifyNumArgs(args, 2); | |
| return Boolean(args[0] || args[1]); | |
| }, | |
| getType: function(args) { | |
| verifyNumArgs(args, 2); | |
| _verifyArgTypesMatchExpectedType( | |
| args, PARAMETER_TYPES.UNICODE_STRING); | |
| return PARAMETER_TYPES.UNICODE_STRING; | |
| } | |
| }, | |
| // Note that removing quotation marks from this key causes issues with | |
| // minification (when running the deployment scripts). | |
| // jscs:disable disallowQuotedKeysInObjects | |
| 'if': { | |
| eval: function(args) { | |
| // TODO(kashida): Make this short-circuit. | |
| verifyNumArgs(args, 3); | |
| return args[0] ? args[1] : args[2]; | |
| }, | |
| getType: function(args) { | |
| verifyNumArgs(args, 3); | |
| _verifyArgTypesMatchExpectedType( | |
| [args[0]], PARAMETER_TYPES.UNICODE_STRING); | |
| _verifyArgTypesMatch(args[1], args[2]); | |
| return args[1]; | |
| } | |
| }, | |
| 'floor': { | |
| eval: function(args) { | |
| verifyNumArgs(args, 1); | |
| var numericArgs = _coerceAllArgsToNumber(args); | |
| return Math.floor(numericArgs[0]); | |
| }, | |
| getType: function(args) { | |
| verifyNumArgs(args, 1); | |
| _verifyArgTypesMatchExpectedType(args, PARAMETER_TYPES.REAL); | |
| return PARAMETER_TYPES.REAL; | |
| } | |
| }, | |
| 'pow': { | |
| eval: function(args) { | |
| verifyNumArgs(args, 2); | |
| var numericArgs = _coerceAllArgsToNumber(args); | |
| return Math.pow(args[0], args[1]); | |
| }, | |
| getType: function(args) { | |
| verifyNumArgs(args, 2); | |
| _verifyArgTypesMatchExpectedType(args, PARAMETER_TYPES.REAL); | |
| return PARAMETER_TYPES.REAL; | |
| } | |
| }, | |
| 'log': { | |
| eval: function(args) { | |
| verifyNumArgs(args, 2); | |
| var numericArgs = _coerceAllArgsToNumber(args); | |
| return Math.log(numericArgs[0]) / Math.log(numericArgs[1]); | |
| }, | |
| getType: function(args) { | |
| verifyNumArgs(args, 2); | |
| _verifyArgTypesMatchExpectedType(args, PARAMETER_TYPES.REAL); | |
| return PARAMETER_TYPES.REAL; | |
| } | |
| }, | |
| 'abs': { | |
| eval: function(args) { | |
| verifyNumArgs(args, 1); | |
| var numericArgs = _coerceAllArgsToNumber(args); | |
| return Math.abs(numericArgs[0]); | |
| }, | |
| getType: function(args) { | |
| verifyNumArgs(args, 1); | |
| _verifyArgTypesMatchExpectedType(args, PARAMETER_TYPES.REAL); | |
| return PARAMETER_TYPES.REAL; | |
| } | |
| } | |
| // jscs:enable disallowQuotedKeysInObjects | |
| }; | |
| return { | |
| ExpressionError: ExpressionError, | |
| ExprUndefinedVarError: ExprUndefinedVarError, | |
| ExprWrongNumArgsError: ExprWrongNumArgsError, | |
| ExprWrongArgTypeError: ExprWrongArgTypeError, | |
| applyFunctionToParseTree: applyFunctionToParseTree, | |
| getParamsUsedInExpression: getParamsUsedInExpression, | |
| lookupEnvs: lookupEnvs | |
| }; | |
| } | |
| ]); | |
| })(); | |
| (function() {// Copyright 2014 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| // This file defines the evaluation engine as well as the system operators. | |
| // The evaluator takes the output of the parser (i.e. parse tree) as defined in | |
| // parser.pegjs and produces a javaScript primitive value when the evaluation is | |
| // performed correctly. | |
| // Two cases that can throw an exception (i.e. an Error object): | |
| // - Variable look-up ('#' operator) failure. (ExprUndefinedVarError) | |
| // - Wrong number of arguments in the node for the given operator. | |
| // (ExprWrongNumArgsError) | |
| // Both errors are children of ExpressionError, so caller can use | |
| // ExpressionError to catch only these expected error cases. | |
| // | |
| // An expression is evaluated in a context consisting of predefined system | |
| // variables, system operators, and system functions. In the input language, | |
| // operators are predefined set of characters in infix, postfix, or ternary | |
| // format (there is currently no postfix operators) while functions have the | |
| // form of function calls (e.g. "abs(10)"). In the parse tree, there is no | |
| // difference between operators and functions. User defined parameters may | |
| // override the meaning of system variables and functions (but not operators). | |
| // Users also can define parameters with new names. Referencing a variable which | |
| // is not defined as a system variable, system function, or user parameter will | |
| // result in ExprUndefinedVarError to be thrown. | |
| // | |
| // All system variables, system operators, and system functions are defined | |
| // as 'system' variable in this file. | |
| // | |
| // TODO(kashida): Split the following section into two: | |
| // - A general overview of operators (including some concrete examples) | |
| // - A numbered sequence of steps which a new contributor should follow in | |
| // order to define a new operator. | |
| // Defining new operators and functions: | |
| // Operators and functions are given an array of arguments which are already all | |
| // evaluated. E.g. for an expression "1 + 2 * 3", the "+" plus operator receives | |
| // values 1 and 6 (i.e. "2 * 3" already evaluated). | |
| // The operators and functions should verify that the argument array | |
| // has the required number of arguments. Operators and functions can coerse the | |
| // input arguments to the desired typed values, or throw an exception if wrong | |
| // type of argument is given. | |
| // type of inputs. This does not prevent operators to eror on wrong parameter | |
| // values (e.g. getting negative number for an index). | |
| // When successful, operators and functions may return any valid JavaScript | |
| // values. In general, an operator always returns the same type of value, but | |
| // there are exceptions (e.g. "+" operator may return a number or a string | |
| // depending on the types of the input arguments). | |
| // Constraints on the input arguments (number, types, and any other | |
| // constraints) as well as the output value and type should be documented. | |
| // Service for expression evaluation. | |
| oppia.factory('expressionEvaluatorService', [ | |
| '$log', 'expressionParserService', 'expressionSyntaxTreeService', | |
| function($log, expressionParserService, expressionSyntaxTreeService) { | |
| var evaluateExpression = function(expression, envs) { | |
| return expressionSyntaxTreeService.applyFunctionToParseTree( | |
| expressionParserService.parse(expression), envs, evaluate); | |
| }; | |
| /** | |
| * @param {*} parsed Parse output from the parser. See parser.pegjs for | |
| * the data structure. | |
| * @param {!Array.<!Object>} envs Represents a nested name space | |
| * environment to look up the name in. The first element is looked up | |
| * first (i.e. has higher precedence). | |
| */ | |
| var evaluate = function(parsed, envs) { | |
| // The intermediate nodes of the parse tree are arrays. The terminal | |
| // nodes are JavaScript primitives (as described in the "Parser output" | |
| // section of parser.pegjs). | |
| if (parsed instanceof Array) { | |
| if (parsed.length === 0) { | |
| throw 'Parser generated an intermediate node with zero children'; | |
| } | |
| if (parsed[0] === '#') { | |
| return expressionSyntaxTreeService.lookupEnvs(parsed[1], envs); | |
| } | |
| // Evaluate rest of the elements, i.e. the arguments. | |
| var args = parsed.slice(1).map(function(item) { | |
| return evaluate(item, envs); | |
| }); | |
| // The first element should be a function name. | |
| return expressionSyntaxTreeService.lookupEnvs( | |
| parsed[0], envs).eval(args); | |
| } | |
| // This should be a terminal node with the actual value. | |
| return parsed; | |
| }; | |
| var validateExpression = function(expression, envs) { | |
| try { | |
| return validate(expressionParserService.parse(expression), | |
| envs.concat(system)); | |
| } catch (err) { | |
| return false; | |
| } | |
| }; | |
| /** | |
| * @param {*} parsed Parse output from the parser. See parser.pegjs for | |
| * the data structure. | |
| * @param {!Array.<!Object>} envs Represents a nested name space | |
| * environment to look up the name in. The first element is looked | |
| * up first (i.e. has higher precedence). | |
| * @return {boolean} True when validation succeeds. | |
| */ | |
| var validate = function(parsed, envs) { | |
| if (!(parsed instanceof Array)) { | |
| return true; | |
| } | |
| if (parsed.length === 0) { | |
| // This should not happen. | |
| return false; | |
| } | |
| // Make sure we can find the operator. | |
| expressionSyntaxTreeService.lookupEnvs(parsed[0], envs); | |
| // Evaluate rest of the elements, i.e. the arguments. | |
| var args = parsed.slice(1).map(function(item) { | |
| return validate(item, envs); | |
| }); | |
| // If it is a name look up, make sure the name exists. | |
| // TODO: Validate args for other operators. | |
| if (parsed[0] === '#') { | |
| expressionSyntaxTreeService.lookupEnvs(parsed[1], envs); | |
| } | |
| return true; | |
| }; | |
| return { | |
| evaluate: evaluate, | |
| evaluateExpression: evaluateExpression, | |
| validate: validate, | |
| validateExpression: validateExpression | |
| }; | |
| } | |
| ]); | |
| })(); | |
| (function() {oppia.factory('expressionParserService', ['$log', function($log) { | |
| /* | |
| * Generated by PEG.js 0.8.0. | |
| * | |
| * http://pegjs.majda.cz/ | |
| */ | |
| function peg$subclass(child, parent) { | |
| function ctor() { this.constructor = child; } | |
| ctor.prototype = parent.prototype; | |
| child.prototype = new ctor(); | |
| } | |
| function SyntaxError(message, expected, found, offset, line, column) { | |
| this.message = message; | |
| this.expected = expected; | |
| this.found = found; | |
| this.offset = offset; | |
| this.line = line; | |
| this.column = column; | |
| this.name = "SyntaxError"; | |
| } | |
| peg$subclass(SyntaxError, Error); | |
| function parse(input) { | |
| var options = arguments.length > 1 ? arguments[1] : {}, | |
| peg$FAILED = {}, | |
| peg$startRuleFunctions = { start: peg$parsestart }, | |
| peg$startRuleFunction = peg$parsestart, | |
| peg$c0 = peg$FAILED, | |
| peg$c1 = function(expression) { return expression; }, | |
| peg$c2 = { type: "any", description: "any character" }, | |
| peg$c3 = { type: "other", description: "whitespace" }, | |
| peg$c4 = /^[\t\x0B\f \xA0\uFEFF]/, | |
| peg$c5 = { type: "class", value: "[\\t\\x0B\\f \\xA0\\uFEFF]", description: "[\\t\\x0B\\f \\xA0\\uFEFF]" }, | |
| peg$c6 = { type: "other", description: "identifier" }, | |
| peg$c7 = void 0, | |
| peg$c8 = function(name) { return name; }, | |
| peg$c9 = [], | |
| peg$c10 = function(start, parts) { | |
| return start + parts.join(""); | |
| }, | |
| peg$c11 = "$", | |
| peg$c12 = { type: "literal", value: "$", description: "\"$\"" }, | |
| peg$c13 = "_", | |
| peg$c14 = { type: "literal", value: "_", description: "\"_\"" }, | |
| peg$c15 = "\\", | |
| peg$c16 = { type: "literal", value: "\\", description: "\"\\\\\"" }, | |
| peg$c17 = function(sequence) { return sequence; }, | |
| peg$c18 = "\u200C", | |
| peg$c19 = { type: "literal", value: "\u200C", description: "\"\\u200C\"" }, | |
| peg$c20 = function() { return "\u200C"; }, | |
| peg$c21 = "\u200D", | |
| peg$c22 = { type: "literal", value: "\u200D", description: "\"\\u200D\"" }, | |
| peg$c23 = function() { return "\u200D"; }, | |
| peg$c24 = "null", | |
| peg$c25 = { type: "literal", value: "null", description: "\"null\"" }, | |
| peg$c26 = function() { return null; }, | |
| peg$c27 = "false", | |
| peg$c28 = { type: "literal", value: "false", description: "\"false\"" }, | |
| peg$c29 = function() { return false; }, | |
| peg$c30 = "true", | |
| peg$c31 = { type: "literal", value: "true", description: "\"true\"" }, | |
| peg$c32 = function() { return true; }, | |
| peg$c33 = { type: "other", description: "number" }, | |
| peg$c34 = function(literal) { | |
| return literal; | |
| }, | |
| peg$c35 = ".", | |
| peg$c36 = { type: "literal", value: ".", description: "\".\"" }, | |
| peg$c37 = null, | |
| peg$c38 = function(parts) { | |
| return parseFloat(parts); | |
| }, | |
| peg$c39 = function(parts) { return parseFloat(parts); }, | |
| peg$c40 = "0", | |
| peg$c41 = { type: "literal", value: "0", description: "\"0\"" }, | |
| peg$c42 = /^[0-9]/, | |
| peg$c43 = { type: "class", value: "[0-9]", description: "[0-9]" }, | |
| peg$c44 = /^[1-9]/, | |
| peg$c45 = { type: "class", value: "[1-9]", description: "[1-9]" }, | |
| peg$c46 = /^[eE]/, | |
| peg$c47 = { type: "class", value: "[eE]", description: "[eE]" }, | |
| peg$c48 = /^[\-+]/, | |
| peg$c49 = { type: "class", value: "[\\-+]", description: "[\\-+]" }, | |
| peg$c50 = /^[xX]/, | |
| peg$c51 = { type: "class", value: "[xX]", description: "[xX]" }, | |
| peg$c52 = function(digits) { return parseInt(digits, 16); }, | |
| peg$c53 = /^[0-9a-fA-F]/, | |
| peg$c54 = { type: "class", value: "[0-9a-fA-F]", description: "[0-9a-fA-F]" }, | |
| peg$c55 = { type: "other", description: "string" }, | |
| peg$c56 = "\"", | |
| peg$c57 = { type: "literal", value: "\"", description: "\"\\\"\"" }, | |
| peg$c58 = "'", | |
| peg$c59 = { type: "literal", value: "'", description: "\"'\"" }, | |
| peg$c60 = function(parts) { | |
| return parts[1]; | |
| }, | |
| peg$c61 = function(chars) { return chars.join(""); }, | |
| peg$c62 = function(char_) { return char_; }, | |
| peg$c63 = function(sequence) { return sequence; }, | |
| peg$c64 = function() { return "\0"; }, | |
| peg$c65 = /^['"\\bfnrtv]/, | |
| peg$c66 = { type: "class", value: "['\"\\\\bfnrtv]", description: "['\"\\\\bfnrtv]" }, | |
| peg$c67 = function(char_) { | |
| return char_ | |
| .replace("b", "\b") | |
| .replace("f", "\f") | |
| .replace("n", "\n") | |
| .replace("r", "\r") | |
| .replace("t", "\t") | |
| .replace("v", "\x0B") // IE does not recognize "\v". | |
| }, | |
| peg$c68 = function(char_) { return char_; }, | |
| peg$c69 = "x", | |
| peg$c70 = { type: "literal", value: "x", description: "\"x\"" }, | |
| peg$c71 = "u", | |
| peg$c72 = { type: "literal", value: "u", description: "\"u\"" }, | |
| peg$c73 = function(digits) { | |
| return String.fromCharCode(parseInt(digits, 16)); | |
| }, | |
| peg$c74 = /^[abcdefghijklmnopqrstuvwxyz\xAA\xB5\xBA\xDF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF\u0101\u0103\u0105\u0107\u0109\u010B\u010D\u010F\u0111\u0113\u0115\u0117\u0119\u011B\u011D\u011F\u0121\u0123\u0125\u0127\u0129\u012B\u012D\u012F\u0131\u0133\u0135\u0137\u0138\u013A\u013C\u013E\u0140\u0142\u0144\u0146\u0148\u0149\u014B\u014D\u014F\u0151\u0153\u0155\u0157\u0159\u015B\u015D\u015F\u0161\u0163\u0165\u0167\u0169\u016B\u016D\u016F\u0171\u0173\u0175\u0177\u017A\u017C\u017E\u017F\u0180\u0183\u0185\u0188\u018C\u018D\u0192\u0195\u0199\u019A\u019B\u019E\u01A1\u01A3\u01A5\u01A8\u01AA\u01AB\u01AD\u01B0\u01B4\u01B6\u01B9\u01BA\u01BD\u01BE\u01BF\u01C6\u01C9\u01CC\u01CE\u01D0\u01D2\u01D4\u01D6\u01D8\u01DA\u01DC\u01DD\u01DF\u01E1\u01E3\u01E5\u01E7\u01E9\u01EB\u01ED\u01EF\u01F0\u01F3\u01F5\u01F9\u01FB\u01FD\u01FF\u0201\u0203\u0205\u0207\u0209\u020B\u020D\u020F\u0211\u0213\u0215\u0217\u0219\u021B\u021D\u021F\u0221\u0223\u0225\u0227\u0229\u022B\u022D\u022F\u0231\u0233\u0234\u0235\u0236\u0237\u0238\u0239\u023C\u023F\u0240\u0242\u0247\u0249\u024B\u024D\u024F\u0250\u0251\u0252\u0253\u0254\u0255\u0256\u0257\u0258\u0259\u025A\u025B\u025C\u025D\u025E\u025F\u0260\u0261\u0262\u0263\u0264\u0265\u0266\u0267\u0268\u0269\u026A\u026B\u026C\u026D\u026E\u026F\u0270\u0271\u0272\u0273\u0274\u0275\u0276\u0277\u0278\u0279\u027A\u027B\u027C\u027D\u027E\u027F\u0280\u0281\u0282\u0283\u0284\u0285\u0286\u0287\u0288\u0289\u028A\u028B\u028C\u028D\u028E\u028F\u0290\u0291\u0292\u0293\u0295\u0296\u0297\u0298\u0299\u029A\u029B\u029C\u029D\u029E\u029F\u02A0\u02A1\u02A2\u02A3\u02A4\u02A5\u02A6\u02A7\u02A8\u02A9\u02AA\u02AB\u02AC\u02AD\u02AE\u02AF\u0371\u0373\u0377\u037B\u037C\u037D\u0390\u03AC\u03AD\u03AE\u03AF\u03B0\u03B1\u03B2\u03B3\u03B4\u03B5\u03B6\u03B7\u03B8\u03B9\u03BA\u03BB\u03BC\u03BD\u03BE\u03BF\u03C0\u03C1\u03C2\u03C3\u03C4\u03C5\u03C6\u03C7\u03C8\u03C9\u03CA\u03CB\u03CC\u03CD\u03CE\u03D0\u03D1\u03D5\u03D6\u03D7\u03D9\u03DB\u03DD\u03DF\u03E1\u03E3\u03E5\u03E7\u03E9\u03EB\u03ED\u03EF\u03F0\u03F1\u03F2\u03F3\u03F5\u03F8\u03FB\u03FC\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043A\u043B\u043C\u043D\u043E\u043F\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044A\u044B\u044C\u044D\u044E\u044F\u0450\u0451\u0452\u0453\u0454\u0455\u0456\u0457\u0458\u0459\u045A\u045B\u045C\u045D\u045E\u045F\u0461\u0463\u0465\u0467\u0469\u046B\u046D\u046F\u0471\u0473\u0475\u0477\u0479\u047B\u047D\u047F\u0481\u048B\u048D\u048F\u0491\u0493\u0495\u0497\u0499\u049B\u049D\u049F\u04A1\u04A3\u04A5\u04A7\u04A9\u04AB\u04AD\u04AF\u04B1\u04B3\u04B5\u04B7\u04B9\u04BB\u04BD\u04BF\u04C2\u04C4\u04C6\u04C8\u04CA\u04CC\u04CE\u04CF\u04D1\u04D3\u04D5\u04D7\u04D9\u04DB\u04DD\u04DF\u04E1\u04E3\u04E5\u04E7\u04E9\u04EB\u04ED\u04EF\u04F1\u04F3\u04F5\u04F7\u04F9\u04FB\u04FD\u04FF\u0501\u0503\u0505\u0507\u0509\u050B\u050D\u050F\u0511\u0513\u0515\u0517\u0519\u051B\u051D\u051F\u0521\u0523\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056A\u056B\u056C\u056D\u056E\u056F\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057A\u057B\u057C\u057D\u057E\u057F\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u1D00\u1D01\u1D02\u1D03\u1D04\u1D05\u1D06\u1D07\u1D08\u1D09\u1D0A\u1D0B\u1D0C\u1D0D\u1D0E\u1D0F\u1D10\u1D11\u1D12\u1D13\u1D14\u1D15\u1D16\u1D17\u1D18\u1D19\u1D1A\u1D1B\u1D1C\u1D1D\u1D1E\u1D1F\u1D20\u1D21\u1D22\u1D23\u1D24\u1D25\u1D26\u1D27\u1D28\u1D29\u1D2A\u1D2B\u1D62\u1D63\u1D64\u1D65\u1D66\u1D67\u1D68\u1D69\u1D6A\u1D6B\u1D6C\u1D6D\u1D6E\u1D6F\u1D70\u1D71\u1D72\u1D73\u1D74\u1D75\u1D76\u1D77\u1D79\u1D7A\u1D7B\u1D7C\u1D7D\u1D7E\u1D7F\u1D80\u1D81\u1D82\u1D83\u1D84\u1D85\u1D86\u1D87\u1D88\u1D89\u1D8A\u1D8B\u1D8C\u1D8D\u1D8E\u1D8F\u1D90\u1D91\u1D92\u1D93\u1D94\u1D95\u1D96\u1D97\u1D98\u1D99\u1D9A\u1E01\u1E03\u1E05\u1E07\u1E09\u1E0B\u1E0D\u1E0F\u1E11\u1E13\u1E15\u1E17\u1E19\u1E1B\u1E1D\u1E1F\u1E21\u1E23\u1E25\u1E27\u1E29\u1E2B\u1E2D\u1E2F\u1E31\u1E33\u1E35\u1E37\u1E39\u1E3B\u1E3D\u1E3F\u1E41\u1E43\u1E45\u1E47\u1E49\u1E4B\u1E4D\u1E4F\u1E51\u1E53\u1E55\u1E57\u1E59\u1E5B\u1E5D\u1E5F\u1E61\u1E63\u1E65\u1E67\u1E69\u1E6B\u1E6D\u1E6F\u1E71\u1E73\u1E75\u1E77\u1E79\u1E7B\u1E7D\u1E7F\u1E81\u1E83\u1E85\u1E87\u1E89\u1E8B\u1E8D\u1E8F\u1E91\u1E93\u1E95\u1E96\u1E97\u1E98\u1E99\u1E9A\u1E9B\u1E9C\u1E9D\u1E9F\u1EA1\u1EA3\u1EA5\u1EA7\u1EA9\u1EAB\u1EAD\u1EAF\u1EB1\u1EB3\u1EB5\u1EB7\u1EB9\u1EBB\u1EBD\u1EBF\u1EC1\u1EC3\u1EC5\u1EC7\u1EC9\u1ECB\u1ECD\u1ECF\u1ED1\u1ED3\u1ED5\u1ED7\u1ED9\u1EDB\u1EDD\u1EDF\u1EE1\u1EE3\u1EE5\u1EE7\u1EE9\u1EEB\u1EED\u1EEF\u1EF1\u1EF3\u1EF5\u1EF7\u1EF9\u1EFB\u1EFD\u1EFF\u1F00\u1F01\u1F02\u1F03\u1F04\u1F05\u1F06\u1F07\u1F10\u1F11\u1F12\u1F13\u1F14\u1F15\u1F20\u1F21\u1F22\u1F23\u1F24\u1F25\u1F26\u1F27\u1F30\u1F31\u1F32\u1F33\u1F34\u1F35\u1F36\u1F37\u1F40\u1F41\u1F42\u1F43\u1F44\u1F45\u1F50\u1F51\u1F52\u1F53\u1F54\u1F55\u1F56\u1F57\u1F60\u1F61\u1F62\u1F63\u1F64\u1F65\u1F66\u1F67\u1F70\u1F71\u1F72\u1F73\u1F74\u1F75\u1F76\u1F77\u1F78\u1F79\u1F7A\u1F7B\u1F7C\u1F7D\u1F80\u1F81\u1F82\u1F83\u1F84\u1F85\u1F86\u1F87\u1F90\u1F91\u1F92\u1F93\u1F94\u1F95\u1F96\u1F97\u1FA0\u1FA1\u1FA2\u1FA3\u1FA4\u1FA5\u1FA6\u1FA7\u1FB0\u1FB1\u1FB2\u1FB3\u1FB4\u1FB6\u1FB7\u1FBE\u1FC2\u1FC3\u1FC4\u1FC6\u1FC7\u1FD0\u1FD1\u1FD2\u1FD3\u1FD6\u1FD7\u1FE0\u1FE1\u1FE2\u1FE3\u1FE4\u1FE5\u1FE6\u1FE7\u1FF2\u1FF3\u1FF4\u1FF6\u1FF7\u2071\u207F\u210A\u210E\u210F\u2113\u212F\u2134\u2139\u213C\u213D\u2146\u2147\u2148\u2149\u214E\u2184\u2C30\u2C31\u2C32\u2C33\u2C34\u2C35\u2C36\u2C37\u2C38\u2C39\u2C3A\u2C3B\u2C3C\u2C3D\u2C3E\u2C3F\u2C40\u2C41\u2C42\u2C43\u2C44\u2C45\u2C46\u2C47\u2C48\u2C49\u2C4A\u2C4B\u2C4C\u2C4D\u2C4E\u2C4F\u2C50\u2C51\u2C52\u2C53\u2C54\u2C55\u2C56\u2C57\u2C58\u2C59\u2C5A\u2C5B\u2C5C\u2C5D\u2C5E\u2C61\u2C65\u2C66\u2C68\u2C6A\u2C6C\u2C71\u2C73\u2C74\u2C76\u2C77\u2C78\u2C79\u2C7A\u2C7B\u2C7C\u2C81\u2C83\u2C85\u2C87\u2C89\u2C8B\u2C8D\u2C8F\u2C91\u2C93\u2C95\u2C97\u2C99\u2C9B\u2C9D\u2C9F\u2CA1\u2CA3\u2CA5\u2CA7\u2CA9\u2CAB\u2CAD\u2CAF\u2CB1\u2CB3\u2CB5\u2CB7\u2CB9\u2CBB\u2CBD\u2CBF\u2CC1\u2CC3\u2CC5\u2CC7\u2CC9\u2CCB\u2CCD\u2CCF\u2CD1\u2CD3\u2CD5\u2CD7\u2CD9\u2CDB\u2CDD\u2CDF\u2CE1\u2CE3\u2CE4\u2D00\u2D01\u2D02\u2D03\u2D04\u2D05\u2D06\u2D07\u2D08\u2D09\u2D0A\u2D0B\u2D0C\u2D0D\u2D0E\u2D0F\u2D10\u2D11\u2D12\u2D13\u2D14\u2D15\u2D16\u2D17\u2D18\u2D19\u2D1A\u2D1B\u2D1C\u2D1D\u2D1E\u2D1F\u2D20\u2D21\u2D22\u2D23\u2D24\u2D25\uA641\uA643\uA645\uA647\uA649\uA64B\uA64D\uA64F\uA651\uA653\uA655\uA657\uA659\uA65B\uA65D\uA65F\uA663\uA665\uA667\uA669\uA66B\uA66D\uA681\uA683\uA685\uA687\uA689\uA68B\uA68D\uA68F\uA691\uA693\uA695\uA697\uA723\uA725\uA727\uA729\uA72B\uA72D\uA72F\uA730\uA731\uA733\uA735\uA737\uA739\uA73B\uA73D\uA73F\uA741\uA743\uA745\uA747\uA749\uA74B\uA74D\uA74F\uA751\uA753\uA755\uA757\uA759\uA75B\uA75D\uA75F\uA761\uA763\uA765\uA767\uA769\uA76B\uA76D\uA76F\uA771\uA772\uA773\uA774\uA775\uA776\uA777\uA778\uA77A\uA77C\uA77F\uA781\uA783\uA785\uA787\uA78C\uFB00\uFB01\uFB02\uFB03\uFB04\uFB05\uFB06\uFB13\uFB14\uFB15\uFB16\uFB17\uFF41\uFF42\uFF43\uFF44\uFF45\uFF46\uFF47\uFF48\uFF49\uFF4A\uFF4B\uFF4C\uFF4D\uFF4E\uFF4F\uFF50\uFF51\uFF52\uFF53\uFF54\uFF55\uFF56\uFF57\uFF58\uFF59\uFF5A]/, | |
| peg$c75 = { type: "class", value: "[abcdefghijklmnopqrstuvwxyz\\xAA\\xB5\\xBA\\xDF\\xE0\\xE1\\xE2\\xE3\\xE4\\xE5\\xE6\\xE7\\xE8\\xE9\\xEA\\xEB\\xEC\\xED\\xEE\\xEF\\xF0\\xF1\\xF2\\xF3\\xF4\\xF5\\xF6\\xF8\\xF9\\xFA\\xFB\\xFC\\xFD\\xFE\\xFF\\u0101\\u0103\\u0105\\u0107\\u0109\\u010B\\u010D\\u010F\\u0111\\u0113\\u0115\\u0117\\u0119\\u011B\\u011D\\u011F\\u0121\\u0123\\u0125\\u0127\\u0129\\u012B\\u012D\\u012F\\u0131\\u0133\\u0135\\u0137\\u0138\\u013A\\u013C\\u013E\\u0140\\u0142\\u0144\\u0146\\u0148\\u0149\\u014B\\u014D\\u014F\\u0151\\u0153\\u0155\\u0157\\u0159\\u015B\\u015D\\u015F\\u0161\\u0163\\u0165\\u0167\\u0169\\u016B\\u016D\\u016F\\u0171\\u0173\\u0175\\u0177\\u017A\\u017C\\u017E\\u017F\\u0180\\u0183\\u0185\\u0188\\u018C\\u018D\\u0192\\u0195\\u0199\\u019A\\u019B\\u019E\\u01A1\\u01A3\\u01A5\\u01A8\\u01AA\\u01AB\\u01AD\\u01B0\\u01B4\\u01B6\\u01B9\\u01BA\\u01BD\\u01BE\\u01BF\\u01C6\\u01C9\\u01CC\\u01CE\\u01D0\\u01D2\\u01D4\\u01D6\\u01D8\\u01DA\\u01DC\\u01DD\\u01DF\\u01E1\\u01E3\\u01E5\\u01E7\\u01E9\\u01EB\\u01ED\\u01EF\\u01F0\\u01F3\\u01F5\\u01F9\\u01FB\\u01FD\\u01FF\\u0201\\u0203\\u0205\\u0207\\u0209\\u020B\\u020D\\u020F\\u0211\\u0213\\u0215\\u0217\\u0219\\u021B\\u021D\\u021F\\u0221\\u0223\\u0225\\u0227\\u0229\\u022B\\u022D\\u022F\\u0231\\u0233\\u0234\\u0235\\u0236\\u0237\\u0238\\u0239\\u023C\\u023F\\u0240\\u0242\\u0247\\u0249\\u024B\\u024D\\u024F\\u0250\\u0251\\u0252\\u0253\\u0254\\u0255\\u0256\\u0257\\u0258\\u0259\\u025A\\u025B\\u025C\\u025D\\u025E\\u025F\\u0260\\u0261\\u0262\\u0263\\u0264\\u0265\\u0266\\u0267\\u0268\\u0269\\u026A\\u026B\\u026C\\u026D\\u026E\\u026F\\u0270\\u0271\\u0272\\u0273\\u0274\\u0275\\u0276\\u0277\\u0278\\u0279\\u027A\\u027B\\u027C\\u027D\\u027E\\u027F\\u0280\\u0281\\u0282\\u0283\\u0284\\u0285\\u0286\\u0287\\u0288\\u0289\\u028A\\u028B\\u028C\\u028D\\u028E\\u028F\\u0290\\u0291\\u0292\\u0293\\u0295\\u0296\\u0297\\u0298\\u0299\\u029A\\u029B\\u029C\\u029D\\u029E\\u029F\\u02A0\\u02A1\\u02A2\\u02A3\\u02A4\\u02A5\\u02A6\\u02A7\\u02A8\\u02A9\\u02AA\\u02AB\\u02AC\\u02AD\\u02AE\\u02AF\\u0371\\u0373\\u0377\\u037B\\u037C\\u037D\\u0390\\u03AC\\u03AD\\u03AE\\u03AF\\u03B0\\u03B1\\u03B2\\u03B3\\u03B4\\u03B5\\u03B6\\u03B7\\u03B8\\u03B9\\u03BA\\u03BB\\u03BC\\u03BD\\u03BE\\u03BF\\u03C0\\u03C1\\u03C2\\u03C3\\u03C4\\u03C5\\u03C6\\u03C7\\u03C8\\u03C9\\u03CA\\u03CB\\u03CC\\u03CD\\u03CE\\u03D0\\u03D1\\u03D5\\u03D6\\u03D7\\u03D9\\u03DB\\u03DD\\u03DF\\u03E1\\u03E3\\u03E5\\u03E7\\u03E9\\u03EB\\u03ED\\u03EF\\u03F0\\u03F1\\u03F2\\u03F3\\u03F5\\u03F8\\u03FB\\u03FC\\u0430\\u0431\\u0432\\u0433\\u0434\\u0435\\u0436\\u0437\\u0438\\u0439\\u043A\\u043B\\u043C\\u043D\\u043E\\u043F\\u0440\\u0441\\u0442\\u0443\\u0444\\u0445\\u0446\\u0447\\u0448\\u0449\\u044A\\u044B\\u044C\\u044D\\u044E\\u044F\\u0450\\u0451\\u0452\\u0453\\u0454\\u0455\\u0456\\u0457\\u0458\\u0459\\u045A\\u045B\\u045C\\u045D\\u045E\\u045F\\u0461\\u0463\\u0465\\u0467\\u0469\\u046B\\u046D\\u046F\\u0471\\u0473\\u0475\\u0477\\u0479\\u047B\\u047D\\u047F\\u0481\\u048B\\u048D\\u048F\\u0491\\u0493\\u0495\\u0497\\u0499\\u049B\\u049D\\u049F\\u04A1\\u04A3\\u04A5\\u04A7\\u04A9\\u04AB\\u04AD\\u04AF\\u04B1\\u04B3\\u04B5\\u04B7\\u04B9\\u04BB\\u04BD\\u04BF\\u04C2\\u04C4\\u04C6\\u04C8\\u04CA\\u04CC\\u04CE\\u04CF\\u04D1\\u04D3\\u04D5\\u04D7\\u04D9\\u04DB\\u04DD\\u04DF\\u04E1\\u04E3\\u04E5\\u04E7\\u04E9\\u04EB\\u04ED\\u04EF\\u04F1\\u04F3\\u04F5\\u04F7\\u04F9\\u04FB\\u04FD\\u04FF\\u0501\\u0503\\u0505\\u0507\\u0509\\u050B\\u050D\\u050F\\u0511\\u0513\\u0515\\u0517\\u0519\\u051B\\u051D\\u051F\\u0521\\u0523\\u0561\\u0562\\u0563\\u0564\\u0565\\u0566\\u0567\\u0568\\u0569\\u056A\\u056B\\u056C\\u056D\\u056E\\u056F\\u0570\\u0571\\u0572\\u0573\\u0574\\u0575\\u0576\\u0577\\u0578\\u0579\\u057A\\u057B\\u057C\\u057D\\u057E\\u057F\\u0580\\u0581\\u0582\\u0583\\u0584\\u0585\\u0586\\u0587\\u1D00\\u1D01\\u1D02\\u1D03\\u1D04\\u1D05\\u1D06\\u1D07\\u1D08\\u1D09\\u1D0A\\u1D0B\\u1D0C\\u1D0D\\u1D0E\\u1D0F\\u1D10\\u1D11\\u1D12\\u1D13\\u1D14\\u1D15\\u1D16\\u1D17\\u1D18\\u1D19\\u1D1A\\u1D1B\\u1D1C\\u1D1D\\u1D1E\\u1D1F\\u1D20\\u1D21\\u1D22\\u1D23\\u1D24\\u1D25\\u1D26\\u1D27\\u1D28\\u1D29\\u1D2A\\u1D2B\\u1D62\\u1D63\\u1D64\\u1D65\\u1D66\\u1D67\\u1D68\\u1D69\\u1D6A\\u1D6B\\u1D6C\\u1D6D\\u1D6E\\u1D6F\\u1D70\\u1D71\\u1D72\\u1D73\\u1D74\\u1D75\\u1D76\\u1D77\\u1D79\\u1D7A\\u1D7B\\u1D7C\\u1D7D\\u1D7E\\u1D7F\\u1D80\\u1D81\\u1D82\\u1D83\\u1D84\\u1D85\\u1D86\\u1D87\\u1D88\\u1D89\\u1D8A\\u1D8B\\u1D8C\\u1D8D\\u1D8E\\u1D8F\\u1D90\\u1D91\\u1D92\\u1D93\\u1D94\\u1D95\\u1D96\\u1D97\\u1D98\\u1D99\\u1D9A\\u1E01\\u1E03\\u1E05\\u1E07\\u1E09\\u1E0B\\u1E0D\\u1E0F\\u1E11\\u1E13\\u1E15\\u1E17\\u1E19\\u1E1B\\u1E1D\\u1E1F\\u1E21\\u1E23\\u1E25\\u1E27\\u1E29\\u1E2B\\u1E2D\\u1E2F\\u1E31\\u1E33\\u1E35\\u1E37\\u1E39\\u1E3B\\u1E3D\\u1E3F\\u1E41\\u1E43\\u1E45\\u1E47\\u1E49\\u1E4B\\u1E4D\\u1E4F\\u1E51\\u1E53\\u1E55\\u1E57\\u1E59\\u1E5B\\u1E5D\\u1E5F\\u1E61\\u1E63\\u1E65\\u1E67\\u1E69\\u1E6B\\u1E6D\\u1E6F\\u1E71\\u1E73\\u1E75\\u1E77\\u1E79\\u1E7B\\u1E7D\\u1E7F\\u1E81\\u1E83\\u1E85\\u1E87\\u1E89\\u1E8B\\u1E8D\\u1E8F\\u1E91\\u1E93\\u1E95\\u1E96\\u1E97\\u1E98\\u1E99\\u1E9A\\u1E9B\\u1E9C\\u1E9D\\u1E9F\\u1EA1\\u1EA3\\u1EA5\\u1EA7\\u1EA9\\u1EAB\\u1EAD\\u1EAF\\u1EB1\\u1EB3\\u1EB5\\u1EB7\\u1EB9\\u1EBB\\u1EBD\\u1EBF\\u1EC1\\u1EC3\\u1EC5\\u1EC7\\u1EC9\\u1ECB\\u1ECD\\u1ECF\\u1ED1\\u1ED3\\u1ED5\\u1ED7\\u1ED9\\u1EDB\\u1EDD\\u1EDF\\u1EE1\\u1EE3\\u1EE5\\u1EE7\\u1EE9\\u1EEB\\u1EED\\u1EEF\\u1EF1\\u1EF3\\u1EF5\\u1EF7\\u1EF9\\u1EFB\\u1EFD\\u1EFF\\u1F00\\u1F01\\u1F02\\u1F03\\u1F04\\u1F05\\u1F06\\u1F07\\u1F10\\u1F11\\u1F12\\u1F13\\u1F14\\u1F15\\u1F20\\u1F21\\u1F22\\u1F23\\u1F24\\u1F25\\u1F26\\u1F27\\u1F30\\u1F31\\u1F32\\u1F33\\u1F34\\u1F35\\u1F36\\u1F37\\u1F40\\u1F41\\u1F42\\u1F43\\u1F44\\u1F45\\u1F50\\u1F51\\u1F52\\u1F53\\u1F54\\u1F55\\u1F56\\u1F57\\u1F60\\u1F61\\u1F62\\u1F63\\u1F64\\u1F65\\u1F66\\u1F67\\u1F70\\u1F71\\u1F72\\u1F73\\u1F74\\u1F75\\u1F76\\u1F77\\u1F78\\u1F79\\u1F7A\\u1F7B\\u1F7C\\u1F7D\\u1F80\\u1F81\\u1F82\\u1F83\\u1F84\\u1F85\\u1F86\\u1F87\\u1F90\\u1F91\\u1F92\\u1F93\\u1F94\\u1F95\\u1F96\\u1F97\\u1FA0\\u1FA1\\u1FA2\\u1FA3\\u1FA4\\u1FA5\\u1FA6\\u1FA7\\u1FB0\\u1FB1\\u1FB2\\u1FB3\\u1FB4\\u1FB6\\u1FB7\\u1FBE\\u1FC2\\u1FC3\\u1FC4\\u1FC6\\u1FC7\\u1FD0\\u1FD1\\u1FD2\\u1FD3\\u1FD6\\u1FD7\\u1FE0\\u1FE1\\u1FE2\\u1FE3\\u1FE4\\u1FE5\\u1FE6\\u1FE7\\u1FF2\\u1FF3\\u1FF4\\u1FF6\\u1FF7\\u2071\\u207F\\u210A\\u210E\\u210F\\u2113\\u212F\\u2134\\u2139\\u213C\\u213D\\u2146\\u2147\\u2148\\u2149\\u214E\\u2184\\u2C30\\u2C31\\u2C32\\u2C33\\u2C34\\u2C35\\u2C36\\u2C37\\u2C38\\u2C39\\u2C3A\\u2C3B\\u2C3C\\u2C3D\\u2C3E\\u2C3F\\u2C40\\u2C41\\u2C42\\u2C43\\u2C44\\u2C45\\u2C46\\u2C47\\u2C48\\u2C49\\u2C4A\\u2C4B\\u2C4C\\u2C4D\\u2C4E\\u2C4F\\u2C50\\u2C51\\u2C52\\u2C53\\u2C54\\u2C55\\u2C56\\u2C57\\u2C58\\u2C59\\u2C5A\\u2C5B\\u2C5C\\u2C5D\\u2C5E\\u2C61\\u2C65\\u2C66\\u2C68\\u2C6A\\u2C6C\\u2C71\\u2C73\\u2C74\\u2C76\\u2C77\\u2C78\\u2C79\\u2C7A\\u2C7B\\u2C7C\\u2C81\\u2C83\\u2C85\\u2C87\\u2C89\\u2C8B\\u2C8D\\u2C8F\\u2C91\\u2C93\\u2C95\\u2C97\\u2C99\\u2C9B\\u2C9D\\u2C9F\\u2CA1\\u2CA3\\u2CA5\\u2CA7\\u2CA9\\u2CAB\\u2CAD\\u2CAF\\u2CB1\\u2CB3\\u2CB5\\u2CB7\\u2CB9\\u2CBB\\u2CBD\\u2CBF\\u2CC1\\u2CC3\\u2CC5\\u2CC7\\u2CC9\\u2CCB\\u2CCD\\u2CCF\\u2CD1\\u2CD3\\u2CD5\\u2CD7\\u2CD9\\u2CDB\\u2CDD\\u2CDF\\u2CE1\\u2CE3\\u2CE4\\u2D00\\u2D01\\u2D02\\u2D03\\u2D04\\u2D05\\u2D06\\u2D07\\u2D08\\u2D09\\u2D0A\\u2D0B\\u2D0C\\u2D0D\\u2D0E\\u2D0F\\u2D10\\u2D11\\u2D12\\u2D13\\u2D14\\u2D15\\u2D16\\u2D17\\u2D18\\u2D19\\u2D1A\\u2D1B\\u2D1C\\u2D1D\\u2D1E\\u2D1F\\u2D20\\u2D21\\u2D22\\u2D23\\u2D24\\u2D25\\uA641\\uA643\\uA645\\uA647\\uA649\\uA64B\\uA64D\\uA64F\\uA651\\uA653\\uA655\\uA657\\uA659\\uA65B\\uA65D\\uA65F\\uA663\\uA665\\uA667\\uA669\\uA66B\\uA66D\\uA681\\uA683\\uA685\\uA687\\uA689\\uA68B\\uA68D\\uA68F\\uA691\\uA693\\uA695\\uA697\\uA723\\uA725\\uA727\\uA729\\uA72B\\uA72D\\uA72F\\uA730\\uA731\\uA733\\uA735\\uA737\\uA739\\uA73B\\uA73D\\uA73F\\uA741\\uA743\\uA745\\uA747\\uA749\\uA74B\\uA74D\\uA74F\\uA751\\uA753\\uA755\\uA757\\uA759\\uA75B\\uA75D\\uA75F\\uA761\\uA763\\uA765\\uA767\\uA769\\uA76B\\uA76D\\uA76F\\uA771\\uA772\\uA773\\uA774\\uA775\\uA776\\uA777\\uA778\\uA77A\\uA77C\\uA77F\\uA781\\uA783\\uA785\\uA787\\uA78C\\uFB00\\uFB01\\uFB02\\uFB03\\uFB04\\uFB05\\uFB06\\uFB13\\uFB14\\uFB15\\uFB16\\uFB17\\uFF41\\uFF42\\uFF43\\uFF44\\uFF45\\uFF46\\uFF47\\uFF48\\uFF49\\uFF4A\\uFF4B\\uFF4C\\uFF4D\\uFF4E\\uFF4F\\uFF50\\uFF51\\uFF52\\uFF53\\uFF54\\uFF55\\uFF56\\uFF57\\uFF58\\uFF59\\uFF5A]", description: "[abcdefghijklmnopqrstuvwxyz\\xAA\\xB5\\xBA\\xDF\\xE0\\xE1\\xE2\\xE3\\xE4\\xE5\\xE6\\xE7\\xE8\\xE9\\xEA\\xEB\\xEC\\xED\\xEE\\xEF\\xF0\\xF1\\xF2\\xF3\\xF4\\xF5\\xF6\\xF8\\xF9\\xFA\\xFB\\xFC\\xFD\\xFE\\xFF\\u0101\\u0103\\u0105\\u0107\\u0109\\u010B\\u010D\\u010F\\u0111\\u0113\\u0115\\u0117\\u0119\\u011B\\u011D\\u011F\\u0121\\u0123\\u0125\\u0127\\u0129\\u012B\\u012D\\u012F\\u0131\\u0133\\u0135\\u0137\\u0138\\u013A\\u013C\\u013E\\u0140\\u0142\\u0144\\u0146\\u0148\\u0149\\u014B\\u014D\\u014F\\u0151\\u0153\\u0155\\u0157\\u0159\\u015B\\u015D\\u015F\\u0161\\u0163\\u0165\\u0167\\u0169\\u016B\\u016D\\u016F\\u0171\\u0173\\u0175\\u0177\\u017A\\u017C\\u017E\\u017F\\u0180\\u0183\\u0185\\u0188\\u018C\\u018D\\u0192\\u0195\\u0199\\u019A\\u019B\\u019E\\u01A1\\u01A3\\u01A5\\u01A8\\u01AA\\u01AB\\u01AD\\u01B0\\u01B4\\u01B6\\u01B9\\u01BA\\u01BD\\u01BE\\u01BF\\u01C6\\u01C9\\u01CC\\u01CE\\u01D0\\u01D2\\u01D4\\u01D6\\u01D8\\u01DA\\u01DC\\u01DD\\u01DF\\u01E1\\u01E3\\u01E5\\u01E7\\u01E9\\u01EB\\u01ED\\u01EF\\u01F0\\u01F3\\u01F5\\u01F9\\u01FB\\u01FD\\u01FF\\u0201\\u0203\\u0205\\u0207\\u0209\\u020B\\u020D\\u020F\\u0211\\u0213\\u0215\\u0217\\u0219\\u021B\\u021D\\u021F\\u0221\\u0223\\u0225\\u0227\\u0229\\u022B\\u022D\\u022F\\u0231\\u0233\\u0234\\u0235\\u0236\\u0237\\u0238\\u0239\\u023C\\u023F\\u0240\\u0242\\u0247\\u0249\\u024B\\u024D\\u024F\\u0250\\u0251\\u0252\\u0253\\u0254\\u0255\\u0256\\u0257\\u0258\\u0259\\u025A\\u025B\\u025C\\u025D\\u025E\\u025F\\u0260\\u0261\\u0262\\u0263\\u0264\\u0265\\u0266\\u0267\\u0268\\u0269\\u026A\\u026B\\u026C\\u026D\\u026E\\u026F\\u0270\\u0271\\u0272\\u0273\\u0274\\u0275\\u0276\\u0277\\u0278\\u0279\\u027A\\u027B\\u027C\\u027D\\u027E\\u027F\\u0280\\u0281\\u0282\\u0283\\u0284\\u0285\\u0286\\u0287\\u0288\\u0289\\u028A\\u028B\\u028C\\u028D\\u028E\\u028F\\u0290\\u0291\\u0292\\u0293\\u0295\\u0296\\u0297\\u0298\\u0299\\u029A\\u029B\\u029C\\u029D\\u029E\\u029F\\u02A0\\u02A1\\u02A2\\u02A3\\u02A4\\u02A5\\u02A6\\u02A7\\u02A8\\u02A9\\u02AA\\u02AB\\u02AC\\u02AD\\u02AE\\u02AF\\u0371\\u0373\\u0377\\u037B\\u037C\\u037D\\u0390\\u03AC\\u03AD\\u03AE\\u03AF\\u03B0\\u03B1\\u03B2\\u03B3\\u03B4\\u03B5\\u03B6\\u03B7\\u03B8\\u03B9\\u03BA\\u03BB\\u03BC\\u03BD\\u03BE\\u03BF\\u03C0\\u03C1\\u03C2\\u03C3\\u03C4\\u03C5\\u03C6\\u03C7\\u03C8\\u03C9\\u03CA\\u03CB\\u03CC\\u03CD\\u03CE\\u03D0\\u03D1\\u03D5\\u03D6\\u03D7\\u03D9\\u03DB\\u03DD\\u03DF\\u03E1\\u03E3\\u03E5\\u03E7\\u03E9\\u03EB\\u03ED\\u03EF\\u03F0\\u03F1\\u03F2\\u03F3\\u03F5\\u03F8\\u03FB\\u03FC\\u0430\\u0431\\u0432\\u0433\\u0434\\u0435\\u0436\\u0437\\u0438\\u0439\\u043A\\u043B\\u043C\\u043D\\u043E\\u043F\\u0440\\u0441\\u0442\\u0443\\u0444\\u0445\\u0446\\u0447\\u0448\\u0449\\u044A\\u044B\\u044C\\u044D\\u044E\\u044F\\u0450\\u0451\\u0452\\u0453\\u0454\\u0455\\u0456\\u0457\\u0458\\u0459\\u045A\\u045B\\u045C\\u045D\\u045E\\u045F\\u0461\\u0463\\u0465\\u0467\\u0469\\u046B\\u046D\\u046F\\u0471\\u0473\\u0475\\u0477\\u0479\\u047B\\u047D\\u047F\\u0481\\u048B\\u048D\\u048F\\u0491\\u0493\\u0495\\u0497\\u0499\\u049B\\u049D\\u049F\\u04A1\\u04A3\\u04A5\\u04A7\\u04A9\\u04AB\\u04AD\\u04AF\\u04B1\\u04B3\\u04B5\\u04B7\\u04B9\\u04BB\\u04BD\\u04BF\\u04C2\\u04C4\\u04C6\\u04C8\\u04CA\\u04CC\\u04CE\\u04CF\\u04D1\\u04D3\\u04D5\\u04D7\\u04D9\\u04DB\\u04DD\\u04DF\\u04E1\\u04E3\\u04E5\\u04E7\\u04E9\\u04EB\\u04ED\\u04EF\\u04F1\\u04F3\\u04F5\\u04F7\\u04F9\\u04FB\\u04FD\\u04FF\\u0501\\u0503\\u0505\\u0507\\u0509\\u050B\\u050D\\u050F\\u0511\\u0513\\u0515\\u0517\\u0519\\u051B\\u051D\\u051F\\u0521\\u0523\\u0561\\u0562\\u0563\\u0564\\u0565\\u0566\\u0567\\u0568\\u0569\\u056A\\u056B\\u056C\\u056D\\u056E\\u056F\\u0570\\u0571\\u0572\\u0573\\u0574\\u0575\\u0576\\u0577\\u0578\\u0579\\u057A\\u057B\\u057C\\u057D\\u057E\\u057F\\u0580\\u0581\\u0582\\u0583\\u0584\\u0585\\u0586\\u0587\\u1D00\\u1D01\\u1D02\\u1D03\\u1D04\\u1D05\\u1D06\\u1D07\\u1D08\\u1D09\\u1D0A\\u1D0B\\u1D0C\\u1D0D\\u1D0E\\u1D0F\\u1D10\\u1D11\\u1D12\\u1D13\\u1D14\\u1D15\\u1D16\\u1D17\\u1D18\\u1D19\\u1D1A\\u1D1B\\u1D1C\\u1D1D\\u1D1E\\u1D1F\\u1D20\\u1D21\\u1D22\\u1D23\\u1D24\\u1D25\\u1D26\\u1D27\\u1D28\\u1D29\\u1D2A\\u1D2B\\u1D62\\u1D63\\u1D64\\u1D65\\u1D66\\u1D67\\u1D68\\u1D69\\u1D6A\\u1D6B\\u1D6C\\u1D6D\\u1D6E\\u1D6F\\u1D70\\u1D71\\u1D72\\u1D73\\u1D74\\u1D75\\u1D76\\u1D77\\u1D79\\u1D7A\\u1D7B\\u1D7C\\u1D7D\\u1D7E\\u1D7F\\u1D80\\u1D81\\u1D82\\u1D83\\u1D84\\u1D85\\u1D86\\u1D87\\u1D88\\u1D89\\u1D8A\\u1D8B\\u1D8C\\u1D8D\\u1D8E\\u1D8F\\u1D90\\u1D91\\u1D92\\u1D93\\u1D94\\u1D95\\u1D96\\u1D97\\u1D98\\u1D99\\u1D9A\\u1E01\\u1E03\\u1E05\\u1E07\\u1E09\\u1E0B\\u1E0D\\u1E0F\\u1E11\\u1E13\\u1E15\\u1E17\\u1E19\\u1E1B\\u1E1D\\u1E1F\\u1E21\\u1E23\\u1E25\\u1E27\\u1E29\\u1E2B\\u1E2D\\u1E2F\\u1E31\\u1E33\\u1E35\\u1E37\\u1E39\\u1E3B\\u1E3D\\u1E3F\\u1E41\\u1E43\\u1E45\\u1E47\\u1E49\\u1E4B\\u1E4D\\u1E4F\\u1E51\\u1E53\\u1E55\\u1E57\\u1E59\\u1E5B\\u1E5D\\u1E5F\\u1E61\\u1E63\\u1E65\\u1E67\\u1E69\\u1E6B\\u1E6D\\u1E6F\\u1E71\\u1E73\\u1E75\\u1E77\\u1E79\\u1E7B\\u1E7D\\u1E7F\\u1E81\\u1E83\\u1E85\\u1E87\\u1E89\\u1E8B\\u1E8D\\u1E8F\\u1E91\\u1E93\\u1E95\\u1E96\\u1E97\\u1E98\\u1E99\\u1E9A\\u1E9B\\u1E9C\\u1E9D\\u1E9F\\u1EA1\\u1EA3\\u1EA5\\u1EA7\\u1EA9\\u1EAB\\u1EAD\\u1EAF\\u1EB1\\u1EB3\\u1EB5\\u1EB7\\u1EB9\\u1EBB\\u1EBD\\u1EBF\\u1EC1\\u1EC3\\u1EC5\\u1EC7\\u1EC9\\u1ECB\\u1ECD\\u1ECF\\u1ED1\\u1ED3\\u1ED5\\u1ED7\\u1ED9\\u1EDB\\u1EDD\\u1EDF\\u1EE1\\u1EE3\\u1EE5\\u1EE7\\u1EE9\\u1EEB\\u1EED\\u1EEF\\u1EF1\\u1EF3\\u1EF5\\u1EF7\\u1EF9\\u1EFB\\u1EFD\\u1EFF\\u1F00\\u1F01\\u1F02\\u1F03\\u1F04\\u1F05\\u1F06\\u1F07\\u1F10\\u1F11\\u1F12\\u1F13\\u1F14\\u1F15\\u1F20\\u1F21\\u1F22\\u1F23\\u1F24\\u1F25\\u1F26\\u1F27\\u1F30\\u1F31\\u1F32\\u1F33\\u1F34\\u1F35\\u1F36\\u1F37\\u1F40\\u1F41\\u1F42\\u1F43\\u1F44\\u1F45\\u1F50\\u1F51\\u1F52\\u1F53\\u1F54\\u1F55\\u1F56\\u1F57\\u1F60\\u1F61\\u1F62\\u1F63\\u1F64\\u1F65\\u1F66\\u1F67\\u1F70\\u1F71\\u1F72\\u1F73\\u1F74\\u1F75\\u1F76\\u1F77\\u1F78\\u1F79\\u1F7A\\u1F7B\\u1F7C\\u1F7D\\u1F80\\u1F81\\u1F82\\u1F83\\u1F84\\u1F85\\u1F86\\u1F87\\u1F90\\u1F91\\u1F92\\u1F93\\u1F94\\u1F95\\u1F96\\u1F97\\u1FA0\\u1FA1\\u1FA2\\u1FA3\\u1FA4\\u1FA5\\u1FA6\\u1FA7\\u1FB0\\u1FB1\\u1FB2\\u1FB3\\u1FB4\\u1FB6\\u1FB7\\u1FBE\\u1FC2\\u1FC3\\u1FC4\\u1FC6\\u1FC7\\u1FD0\\u1FD1\\u1FD2\\u1FD3\\u1FD6\\u1FD7\\u1FE0\\u1FE1\\u1FE2\\u1FE3\\u1FE4\\u1FE5\\u1FE6\\u1FE7\\u1FF2\\u1FF3\\u1FF4\\u1FF6\\u1FF7\\u2071\\u207F\\u210A\\u210E\\u210F\\u2113\\u212F\\u2134\\u2139\\u213C\\u213D\\u2146\\u2147\\u2148\\u2149\\u214E\\u2184\\u2C30\\u2C31\\u2C32\\u2C33\\u2C34\\u2C35\\u2C36\\u2C37\\u2C38\\u2C39\\u2C3A\\u2C3B\\u2C3C\\u2C3D\\u2C3E\\u2C3F\\u2C40\\u2C41\\u2C42\\u2C43\\u2C44\\u2C45\\u2C46\\u2C47\\u2C48\\u2C49\\u2C4A\\u2C4B\\u2C4C\\u2C4D\\u2C4E\\u2C4F\\u2C50\\u2C51\\u2C52\\u2C53\\u2C54\\u2C55\\u2C56\\u2C57\\u2C58\\u2C59\\u2C5A\\u2C5B\\u2C5C\\u2C5D\\u2C5E\\u2C61\\u2C65\\u2C66\\u2C68\\u2C6A\\u2C6C\\u2C71\\u2C73\\u2C74\\u2C76\\u2C77\\u2C78\\u2C79\\u2C7A\\u2C7B\\u2C7C\\u2C81\\u2C83\\u2C85\\u2C87\\u2C89\\u2C8B\\u2C8D\\u2C8F\\u2C91\\u2C93\\u2C95\\u2C97\\u2C99\\u2C9B\\u2C9D\\u2C9F\\u2CA1\\u2CA3\\u2CA5\\u2CA7\\u2CA9\\u2CAB\\u2CAD\\u2CAF\\u2CB1\\u2CB3\\u2CB5\\u2CB7\\u2CB9\\u2CBB\\u2CBD\\u2CBF\\u2CC1\\u2CC3\\u2CC5\\u2CC7\\u2CC9\\u2CCB\\u2CCD\\u2CCF\\u2CD1\\u2CD3\\u2CD5\\u2CD7\\u2CD9\\u2CDB\\u2CDD\\u2CDF\\u2CE1\\u2CE3\\u2CE4\\u2D00\\u2D01\\u2D02\\u2D03\\u2D04\\u2D05\\u2D06\\u2D07\\u2D08\\u2D09\\u2D0A\\u2D0B\\u2D0C\\u2D0D\\u2D0E\\u2D0F\\u2D10\\u2D11\\u2D12\\u2D13\\u2D14\\u2D15\\u2D16\\u2D17\\u2D18\\u2D19\\u2D1A\\u2D1B\\u2D1C\\u2D1D\\u2D1E\\u2D1F\\u2D20\\u2D21\\u2D22\\u2D23\\u2D24\\u2D25\\uA641\\uA643\\uA645\\uA647\\uA649\\uA64B\\uA64D\\uA64F\\uA651\\uA653\\uA655\\uA657\\uA659\\uA65B\\uA65D\\uA65F\\uA663\\uA665\\uA667\\uA669\\uA66B\\uA66D\\uA681\\uA683\\uA685\\uA687\\uA689\\uA68B\\uA68D\\uA68F\\uA691\\uA693\\uA695\\uA697\\uA723\\uA725\\uA727\\uA729\\uA72B\\uA72D\\uA72F\\uA730\\uA731\\uA733\\uA735\\uA737\\uA739\\uA73B\\uA73D\\uA73F\\uA741\\uA743\\uA745\\uA747\\uA749\\uA74B\\uA74D\\uA74F\\uA751\\uA753\\uA755\\uA757\\uA759\\uA75B\\uA75D\\uA75F\\uA761\\uA763\\uA765\\uA767\\uA769\\uA76B\\uA76D\\uA76F\\uA771\\uA772\\uA773\\uA774\\uA775\\uA776\\uA777\\uA778\\uA77A\\uA77C\\uA77F\\uA781\\uA783\\uA785\\uA787\\uA78C\\uFB00\\uFB01\\uFB02\\uFB03\\uFB04\\uFB05\\uFB06\\uFB13\\uFB14\\uFB15\\uFB16\\uFB17\\uFF41\\uFF42\\uFF43\\uFF44\\uFF45\\uFF46\\uFF47\\uFF48\\uFF49\\uFF4A\\uFF4B\\uFF4C\\uFF4D\\uFF4E\\uFF4F\\uFF50\\uFF51\\uFF52\\uFF53\\uFF54\\uFF55\\uFF56\\uFF57\\uFF58\\uFF59\\uFF5A]" }, | |
| peg$c76 = /^[\u02B0\u02B1\u02B2\u02B3\u02B4\u02B5\u02B6\u02B7\u02B8\u02B9\u02BA\u02BB\u02BC\u02BD\u02BE\u02BF\u02C0\u02C1\u02C6\u02C7\u02C8\u02C9\u02CA\u02CB\u02CC\u02CD\u02CE\u02CF\u02D0\u02D1\u02E0\u02E1\u02E2\u02E3\u02E4\u02EC\u02EE\u0374\u037A\u0559\u0640\u06E5\u06E6\u07F4\u07F5\u07FA\u0971\u0E46\u0EC6\u10FC\u17D7\u1843\u1C78\u1C79\u1C7A\u1C7B\u1C7C\u1C7D\u1D2C\u1D2D\u1D2E\u1D2F\u1D30\u1D31\u1D32\u1D33\u1D34\u1D35\u1D36\u1D37\u1D38\u1D39\u1D3A\u1D3B\u1D3C\u1D3D\u1D3E\u1D3F\u1D40\u1D41\u1D42\u1D43\u1D44\u1D45\u1D46\u1D47\u1D48\u1D49\u1D4A\u1D4B\u1D4C\u1D4D\u1D4E\u1D4F\u1D50\u1D51\u1D52\u1D53\u1D54\u1D55\u1D56\u1D57\u1D58\u1D59\u1D5A\u1D5B\u1D5C\u1D5D\u1D5E\u1D5F\u1D60\u1D61\u1D78\u1D9B\u1D9C\u1D9D\u1D9E\u1D9F\u1DA0\u1DA1\u1DA2\u1DA3\u1DA4\u1DA5\u1DA6\u1DA7\u1DA8\u1DA9\u1DAA\u1DAB\u1DAC\u1DAD\u1DAE\u1DAF\u1DB0\u1DB1\u1DB2\u1DB3\u1DB4\u1DB5\u1DB6\u1DB7\u1DB8\u1DB9\u1DBA\u1DBB\u1DBC\u1DBD\u1DBE\u1DBF\u2090\u2091\u2092\u2093\u2094\u2C7D\u2D6F\u2E2F\u3005\u3031\u3032\u3033\u3034\u3035\u303B\u309D\u309E\u30FC\u30FD\u30FE\uA015\uA60C\uA67F\uA717\uA718\uA719\uA71A\uA71B\uA71C\uA71D\uA71E\uA71F\uA770\uA788\uFF70\uFF9E\uFF9F]/, | |
| peg$c77 = { type: "class", value: "[\\u02B0\\u02B1\\u02B2\\u02B3\\u02B4\\u02B5\\u02B6\\u02B7\\u02B8\\u02B9\\u02BA\\u02BB\\u02BC\\u02BD\\u02BE\\u02BF\\u02C0\\u02C1\\u02C6\\u02C7\\u02C8\\u02C9\\u02CA\\u02CB\\u02CC\\u02CD\\u02CE\\u02CF\\u02D0\\u02D1\\u02E0\\u02E1\\u02E2\\u02E3\\u02E4\\u02EC\\u02EE\\u0374\\u037A\\u0559\\u0640\\u06E5\\u06E6\\u07F4\\u07F5\\u07FA\\u0971\\u0E46\\u0EC6\\u10FC\\u17D7\\u1843\\u1C78\\u1C79\\u1C7A\\u1C7B\\u1C7C\\u1C7D\\u1D2C\\u1D2D\\u1D2E\\u1D2F\\u1D30\\u1D31\\u1D32\\u1D33\\u1D34\\u1D35\\u1D36\\u1D37\\u1D38\\u1D39\\u1D3A\\u1D3B\\u1D3C\\u1D3D\\u1D3E\\u1D3F\\u1D40\\u1D41\\u1D42\\u1D43\\u1D44\\u1D45\\u1D46\\u1D47\\u1D48\\u1D49\\u1D4A\\u1D4B\\u1D4C\\u1D4D\\u1D4E\\u1D4F\\u1D50\\u1D51\\u1D52\\u1D53\\u1D54\\u1D55\\u1D56\\u1D57\\u1D58\\u1D59\\u1D5A\\u1D5B\\u1D5C\\u1D5D\\u1D5E\\u1D5F\\u1D60\\u1D61\\u1D78\\u1D9B\\u1D9C\\u1D9D\\u1D9E\\u1D9F\\u1DA0\\u1DA1\\u1DA2\\u1DA3\\u1DA4\\u1DA5\\u1DA6\\u1DA7\\u1DA8\\u1DA9\\u1DAA\\u1DAB\\u1DAC\\u1DAD\\u1DAE\\u1DAF\\u1DB0\\u1DB1\\u1DB2\\u1DB3\\u1DB4\\u1DB5\\u1DB6\\u1DB7\\u1DB8\\u1DB9\\u1DBA\\u1DBB\\u1DBC\\u1DBD\\u1DBE\\u1DBF\\u2090\\u2091\\u2092\\u2093\\u2094\\u2C7D\\u2D6F\\u2E2F\\u3005\\u3031\\u3032\\u3033\\u3034\\u3035\\u303B\\u309D\\u309E\\u30FC\\u30FD\\u30FE\\uA015\\uA60C\\uA67F\\uA717\\uA718\\uA719\\uA71A\\uA71B\\uA71C\\uA71D\\uA71E\\uA71F\\uA770\\uA788\\uFF70\\uFF9E\\uFF9F]", description: "[\\u02B0\\u02B1\\u02B2\\u02B3\\u02B4\\u02B5\\u02B6\\u02B7\\u02B8\\u02B9\\u02BA\\u02BB\\u02BC\\u02BD\\u02BE\\u02BF\\u02C0\\u02C1\\u02C6\\u02C7\\u02C8\\u02C9\\u02CA\\u02CB\\u02CC\\u02CD\\u02CE\\u02CF\\u02D0\\u02D1\\u02E0\\u02E1\\u02E2\\u02E3\\u02E4\\u02EC\\u02EE\\u0374\\u037A\\u0559\\u0640\\u06E5\\u06E6\\u07F4\\u07F5\\u07FA\\u0971\\u0E46\\u0EC6\\u10FC\\u17D7\\u1843\\u1C78\\u1C79\\u1C7A\\u1C7B\\u1C7C\\u1C7D\\u1D2C\\u1D2D\\u1D2E\\u1D2F\\u1D30\\u1D31\\u1D32\\u1D33\\u1D34\\u1D35\\u1D36\\u1D37\\u1D38\\u1D39\\u1D3A\\u1D3B\\u1D3C\\u1D3D\\u1D3E\\u1D3F\\u1D40\\u1D41\\u1D42\\u1D43\\u1D44\\u1D45\\u1D46\\u1D47\\u1D48\\u1D49\\u1D4A\\u1D4B\\u1D4C\\u1D4D\\u1D4E\\u1D4F\\u1D50\\u1D51\\u1D52\\u1D53\\u1D54\\u1D55\\u1D56\\u1D57\\u1D58\\u1D59\\u1D5A\\u1D5B\\u1D5C\\u1D5D\\u1D5E\\u1D5F\\u1D60\\u1D61\\u1D78\\u1D9B\\u1D9C\\u1D9D\\u1D9E\\u1D9F\\u1DA0\\u1DA1\\u1DA2\\u1DA3\\u1DA4\\u1DA5\\u1DA6\\u1DA7\\u1DA8\\u1DA9\\u1DAA\\u1DAB\\u1DAC\\u1DAD\\u1DAE\\u1DAF\\u1DB0\\u1DB1\\u1DB2\\u1DB3\\u1DB4\\u1DB5\\u1DB6\\u1DB7\\u1DB8\\u1DB9\\u1DBA\\u1DBB\\u1DBC\\u1DBD\\u1DBE\\u1DBF\\u2090\\u2091\\u2092\\u2093\\u2094\\u2C7D\\u2D6F\\u2E2F\\u3005\\u3031\\u3032\\u3033\\u3034\\u3035\\u303B\\u309D\\u309E\\u30FC\\u30FD\\u30FE\\uA015\\uA60C\\uA67F\\uA717\\uA718\\uA719\\uA71A\\uA71B\\uA71C\\uA71D\\uA71E\\uA71F\\uA770\\uA788\\uFF70\\uFF9E\\uFF9F]" }, | |
| peg$c78 = /^[\u01BB\u01C0\u01C1\u01C2\u01C3\u0294\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5\u05D6\u05D7\u05D8\u05D9\u05DA\u05DB\u05DC\u05DD\u05DE\u05DF\u05E0\u05E1\u05E2\u05E3\u05E4\u05E5\u05E6\u05E7\u05E8\u05E9\u05EA\u05F0\u05F1\u05F2\u0621\u0622\u0623\u0624\u0625\u0626\u0627\u0628\u0629\u062A\u062B\u062C\u062D\u062E\u062F\u0630\u0631\u0632\u0633\u0634\u0635\u0636\u0637\u0638\u0639\u063A\u063B\u063C\u063D\u063E\u063F\u0641\u0642\u0643\u0644\u0645\u0646\u0647\u0648\u0649\u064A\u066E\u066F\u0671\u0672\u0673\u0674\u0675\u0676\u0677\u0678\u0679\u067A\u067B\u067C\u067D\u067E\u067F\u0680\u0681\u0682\u0683\u0684\u0685\u0686\u0687\u0688\u0689\u068A\u068B\u068C\u068D\u068E\u068F\u0690\u0691\u0692\u0693\u0694\u0695\u0696\u0697\u0698\u0699\u069A\u069B\u069C\u069D\u069E\u069F\u06A0\u06A1\u06A2\u06A3\u06A4\u06A5\u06A6\u06A7\u06A8\u06A9\u06AA\u06AB\u06AC\u06AD\u06AE\u06AF\u06B0\u06B1\u06B2\u06B3\u06B4\u06B5\u06B6\u06B7\u06B8\u06B9\u06BA\u06BB\u06BC\u06BD\u06BE\u06BF\u06C0\u06C1\u06C2\u06C3\u06C4\u06C5\u06C6\u06C7\u06C8\u06C9\u06CA\u06CB\u06CC\u06CD\u06CE\u06CF\u06D0\u06D1\u06D2\u06D3\u06D5\u06EE\u06EF\u06FA\u06FB\u06FC\u06FF\u0710\u0712\u0713\u0714\u0715\u0716\u0717\u0718\u0719\u071A\u071B\u071C\u071D\u071E\u071F\u0720\u0721\u0722\u0723\u0724\u0725\u0726\u0727\u0728\u0729\u072A\u072B\u072C\u072D\u072E\u072F\u074D\u074E\u074F\u0750\u0751\u0752\u0753\u0754\u0755\u0756\u0757\u0758\u0759\u075A\u075B\u075C\u075D\u075E\u075F\u0760\u0761\u0762\u0763\u0764\u0765\u0766\u0767\u0768\u0769\u076A\u076B\u076C\u076D\u076E\u076F\u0770\u0771\u0772\u0773\u0774\u0775\u0776\u0777\u0778\u0779\u077A\u077B\u077C\u077D\u077E\u077F\u0780\u0781\u0782\u0783\u0784\u0785\u0786\u0787\u0788\u0789\u078A\u078B\u078C\u078D\u078E\u078F\u0790\u0791\u0792\u0793\u0794\u0795\u0796\u0797\u0798\u0799\u079A\u079B\u079C\u079D\u079E\u079F\u07A0\u07A1\u07A2\u07A3\u07A4\u07A5\u07B1\u07CA\u07CB\u07CC\u07CD\u07CE\u07CF\u07D0\u07D1\u07D2\u07D3\u07D4\u07D5\u07D6\u07D7\u07D8\u07D9\u07DA\u07DB\u07DC\u07DD\u07DE\u07DF\u07E0\u07E1\u07E2\u07E3\u07E4\u07E5\u07E6\u07E7\u07E8\u07E9\u07EA\u0904\u0905\u0906\u0907\u0908\u0909\u090A\u090B\u090C\u090D\u090E\u090F\u0910\u0911\u0912\u0913\u0914\u0915\u0916\u0917\u0918\u0919\u091A\u091B\u091C\u091D\u091E\u091F\u0920\u0921\u0922\u0923\u0924\u0925\u0926\u0927\u0928\u0929\u092A\u092B\u092C\u092D\u092E\u092F\u0930\u0931\u0932\u0933\u0934\u0935\u0936\u0937\u0938\u0939\u093D\u0950\u0958\u0959\u095A\u095B\u095C\u095D\u095E\u095F\u0960\u0961\u0972\u097B\u097C\u097D\u097E\u097F\u0985\u0986\u0987\u0988\u0989\u098A\u098B\u098C\u098F\u0990\u0993\u0994\u0995\u0996\u0997\u0998\u0999\u099A\u099B\u099C\u099D\u099E\u099F\u09A0\u09A1\u09A2\u09A3\u09A4\u09A5\u09A6\u09A7\u09A8\u09AA\u09AB\u09AC\u09AD\u09AE\u09AF\u09B0\u09B2\u09B6\u09B7\u09B8\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF\u09E0\u09E1\u09F0\u09F1\u0A05\u0A06\u0A07\u0A08\u0A09\u0A0A\u0A0F\u0A10\u0A13\u0A14\u0A15\u0A16\u0A17\u0A18\u0A19\u0A1A\u0A1B\u0A1C\u0A1D\u0A1E\u0A1F\u0A20\u0A21\u0A22\u0A23\u0A24\u0A25\u0A26\u0A27\u0A28\u0A2A\u0A2B\u0A2C\u0A2D\u0A2E\u0A2F\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59\u0A5A\u0A5B\u0A5C\u0A5E\u0A72\u0A73\u0A74\u0A85\u0A86\u0A87\u0A88\u0A89\u0A8A\u0A8B\u0A8C\u0A8D\u0A8F\u0A90\u0A91\u0A93\u0A94\u0A95\u0A96\u0A97\u0A98\u0A99\u0A9A\u0A9B\u0A9C\u0A9D\u0A9E\u0A9F\u0AA0\u0AA1\u0AA2\u0AA3\u0AA4\u0AA5\u0AA6\u0AA7\u0AA8\u0AAA\u0AAB\u0AAC\u0AAD\u0AAE\u0AAF\u0AB0\u0AB2\u0AB3\u0AB5\u0AB6\u0AB7\u0AB8\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05\u0B06\u0B07\u0B08\u0B09\u0B0A\u0B0B\u0B0C\u0B0F\u0B10\u0B13\u0B14\u0B15\u0B16\u0B17\u0B18\u0B19\u0B1A\u0B1B\u0B1C\u0B1D\u0B1E\u0B1F\u0B20\u0B21\u0B22\u0B23\u0B24\u0B25\u0B26\u0B27\u0B28\u0B2A\u0B2B\u0B2C\u0B2D\u0B2E\u0B2F\u0B30\u0B32\u0B33\u0B35\u0B36\u0B37\u0B38\u0B39\u0B3D\u0B5C\u0B5D\u0B5F\u0B60\u0B61\u0B71\u0B83\u0B85\u0B86\u0B87\u0B88\u0B89\u0B8A\u0B8E\u0B8F\u0B90\u0B92\u0B93\u0B94\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8\u0BA9\u0BAA\u0BAE\u0BAF\u0BB0\u0BB1\u0BB2\u0BB3\u0BB4\u0BB5\u0BB6\u0BB7\u0BB8\u0BB9\u0BD0\u0C05\u0C06\u0C07\u0C08\u0C09\u0C0A\u0C0B\u0C0C\u0C0E\u0C0F\u0C10\u0C12\u0C13\u0C14\u0C15\u0C16\u0C17\u0C18\u0C19\u0C1A\u0C1B\u0C1C\u0C1D\u0C1E\u0C1F\u0C20\u0C21\u0C22\u0C23\u0C24\u0C25\u0C26\u0C27\u0C28\u0C2A\u0C2B\u0C2C\u0C2D\u0C2E\u0C2F\u0C30\u0C31\u0C32\u0C33\u0C35\u0C36\u0C37\u0C38\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85\u0C86\u0C87\u0C88\u0C89\u0C8A\u0C8B\u0C8C\u0C8E\u0C8F\u0C90\u0C92\u0C93\u0C94\u0C95\u0C96\u0C97\u0C98\u0C99\u0C9A\u0C9B\u0C9C\u0C9D\u0C9E\u0C9F\u0CA0\u0CA1\u0CA2\u0CA3\u0CA4\u0CA5\u0CA6\u0CA7\u0CA8\u0CAA\u0CAB\u0CAC\u0CAD\u0CAE\u0CAF\u0CB0\u0CB1\u0CB2\u0CB3\u0CB5\u0CB6\u0CB7\u0CB8\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0D05\u0D06\u0D07\u0D08\u0D09\u0D0A\u0D0B\u0D0C\u0D0E\u0D0F\u0D10\u0D12\u0D13\u0D14\u0D15\u0D16\u0D17\u0D18\u0D19\u0D1A\u0D1B\u0D1C\u0D1D\u0D1E\u0D1F\u0D20\u0D21\u0D22\u0D23\u0D24\u0D25\u0D26\u0D27\u0D28\u0D2A\u0D2B\u0D2C\u0D2D\u0D2E\u0D2F\u0D30\u0D31\u0D32\u0D33\u0D34\u0D35\u0D36\u0D37\u0D38\u0D39\u0D3D\u0D60\u0D61\u0D7A\u0D7B\u0D7C\u0D7D\u0D7E\u0D7F\u0D85\u0D86\u0D87\u0D88\u0D89\u0D8A\u0D8B\u0D8C\u0D8D\u0D8E\u0D8F\u0D90\u0D91\u0D92\u0D93\u0D94\u0D95\u0D96\u0D9A\u0D9B\u0D9C\u0D9D\u0D9E\u0D9F\u0DA0\u0DA1\u0DA2\u0DA3\u0DA4\u0DA5\u0DA6\u0DA7\u0DA8\u0DA9\u0DAA\u0DAB\u0DAC\u0DAD\u0DAE\u0DAF\u0DB0\u0DB1\u0DB3\u0DB4\u0DB5\u0DB6\u0DB7\u0DB8\u0DB9\u0DBA\u0DBB\u0DBD\u0DC0\u0DC1\u0DC2\u0DC3\u0DC4\u0DC5\u0DC6\u0E01\u0E02\u0E03\u0E04\u0E05\u0E06\u0E07\u0E08\u0E09\u0E0A\u0E0B\u0E0C\u0E0D\u0E0E\u0E0F\u0E10\u0E11\u0E12\u0E13\u0E14\u0E15\u0E16\u0E17\u0E18\u0E19\u0E1A\u0E1B\u0E1C\u0E1D\u0E1E\u0E1F\u0E20\u0E21\u0E22\u0E23\u0E24\u0E25\u0E26\u0E27\u0E28\u0E29\u0E2A\u0E2B\u0E2C\u0E2D\u0E2E\u0E2F\u0E30\u0E32\u0E33\u0E40\u0E41\u0E42\u0E43\u0E44\u0E45\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94\u0E95\u0E96\u0E97\u0E99\u0E9A\u0E9B\u0E9C\u0E9D\u0E9E\u0E9F\u0EA1\u0EA2\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD\u0EAE\u0EAF\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0\u0EC1\u0EC2\u0EC3\u0EC4\u0EDC\u0EDD\u0F00\u0F40\u0F41\u0F42\u0F43\u0F44\u0F45\u0F46\u0F47\u0F49\u0F4A\u0F4B\u0F4C\u0F4D\u0F4E\u0F4F\u0F50\u0F51\u0F52\u0F53\u0F54\u0F55\u0F56\u0F57\u0F58\u0F59\u0F5A\u0F5B\u0F5C\u0F5D\u0F5E\u0F5F\u0F60\u0F61\u0F62\u0F63\u0F64\u0F65\u0F66\u0F67\u0F68\u0F69\u0F6A\u0F6B\u0F6C\u0F88\u0F89\u0F8A\u0F8B\u1000\u1001\u1002\u1003\u1004\u1005\u1006\u1007\u1008\u1009\u100A\u100B\u100C\u100D\u100E\u100F\u1010\u1011\u1012\u1013\u1014\u1015\u1016\u1017\u1018\u1019\u101A\u101B\u101C\u101D\u101E\u101F\u1020\u1021\u1022\u1023\u1024\u1025\u1026\u1027\u1028\u1029\u102A\u103F\u1050\u1051\u1052\u1053\u1054\u1055\u105A\u105B\u105C\u105D\u1061\u1065\u1066\u106E\u106F\u1070\u1075\u1076\u1077\u1078\u1079\u107A\u107B\u107C\u107D\u107E\u107F\u1080\u1081\u108E\u10D0\u10D1\u10D2\u10D3\u10D4\u10D5\u10D6\u10D7\u10D8\u10D9\u10DA\u10DB\u10DC\u10DD\u10DE\u10DF\u10E0\u10E1\u10E2\u10E3\u10E4\u10E5\u10E6\u10E7\u10E8\u10E9\u10EA\u10EB\u10EC\u10ED\u10EE\u10EF\u10F0\u10F1\u10F2\u10F3\u10F4\u10F5\u10F6\u10F7\u10F8\u10F9\u10FA\u1100\u1101\u1102\u1103\u1104\u1105\u1106\u1107\u1108\u1109\u110A\u110B\u110C\u110D\u110E\u110F\u1110\u1111\u1112\u1113\u1114\u1115\u1116\u1117\u1118\u1119\u111A\u111B\u111C\u111D\u111E\u111F\u1120\u1121\u1122\u1123\u1124\u1125\u1126\u1127\u1128\u1129\u112A\u112B\u112C\u112D\u112E\u112F\u1130\u1131\u1132\u1133\u1134\u1135\u1136\u1137\u1138\u1139\u113A\u113B\u113C\u113D\u113E\u113F\u1140\u1141\u1142\u1143\u1144\u1145\u1146\u1147\u1148\u1149\u114A\u114B\u114C\u114D\u114E\u114F\u1150\u1151\u1152\u1153\u1154\u1155\u1156\u1157\u1158\u1159\u115F\u1160\u1161\u1162\u1163\u1164\u1165\u1166\u1167\u1168\u1169\u116A\u116B\u116C\u116D\u116E\u116F\u1170\u1171\u1172\u1173\u1174\u1175\u1176\u1177\u1178\u1179\u117A\u117B\u117C\u117D\u117E\u117F\u1180\u1181\u1182\u1183\u1184\u1185\u1186\u1187\u1188\u1189\u118A\u118B\u118C\u118D\u118E\u118F\u1190\u1191\u1192\u1193\u1194\u1195\u1196\u1197\u1198\u1199\u119A\u119B\u119C\u119D\u119E\u119F\u11A0\u11A1\u11A2\u11A8\u11A9\u11AA\u11AB\u11AC\u11AD\u11AE\u11AF\u11B0\u11B1\u11B2\u11B3\u11B4\u11B5\u11B6\u11B7\u11B8\u11B9\u11BA\u11BB\u11BC\u11BD\u11BE\u11BF\u11C0\u11C1\u11C2\u11C3\u11C4\u11C5\u11C6\u11C7\u11C8\u11C9\u11CA\u11CB\u11CC\u11CD\u11CE\u11CF\u11D0\u11D1\u11D2\u11D3\u11D4\u11D5\u11D6\u11D7\u11D8\u11D9\u11DA\u11DB\u11DC\u11DD\u11DE\u11DF\u11E0\u11E1\u11E2\u11E3\u11E4\u11E5\u11E6\u11E7\u11E8\u11E9\u11EA\u11EB\u11EC\u11ED\u11EE\u11EF\u11F0\u11F1\u11F2\u11F3\u11F4\u11F5\u11F6\u11F7\u11F8\u11F9\u1200\u1201\u1202\u1203\u1204\u1205\u1206\u1207\u1208\u1209\u120A\u120B\u120C\u120D\u120E\u120F\u1210\u1211\u1212\u1213\u1214\u1215\u1216\u1217\u1218\u1219\u121A\u121B\u121C\u121D\u121E\u121F\u1220\u1221\u1222\u1223\u1224\u1225\u1226\u1227\u1228\u1229\u122A\u122B\u122C\u122D\u122E\u122F\u1230\u1231\u1232\u1233\u1234\u1235\u1236\u1237\u1238\u1239\u123A\u123B\u123C\u123D\u123E\u123F\u1240\u1241\u1242\u1243\u1244\u1245\u1246\u1247\u1248\u124A\u124B\u124C\u124D\u1250\u1251\u1252\u1253\u1254\u1255\u1256\u1258\u125A\u125B\u125C\u125D\u1260\u1261\u1262\u1263\u1264\u1265\u1266\u1267\u1268\u1269\u126A\u126B\u126C\u126D\u126E\u126F\u1270\u1271\u1272\u1273\u1274\u1275\u1276\u1277\u1278\u1279\u127A\u127B\u127C\u127D\u127E\u127F\u1280\u1281\u1282\u1283\u1284\u1285\u1286\u1287\u1288\u128A\u128B\u128C\u128D\u1290\u1291\u1292\u1293\u1294\u1295\u1296\u1297\u1298\u1299\u129A\u129B\u129C\u129D\u129E\u129F\u12A0\u12A1\u12A2\u12A3\u12A4\u12A5\u12A6\u12A7\u12A8\u12A9\u12AA\u12AB\u12AC\u12AD\u12AE\u12AF\u12B0\u12B2\u12B3\u12B4\u12B5\u12B8\u12B9\u12BA\u12BB\u12BC\u12BD\u12BE\u12C0\u12C2\u12C3\u12C4\u12C5\u12C8\u12C9\u12CA\u12CB\u12CC\u12CD\u12CE\u12CF\u12D0\u12D1\u12D2\u12D3\u12D4\u12D5\u12D6\u12D8\u12D9\u12DA\u12DB\u12DC\u12DD\u12DE\u12DF\u12E0\u12E1\u12E2\u12E3\u12E4\u12E5\u12E6\u12E7\u12E8\u12E9\u12EA\u12EB\u12EC\u12ED\u12EE\u12EF\u12F0\u12F1\u12F2\u12F3\u12F4\u12F5\u12F6\u12F7\u12F8\u12F9\u12FA\u12FB\u12FC\u12FD\u12FE\u12FF\u1300\u1301\u1302\u1303\u1304\u1305\u1306\u1307\u1308\u1309\u130A\u130B\u130C\u130D\u130E\u130F\u1310\u1312\u1313\u1314\u1315\u1318\u1319\u131A\u131B\u131C\u131D\u131E\u131F\u1320\u1321\u1322\u1323\u1324\u1325\u1326\u1327\u1328\u1329\u132A\u132B\u132C\u132D\u132E\u132F\u1330\u1331\u1332\u1333\u1334\u1335\u1336\u1337\u1338\u1339\u133A\u133B\u133C\u133D\u133E\u133F\u1340\u1341\u1342\u1343\u1344\u1345\u1346\u1347\u1348\u1349\u134A\u134B\u134C\u134D\u134E\u134F\u1350\u1351\u1352\u1353\u1354\u1355\u1356\u1357\u1358\u1359\u135A\u1380\u1381\u1382\u1383\u1384\u1385\u1386\u1387\u1388\u1389\u138A\u138B\u138C\u138D\u138E\u138F\u13A0\u13A1\u13A2\u13A3\u13A4\u13A5\u13A6\u13A7\u13A8\u13A9\u13AA\u13AB\u13AC\u13AD\u13AE\u13AF\u13B0\u13B1\u13B2\u13B3\u13B4\u13B5\u13B6\u13B7\u13B8\u13B9\u13BA\u13BB\u13BC\u13BD\u13BE\u13BF\u13C0\u13C1\u13C2\u13C3\u13C4\u13C5\u13C6\u13C7\u13C8\u13C9\u13CA\u13CB\u13CC\u13CD\u13CE\u13CF\u13D0\u13D1\u13D2\u13D3\u13D4\u13D5\u13D6\u13D7\u13D8\u13D9\u13DA\u13DB\u13DC\u13DD\u13DE\u13DF\u13E0\u13E1\u13E2\u13E3\u13E4\u13E5\u13E6\u13E7\u13E8\u13E9\u13EA\u13EB\u13EC\u13ED\u13EE\u13EF\u13F0\u13F1\u13F2\u13F3\u13F4\u1401\u1402\u1403\u1404\u1405\u1406\u1407\u1408\u1409\u140A\u140B\u140C\u140D\u140E\u140F\u1410\u1411\u1412\u1413\u1414\u1415\u1416\u1417\u1418\u1419\u141A\u141B\u141C\u141D\u141E\u141F\u1420\u1421\u1422\u1423\u1424\u1425\u1426\u1427\u1428\u1429\u142A\u142B\u142C\u142D\u142E\u142F\u1430\u1431\u1432\u1433\u1434\u1435\u1436\u1437\u1438\u1439\u143A\u143B\u143C\u143D\u143E\u143F\u1440\u1441\u1442\u1443\u1444\u1445\u1446\u1447\u1448\u1449\u144A\u144B\u144C\u144D\u144E\u144F\u1450\u1451\u1452\u1453\u1454\u1455\u1456\u1457\u1458\u1459\u145A\u145B\u145C\u145D\u145E\u145F\u1460\u1461\u1462\u1463\u1464\u1465\u1466\u1467\u1468\u1469\u146A\u146B\u146C\u146D\u146E\u146F\u1470\u1471\u1472\u1473\u1474\u1475\u1476\u1477\u1478\u1479\u147A\u147B\u147C\u147D\u147E\u147F\u1480\u1481\u1482\u1483\u1484\u1485\u1486\u1487\u1488\u1489\u148A\u148B\u148C\u148D\u148E\u148F\u1490\u1491\u1492\u1493\u1494\u1495\u1496\u1497\u1498\u1499\u149A\u149B\u149C\u149D\u149E\u149F\u14A0\u14A1\u14A2\u14A3\u14A4\u14A5\u14A6\u14A7\u14A8\u14A9\u14AA\u14AB\u14AC\u14AD\u14AE\u14AF\u14B0\u14B1\u14B2\u14B3\u14B4\u14B5\u14B6\u14B7\u14B8\u14B9\u14BA\u14BB\u14BC\u14BD\u14BE\u14BF\u14C0\u14C1\u14C2\u14C3\u14C4\u14C5\u14C6\u14C7\u14C8\u14C9\u14CA\u14CB\u14CC\u14CD\u14CE\u14CF\u14D0\u14D1\u14D2\u14D3\u14D4\u14D5\u14D6\u14D7\u14D8\u14D9\u14DA\u14DB\u14DC\u14DD\u14DE\u14DF\u14E0\u14E1\u14E2\u14E3\u14E4\u14E5\u14E6\u14E7\u14E8\u14E9\u14EA\u14EB\u14EC\u14ED\u14EE\u14EF\u14F0\u14F1\u14F2\u14F3\u14F4\u14F5\u14F6\u14F7\u14F8\u14F9\u14FA\u14FB\u14FC\u14FD\u14FE\u14FF\u1500\u1501\u1502\u1503\u1504\u1505\u1506\u1507\u1508\u1509\u150A\u150B\u150C\u150D\u150E\u150F\u1510\u1511\u1512\u1513\u1514\u1515\u1516\u1517\u1518\u1519\u151A\u151B\u151C\u151D\u151E\u151F\u1520\u1521\u1522\u1523\u1524\u1525\u1526\u1527\u1528\u1529\u152A\u152B\u152C\u152D\u152E\u152F\u1530\u1531\u1532\u1533\u1534\u1535\u1536\u1537\u1538\u1539\u153A\u153B\u153C\u153D\u153E\u153F\u1540\u1541\u1542\u1543\u1544\u1545\u1546\u1547\u1548\u1549\u154A\u154B\u154C\u154D\u154E\u154F\u1550\u1551\u1552\u1553\u1554\u1555\u1556\u1557\u1558\u1559\u155A\u155B\u155C\u155D\u155E\u155F\u1560\u1561\u1562\u1563\u1564\u1565\u1566\u1567\u1568\u1569\u156A\u156B\u156C\u156D\u156E\u156F\u1570\u1571\u1572\u1573\u1574\u1575\u1576\u1577\u1578\u1579\u157A\u157B\u157C\u157D\u157E\u157F\u1580\u1581\u1582\u1583\u1584\u1585\u1586\u1587\u1588\u1589\u158A\u158B\u158C\u158D\u158E\u158F\u1590\u1591\u1592\u1593\u1594\u1595\u1596\u1597\u1598\u1599\u159A\u159B\u159C\u159D\u159E\u159F\u15A0\u15A1\u15A2\u15A3\u15A4\u15A5\u15A6\u15A7\u15A8\u15A9\u15AA\u15AB\u15AC\u15AD\u15AE\u15AF\u15B0\u15B1\u15B2\u15B3\u15B4\u15B5\u15B6\u15B7\u15B8\u15B9\u15BA\u15BB\u15BC\u15BD\u15BE\u15BF\u15C0\u15C1\u15C2\u15C3\u15C4\u15C5\u15C6\u15C7\u15C8\u15C9\u15CA\u15CB\u15CC\u15CD\u15CE\u15CF\u15D0\u15D1\u15D2\u15D3\u15D4\u15D5\u15D6\u15D7\u15D8\u15D9\u15DA\u15DB\u15DC\u15DD\u15DE\u15DF\u15E0\u15E1\u15E2\u15E3\u15E4\u15E5\u15E6\u15E7\u15E8\u15E9\u15EA\u15EB\u15EC\u15ED\u15EE\u15EF\u15F0\u15F1\u15F2\u15F3\u15F4\u15F5\u15F6\u15F7\u15F8\u15F9\u15FA\u15FB\u15FC\u15FD\u15FE\u15FF\u1600\u1601\u1602\u1603\u1604\u1605\u1606\u1607\u1608\u1609\u160A\u160B\u160C\u160D\u160E\u160F\u1610\u1611\u1612\u1613\u1614\u1615\u1616\u1617\u1618\u1619\u161A\u161B\u161C\u161D\u161E\u161F\u1620\u1621\u1622\u1623\u1624\u1625\u1626\u1627\u1628\u1629\u162A\u162B\u162C\u162D\u162E\u162F\u1630\u1631\u1632\u1633\u1634\u1635\u1636\u1637\u1638\u1639\u163A\u163B\u163C\u163D\u163E\u163F\u1640\u1641\u1642\u1643\u1644\u1645\u1646\u1647\u1648\u1649\u164A\u164B\u164C\u164D\u164E\u164F\u1650\u1651\u1652\u1653\u1654\u1655\u1656\u1657\u1658\u1659\u165A\u165B\u165C\u165D\u165E\u165F\u1660\u1661\u1662\u1663\u1664\u1665\u1666\u1667\u1668\u1669\u166A\u166B\u166C\u166F\u1670\u1671\u1672\u1673\u1674\u1675\u1676\u1681\u1682\u1683\u1684\u1685\u1686\u1687\u1688\u1689\u168A\u168B\u168C\u168D\u168E\u168F\u1690\u1691\u1692\u1693\u1694\u1695\u1696\u1697\u1698\u1699\u169A\u16A0\u16A1\u16A2\u16A3\u16A4\u16A5\u16A6\u16A7\u16A8\u16A9\u16AA\u16AB\u16AC\u16AD\u16AE\u16AF\u16B0\u16B1\u16B2\u16B3\u16B4\u16B5\u16B6\u16B7\u16B8\u16B9\u16BA\u16BB\u16BC\u16BD\u16BE\u16BF\u16C0\u16C1\u16C2\u16C3\u16C4\u16C5\u16C6\u16C7\u16C8\u16C9\u16CA\u16CB\u16CC\u16CD\u16CE\u16CF\u16D0\u16D1\u16D2\u16D3\u16D4\u16D5\u16D6\u16D7\u16D8\u16D9\u16DA\u16DB\u16DC\u16DD\u16DE\u16DF\u16E0\u16E1\u16E2\u16E3\u16E4\u16E5\u16E6\u16E7\u16E8\u16E9\u16EA\u1700\u1701\u1702\u1703\u1704\u1705\u1706\u1707\u1708\u1709\u170A\u170B\u170C\u170E\u170F\u1710\u1711\u1720\u1721\u1722\u1723\u1724\u1725\u1726\u1727\u1728\u1729\u172A\u172B\u172C\u172D\u172E\u172F\u1730\u1731\u1740\u1741\u1742\u1743\u1744\u1745\u1746\u1747\u1748\u1749\u174A\u174B\u174C\u174D\u174E\u174F\u1750\u1751\u1760\u1761\u1762\u1763\u1764\u1765\u1766\u1767\u1768\u1769\u176A\u176B\u176C\u176E\u176F\u1770\u1780\u1781\u1782\u1783\u1784\u1785\u1786\u1787\u1788\u1789\u178A\u178B\u178C\u178D\u178E\u178F\u1790\u1791\u1792\u1793\u1794\u1795\u1796\u1797\u1798\u1799\u179A\u179B\u179C\u179D\u179E\u179F\u17A0\u17A1\u17A2\u17A3\u17A4\u17A5\u17A6\u17A7\u17A8\u17A9\u17AA\u17AB\u17AC\u17AD\u17AE\u17AF\u17B0\u17B1\u17B2\u17B3\u17DC\u1820\u1821\u1822\u1823\u1824\u1825\u1826\u1827\u1828\u1829\u182A\u182B\u182C\u182D\u182E\u182F\u1830\u1831\u1832\u1833\u1834\u1835\u1836\u1837\u1838\u1839\u183A\u183B\u183C\u183D\u183E\u183F\u1840\u1841\u1842\u1844\u1845\u1846\u1847\u1848\u1849\u184A\u184B\u184C\u184D\u184E\u184F\u1850\u1851\u1852\u1853\u1854\u1855\u1856\u1857\u1858\u1859\u185A\u185B\u185C\u185D\u185E\u185F\u1860\u1861\u1862\u1863\u1864\u1865\u1866\u1867\u1868\u1869\u186A\u186B\u186C\u186D\u186E\u186F\u1870\u1871\u1872\u1873\u1874\u1875\u1876\u1877\u1880\u1881\u1882\u1883\u1884\u1885\u1886\u1887\u1888\u1889\u188A\u188B\u188C\u188D\u188E\u188F\u1890\u1891\u1892\u1893\u1894\u1895\u1896\u1897\u1898\u1899\u189A\u189B\u189C\u189D\u189E\u189F\u18A0\u18A1\u18A2\u18A3\u18A4\u18A5\u18A6\u18A7\u18A8\u18AA\u1900\u1901\u1902\u1903\u1904\u1905\u1906\u1907\u1908\u1909\u190A\u190B\u190C\u190D\u190E\u190F\u1910\u1911\u1912\u1913\u1914\u1915\u1916\u1917\u1918\u1919\u191A\u191B\u191C\u1950\u1951\u1952\u1953\u1954\u1955\u1956\u1957\u1958\u1959\u195A\u195B\u195C\u195D\u195E\u195F\u1960\u1961\u1962\u1963\u1964\u1965\u1966\u1967\u1968\u1969\u196A\u196B\u196C\u196D\u1970\u1971\u1972\u1973\u1974\u1980\u1981\u1982\u1983\u1984\u1985\u1986\u1987\u1988\u1989\u198A\u198B\u198C\u198D\u198E\u198F\u1990\u1991\u1992\u1993\u1994\u1995\u1996\u1997\u1998\u1999\u199A\u199B\u199C\u199D\u199E\u199F\u19A0\u19A1\u19A2\u19A3\u19A4\u19A5\u19A6\u19A7\u19A8\u19A9\u19C1\u19C2\u19C3\u19C4\u19C5\u19C6\u19C7\u1A00\u1A01\u1A02\u1A03\u1A04\u1A05\u1A06\u1A07\u1A08\u1A09\u1A0A\u1A0B\u1A0C\u1A0D\u1A0E\u1A0F\u1A10\u1A11\u1A12\u1A13\u1A14\u1A15\u1A16\u1B05\u1B06\u1B07\u1B08\u1B09\u1B0A\u1B0B\u1B0C\u1B0D\u1B0E\u1B0F\u1B10\u1B11\u1B12\u1B13\u1B14\u1B15\u1B16\u1B17\u1B18\u1B19\u1B1A\u1B1B\u1B1C\u1B1D\u1B1E\u1B1F\u1B20\u1B21\u1B22\u1B23\u1B24\u1B25\u1B26\u1B27\u1B28\u1B29\u1B2A\u1B2B\u1B2C\u1B2D\u1B2E\u1B2F\u1B30\u1B31\u1B32\u1B33\u1B45\u1B46\u1B47\u1B48\u1B49\u1B4A\u1B4B\u1B83\u1B84\u1B85\u1B86\u1B87\u1B88\u1B89\u1B8A\u1B8B\u1B8C\u1B8D\u1B8E\u1B8F\u1B90\u1B91\u1B92\u1B93\u1B94\u1B95\u1B96\u1B97\u1B98\u1B99\u1B9A\u1B9B\u1B9C\u1B9D\u1B9E\u1B9F\u1BA0\u1BAE\u1BAF\u1C00\u1C01\u1C02\u1C03\u1C04\u1C05\u1C06\u1C07\u1C08\u1C09\u1C0A\u1C0B\u1C0C\u1C0D\u1C0E\u1C0F\u1C10\u1C11\u1C12\u1C13\u1C14\u1C15\u1C16\u1C17\u1C18\u1C19\u1C1A\u1C1B\u1C1C\u1C1D\u1C1E\u1C1F\u1C20\u1C21\u1C22\u1C23\u1C4D\u1C4E\u1C4F\u1C5A\u1C5B\u1C5C\u1C5D\u1C5E\u1C5F\u1C60\u1C61\u1C62\u1C63\u1C64\u1C65\u1C66\u1C67\u1C68\u1C69\u1C6A\u1C6B\u1C6C\u1C6D\u1C6E\u1C6F\u1C70\u1C71\u1C72\u1C73\u1C74\u1C75\u1C76\u1C77\u2135\u2136\u2137\u2138\u2D30\u2D31\u2D32\u2D33\u2D34\u2D35\u2D36\u2D37\u2D38\u2D39\u2D3A\u2D3B\u2D3C\u2D3D\u2D3E\u2D3F\u2D40\u2D41\u2D42\u2D43\u2D44\u2D45\u2D46\u2D47\u2D48\u2D49\u2D4A\u2D4B\u2D4C\u2D4D\u2D4E\u2D4F\u2D50\u2D51\u2D52\u2D53\u2D54\u2D55\u2D56\u2D57\u2D58\u2D59\u2D5A\u2D5B\u2D5C\u2D5D\u2D5E\u2D5F\u2D60\u2D61\u2D62\u2D63\u2D64\u2D65\u2D80\u2D81\u2D82\u2D83\u2D84\u2D85\u2D86\u2D87\u2D88\u2D89\u2D8A\u2D8B\u2D8C\u2D8D\u2D8E\u2D8F\u2D90\u2D91\u2D92\u2D93\u2D94\u2D95\u2D96\u2DA0\u2DA1\u2DA2\u2DA3\u2DA4\u2DA5\u2DA6\u2DA8\u2DA9\u2DAA\u2DAB\u2DAC\u2DAD\u2DAE\u2DB0\u2DB1\u2DB2\u2DB3\u2DB4\u2DB5\u2DB6\u2DB8\u2DB9\u2DBA\u2DBB\u2DBC\u2DBD\u2DBE\u2DC0\u2DC1\u2DC2\u2DC3\u2DC4\u2DC5\u2DC6\u2DC8\u2DC9\u2DCA\u2DCB\u2DCC\u2DCD\u2DCE\u2DD0\u2DD1\u2DD2\u2DD3\u2DD4\u2DD5\u2DD6\u2DD8\u2DD9\u2DDA\u2DDB\u2DDC\u2DDD\u2DDE\u3006\u303C\u3041\u3042\u3043\u3044\u3045\u3046\u3047\u3048\u3049\u304A\u304B\u304C\u304D\u304E\u304F\u3050\u3051\u3052\u3053\u3054\u3055\u3056\u3057\u3058\u3059\u305A\u305B\u305C\u305D\u305E\u305F\u3060\u3061\u3062\u3063\u3064\u3065\u3066\u3067\u3068\u3069\u306A\u306B\u306C\u306D\u306E\u306F\u3070\u3071\u3072\u3073\u3074\u3075\u3076\u3077\u3078\u3079\u307A\u307B\u307C\u307D\u307E\u307F\u3080\u3081\u3082\u3083\u3084\u3085\u3086\u3087\u3088\u3089\u308A\u308B\u308C\u308D\u308E\u308F\u3090\u3091\u3092\u3093\u3094\u3095\u3096\u309F\u30A1\u30A2\u30A3\u30A4\u30A5\u30A6\u30A7\u30A8\u30A9\u30AA\u30AB\u30AC\u30AD\u30AE\u30AF\u30B0\u30B1\u30B2\u30B3\u30B4\u30B5\u30B6\u30B7\u30B8\u30B9\u30BA\u30BB\u30BC\u30BD\u30BE\u30BF\u30C0\u30C1\u30C2\u30C3\u30C4\u30C5\u30C6\u30C7\u30C8\u30C9\u30CA\u30CB\u30CC\u30CD\u30CE\u30CF\u30D0\u30D1\u30D2\u30D3\u30D4\u30D5\u30D6\u30D7\u30D8\u30D9\u30DA\u30DB\u30DC\u30DD\u30DE\u30DF\u30E0\u30E1\u30E2\u30E3\u30E4\u30E5\u30E6\u30E7\u30E8\u30E9\u30EA\u30EB\u30EC\u30ED\u30EE\u30EF\u30F0\u30F1\u30F2\u30F3\u30F4\u30F5\u30F6\u30F7\u30F8\u30F9\u30FA\u30FF\u3105\u3106\u3107\u3108\u3109\u310A\u310B\u310C\u310D\u310E\u310F\u3110\u3111\u3112\u3113\u3114\u3115\u3116\u3117\u3118\u3119\u311A\u311B\u311C\u311D\u311E\u311F\u3120\u3121\u3122\u3123\u3124\u3125\u3126\u3127\u3128\u3129\u312A\u312B\u312C\u312D\u3131\u3132\u3133\u3134\u3135\u3136\u3137\u3138\u3139\u313A\u313B\u313C\u313D\u313E\u313F\u3140\u3141\u3142\u3143\u3144\u3145\u3146\u3147\u3148\u3149\u314A\u314B\u314C\u314D\u314E\u314F\u3150\u3151\u3152\u3153\u3154\u3155\u3156\u3157\u3158\u3159\u315A\u315B\u315C\u315D\u315E\u315F\u3160\u3161\u3162\u3163\u3164\u3165\u3166\u3167\u3168\u3169\u316A\u316B\u316C\u316D\u316E\u316F\u3170\u3171\u3172\u3173\u3174\u3175\u3176\u3177\u3178\u3179\u317A\u317B\u317C\u317D\u317E\u317F\u3180\u3181\u3182\u3183\u3184\u3185\u3186\u3187\u3188\u3189\u318A\u318B\u318C\u318D\u318E\u31A0\u31A1\u31A2\u31A3\u31A4\u31A5\u31A6\u31A7\u31A8\u31A9\u31AA\u31AB\u31AC\u31AD\u31AE\u31AF\u31B0\u31B1\u31B2\u31B3\u31B4\u31B5\u31B6\u31B7\u31F0\u31F1\u31F2\u31F3\u31F4\u31F5\u31F6\u31F7\u31F8\u31F9\u31FA\u31FB\u31FC\u31FD\u31FE\u31FF\u3400\u4DB5\u4E00\u9FC3\uA000\uA001\uA002\uA003\uA004\uA005\uA006\uA007\uA008\uA009\uA00A\uA00B\uA00C\uA00D\uA00E\uA00F\uA010\uA011\uA012\uA013\uA014\uA016\uA017\uA018\uA019\uA01A\uA01B\uA01C\uA01D\uA01E\uA01F\uA020\uA021\uA022\uA023\uA024\uA025\uA026\uA027\uA028\uA029\uA02A\uA02B\uA02C\uA02D\uA02E\uA02F\uA030\uA031\uA032\uA033\uA034\uA035\uA036\uA037\uA038\uA039\uA03A\uA03B\uA03C\uA03D\uA03E\uA03F\uA040\uA041\uA042\uA043\uA044\uA045\uA046\uA047\uA048\uA049\uA04A\uA04B\uA04C\uA04D\uA04E\uA04F\uA050\uA051\uA052\uA053\uA054\uA055\uA056\uA057\uA058\uA059\uA05A\uA05B\uA05C\uA05D\uA05E\uA05F\uA060\uA061\uA062\uA063\uA064\uA065\uA066\uA067\uA068\uA069\uA06A\uA06B\uA06C\uA06D\uA06E\uA06F\uA070\uA071\uA072\uA073\uA074\uA075\uA076\uA077\uA078\uA079\uA07A\uA07B\uA07C\uA07D\uA07E\uA07F\uA080\uA081\uA082\uA083\uA084\uA085\uA086\uA087\uA088\uA089\uA08A\uA08B\uA08C\uA08D\uA08E\uA08F\uA090\uA091\uA092\uA093\uA094\uA095\uA096\uA097\uA098\uA099\uA09A\uA09B\uA09C\uA09D\uA09E\uA09F\uA0A0\uA0A1\uA0A2\uA0A3\uA0A4\uA0A5\uA0A6\uA0A7\uA0A8\uA0A9\uA0AA\uA0AB\uA0AC\uA0AD\uA0AE\uA0AF\uA0B0\uA0B1\uA0B2\uA0B3\uA0B4\uA0B5\uA0B6\uA0B7\uA0B8\uA0B9\uA0BA\uA0BB\uA0BC\uA0BD\uA0BE\uA0BF\uA0C0\uA0C1\uA0C2\uA0C3\uA0C4\uA0C5\uA0C6\uA0C7\uA0C8\uA0C9\uA0CA\uA0CB\uA0CC\uA0CD\uA0CE\uA0CF\uA0D0\uA0D1\uA0D2\uA0D3\uA0D4\uA0D5\uA0D6\uA0D7\uA0D8\uA0D9\uA0DA\uA0DB\uA0DC\uA0DD\uA0DE\uA0DF\uA0E0\uA0E1\uA0E2\uA0E3\uA0E4\uA0E5\uA0E6\uA0E7\uA0E8\uA0E9\uA0EA\uA0EB\uA0EC\uA0ED\uA0EE\uA0EF\uA0F0\uA0F1\uA0F2\uA0F3\uA0F4\uA0F5\uA0F6\uA0F7\uA0F8\uA0F9\uA0FA\uA0FB\uA0FC\uA0FD\uA0FE\uA0FF\uA100\uA101\uA102\uA103\uA104\uA105\uA106\uA107\uA108\uA109\uA10A\uA10B\uA10C\uA10D\uA10E\uA10F\uA110\uA111\uA112\uA113\uA114\uA115\uA116\uA117\uA118\uA119\uA11A\uA11B\uA11C\uA11D\uA11E\uA11F\uA120\uA121\uA122\uA123\uA124\uA125\uA126\uA127\uA128\uA129\uA12A\uA12B\uA12C\uA12D\uA12E\uA12F\uA130\uA131\uA132\uA133\uA134\uA135\uA136\uA137\uA138\uA139\uA13A\uA13B\uA13C\uA13D\uA13E\uA13F\uA140\uA141\uA142\uA143\uA144\uA145\uA146\uA147\uA148\uA149\uA14A\uA14B\uA14C\uA14D\uA14E\uA14F\uA150\uA151\uA152\uA153\uA154\uA155\uA156\uA157\uA158\uA159\uA15A\uA15B\uA15C\uA15D\uA15E\uA15F\uA160\uA161\uA162\uA163\uA164\uA165\uA166\uA167\uA168\uA169\uA16A\uA16B\uA16C\uA16D\uA16E\uA16F\uA170\uA171\uA172\uA173\uA174\uA175\uA176\uA177\uA178\uA179\uA17A\uA17B\uA17C\uA17D\uA17E\uA17F\uA180\uA181\uA182\uA183\uA184\uA185\uA186\uA187\uA188\uA189\uA18A\uA18B\uA18C\uA18D\uA18E\uA18F\uA190\uA191\uA192\uA193\uA194\uA195\uA196\uA197\uA198\uA199\uA19A\uA19B\uA19C\uA19D\uA19E\uA19F\uA1A0\uA1A1\uA1A2\uA1A3\uA1A4\uA1A5\uA1A6\uA1A7\uA1A8\uA1A9\uA1AA\uA1AB\uA1AC\uA1AD\uA1AE\uA1AF\uA1B0\uA1B1\uA1B2\uA1B3\uA1B4\uA1B5\uA1B6\uA1B7\uA1B8\uA1B9\uA1BA\uA1BB\uA1BC\uA1BD\uA1BE\uA1BF\uA1C0\uA1C1\uA1C2\uA1C3\uA1C4\uA1C5\uA1C6\uA1C7\uA1C8\uA1C9\uA1CA\uA1CB\uA1CC\uA1CD\uA1CE\uA1CF\uA1D0\uA1D1\uA1D2\uA1D3\uA1D4\uA1D5\uA1D6\uA1D7\uA1D8\uA1D9\uA1DA\uA1DB\uA1DC\uA1DD\uA1DE\uA1DF\uA1E0\uA1E1\uA1E2\uA1E3\uA1E4\uA1E5\uA1E6\uA1E7\uA1E8\uA1E9\uA1EA\uA1EB\uA1EC\uA1ED\uA1EE\uA1EF\uA1F0\uA1F1\uA1F2\uA1F3\uA1F4\uA1F5\uA1F6\uA1F7\uA1F8\uA1F9\uA1FA\uA1FB\uA1FC\uA1FD\uA1FE\uA1FF\uA200\uA201\uA202\uA203\uA204\uA205\uA206\uA207\uA208\uA209\uA20A\uA20B\uA20C\uA20D\uA20E\uA20F\uA210\uA211\uA212\uA213\uA214\uA215\uA216\uA217\uA218\uA219\uA21A\uA21B\uA21C\uA21D\uA21E\uA21F\uA220\uA221\uA222\uA223\uA224\uA225\uA226\uA227\uA228\uA229\uA22A\uA22B\uA22C\uA22D\uA22E\uA22F\uA230\uA231\uA232\uA233\uA234\uA235\uA236\uA237\uA238\uA239\uA23A\uA23B\uA23C\uA23D\uA23E\uA23F\uA240\uA241\uA242\uA243\uA244\uA245\uA246\uA247\uA248\uA249\uA24A\uA24B\uA24C\uA24D\uA24E\uA24F\uA250\uA251\uA252\uA253\uA254\uA255\uA256\uA257\uA258\uA259\uA25A\uA25B\uA25C\uA25D\uA25E\uA25F\uA260\uA261\uA262\uA263\uA264\uA265\uA266\uA267\uA268\uA269\uA26A\uA26B\uA26C\uA26D\uA26E\uA26F\uA270\uA271\uA272\uA273\uA274\uA275\uA276\uA277\uA278\uA279\uA27A\uA27B\uA27C\uA27D\uA27E\uA27F\uA280\uA281\uA282\uA283\uA284\uA285\uA286\uA287\uA288\uA289\uA28A\uA28B\uA28C\uA28D\uA28E\uA28F\uA290\uA291\uA292\uA293\uA294\uA295\uA296\uA297\uA298\uA299\uA29A\uA29B\uA29C\uA29D\uA29E\uA29F\uA2A0\uA2A1\uA2A2\uA2A3\uA2A4\uA2A5\uA2A6\uA2A7\uA2A8\uA2A9\uA2AA\uA2AB\uA2AC\uA2AD\uA2AE\uA2AF\uA2B0\uA2B1\uA2B2\uA2B3\uA2B4\uA2B5\uA2B6\uA2B7\uA2B8\uA2B9\uA2BA\uA2BB\uA2BC\uA2BD\uA2BE\uA2BF\uA2C0\uA2C1\uA2C2\uA2C3\uA2C4\uA2C5\uA2C6\uA2C7\uA2C8\uA2C9\uA2CA\uA2CB\uA2CC\uA2CD\uA2CE\uA2CF\uA2D0\uA2D1\uA2D2\uA2D3\uA2D4\uA2D5\uA2D6\uA2D7\uA2D8\uA2D9\uA2DA\uA2DB\uA2DC\uA2DD\uA2DE\uA2DF\uA2E0\uA2E1\uA2E2\uA2E3\uA2E4\uA2E5\uA2E6\uA2E7\uA2E8\uA2E9\uA2EA\uA2EB\uA2EC\uA2ED\uA2EE\uA2EF\uA2F0\uA2F1\uA2F2\uA2F3\uA2F4\uA2F5\uA2F6\uA2F7\uA2F8\uA2F9\uA2FA\uA2FB\uA2FC\uA2FD\uA2FE\uA2FF\uA300\uA301\uA302\uA303\uA304\uA305\uA306\uA307\uA308\uA309\uA30A\uA30B\uA30C\uA30D\uA30E\uA30F\uA310\uA311\uA312\uA313\uA314\uA315\uA316\uA317\uA318\uA319\uA31A\uA31B\uA31C\uA31D\uA31E\uA31F\uA320\uA321\uA322\uA323\uA324\uA325\uA326\uA327\uA328\uA329\uA32A\uA32B\uA32C\uA32D\uA32E\uA32F\uA330\uA331\uA332\uA333\uA334\uA335\uA336\uA337\uA338\uA339\uA33A\uA33B\uA33C\uA33D\uA33E\uA33F\uA340\uA341\uA342\uA343\uA344\uA345\uA346\uA347\uA348\uA349\uA34A\uA34B\uA34C\uA34D\uA34E\uA34F\uA350\uA351\uA352\uA353\uA354\uA355\uA356\uA357\uA358\uA359\uA35A\uA35B\uA35C\uA35D\uA35E\uA35F\uA360\uA361\uA362\uA363\uA364\uA365\uA366\uA367\uA368\uA369\uA36A\uA36B\uA36C\uA36D\uA36E\uA36F\uA370\uA371\uA372\uA373\uA374\uA375\uA376\uA377\uA378\uA379\uA37A\uA37B\uA37C\uA37D\uA37E\uA37F\uA380\uA381\uA382\uA383\uA384\uA385\uA386\uA387\uA388\uA389\uA38A\uA38B\uA38C\uA38D\uA38E\uA38F\uA390\uA391\uA392\uA393\uA394\uA395\uA396\uA397\uA398\uA399\uA39A\uA39B\uA39C\uA39D\uA39E\uA39F\uA3A0\uA3A1\uA3A2\uA3A3\uA3A4\uA3A5\uA3A6\uA3A7\uA3A8\uA3A9\uA3AA\uA3AB\uA3AC\uA3AD\uA3AE\uA3AF\uA3B0\uA3B1\uA3B2\uA3B3\uA3B4\uA3B5\uA3B6\uA3B7\uA3B8\uA3B9\uA3BA\uA3BB\uA3BC\uA3BD\uA3BE\uA3BF\uA3C0\uA3C1\uA3C2\uA3C3\uA3C4\uA3C5\uA3C6\uA3C7\uA3C8\uA3C9\uA3CA\uA3CB\uA3CC\uA3CD\uA3CE\uA3CF\uA3D0\uA3D1\uA3D2\uA3D3\uA3D4\uA3D5\uA3D6\uA3D7\uA3D8\uA3D9\uA3DA\uA3DB\uA3DC\uA3DD\uA3DE\uA3DF\uA3E0\uA3E1\uA3E2\uA3E3\uA3E4\uA3E5\uA3E6\uA3E7\uA3E8\uA3E9\uA3EA\uA3EB\uA3EC\uA3ED\uA3EE\uA3EF\uA3F0\uA3F1\uA3F2\uA3F3\uA3F4\uA3F5\uA3F6\uA3F7\uA3F8\uA3F9\uA3FA\uA3FB\uA3FC\uA3FD\uA3FE\uA3FF\uA400\uA401\uA402\uA403\uA404\uA405\uA406\uA407\uA408\uA409\uA40A\uA40B\uA40C\uA40D\uA40E\uA40F\uA410\uA411\uA412\uA413\uA414\uA415\uA416\uA417\uA418\uA419\uA41A\uA41B\uA41C\uA41D\uA41E\uA41F\uA420\uA421\uA422\uA423\uA424\uA425\uA426\uA427\uA428\uA429\uA42A\uA42B\uA42C\uA42D\uA42E\uA42F\uA430\uA431\uA432\uA433\uA434\uA435\uA436\uA437\uA438\uA439\uA43A\uA43B\uA43C\uA43D\uA43E\uA43F\uA440\uA441\uA442\uA443\uA444\uA445\uA446\uA447\uA448\uA449\uA44A\uA44B\uA44C\uA44D\uA44E\uA44F\uA450\uA451\uA452\uA453\uA454\uA455\uA456\uA457\uA458\uA459\uA45A\uA45B\uA45C\uA45D\uA45E\uA45F\uA460\uA461\uA462\uA463\uA464\uA465\uA466\uA467\uA468\uA469\uA46A\uA46B\uA46C\uA46D\uA46E\uA46F\uA470\uA471\uA472\uA473\uA474\uA475\uA476\uA477\uA478\uA479\uA47A\uA47B\uA47C\uA47D\uA47E\uA47F\uA480\uA481\uA482\uA483\uA484\uA485\uA486\uA487\uA488\uA489\uA48A\uA48B\uA48C\uA500\uA501\uA502\uA503\uA504\uA505\uA506\uA507\uA508\uA509\uA50A\uA50B\uA50C\uA50D\uA50E\uA50F\uA510\uA511\uA512\uA513\uA514\uA515\uA516\uA517\uA518\uA519\uA51A\uA51B\uA51C\uA51D\uA51E\uA51F\uA520\uA521\uA522\uA523\uA524\uA525\uA526\uA527\uA528\uA529\uA52A\uA52B\uA52C\uA52D\uA52E\uA52F\uA530\uA531\uA532\uA533\uA534\uA535\uA536\uA537\uA538\uA539\uA53A\uA53B\uA53C\uA53D\uA53E\uA53F\uA540\uA541\uA542\uA543\uA544\uA545\uA546\uA547\uA548\uA549\uA54A\uA54B\uA54C\uA54D\uA54E\uA54F\uA550\uA551\uA552\uA553\uA554\uA555\uA556\uA557\uA558\uA559\uA55A\uA55B\uA55C\uA55D\uA55E\uA55F\uA560\uA561\uA562\uA563\uA564\uA565\uA566\uA567\uA568\uA569\uA56A\uA56B\uA56C\uA56D\uA56E\uA56F\uA570\uA571\uA572\uA573\uA574\uA575\uA576\uA577\uA578\uA579\uA57A\uA57B\uA57C\uA57D\uA57E\uA57F\uA580\uA581\uA582\uA583\uA584\uA585\uA586\uA587\uA588\uA589\uA58A\uA58B\uA58C\uA58D\uA58E\uA58F\uA590\uA591\uA592\uA593\uA594\uA595\uA596\uA597\uA598\uA599\uA59A\uA59B\uA59C\uA59D\uA59E\uA59F\uA5A0\uA5A1\uA5A2\uA5A3\uA5A4\uA5A5\uA5A6\uA5A7\uA5A8\uA5A9\uA5AA\uA5AB\uA5AC\uA5AD\uA5AE\uA5AF\uA5B0\uA5B1\uA5B2\uA5B3\uA5B4\uA5B5\uA5B6\uA5B7\uA5B8\uA5B9\uA5BA\uA5BB\uA5BC\uA5BD\uA5BE\uA5BF\uA5C0\uA5C1\uA5C2\uA5C3\uA5C4\uA5C5\uA5C6\uA5C7\uA5C8\uA5C9\uA5CA\uA5CB\uA5CC\uA5CD\uA5CE\uA5CF\uA5D0\uA5D1\uA5D2\uA5D3\uA5D4\uA5D5\uA5D6\uA5D7\uA5D8\uA5D9\uA5DA\uA5DB\uA5DC\uA5DD\uA5DE\uA5DF\uA5E0\uA5E1\uA5E2\uA5E3\uA5E4\uA5E5\uA5E6\uA5E7\uA5E8\uA5E9\uA5EA\uA5EB\uA5EC\uA5ED\uA5EE\uA5EF\uA5F0\uA5F1\uA5F2\uA5F3\uA5F4\uA5F5\uA5F6\uA5F7\uA5F8\uA5F9\uA5FA\uA5FB\uA5FC\uA5FD\uA5FE\uA5FF\uA600\uA601\uA602\uA603\uA604\uA605\uA606\uA607\uA608\uA609\uA60A\uA60B\uA610\uA611\uA612\uA613\uA614\uA615\uA616\uA617\uA618\uA619\uA61A\uA61B\uA61C\uA61D\uA61E\uA61F\uA62A\uA62B\uA66E\uA7FB\uA7FC\uA7FD\uA7FE\uA7FF\uA800\uA801\uA803\uA804\uA805\uA807\uA808\uA809\uA80A\uA80C\uA80D\uA80E\uA80F\uA810\uA811\uA812\uA813\uA814\uA815\uA816\uA817\uA818\uA819\uA81A\uA81B\uA81C\uA81D\uA81E\uA81F\uA820\uA821\uA822\uA840\uA841\uA842\uA843\uA844\uA845\uA846\uA847\uA848\uA849\uA84A\uA84B\uA84C\uA84D\uA84E\uA84F\uA850\uA851\uA852\uA853\uA854\uA855\uA856\uA857\uA858\uA859\uA85A\uA85B\uA85C\uA85D\uA85E\uA85F\uA860\uA861\uA862\uA863\uA864\uA865\uA866\uA867\uA868\uA869\uA86A\uA86B\uA86C\uA86D\uA86E\uA86F\uA870\uA871\uA872\uA873\uA882\uA883\uA884\uA885\uA886\uA887\uA888\uA889\uA88A\uA88B\uA88C\uA88D\uA88E\uA88F\uA890\uA891\uA892\uA893\uA894\uA895\uA896\uA897\uA898\uA899\uA89A\uA89B\uA89C\uA89D\uA89E\uA89F\uA8A0\uA8A1\uA8A2\uA8A3\uA8A4\uA8A5\uA8A6\uA8A7\uA8A8\uA8A9\uA8AA\uA8AB\uA8AC\uA8AD\uA8AE\uA8AF\uA8B0\uA8B1\uA8B2\uA8B3\uA90A\uA90B\uA90C\uA90D\uA90E\uA90F\uA910\uA911\uA912\uA913\uA914\uA915\uA916\uA917\uA918\uA919\uA91A\uA91B\uA91C\uA91D\uA91E\uA91F\uA920\uA921\uA922\uA923\uA924\uA925\uA930\uA931\uA932\uA933\uA934\uA935\uA936\uA937\uA938\uA939\uA93A\uA93B\uA93C\uA93D\uA93E\uA93F\uA940\uA941\uA942\uA943\uA944\uA945\uA946\uAA00\uAA01\uAA02\uAA03\uAA04\uAA05\uAA06\uAA07\uAA08\uAA09\uAA0A\uAA0B\uAA0C\uAA0D\uAA0E\uAA0F\uAA10\uAA11\uAA12\uAA13\uAA14\uAA15\uAA16\uAA17\uAA18\uAA19\uAA1A\uAA1B\uAA1C\uAA1D\uAA1E\uAA1F\uAA20\uAA21\uAA22\uAA23\uAA24\uAA25\uAA26\uAA27\uAA28\uAA40\uAA41\uAA42\uAA44\uAA45\uAA46\uAA47\uAA48\uAA49\uAA4A\uAA4B\uAC00\uD7A3\uF900\uF901\uF902\uF903\uF904\uF905\uF906\uF907\uF908\uF909\uF90A\uF90B\uF90C\uF90D\uF90E\uF90F\uF910\uF911\uF912\uF913\uF914\uF915\uF916\uF917\uF918\uF919\uF91A\uF91B\uF91C\uF91D\uF91E\uF91F\uF920\uF921\uF922\uF923\uF924\uF925\uF926\uF927\uF928\uF929\uF92A\uF92B\uF92C\uF92D\uF92E\uF92F\uF930\uF931\uF932\uF933\uF934\uF935\uF936\uF937\uF938\uF939\uF93A\uF93B\uF93C\uF93D\uF93E\uF93F\uF940\uF941\uF942\uF943\uF944\uF945\uF946\uF947\uF948\uF949\uF94A\uF94B\uF94C\uF94D\uF94E\uF94F\uF950\uF951\uF952\uF953\uF954\uF955\uF956\uF957\uF958\uF959\uF95A\uF95B\uF95C\uF95D\uF95E\uF95F\uF960\uF961\uF962\uF963\uF964\uF965\uF966\uF967\uF968\uF969\uF96A\uF96B\uF96C\uF96D\uF96E\uF96F\uF970\uF971\uF972\uF973\uF974\uF975\uF976\uF977\uF978\uF979\uF97A\uF97B\uF97C\uF97D\uF97E\uF97F\uF980\uF981\uF982\uF983\uF984\uF985\uF986\uF987\uF988\uF989\uF98A\uF98B\uF98C\uF98D\uF98E\uF98F\uF990\uF991\uF992\uF993\uF994\uF995\uF996\uF997\uF998\uF999\uF99A\uF99B\uF99C\uF99D\uF99E\uF99F\uF9A0\uF9A1\uF9A2\uF9A3\uF9A4\uF9A5\uF9A6\uF9A7\uF9A8\uF9A9\uF9AA\uF9AB\uF9AC\uF9AD\uF9AE\uF9AF\uF9B0\uF9B1\uF9B2\uF9B3\uF9B4\uF9B5\uF9B6\uF9B7\uF9B8\uF9B9\uF9BA\uF9BB\uF9BC\uF9BD\uF9BE\uF9BF\uF9C0\uF9C1\uF9C2\uF9C3\uF9C4\uF9C5\uF9C6\uF9C7\uF9C8\uF9C9\uF9CA\uF9CB\uF9CC\uF9CD\uF9CE\uF9CF\uF9D0\uF9D1\uF9D2\uF9D3\uF9D4\uF9D5\uF9D6\uF9D7\uF9D8\uF9D9\uF9DA\uF9DB\uF9DC\uF9DD\uF9DE\uF9DF\uF9E0\uF9E1\uF9E2\uF9E3\uF9E4\uF9E5\uF9E6\uF9E7\uF9E8\uF9E9\uF9EA\uF9EB\uF9EC\uF9ED\uF9EE\uF9EF\uF9F0\uF9F1\uF9F2\uF9F3\uF9F4\uF9F5\uF9F6\uF9F7\uF9F8\uF9F9\uF9FA\uF9FB\uF9FC\uF9FD\uF9FE\uF9FF\uFA00\uFA01\uFA02\uFA03\uFA04\uFA05\uFA06\uFA07\uFA08\uFA09\uFA0A\uFA0B\uFA0C\uFA0D\uFA0E\uFA0F\uFA10\uFA11\uFA12\uFA13\uFA14\uFA15\uFA16\uFA17\uFA18\uFA19\uFA1A\uFA1B\uFA1C\uFA1D\uFA1E\uFA1F\uFA20\uFA21\uFA22\uFA23\uFA24\uFA25\uFA26\uFA27\uFA28\uFA29\uFA2A\uFA2B\uFA2C\uFA2D\uFA30\uFA31\uFA32\uFA33\uFA34\uFA35\uFA36\uFA37\uFA38\uFA39\uFA3A\uFA3B\uFA3C\uFA3D\uFA3E\uFA3F\uFA40\uFA41\uFA42\uFA43\uFA44\uFA45\uFA46\uFA47\uFA48\uFA49\uFA4A\uFA4B\uFA4C\uFA4D\uFA4E\uFA4F\uFA50\uFA51\uFA52\uFA53\uFA54\uFA55\uFA56\uFA57\uFA58\uFA59\uFA5A\uFA5B\uFA5C\uFA5D\uFA5E\uFA5F\uFA60\uFA61\uFA62\uFA63\uFA64\uFA65\uFA66\uFA67\uFA68\uFA69\uFA6A\uFA70\uFA71\uFA72\uFA73\uFA74\uFA75\uFA76\uFA77\uFA78\uFA79\uFA7A\uFA7B\uFA7C\uFA7D\uFA7E\uFA7F\uFA80\uFA81\uFA82\uFA83\uFA84\uFA85\uFA86\uFA87\uFA88\uFA89\uFA8A\uFA8B\uFA8C\uFA8D\uFA8E\uFA8F\uFA90\uFA91\uFA92\uFA93\uFA94\uFA95\uFA96\uFA97\uFA98\uFA99\uFA9A\uFA9B\uFA9C\uFA9D\uFA9E\uFA9F\uFAA0\uFAA1\uFAA2\uFAA3\uFAA4\uFAA5\uFAA6\uFAA7\uFAA8\uFAA9\uFAAA\uFAAB\uFAAC\uFAAD\uFAAE\uFAAF\uFAB0\uFAB1\uFAB2\uFAB3\uFAB4\uFAB5\uFAB6\uFAB7\uFAB8\uFAB9\uFABA\uFABB\uFABC\uFABD\uFABE\uFABF\uFAC0\uFAC1\uFAC2\uFAC3\uFAC4\uFAC5\uFAC6\uFAC7\uFAC8\uFAC9\uFACA\uFACB\uFACC\uFACD\uFACE\uFACF\uFAD0\uFAD1\uFAD2\uFAD3\uFAD4\uFAD5\uFAD6\uFAD7\uFAD8\uFAD9\uFB1D\uFB1F\uFB20\uFB21\uFB22\uFB23\uFB24\uFB25\uFB26\uFB27\uFB28\uFB2A\uFB2B\uFB2C\uFB2D\uFB2E\uFB2F\uFB30\uFB31\uFB32\uFB33\uFB34\uFB35\uFB36\uFB38\uFB39\uFB3A\uFB3B\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46\uFB47\uFB48\uFB49\uFB4A\uFB4B\uFB4C\uFB4D\uFB4E\uFB4F\uFB50\uFB51\uFB52\uFB53\uFB54\uFB55\uFB56\uFB57\uFB58\uFB59\uFB5A\uFB5B\uFB5C\uFB5D\uFB5E\uFB5F\uFB60\uFB61\uFB62\uFB63\uFB64\uFB65\uFB66\uFB67\uFB68\uFB69\uFB6A\uFB6B\uFB6C\uFB6D\uFB6E\uFB6F\uFB70\uFB71\uFB72\uFB73\uFB74\uFB75\uFB76\uFB77\uFB78\uFB79\uFB7A\uFB7B\uFB7C\uFB7D\uFB7E\uFB7F\uFB80\uFB81\uFB82\uFB83\uFB84\uFB85\uFB86\uFB87\uFB88\uFB89\uFB8A\uFB8B\uFB8C\uFB8D\uFB8E\uFB8F\uFB90\uFB91\uFB92\uFB93\uFB94\uFB95\uFB96\uFB97\uFB98\uFB99\uFB9A\uFB9B\uFB9C\uFB9D\uFB9E\uFB9F\uFBA0\uFBA1\uFBA2\uFBA3\uFBA4\uFBA5\uFBA6\uFBA7\uFBA8\uFBA9\uFBAA\uFBAB\uFBAC\uFBAD\uFBAE\uFBAF\uFBB0\uFBB1\uFBD3\uFBD4\uFBD5\uFBD6\uFBD7\uFBD8\uFBD9\uFBDA\uFBDB\uFBDC\uFBDD\uFBDE\uFBDF\uFBE0\uFBE1\uFBE2\uFBE3\uFBE4\uFBE5\uFBE6\uFBE7\uFBE8\uFBE9\uFBEA\uFBEB\uFBEC\uFBED\uFBEE\uFBEF\uFBF0\uFBF1\uFBF2\uFBF3\uFBF4\uFBF5\uFBF6\uFBF7\uFBF8\uFBF9\uFBFA\uFBFB\uFBFC\uFBFD\uFBFE\uFBFF\uFC00\uFC01\uFC02\uFC03\uFC04\uFC05\uFC06\uFC07\uFC08\uFC09\uFC0A\uFC0B\uFC0C\uFC0D\uFC0E\uFC0F\uFC10\uFC11\uFC12\uFC13\uFC14\uFC15\uFC16\uFC17\uFC18\uFC19\uFC1A\uFC1B\uFC1C\uFC1D\uFC1E\uFC1F\uFC20\uFC21\uFC22\uFC23\uFC24\uFC25\uFC26\uFC27\uFC28\uFC29\uFC2A\uFC2B\uFC2C\uFC2D\uFC2E\uFC2F\uFC30\uFC31\uFC32\uFC33\uFC34\uFC35\uFC36\uFC37\uFC38\uFC39\uFC3A\uFC3B\uFC3C\uFC3D\uFC3E\uFC3F\uFC40\uFC41\uFC42\uFC43\uFC44\uFC45\uFC46\uFC47\uFC48\uFC49\uFC4A\uFC4B\uFC4C\uFC4D\uFC4E\uFC4F\uFC50\uFC51\uFC52\uFC53\uFC54\uFC55\uFC56\uFC57\uFC58\uFC59\uFC5A\uFC5B\uFC5C\uFC5D\uFC5E\uFC5F\uFC60\uFC61\uFC62\uFC63\uFC64\uFC65\uFC66\uFC67\uFC68\uFC69\uFC6A\uFC6B\uFC6C\uFC6D\uFC6E\uFC6F\uFC70\uFC71\uFC72\uFC73\uFC74\uFC75\uFC76\uFC77\uFC78\uFC79\uFC7A\uFC7B\uFC7C\uFC7D\uFC7E\uFC7F\uFC80\uFC81\uFC82\uFC83\uFC84\uFC85\uFC86\uFC87\uFC88\uFC89\uFC8A\uFC8B\uFC8C\uFC8D\uFC8E\uFC8F\uFC90\uFC91\uFC92\uFC93\uFC94\uFC95\uFC96\uFC97\uFC98\uFC99\uFC9A\uFC9B\uFC9C\uFC9D\uFC9E\uFC9F\uFCA0\uFCA1\uFCA2\uFCA3\uFCA4\uFCA5\uFCA6\uFCA7\uFCA8\uFCA9\uFCAA\uFCAB\uFCAC\uFCAD\uFCAE\uFCAF\uFCB0\uFCB1\uFCB2\uFCB3\uFCB4\uFCB5\uFCB6\uFCB7\uFCB8\uFCB9\uFCBA\uFCBB\uFCBC\uFCBD\uFCBE\uFCBF\uFCC0\uFCC1\uFCC2\uFCC3\uFCC4\uFCC5\uFCC6\uFCC7\uFCC8\uFCC9\uFCCA\uFCCB\uFCCC\uFCCD\uFCCE\uFCCF\uFCD0\uFCD1\uFCD2\uFCD3\uFCD4\uFCD5\uFCD6\uFCD7\uFCD8\uFCD9\uFCDA\uFCDB\uFCDC\uFCDD\uFCDE\uFCDF\uFCE0\uFCE1\uFCE2\uFCE3\uFCE4\uFCE5\uFCE6\uFCE7\uFCE8\uFCE9\uFCEA\uFCEB\uFCEC\uFCED\uFCEE\uFCEF\uFCF0\uFCF1\uFCF2\uFCF3\uFCF4\uFCF5\uFCF6\uFCF7\uFCF8\uFCF9\uFCFA\uFCFB\uFCFC\uFCFD\uFCFE\uFCFF\uFD00\uFD01\uFD02\uFD03\uFD04\uFD05\uFD06\uFD07\uFD08\uFD09\uFD0A\uFD0B\uFD0C\uFD0D\uFD0E\uFD0F\uFD10\uFD11\uFD12\uFD13\uFD14\uFD15\uFD16\uFD17\uFD18\uFD19\uFD1A\uFD1B\uFD1C\uFD1D\uFD1E\uFD1F\uFD20\uFD21\uFD22\uFD23\uFD24\uFD25\uFD26\uFD27\uFD28\uFD29\uFD2A\uFD2B\uFD2C\uFD2D\uFD2E\uFD2F\uFD30\uFD31\uFD32\uFD33\uFD34\uFD35\uFD36\uFD37\uFD38\uFD39\uFD3A\uFD3B\uFD3C\uFD3D\uFD50\uFD51\uFD52\uFD53\uFD54\uFD55\uFD56\uFD57\uFD58\uFD59\uFD5A\uFD5B\uFD5C\uFD5D\uFD5E\uFD5F\uFD60\uFD61\uFD62\uFD63\uFD64\uFD65\uFD66\uFD67\uFD68\uFD69\uFD6A\uFD6B\uFD6C\uFD6D\uFD6E\uFD6F\uFD70\uFD71\uFD72\uFD73\uFD74\uFD75\uFD76\uFD77\uFD78\uFD79\uFD7A\uFD7B\uFD7C\uFD7D\uFD7E\uFD7F\uFD80\uFD81\uFD82\uFD83\uFD84\uFD85\uFD86\uFD87\uFD88\uFD89\uFD8A\uFD8B\uFD8C\uFD8D\uFD8E\uFD8F\uFD92\uFD93\uFD94\uFD95\uFD96\uFD97\uFD98\uFD99\uFD9A\uFD9B\uFD9C\uFD9D\uFD9E\uFD9F\uFDA0\uFDA1\uFDA2\uFDA3\uFDA4\uFDA5\uFDA6\uFDA7\uFDA8\uFDA9\uFDAA\uFDAB\uFDAC\uFDAD\uFDAE\uFDAF\uFDB0\uFDB1\uFDB2\uFDB3\uFDB4\uFDB5\uFDB6\uFDB7\uFDB8\uFDB9\uFDBA\uFDBB\uFDBC\uFDBD\uFDBE\uFDBF\uFDC0\uFDC1\uFDC2\uFDC3\uFDC4\uFDC5\uFDC6\uFDC7\uFDF0\uFDF1\uFDF2\uFDF3\uFDF4\uFDF5\uFDF6\uFDF7\uFDF8\uFDF9\uFDFA\uFDFB\uFE70\uFE71\uFE72\uFE73\uFE74\uFE76\uFE77\uFE78\uFE79\uFE7A\uFE7B\uFE7C\uFE7D\uFE7E\uFE7F\uFE80\uFE81\uFE82\uFE83\uFE84\uFE85\uFE86\uFE87\uFE88\uFE89\uFE8A\uFE8B\uFE8C\uFE8D\uFE8E\uFE8F\uFE90\uFE91\uFE92\uFE93\uFE94\uFE95\uFE96\uFE97\uFE98\uFE99\uFE9A\uFE9B\uFE9C\uFE9D\uFE9E\uFE9F\uFEA0\uFEA1\uFEA2\uFEA3\uFEA4\uFEA5\uFEA6\uFEA7\uFEA8\uFEA9\uFEAA\uFEAB\uFEAC\uFEAD\uFEAE\uFEAF\uFEB0\uFEB1\uFEB2\uFEB3\uFEB4\uFEB5\uFEB6\uFEB7\uFEB8\uFEB9\uFEBA\uFEBB\uFEBC\uFEBD\uFEBE\uFEBF\uFEC0\uFEC1\uFEC2\uFEC3\uFEC4\uFEC5\uFEC6\uFEC7\uFEC8\uFEC9\uFECA\uFECB\uFECC\uFECD\uFECE\uFECF\uFED0\uFED1\uFED2\uFED3\uFED4\uFED5\uFED6\uFED7\uFED8\uFED9\uFEDA\uFEDB\uFEDC\uFEDD\uFEDE\uFEDF\uFEE0\uFEE1\uFEE2\uFEE3\uFEE4\uFEE5\uFEE6\uFEE7\uFEE8\uFEE9\uFEEA\uFEEB\uFEEC\uFEED\uFEEE\uFEEF\uFEF0\uFEF1\uFEF2\uFEF3\uFEF4\uFEF5\uFEF6\uFEF7\uFEF8\uFEF9\uFEFA\uFEFB\uFEFC\uFF66\uFF67\uFF68\uFF69\uFF6A\uFF6B\uFF6C\uFF6D\uFF6E\uFF6F\uFF71\uFF72\uFF73\uFF74\uFF75\uFF76\uFF77\uFF78\uFF79\uFF7A\uFF7B\uFF7C\uFF7D\uFF7E\uFF7F\uFF80\uFF81\uFF82\uFF83\uFF84\uFF85\uFF86\uFF87\uFF88\uFF89\uFF8A\uFF8B\uFF8C\uFF8D\uFF8E\uFF8F\uFF90\uFF91\uFF92\uFF93\uFF94\uFF95\uFF96\uFF97\uFF98\uFF99\uFF9A\uFF9B\uFF9C\uFF9D\uFFA0\uFFA1\uFFA2\uFFA3\uFFA4\uFFA5\uFFA6\uFFA7\uFFA8\uFFA9\uFFAA\uFFAB\uFFAC\uFFAD\uFFAE\uFFAF\uFFB0\uFFB1\uFFB2\uFFB3\uFFB4\uFFB5\uFFB6\uFFB7\uFFB8\uFFB9\uFFBA\uFFBB\uFFBC\uFFBD\uFFBE\uFFC2\uFFC3\uFFC4\uFFC5\uFFC6\uFFC7\uFFCA\uFFCB\uFFCC\uFFCD\uFFCE\uFFCF\uFFD2\uFFD3\uFFD4\uFFD5\uFFD6\uFFD7\uFFDA\uFFDB\uFFDC]/, | |
| peg$c79 = { type: "class", value: "[\\u01BB\\u01C0\\u01C1\\u01C2\\u01C3\\u0294\\u05D0\\u05D1\\u05D2\\u05D3\\u05D4\\u05D5\\u05D6\\u05D7\\u05D8\\u05D9\\u05DA\\u05DB\\u05DC\\u05DD\\u05DE\\u05DF\\u05E0\\u05E1\\u05E2\\u05E3\\u05E4\\u05E5\\u05E6\\u05E7\\u05E8\\u05E9\\u05EA\\u05F0\\u05F1\\u05F2\\u0621\\u0622\\u0623\\u0624\\u0625\\u0626\\u0627\\u0628\\u0629\\u062A\\u062B\\u062C\\u062D\\u062E\\u062F\\u0630\\u0631\\u0632\\u0633\\u0634\\u0635\\u0636\\u0637\\u0638\\u0639\\u063A\\u063B\\u063C\\u063D\\u063E\\u063F\\u0641\\u0642\\u0643\\u0644\\u0645\\u0646\\u0647\\u0648\\u0649\\u064A\\u066E\\u066F\\u0671\\u0672\\u0673\\u0674\\u0675\\u0676\\u0677\\u0678\\u0679\\u067A\\u067B\\u067C\\u067D\\u067E\\u067F\\u0680\\u0681\\u0682\\u0683\\u0684\\u0685\\u0686\\u0687\\u0688\\u0689\\u068A\\u068B\\u068C\\u068D\\u068E\\u068F\\u0690\\u0691\\u0692\\u0693\\u0694\\u0695\\u0696\\u0697\\u0698\\u0699\\u069A\\u069B\\u069C\\u069D\\u069E\\u069F\\u06A0\\u06A1\\u06A2\\u06A3\\u06A4\\u06A5\\u06A6\\u06A7\\u06A8\\u06A9\\u06AA\\u06AB\\u06AC\\u06AD\\u06AE\\u06AF\\u06B0\\u06B1\\u06B2\\u06B3\\u06B4\\u06B5\\u06B6\\u06B7\\u06B8\\u06B9\\u06BA\\u06BB\\u06BC\\u06BD\\u06BE\\u06BF\\u06C0\\u06C1\\u06C2\\u06C3\\u06C4\\u06C5\\u06C6\\u06C7\\u06C8\\u06C9\\u06CA\\u06CB\\u06CC\\u06CD\\u06CE\\u06CF\\u06D0\\u06D1\\u06D2\\u06D3\\u06D5\\u06EE\\u06EF\\u06FA\\u06FB\\u06FC\\u06FF\\u0710\\u0712\\u0713\\u0714\\u0715\\u0716\\u0717\\u0718\\u0719\\u071A\\u071B\\u071C\\u071D\\u071E\\u071F\\u0720\\u0721\\u0722\\u0723\\u0724\\u0725\\u0726\\u0727\\u0728\\u0729\\u072A\\u072B\\u072C\\u072D\\u072E\\u072F\\u074D\\u074E\\u074F\\u0750\\u0751\\u0752\\u0753\\u0754\\u0755\\u0756\\u0757\\u0758\\u0759\\u075A\\u075B\\u075C\\u075D\\u075E\\u075F\\u0760\\u0761\\u0762\\u0763\\u0764\\u0765\\u0766\\u0767\\u0768\\u0769\\u076A\\u076B\\u076C\\u076D\\u076E\\u076F\\u0770\\u0771\\u0772\\u0773\\u0774\\u0775\\u0776\\u0777\\u0778\\u0779\\u077A\\u077B\\u077C\\u077D\\u077E\\u077F\\u0780\\u0781\\u0782\\u0783\\u0784\\u0785\\u0786\\u0787\\u0788\\u0789\\u078A\\u078B\\u078C\\u078D\\u078E\\u078F\\u0790\\u0791\\u0792\\u0793\\u0794\\u0795\\u0796\\u0797\\u0798\\u0799\\u079A\\u079B\\u079C\\u079D\\u079E\\u079F\\u07A0\\u07A1\\u07A2\\u07A3\\u07A4\\u07A5\\u07B1\\u07CA\\u07CB\\u07CC\\u07CD\\u07CE\\u07CF\\u07D0\\u07D1\\u07D2\\u07D3\\u07D4\\u07D5\\u07D6\\u07D7\\u07D8\\u07D9\\u07DA\\u07DB\\u07DC\\u07DD\\u07DE\\u07DF\\u07E0\\u07E1\\u07E2\\u07E3\\u07E4\\u07E5\\u07E6\\u07E7\\u07E8\\u07E9\\u07EA\\u0904\\u0905\\u0906\\u0907\\u0908\\u0909\\u090A\\u090B\\u090C\\u090D\\u090E\\u090F\\u0910\\u0911\\u0912\\u0913\\u0914\\u0915\\u0916\\u0917\\u0918\\u0919\\u091A\\u091B\\u091C\\u091D\\u091E\\u091F\\u0920\\u0921\\u0922\\u0923\\u0924\\u0925\\u0926\\u0927\\u0928\\u0929\\u092A\\u092B\\u092C\\u092D\\u092E\\u092F\\u0930\\u0931\\u0932\\u0933\\u0934\\u0935\\u0936\\u0937\\u0938\\u0939\\u093D\\u0950\\u0958\\u0959\\u095A\\u095B\\u095C\\u095D\\u095E\\u095F\\u0960\\u0961\\u0972\\u097B\\u097C\\u097D\\u097E\\u097F\\u0985\\u0986\\u0987\\u0988\\u0989\\u098A\\u098B\\u098C\\u098F\\u0990\\u0993\\u0994\\u0995\\u0996\\u0997\\u0998\\u0999\\u099A\\u099B\\u099C\\u099D\\u099E\\u099F\\u09A0\\u09A1\\u09A2\\u09A3\\u09A4\\u09A5\\u09A6\\u09A7\\u09A8\\u09AA\\u09AB\\u09AC\\u09AD\\u09AE\\u09AF\\u09B0\\u09B2\\u09B6\\u09B7\\u09B8\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF\\u09E0\\u09E1\\u09F0\\u09F1\\u0A05\\u0A06\\u0A07\\u0A08\\u0A09\\u0A0A\\u0A0F\\u0A10\\u0A13\\u0A14\\u0A15\\u0A16\\u0A17\\u0A18\\u0A19\\u0A1A\\u0A1B\\u0A1C\\u0A1D\\u0A1E\\u0A1F\\u0A20\\u0A21\\u0A22\\u0A23\\u0A24\\u0A25\\u0A26\\u0A27\\u0A28\\u0A2A\\u0A2B\\u0A2C\\u0A2D\\u0A2E\\u0A2F\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59\\u0A5A\\u0A5B\\u0A5C\\u0A5E\\u0A72\\u0A73\\u0A74\\u0A85\\u0A86\\u0A87\\u0A88\\u0A89\\u0A8A\\u0A8B\\u0A8C\\u0A8D\\u0A8F\\u0A90\\u0A91\\u0A93\\u0A94\\u0A95\\u0A96\\u0A97\\u0A98\\u0A99\\u0A9A\\u0A9B\\u0A9C\\u0A9D\\u0A9E\\u0A9F\\u0AA0\\u0AA1\\u0AA2\\u0AA3\\u0AA4\\u0AA5\\u0AA6\\u0AA7\\u0AA8\\u0AAA\\u0AAB\\u0AAC\\u0AAD\\u0AAE\\u0AAF\\u0AB0\\u0AB2\\u0AB3\\u0AB5\\u0AB6\\u0AB7\\u0AB8\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05\\u0B06\\u0B07\\u0B08\\u0B09\\u0B0A\\u0B0B\\u0B0C\\u0B0F\\u0B10\\u0B13\\u0B14\\u0B15\\u0B16\\u0B17\\u0B18\\u0B19\\u0B1A\\u0B1B\\u0B1C\\u0B1D\\u0B1E\\u0B1F\\u0B20\\u0B21\\u0B22\\u0B23\\u0B24\\u0B25\\u0B26\\u0B27\\u0B28\\u0B2A\\u0B2B\\u0B2C\\u0B2D\\u0B2E\\u0B2F\\u0B30\\u0B32\\u0B33\\u0B35\\u0B36\\u0B37\\u0B38\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F\\u0B60\\u0B61\\u0B71\\u0B83\\u0B85\\u0B86\\u0B87\\u0B88\\u0B89\\u0B8A\\u0B8E\\u0B8F\\u0B90\\u0B92\\u0B93\\u0B94\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8\\u0BA9\\u0BAA\\u0BAE\\u0BAF\\u0BB0\\u0BB1\\u0BB2\\u0BB3\\u0BB4\\u0BB5\\u0BB6\\u0BB7\\u0BB8\\u0BB9\\u0BD0\\u0C05\\u0C06\\u0C07\\u0C08\\u0C09\\u0C0A\\u0C0B\\u0C0C\\u0C0E\\u0C0F\\u0C10\\u0C12\\u0C13\\u0C14\\u0C15\\u0C16\\u0C17\\u0C18\\u0C19\\u0C1A\\u0C1B\\u0C1C\\u0C1D\\u0C1E\\u0C1F\\u0C20\\u0C21\\u0C22\\u0C23\\u0C24\\u0C25\\u0C26\\u0C27\\u0C28\\u0C2A\\u0C2B\\u0C2C\\u0C2D\\u0C2E\\u0C2F\\u0C30\\u0C31\\u0C32\\u0C33\\u0C35\\u0C36\\u0C37\\u0C38\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85\\u0C86\\u0C87\\u0C88\\u0C89\\u0C8A\\u0C8B\\u0C8C\\u0C8E\\u0C8F\\u0C90\\u0C92\\u0C93\\u0C94\\u0C95\\u0C96\\u0C97\\u0C98\\u0C99\\u0C9A\\u0C9B\\u0C9C\\u0C9D\\u0C9E\\u0C9F\\u0CA0\\u0CA1\\u0CA2\\u0CA3\\u0CA4\\u0CA5\\u0CA6\\u0CA7\\u0CA8\\u0CAA\\u0CAB\\u0CAC\\u0CAD\\u0CAE\\u0CAF\\u0CB0\\u0CB1\\u0CB2\\u0CB3\\u0CB5\\u0CB6\\u0CB7\\u0CB8\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0D05\\u0D06\\u0D07\\u0D08\\u0D09\\u0D0A\\u0D0B\\u0D0C\\u0D0E\\u0D0F\\u0D10\\u0D12\\u0D13\\u0D14\\u0D15\\u0D16\\u0D17\\u0D18\\u0D19\\u0D1A\\u0D1B\\u0D1C\\u0D1D\\u0D1E\\u0D1F\\u0D20\\u0D21\\u0D22\\u0D23\\u0D24\\u0D25\\u0D26\\u0D27\\u0D28\\u0D2A\\u0D2B\\u0D2C\\u0D2D\\u0D2E\\u0D2F\\u0D30\\u0D31\\u0D32\\u0D33\\u0D34\\u0D35\\u0D36\\u0D37\\u0D38\\u0D39\\u0D3D\\u0D60\\u0D61\\u0D7A\\u0D7B\\u0D7C\\u0D7D\\u0D7E\\u0D7F\\u0D85\\u0D86\\u0D87\\u0D88\\u0D89\\u0D8A\\u0D8B\\u0D8C\\u0D8D\\u0D8E\\u0D8F\\u0D90\\u0D91\\u0D92\\u0D93\\u0D94\\u0D95\\u0D96\\u0D9A\\u0D9B\\u0D9C\\u0D9D\\u0D9E\\u0D9F\\u0DA0\\u0DA1\\u0DA2\\u0DA3\\u0DA4\\u0DA5\\u0DA6\\u0DA7\\u0DA8\\u0DA9\\u0DAA\\u0DAB\\u0DAC\\u0DAD\\u0DAE\\u0DAF\\u0DB0\\u0DB1\\u0DB3\\u0DB4\\u0DB5\\u0DB6\\u0DB7\\u0DB8\\u0DB9\\u0DBA\\u0DBB\\u0DBD\\u0DC0\\u0DC1\\u0DC2\\u0DC3\\u0DC4\\u0DC5\\u0DC6\\u0E01\\u0E02\\u0E03\\u0E04\\u0E05\\u0E06\\u0E07\\u0E08\\u0E09\\u0E0A\\u0E0B\\u0E0C\\u0E0D\\u0E0E\\u0E0F\\u0E10\\u0E11\\u0E12\\u0E13\\u0E14\\u0E15\\u0E16\\u0E17\\u0E18\\u0E19\\u0E1A\\u0E1B\\u0E1C\\u0E1D\\u0E1E\\u0E1F\\u0E20\\u0E21\\u0E22\\u0E23\\u0E24\\u0E25\\u0E26\\u0E27\\u0E28\\u0E29\\u0E2A\\u0E2B\\u0E2C\\u0E2D\\u0E2E\\u0E2F\\u0E30\\u0E32\\u0E33\\u0E40\\u0E41\\u0E42\\u0E43\\u0E44\\u0E45\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94\\u0E95\\u0E96\\u0E97\\u0E99\\u0E9A\\u0E9B\\u0E9C\\u0E9D\\u0E9E\\u0E9F\\u0EA1\\u0EA2\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD\\u0EAE\\u0EAF\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0\\u0EC1\\u0EC2\\u0EC3\\u0EC4\\u0EDC\\u0EDD\\u0F00\\u0F40\\u0F41\\u0F42\\u0F43\\u0F44\\u0F45\\u0F46\\u0F47\\u0F49\\u0F4A\\u0F4B\\u0F4C\\u0F4D\\u0F4E\\u0F4F\\u0F50\\u0F51\\u0F52\\u0F53\\u0F54\\u0F55\\u0F56\\u0F57\\u0F58\\u0F59\\u0F5A\\u0F5B\\u0F5C\\u0F5D\\u0F5E\\u0F5F\\u0F60\\u0F61\\u0F62\\u0F63\\u0F64\\u0F65\\u0F66\\u0F67\\u0F68\\u0F69\\u0F6A\\u0F6B\\u0F6C\\u0F88\\u0F89\\u0F8A\\u0F8B\\u1000\\u1001\\u1002\\u1003\\u1004\\u1005\\u1006\\u1007\\u1008\\u1009\\u100A\\u100B\\u100C\\u100D\\u100E\\u100F\\u1010\\u1011\\u1012\\u1013\\u1014\\u1015\\u1016\\u1017\\u1018\\u1019\\u101A\\u101B\\u101C\\u101D\\u101E\\u101F\\u1020\\u1021\\u1022\\u1023\\u1024\\u1025\\u1026\\u1027\\u1028\\u1029\\u102A\\u103F\\u1050\\u1051\\u1052\\u1053\\u1054\\u1055\\u105A\\u105B\\u105C\\u105D\\u1061\\u1065\\u1066\\u106E\\u106F\\u1070\\u1075\\u1076\\u1077\\u1078\\u1079\\u107A\\u107B\\u107C\\u107D\\u107E\\u107F\\u1080\\u1081\\u108E\\u10D0\\u10D1\\u10D2\\u10D3\\u10D4\\u10D5\\u10D6\\u10D7\\u10D8\\u10D9\\u10DA\\u10DB\\u10DC\\u10DD\\u10DE\\u10DF\\u10E0\\u10E1\\u10E2\\u10E3\\u10E4\\u10E5\\u10E6\\u10E7\\u10E8\\u10E9\\u10EA\\u10EB\\u10EC\\u10ED\\u10EE\\u10EF\\u10F0\\u10F1\\u10F2\\u10F3\\u10F4\\u10F5\\u10F6\\u10F7\\u10F8\\u10F9\\u10FA\\u1100\\u1101\\u1102\\u1103\\u1104\\u1105\\u1106\\u1107\\u1108\\u1109\\u110A\\u110B\\u110C\\u110D\\u110E\\u110F\\u1110\\u1111\\u1112\\u1113\\u1114\\u1115\\u1116\\u1117\\u1118\\u1119\\u111A\\u111B\\u111C\\u111D\\u111E\\u111F\\u1120\\u1121\\u1122\\u1123\\u1124\\u1125\\u1126\\u1127\\u1128\\u1129\\u112A\\u112B\\u112C\\u112D\\u112E\\u112F\\u1130\\u1131\\u1132\\u1133\\u1134\\u1135\\u1136\\u1137\\u1138\\u1139\\u113A\\u113B\\u113C\\u113D\\u113E\\u113F\\u1140\\u1141\\u1142\\u1143\\u1144\\u1145\\u1146\\u1147\\u1148\\u1149\\u114A\\u114B\\u114C\\u114D\\u114E\\u114F\\u1150\\u1151\\u1152\\u1153\\u1154\\u1155\\u1156\\u1157\\u1158\\u1159\\u115F\\u1160\\u1161\\u1162\\u1163\\u1164\\u1165\\u1166\\u1167\\u1168\\u1169\\u116A\\u116B\\u116C\\u116D\\u116E\\u116F\\u1170\\u1171\\u1172\\u1173\\u1174\\u1175\\u1176\\u1177\\u1178\\u1179\\u117A\\u117B\\u117C\\u117D\\u117E\\u117F\\u1180\\u1181\\u1182\\u1183\\u1184\\u1185\\u1186\\u1187\\u1188\\u1189\\u118A\\u118B\\u118C\\u118D\\u118E\\u118F\\u1190\\u1191\\u1192\\u1193\\u1194\\u1195\\u1196\\u1197\\u1198\\u1199\\u119A\\u119B\\u119C\\u119D\\u119E\\u119F\\u11A0\\u11A1\\u11A2\\u11A8\\u11A9\\u11AA\\u11AB\\u11AC\\u11AD\\u11AE\\u11AF\\u11B0\\u11B1\\u11B2\\u11B3\\u11B4\\u11B5\\u11B6\\u11B7\\u11B8\\u11B9\\u11BA\\u11BB\\u11BC\\u11BD\\u11BE\\u11BF\\u11C0\\u11C1\\u11C2\\u11C3\\u11C4\\u11C5\\u11C6\\u11C7\\u11C8\\u11C9\\u11CA\\u11CB\\u11CC\\u11CD\\u11CE\\u11CF\\u11D0\\u11D1\\u11D2\\u11D3\\u11D4\\u11D5\\u11D6\\u11D7\\u11D8\\u11D9\\u11DA\\u11DB\\u11DC\\u11DD\\u11DE\\u11DF\\u11E0\\u11E1\\u11E2\\u11E3\\u11E4\\u11E5\\u11E6\\u11E7\\u11E8\\u11E9\\u11EA\\u11EB\\u11EC\\u11ED\\u11EE\\u11EF\\u11F0\\u11F1\\u11F2\\u11F3\\u11F4\\u11F5\\u11F6\\u11F7\\u11F8\\u11F9\\u1200\\u1201\\u1202\\u1203\\u1204\\u1205\\u1206\\u1207\\u1208\\u1209\\u120A\\u120B\\u120C\\u120D\\u120E\\u120F\\u1210\\u1211\\u1212\\u1213\\u1214\\u1215\\u1216\\u1217\\u1218\\u1219\\u121A\\u121B\\u121C\\u121D\\u121E\\u121F\\u1220\\u1221\\u1222\\u1223\\u1224\\u1225\\u1226\\u1227\\u1228\\u1229\\u122A\\u122B\\u122C\\u122D\\u122E\\u122F\\u1230\\u1231\\u1232\\u1233\\u1234\\u1235\\u1236\\u1237\\u1238\\u1239\\u123A\\u123B\\u123C\\u123D\\u123E\\u123F\\u1240\\u1241\\u1242\\u1243\\u1244\\u1245\\u1246\\u1247\\u1248\\u124A\\u124B\\u124C\\u124D\\u1250\\u1251\\u1252\\u1253\\u1254\\u1255\\u1256\\u1258\\u125A\\u125B\\u125C\\u125D\\u1260\\u1261\\u1262\\u1263\\u1264\\u1265\\u1266\\u1267\\u1268\\u1269\\u126A\\u126B\\u126C\\u126D\\u126E\\u126F\\u1270\\u1271\\u1272\\u1273\\u1274\\u1275\\u1276\\u1277\\u1278\\u1279\\u127A\\u127B\\u127C\\u127D\\u127E\\u127F\\u1280\\u1281\\u1282\\u1283\\u1284\\u1285\\u1286\\u1287\\u1288\\u128A\\u128B\\u128C\\u128D\\u1290\\u1291\\u1292\\u1293\\u1294\\u1295\\u1296\\u1297\\u1298\\u1299\\u129A\\u129B\\u129C\\u129D\\u129E\\u129F\\u12A0\\u12A1\\u12A2\\u12A3\\u12A4\\u12A5\\u12A6\\u12A7\\u12A8\\u12A9\\u12AA\\u12AB\\u12AC\\u12AD\\u12AE\\u12AF\\u12B0\\u12B2\\u12B3\\u12B4\\u12B5\\u12B8\\u12B9\\u12BA\\u12BB\\u12BC\\u12BD\\u12BE\\u12C0\\u12C2\\u12C3\\u12C4\\u12C5\\u12C8\\u12C9\\u12CA\\u12CB\\u12CC\\u12CD\\u12CE\\u12CF\\u12D0\\u12D1\\u12D2\\u12D3\\u12D4\\u12D5\\u12D6\\u12D8\\u12D9\\u12DA\\u12DB\\u12DC\\u12DD\\u12DE\\u12DF\\u12E0\\u12E1\\u12E2\\u12E3\\u12E4\\u12E5\\u12E6\\u12E7\\u12E8\\u12E9\\u12EA\\u12EB\\u12EC\\u12ED\\u12EE\\u12EF\\u12F0\\u12F1\\u12F2\\u12F3\\u12F4\\u12F5\\u12F6\\u12F7\\u12F8\\u12F9\\u12FA\\u12FB\\u12FC\\u12FD\\u12FE\\u12FF\\u1300\\u1301\\u1302\\u1303\\u1304\\u1305\\u1306\\u1307\\u1308\\u1309\\u130A\\u130B\\u130C\\u130D\\u130E\\u130F\\u1310\\u1312\\u1313\\u1314\\u1315\\u1318\\u1319\\u131A\\u131B\\u131C\\u131D\\u131E\\u131F\\u1320\\u1321\\u1322\\u1323\\u1324\\u1325\\u1326\\u1327\\u1328\\u1329\\u132A\\u132B\\u132C\\u132D\\u132E\\u132F\\u1330\\u1331\\u1332\\u1333\\u1334\\u1335\\u1336\\u1337\\u1338\\u1339\\u133A\\u133B\\u133C\\u133D\\u133E\\u133F\\u1340\\u1341\\u1342\\u1343\\u1344\\u1345\\u1346\\u1347\\u1348\\u1349\\u134A\\u134B\\u134C\\u134D\\u134E\\u134F\\u1350\\u1351\\u1352\\u1353\\u1354\\u1355\\u1356\\u1357\\u1358\\u1359\\u135A\\u1380\\u1381\\u1382\\u1383\\u1384\\u1385\\u1386\\u1387\\u1388\\u1389\\u138A\\u138B\\u138C\\u138D\\u138E\\u138F\\u13A0\\u13A1\\u13A2\\u13A3\\u13A4\\u13A5\\u13A6\\u13A7\\u13A8\\u13A9\\u13AA\\u13AB\\u13AC\\u13AD\\u13AE\\u13AF\\u13B0\\u13B1\\u13B2\\u13B3\\u13B4\\u13B5\\u13B6\\u13B7\\u13B8\\u13B9\\u13BA\\u13BB\\u13BC\\u13BD\\u13BE\\u13BF\\u13C0\\u13C1\\u13C2\\u13C3\\u13C4\\u13C5\\u13C6\\u13C7\\u13C8\\u13C9\\u13CA\\u13CB\\u13CC\\u13CD\\u13CE\\u13CF\\u13D0\\u13D1\\u13D2\\u13D3\\u13D4\\u13D5\\u13D6\\u13D7\\u13D8\\u13D9\\u13DA\\u13DB\\u13DC\\u13DD\\u13DE\\u13DF\\u13E0\\u13E1\\u13E2\\u13E3\\u13E4\\u13E5\\u13E6\\u13E7\\u13E8\\u13E9\\u13EA\\u13EB\\u13EC\\u13ED\\u13EE\\u13EF\\u13F0\\u13F1\\u13F2\\u13F3\\u13F4\\u1401\\u1402\\u1403\\u1404\\u1405\\u1406\\u1407\\u1408\\u1409\\u140A\\u140B\\u140C\\u140D\\u140E\\u140F\\u1410\\u1411\\u1412\\u1413\\u1414\\u1415\\u1416\\u1417\\u1418\\u1419\\u141A\\u141B\\u141C\\u141D\\u141E\\u141F\\u1420\\u1421\\u1422\\u1423\\u1424\\u1425\\u1426\\u1427\\u1428\\u1429\\u142A\\u142B\\u142C\\u142D\\u142E\\u142F\\u1430\\u1431\\u1432\\u1433\\u1434\\u1435\\u1436\\u1437\\u1438\\u1439\\u143A\\u143B\\u143C\\u143D\\u143E\\u143F\\u1440\\u1441\\u1442\\u1443\\u1444\\u1445\\u1446\\u1447\\u1448\\u1449\\u144A\\u144B\\u144C\\u144D\\u144E\\u144F\\u1450\\u1451\\u1452\\u1453\\u1454\\u1455\\u1456\\u1457\\u1458\\u1459\\u145A\\u145B\\u145C\\u145D\\u145E\\u145F\\u1460\\u1461\\u1462\\u1463\\u1464\\u1465\\u1466\\u1467\\u1468\\u1469\\u146A\\u146B\\u146C\\u146D\\u146E\\u146F\\u1470\\u1471\\u1472\\u1473\\u1474\\u1475\\u1476\\u1477\\u1478\\u1479\\u147A\\u147B\\u147C\\u147D\\u147E\\u147F\\u1480\\u1481\\u1482\\u1483\\u1484\\u1485\\u1486\\u1487\\u1488\\u1489\\u148A\\u148B\\u148C\\u148D\\u148E\\u148F\\u1490\\u1491\\u1492\\u1493\\u1494\\u1495\\u1496\\u1497\\u1498\\u1499\\u149A\\u149B\\u149C\\u149D\\u149E\\u149F\\u14A0\\u14A1\\u14A2\\u14A3\\u14A4\\u14A5\\u14A6\\u14A7\\u14A8\\u14A9\\u14AA\\u14AB\\u14AC\\u14AD\\u14AE\\u14AF\\u14B0\\u14B1\\u14B2\\u14B3\\u14B4\\u14B5\\u14B6\\u14B7\\u14B8\\u14B9\\u14BA\\u14BB\\u14BC\\u14BD\\u14BE\\u14BF\\u14C0\\u14C1\\u14C2\\u14C3\\u14C4\\u14C5\\u14C6\\u14C7\\u14C8\\u14C9\\u14CA\\u14CB\\u14CC\\u14CD\\u14CE\\u14CF\\u14D0\\u14D1\\u14D2\\u14D3\\u14D4\\u14D5\\u14D6\\u14D7\\u14D8\\u14D9\\u14DA\\u14DB\\u14DC\\u14DD\\u14DE\\u14DF\\u14E0\\u14E1\\u14E2\\u14E3\\u14E4\\u14E5\\u14E6\\u14E7\\u14E8\\u14E9\\u14EA\\u14EB\\u14EC\\u14ED\\u14EE\\u14EF\\u14F0\\u14F1\\u14F2\\u14F3\\u14F4\\u14F5\\u14F6\\u14F7\\u14F8\\u14F9\\u14FA\\u14FB\\u14FC\\u14FD\\u14FE\\u14FF\\u1500\\u1501\\u1502\\u1503\\u1504\\u1505\\u1506\\u1507\\u1508\\u1509\\u150A\\u150B\\u150C\\u150D\\u150E\\u150F\\u1510\\u1511\\u1512\\u1513\\u1514\\u1515\\u1516\\u1517\\u1518\\u1519\\u151A\\u151B\\u151C\\u151D\\u151E\\u151F\\u1520\\u1521\\u1522\\u1523\\u1524\\u1525\\u1526\\u1527\\u1528\\u1529\\u152A\\u152B\\u152C\\u152D\\u152E\\u152F\\u1530\\u1531\\u1532\\u1533\\u1534\\u1535\\u1536\\u1537\\u1538\\u1539\\u153A\\u153B\\u153C\\u153D\\u153E\\u153F\\u1540\\u1541\\u1542\\u1543\\u1544\\u1545\\u1546\\u1547\\u1548\\u1549\\u154A\\u154B\\u154C\\u154D\\u154E\\u154F\\u1550\\u1551\\u1552\\u1553\\u1554\\u1555\\u1556\\u1557\\u1558\\u1559\\u155A\\u155B\\u155C\\u155D\\u155E\\u155F\\u1560\\u1561\\u1562\\u1563\\u1564\\u1565\\u1566\\u1567\\u1568\\u1569\\u156A\\u156B\\u156C\\u156D\\u156E\\u156F\\u1570\\u1571\\u1572\\u1573\\u1574\\u1575\\u1576\\u1577\\u1578\\u1579\\u157A\\u157B\\u157C\\u157D\\u157E\\u157F\\u1580\\u1581\\u1582\\u1583\\u1584\\u1585\\u1586\\u1587\\u1588\\u1589\\u158A\\u158B\\u158C\\u158D\\u158E\\u158F\\u1590\\u1591\\u1592\\u1593\\u1594\\u1595\\u1596\\u1597\\u1598\\u1599\\u159A\\u159B\\u159C\\u159D\\u159E\\u159F\\u15A0\\u15A1\\u15A2\\u15A3\\u15A4\\u15A5\\u15A6\\u15A7\\u15A8\\u15A9\\u15AA\\u15AB\\u15AC\\u15AD\\u15AE\\u15AF\\u15B0\\u15B1\\u15B2\\u15B3\\u15B4\\u15B5\\u15B6\\u15B7\\u15B8\\u15B9\\u15BA\\u15BB\\u15BC\\u15BD\\u15BE\\u15BF\\u15C0\\u15C1\\u15C2\\u15C3\\u15C4\\u15C5\\u15C6\\u15C7\\u15C8\\u15C9\\u15CA\\u15CB\\u15CC\\u15CD\\u15CE\\u15CF\\u15D0\\u15D1\\u15D2\\u15D3\\u15D4\\u15D5\\u15D6\\u15D7\\u15D8\\u15D9\\u15DA\\u15DB\\u15DC\\u15DD\\u15DE\\u15DF\\u15E0\\u15E1\\u15E2\\u15E3\\u15E4\\u15E5\\u15E6\\u15E7\\u15E8\\u15E9\\u15EA\\u15EB\\u15EC\\u15ED\\u15EE\\u15EF\\u15F0\\u15F1\\u15F2\\u15F3\\u15F4\\u15F5\\u15F6\\u15F7\\u15F8\\u15F9\\u15FA\\u15FB\\u15FC\\u15FD\\u15FE\\u15FF\\u1600\\u1601\\u1602\\u1603\\u1604\\u1605\\u1606\\u1607\\u1608\\u1609\\u160A\\u160B\\u160C\\u160D\\u160E\\u160F\\u1610\\u1611\\u1612\\u1613\\u1614\\u1615\\u1616\\u1617\\u1618\\u1619\\u161A\\u161B\\u161C\\u161D\\u161E\\u161F\\u1620\\u1621\\u1622\\u1623\\u1624\\u1625\\u1626\\u1627\\u1628\\u1629\\u162A\\u162B\\u162C\\u162D\\u162E\\u162F\\u1630\\u1631\\u1632\\u1633\\u1634\\u1635\\u1636\\u1637\\u1638\\u1639\\u163A\\u163B\\u163C\\u163D\\u163E\\u163F\\u1640\\u1641\\u1642\\u1643\\u1644\\u1645\\u1646\\u1647\\u1648\\u1649\\u164A\\u164B\\u164C\\u164D\\u164E\\u164F\\u1650\\u1651\\u1652\\u1653\\u1654\\u1655\\u1656\\u1657\\u1658\\u1659\\u165A\\u165B\\u165C\\u165D\\u165E\\u165F\\u1660\\u1661\\u1662\\u1663\\u1664\\u1665\\u1666\\u1667\\u1668\\u1669\\u166A\\u166B\\u166C\\u166F\\u1670\\u1671\\u1672\\u1673\\u1674\\u1675\\u1676\\u1681\\u1682\\u1683\\u1684\\u1685\\u1686\\u1687\\u1688\\u1689\\u168A\\u168B\\u168C\\u168D\\u168E\\u168F\\u1690\\u1691\\u1692\\u1693\\u1694\\u1695\\u1696\\u1697\\u1698\\u1699\\u169A\\u16A0\\u16A1\\u16A2\\u16A3\\u16A4\\u16A5\\u16A6\\u16A7\\u16A8\\u16A9\\u16AA\\u16AB\\u16AC\\u16AD\\u16AE\\u16AF\\u16B0\\u16B1\\u16B2\\u16B3\\u16B4\\u16B5\\u16B6\\u16B7\\u16B8\\u16B9\\u16BA\\u16BB\\u16BC\\u16BD\\u16BE\\u16BF\\u16C0\\u16C1\\u16C2\\u16C3\\u16C4\\u16C5\\u16C6\\u16C7\\u16C8\\u16C9\\u16CA\\u16CB\\u16CC\\u16CD\\u16CE\\u16CF\\u16D0\\u16D1\\u16D2\\u16D3\\u16D4\\u16D5\\u16D6\\u16D7\\u16D8\\u16D9\\u16DA\\u16DB\\u16DC\\u16DD\\u16DE\\u16DF\\u16E0\\u16E1\\u16E2\\u16E3\\u16E4\\u16E5\\u16E6\\u16E7\\u16E8\\u16E9\\u16EA\\u1700\\u1701\\u1702\\u1703\\u1704\\u1705\\u1706\\u1707\\u1708\\u1709\\u170A\\u170B\\u170C\\u170E\\u170F\\u1710\\u1711\\u1720\\u1721\\u1722\\u1723\\u1724\\u1725\\u1726\\u1727\\u1728\\u1729\\u172A\\u172B\\u172C\\u172D\\u172E\\u172F\\u1730\\u1731\\u1740\\u1741\\u1742\\u1743\\u1744\\u1745\\u1746\\u1747\\u1748\\u1749\\u174A\\u174B\\u174C\\u174D\\u174E\\u174F\\u1750\\u1751\\u1760\\u1761\\u1762\\u1763\\u1764\\u1765\\u1766\\u1767\\u1768\\u1769\\u176A\\u176B\\u176C\\u176E\\u176F\\u1770\\u1780\\u1781\\u1782\\u1783\\u1784\\u1785\\u1786\\u1787\\u1788\\u1789\\u178A\\u178B\\u178C\\u178D\\u178E\\u178F\\u1790\\u1791\\u1792\\u1793\\u1794\\u1795\\u1796\\u1797\\u1798\\u1799\\u179A\\u179B\\u179C\\u179D\\u179E\\u179F\\u17A0\\u17A1\\u17A2\\u17A3\\u17A4\\u17A5\\u17A6\\u17A7\\u17A8\\u17A9\\u17AA\\u17AB\\u17AC\\u17AD\\u17AE\\u17AF\\u17B0\\u17B1\\u17B2\\u17B3\\u17DC\\u1820\\u1821\\u1822\\u1823\\u1824\\u1825\\u1826\\u1827\\u1828\\u1829\\u182A\\u182B\\u182C\\u182D\\u182E\\u182F\\u1830\\u1831\\u1832\\u1833\\u1834\\u1835\\u1836\\u1837\\u1838\\u1839\\u183A\\u183B\\u183C\\u183D\\u183E\\u183F\\u1840\\u1841\\u1842\\u1844\\u1845\\u1846\\u1847\\u1848\\u1849\\u184A\\u184B\\u184C\\u184D\\u184E\\u184F\\u1850\\u1851\\u1852\\u1853\\u1854\\u1855\\u1856\\u1857\\u1858\\u1859\\u185A\\u185B\\u185C\\u185D\\u185E\\u185F\\u1860\\u1861\\u1862\\u1863\\u1864\\u1865\\u1866\\u1867\\u1868\\u1869\\u186A\\u186B\\u186C\\u186D\\u186E\\u186F\\u1870\\u1871\\u1872\\u1873\\u1874\\u1875\\u1876\\u1877\\u1880\\u1881\\u1882\\u1883\\u1884\\u1885\\u1886\\u1887\\u1888\\u1889\\u188A\\u188B\\u188C\\u188D\\u188E\\u188F\\u1890\\u1891\\u1892\\u1893\\u1894\\u1895\\u1896\\u1897\\u1898\\u1899\\u189A\\u189B\\u189C\\u189D\\u189E\\u189F\\u18A0\\u18A1\\u18A2\\u18A3\\u18A4\\u18A5\\u18A6\\u18A7\\u18A8\\u18AA\\u1900\\u1901\\u1902\\u1903\\u1904\\u1905\\u1906\\u1907\\u1908\\u1909\\u190A\\u190B\\u190C\\u190D\\u190E\\u190F\\u1910\\u1911\\u1912\\u1913\\u1914\\u1915\\u1916\\u1917\\u1918\\u1919\\u191A\\u191B\\u191C\\u1950\\u1951\\u1952\\u1953\\u1954\\u1955\\u1956\\u1957\\u1958\\u1959\\u195A\\u195B\\u195C\\u195D\\u195E\\u195F\\u1960\\u1961\\u1962\\u1963\\u1964\\u1965\\u1966\\u1967\\u1968\\u1969\\u196A\\u196B\\u196C\\u196D\\u1970\\u1971\\u1972\\u1973\\u1974\\u1980\\u1981\\u1982\\u1983\\u1984\\u1985\\u1986\\u1987\\u1988\\u1989\\u198A\\u198B\\u198C\\u198D\\u198E\\u198F\\u1990\\u1991\\u1992\\u1993\\u1994\\u1995\\u1996\\u1997\\u1998\\u1999\\u199A\\u199B\\u199C\\u199D\\u199E\\u199F\\u19A0\\u19A1\\u19A2\\u19A3\\u19A4\\u19A5\\u19A6\\u19A7\\u19A8\\u19A9\\u19C1\\u19C2\\u19C3\\u19C4\\u19C5\\u19C6\\u19C7\\u1A00\\u1A01\\u1A02\\u1A03\\u1A04\\u1A05\\u1A06\\u1A07\\u1A08\\u1A09\\u1A0A\\u1A0B\\u1A0C\\u1A0D\\u1A0E\\u1A0F\\u1A10\\u1A11\\u1A12\\u1A13\\u1A14\\u1A15\\u1A16\\u1B05\\u1B06\\u1B07\\u1B08\\u1B09\\u1B0A\\u1B0B\\u1B0C\\u1B0D\\u1B0E\\u1B0F\\u1B10\\u1B11\\u1B12\\u1B13\\u1B14\\u1B15\\u1B16\\u1B17\\u1B18\\u1B19\\u1B1A\\u1B1B\\u1B1C\\u1B1D\\u1B1E\\u1B1F\\u1B20\\u1B21\\u1B22\\u1B23\\u1B24\\u1B25\\u1B26\\u1B27\\u1B28\\u1B29\\u1B2A\\u1B2B\\u1B2C\\u1B2D\\u1B2E\\u1B2F\\u1B30\\u1B31\\u1B32\\u1B33\\u1B45\\u1B46\\u1B47\\u1B48\\u1B49\\u1B4A\\u1B4B\\u1B83\\u1B84\\u1B85\\u1B86\\u1B87\\u1B88\\u1B89\\u1B8A\\u1B8B\\u1B8C\\u1B8D\\u1B8E\\u1B8F\\u1B90\\u1B91\\u1B92\\u1B93\\u1B94\\u1B95\\u1B96\\u1B97\\u1B98\\u1B99\\u1B9A\\u1B9B\\u1B9C\\u1B9D\\u1B9E\\u1B9F\\u1BA0\\u1BAE\\u1BAF\\u1C00\\u1C01\\u1C02\\u1C03\\u1C04\\u1C05\\u1C06\\u1C07\\u1C08\\u1C09\\u1C0A\\u1C0B\\u1C0C\\u1C0D\\u1C0E\\u1C0F\\u1C10\\u1C11\\u1C12\\u1C13\\u1C14\\u1C15\\u1C16\\u1C17\\u1C18\\u1C19\\u1C1A\\u1C1B\\u1C1C\\u1C1D\\u1C1E\\u1C1F\\u1C20\\u1C21\\u1C22\\u1C23\\u1C4D\\u1C4E\\u1C4F\\u1C5A\\u1C5B\\u1C5C\\u1C5D\\u1C5E\\u1C5F\\u1C60\\u1C61\\u1C62\\u1C63\\u1C64\\u1C65\\u1C66\\u1C67\\u1C68\\u1C69\\u1C6A\\u1C6B\\u1C6C\\u1C6D\\u1C6E\\u1C6F\\u1C70\\u1C71\\u1C72\\u1C73\\u1C74\\u1C75\\u1C76\\u1C77\\u2135\\u2136\\u2137\\u2138\\u2D30\\u2D31\\u2D32\\u2D33\\u2D34\\u2D35\\u2D36\\u2D37\\u2D38\\u2D39\\u2D3A\\u2D3B\\u2D3C\\u2D3D\\u2D3E\\u2D3F\\u2D40\\u2D41\\u2D42\\u2D43\\u2D44\\u2D45\\u2D46\\u2D47\\u2D48\\u2D49\\u2D4A\\u2D4B\\u2D4C\\u2D4D\\u2D4E\\u2D4F\\u2D50\\u2D51\\u2D52\\u2D53\\u2D54\\u2D55\\u2D56\\u2D57\\u2D58\\u2D59\\u2D5A\\u2D5B\\u2D5C\\u2D5D\\u2D5E\\u2D5F\\u2D60\\u2D61\\u2D62\\u2D63\\u2D64\\u2D65\\u2D80\\u2D81\\u2D82\\u2D83\\u2D84\\u2D85\\u2D86\\u2D87\\u2D88\\u2D89\\u2D8A\\u2D8B\\u2D8C\\u2D8D\\u2D8E\\u2D8F\\u2D90\\u2D91\\u2D92\\u2D93\\u2D94\\u2D95\\u2D96\\u2DA0\\u2DA1\\u2DA2\\u2DA3\\u2DA4\\u2DA5\\u2DA6\\u2DA8\\u2DA9\\u2DAA\\u2DAB\\u2DAC\\u2DAD\\u2DAE\\u2DB0\\u2DB1\\u2DB2\\u2DB3\\u2DB4\\u2DB5\\u2DB6\\u2DB8\\u2DB9\\u2DBA\\u2DBB\\u2DBC\\u2DBD\\u2DBE\\u2DC0\\u2DC1\\u2DC2\\u2DC3\\u2DC4\\u2DC5\\u2DC6\\u2DC8\\u2DC9\\u2DCA\\u2DCB\\u2DCC\\u2DCD\\u2DCE\\u2DD0\\u2DD1\\u2DD2\\u2DD3\\u2DD4\\u2DD5\\u2DD6\\u2DD8\\u2DD9\\u2DDA\\u2DDB\\u2DDC\\u2DDD\\u2DDE\\u3006\\u303C\\u3041\\u3042\\u3043\\u3044\\u3045\\u3046\\u3047\\u3048\\u3049\\u304A\\u304B\\u304C\\u304D\\u304E\\u304F\\u3050\\u3051\\u3052\\u3053\\u3054\\u3055\\u3056\\u3057\\u3058\\u3059\\u305A\\u305B\\u305C\\u305D\\u305E\\u305F\\u3060\\u3061\\u3062\\u3063\\u3064\\u3065\\u3066\\u3067\\u3068\\u3069\\u306A\\u306B\\u306C\\u306D\\u306E\\u306F\\u3070\\u3071\\u3072\\u3073\\u3074\\u3075\\u3076\\u3077\\u3078\\u3079\\u307A\\u307B\\u307C\\u307D\\u307E\\u307F\\u3080\\u3081\\u3082\\u3083\\u3084\\u3085\\u3086\\u3087\\u3088\\u3089\\u308A\\u308B\\u308C\\u308D\\u308E\\u308F\\u3090\\u3091\\u3092\\u3093\\u3094\\u3095\\u3096\\u309F\\u30A1\\u30A2\\u30A3\\u30A4\\u30A5\\u30A6\\u30A7\\u30A8\\u30A9\\u30AA\\u30AB\\u30AC\\u30AD\\u30AE\\u30AF\\u30B0\\u30B1\\u30B2\\u30B3\\u30B4\\u30B5\\u30B6\\u30B7\\u30B8\\u30B9\\u30BA\\u30BB\\u30BC\\u30BD\\u30BE\\u30BF\\u30C0\\u30C1\\u30C2\\u30C3\\u30C4\\u30C5\\u30C6\\u30C7\\u30C8\\u30C9\\u30CA\\u30CB\\u30CC\\u30CD\\u30CE\\u30CF\\u30D0\\u30D1\\u30D2\\u30D3\\u30D4\\u30D5\\u30D6\\u30D7\\u30D8\\u30D9\\u30DA\\u30DB\\u30DC\\u30DD\\u30DE\\u30DF\\u30E0\\u30E1\\u30E2\\u30E3\\u30E4\\u30E5\\u30E6\\u30E7\\u30E8\\u30E9\\u30EA\\u30EB\\u30EC\\u30ED\\u30EE\\u30EF\\u30F0\\u30F1\\u30F2\\u30F3\\u30F4\\u30F5\\u30F6\\u30F7\\u30F8\\u30F9\\u30FA\\u30FF\\u3105\\u3106\\u3107\\u3108\\u3109\\u310A\\u310B\\u310C\\u310D\\u310E\\u310F\\u3110\\u3111\\u3112\\u3113\\u3114\\u3115\\u3116\\u3117\\u3118\\u3119\\u311A\\u311B\\u311C\\u311D\\u311E\\u311F\\u3120\\u3121\\u3122\\u3123\\u3124\\u3125\\u3126\\u3127\\u3128\\u3129\\u312A\\u312B\\u312C\\u312D\\u3131\\u3132\\u3133\\u3134\\u3135\\u3136\\u3137\\u3138\\u3139\\u313A\\u313B\\u313C\\u313D\\u313E\\u313F\\u3140\\u3141\\u3142\\u3143\\u3144\\u3145\\u3146\\u3147\\u3148\\u3149\\u314A\\u314B\\u314C\\u314D\\u314E\\u314F\\u3150\\u3151\\u3152\\u3153\\u3154\\u3155\\u3156\\u3157\\u3158\\u3159\\u315A\\u315B\\u315C\\u315D\\u315E\\u315F\\u3160\\u3161\\u3162\\u3163\\u3164\\u3165\\u3166\\u3167\\u3168\\u3169\\u316A\\u316B\\u316C\\u316D\\u316E\\u316F\\u3170\\u3171\\u3172\\u3173\\u3174\\u3175\\u3176\\u3177\\u3178\\u3179\\u317A\\u317B\\u317C\\u317D\\u317E\\u317F\\u3180\\u3181\\u3182\\u3183\\u3184\\u3185\\u3186\\u3187\\u3188\\u3189\\u318A\\u318B\\u318C\\u318D\\u318E\\u31A0\\u31A1\\u31A2\\u31A3\\u31A4\\u31A5\\u31A6\\u31A7\\u31A8\\u31A9\\u31AA\\u31AB\\u31AC\\u31AD\\u31AE\\u31AF\\u31B0\\u31B1\\u31B2\\u31B3\\u31B4\\u31B5\\u31B6\\u31B7\\u31F0\\u31F1\\u31F2\\u31F3\\u31F4\\u31F5\\u31F6\\u31F7\\u31F8\\u31F9\\u31FA\\u31FB\\u31FC\\u31FD\\u31FE\\u31FF\\u3400\\u4DB5\\u4E00\\u9FC3\\uA000\\uA001\\uA002\\uA003\\uA004\\uA005\\uA006\\uA007\\uA008\\uA009\\uA00A\\uA00B\\uA00C\\uA00D\\uA00E\\uA00F\\uA010\\uA011\\uA012\\uA013\\uA014\\uA016\\uA017\\uA018\\uA019\\uA01A\\uA01B\\uA01C\\uA01D\\uA01E\\uA01F\\uA020\\uA021\\uA022\\uA023\\uA024\\uA025\\uA026\\uA027\\uA028\\uA029\\uA02A\\uA02B\\uA02C\\uA02D\\uA02E\\uA02F\\uA030\\uA031\\uA032\\uA033\\uA034\\uA035\\uA036\\uA037\\uA038\\uA039\\uA03A\\uA03B\\uA03C\\uA03D\\uA03E\\uA03F\\uA040\\uA041\\uA042\\uA043\\uA044\\uA045\\uA046\\uA047\\uA048\\uA049\\uA04A\\uA04B\\uA04C\\uA04D\\uA04E\\uA04F\\uA050\\uA051\\uA052\\uA053\\uA054\\uA055\\uA056\\uA057\\uA058\\uA059\\uA05A\\uA05B\\uA05C\\uA05D\\uA05E\\uA05F\\uA060\\uA061\\uA062\\uA063\\uA064\\uA065\\uA066\\uA067\\uA068\\uA069\\uA06A\\uA06B\\uA06C\\uA06D\\uA06E\\uA06F\\uA070\\uA071\\uA072\\uA073\\uA074\\uA075\\uA076\\uA077\\uA078\\uA079\\uA07A\\uA07B\\uA07C\\uA07D\\uA07E\\uA07F\\uA080\\uA081\\uA082\\uA083\\uA084\\uA085\\uA086\\uA087\\uA088\\uA089\\uA08A\\uA08B\\uA08C\\uA08D\\uA08E\\uA08F\\uA090\\uA091\\uA092\\uA093\\uA094\\uA095\\uA096\\uA097\\uA098\\uA099\\uA09A\\uA09B\\uA09C\\uA09D\\uA09E\\uA09F\\uA0A0\\uA0A1\\uA0A2\\uA0A3\\uA0A4\\uA0A5\\uA0A6\\uA0A7\\uA0A8\\uA0A9\\uA0AA\\uA0AB\\uA0AC\\uA0AD\\uA0AE\\uA0AF\\uA0B0\\uA0B1\\uA0B2\\uA0B3\\uA0B4\\uA0B5\\uA0B6\\uA0B7\\uA0B8\\uA0B9\\uA0BA\\uA0BB\\uA0BC\\uA0BD\\uA0BE\\uA0BF\\uA0C0\\uA0C1\\uA0C2\\uA0C3\\uA0C4\\uA0C5\\uA0C6\\uA0C7\\uA0C8\\uA0C9\\uA0CA\\uA0CB\\uA0CC\\uA0CD\\uA0CE\\uA0CF\\uA0D0\\uA0D1\\uA0D2\\uA0D3\\uA0D4\\uA0D5\\uA0D6\\uA0D7\\uA0D8\\uA0D9\\uA0DA\\uA0DB\\uA0DC\\uA0DD\\uA0DE\\uA0DF\\uA0E0\\uA0E1\\uA0E2\\uA0E3\\uA0E4\\uA0E5\\uA0E6\\uA0E7\\uA0E8\\uA0E9\\uA0EA\\uA0EB\\uA0EC\\uA0ED\\uA0EE\\uA0EF\\uA0F0\\uA0F1\\uA0F2\\uA0F3\\uA0F4\\uA0F5\\uA0F6\\uA0F7\\uA0F8\\uA0F9\\uA0FA\\uA0FB\\uA0FC\\uA0FD\\uA0FE\\uA0FF\\uA100\\uA101\\uA102\\uA103\\uA104\\uA105\\uA106\\uA107\\uA108\\uA109\\uA10A\\uA10B\\uA10C\\uA10D\\uA10E\\uA10F\\uA110\\uA111\\uA112\\uA113\\uA114\\uA115\\uA116\\uA117\\uA118\\uA119\\uA11A\\uA11B\\uA11C\\uA11D\\uA11E\\uA11F\\uA120\\uA121\\uA122\\uA123\\uA124\\uA125\\uA126\\uA127\\uA128\\uA129\\uA12A\\uA12B\\uA12C\\uA12D\\uA12E\\uA12F\\uA130\\uA131\\uA132\\uA133\\uA134\\uA135\\uA136\\uA137\\uA138\\uA139\\uA13A\\uA13B\\uA13C\\uA13D\\uA13E\\uA13F\\uA140\\uA141\\uA142\\uA143\\uA144\\uA145\\uA146\\uA147\\uA148\\uA149\\uA14A\\uA14B\\uA14C\\uA14D\\uA14E\\uA14F\\uA150\\uA151\\uA152\\uA153\\uA154\\uA155\\uA156\\uA157\\uA158\\uA159\\uA15A\\uA15B\\uA15C\\uA15D\\uA15E\\uA15F\\uA160\\uA161\\uA162\\uA163\\uA164\\uA165\\uA166\\uA167\\uA168\\uA169\\uA16A\\uA16B\\uA16C\\uA16D\\uA16E\\uA16F\\uA170\\uA171\\uA172\\uA173\\uA174\\uA175\\uA176\\uA177\\uA178\\uA179\\uA17A\\uA17B\\uA17C\\uA17D\\uA17E\\uA17F\\uA180\\uA181\\uA182\\uA183\\uA184\\uA185\\uA186\\uA187\\uA188\\uA189\\uA18A\\uA18B\\uA18C\\uA18D\\uA18E\\uA18F\\uA190\\uA191\\uA192\\uA193\\uA194\\uA195\\uA196\\uA197\\uA198\\uA199\\uA19A\\uA19B\\uA19C\\uA19D\\uA19E\\uA19F\\uA1A0\\uA1A1\\uA1A2\\uA1A3\\uA1A4\\uA1A5\\uA1A6\\uA1A7\\uA1A8\\uA1A9\\uA1AA\\uA1AB\\uA1AC\\uA1AD\\uA1AE\\uA1AF\\uA1B0\\uA1B1\\uA1B2\\uA1B3\\uA1B4\\uA1B5\\uA1B6\\uA1B7\\uA1B8\\uA1B9\\uA1BA\\uA1BB\\uA1BC\\uA1BD\\uA1BE\\uA1BF\\uA1C0\\uA1C1\\uA1C2\\uA1C3\\uA1C4\\uA1C5\\uA1C6\\uA1C7\\uA1C8\\uA1C9\\uA1CA\\uA1CB\\uA1CC\\uA1CD\\uA1CE\\uA1CF\\uA1D0\\uA1D1\\uA1D2\\uA1D3\\uA1D4\\uA1D5\\uA1D6\\uA1D7\\uA1D8\\uA1D9\\uA1DA\\uA1DB\\uA1DC\\uA1DD\\uA1DE\\uA1DF\\uA1E0\\uA1E1\\uA1E2\\uA1E3\\uA1E4\\uA1E5\\uA1E6\\uA1E7\\uA1E8\\uA1E9\\uA1EA\\uA1EB\\uA1EC\\uA1ED\\uA1EE\\uA1EF\\uA1F0\\uA1F1\\uA1F2\\uA1F3\\uA1F4\\uA1F5\\uA1F6\\uA1F7\\uA1F8\\uA1F9\\uA1FA\\uA1FB\\uA1FC\\uA1FD\\uA1FE\\uA1FF\\uA200\\uA201\\uA202\\uA203\\uA204\\uA205\\uA206\\uA207\\uA208\\uA209\\uA20A\\uA20B\\uA20C\\uA20D\\uA20E\\uA20F\\uA210\\uA211\\uA212\\uA213\\uA214\\uA215\\uA216\\uA217\\uA218\\uA219\\uA21A\\uA21B\\uA21C\\uA21D\\uA21E\\uA21F\\uA220\\uA221\\uA222\\uA223\\uA224\\uA225\\uA226\\uA227\\uA228\\uA229\\uA22A\\uA22B\\uA22C\\uA22D\\uA22E\\uA22F\\uA230\\uA231\\uA232\\uA233\\uA234\\uA235\\uA236\\uA237\\uA238\\uA239\\uA23A\\uA23B\\uA23C\\uA23D\\uA23E\\uA23F\\uA240\\uA241\\uA242\\uA243\\uA244\\uA245\\uA246\\uA247\\uA248\\uA249\\uA24A\\uA24B\\uA24C\\uA24D\\uA24E\\uA24F\\uA250\\uA251\\uA252\\uA253\\uA254\\uA255\\uA256\\uA257\\uA258\\uA259\\uA25A\\uA25B\\uA25C\\uA25D\\uA25E\\uA25F\\uA260\\uA261\\uA262\\uA263\\uA264\\uA265\\uA266\\uA267\\uA268\\uA269\\uA26A\\uA26B\\uA26C\\uA26D\\uA26E\\uA26F\\uA270\\uA271\\uA272\\uA273\\uA274\\uA275\\uA276\\uA277\\uA278\\uA279\\uA27A\\uA27B\\uA27C\\uA27D\\uA27E\\uA27F\\uA280\\uA281\\uA282\\uA283\\uA284\\uA285\\uA286\\uA287\\uA288\\uA289\\uA28A\\uA28B\\uA28C\\uA28D\\uA28E\\uA28F\\uA290\\uA291\\uA292\\uA293\\uA294\\uA295\\uA296\\uA297\\uA298\\uA299\\uA29A\\uA29B\\uA29C\\uA29D\\uA29E\\uA29F\\uA2A0\\uA2A1\\uA2A2\\uA2A3\\uA2A4\\uA2A5\\uA2A6\\uA2A7\\uA2A8\\uA2A9\\uA2AA\\uA2AB\\uA2AC\\uA2AD\\uA2AE\\uA2AF\\uA2B0\\uA2B1\\uA2B2\\uA2B3\\uA2B4\\uA2B5\\uA2B6\\uA2B7\\uA2B8\\uA2B9\\uA2BA\\uA2BB\\uA2BC\\uA2BD\\uA2BE\\uA2BF\\uA2C0\\uA2C1\\uA2C2\\uA2C3\\uA2C4\\uA2C5\\uA2C6\\uA2C7\\uA2C8\\uA2C9\\uA2CA\\uA2CB\\uA2CC\\uA2CD\\uA2CE\\uA2CF\\uA2D0\\uA2D1\\uA2D2\\uA2D3\\uA2D4\\uA2D5\\uA2D6\\uA2D7\\uA2D8\\uA2D9\\uA2DA\\uA2DB\\uA2DC\\uA2DD\\uA2DE\\uA2DF\\uA2E0\\uA2E1\\uA2E2\\uA2E3\\uA2E4\\uA2E5\\uA2E6\\uA2E7\\uA2E8\\uA2E9\\uA2EA\\uA2EB\\uA2EC\\uA2ED\\uA2EE\\uA2EF\\uA2F0\\uA2F1\\uA2F2\\uA2F3\\uA2F4\\uA2F5\\uA2F6\\uA2F7\\uA2F8\\uA2F9\\uA2FA\\uA2FB\\uA2FC\\uA2FD\\uA2FE\\uA2FF\\uA300\\uA301\\uA302\\uA303\\uA304\\uA305\\uA306\\uA307\\uA308\\uA309\\uA30A\\uA30B\\uA30C\\uA30D\\uA30E\\uA30F\\uA310\\uA311\\uA312\\uA313\\uA314\\uA315\\uA316\\uA317\\uA318\\uA319\\uA31A\\uA31B\\uA31C\\uA31D\\uA31E\\uA31F\\uA320\\uA321\\uA322\\uA323\\uA324\\uA325\\uA326\\uA327\\uA328\\uA329\\uA32A\\uA32B\\uA32C\\uA32D\\uA32E\\uA32F\\uA330\\uA331\\uA332\\uA333\\uA334\\uA335\\uA336\\uA337\\uA338\\uA339\\uA33A\\uA33B\\uA33C\\uA33D\\uA33E\\uA33F\\uA340\\uA341\\uA342\\uA343\\uA344\\uA345\\uA346\\uA347\\uA348\\uA349\\uA34A\\uA34B\\uA34C\\uA34D\\uA34E\\uA34F\\uA350\\uA351\\uA352\\uA353\\uA354\\uA355\\uA356\\uA357\\uA358\\uA359\\uA35A\\uA35B\\uA35C\\uA35D\\uA35E\\uA35F\\uA360\\uA361\\uA362\\uA363\\uA364\\uA365\\uA366\\uA367\\uA368\\uA369\\uA36A\\uA36B\\uA36C\\uA36D\\uA36E\\uA36F\\uA370\\uA371\\uA372\\uA373\\uA374\\uA375\\uA376\\uA377\\uA378\\uA379\\uA37A\\uA37B\\uA37C\\uA37D\\uA37E\\uA37F\\uA380\\uA381\\uA382\\uA383\\uA384\\uA385\\uA386\\uA387\\uA388\\uA389\\uA38A\\uA38B\\uA38C\\uA38D\\uA38E\\uA38F\\uA390\\uA391\\uA392\\uA393\\uA394\\uA395\\uA396\\uA397\\uA398\\uA399\\uA39A\\uA39B\\uA39C\\uA39D\\uA39E\\uA39F\\uA3A0\\uA3A1\\uA3A2\\uA3A3\\uA3A4\\uA3A5\\uA3A6\\uA3A7\\uA3A8\\uA3A9\\uA3AA\\uA3AB\\uA3AC\\uA3AD\\uA3AE\\uA3AF\\uA3B0\\uA3B1\\uA3B2\\uA3B3\\uA3B4\\uA3B5\\uA3B6\\uA3B7\\uA3B8\\uA3B9\\uA3BA\\uA3BB\\uA3BC\\uA3BD\\uA3BE\\uA3BF\\uA3C0\\uA3C1\\uA3C2\\uA3C3\\uA3C4\\uA3C5\\uA3C6\\uA3C7\\uA3C8\\uA3C9\\uA3CA\\uA3CB\\uA3CC\\uA3CD\\uA3CE\\uA3CF\\uA3D0\\uA3D1\\uA3D2\\uA3D3\\uA3D4\\uA3D5\\uA3D6\\uA3D7\\uA3D8\\uA3D9\\uA3DA\\uA3DB\\uA3DC\\uA3DD\\uA3DE\\uA3DF\\uA3E0\\uA3E1\\uA3E2\\uA3E3\\uA3E4\\uA3E5\\uA3E6\\uA3E7\\uA3E8\\uA3E9\\uA3EA\\uA3EB\\uA3EC\\uA3ED\\uA3EE\\uA3EF\\uA3F0\\uA3F1\\uA3F2\\uA3F3\\uA3F4\\uA3F5\\uA3F6\\uA3F7\\uA3F8\\uA3F9\\uA3FA\\uA3FB\\uA3FC\\uA3FD\\uA3FE\\uA3FF\\uA400\\uA401\\uA402\\uA403\\uA404\\uA405\\uA406\\uA407\\uA408\\uA409\\uA40A\\uA40B\\uA40C\\uA40D\\uA40E\\uA40F\\uA410\\uA411\\uA412\\uA413\\uA414\\uA415\\uA416\\uA417\\uA418\\uA419\\uA41A\\uA41B\\uA41C\\uA41D\\uA41E\\uA41F\\uA420\\uA421\\uA422\\uA423\\uA424\\uA425\\uA426\\uA427\\uA428\\uA429\\uA42A\\uA42B\\uA42C\\uA42D\\uA42E\\uA42F\\uA430\\uA431\\uA432\\uA433\\uA434\\uA435\\uA436\\uA437\\uA438\\uA439\\uA43A\\uA43B\\uA43C\\uA43D\\uA43E\\uA43F\\uA440\\uA441\\uA442\\uA443\\uA444\\uA445\\uA446\\uA447\\uA448\\uA449\\uA44A\\uA44B\\uA44C\\uA44D\\uA44E\\uA44F\\uA450\\uA451\\uA452\\uA453\\uA454\\uA455\\uA456\\uA457\\uA458\\uA459\\uA45A\\uA45B\\uA45C\\uA45D\\uA45E\\uA45F\\uA460\\uA461\\uA462\\uA463\\uA464\\uA465\\uA466\\uA467\\uA468\\uA469\\uA46A\\uA46B\\uA46C\\uA46D\\uA46E\\uA46F\\uA470\\uA471\\uA472\\uA473\\uA474\\uA475\\uA476\\uA477\\uA478\\uA479\\uA47A\\uA47B\\uA47C\\uA47D\\uA47E\\uA47F\\uA480\\uA481\\uA482\\uA483\\uA484\\uA485\\uA486\\uA487\\uA488\\uA489\\uA48A\\uA48B\\uA48C\\uA500\\uA501\\uA502\\uA503\\uA504\\uA505\\uA506\\uA507\\uA508\\uA509\\uA50A\\uA50B\\uA50C\\uA50D\\uA50E\\uA50F\\uA510\\uA511\\uA512\\uA513\\uA514\\uA515\\uA516\\uA517\\uA518\\uA519\\uA51A\\uA51B\\uA51C\\uA51D\\uA51E\\uA51F\\uA520\\uA521\\uA522\\uA523\\uA524\\uA525\\uA526\\uA527\\uA528\\uA529\\uA52A\\uA52B\\uA52C\\uA52D\\uA52E\\uA52F\\uA530\\uA531\\uA532\\uA533\\uA534\\uA535\\uA536\\uA537\\uA538\\uA539\\uA53A\\uA53B\\uA53C\\uA53D\\uA53E\\uA53F\\uA540\\uA541\\uA542\\uA543\\uA544\\uA545\\uA546\\uA547\\uA548\\uA549\\uA54A\\uA54B\\uA54C\\uA54D\\uA54E\\uA54F\\uA550\\uA551\\uA552\\uA553\\uA554\\uA555\\uA556\\uA557\\uA558\\uA559\\uA55A\\uA55B\\uA55C\\uA55D\\uA55E\\uA55F\\uA560\\uA561\\uA562\\uA563\\uA564\\uA565\\uA566\\uA567\\uA568\\uA569\\uA56A\\uA56B\\uA56C\\uA56D\\uA56E\\uA56F\\uA570\\uA571\\uA572\\uA573\\uA574\\uA575\\uA576\\uA577\\uA578\\uA579\\uA57A\\uA57B\\uA57C\\uA57D\\uA57E\\uA57F\\uA580\\uA581\\uA582\\uA583\\uA584\\uA585\\uA586\\uA587\\uA588\\uA589\\uA58A\\uA58B\\uA58C\\uA58D\\uA58E\\uA58F\\uA590\\uA591\\uA592\\uA593\\uA594\\uA595\\uA596\\uA597\\uA598\\uA599\\uA59A\\uA59B\\uA59C\\uA59D\\uA59E\\uA59F\\uA5A0\\uA5A1\\uA5A2\\uA5A3\\uA5A4\\uA5A5\\uA5A6\\uA5A7\\uA5A8\\uA5A9\\uA5AA\\uA5AB\\uA5AC\\uA5AD\\uA5AE\\uA5AF\\uA5B0\\uA5B1\\uA5B2\\uA5B3\\uA5B4\\uA5B5\\uA5B6\\uA5B7\\uA5B8\\uA5B9\\uA5BA\\uA5BB\\uA5BC\\uA5BD\\uA5BE\\uA5BF\\uA5C0\\uA5C1\\uA5C2\\uA5C3\\uA5C4\\uA5C5\\uA5C6\\uA5C7\\uA5C8\\uA5C9\\uA5CA\\uA5CB\\uA5CC\\uA5CD\\uA5CE\\uA5CF\\uA5D0\\uA5D1\\uA5D2\\uA5D3\\uA5D4\\uA5D5\\uA5D6\\uA5D7\\uA5D8\\uA5D9\\uA5DA\\uA5DB\\uA5DC\\uA5DD\\uA5DE\\uA5DF\\uA5E0\\uA5E1\\uA5E2\\uA5E3\\uA5E4\\uA5E5\\uA5E6\\uA5E7\\uA5E8\\uA5E9\\uA5EA\\uA5EB\\uA5EC\\uA5ED\\uA5EE\\uA5EF\\uA5F0\\uA5F1\\uA5F2\\uA5F3\\uA5F4\\uA5F5\\uA5F6\\uA5F7\\uA5F8\\uA5F9\\uA5FA\\uA5FB\\uA5FC\\uA5FD\\uA5FE\\uA5FF\\uA600\\uA601\\uA602\\uA603\\uA604\\uA605\\uA606\\uA607\\uA608\\uA609\\uA60A\\uA60B\\uA610\\uA611\\uA612\\uA613\\uA614\\uA615\\uA616\\uA617\\uA618\\uA619\\uA61A\\uA61B\\uA61C\\uA61D\\uA61E\\uA61F\\uA62A\\uA62B\\uA66E\\uA7FB\\uA7FC\\uA7FD\\uA7FE\\uA7FF\\uA800\\uA801\\uA803\\uA804\\uA805\\uA807\\uA808\\uA809\\uA80A\\uA80C\\uA80D\\uA80E\\uA80F\\uA810\\uA811\\uA812\\uA813\\uA814\\uA815\\uA816\\uA817\\uA818\\uA819\\uA81A\\uA81B\\uA81C\\uA81D\\uA81E\\uA81F\\uA820\\uA821\\uA822\\uA840\\uA841\\uA842\\uA843\\uA844\\uA845\\uA846\\uA847\\uA848\\uA849\\uA84A\\uA84B\\uA84C\\uA84D\\uA84E\\uA84F\\uA850\\uA851\\uA852\\uA853\\uA854\\uA855\\uA856\\uA857\\uA858\\uA859\\uA85A\\uA85B\\uA85C\\uA85D\\uA85E\\uA85F\\uA860\\uA861\\uA862\\uA863\\uA864\\uA865\\uA866\\uA867\\uA868\\uA869\\uA86A\\uA86B\\uA86C\\uA86D\\uA86E\\uA86F\\uA870\\uA871\\uA872\\uA873\\uA882\\uA883\\uA884\\uA885\\uA886\\uA887\\uA888\\uA889\\uA88A\\uA88B\\uA88C\\uA88D\\uA88E\\uA88F\\uA890\\uA891\\uA892\\uA893\\uA894\\uA895\\uA896\\uA897\\uA898\\uA899\\uA89A\\uA89B\\uA89C\\uA89D\\uA89E\\uA89F\\uA8A0\\uA8A1\\uA8A2\\uA8A3\\uA8A4\\uA8A5\\uA8A6\\uA8A7\\uA8A8\\uA8A9\\uA8AA\\uA8AB\\uA8AC\\uA8AD\\uA8AE\\uA8AF\\uA8B0\\uA8B1\\uA8B2\\uA8B3\\uA90A\\uA90B\\uA90C\\uA90D\\uA90E\\uA90F\\uA910\\uA911\\uA912\\uA913\\uA914\\uA915\\uA916\\uA917\\uA918\\uA919\\uA91A\\uA91B\\uA91C\\uA91D\\uA91E\\uA91F\\uA920\\uA921\\uA922\\uA923\\uA924\\uA925\\uA930\\uA931\\uA932\\uA933\\uA934\\uA935\\uA936\\uA937\\uA938\\uA939\\uA93A\\uA93B\\uA93C\\uA93D\\uA93E\\uA93F\\uA940\\uA941\\uA942\\uA943\\uA944\\uA945\\uA946\\uAA00\\uAA01\\uAA02\\uAA03\\uAA04\\uAA05\\uAA06\\uAA07\\uAA08\\uAA09\\uAA0A\\uAA0B\\uAA0C\\uAA0D\\uAA0E\\uAA0F\\uAA10\\uAA11\\uAA12\\uAA13\\uAA14\\uAA15\\uAA16\\uAA17\\uAA18\\uAA19\\uAA1A\\uAA1B\\uAA1C\\uAA1D\\uAA1E\\uAA1F\\uAA20\\uAA21\\uAA22\\uAA23\\uAA24\\uAA25\\uAA26\\uAA27\\uAA28\\uAA40\\uAA41\\uAA42\\uAA44\\uAA45\\uAA46\\uAA47\\uAA48\\uAA49\\uAA4A\\uAA4B\\uAC00\\uD7A3\\uF900\\uF901\\uF902\\uF903\\uF904\\uF905\\uF906\\uF907\\uF908\\uF909\\uF90A\\uF90B\\uF90C\\uF90D\\uF90E\\uF90F\\uF910\\uF911\\uF912\\uF913\\uF914\\uF915\\uF916\\uF917\\uF918\\uF919\\uF91A\\uF91B\\uF91C\\uF91D\\uF91E\\uF91F\\uF920\\uF921\\uF922\\uF923\\uF924\\uF925\\uF926\\uF927\\uF928\\uF929\\uF92A\\uF92B\\uF92C\\uF92D\\uF92E\\uF92F\\uF930\\uF931\\uF932\\uF933\\uF934\\uF935\\uF936\\uF937\\uF938\\uF939\\uF93A\\uF93B\\uF93C\\uF93D\\uF93E\\uF93F\\uF940\\uF941\\uF942\\uF943\\uF944\\uF945\\uF946\\uF947\\uF948\\uF949\\uF94A\\uF94B\\uF94C\\uF94D\\uF94E\\uF94F\\uF950\\uF951\\uF952\\uF953\\uF954\\uF955\\uF956\\uF957\\uF958\\uF959\\uF95A\\uF95B\\uF95C\\uF95D\\uF95E\\uF95F\\uF960\\uF961\\uF962\\uF963\\uF964\\uF965\\uF966\\uF967\\uF968\\uF969\\uF96A\\uF96B\\uF96C\\uF96D\\uF96E\\uF96F\\uF970\\uF971\\uF972\\uF973\\uF974\\uF975\\uF976\\uF977\\uF978\\uF979\\uF97A\\uF97B\\uF97C\\uF97D\\uF97E\\uF97F\\uF980\\uF981\\uF982\\uF983\\uF984\\uF985\\uF986\\uF987\\uF988\\uF989\\uF98A\\uF98B\\uF98C\\uF98D\\uF98E\\uF98F\\uF990\\uF991\\uF992\\uF993\\uF994\\uF995\\uF996\\uF997\\uF998\\uF999\\uF99A\\uF99B\\uF99C\\uF99D\\uF99E\\uF99F\\uF9A0\\uF9A1\\uF9A2\\uF9A3\\uF9A4\\uF9A5\\uF9A6\\uF9A7\\uF9A8\\uF9A9\\uF9AA\\uF9AB\\uF9AC\\uF9AD\\uF9AE\\uF9AF\\uF9B0\\uF9B1\\uF9B2\\uF9B3\\uF9B4\\uF9B5\\uF9B6\\uF9B7\\uF9B8\\uF9B9\\uF9BA\\uF9BB\\uF9BC\\uF9BD\\uF9BE\\uF9BF\\uF9C0\\uF9C1\\uF9C2\\uF9C3\\uF9C4\\uF9C5\\uF9C6\\uF9C7\\uF9C8\\uF9C9\\uF9CA\\uF9CB\\uF9CC\\uF9CD\\uF9CE\\uF9CF\\uF9D0\\uF9D1\\uF9D2\\uF9D3\\uF9D4\\uF9D5\\uF9D6\\uF9D7\\uF9D8\\uF9D9\\uF9DA\\uF9DB\\uF9DC\\uF9DD\\uF9DE\\uF9DF\\uF9E0\\uF9E1\\uF9E2\\uF9E3\\uF9E4\\uF9E5\\uF9E6\\uF9E7\\uF9E8\\uF9E9\\uF9EA\\uF9EB\\uF9EC\\uF9ED\\uF9EE\\uF9EF\\uF9F0\\uF9F1\\uF9F2\\uF9F3\\uF9F4\\uF9F5\\uF9F6\\uF9F7\\uF9F8\\uF9F9\\uF9FA\\uF9FB\\uF9FC\\uF9FD\\uF9FE\\uF9FF\\uFA00\\uFA01\\uFA02\\uFA03\\uFA04\\uFA05\\uFA06\\uFA07\\uFA08\\uFA09\\uFA0A\\uFA0B\\uFA0C\\uFA0D\\uFA0E\\uFA0F\\uFA10\\uFA11\\uFA12\\uFA13\\uFA14\\uFA15\\uFA16\\uFA17\\uFA18\\uFA19\\uFA1A\\uFA1B\\uFA1C\\uFA1D\\uFA1E\\uFA1F\\uFA20\\uFA21\\uFA22\\uFA23\\uFA24\\uFA25\\uFA26\\uFA27\\uFA28\\uFA29\\uFA2A\\uFA2B\\uFA2C\\uFA2D\\uFA30\\uFA31\\uFA32\\uFA33\\uFA34\\uFA35\\uFA36\\uFA37\\uFA38\\uFA39\\uFA3A\\uFA3B\\uFA3C\\uFA3D\\uFA3E\\uFA3F\\uFA40\\uFA41\\uFA42\\uFA43\\uFA44\\uFA45\\uFA46\\uFA47\\uFA48\\uFA49\\uFA4A\\uFA4B\\uFA4C\\uFA4D\\uFA4E\\uFA4F\\uFA50\\uFA51\\uFA52\\uFA53\\uFA54\\uFA55\\uFA56\\uFA57\\uFA58\\uFA59\\uFA5A\\uFA5B\\uFA5C\\uFA5D\\uFA5E\\uFA5F\\uFA60\\uFA61\\uFA62\\uFA63\\uFA64\\uFA65\\uFA66\\uFA67\\uFA68\\uFA69\\uFA6A\\uFA70\\uFA71\\uFA72\\uFA73\\uFA74\\uFA75\\uFA76\\uFA77\\uFA78\\uFA79\\uFA7A\\uFA7B\\uFA7C\\uFA7D\\uFA7E\\uFA7F\\uFA80\\uFA81\\uFA82\\uFA83\\uFA84\\uFA85\\uFA86\\uFA87\\uFA88\\uFA89\\uFA8A\\uFA8B\\uFA8C\\uFA8D\\uFA8E\\uFA8F\\uFA90\\uFA91\\uFA92\\uFA93\\uFA94\\uFA95\\uFA96\\uFA97\\uFA98\\uFA99\\uFA9A\\uFA9B\\uFA9C\\uFA9D\\uFA9E\\uFA9F\\uFAA0\\uFAA1\\uFAA2\\uFAA3\\uFAA4\\uFAA5\\uFAA6\\uFAA7\\uFAA8\\uFAA9\\uFAAA\\uFAAB\\uFAAC\\uFAAD\\uFAAE\\uFAAF\\uFAB0\\uFAB1\\uFAB2\\uFAB3\\uFAB4\\uFAB5\\uFAB6\\uFAB7\\uFAB8\\uFAB9\\uFABA\\uFABB\\uFABC\\uFABD\\uFABE\\uFABF\\uFAC0\\uFAC1\\uFAC2\\uFAC3\\uFAC4\\uFAC5\\uFAC6\\uFAC7\\uFAC8\\uFAC9\\uFACA\\uFACB\\uFACC\\uFACD\\uFACE\\uFACF\\uFAD0\\uFAD1\\uFAD2\\uFAD3\\uFAD4\\uFAD5\\uFAD6\\uFAD7\\uFAD8\\uFAD9\\uFB1D\\uFB1F\\uFB20\\uFB21\\uFB22\\uFB23\\uFB24\\uFB25\\uFB26\\uFB27\\uFB28\\uFB2A\\uFB2B\\uFB2C\\uFB2D\\uFB2E\\uFB2F\\uFB30\\uFB31\\uFB32\\uFB33\\uFB34\\uFB35\\uFB36\\uFB38\\uFB39\\uFB3A\\uFB3B\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46\\uFB47\\uFB48\\uFB49\\uFB4A\\uFB4B\\uFB4C\\uFB4D\\uFB4E\\uFB4F\\uFB50\\uFB51\\uFB52\\uFB53\\uFB54\\uFB55\\uFB56\\uFB57\\uFB58\\uFB59\\uFB5A\\uFB5B\\uFB5C\\uFB5D\\uFB5E\\uFB5F\\uFB60\\uFB61\\uFB62\\uFB63\\uFB64\\uFB65\\uFB66\\uFB67\\uFB68\\uFB69\\uFB6A\\uFB6B\\uFB6C\\uFB6D\\uFB6E\\uFB6F\\uFB70\\uFB71\\uFB72\\uFB73\\uFB74\\uFB75\\uFB76\\uFB77\\uFB78\\uFB79\\uFB7A\\uFB7B\\uFB7C\\uFB7D\\uFB7E\\uFB7F\\uFB80\\uFB81\\uFB82\\uFB83\\uFB84\\uFB85\\uFB86\\uFB87\\uFB88\\uFB89\\uFB8A\\uFB8B\\uFB8C\\uFB8D\\uFB8E\\uFB8F\\uFB90\\uFB91\\uFB92\\uFB93\\uFB94\\uFB95\\uFB96\\uFB97\\uFB98\\uFB99\\uFB9A\\uFB9B\\uFB9C\\uFB9D\\uFB9E\\uFB9F\\uFBA0\\uFBA1\\uFBA2\\uFBA3\\uFBA4\\uFBA5\\uFBA6\\uFBA7\\uFBA8\\uFBA9\\uFBAA\\uFBAB\\uFBAC\\uFBAD\\uFBAE\\uFBAF\\uFBB0\\uFBB1\\uFBD3\\uFBD4\\uFBD5\\uFBD6\\uFBD7\\uFBD8\\uFBD9\\uFBDA\\uFBDB\\uFBDC\\uFBDD\\uFBDE\\uFBDF\\uFBE0\\uFBE1\\uFBE2\\uFBE3\\uFBE4\\uFBE5\\uFBE6\\uFBE7\\uFBE8\\uFBE9\\uFBEA\\uFBEB\\uFBEC\\uFBED\\uFBEE\\uFBEF\\uFBF0\\uFBF1\\uFBF2\\uFBF3\\uFBF4\\uFBF5\\uFBF6\\uFBF7\\uFBF8\\uFBF9\\uFBFA\\uFBFB\\uFBFC\\uFBFD\\uFBFE\\uFBFF\\uFC00\\uFC01\\uFC02\\uFC03\\uFC04\\uFC05\\uFC06\\uFC07\\uFC08\\uFC09\\uFC0A\\uFC0B\\uFC0C\\uFC0D\\uFC0E\\uFC0F\\uFC10\\uFC11\\uFC12\\uFC13\\uFC14\\uFC15\\uFC16\\uFC17\\uFC18\\uFC19\\uFC1A\\uFC1B\\uFC1C\\uFC1D\\uFC1E\\uFC1F\\uFC20\\uFC21\\uFC22\\uFC23\\uFC24\\uFC25\\uFC26\\uFC27\\uFC28\\uFC29\\uFC2A\\uFC2B\\uFC2C\\uFC2D\\uFC2E\\uFC2F\\uFC30\\uFC31\\uFC32\\uFC33\\uFC34\\uFC35\\uFC36\\uFC37\\uFC38\\uFC39\\uFC3A\\uFC3B\\uFC3C\\uFC3D\\uFC3E\\uFC3F\\uFC40\\uFC41\\uFC42\\uFC43\\uFC44\\uFC45\\uFC46\\uFC47\\uFC48\\uFC49\\uFC4A\\uFC4B\\uFC4C\\uFC4D\\uFC4E\\uFC4F\\uFC50\\uFC51\\uFC52\\uFC53\\uFC54\\uFC55\\uFC56\\uFC57\\uFC58\\uFC59\\uFC5A\\uFC5B\\uFC5C\\uFC5D\\uFC5E\\uFC5F\\uFC60\\uFC61\\uFC62\\uFC63\\uFC64\\uFC65\\uFC66\\uFC67\\uFC68\\uFC69\\uFC6A\\uFC6B\\uFC6C\\uFC6D\\uFC6E\\uFC6F\\uFC70\\uFC71\\uFC72\\uFC73\\uFC74\\uFC75\\uFC76\\uFC77\\uFC78\\uFC79\\uFC7A\\uFC7B\\uFC7C\\uFC7D\\uFC7E\\uFC7F\\uFC80\\uFC81\\uFC82\\uFC83\\uFC84\\uFC85\\uFC86\\uFC87\\uFC88\\uFC89\\uFC8A\\uFC8B\\uFC8C\\uFC8D\\uFC8E\\uFC8F\\uFC90\\uFC91\\uFC92\\uFC93\\uFC94\\uFC95\\uFC96\\uFC97\\uFC98\\uFC99\\uFC9A\\uFC9B\\uFC9C\\uFC9D\\uFC9E\\uFC9F\\uFCA0\\uFCA1\\uFCA2\\uFCA3\\uFCA4\\uFCA5\\uFCA6\\uFCA7\\uFCA8\\uFCA9\\uFCAA\\uFCAB\\uFCAC\\uFCAD\\uFCAE\\uFCAF\\uFCB0\\uFCB1\\uFCB2\\uFCB3\\uFCB4\\uFCB5\\uFCB6\\uFCB7\\uFCB8\\uFCB9\\uFCBA\\uFCBB\\uFCBC\\uFCBD\\uFCBE\\uFCBF\\uFCC0\\uFCC1\\uFCC2\\uFCC3\\uFCC4\\uFCC5\\uFCC6\\uFCC7\\uFCC8\\uFCC9\\uFCCA\\uFCCB\\uFCCC\\uFCCD\\uFCCE\\uFCCF\\uFCD0\\uFCD1\\uFCD2\\uFCD3\\uFCD4\\uFCD5\\uFCD6\\uFCD7\\uFCD8\\uFCD9\\uFCDA\\uFCDB\\uFCDC\\uFCDD\\uFCDE\\uFCDF\\uFCE0\\uFCE1\\uFCE2\\uFCE3\\uFCE4\\uFCE5\\uFCE6\\uFCE7\\uFCE8\\uFCE9\\uFCEA\\uFCEB\\uFCEC\\uFCED\\uFCEE\\uFCEF\\uFCF0\\uFCF1\\uFCF2\\uFCF3\\uFCF4\\uFCF5\\uFCF6\\uFCF7\\uFCF8\\uFCF9\\uFCFA\\uFCFB\\uFCFC\\uFCFD\\uFCFE\\uFCFF\\uFD00\\uFD01\\uFD02\\uFD03\\uFD04\\uFD05\\uFD06\\uFD07\\uFD08\\uFD09\\uFD0A\\uFD0B\\uFD0C\\uFD0D\\uFD0E\\uFD0F\\uFD10\\uFD11\\uFD12\\uFD13\\uFD14\\uFD15\\uFD16\\uFD17\\uFD18\\uFD19\\uFD1A\\uFD1B\\uFD1C\\uFD1D\\uFD1E\\uFD1F\\uFD20\\uFD21\\uFD22\\uFD23\\uFD24\\uFD25\\uFD26\\uFD27\\uFD28\\uFD29\\uFD2A\\uFD2B\\uFD2C\\uFD2D\\uFD2E\\uFD2F\\uFD30\\uFD31\\uFD32\\uFD33\\uFD34\\uFD35\\uFD36\\uFD37\\uFD38\\uFD39\\uFD3A\\uFD3B\\uFD3C\\uFD3D\\uFD50\\uFD51\\uFD52\\uFD53\\uFD54\\uFD55\\uFD56\\uFD57\\uFD58\\uFD59\\uFD5A\\uFD5B\\uFD5C\\uFD5D\\uFD5E\\uFD5F\\uFD60\\uFD61\\uFD62\\uFD63\\uFD64\\uFD65\\uFD66\\uFD67\\uFD68\\uFD69\\uFD6A\\uFD6B\\uFD6C\\uFD6D\\uFD6E\\uFD6F\\uFD70\\uFD71\\uFD72\\uFD73\\uFD74\\uFD75\\uFD76\\uFD77\\uFD78\\uFD79\\uFD7A\\uFD7B\\uFD7C\\uFD7D\\uFD7E\\uFD7F\\uFD80\\uFD81\\uFD82\\uFD83\\uFD84\\uFD85\\uFD86\\uFD87\\uFD88\\uFD89\\uFD8A\\uFD8B\\uFD8C\\uFD8D\\uFD8E\\uFD8F\\uFD92\\uFD93\\uFD94\\uFD95\\uFD96\\uFD97\\uFD98\\uFD99\\uFD9A\\uFD9B\\uFD9C\\uFD9D\\uFD9E\\uFD9F\\uFDA0\\uFDA1\\uFDA2\\uFDA3\\uFDA4\\uFDA5\\uFDA6\\uFDA7\\uFDA8\\uFDA9\\uFDAA\\uFDAB\\uFDAC\\uFDAD\\uFDAE\\uFDAF\\uFDB0\\uFDB1\\uFDB2\\uFDB3\\uFDB4\\uFDB5\\uFDB6\\uFDB7\\uFDB8\\uFDB9\\uFDBA\\uFDBB\\uFDBC\\uFDBD\\uFDBE\\uFDBF\\uFDC0\\uFDC1\\uFDC2\\uFDC3\\uFDC4\\uFDC5\\uFDC6\\uFDC7\\uFDF0\\uFDF1\\uFDF2\\uFDF3\\uFDF4\\uFDF5\\uFDF6\\uFDF7\\uFDF8\\uFDF9\\uFDFA\\uFDFB\\uFE70\\uFE71\\uFE72\\uFE73\\uFE74\\uFE76\\uFE77\\uFE78\\uFE79\\uFE7A\\uFE7B\\uFE7C\\uFE7D\\uFE7E\\uFE7F\\uFE80\\uFE81\\uFE82\\uFE83\\uFE84\\uFE85\\uFE86\\uFE87\\uFE88\\uFE89\\uFE8A\\uFE8B\\uFE8C\\uFE8D\\uFE8E\\uFE8F\\uFE90\\uFE91\\uFE92\\uFE93\\uFE94\\uFE95\\uFE96\\uFE97\\uFE98\\uFE99\\uFE9A\\uFE9B\\uFE9C\\uFE9D\\uFE9E\\uFE9F\\uFEA0\\uFEA1\\uFEA2\\uFEA3\\uFEA4\\uFEA5\\uFEA6\\uFEA7\\uFEA8\\uFEA9\\uFEAA\\uFEAB\\uFEAC\\uFEAD\\uFEAE\\uFEAF\\uFEB0\\uFEB1\\uFEB2\\uFEB3\\uFEB4\\uFEB5\\uFEB6\\uFEB7\\uFEB8\\uFEB9\\uFEBA\\uFEBB\\uFEBC\\uFEBD\\uFEBE\\uFEBF\\uFEC0\\uFEC1\\uFEC2\\uFEC3\\uFEC4\\uFEC5\\uFEC6\\uFEC7\\uFEC8\\uFEC9\\uFECA\\uFECB\\uFECC\\uFECD\\uFECE\\uFECF\\uFED0\\uFED1\\uFED2\\uFED3\\uFED4\\uFED5\\uFED6\\uFED7\\uFED8\\uFED9\\uFEDA\\uFEDB\\uFEDC\\uFEDD\\uFEDE\\uFEDF\\uFEE0\\uFEE1\\uFEE2\\uFEE3\\uFEE4\\uFEE5\\uFEE6\\uFEE7\\uFEE8\\uFEE9\\uFEEA\\uFEEB\\uFEEC\\uFEED\\uFEEE\\uFEEF\\uFEF0\\uFEF1\\uFEF2\\uFEF3\\uFEF4\\uFEF5\\uFEF6\\uFEF7\\uFEF8\\uFEF9\\uFEFA\\uFEFB\\uFEFC\\uFF66\\uFF67\\uFF68\\uFF69\\uFF6A\\uFF6B\\uFF6C\\uFF6D\\uFF6E\\uFF6F\\uFF71\\uFF72\\uFF73\\uFF74\\uFF75\\uFF76\\uFF77\\uFF78\\uFF79\\uFF7A\\uFF7B\\uFF7C\\uFF7D\\uFF7E\\uFF7F\\uFF80\\uFF81\\uFF82\\uFF83\\uFF84\\uFF85\\uFF86\\uFF87\\uFF88\\uFF89\\uFF8A\\uFF8B\\uFF8C\\uFF8D\\uFF8E\\uFF8F\\uFF90\\uFF91\\uFF92\\uFF93\\uFF94\\uFF95\\uFF96\\uFF97\\uFF98\\uFF99\\uFF9A\\uFF9B\\uFF9C\\uFF9D\\uFFA0\\uFFA1\\uFFA2\\uFFA3\\uFFA4\\uFFA5\\uFFA6\\uFFA7\\uFFA8\\uFFA9\\uFFAA\\uFFAB\\uFFAC\\uFFAD\\uFFAE\\uFFAF\\uFFB0\\uFFB1\\uFFB2\\uFFB3\\uFFB4\\uFFB5\\uFFB6\\uFFB7\\uFFB8\\uFFB9\\uFFBA\\uFFBB\\uFFBC\\uFFBD\\uFFBE\\uFFC2\\uFFC3\\uFFC4\\uFFC5\\uFFC6\\uFFC7\\uFFCA\\uFFCB\\uFFCC\\uFFCD\\uFFCE\\uFFCF\\uFFD2\\uFFD3\\uFFD4\\uFFD5\\uFFD6\\uFFD7\\uFFDA\\uFFDB\\uFFDC]", description: "[\\u01BB\\u01C0\\u01C1\\u01C2\\u01C3\\u0294\\u05D0\\u05D1\\u05D2\\u05D3\\u05D4\\u05D5\\u05D6\\u05D7\\u05D8\\u05D9\\u05DA\\u05DB\\u05DC\\u05DD\\u05DE\\u05DF\\u05E0\\u05E1\\u05E2\\u05E3\\u05E4\\u05E5\\u05E6\\u05E7\\u05E8\\u05E9\\u05EA\\u05F0\\u05F1\\u05F2\\u0621\\u0622\\u0623\\u0624\\u0625\\u0626\\u0627\\u0628\\u0629\\u062A\\u062B\\u062C\\u062D\\u062E\\u062F\\u0630\\u0631\\u0632\\u0633\\u0634\\u0635\\u0636\\u0637\\u0638\\u0639\\u063A\\u063B\\u063C\\u063D\\u063E\\u063F\\u0641\\u0642\\u0643\\u0644\\u0645\\u0646\\u0647\\u0648\\u0649\\u064A\\u066E\\u066F\\u0671\\u0672\\u0673\\u0674\\u0675\\u0676\\u0677\\u0678\\u0679\\u067A\\u067B\\u067C\\u067D\\u067E\\u067F\\u0680\\u0681\\u0682\\u0683\\u0684\\u0685\\u0686\\u0687\\u0688\\u0689\\u068A\\u068B\\u068C\\u068D\\u068E\\u068F\\u0690\\u0691\\u0692\\u0693\\u0694\\u0695\\u0696\\u0697\\u0698\\u0699\\u069A\\u069B\\u069C\\u069D\\u069E\\u069F\\u06A0\\u06A1\\u06A2\\u06A3\\u06A4\\u06A5\\u06A6\\u06A7\\u06A8\\u06A9\\u06AA\\u06AB\\u06AC\\u06AD\\u06AE\\u06AF\\u06B0\\u06B1\\u06B2\\u06B3\\u06B4\\u06B5\\u06B6\\u06B7\\u06B8\\u06B9\\u06BA\\u06BB\\u06BC\\u06BD\\u06BE\\u06BF\\u06C0\\u06C1\\u06C2\\u06C3\\u06C4\\u06C5\\u06C6\\u06C7\\u06C8\\u06C9\\u06CA\\u06CB\\u06CC\\u06CD\\u06CE\\u06CF\\u06D0\\u06D1\\u06D2\\u06D3\\u06D5\\u06EE\\u06EF\\u06FA\\u06FB\\u06FC\\u06FF\\u0710\\u0712\\u0713\\u0714\\u0715\\u0716\\u0717\\u0718\\u0719\\u071A\\u071B\\u071C\\u071D\\u071E\\u071F\\u0720\\u0721\\u0722\\u0723\\u0724\\u0725\\u0726\\u0727\\u0728\\u0729\\u072A\\u072B\\u072C\\u072D\\u072E\\u072F\\u074D\\u074E\\u074F\\u0750\\u0751\\u0752\\u0753\\u0754\\u0755\\u0756\\u0757\\u0758\\u0759\\u075A\\u075B\\u075C\\u075D\\u075E\\u075F\\u0760\\u0761\\u0762\\u0763\\u0764\\u0765\\u0766\\u0767\\u0768\\u0769\\u076A\\u076B\\u076C\\u076D\\u076E\\u076F\\u0770\\u0771\\u0772\\u0773\\u0774\\u0775\\u0776\\u0777\\u0778\\u0779\\u077A\\u077B\\u077C\\u077D\\u077E\\u077F\\u0780\\u0781\\u0782\\u0783\\u0784\\u0785\\u0786\\u0787\\u0788\\u0789\\u078A\\u078B\\u078C\\u078D\\u078E\\u078F\\u0790\\u0791\\u0792\\u0793\\u0794\\u0795\\u0796\\u0797\\u0798\\u0799\\u079A\\u079B\\u079C\\u079D\\u079E\\u079F\\u07A0\\u07A1\\u07A2\\u07A3\\u07A4\\u07A5\\u07B1\\u07CA\\u07CB\\u07CC\\u07CD\\u07CE\\u07CF\\u07D0\\u07D1\\u07D2\\u07D3\\u07D4\\u07D5\\u07D6\\u07D7\\u07D8\\u07D9\\u07DA\\u07DB\\u07DC\\u07DD\\u07DE\\u07DF\\u07E0\\u07E1\\u07E2\\u07E3\\u07E4\\u07E5\\u07E6\\u07E7\\u07E8\\u07E9\\u07EA\\u0904\\u0905\\u0906\\u0907\\u0908\\u0909\\u090A\\u090B\\u090C\\u090D\\u090E\\u090F\\u0910\\u0911\\u0912\\u0913\\u0914\\u0915\\u0916\\u0917\\u0918\\u0919\\u091A\\u091B\\u091C\\u091D\\u091E\\u091F\\u0920\\u0921\\u0922\\u0923\\u0924\\u0925\\u0926\\u0927\\u0928\\u0929\\u092A\\u092B\\u092C\\u092D\\u092E\\u092F\\u0930\\u0931\\u0932\\u0933\\u0934\\u0935\\u0936\\u0937\\u0938\\u0939\\u093D\\u0950\\u0958\\u0959\\u095A\\u095B\\u095C\\u095D\\u095E\\u095F\\u0960\\u0961\\u0972\\u097B\\u097C\\u097D\\u097E\\u097F\\u0985\\u0986\\u0987\\u0988\\u0989\\u098A\\u098B\\u098C\\u098F\\u0990\\u0993\\u0994\\u0995\\u0996\\u0997\\u0998\\u0999\\u099A\\u099B\\u099C\\u099D\\u099E\\u099F\\u09A0\\u09A1\\u09A2\\u09A3\\u09A4\\u09A5\\u09A6\\u09A7\\u09A8\\u09AA\\u09AB\\u09AC\\u09AD\\u09AE\\u09AF\\u09B0\\u09B2\\u09B6\\u09B7\\u09B8\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF\\u09E0\\u09E1\\u09F0\\u09F1\\u0A05\\u0A06\\u0A07\\u0A08\\u0A09\\u0A0A\\u0A0F\\u0A10\\u0A13\\u0A14\\u0A15\\u0A16\\u0A17\\u0A18\\u0A19\\u0A1A\\u0A1B\\u0A1C\\u0A1D\\u0A1E\\u0A1F\\u0A20\\u0A21\\u0A22\\u0A23\\u0A24\\u0A25\\u0A26\\u0A27\\u0A28\\u0A2A\\u0A2B\\u0A2C\\u0A2D\\u0A2E\\u0A2F\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59\\u0A5A\\u0A5B\\u0A5C\\u0A5E\\u0A72\\u0A73\\u0A74\\u0A85\\u0A86\\u0A87\\u0A88\\u0A89\\u0A8A\\u0A8B\\u0A8C\\u0A8D\\u0A8F\\u0A90\\u0A91\\u0A93\\u0A94\\u0A95\\u0A96\\u0A97\\u0A98\\u0A99\\u0A9A\\u0A9B\\u0A9C\\u0A9D\\u0A9E\\u0A9F\\u0AA0\\u0AA1\\u0AA2\\u0AA3\\u0AA4\\u0AA5\\u0AA6\\u0AA7\\u0AA8\\u0AAA\\u0AAB\\u0AAC\\u0AAD\\u0AAE\\u0AAF\\u0AB0\\u0AB2\\u0AB3\\u0AB5\\u0AB6\\u0AB7\\u0AB8\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05\\u0B06\\u0B07\\u0B08\\u0B09\\u0B0A\\u0B0B\\u0B0C\\u0B0F\\u0B10\\u0B13\\u0B14\\u0B15\\u0B16\\u0B17\\u0B18\\u0B19\\u0B1A\\u0B1B\\u0B1C\\u0B1D\\u0B1E\\u0B1F\\u0B20\\u0B21\\u0B22\\u0B23\\u0B24\\u0B25\\u0B26\\u0B27\\u0B28\\u0B2A\\u0B2B\\u0B2C\\u0B2D\\u0B2E\\u0B2F\\u0B30\\u0B32\\u0B33\\u0B35\\u0B36\\u0B37\\u0B38\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F\\u0B60\\u0B61\\u0B71\\u0B83\\u0B85\\u0B86\\u0B87\\u0B88\\u0B89\\u0B8A\\u0B8E\\u0B8F\\u0B90\\u0B92\\u0B93\\u0B94\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8\\u0BA9\\u0BAA\\u0BAE\\u0BAF\\u0BB0\\u0BB1\\u0BB2\\u0BB3\\u0BB4\\u0BB5\\u0BB6\\u0BB7\\u0BB8\\u0BB9\\u0BD0\\u0C05\\u0C06\\u0C07\\u0C08\\u0C09\\u0C0A\\u0C0B\\u0C0C\\u0C0E\\u0C0F\\u0C10\\u0C12\\u0C13\\u0C14\\u0C15\\u0C16\\u0C17\\u0C18\\u0C19\\u0C1A\\u0C1B\\u0C1C\\u0C1D\\u0C1E\\u0C1F\\u0C20\\u0C21\\u0C22\\u0C23\\u0C24\\u0C25\\u0C26\\u0C27\\u0C28\\u0C2A\\u0C2B\\u0C2C\\u0C2D\\u0C2E\\u0C2F\\u0C30\\u0C31\\u0C32\\u0C33\\u0C35\\u0C36\\u0C37\\u0C38\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85\\u0C86\\u0C87\\u0C88\\u0C89\\u0C8A\\u0C8B\\u0C8C\\u0C8E\\u0C8F\\u0C90\\u0C92\\u0C93\\u0C94\\u0C95\\u0C96\\u0C97\\u0C98\\u0C99\\u0C9A\\u0C9B\\u0C9C\\u0C9D\\u0C9E\\u0C9F\\u0CA0\\u0CA1\\u0CA2\\u0CA3\\u0CA4\\u0CA5\\u0CA6\\u0CA7\\u0CA8\\u0CAA\\u0CAB\\u0CAC\\u0CAD\\u0CAE\\u0CAF\\u0CB0\\u0CB1\\u0CB2\\u0CB3\\u0CB5\\u0CB6\\u0CB7\\u0CB8\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0D05\\u0D06\\u0D07\\u0D08\\u0D09\\u0D0A\\u0D0B\\u0D0C\\u0D0E\\u0D0F\\u0D10\\u0D12\\u0D13\\u0D14\\u0D15\\u0D16\\u0D17\\u0D18\\u0D19\\u0D1A\\u0D1B\\u0D1C\\u0D1D\\u0D1E\\u0D1F\\u0D20\\u0D21\\u0D22\\u0D23\\u0D24\\u0D25\\u0D26\\u0D27\\u0D28\\u0D2A\\u0D2B\\u0D2C\\u0D2D\\u0D2E\\u0D2F\\u0D30\\u0D31\\u0D32\\u0D33\\u0D34\\u0D35\\u0D36\\u0D37\\u0D38\\u0D39\\u0D3D\\u0D60\\u0D61\\u0D7A\\u0D7B\\u0D7C\\u0D7D\\u0D7E\\u0D7F\\u0D85\\u0D86\\u0D87\\u0D88\\u0D89\\u0D8A\\u0D8B\\u0D8C\\u0D8D\\u0D8E\\u0D8F\\u0D90\\u0D91\\u0D92\\u0D93\\u0D94\\u0D95\\u0D96\\u0D9A\\u0D9B\\u0D9C\\u0D9D\\u0D9E\\u0D9F\\u0DA0\\u0DA1\\u0DA2\\u0DA3\\u0DA4\\u0DA5\\u0DA6\\u0DA7\\u0DA8\\u0DA9\\u0DAA\\u0DAB\\u0DAC\\u0DAD\\u0DAE\\u0DAF\\u0DB0\\u0DB1\\u0DB3\\u0DB4\\u0DB5\\u0DB6\\u0DB7\\u0DB8\\u0DB9\\u0DBA\\u0DBB\\u0DBD\\u0DC0\\u0DC1\\u0DC2\\u0DC3\\u0DC4\\u0DC5\\u0DC6\\u0E01\\u0E02\\u0E03\\u0E04\\u0E05\\u0E06\\u0E07\\u0E08\\u0E09\\u0E0A\\u0E0B\\u0E0C\\u0E0D\\u0E0E\\u0E0F\\u0E10\\u0E11\\u0E12\\u0E13\\u0E14\\u0E15\\u0E16\\u0E17\\u0E18\\u0E19\\u0E1A\\u0E1B\\u0E1C\\u0E1D\\u0E1E\\u0E1F\\u0E20\\u0E21\\u0E22\\u0E23\\u0E24\\u0E25\\u0E26\\u0E27\\u0E28\\u0E29\\u0E2A\\u0E2B\\u0E2C\\u0E2D\\u0E2E\\u0E2F\\u0E30\\u0E32\\u0E33\\u0E40\\u0E41\\u0E42\\u0E43\\u0E44\\u0E45\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94\\u0E95\\u0E96\\u0E97\\u0E99\\u0E9A\\u0E9B\\u0E9C\\u0E9D\\u0E9E\\u0E9F\\u0EA1\\u0EA2\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD\\u0EAE\\u0EAF\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0\\u0EC1\\u0EC2\\u0EC3\\u0EC4\\u0EDC\\u0EDD\\u0F00\\u0F40\\u0F41\\u0F42\\u0F43\\u0F44\\u0F45\\u0F46\\u0F47\\u0F49\\u0F4A\\u0F4B\\u0F4C\\u0F4D\\u0F4E\\u0F4F\\u0F50\\u0F51\\u0F52\\u0F53\\u0F54\\u0F55\\u0F56\\u0F57\\u0F58\\u0F59\\u0F5A\\u0F5B\\u0F5C\\u0F5D\\u0F5E\\u0F5F\\u0F60\\u0F61\\u0F62\\u0F63\\u0F64\\u0F65\\u0F66\\u0F67\\u0F68\\u0F69\\u0F6A\\u0F6B\\u0F6C\\u0F88\\u0F89\\u0F8A\\u0F8B\\u1000\\u1001\\u1002\\u1003\\u1004\\u1005\\u1006\\u1007\\u1008\\u1009\\u100A\\u100B\\u100C\\u100D\\u100E\\u100F\\u1010\\u1011\\u1012\\u1013\\u1014\\u1015\\u1016\\u1017\\u1018\\u1019\\u101A\\u101B\\u101C\\u101D\\u101E\\u101F\\u1020\\u1021\\u1022\\u1023\\u1024\\u1025\\u1026\\u1027\\u1028\\u1029\\u102A\\u103F\\u1050\\u1051\\u1052\\u1053\\u1054\\u1055\\u105A\\u105B\\u105C\\u105D\\u1061\\u1065\\u1066\\u106E\\u106F\\u1070\\u1075\\u1076\\u1077\\u1078\\u1079\\u107A\\u107B\\u107C\\u107D\\u107E\\u107F\\u1080\\u1081\\u108E\\u10D0\\u10D1\\u10D2\\u10D3\\u10D4\\u10D5\\u10D6\\u10D7\\u10D8\\u10D9\\u10DA\\u10DB\\u10DC\\u10DD\\u10DE\\u10DF\\u10E0\\u10E1\\u10E2\\u10E3\\u10E4\\u10E5\\u10E6\\u10E7\\u10E8\\u10E9\\u10EA\\u10EB\\u10EC\\u10ED\\u10EE\\u10EF\\u10F0\\u10F1\\u10F2\\u10F3\\u10F4\\u10F5\\u10F6\\u10F7\\u10F8\\u10F9\\u10FA\\u1100\\u1101\\u1102\\u1103\\u1104\\u1105\\u1106\\u1107\\u1108\\u1109\\u110A\\u110B\\u110C\\u110D\\u110E\\u110F\\u1110\\u1111\\u1112\\u1113\\u1114\\u1115\\u1116\\u1117\\u1118\\u1119\\u111A\\u111B\\u111C\\u111D\\u111E\\u111F\\u1120\\u1121\\u1122\\u1123\\u1124\\u1125\\u1126\\u1127\\u1128\\u1129\\u112A\\u112B\\u112C\\u112D\\u112E\\u112F\\u1130\\u1131\\u1132\\u1133\\u1134\\u1135\\u1136\\u1137\\u1138\\u1139\\u113A\\u113B\\u113C\\u113D\\u113E\\u113F\\u1140\\u1141\\u1142\\u1143\\u1144\\u1145\\u1146\\u1147\\u1148\\u1149\\u114A\\u114B\\u114C\\u114D\\u114E\\u114F\\u1150\\u1151\\u1152\\u1153\\u1154\\u1155\\u1156\\u1157\\u1158\\u1159\\u115F\\u1160\\u1161\\u1162\\u1163\\u1164\\u1165\\u1166\\u1167\\u1168\\u1169\\u116A\\u116B\\u116C\\u116D\\u116E\\u116F\\u1170\\u1171\\u1172\\u1173\\u1174\\u1175\\u1176\\u1177\\u1178\\u1179\\u117A\\u117B\\u117C\\u117D\\u117E\\u117F\\u1180\\u1181\\u1182\\u1183\\u1184\\u1185\\u1186\\u1187\\u1188\\u1189\\u118A\\u118B\\u118C\\u118D\\u118E\\u118F\\u1190\\u1191\\u1192\\u1193\\u1194\\u1195\\u1196\\u1197\\u1198\\u1199\\u119A\\u119B\\u119C\\u119D\\u119E\\u119F\\u11A0\\u11A1\\u11A2\\u11A8\\u11A9\\u11AA\\u11AB\\u11AC\\u11AD\\u11AE\\u11AF\\u11B0\\u11B1\\u11B2\\u11B3\\u11B4\\u11B5\\u11B6\\u11B7\\u11B8\\u11B9\\u11BA\\u11BB\\u11BC\\u11BD\\u11BE\\u11BF\\u11C0\\u11C1\\u11C2\\u11C3\\u11C4\\u11C5\\u11C6\\u11C7\\u11C8\\u11C9\\u11CA\\u11CB\\u11CC\\u11CD\\u11CE\\u11CF\\u11D0\\u11D1\\u11D2\\u11D3\\u11D4\\u11D5\\u11D6\\u11D7\\u11D8\\u11D9\\u11DA\\u11DB\\u11DC\\u11DD\\u11DE\\u11DF\\u11E0\\u11E1\\u11E2\\u11E3\\u11E4\\u11E5\\u11E6\\u11E7\\u11E8\\u11E9\\u11EA\\u11EB\\u11EC\\u11ED\\u11EE\\u11EF\\u11F0\\u11F1\\u11F2\\u11F3\\u11F4\\u11F5\\u11F6\\u11F7\\u11F8\\u11F9\\u1200\\u1201\\u1202\\u1203\\u1204\\u1205\\u1206\\u1207\\u1208\\u1209\\u120A\\u120B\\u120C\\u120D\\u120E\\u120F\\u1210\\u1211\\u1212\\u1213\\u1214\\u1215\\u1216\\u1217\\u1218\\u1219\\u121A\\u121B\\u121C\\u121D\\u121E\\u121F\\u1220\\u1221\\u1222\\u1223\\u1224\\u1225\\u1226\\u1227\\u1228\\u1229\\u122A\\u122B\\u122C\\u122D\\u122E\\u122F\\u1230\\u1231\\u1232\\u1233\\u1234\\u1235\\u1236\\u1237\\u1238\\u1239\\u123A\\u123B\\u123C\\u123D\\u123E\\u123F\\u1240\\u1241\\u1242\\u1243\\u1244\\u1245\\u1246\\u1247\\u1248\\u124A\\u124B\\u124C\\u124D\\u1250\\u1251\\u1252\\u1253\\u1254\\u1255\\u1256\\u1258\\u125A\\u125B\\u125C\\u125D\\u1260\\u1261\\u1262\\u1263\\u1264\\u1265\\u1266\\u1267\\u1268\\u1269\\u126A\\u126B\\u126C\\u126D\\u126E\\u126F\\u1270\\u1271\\u1272\\u1273\\u1274\\u1275\\u1276\\u1277\\u1278\\u1279\\u127A\\u127B\\u127C\\u127D\\u127E\\u127F\\u1280\\u1281\\u1282\\u1283\\u1284\\u1285\\u1286\\u1287\\u1288\\u128A\\u128B\\u128C\\u128D\\u1290\\u1291\\u1292\\u1293\\u1294\\u1295\\u1296\\u1297\\u1298\\u1299\\u129A\\u129B\\u129C\\u129D\\u129E\\u129F\\u12A0\\u12A1\\u12A2\\u12A3\\u12A4\\u12A5\\u12A6\\u12A7\\u12A8\\u12A9\\u12AA\\u12AB\\u12AC\\u12AD\\u12AE\\u12AF\\u12B0\\u12B2\\u12B3\\u12B4\\u12B5\\u12B8\\u12B9\\u12BA\\u12BB\\u12BC\\u12BD\\u12BE\\u12C0\\u12C2\\u12C3\\u12C4\\u12C5\\u12C8\\u12C9\\u12CA\\u12CB\\u12CC\\u12CD\\u12CE\\u12CF\\u12D0\\u12D1\\u12D2\\u12D3\\u12D4\\u12D5\\u12D6\\u12D8\\u12D9\\u12DA\\u12DB\\u12DC\\u12DD\\u12DE\\u12DF\\u12E0\\u12E1\\u12E2\\u12E3\\u12E4\\u12E5\\u12E6\\u12E7\\u12E8\\u12E9\\u12EA\\u12EB\\u12EC\\u12ED\\u12EE\\u12EF\\u12F0\\u12F1\\u12F2\\u12F3\\u12F4\\u12F5\\u12F6\\u12F7\\u12F8\\u12F9\\u12FA\\u12FB\\u12FC\\u12FD\\u12FE\\u12FF\\u1300\\u1301\\u1302\\u1303\\u1304\\u1305\\u1306\\u1307\\u1308\\u1309\\u130A\\u130B\\u130C\\u130D\\u130E\\u130F\\u1310\\u1312\\u1313\\u1314\\u1315\\u1318\\u1319\\u131A\\u131B\\u131C\\u131D\\u131E\\u131F\\u1320\\u1321\\u1322\\u1323\\u1324\\u1325\\u1326\\u1327\\u1328\\u1329\\u132A\\u132B\\u132C\\u132D\\u132E\\u132F\\u1330\\u1331\\u1332\\u1333\\u1334\\u1335\\u1336\\u1337\\u1338\\u1339\\u133A\\u133B\\u133C\\u133D\\u133E\\u133F\\u1340\\u1341\\u1342\\u1343\\u1344\\u1345\\u1346\\u1347\\u1348\\u1349\\u134A\\u134B\\u134C\\u134D\\u134E\\u134F\\u1350\\u1351\\u1352\\u1353\\u1354\\u1355\\u1356\\u1357\\u1358\\u1359\\u135A\\u1380\\u1381\\u1382\\u1383\\u1384\\u1385\\u1386\\u1387\\u1388\\u1389\\u138A\\u138B\\u138C\\u138D\\u138E\\u138F\\u13A0\\u13A1\\u13A2\\u13A3\\u13A4\\u13A5\\u13A6\\u13A7\\u13A8\\u13A9\\u13AA\\u13AB\\u13AC\\u13AD\\u13AE\\u13AF\\u13B0\\u13B1\\u13B2\\u13B3\\u13B4\\u13B5\\u13B6\\u13B7\\u13B8\\u13B9\\u13BA\\u13BB\\u13BC\\u13BD\\u13BE\\u13BF\\u13C0\\u13C1\\u13C2\\u13C3\\u13C4\\u13C5\\u13C6\\u13C7\\u13C8\\u13C9\\u13CA\\u13CB\\u13CC\\u13CD\\u13CE\\u13CF\\u13D0\\u13D1\\u13D2\\u13D3\\u13D4\\u13D5\\u13D6\\u13D7\\u13D8\\u13D9\\u13DA\\u13DB\\u13DC\\u13DD\\u13DE\\u13DF\\u13E0\\u13E1\\u13E2\\u13E3\\u13E4\\u13E5\\u13E6\\u13E7\\u13E8\\u13E9\\u13EA\\u13EB\\u13EC\\u13ED\\u13EE\\u13EF\\u13F0\\u13F1\\u13F2\\u13F3\\u13F4\\u1401\\u1402\\u1403\\u1404\\u1405\\u1406\\u1407\\u1408\\u1409\\u140A\\u140B\\u140C\\u140D\\u140E\\u140F\\u1410\\u1411\\u1412\\u1413\\u1414\\u1415\\u1416\\u1417\\u1418\\u1419\\u141A\\u141B\\u141C\\u141D\\u141E\\u141F\\u1420\\u1421\\u1422\\u1423\\u1424\\u1425\\u1426\\u1427\\u1428\\u1429\\u142A\\u142B\\u142C\\u142D\\u142E\\u142F\\u1430\\u1431\\u1432\\u1433\\u1434\\u1435\\u1436\\u1437\\u1438\\u1439\\u143A\\u143B\\u143C\\u143D\\u143E\\u143F\\u1440\\u1441\\u1442\\u1443\\u1444\\u1445\\u1446\\u1447\\u1448\\u1449\\u144A\\u144B\\u144C\\u144D\\u144E\\u144F\\u1450\\u1451\\u1452\\u1453\\u1454\\u1455\\u1456\\u1457\\u1458\\u1459\\u145A\\u145B\\u145C\\u145D\\u145E\\u145F\\u1460\\u1461\\u1462\\u1463\\u1464\\u1465\\u1466\\u1467\\u1468\\u1469\\u146A\\u146B\\u146C\\u146D\\u146E\\u146F\\u1470\\u1471\\u1472\\u1473\\u1474\\u1475\\u1476\\u1477\\u1478\\u1479\\u147A\\u147B\\u147C\\u147D\\u147E\\u147F\\u1480\\u1481\\u1482\\u1483\\u1484\\u1485\\u1486\\u1487\\u1488\\u1489\\u148A\\u148B\\u148C\\u148D\\u148E\\u148F\\u1490\\u1491\\u1492\\u1493\\u1494\\u1495\\u1496\\u1497\\u1498\\u1499\\u149A\\u149B\\u149C\\u149D\\u149E\\u149F\\u14A0\\u14A1\\u14A2\\u14A3\\u14A4\\u14A5\\u14A6\\u14A7\\u14A8\\u14A9\\u14AA\\u14AB\\u14AC\\u14AD\\u14AE\\u14AF\\u14B0\\u14B1\\u14B2\\u14B3\\u14B4\\u14B5\\u14B6\\u14B7\\u14B8\\u14B9\\u14BA\\u14BB\\u14BC\\u14BD\\u14BE\\u14BF\\u14C0\\u14C1\\u14C2\\u14C3\\u14C4\\u14C5\\u14C6\\u14C7\\u14C8\\u14C9\\u14CA\\u14CB\\u14CC\\u14CD\\u14CE\\u14CF\\u14D0\\u14D1\\u14D2\\u14D3\\u14D4\\u14D5\\u14D6\\u14D7\\u14D8\\u14D9\\u14DA\\u14DB\\u14DC\\u14DD\\u14DE\\u14DF\\u14E0\\u14E1\\u14E2\\u14E3\\u14E4\\u14E5\\u14E6\\u14E7\\u14E8\\u14E9\\u14EA\\u14EB\\u14EC\\u14ED\\u14EE\\u14EF\\u14F0\\u14F1\\u14F2\\u14F3\\u14F4\\u14F5\\u14F6\\u14F7\\u14F8\\u14F9\\u14FA\\u14FB\\u14FC\\u14FD\\u14FE\\u14FF\\u1500\\u1501\\u1502\\u1503\\u1504\\u1505\\u1506\\u1507\\u1508\\u1509\\u150A\\u150B\\u150C\\u150D\\u150E\\u150F\\u1510\\u1511\\u1512\\u1513\\u1514\\u1515\\u1516\\u1517\\u1518\\u1519\\u151A\\u151B\\u151C\\u151D\\u151E\\u151F\\u1520\\u1521\\u1522\\u1523\\u1524\\u1525\\u1526\\u1527\\u1528\\u1529\\u152A\\u152B\\u152C\\u152D\\u152E\\u152F\\u1530\\u1531\\u1532\\u1533\\u1534\\u1535\\u1536\\u1537\\u1538\\u1539\\u153A\\u153B\\u153C\\u153D\\u153E\\u153F\\u1540\\u1541\\u1542\\u1543\\u1544\\u1545\\u1546\\u1547\\u1548\\u1549\\u154A\\u154B\\u154C\\u154D\\u154E\\u154F\\u1550\\u1551\\u1552\\u1553\\u1554\\u1555\\u1556\\u1557\\u1558\\u1559\\u155A\\u155B\\u155C\\u155D\\u155E\\u155F\\u1560\\u1561\\u1562\\u1563\\u1564\\u1565\\u1566\\u1567\\u1568\\u1569\\u156A\\u156B\\u156C\\u156D\\u156E\\u156F\\u1570\\u1571\\u1572\\u1573\\u1574\\u1575\\u1576\\u1577\\u1578\\u1579\\u157A\\u157B\\u157C\\u157D\\u157E\\u157F\\u1580\\u1581\\u1582\\u1583\\u1584\\u1585\\u1586\\u1587\\u1588\\u1589\\u158A\\u158B\\u158C\\u158D\\u158E\\u158F\\u1590\\u1591\\u1592\\u1593\\u1594\\u1595\\u1596\\u1597\\u1598\\u1599\\u159A\\u159B\\u159C\\u159D\\u159E\\u159F\\u15A0\\u15A1\\u15A2\\u15A3\\u15A4\\u15A5\\u15A6\\u15A7\\u15A8\\u15A9\\u15AA\\u15AB\\u15AC\\u15AD\\u15AE\\u15AF\\u15B0\\u15B1\\u15B2\\u15B3\\u15B4\\u15B5\\u15B6\\u15B7\\u15B8\\u15B9\\u15BA\\u15BB\\u15BC\\u15BD\\u15BE\\u15BF\\u15C0\\u15C1\\u15C2\\u15C3\\u15C4\\u15C5\\u15C6\\u15C7\\u15C8\\u15C9\\u15CA\\u15CB\\u15CC\\u15CD\\u15CE\\u15CF\\u15D0\\u15D1\\u15D2\\u15D3\\u15D4\\u15D5\\u15D6\\u15D7\\u15D8\\u15D9\\u15DA\\u15DB\\u15DC\\u15DD\\u15DE\\u15DF\\u15E0\\u15E1\\u15E2\\u15E3\\u15E4\\u15E5\\u15E6\\u15E7\\u15E8\\u15E9\\u15EA\\u15EB\\u15EC\\u15ED\\u15EE\\u15EF\\u15F0\\u15F1\\u15F2\\u15F3\\u15F4\\u15F5\\u15F6\\u15F7\\u15F8\\u15F9\\u15FA\\u15FB\\u15FC\\u15FD\\u15FE\\u15FF\\u1600\\u1601\\u1602\\u1603\\u1604\\u1605\\u1606\\u1607\\u1608\\u1609\\u160A\\u160B\\u160C\\u160D\\u160E\\u160F\\u1610\\u1611\\u1612\\u1613\\u1614\\u1615\\u1616\\u1617\\u1618\\u1619\\u161A\\u161B\\u161C\\u161D\\u161E\\u161F\\u1620\\u1621\\u1622\\u1623\\u1624\\u1625\\u1626\\u1627\\u1628\\u1629\\u162A\\u162B\\u162C\\u162D\\u162E\\u162F\\u1630\\u1631\\u1632\\u1633\\u1634\\u1635\\u1636\\u1637\\u1638\\u1639\\u163A\\u163B\\u163C\\u163D\\u163E\\u163F\\u1640\\u1641\\u1642\\u1643\\u1644\\u1645\\u1646\\u1647\\u1648\\u1649\\u164A\\u164B\\u164C\\u164D\\u164E\\u164F\\u1650\\u1651\\u1652\\u1653\\u1654\\u1655\\u1656\\u1657\\u1658\\u1659\\u165A\\u165B\\u165C\\u165D\\u165E\\u165F\\u1660\\u1661\\u1662\\u1663\\u1664\\u1665\\u1666\\u1667\\u1668\\u1669\\u166A\\u166B\\u166C\\u166F\\u1670\\u1671\\u1672\\u1673\\u1674\\u1675\\u1676\\u1681\\u1682\\u1683\\u1684\\u1685\\u1686\\u1687\\u1688\\u1689\\u168A\\u168B\\u168C\\u168D\\u168E\\u168F\\u1690\\u1691\\u1692\\u1693\\u1694\\u1695\\u1696\\u1697\\u1698\\u1699\\u169A\\u16A0\\u16A1\\u16A2\\u16A3\\u16A4\\u16A5\\u16A6\\u16A7\\u16A8\\u16A9\\u16AA\\u16AB\\u16AC\\u16AD\\u16AE\\u16AF\\u16B0\\u16B1\\u16B2\\u16B3\\u16B4\\u16B5\\u16B6\\u16B7\\u16B8\\u16B9\\u16BA\\u16BB\\u16BC\\u16BD\\u16BE\\u16BF\\u16C0\\u16C1\\u16C2\\u16C3\\u16C4\\u16C5\\u16C6\\u16C7\\u16C8\\u16C9\\u16CA\\u16CB\\u16CC\\u16CD\\u16CE\\u16CF\\u16D0\\u16D1\\u16D2\\u16D3\\u16D4\\u16D5\\u16D6\\u16D7\\u16D8\\u16D9\\u16DA\\u16DB\\u16DC\\u16DD\\u16DE\\u16DF\\u16E0\\u16E1\\u16E2\\u16E3\\u16E4\\u16E5\\u16E6\\u16E7\\u16E8\\u16E9\\u16EA\\u1700\\u1701\\u1702\\u1703\\u1704\\u1705\\u1706\\u1707\\u1708\\u1709\\u170A\\u170B\\u170C\\u170E\\u170F\\u1710\\u1711\\u1720\\u1721\\u1722\\u1723\\u1724\\u1725\\u1726\\u1727\\u1728\\u1729\\u172A\\u172B\\u172C\\u172D\\u172E\\u172F\\u1730\\u1731\\u1740\\u1741\\u1742\\u1743\\u1744\\u1745\\u1746\\u1747\\u1748\\u1749\\u174A\\u174B\\u174C\\u174D\\u174E\\u174F\\u1750\\u1751\\u1760\\u1761\\u1762\\u1763\\u1764\\u1765\\u1766\\u1767\\u1768\\u1769\\u176A\\u176B\\u176C\\u176E\\u176F\\u1770\\u1780\\u1781\\u1782\\u1783\\u1784\\u1785\\u1786\\u1787\\u1788\\u1789\\u178A\\u178B\\u178C\\u178D\\u178E\\u178F\\u1790\\u1791\\u1792\\u1793\\u1794\\u1795\\u1796\\u1797\\u1798\\u1799\\u179A\\u179B\\u179C\\u179D\\u179E\\u179F\\u17A0\\u17A1\\u17A2\\u17A3\\u17A4\\u17A5\\u17A6\\u17A7\\u17A8\\u17A9\\u17AA\\u17AB\\u17AC\\u17AD\\u17AE\\u17AF\\u17B0\\u17B1\\u17B2\\u17B3\\u17DC\\u1820\\u1821\\u1822\\u1823\\u1824\\u1825\\u1826\\u1827\\u1828\\u1829\\u182A\\u182B\\u182C\\u182D\\u182E\\u182F\\u1830\\u1831\\u1832\\u1833\\u1834\\u1835\\u1836\\u1837\\u1838\\u1839\\u183A\\u183B\\u183C\\u183D\\u183E\\u183F\\u1840\\u1841\\u1842\\u1844\\u1845\\u1846\\u1847\\u1848\\u1849\\u184A\\u184B\\u184C\\u184D\\u184E\\u184F\\u1850\\u1851\\u1852\\u1853\\u1854\\u1855\\u1856\\u1857\\u1858\\u1859\\u185A\\u185B\\u185C\\u185D\\u185E\\u185F\\u1860\\u1861\\u1862\\u1863\\u1864\\u1865\\u1866\\u1867\\u1868\\u1869\\u186A\\u186B\\u186C\\u186D\\u186E\\u186F\\u1870\\u1871\\u1872\\u1873\\u1874\\u1875\\u1876\\u1877\\u1880\\u1881\\u1882\\u1883\\u1884\\u1885\\u1886\\u1887\\u1888\\u1889\\u188A\\u188B\\u188C\\u188D\\u188E\\u188F\\u1890\\u1891\\u1892\\u1893\\u1894\\u1895\\u1896\\u1897\\u1898\\u1899\\u189A\\u189B\\u189C\\u189D\\u189E\\u189F\\u18A0\\u18A1\\u18A2\\u18A3\\u18A4\\u18A5\\u18A6\\u18A7\\u18A8\\u18AA\\u1900\\u1901\\u1902\\u1903\\u1904\\u1905\\u1906\\u1907\\u1908\\u1909\\u190A\\u190B\\u190C\\u190D\\u190E\\u190F\\u1910\\u1911\\u1912\\u1913\\u1914\\u1915\\u1916\\u1917\\u1918\\u1919\\u191A\\u191B\\u191C\\u1950\\u1951\\u1952\\u1953\\u1954\\u1955\\u1956\\u1957\\u1958\\u1959\\u195A\\u195B\\u195C\\u195D\\u195E\\u195F\\u1960\\u1961\\u1962\\u1963\\u1964\\u1965\\u1966\\u1967\\u1968\\u1969\\u196A\\u196B\\u196C\\u196D\\u1970\\u1971\\u1972\\u1973\\u1974\\u1980\\u1981\\u1982\\u1983\\u1984\\u1985\\u1986\\u1987\\u1988\\u1989\\u198A\\u198B\\u198C\\u198D\\u198E\\u198F\\u1990\\u1991\\u1992\\u1993\\u1994\\u1995\\u1996\\u1997\\u1998\\u1999\\u199A\\u199B\\u199C\\u199D\\u199E\\u199F\\u19A0\\u19A1\\u19A2\\u19A3\\u19A4\\u19A5\\u19A6\\u19A7\\u19A8\\u19A9\\u19C1\\u19C2\\u19C3\\u19C4\\u19C5\\u19C6\\u19C7\\u1A00\\u1A01\\u1A02\\u1A03\\u1A04\\u1A05\\u1A06\\u1A07\\u1A08\\u1A09\\u1A0A\\u1A0B\\u1A0C\\u1A0D\\u1A0E\\u1A0F\\u1A10\\u1A11\\u1A12\\u1A13\\u1A14\\u1A15\\u1A16\\u1B05\\u1B06\\u1B07\\u1B08\\u1B09\\u1B0A\\u1B0B\\u1B0C\\u1B0D\\u1B0E\\u1B0F\\u1B10\\u1B11\\u1B12\\u1B13\\u1B14\\u1B15\\u1B16\\u1B17\\u1B18\\u1B19\\u1B1A\\u1B1B\\u1B1C\\u1B1D\\u1B1E\\u1B1F\\u1B20\\u1B21\\u1B22\\u1B23\\u1B24\\u1B25\\u1B26\\u1B27\\u1B28\\u1B29\\u1B2A\\u1B2B\\u1B2C\\u1B2D\\u1B2E\\u1B2F\\u1B30\\u1B31\\u1B32\\u1B33\\u1B45\\u1B46\\u1B47\\u1B48\\u1B49\\u1B4A\\u1B4B\\u1B83\\u1B84\\u1B85\\u1B86\\u1B87\\u1B88\\u1B89\\u1B8A\\u1B8B\\u1B8C\\u1B8D\\u1B8E\\u1B8F\\u1B90\\u1B91\\u1B92\\u1B93\\u1B94\\u1B95\\u1B96\\u1B97\\u1B98\\u1B99\\u1B9A\\u1B9B\\u1B9C\\u1B9D\\u1B9E\\u1B9F\\u1BA0\\u1BAE\\u1BAF\\u1C00\\u1C01\\u1C02\\u1C03\\u1C04\\u1C05\\u1C06\\u1C07\\u1C08\\u1C09\\u1C0A\\u1C0B\\u1C0C\\u1C0D\\u1C0E\\u1C0F\\u1C10\\u1C11\\u1C12\\u1C13\\u1C14\\u1C15\\u1C16\\u1C17\\u1C18\\u1C19\\u1C1A\\u1C1B\\u1C1C\\u1C1D\\u1C1E\\u1C1F\\u1C20\\u1C21\\u1C22\\u1C23\\u1C4D\\u1C4E\\u1C4F\\u1C5A\\u1C5B\\u1C5C\\u1C5D\\u1C5E\\u1C5F\\u1C60\\u1C61\\u1C62\\u1C63\\u1C64\\u1C65\\u1C66\\u1C67\\u1C68\\u1C69\\u1C6A\\u1C6B\\u1C6C\\u1C6D\\u1C6E\\u1C6F\\u1C70\\u1C71\\u1C72\\u1C73\\u1C74\\u1C75\\u1C76\\u1C77\\u2135\\u2136\\u2137\\u2138\\u2D30\\u2D31\\u2D32\\u2D33\\u2D34\\u2D35\\u2D36\\u2D37\\u2D38\\u2D39\\u2D3A\\u2D3B\\u2D3C\\u2D3D\\u2D3E\\u2D3F\\u2D40\\u2D41\\u2D42\\u2D43\\u2D44\\u2D45\\u2D46\\u2D47\\u2D48\\u2D49\\u2D4A\\u2D4B\\u2D4C\\u2D4D\\u2D4E\\u2D4F\\u2D50\\u2D51\\u2D52\\u2D53\\u2D54\\u2D55\\u2D56\\u2D57\\u2D58\\u2D59\\u2D5A\\u2D5B\\u2D5C\\u2D5D\\u2D5E\\u2D5F\\u2D60\\u2D61\\u2D62\\u2D63\\u2D64\\u2D65\\u2D80\\u2D81\\u2D82\\u2D83\\u2D84\\u2D85\\u2D86\\u2D87\\u2D88\\u2D89\\u2D8A\\u2D8B\\u2D8C\\u2D8D\\u2D8E\\u2D8F\\u2D90\\u2D91\\u2D92\\u2D93\\u2D94\\u2D95\\u2D96\\u2DA0\\u2DA1\\u2DA2\\u2DA3\\u2DA4\\u2DA5\\u2DA6\\u2DA8\\u2DA9\\u2DAA\\u2DAB\\u2DAC\\u2DAD\\u2DAE\\u2DB0\\u2DB1\\u2DB2\\u2DB3\\u2DB4\\u2DB5\\u2DB6\\u2DB8\\u2DB9\\u2DBA\\u2DBB\\u2DBC\\u2DBD\\u2DBE\\u2DC0\\u2DC1\\u2DC2\\u2DC3\\u2DC4\\u2DC5\\u2DC6\\u2DC8\\u2DC9\\u2DCA\\u2DCB\\u2DCC\\u2DCD\\u2DCE\\u2DD0\\u2DD1\\u2DD2\\u2DD3\\u2DD4\\u2DD5\\u2DD6\\u2DD8\\u2DD9\\u2DDA\\u2DDB\\u2DDC\\u2DDD\\u2DDE\\u3006\\u303C\\u3041\\u3042\\u3043\\u3044\\u3045\\u3046\\u3047\\u3048\\u3049\\u304A\\u304B\\u304C\\u304D\\u304E\\u304F\\u3050\\u3051\\u3052\\u3053\\u3054\\u3055\\u3056\\u3057\\u3058\\u3059\\u305A\\u305B\\u305C\\u305D\\u305E\\u305F\\u3060\\u3061\\u3062\\u3063\\u3064\\u3065\\u3066\\u3067\\u3068\\u3069\\u306A\\u306B\\u306C\\u306D\\u306E\\u306F\\u3070\\u3071\\u3072\\u3073\\u3074\\u3075\\u3076\\u3077\\u3078\\u3079\\u307A\\u307B\\u307C\\u307D\\u307E\\u307F\\u3080\\u3081\\u3082\\u3083\\u3084\\u3085\\u3086\\u3087\\u3088\\u3089\\u308A\\u308B\\u308C\\u308D\\u308E\\u308F\\u3090\\u3091\\u3092\\u3093\\u3094\\u3095\\u3096\\u309F\\u30A1\\u30A2\\u30A3\\u30A4\\u30A5\\u30A6\\u30A7\\u30A8\\u30A9\\u30AA\\u30AB\\u30AC\\u30AD\\u30AE\\u30AF\\u30B0\\u30B1\\u30B2\\u30B3\\u30B4\\u30B5\\u30B6\\u30B7\\u30B8\\u30B9\\u30BA\\u30BB\\u30BC\\u30BD\\u30BE\\u30BF\\u30C0\\u30C1\\u30C2\\u30C3\\u30C4\\u30C5\\u30C6\\u30C7\\u30C8\\u30C9\\u30CA\\u30CB\\u30CC\\u30CD\\u30CE\\u30CF\\u30D0\\u30D1\\u30D2\\u30D3\\u30D4\\u30D5\\u30D6\\u30D7\\u30D8\\u30D9\\u30DA\\u30DB\\u30DC\\u30DD\\u30DE\\u30DF\\u30E0\\u30E1\\u30E2\\u30E3\\u30E4\\u30E5\\u30E6\\u30E7\\u30E8\\u30E9\\u30EA\\u30EB\\u30EC\\u30ED\\u30EE\\u30EF\\u30F0\\u30F1\\u30F2\\u30F3\\u30F4\\u30F5\\u30F6\\u30F7\\u30F8\\u30F9\\u30FA\\u30FF\\u3105\\u3106\\u3107\\u3108\\u3109\\u310A\\u310B\\u310C\\u310D\\u310E\\u310F\\u3110\\u3111\\u3112\\u3113\\u3114\\u3115\\u3116\\u3117\\u3118\\u3119\\u311A\\u311B\\u311C\\u311D\\u311E\\u311F\\u3120\\u3121\\u3122\\u3123\\u3124\\u3125\\u3126\\u3127\\u3128\\u3129\\u312A\\u312B\\u312C\\u312D\\u3131\\u3132\\u3133\\u3134\\u3135\\u3136\\u3137\\u3138\\u3139\\u313A\\u313B\\u313C\\u313D\\u313E\\u313F\\u3140\\u3141\\u3142\\u3143\\u3144\\u3145\\u3146\\u3147\\u3148\\u3149\\u314A\\u314B\\u314C\\u314D\\u314E\\u314F\\u3150\\u3151\\u3152\\u3153\\u3154\\u3155\\u3156\\u3157\\u3158\\u3159\\u315A\\u315B\\u315C\\u315D\\u315E\\u315F\\u3160\\u3161\\u3162\\u3163\\u3164\\u3165\\u3166\\u3167\\u3168\\u3169\\u316A\\u316B\\u316C\\u316D\\u316E\\u316F\\u3170\\u3171\\u3172\\u3173\\u3174\\u3175\\u3176\\u3177\\u3178\\u3179\\u317A\\u317B\\u317C\\u317D\\u317E\\u317F\\u3180\\u3181\\u3182\\u3183\\u3184\\u3185\\u3186\\u3187\\u3188\\u3189\\u318A\\u318B\\u318C\\u318D\\u318E\\u31A0\\u31A1\\u31A2\\u31A3\\u31A4\\u31A5\\u31A6\\u31A7\\u31A8\\u31A9\\u31AA\\u31AB\\u31AC\\u31AD\\u31AE\\u31AF\\u31B0\\u31B1\\u31B2\\u31B3\\u31B4\\u31B5\\u31B6\\u31B7\\u31F0\\u31F1\\u31F2\\u31F3\\u31F4\\u31F5\\u31F6\\u31F7\\u31F8\\u31F9\\u31FA\\u31FB\\u31FC\\u31FD\\u31FE\\u31FF\\u3400\\u4DB5\\u4E00\\u9FC3\\uA000\\uA001\\uA002\\uA003\\uA004\\uA005\\uA006\\uA007\\uA008\\uA009\\uA00A\\uA00B\\uA00C\\uA00D\\uA00E\\uA00F\\uA010\\uA011\\uA012\\uA013\\uA014\\uA016\\uA017\\uA018\\uA019\\uA01A\\uA01B\\uA01C\\uA01D\\uA01E\\uA01F\\uA020\\uA021\\uA022\\uA023\\uA024\\uA025\\uA026\\uA027\\uA028\\uA029\\uA02A\\uA02B\\uA02C\\uA02D\\uA02E\\uA02F\\uA030\\uA031\\uA032\\uA033\\uA034\\uA035\\uA036\\uA037\\uA038\\uA039\\uA03A\\uA03B\\uA03C\\uA03D\\uA03E\\uA03F\\uA040\\uA041\\uA042\\uA043\\uA044\\uA045\\uA046\\uA047\\uA048\\uA049\\uA04A\\uA04B\\uA04C\\uA04D\\uA04E\\uA04F\\uA050\\uA051\\uA052\\uA053\\uA054\\uA055\\uA056\\uA057\\uA058\\uA059\\uA05A\\uA05B\\uA05C\\uA05D\\uA05E\\uA05F\\uA060\\uA061\\uA062\\uA063\\uA064\\uA065\\uA066\\uA067\\uA068\\uA069\\uA06A\\uA06B\\uA06C\\uA06D\\uA06E\\uA06F\\uA070\\uA071\\uA072\\uA073\\uA074\\uA075\\uA076\\uA077\\uA078\\uA079\\uA07A\\uA07B\\uA07C\\uA07D\\uA07E\\uA07F\\uA080\\uA081\\uA082\\uA083\\uA084\\uA085\\uA086\\uA087\\uA088\\uA089\\uA08A\\uA08B\\uA08C\\uA08D\\uA08E\\uA08F\\uA090\\uA091\\uA092\\uA093\\uA094\\uA095\\uA096\\uA097\\uA098\\uA099\\uA09A\\uA09B\\uA09C\\uA09D\\uA09E\\uA09F\\uA0A0\\uA0A1\\uA0A2\\uA0A3\\uA0A4\\uA0A5\\uA0A6\\uA0A7\\uA0A8\\uA0A9\\uA0AA\\uA0AB\\uA0AC\\uA0AD\\uA0AE\\uA0AF\\uA0B0\\uA0B1\\uA0B2\\uA0B3\\uA0B4\\uA0B5\\uA0B6\\uA0B7\\uA0B8\\uA0B9\\uA0BA\\uA0BB\\uA0BC\\uA0BD\\uA0BE\\uA0BF\\uA0C0\\uA0C1\\uA0C2\\uA0C3\\uA0C4\\uA0C5\\uA0C6\\uA0C7\\uA0C8\\uA0C9\\uA0CA\\uA0CB\\uA0CC\\uA0CD\\uA0CE\\uA0CF\\uA0D0\\uA0D1\\uA0D2\\uA0D3\\uA0D4\\uA0D5\\uA0D6\\uA0D7\\uA0D8\\uA0D9\\uA0DA\\uA0DB\\uA0DC\\uA0DD\\uA0DE\\uA0DF\\uA0E0\\uA0E1\\uA0E2\\uA0E3\\uA0E4\\uA0E5\\uA0E6\\uA0E7\\uA0E8\\uA0E9\\uA0EA\\uA0EB\\uA0EC\\uA0ED\\uA0EE\\uA0EF\\uA0F0\\uA0F1\\uA0F2\\uA0F3\\uA0F4\\uA0F5\\uA0F6\\uA0F7\\uA0F8\\uA0F9\\uA0FA\\uA0FB\\uA0FC\\uA0FD\\uA0FE\\uA0FF\\uA100\\uA101\\uA102\\uA103\\uA104\\uA105\\uA106\\uA107\\uA108\\uA109\\uA10A\\uA10B\\uA10C\\uA10D\\uA10E\\uA10F\\uA110\\uA111\\uA112\\uA113\\uA114\\uA115\\uA116\\uA117\\uA118\\uA119\\uA11A\\uA11B\\uA11C\\uA11D\\uA11E\\uA11F\\uA120\\uA121\\uA122\\uA123\\uA124\\uA125\\uA126\\uA127\\uA128\\uA129\\uA12A\\uA12B\\uA12C\\uA12D\\uA12E\\uA12F\\uA130\\uA131\\uA132\\uA133\\uA134\\uA135\\uA136\\uA137\\uA138\\uA139\\uA13A\\uA13B\\uA13C\\uA13D\\uA13E\\uA13F\\uA140\\uA141\\uA142\\uA143\\uA144\\uA145\\uA146\\uA147\\uA148\\uA149\\uA14A\\uA14B\\uA14C\\uA14D\\uA14E\\uA14F\\uA150\\uA151\\uA152\\uA153\\uA154\\uA155\\uA156\\uA157\\uA158\\uA159\\uA15A\\uA15B\\uA15C\\uA15D\\uA15E\\uA15F\\uA160\\uA161\\uA162\\uA163\\uA164\\uA165\\uA166\\uA167\\uA168\\uA169\\uA16A\\uA16B\\uA16C\\uA16D\\uA16E\\uA16F\\uA170\\uA171\\uA172\\uA173\\uA174\\uA175\\uA176\\uA177\\uA178\\uA179\\uA17A\\uA17B\\uA17C\\uA17D\\uA17E\\uA17F\\uA180\\uA181\\uA182\\uA183\\uA184\\uA185\\uA186\\uA187\\uA188\\uA189\\uA18A\\uA18B\\uA18C\\uA18D\\uA18E\\uA18F\\uA190\\uA191\\uA192\\uA193\\uA194\\uA195\\uA196\\uA197\\uA198\\uA199\\uA19A\\uA19B\\uA19C\\uA19D\\uA19E\\uA19F\\uA1A0\\uA1A1\\uA1A2\\uA1A3\\uA1A4\\uA1A5\\uA1A6\\uA1A7\\uA1A8\\uA1A9\\uA1AA\\uA1AB\\uA1AC\\uA1AD\\uA1AE\\uA1AF\\uA1B0\\uA1B1\\uA1B2\\uA1B3\\uA1B4\\uA1B5\\uA1B6\\uA1B7\\uA1B8\\uA1B9\\uA1BA\\uA1BB\\uA1BC\\uA1BD\\uA1BE\\uA1BF\\uA1C0\\uA1C1\\uA1C2\\uA1C3\\uA1C4\\uA1C5\\uA1C6\\uA1C7\\uA1C8\\uA1C9\\uA1CA\\uA1CB\\uA1CC\\uA1CD\\uA1CE\\uA1CF\\uA1D0\\uA1D1\\uA1D2\\uA1D3\\uA1D4\\uA1D5\\uA1D6\\uA1D7\\uA1D8\\uA1D9\\uA1DA\\uA1DB\\uA1DC\\uA1DD\\uA1DE\\uA1DF\\uA1E0\\uA1E1\\uA1E2\\uA1E3\\uA1E4\\uA1E5\\uA1E6\\uA1E7\\uA1E8\\uA1E9\\uA1EA\\uA1EB\\uA1EC\\uA1ED\\uA1EE\\uA1EF\\uA1F0\\uA1F1\\uA1F2\\uA1F3\\uA1F4\\uA1F5\\uA1F6\\uA1F7\\uA1F8\\uA1F9\\uA1FA\\uA1FB\\uA1FC\\uA1FD\\uA1FE\\uA1FF\\uA200\\uA201\\uA202\\uA203\\uA204\\uA205\\uA206\\uA207\\uA208\\uA209\\uA20A\\uA20B\\uA20C\\uA20D\\uA20E\\uA20F\\uA210\\uA211\\uA212\\uA213\\uA214\\uA215\\uA216\\uA217\\uA218\\uA219\\uA21A\\uA21B\\uA21C\\uA21D\\uA21E\\uA21F\\uA220\\uA221\\uA222\\uA223\\uA224\\uA225\\uA226\\uA227\\uA228\\uA229\\uA22A\\uA22B\\uA22C\\uA22D\\uA22E\\uA22F\\uA230\\uA231\\uA232\\uA233\\uA234\\uA235\\uA236\\uA237\\uA238\\uA239\\uA23A\\uA23B\\uA23C\\uA23D\\uA23E\\uA23F\\uA240\\uA241\\uA242\\uA243\\uA244\\uA245\\uA246\\uA247\\uA248\\uA249\\uA24A\\uA24B\\uA24C\\uA24D\\uA24E\\uA24F\\uA250\\uA251\\uA252\\uA253\\uA254\\uA255\\uA256\\uA257\\uA258\\uA259\\uA25A\\uA25B\\uA25C\\uA25D\\uA25E\\uA25F\\uA260\\uA261\\uA262\\uA263\\uA264\\uA265\\uA266\\uA267\\uA268\\uA269\\uA26A\\uA26B\\uA26C\\uA26D\\uA26E\\uA26F\\uA270\\uA271\\uA272\\uA273\\uA274\\uA275\\uA276\\uA277\\uA278\\uA279\\uA27A\\uA27B\\uA27C\\uA27D\\uA27E\\uA27F\\uA280\\uA281\\uA282\\uA283\\uA284\\uA285\\uA286\\uA287\\uA288\\uA289\\uA28A\\uA28B\\uA28C\\uA28D\\uA28E\\uA28F\\uA290\\uA291\\uA292\\uA293\\uA294\\uA295\\uA296\\uA297\\uA298\\uA299\\uA29A\\uA29B\\uA29C\\uA29D\\uA29E\\uA29F\\uA2A0\\uA2A1\\uA2A2\\uA2A3\\uA2A4\\uA2A5\\uA2A6\\uA2A7\\uA2A8\\uA2A9\\uA2AA\\uA2AB\\uA2AC\\uA2AD\\uA2AE\\uA2AF\\uA2B0\\uA2B1\\uA2B2\\uA2B3\\uA2B4\\uA2B5\\uA2B6\\uA2B7\\uA2B8\\uA2B9\\uA2BA\\uA2BB\\uA2BC\\uA2BD\\uA2BE\\uA2BF\\uA2C0\\uA2C1\\uA2C2\\uA2C3\\uA2C4\\uA2C5\\uA2C6\\uA2C7\\uA2C8\\uA2C9\\uA2CA\\uA2CB\\uA2CC\\uA2CD\\uA2CE\\uA2CF\\uA2D0\\uA2D1\\uA2D2\\uA2D3\\uA2D4\\uA2D5\\uA2D6\\uA2D7\\uA2D8\\uA2D9\\uA2DA\\uA2DB\\uA2DC\\uA2DD\\uA2DE\\uA2DF\\uA2E0\\uA2E1\\uA2E2\\uA2E3\\uA2E4\\uA2E5\\uA2E6\\uA2E7\\uA2E8\\uA2E9\\uA2EA\\uA2EB\\uA2EC\\uA2ED\\uA2EE\\uA2EF\\uA2F0\\uA2F1\\uA2F2\\uA2F3\\uA2F4\\uA2F5\\uA2F6\\uA2F7\\uA2F8\\uA2F9\\uA2FA\\uA2FB\\uA2FC\\uA2FD\\uA2FE\\uA2FF\\uA300\\uA301\\uA302\\uA303\\uA304\\uA305\\uA306\\uA307\\uA308\\uA309\\uA30A\\uA30B\\uA30C\\uA30D\\uA30E\\uA30F\\uA310\\uA311\\uA312\\uA313\\uA314\\uA315\\uA316\\uA317\\uA318\\uA319\\uA31A\\uA31B\\uA31C\\uA31D\\uA31E\\uA31F\\uA320\\uA321\\uA322\\uA323\\uA324\\uA325\\uA326\\uA327\\uA328\\uA329\\uA32A\\uA32B\\uA32C\\uA32D\\uA32E\\uA32F\\uA330\\uA331\\uA332\\uA333\\uA334\\uA335\\uA336\\uA337\\uA338\\uA339\\uA33A\\uA33B\\uA33C\\uA33D\\uA33E\\uA33F\\uA340\\uA341\\uA342\\uA343\\uA344\\uA345\\uA346\\uA347\\uA348\\uA349\\uA34A\\uA34B\\uA34C\\uA34D\\uA34E\\uA34F\\uA350\\uA351\\uA352\\uA353\\uA354\\uA355\\uA356\\uA357\\uA358\\uA359\\uA35A\\uA35B\\uA35C\\uA35D\\uA35E\\uA35F\\uA360\\uA361\\uA362\\uA363\\uA364\\uA365\\uA366\\uA367\\uA368\\uA369\\uA36A\\uA36B\\uA36C\\uA36D\\uA36E\\uA36F\\uA370\\uA371\\uA372\\uA373\\uA374\\uA375\\uA376\\uA377\\uA378\\uA379\\uA37A\\uA37B\\uA37C\\uA37D\\uA37E\\uA37F\\uA380\\uA381\\uA382\\uA383\\uA384\\uA385\\uA386\\uA387\\uA388\\uA389\\uA38A\\uA38B\\uA38C\\uA38D\\uA38E\\uA38F\\uA390\\uA391\\uA392\\uA393\\uA394\\uA395\\uA396\\uA397\\uA398\\uA399\\uA39A\\uA39B\\uA39C\\uA39D\\uA39E\\uA39F\\uA3A0\\uA3A1\\uA3A2\\uA3A3\\uA3A4\\uA3A5\\uA3A6\\uA3A7\\uA3A8\\uA3A9\\uA3AA\\uA3AB\\uA3AC\\uA3AD\\uA3AE\\uA3AF\\uA3B0\\uA3B1\\uA3B2\\uA3B3\\uA3B4\\uA3B5\\uA3B6\\uA3B7\\uA3B8\\uA3B9\\uA3BA\\uA3BB\\uA3BC\\uA3BD\\uA3BE\\uA3BF\\uA3C0\\uA3C1\\uA3C2\\uA3C3\\uA3C4\\uA3C5\\uA3C6\\uA3C7\\uA3C8\\uA3C9\\uA3CA\\uA3CB\\uA3CC\\uA3CD\\uA3CE\\uA3CF\\uA3D0\\uA3D1\\uA3D2\\uA3D3\\uA3D4\\uA3D5\\uA3D6\\uA3D7\\uA3D8\\uA3D9\\uA3DA\\uA3DB\\uA3DC\\uA3DD\\uA3DE\\uA3DF\\uA3E0\\uA3E1\\uA3E2\\uA3E3\\uA3E4\\uA3E5\\uA3E6\\uA3E7\\uA3E8\\uA3E9\\uA3EA\\uA3EB\\uA3EC\\uA3ED\\uA3EE\\uA3EF\\uA3F0\\uA3F1\\uA3F2\\uA3F3\\uA3F4\\uA3F5\\uA3F6\\uA3F7\\uA3F8\\uA3F9\\uA3FA\\uA3FB\\uA3FC\\uA3FD\\uA3FE\\uA3FF\\uA400\\uA401\\uA402\\uA403\\uA404\\uA405\\uA406\\uA407\\uA408\\uA409\\uA40A\\uA40B\\uA40C\\uA40D\\uA40E\\uA40F\\uA410\\uA411\\uA412\\uA413\\uA414\\uA415\\uA416\\uA417\\uA418\\uA419\\uA41A\\uA41B\\uA41C\\uA41D\\uA41E\\uA41F\\uA420\\uA421\\uA422\\uA423\\uA424\\uA425\\uA426\\uA427\\uA428\\uA429\\uA42A\\uA42B\\uA42C\\uA42D\\uA42E\\uA42F\\uA430\\uA431\\uA432\\uA433\\uA434\\uA435\\uA436\\uA437\\uA438\\uA439\\uA43A\\uA43B\\uA43C\\uA43D\\uA43E\\uA43F\\uA440\\uA441\\uA442\\uA443\\uA444\\uA445\\uA446\\uA447\\uA448\\uA449\\uA44A\\uA44B\\uA44C\\uA44D\\uA44E\\uA44F\\uA450\\uA451\\uA452\\uA453\\uA454\\uA455\\uA456\\uA457\\uA458\\uA459\\uA45A\\uA45B\\uA45C\\uA45D\\uA45E\\uA45F\\uA460\\uA461\\uA462\\uA463\\uA464\\uA465\\uA466\\uA467\\uA468\\uA469\\uA46A\\uA46B\\uA46C\\uA46D\\uA46E\\uA46F\\uA470\\uA471\\uA472\\uA473\\uA474\\uA475\\uA476\\uA477\\uA478\\uA479\\uA47A\\uA47B\\uA47C\\uA47D\\uA47E\\uA47F\\uA480\\uA481\\uA482\\uA483\\uA484\\uA485\\uA486\\uA487\\uA488\\uA489\\uA48A\\uA48B\\uA48C\\uA500\\uA501\\uA502\\uA503\\uA504\\uA505\\uA506\\uA507\\uA508\\uA509\\uA50A\\uA50B\\uA50C\\uA50D\\uA50E\\uA50F\\uA510\\uA511\\uA512\\uA513\\uA514\\uA515\\uA516\\uA517\\uA518\\uA519\\uA51A\\uA51B\\uA51C\\uA51D\\uA51E\\uA51F\\uA520\\uA521\\uA522\\uA523\\uA524\\uA525\\uA526\\uA527\\uA528\\uA529\\uA52A\\uA52B\\uA52C\\uA52D\\uA52E\\uA52F\\uA530\\uA531\\uA532\\uA533\\uA534\\uA535\\uA536\\uA537\\uA538\\uA539\\uA53A\\uA53B\\uA53C\\uA53D\\uA53E\\uA53F\\uA540\\uA541\\uA542\\uA543\\uA544\\uA545\\uA546\\uA547\\uA548\\uA549\\uA54A\\uA54B\\uA54C\\uA54D\\uA54E\\uA54F\\uA550\\uA551\\uA552\\uA553\\uA554\\uA555\\uA556\\uA557\\uA558\\uA559\\uA55A\\uA55B\\uA55C\\uA55D\\uA55E\\uA55F\\uA560\\uA561\\uA562\\uA563\\uA564\\uA565\\uA566\\uA567\\uA568\\uA569\\uA56A\\uA56B\\uA56C\\uA56D\\uA56E\\uA56F\\uA570\\uA571\\uA572\\uA573\\uA574\\uA575\\uA576\\uA577\\uA578\\uA579\\uA57A\\uA57B\\uA57C\\uA57D\\uA57E\\uA57F\\uA580\\uA581\\uA582\\uA583\\uA584\\uA585\\uA586\\uA587\\uA588\\uA589\\uA58A\\uA58B\\uA58C\\uA58D\\uA58E\\uA58F\\uA590\\uA591\\uA592\\uA593\\uA594\\uA595\\uA596\\uA597\\uA598\\uA599\\uA59A\\uA59B\\uA59C\\uA59D\\uA59E\\uA59F\\uA5A0\\uA5A1\\uA5A2\\uA5A3\\uA5A4\\uA5A5\\uA5A6\\uA5A7\\uA5A8\\uA5A9\\uA5AA\\uA5AB\\uA5AC\\uA5AD\\uA5AE\\uA5AF\\uA5B0\\uA5B1\\uA5B2\\uA5B3\\uA5B4\\uA5B5\\uA5B6\\uA5B7\\uA5B8\\uA5B9\\uA5BA\\uA5BB\\uA5BC\\uA5BD\\uA5BE\\uA5BF\\uA5C0\\uA5C1\\uA5C2\\uA5C3\\uA5C4\\uA5C5\\uA5C6\\uA5C7\\uA5C8\\uA5C9\\uA5CA\\uA5CB\\uA5CC\\uA5CD\\uA5CE\\uA5CF\\uA5D0\\uA5D1\\uA5D2\\uA5D3\\uA5D4\\uA5D5\\uA5D6\\uA5D7\\uA5D8\\uA5D9\\uA5DA\\uA5DB\\uA5DC\\uA5DD\\uA5DE\\uA5DF\\uA5E0\\uA5E1\\uA5E2\\uA5E3\\uA5E4\\uA5E5\\uA5E6\\uA5E7\\uA5E8\\uA5E9\\uA5EA\\uA5EB\\uA5EC\\uA5ED\\uA5EE\\uA5EF\\uA5F0\\uA5F1\\uA5F2\\uA5F3\\uA5F4\\uA5F5\\uA5F6\\uA5F7\\uA5F8\\uA5F9\\uA5FA\\uA5FB\\uA5FC\\uA5FD\\uA5FE\\uA5FF\\uA600\\uA601\\uA602\\uA603\\uA604\\uA605\\uA606\\uA607\\uA608\\uA609\\uA60A\\uA60B\\uA610\\uA611\\uA612\\uA613\\uA614\\uA615\\uA616\\uA617\\uA618\\uA619\\uA61A\\uA61B\\uA61C\\uA61D\\uA61E\\uA61F\\uA62A\\uA62B\\uA66E\\uA7FB\\uA7FC\\uA7FD\\uA7FE\\uA7FF\\uA800\\uA801\\uA803\\uA804\\uA805\\uA807\\uA808\\uA809\\uA80A\\uA80C\\uA80D\\uA80E\\uA80F\\uA810\\uA811\\uA812\\uA813\\uA814\\uA815\\uA816\\uA817\\uA818\\uA819\\uA81A\\uA81B\\uA81C\\uA81D\\uA81E\\uA81F\\uA820\\uA821\\uA822\\uA840\\uA841\\uA842\\uA843\\uA844\\uA845\\uA846\\uA847\\uA848\\uA849\\uA84A\\uA84B\\uA84C\\uA84D\\uA84E\\uA84F\\uA850\\uA851\\uA852\\uA853\\uA854\\uA855\\uA856\\uA857\\uA858\\uA859\\uA85A\\uA85B\\uA85C\\uA85D\\uA85E\\uA85F\\uA860\\uA861\\uA862\\uA863\\uA864\\uA865\\uA866\\uA867\\uA868\\uA869\\uA86A\\uA86B\\uA86C\\uA86D\\uA86E\\uA86F\\uA870\\uA871\\uA872\\uA873\\uA882\\uA883\\uA884\\uA885\\uA886\\uA887\\uA888\\uA889\\uA88A\\uA88B\\uA88C\\uA88D\\uA88E\\uA88F\\uA890\\uA891\\uA892\\uA893\\uA894\\uA895\\uA896\\uA897\\uA898\\uA899\\uA89A\\uA89B\\uA89C\\uA89D\\uA89E\\uA89F\\uA8A0\\uA8A1\\uA8A2\\uA8A3\\uA8A4\\uA8A5\\uA8A6\\uA8A7\\uA8A8\\uA8A9\\uA8AA\\uA8AB\\uA8AC\\uA8AD\\uA8AE\\uA8AF\\uA8B0\\uA8B1\\uA8B2\\uA8B3\\uA90A\\uA90B\\uA90C\\uA90D\\uA90E\\uA90F\\uA910\\uA911\\uA912\\uA913\\uA914\\uA915\\uA916\\uA917\\uA918\\uA919\\uA91A\\uA91B\\uA91C\\uA91D\\uA91E\\uA91F\\uA920\\uA921\\uA922\\uA923\\uA924\\uA925\\uA930\\uA931\\uA932\\uA933\\uA934\\uA935\\uA936\\uA937\\uA938\\uA939\\uA93A\\uA93B\\uA93C\\uA93D\\uA93E\\uA93F\\uA940\\uA941\\uA942\\uA943\\uA944\\uA945\\uA946\\uAA00\\uAA01\\uAA02\\uAA03\\uAA04\\uAA05\\uAA06\\uAA07\\uAA08\\uAA09\\uAA0A\\uAA0B\\uAA0C\\uAA0D\\uAA0E\\uAA0F\\uAA10\\uAA11\\uAA12\\uAA13\\uAA14\\uAA15\\uAA16\\uAA17\\uAA18\\uAA19\\uAA1A\\uAA1B\\uAA1C\\uAA1D\\uAA1E\\uAA1F\\uAA20\\uAA21\\uAA22\\uAA23\\uAA24\\uAA25\\uAA26\\uAA27\\uAA28\\uAA40\\uAA41\\uAA42\\uAA44\\uAA45\\uAA46\\uAA47\\uAA48\\uAA49\\uAA4A\\uAA4B\\uAC00\\uD7A3\\uF900\\uF901\\uF902\\uF903\\uF904\\uF905\\uF906\\uF907\\uF908\\uF909\\uF90A\\uF90B\\uF90C\\uF90D\\uF90E\\uF90F\\uF910\\uF911\\uF912\\uF913\\uF914\\uF915\\uF916\\uF917\\uF918\\uF919\\uF91A\\uF91B\\uF91C\\uF91D\\uF91E\\uF91F\\uF920\\uF921\\uF922\\uF923\\uF924\\uF925\\uF926\\uF927\\uF928\\uF929\\uF92A\\uF92B\\uF92C\\uF92D\\uF92E\\uF92F\\uF930\\uF931\\uF932\\uF933\\uF934\\uF935\\uF936\\uF937\\uF938\\uF939\\uF93A\\uF93B\\uF93C\\uF93D\\uF93E\\uF93F\\uF940\\uF941\\uF942\\uF943\\uF944\\uF945\\uF946\\uF947\\uF948\\uF949\\uF94A\\uF94B\\uF94C\\uF94D\\uF94E\\uF94F\\uF950\\uF951\\uF952\\uF953\\uF954\\uF955\\uF956\\uF957\\uF958\\uF959\\uF95A\\uF95B\\uF95C\\uF95D\\uF95E\\uF95F\\uF960\\uF961\\uF962\\uF963\\uF964\\uF965\\uF966\\uF967\\uF968\\uF969\\uF96A\\uF96B\\uF96C\\uF96D\\uF96E\\uF96F\\uF970\\uF971\\uF972\\uF973\\uF974\\uF975\\uF976\\uF977\\uF978\\uF979\\uF97A\\uF97B\\uF97C\\uF97D\\uF97E\\uF97F\\uF980\\uF981\\uF982\\uF983\\uF984\\uF985\\uF986\\uF987\\uF988\\uF989\\uF98A\\uF98B\\uF98C\\uF98D\\uF98E\\uF98F\\uF990\\uF991\\uF992\\uF993\\uF994\\uF995\\uF996\\uF997\\uF998\\uF999\\uF99A\\uF99B\\uF99C\\uF99D\\uF99E\\uF99F\\uF9A0\\uF9A1\\uF9A2\\uF9A3\\uF9A4\\uF9A5\\uF9A6\\uF9A7\\uF9A8\\uF9A9\\uF9AA\\uF9AB\\uF9AC\\uF9AD\\uF9AE\\uF9AF\\uF9B0\\uF9B1\\uF9B2\\uF9B3\\uF9B4\\uF9B5\\uF9B6\\uF9B7\\uF9B8\\uF9B9\\uF9BA\\uF9BB\\uF9BC\\uF9BD\\uF9BE\\uF9BF\\uF9C0\\uF9C1\\uF9C2\\uF9C3\\uF9C4\\uF9C5\\uF9C6\\uF9C7\\uF9C8\\uF9C9\\uF9CA\\uF9CB\\uF9CC\\uF9CD\\uF9CE\\uF9CF\\uF9D0\\uF9D1\\uF9D2\\uF9D3\\uF9D4\\uF9D5\\uF9D6\\uF9D7\\uF9D8\\uF9D9\\uF9DA\\uF9DB\\uF9DC\\uF9DD\\uF9DE\\uF9DF\\uF9E0\\uF9E1\\uF9E2\\uF9E3\\uF9E4\\uF9E5\\uF9E6\\uF9E7\\uF9E8\\uF9E9\\uF9EA\\uF9EB\\uF9EC\\uF9ED\\uF9EE\\uF9EF\\uF9F0\\uF9F1\\uF9F2\\uF9F3\\uF9F4\\uF9F5\\uF9F6\\uF9F7\\uF9F8\\uF9F9\\uF9FA\\uF9FB\\uF9FC\\uF9FD\\uF9FE\\uF9FF\\uFA00\\uFA01\\uFA02\\uFA03\\uFA04\\uFA05\\uFA06\\uFA07\\uFA08\\uFA09\\uFA0A\\uFA0B\\uFA0C\\uFA0D\\uFA0E\\uFA0F\\uFA10\\uFA11\\uFA12\\uFA13\\uFA14\\uFA15\\uFA16\\uFA17\\uFA18\\uFA19\\uFA1A\\uFA1B\\uFA1C\\uFA1D\\uFA1E\\uFA1F\\uFA20\\uFA21\\uFA22\\uFA23\\uFA24\\uFA25\\uFA26\\uFA27\\uFA28\\uFA29\\uFA2A\\uFA2B\\uFA2C\\uFA2D\\uFA30\\uFA31\\uFA32\\uFA33\\uFA34\\uFA35\\uFA36\\uFA37\\uFA38\\uFA39\\uFA3A\\uFA3B\\uFA3C\\uFA3D\\uFA3E\\uFA3F\\uFA40\\uFA41\\uFA42\\uFA43\\uFA44\\uFA45\\uFA46\\uFA47\\uFA48\\uFA49\\uFA4A\\uFA4B\\uFA4C\\uFA4D\\uFA4E\\uFA4F\\uFA50\\uFA51\\uFA52\\uFA53\\uFA54\\uFA55\\uFA56\\uFA57\\uFA58\\uFA59\\uFA5A\\uFA5B\\uFA5C\\uFA5D\\uFA5E\\uFA5F\\uFA60\\uFA61\\uFA62\\uFA63\\uFA64\\uFA65\\uFA66\\uFA67\\uFA68\\uFA69\\uFA6A\\uFA70\\uFA71\\uFA72\\uFA73\\uFA74\\uFA75\\uFA76\\uFA77\\uFA78\\uFA79\\uFA7A\\uFA7B\\uFA7C\\uFA7D\\uFA7E\\uFA7F\\uFA80\\uFA81\\uFA82\\uFA83\\uFA84\\uFA85\\uFA86\\uFA87\\uFA88\\uFA89\\uFA8A\\uFA8B\\uFA8C\\uFA8D\\uFA8E\\uFA8F\\uFA90\\uFA91\\uFA92\\uFA93\\uFA94\\uFA95\\uFA96\\uFA97\\uFA98\\uFA99\\uFA9A\\uFA9B\\uFA9C\\uFA9D\\uFA9E\\uFA9F\\uFAA0\\uFAA1\\uFAA2\\uFAA3\\uFAA4\\uFAA5\\uFAA6\\uFAA7\\uFAA8\\uFAA9\\uFAAA\\uFAAB\\uFAAC\\uFAAD\\uFAAE\\uFAAF\\uFAB0\\uFAB1\\uFAB2\\uFAB3\\uFAB4\\uFAB5\\uFAB6\\uFAB7\\uFAB8\\uFAB9\\uFABA\\uFABB\\uFABC\\uFABD\\uFABE\\uFABF\\uFAC0\\uFAC1\\uFAC2\\uFAC3\\uFAC4\\uFAC5\\uFAC6\\uFAC7\\uFAC8\\uFAC9\\uFACA\\uFACB\\uFACC\\uFACD\\uFACE\\uFACF\\uFAD0\\uFAD1\\uFAD2\\uFAD3\\uFAD4\\uFAD5\\uFAD6\\uFAD7\\uFAD8\\uFAD9\\uFB1D\\uFB1F\\uFB20\\uFB21\\uFB22\\uFB23\\uFB24\\uFB25\\uFB26\\uFB27\\uFB28\\uFB2A\\uFB2B\\uFB2C\\uFB2D\\uFB2E\\uFB2F\\uFB30\\uFB31\\uFB32\\uFB33\\uFB34\\uFB35\\uFB36\\uFB38\\uFB39\\uFB3A\\uFB3B\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46\\uFB47\\uFB48\\uFB49\\uFB4A\\uFB4B\\uFB4C\\uFB4D\\uFB4E\\uFB4F\\uFB50\\uFB51\\uFB52\\uFB53\\uFB54\\uFB55\\uFB56\\uFB57\\uFB58\\uFB59\\uFB5A\\uFB5B\\uFB5C\\uFB5D\\uFB5E\\uFB5F\\uFB60\\uFB61\\uFB62\\uFB63\\uFB64\\uFB65\\uFB66\\uFB67\\uFB68\\uFB69\\uFB6A\\uFB6B\\uFB6C\\uFB6D\\uFB6E\\uFB6F\\uFB70\\uFB71\\uFB72\\uFB73\\uFB74\\uFB75\\uFB76\\uFB77\\uFB78\\uFB79\\uFB7A\\uFB7B\\uFB7C\\uFB7D\\uFB7E\\uFB7F\\uFB80\\uFB81\\uFB82\\uFB83\\uFB84\\uFB85\\uFB86\\uFB87\\uFB88\\uFB89\\uFB8A\\uFB8B\\uFB8C\\uFB8D\\uFB8E\\uFB8F\\uFB90\\uFB91\\uFB92\\uFB93\\uFB94\\uFB95\\uFB96\\uFB97\\uFB98\\uFB99\\uFB9A\\uFB9B\\uFB9C\\uFB9D\\uFB9E\\uFB9F\\uFBA0\\uFBA1\\uFBA2\\uFBA3\\uFBA4\\uFBA5\\uFBA6\\uFBA7\\uFBA8\\uFBA9\\uFBAA\\uFBAB\\uFBAC\\uFBAD\\uFBAE\\uFBAF\\uFBB0\\uFBB1\\uFBD3\\uFBD4\\uFBD5\\uFBD6\\uFBD7\\uFBD8\\uFBD9\\uFBDA\\uFBDB\\uFBDC\\uFBDD\\uFBDE\\uFBDF\\uFBE0\\uFBE1\\uFBE2\\uFBE3\\uFBE4\\uFBE5\\uFBE6\\uFBE7\\uFBE8\\uFBE9\\uFBEA\\uFBEB\\uFBEC\\uFBED\\uFBEE\\uFBEF\\uFBF0\\uFBF1\\uFBF2\\uFBF3\\uFBF4\\uFBF5\\uFBF6\\uFBF7\\uFBF8\\uFBF9\\uFBFA\\uFBFB\\uFBFC\\uFBFD\\uFBFE\\uFBFF\\uFC00\\uFC01\\uFC02\\uFC03\\uFC04\\uFC05\\uFC06\\uFC07\\uFC08\\uFC09\\uFC0A\\uFC0B\\uFC0C\\uFC0D\\uFC0E\\uFC0F\\uFC10\\uFC11\\uFC12\\uFC13\\uFC14\\uFC15\\uFC16\\uFC17\\uFC18\\uFC19\\uFC1A\\uFC1B\\uFC1C\\uFC1D\\uFC1E\\uFC1F\\uFC20\\uFC21\\uFC22\\uFC23\\uFC24\\uFC25\\uFC26\\uFC27\\uFC28\\uFC29\\uFC2A\\uFC2B\\uFC2C\\uFC2D\\uFC2E\\uFC2F\\uFC30\\uFC31\\uFC32\\uFC33\\uFC34\\uFC35\\uFC36\\uFC37\\uFC38\\uFC39\\uFC3A\\uFC3B\\uFC3C\\uFC3D\\uFC3E\\uFC3F\\uFC40\\uFC41\\uFC42\\uFC43\\uFC44\\uFC45\\uFC46\\uFC47\\uFC48\\uFC49\\uFC4A\\uFC4B\\uFC4C\\uFC4D\\uFC4E\\uFC4F\\uFC50\\uFC51\\uFC52\\uFC53\\uFC54\\uFC55\\uFC56\\uFC57\\uFC58\\uFC59\\uFC5A\\uFC5B\\uFC5C\\uFC5D\\uFC5E\\uFC5F\\uFC60\\uFC61\\uFC62\\uFC63\\uFC64\\uFC65\\uFC66\\uFC67\\uFC68\\uFC69\\uFC6A\\uFC6B\\uFC6C\\uFC6D\\uFC6E\\uFC6F\\uFC70\\uFC71\\uFC72\\uFC73\\uFC74\\uFC75\\uFC76\\uFC77\\uFC78\\uFC79\\uFC7A\\uFC7B\\uFC7C\\uFC7D\\uFC7E\\uFC7F\\uFC80\\uFC81\\uFC82\\uFC83\\uFC84\\uFC85\\uFC86\\uFC87\\uFC88\\uFC89\\uFC8A\\uFC8B\\uFC8C\\uFC8D\\uFC8E\\uFC8F\\uFC90\\uFC91\\uFC92\\uFC93\\uFC94\\uFC95\\uFC96\\uFC97\\uFC98\\uFC99\\uFC9A\\uFC9B\\uFC9C\\uFC9D\\uFC9E\\uFC9F\\uFCA0\\uFCA1\\uFCA2\\uFCA3\\uFCA4\\uFCA5\\uFCA6\\uFCA7\\uFCA8\\uFCA9\\uFCAA\\uFCAB\\uFCAC\\uFCAD\\uFCAE\\uFCAF\\uFCB0\\uFCB1\\uFCB2\\uFCB3\\uFCB4\\uFCB5\\uFCB6\\uFCB7\\uFCB8\\uFCB9\\uFCBA\\uFCBB\\uFCBC\\uFCBD\\uFCBE\\uFCBF\\uFCC0\\uFCC1\\uFCC2\\uFCC3\\uFCC4\\uFCC5\\uFCC6\\uFCC7\\uFCC8\\uFCC9\\uFCCA\\uFCCB\\uFCCC\\uFCCD\\uFCCE\\uFCCF\\uFCD0\\uFCD1\\uFCD2\\uFCD3\\uFCD4\\uFCD5\\uFCD6\\uFCD7\\uFCD8\\uFCD9\\uFCDA\\uFCDB\\uFCDC\\uFCDD\\uFCDE\\uFCDF\\uFCE0\\uFCE1\\uFCE2\\uFCE3\\uFCE4\\uFCE5\\uFCE6\\uFCE7\\uFCE8\\uFCE9\\uFCEA\\uFCEB\\uFCEC\\uFCED\\uFCEE\\uFCEF\\uFCF0\\uFCF1\\uFCF2\\uFCF3\\uFCF4\\uFCF5\\uFCF6\\uFCF7\\uFCF8\\uFCF9\\uFCFA\\uFCFB\\uFCFC\\uFCFD\\uFCFE\\uFCFF\\uFD00\\uFD01\\uFD02\\uFD03\\uFD04\\uFD05\\uFD06\\uFD07\\uFD08\\uFD09\\uFD0A\\uFD0B\\uFD0C\\uFD0D\\uFD0E\\uFD0F\\uFD10\\uFD11\\uFD12\\uFD13\\uFD14\\uFD15\\uFD16\\uFD17\\uFD18\\uFD19\\uFD1A\\uFD1B\\uFD1C\\uFD1D\\uFD1E\\uFD1F\\uFD20\\uFD21\\uFD22\\uFD23\\uFD24\\uFD25\\uFD26\\uFD27\\uFD28\\uFD29\\uFD2A\\uFD2B\\uFD2C\\uFD2D\\uFD2E\\uFD2F\\uFD30\\uFD31\\uFD32\\uFD33\\uFD34\\uFD35\\uFD36\\uFD37\\uFD38\\uFD39\\uFD3A\\uFD3B\\uFD3C\\uFD3D\\uFD50\\uFD51\\uFD52\\uFD53\\uFD54\\uFD55\\uFD56\\uFD57\\uFD58\\uFD59\\uFD5A\\uFD5B\\uFD5C\\uFD5D\\uFD5E\\uFD5F\\uFD60\\uFD61\\uFD62\\uFD63\\uFD64\\uFD65\\uFD66\\uFD67\\uFD68\\uFD69\\uFD6A\\uFD6B\\uFD6C\\uFD6D\\uFD6E\\uFD6F\\uFD70\\uFD71\\uFD72\\uFD73\\uFD74\\uFD75\\uFD76\\uFD77\\uFD78\\uFD79\\uFD7A\\uFD7B\\uFD7C\\uFD7D\\uFD7E\\uFD7F\\uFD80\\uFD81\\uFD82\\uFD83\\uFD84\\uFD85\\uFD86\\uFD87\\uFD88\\uFD89\\uFD8A\\uFD8B\\uFD8C\\uFD8D\\uFD8E\\uFD8F\\uFD92\\uFD93\\uFD94\\uFD95\\uFD96\\uFD97\\uFD98\\uFD99\\uFD9A\\uFD9B\\uFD9C\\uFD9D\\uFD9E\\uFD9F\\uFDA0\\uFDA1\\uFDA2\\uFDA3\\uFDA4\\uFDA5\\uFDA6\\uFDA7\\uFDA8\\uFDA9\\uFDAA\\uFDAB\\uFDAC\\uFDAD\\uFDAE\\uFDAF\\uFDB0\\uFDB1\\uFDB2\\uFDB3\\uFDB4\\uFDB5\\uFDB6\\uFDB7\\uFDB8\\uFDB9\\uFDBA\\uFDBB\\uFDBC\\uFDBD\\uFDBE\\uFDBF\\uFDC0\\uFDC1\\uFDC2\\uFDC3\\uFDC4\\uFDC5\\uFDC6\\uFDC7\\uFDF0\\uFDF1\\uFDF2\\uFDF3\\uFDF4\\uFDF5\\uFDF6\\uFDF7\\uFDF8\\uFDF9\\uFDFA\\uFDFB\\uFE70\\uFE71\\uFE72\\uFE73\\uFE74\\uFE76\\uFE77\\uFE78\\uFE79\\uFE7A\\uFE7B\\uFE7C\\uFE7D\\uFE7E\\uFE7F\\uFE80\\uFE81\\uFE82\\uFE83\\uFE84\\uFE85\\uFE86\\uFE87\\uFE88\\uFE89\\uFE8A\\uFE8B\\uFE8C\\uFE8D\\uFE8E\\uFE8F\\uFE90\\uFE91\\uFE92\\uFE93\\uFE94\\uFE95\\uFE96\\uFE97\\uFE98\\uFE99\\uFE9A\\uFE9B\\uFE9C\\uFE9D\\uFE9E\\uFE9F\\uFEA0\\uFEA1\\uFEA2\\uFEA3\\uFEA4\\uFEA5\\uFEA6\\uFEA7\\uFEA8\\uFEA9\\uFEAA\\uFEAB\\uFEAC\\uFEAD\\uFEAE\\uFEAF\\uFEB0\\uFEB1\\uFEB2\\uFEB3\\uFEB4\\uFEB5\\uFEB6\\uFEB7\\uFEB8\\uFEB9\\uFEBA\\uFEBB\\uFEBC\\uFEBD\\uFEBE\\uFEBF\\uFEC0\\uFEC1\\uFEC2\\uFEC3\\uFEC4\\uFEC5\\uFEC6\\uFEC7\\uFEC8\\uFEC9\\uFECA\\uFECB\\uFECC\\uFECD\\uFECE\\uFECF\\uFED0\\uFED1\\uFED2\\uFED3\\uFED4\\uFED5\\uFED6\\uFED7\\uFED8\\uFED9\\uFEDA\\uFEDB\\uFEDC\\uFEDD\\uFEDE\\uFEDF\\uFEE0\\uFEE1\\uFEE2\\uFEE3\\uFEE4\\uFEE5\\uFEE6\\uFEE7\\uFEE8\\uFEE9\\uFEEA\\uFEEB\\uFEEC\\uFEED\\uFEEE\\uFEEF\\uFEF0\\uFEF1\\uFEF2\\uFEF3\\uFEF4\\uFEF5\\uFEF6\\uFEF7\\uFEF8\\uFEF9\\uFEFA\\uFEFB\\uFEFC\\uFF66\\uFF67\\uFF68\\uFF69\\uFF6A\\uFF6B\\uFF6C\\uFF6D\\uFF6E\\uFF6F\\uFF71\\uFF72\\uFF73\\uFF74\\uFF75\\uFF76\\uFF77\\uFF78\\uFF79\\uFF7A\\uFF7B\\uFF7C\\uFF7D\\uFF7E\\uFF7F\\uFF80\\uFF81\\uFF82\\uFF83\\uFF84\\uFF85\\uFF86\\uFF87\\uFF88\\uFF89\\uFF8A\\uFF8B\\uFF8C\\uFF8D\\uFF8E\\uFF8F\\uFF90\\uFF91\\uFF92\\uFF93\\uFF94\\uFF95\\uFF96\\uFF97\\uFF98\\uFF99\\uFF9A\\uFF9B\\uFF9C\\uFF9D\\uFFA0\\uFFA1\\uFFA2\\uFFA3\\uFFA4\\uFFA5\\uFFA6\\uFFA7\\uFFA8\\uFFA9\\uFFAA\\uFFAB\\uFFAC\\uFFAD\\uFFAE\\uFFAF\\uFFB0\\uFFB1\\uFFB2\\uFFB3\\uFFB4\\uFFB5\\uFFB6\\uFFB7\\uFFB8\\uFFB9\\uFFBA\\uFFBB\\uFFBC\\uFFBD\\uFFBE\\uFFC2\\uFFC3\\uFFC4\\uFFC5\\uFFC6\\uFFC7\\uFFCA\\uFFCB\\uFFCC\\uFFCD\\uFFCE\\uFFCF\\uFFD2\\uFFD3\\uFFD4\\uFFD5\\uFFD6\\uFFD7\\uFFDA\\uFFDB\\uFFDC]" }, | |
| peg$c80 = /^[\u01C5\u01C8\u01CB\u01F2\u1F88\u1F89\u1F8A\u1F8B\u1F8C\u1F8D\u1F8E\u1F8F\u1F98\u1F99\u1F9A\u1F9B\u1F9C\u1F9D\u1F9E\u1F9F\u1FA8\u1FA9\u1FAA\u1FAB\u1FAC\u1FAD\u1FAE\u1FAF\u1FBC\u1FCC\u1FFC]/, | |
| peg$c81 = { type: "class", value: "[\\u01C5\\u01C8\\u01CB\\u01F2\\u1F88\\u1F89\\u1F8A\\u1F8B\\u1F8C\\u1F8D\\u1F8E\\u1F8F\\u1F98\\u1F99\\u1F9A\\u1F9B\\u1F9C\\u1F9D\\u1F9E\\u1F9F\\u1FA8\\u1FA9\\u1FAA\\u1FAB\\u1FAC\\u1FAD\\u1FAE\\u1FAF\\u1FBC\\u1FCC\\u1FFC]", description: "[\\u01C5\\u01C8\\u01CB\\u01F2\\u1F88\\u1F89\\u1F8A\\u1F8B\\u1F8C\\u1F8D\\u1F8E\\u1F8F\\u1F98\\u1F99\\u1F9A\\u1F9B\\u1F9C\\u1F9D\\u1F9E\\u1F9F\\u1FA8\\u1FA9\\u1FAA\\u1FAB\\u1FAC\\u1FAD\\u1FAE\\u1FAF\\u1FBC\\u1FCC\\u1FFC]" }, | |
| peg$c82 = /^[ABCDEFGHIJKLMNOPQRSTUVWXYZ\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD8\xD9\xDA\xDB\xDC\xDD\xDE\u0100\u0102\u0104\u0106\u0108\u010A\u010C\u010E\u0110\u0112\u0114\u0116\u0118\u011A\u011C\u011E\u0120\u0122\u0124\u0126\u0128\u012A\u012C\u012E\u0130\u0132\u0134\u0136\u0139\u013B\u013D\u013F\u0141\u0143\u0145\u0147\u014A\u014C\u014E\u0150\u0152\u0154\u0156\u0158\u015A\u015C\u015E\u0160\u0162\u0164\u0166\u0168\u016A\u016C\u016E\u0170\u0172\u0174\u0176\u0178\u0179\u017B\u017D\u0181\u0182\u0184\u0186\u0187\u0189\u018A\u018B\u018E\u018F\u0190\u0191\u0193\u0194\u0196\u0197\u0198\u019C\u019D\u019F\u01A0\u01A2\u01A4\u01A6\u01A7\u01A9\u01AC\u01AE\u01AF\u01B1\u01B2\u01B3\u01B5\u01B7\u01B8\u01BC\u01C4\u01C7\u01CA\u01CD\u01CF\u01D1\u01D3\u01D5\u01D7\u01D9\u01DB\u01DE\u01E0\u01E2\u01E4\u01E6\u01E8\u01EA\u01EC\u01EE\u01F1\u01F4\u01F6\u01F7\u01F8\u01FA\u01FC\u01FE\u0200\u0202\u0204\u0206\u0208\u020A\u020C\u020E\u0210\u0212\u0214\u0216\u0218\u021A\u021C\u021E\u0220\u0222\u0224\u0226\u0228\u022A\u022C\u022E\u0230\u0232\u023A\u023B\u023D\u023E\u0241\u0243\u0244\u0245\u0246\u0248\u024A\u024C\u024E\u0370\u0372\u0376\u0386\u0388\u0389\u038A\u038C\u038E\u038F\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039A\u039B\u039C\u039D\u039E\u039F\u03A0\u03A1\u03A3\u03A4\u03A5\u03A6\u03A7\u03A8\u03A9\u03AA\u03AB\u03CF\u03D2\u03D3\u03D4\u03D8\u03DA\u03DC\u03DE\u03E0\u03E2\u03E4\u03E6\u03E8\u03EA\u03EC\u03EE\u03F4\u03F7\u03F9\u03FA\u03FD\u03FE\u03FF\u0400\u0401\u0402\u0403\u0404\u0405\u0406\u0407\u0408\u0409\u040A\u040B\u040C\u040D\u040E\u040F\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041A\u041B\u041C\u041D\u041E\u041F\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042A\u042B\u042C\u042D\u042E\u042F\u0460\u0462\u0464\u0466\u0468\u046A\u046C\u046E\u0470\u0472\u0474\u0476\u0478\u047A\u047C\u047E\u0480\u048A\u048C\u048E\u0490\u0492\u0494\u0496\u0498\u049A\u049C\u049E\u04A0\u04A2\u04A4\u04A6\u04A8\u04AA\u04AC\u04AE\u04B0\u04B2\u04B4\u04B6\u04B8\u04BA\u04BC\u04BE\u04C0\u04C1\u04C3\u04C5\u04C7\u04C9\u04CB\u04CD\u04D0\u04D2\u04D4\u04D6\u04D8\u04DA\u04DC\u04DE\u04E0\u04E2\u04E4\u04E6\u04E8\u04EA\u04EC\u04EE\u04F0\u04F2\u04F4\u04F6\u04F8\u04FA\u04FC\u04FE\u0500\u0502\u0504\u0506\u0508\u050A\u050C\u050E\u0510\u0512\u0514\u0516\u0518\u051A\u051C\u051E\u0520\u0522\u0531\u0532\u0533\u0534\u0535\u0536\u0537\u0538\u0539\u053A\u053B\u053C\u053D\u053E\u053F\u0540\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054A\u054B\u054C\u054D\u054E\u054F\u0550\u0551\u0552\u0553\u0554\u0555\u0556\u10A0\u10A1\u10A2\u10A3\u10A4\u10A5\u10A6\u10A7\u10A8\u10A9\u10AA\u10AB\u10AC\u10AD\u10AE\u10AF\u10B0\u10B1\u10B2\u10B3\u10B4\u10B5\u10B6\u10B7\u10B8\u10B9\u10BA\u10BB\u10BC\u10BD\u10BE\u10BF\u10C0\u10C1\u10C2\u10C3\u10C4\u10C5\u1E00\u1E02\u1E04\u1E06\u1E08\u1E0A\u1E0C\u1E0E\u1E10\u1E12\u1E14\u1E16\u1E18\u1E1A\u1E1C\u1E1E\u1E20\u1E22\u1E24\u1E26\u1E28\u1E2A\u1E2C\u1E2E\u1E30\u1E32\u1E34\u1E36\u1E38\u1E3A\u1E3C\u1E3E\u1E40\u1E42\u1E44\u1E46\u1E48\u1E4A\u1E4C\u1E4E\u1E50\u1E52\u1E54\u1E56\u1E58\u1E5A\u1E5C\u1E5E\u1E60\u1E62\u1E64\u1E66\u1E68\u1E6A\u1E6C\u1E6E\u1E70\u1E72\u1E74\u1E76\u1E78\u1E7A\u1E7C\u1E7E\u1E80\u1E82\u1E84\u1E86\u1E88\u1E8A\u1E8C\u1E8E\u1E90\u1E92\u1E94\u1E9E\u1EA0\u1EA2\u1EA4\u1EA6\u1EA8\u1EAA\u1EAC\u1EAE\u1EB0\u1EB2\u1EB4\u1EB6\u1EB8\u1EBA\u1EBC\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6\u1EC8\u1ECA\u1ECC\u1ECE\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EDA\u1EDC\u1EDE\u1EE0\u1EE2\u1EE4\u1EE6\u1EE8\u1EEA\u1EEC\u1EEE\u1EF0\u1EF2\u1EF4\u1EF6\u1EF8\u1EFA\u1EFC\u1EFE\u1F08\u1F09\u1F0A\u1F0B\u1F0C\u1F0D\u1F0E\u1F0F\u1F18\u1F19\u1F1A\u1F1B\u1F1C\u1F1D\u1F28\u1F29\u1F2A\u1F2B\u1F2C\u1F2D\u1F2E\u1F2F\u1F38\u1F39\u1F3A\u1F3B\u1F3C\u1F3D\u1F3E\u1F3F\u1F48\u1F49\u1F4A\u1F4B\u1F4C\u1F4D\u1F59\u1F5B\u1F5D\u1F5F\u1F68\u1F69\u1F6A\u1F6B\u1F6C\u1F6D\u1F6E\u1F6F\u1FB8\u1FB9\u1FBA\u1FBB\u1FC8\u1FC9\u1FCA\u1FCB\u1FD8\u1FD9\u1FDA\u1FDB\u1FE8\u1FE9\u1FEA\u1FEB\u1FEC\u1FF8\u1FF9\u1FFA\u1FFB\u2102\u2107\u210B\u210C\u210D\u2110\u2111\u2112\u2115\u2119\u211A\u211B\u211C\u211D\u2124\u2126\u2128\u212A\u212B\u212C\u212D\u2130\u2131\u2132\u2133\u213E\u213F\u2145\u2183\u2C00\u2C01\u2C02\u2C03\u2C04\u2C05\u2C06\u2C07\u2C08\u2C09\u2C0A\u2C0B\u2C0C\u2C0D\u2C0E\u2C0F\u2C10\u2C11\u2C12\u2C13\u2C14\u2C15\u2C16\u2C17\u2C18\u2C19\u2C1A\u2C1B\u2C1C\u2C1D\u2C1E\u2C1F\u2C20\u2C21\u2C22\u2C23\u2C24\u2C25\u2C26\u2C27\u2C28\u2C29\u2C2A\u2C2B\u2C2C\u2C2D\u2C2E\u2C60\u2C62\u2C63\u2C64\u2C67\u2C69\u2C6B\u2C6D\u2C6E\u2C6F\u2C72\u2C75\u2C80\u2C82\u2C84\u2C86\u2C88\u2C8A\u2C8C\u2C8E\u2C90\u2C92\u2C94\u2C96\u2C98\u2C9A\u2C9C\u2C9E\u2CA0\u2CA2\u2CA4\u2CA6\u2CA8\u2CAA\u2CAC\u2CAE\u2CB0\u2CB2\u2CB4\u2CB6\u2CB8\u2CBA\u2CBC\u2CBE\u2CC0\u2CC2\u2CC4\u2CC6\u2CC8\u2CCA\u2CCC\u2CCE\u2CD0\u2CD2\u2CD4\u2CD6\u2CD8\u2CDA\u2CDC\u2CDE\u2CE0\u2CE2\uA640\uA642\uA644\uA646\uA648\uA64A\uA64C\uA64E\uA650\uA652\uA654\uA656\uA658\uA65A\uA65C\uA65E\uA662\uA664\uA666\uA668\uA66A\uA66C\uA680\uA682\uA684\uA686\uA688\uA68A\uA68C\uA68E\uA690\uA692\uA694\uA696\uA722\uA724\uA726\uA728\uA72A\uA72C\uA72E\uA732\uA734\uA736\uA738\uA73A\uA73C\uA73E\uA740\uA742\uA744\uA746\uA748\uA74A\uA74C\uA74E\uA750\uA752\uA754\uA756\uA758\uA75A\uA75C\uA75E\uA760\uA762\uA764\uA766\uA768\uA76A\uA76C\uA76E\uA779\uA77B\uA77D\uA77E\uA780\uA782\uA784\uA786\uA78B\uFF21\uFF22\uFF23\uFF24\uFF25\uFF26\uFF27\uFF28\uFF29\uFF2A\uFF2B\uFF2C\uFF2D\uFF2E\uFF2F\uFF30\uFF31\uFF32\uFF33\uFF34\uFF35\uFF36\uFF37\uFF38\uFF39\uFF3A]/, | |
| peg$c83 = { type: "class", value: "[ABCDEFGHIJKLMNOPQRSTUVWXYZ\\xC0\\xC1\\xC2\\xC3\\xC4\\xC5\\xC6\\xC7\\xC8\\xC9\\xCA\\xCB\\xCC\\xCD\\xCE\\xCF\\xD0\\xD1\\xD2\\xD3\\xD4\\xD5\\xD6\\xD8\\xD9\\xDA\\xDB\\xDC\\xDD\\xDE\\u0100\\u0102\\u0104\\u0106\\u0108\\u010A\\u010C\\u010E\\u0110\\u0112\\u0114\\u0116\\u0118\\u011A\\u011C\\u011E\\u0120\\u0122\\u0124\\u0126\\u0128\\u012A\\u012C\\u012E\\u0130\\u0132\\u0134\\u0136\\u0139\\u013B\\u013D\\u013F\\u0141\\u0143\\u0145\\u0147\\u014A\\u014C\\u014E\\u0150\\u0152\\u0154\\u0156\\u0158\\u015A\\u015C\\u015E\\u0160\\u0162\\u0164\\u0166\\u0168\\u016A\\u016C\\u016E\\u0170\\u0172\\u0174\\u0176\\u0178\\u0179\\u017B\\u017D\\u0181\\u0182\\u0184\\u0186\\u0187\\u0189\\u018A\\u018B\\u018E\\u018F\\u0190\\u0191\\u0193\\u0194\\u0196\\u0197\\u0198\\u019C\\u019D\\u019F\\u01A0\\u01A2\\u01A4\\u01A6\\u01A7\\u01A9\\u01AC\\u01AE\\u01AF\\u01B1\\u01B2\\u01B3\\u01B5\\u01B7\\u01B8\\u01BC\\u01C4\\u01C7\\u01CA\\u01CD\\u01CF\\u01D1\\u01D3\\u01D5\\u01D7\\u01D9\\u01DB\\u01DE\\u01E0\\u01E2\\u01E4\\u01E6\\u01E8\\u01EA\\u01EC\\u01EE\\u01F1\\u01F4\\u01F6\\u01F7\\u01F8\\u01FA\\u01FC\\u01FE\\u0200\\u0202\\u0204\\u0206\\u0208\\u020A\\u020C\\u020E\\u0210\\u0212\\u0214\\u0216\\u0218\\u021A\\u021C\\u021E\\u0220\\u0222\\u0224\\u0226\\u0228\\u022A\\u022C\\u022E\\u0230\\u0232\\u023A\\u023B\\u023D\\u023E\\u0241\\u0243\\u0244\\u0245\\u0246\\u0248\\u024A\\u024C\\u024E\\u0370\\u0372\\u0376\\u0386\\u0388\\u0389\\u038A\\u038C\\u038E\\u038F\\u0391\\u0392\\u0393\\u0394\\u0395\\u0396\\u0397\\u0398\\u0399\\u039A\\u039B\\u039C\\u039D\\u039E\\u039F\\u03A0\\u03A1\\u03A3\\u03A4\\u03A5\\u03A6\\u03A7\\u03A8\\u03A9\\u03AA\\u03AB\\u03CF\\u03D2\\u03D3\\u03D4\\u03D8\\u03DA\\u03DC\\u03DE\\u03E0\\u03E2\\u03E4\\u03E6\\u03E8\\u03EA\\u03EC\\u03EE\\u03F4\\u03F7\\u03F9\\u03FA\\u03FD\\u03FE\\u03FF\\u0400\\u0401\\u0402\\u0403\\u0404\\u0405\\u0406\\u0407\\u0408\\u0409\\u040A\\u040B\\u040C\\u040D\\u040E\\u040F\\u0410\\u0411\\u0412\\u0413\\u0414\\u0415\\u0416\\u0417\\u0418\\u0419\\u041A\\u041B\\u041C\\u041D\\u041E\\u041F\\u0420\\u0421\\u0422\\u0423\\u0424\\u0425\\u0426\\u0427\\u0428\\u0429\\u042A\\u042B\\u042C\\u042D\\u042E\\u042F\\u0460\\u0462\\u0464\\u0466\\u0468\\u046A\\u046C\\u046E\\u0470\\u0472\\u0474\\u0476\\u0478\\u047A\\u047C\\u047E\\u0480\\u048A\\u048C\\u048E\\u0490\\u0492\\u0494\\u0496\\u0498\\u049A\\u049C\\u049E\\u04A0\\u04A2\\u04A4\\u04A6\\u04A8\\u04AA\\u04AC\\u04AE\\u04B0\\u04B2\\u04B4\\u04B6\\u04B8\\u04BA\\u04BC\\u04BE\\u04C0\\u04C1\\u04C3\\u04C5\\u04C7\\u04C9\\u04CB\\u04CD\\u04D0\\u04D2\\u04D4\\u04D6\\u04D8\\u04DA\\u04DC\\u04DE\\u04E0\\u04E2\\u04E4\\u04E6\\u04E8\\u04EA\\u04EC\\u04EE\\u04F0\\u04F2\\u04F4\\u04F6\\u04F8\\u04FA\\u04FC\\u04FE\\u0500\\u0502\\u0504\\u0506\\u0508\\u050A\\u050C\\u050E\\u0510\\u0512\\u0514\\u0516\\u0518\\u051A\\u051C\\u051E\\u0520\\u0522\\u0531\\u0532\\u0533\\u0534\\u0535\\u0536\\u0537\\u0538\\u0539\\u053A\\u053B\\u053C\\u053D\\u053E\\u053F\\u0540\\u0541\\u0542\\u0543\\u0544\\u0545\\u0546\\u0547\\u0548\\u0549\\u054A\\u054B\\u054C\\u054D\\u054E\\u054F\\u0550\\u0551\\u0552\\u0553\\u0554\\u0555\\u0556\\u10A0\\u10A1\\u10A2\\u10A3\\u10A4\\u10A5\\u10A6\\u10A7\\u10A8\\u10A9\\u10AA\\u10AB\\u10AC\\u10AD\\u10AE\\u10AF\\u10B0\\u10B1\\u10B2\\u10B3\\u10B4\\u10B5\\u10B6\\u10B7\\u10B8\\u10B9\\u10BA\\u10BB\\u10BC\\u10BD\\u10BE\\u10BF\\u10C0\\u10C1\\u10C2\\u10C3\\u10C4\\u10C5\\u1E00\\u1E02\\u1E04\\u1E06\\u1E08\\u1E0A\\u1E0C\\u1E0E\\u1E10\\u1E12\\u1E14\\u1E16\\u1E18\\u1E1A\\u1E1C\\u1E1E\\u1E20\\u1E22\\u1E24\\u1E26\\u1E28\\u1E2A\\u1E2C\\u1E2E\\u1E30\\u1E32\\u1E34\\u1E36\\u1E38\\u1E3A\\u1E3C\\u1E3E\\u1E40\\u1E42\\u1E44\\u1E46\\u1E48\\u1E4A\\u1E4C\\u1E4E\\u1E50\\u1E52\\u1E54\\u1E56\\u1E58\\u1E5A\\u1E5C\\u1E5E\\u1E60\\u1E62\\u1E64\\u1E66\\u1E68\\u1E6A\\u1E6C\\u1E6E\\u1E70\\u1E72\\u1E74\\u1E76\\u1E78\\u1E7A\\u1E7C\\u1E7E\\u1E80\\u1E82\\u1E84\\u1E86\\u1E88\\u1E8A\\u1E8C\\u1E8E\\u1E90\\u1E92\\u1E94\\u1E9E\\u1EA0\\u1EA2\\u1EA4\\u1EA6\\u1EA8\\u1EAA\\u1EAC\\u1EAE\\u1EB0\\u1EB2\\u1EB4\\u1EB6\\u1EB8\\u1EBA\\u1EBC\\u1EBE\\u1EC0\\u1EC2\\u1EC4\\u1EC6\\u1EC8\\u1ECA\\u1ECC\\u1ECE\\u1ED0\\u1ED2\\u1ED4\\u1ED6\\u1ED8\\u1EDA\\u1EDC\\u1EDE\\u1EE0\\u1EE2\\u1EE4\\u1EE6\\u1EE8\\u1EEA\\u1EEC\\u1EEE\\u1EF0\\u1EF2\\u1EF4\\u1EF6\\u1EF8\\u1EFA\\u1EFC\\u1EFE\\u1F08\\u1F09\\u1F0A\\u1F0B\\u1F0C\\u1F0D\\u1F0E\\u1F0F\\u1F18\\u1F19\\u1F1A\\u1F1B\\u1F1C\\u1F1D\\u1F28\\u1F29\\u1F2A\\u1F2B\\u1F2C\\u1F2D\\u1F2E\\u1F2F\\u1F38\\u1F39\\u1F3A\\u1F3B\\u1F3C\\u1F3D\\u1F3E\\u1F3F\\u1F48\\u1F49\\u1F4A\\u1F4B\\u1F4C\\u1F4D\\u1F59\\u1F5B\\u1F5D\\u1F5F\\u1F68\\u1F69\\u1F6A\\u1F6B\\u1F6C\\u1F6D\\u1F6E\\u1F6F\\u1FB8\\u1FB9\\u1FBA\\u1FBB\\u1FC8\\u1FC9\\u1FCA\\u1FCB\\u1FD8\\u1FD9\\u1FDA\\u1FDB\\u1FE8\\u1FE9\\u1FEA\\u1FEB\\u1FEC\\u1FF8\\u1FF9\\u1FFA\\u1FFB\\u2102\\u2107\\u210B\\u210C\\u210D\\u2110\\u2111\\u2112\\u2115\\u2119\\u211A\\u211B\\u211C\\u211D\\u2124\\u2126\\u2128\\u212A\\u212B\\u212C\\u212D\\u2130\\u2131\\u2132\\u2133\\u213E\\u213F\\u2145\\u2183\\u2C00\\u2C01\\u2C02\\u2C03\\u2C04\\u2C05\\u2C06\\u2C07\\u2C08\\u2C09\\u2C0A\\u2C0B\\u2C0C\\u2C0D\\u2C0E\\u2C0F\\u2C10\\u2C11\\u2C12\\u2C13\\u2C14\\u2C15\\u2C16\\u2C17\\u2C18\\u2C19\\u2C1A\\u2C1B\\u2C1C\\u2C1D\\u2C1E\\u2C1F\\u2C20\\u2C21\\u2C22\\u2C23\\u2C24\\u2C25\\u2C26\\u2C27\\u2C28\\u2C29\\u2C2A\\u2C2B\\u2C2C\\u2C2D\\u2C2E\\u2C60\\u2C62\\u2C63\\u2C64\\u2C67\\u2C69\\u2C6B\\u2C6D\\u2C6E\\u2C6F\\u2C72\\u2C75\\u2C80\\u2C82\\u2C84\\u2C86\\u2C88\\u2C8A\\u2C8C\\u2C8E\\u2C90\\u2C92\\u2C94\\u2C96\\u2C98\\u2C9A\\u2C9C\\u2C9E\\u2CA0\\u2CA2\\u2CA4\\u2CA6\\u2CA8\\u2CAA\\u2CAC\\u2CAE\\u2CB0\\u2CB2\\u2CB4\\u2CB6\\u2CB8\\u2CBA\\u2CBC\\u2CBE\\u2CC0\\u2CC2\\u2CC4\\u2CC6\\u2CC8\\u2CCA\\u2CCC\\u2CCE\\u2CD0\\u2CD2\\u2CD4\\u2CD6\\u2CD8\\u2CDA\\u2CDC\\u2CDE\\u2CE0\\u2CE2\\uA640\\uA642\\uA644\\uA646\\uA648\\uA64A\\uA64C\\uA64E\\uA650\\uA652\\uA654\\uA656\\uA658\\uA65A\\uA65C\\uA65E\\uA662\\uA664\\uA666\\uA668\\uA66A\\uA66C\\uA680\\uA682\\uA684\\uA686\\uA688\\uA68A\\uA68C\\uA68E\\uA690\\uA692\\uA694\\uA696\\uA722\\uA724\\uA726\\uA728\\uA72A\\uA72C\\uA72E\\uA732\\uA734\\uA736\\uA738\\uA73A\\uA73C\\uA73E\\uA740\\uA742\\uA744\\uA746\\uA748\\uA74A\\uA74C\\uA74E\\uA750\\uA752\\uA754\\uA756\\uA758\\uA75A\\uA75C\\uA75E\\uA760\\uA762\\uA764\\uA766\\uA768\\uA76A\\uA76C\\uA76E\\uA779\\uA77B\\uA77D\\uA77E\\uA780\\uA782\\uA784\\uA786\\uA78B\\uFF21\\uFF22\\uFF23\\uFF24\\uFF25\\uFF26\\uFF27\\uFF28\\uFF29\\uFF2A\\uFF2B\\uFF2C\\uFF2D\\uFF2E\\uFF2F\\uFF30\\uFF31\\uFF32\\uFF33\\uFF34\\uFF35\\uFF36\\uFF37\\uFF38\\uFF39\\uFF3A]", description: "[ABCDEFGHIJKLMNOPQRSTUVWXYZ\\xC0\\xC1\\xC2\\xC3\\xC4\\xC5\\xC6\\xC7\\xC8\\xC9\\xCA\\xCB\\xCC\\xCD\\xCE\\xCF\\xD0\\xD1\\xD2\\xD3\\xD4\\xD5\\xD6\\xD8\\xD9\\xDA\\xDB\\xDC\\xDD\\xDE\\u0100\\u0102\\u0104\\u0106\\u0108\\u010A\\u010C\\u010E\\u0110\\u0112\\u0114\\u0116\\u0118\\u011A\\u011C\\u011E\\u0120\\u0122\\u0124\\u0126\\u0128\\u012A\\u012C\\u012E\\u0130\\u0132\\u0134\\u0136\\u0139\\u013B\\u013D\\u013F\\u0141\\u0143\\u0145\\u0147\\u014A\\u014C\\u014E\\u0150\\u0152\\u0154\\u0156\\u0158\\u015A\\u015C\\u015E\\u0160\\u0162\\u0164\\u0166\\u0168\\u016A\\u016C\\u016E\\u0170\\u0172\\u0174\\u0176\\u0178\\u0179\\u017B\\u017D\\u0181\\u0182\\u0184\\u0186\\u0187\\u0189\\u018A\\u018B\\u018E\\u018F\\u0190\\u0191\\u0193\\u0194\\u0196\\u0197\\u0198\\u019C\\u019D\\u019F\\u01A0\\u01A2\\u01A4\\u01A6\\u01A7\\u01A9\\u01AC\\u01AE\\u01AF\\u01B1\\u01B2\\u01B3\\u01B5\\u01B7\\u01B8\\u01BC\\u01C4\\u01C7\\u01CA\\u01CD\\u01CF\\u01D1\\u01D3\\u01D5\\u01D7\\u01D9\\u01DB\\u01DE\\u01E0\\u01E2\\u01E4\\u01E6\\u01E8\\u01EA\\u01EC\\u01EE\\u01F1\\u01F4\\u01F6\\u01F7\\u01F8\\u01FA\\u01FC\\u01FE\\u0200\\u0202\\u0204\\u0206\\u0208\\u020A\\u020C\\u020E\\u0210\\u0212\\u0214\\u0216\\u0218\\u021A\\u021C\\u021E\\u0220\\u0222\\u0224\\u0226\\u0228\\u022A\\u022C\\u022E\\u0230\\u0232\\u023A\\u023B\\u023D\\u023E\\u0241\\u0243\\u0244\\u0245\\u0246\\u0248\\u024A\\u024C\\u024E\\u0370\\u0372\\u0376\\u0386\\u0388\\u0389\\u038A\\u038C\\u038E\\u038F\\u0391\\u0392\\u0393\\u0394\\u0395\\u0396\\u0397\\u0398\\u0399\\u039A\\u039B\\u039C\\u039D\\u039E\\u039F\\u03A0\\u03A1\\u03A3\\u03A4\\u03A5\\u03A6\\u03A7\\u03A8\\u03A9\\u03AA\\u03AB\\u03CF\\u03D2\\u03D3\\u03D4\\u03D8\\u03DA\\u03DC\\u03DE\\u03E0\\u03E2\\u03E4\\u03E6\\u03E8\\u03EA\\u03EC\\u03EE\\u03F4\\u03F7\\u03F9\\u03FA\\u03FD\\u03FE\\u03FF\\u0400\\u0401\\u0402\\u0403\\u0404\\u0405\\u0406\\u0407\\u0408\\u0409\\u040A\\u040B\\u040C\\u040D\\u040E\\u040F\\u0410\\u0411\\u0412\\u0413\\u0414\\u0415\\u0416\\u0417\\u0418\\u0419\\u041A\\u041B\\u041C\\u041D\\u041E\\u041F\\u0420\\u0421\\u0422\\u0423\\u0424\\u0425\\u0426\\u0427\\u0428\\u0429\\u042A\\u042B\\u042C\\u042D\\u042E\\u042F\\u0460\\u0462\\u0464\\u0466\\u0468\\u046A\\u046C\\u046E\\u0470\\u0472\\u0474\\u0476\\u0478\\u047A\\u047C\\u047E\\u0480\\u048A\\u048C\\u048E\\u0490\\u0492\\u0494\\u0496\\u0498\\u049A\\u049C\\u049E\\u04A0\\u04A2\\u04A4\\u04A6\\u04A8\\u04AA\\u04AC\\u04AE\\u04B0\\u04B2\\u04B4\\u04B6\\u04B8\\u04BA\\u04BC\\u04BE\\u04C0\\u04C1\\u04C3\\u04C5\\u04C7\\u04C9\\u04CB\\u04CD\\u04D0\\u04D2\\u04D4\\u04D6\\u04D8\\u04DA\\u04DC\\u04DE\\u04E0\\u04E2\\u04E4\\u04E6\\u04E8\\u04EA\\u04EC\\u04EE\\u04F0\\u04F2\\u04F4\\u04F6\\u04F8\\u04FA\\u04FC\\u04FE\\u0500\\u0502\\u0504\\u0506\\u0508\\u050A\\u050C\\u050E\\u0510\\u0512\\u0514\\u0516\\u0518\\u051A\\u051C\\u051E\\u0520\\u0522\\u0531\\u0532\\u0533\\u0534\\u0535\\u0536\\u0537\\u0538\\u0539\\u053A\\u053B\\u053C\\u053D\\u053E\\u053F\\u0540\\u0541\\u0542\\u0543\\u0544\\u0545\\u0546\\u0547\\u0548\\u0549\\u054A\\u054B\\u054C\\u054D\\u054E\\u054F\\u0550\\u0551\\u0552\\u0553\\u0554\\u0555\\u0556\\u10A0\\u10A1\\u10A2\\u10A3\\u10A4\\u10A5\\u10A6\\u10A7\\u10A8\\u10A9\\u10AA\\u10AB\\u10AC\\u10AD\\u10AE\\u10AF\\u10B0\\u10B1\\u10B2\\u10B3\\u10B4\\u10B5\\u10B6\\u10B7\\u10B8\\u10B9\\u10BA\\u10BB\\u10BC\\u10BD\\u10BE\\u10BF\\u10C0\\u10C1\\u10C2\\u10C3\\u10C4\\u10C5\\u1E00\\u1E02\\u1E04\\u1E06\\u1E08\\u1E0A\\u1E0C\\u1E0E\\u1E10\\u1E12\\u1E14\\u1E16\\u1E18\\u1E1A\\u1E1C\\u1E1E\\u1E20\\u1E22\\u1E24\\u1E26\\u1E28\\u1E2A\\u1E2C\\u1E2E\\u1E30\\u1E32\\u1E34\\u1E36\\u1E38\\u1E3A\\u1E3C\\u1E3E\\u1E40\\u1E42\\u1E44\\u1E46\\u1E48\\u1E4A\\u1E4C\\u1E4E\\u1E50\\u1E52\\u1E54\\u1E56\\u1E58\\u1E5A\\u1E5C\\u1E5E\\u1E60\\u1E62\\u1E64\\u1E66\\u1E68\\u1E6A\\u1E6C\\u1E6E\\u1E70\\u1E72\\u1E74\\u1E76\\u1E78\\u1E7A\\u1E7C\\u1E7E\\u1E80\\u1E82\\u1E84\\u1E86\\u1E88\\u1E8A\\u1E8C\\u1E8E\\u1E90\\u1E92\\u1E94\\u1E9E\\u1EA0\\u1EA2\\u1EA4\\u1EA6\\u1EA8\\u1EAA\\u1EAC\\u1EAE\\u1EB0\\u1EB2\\u1EB4\\u1EB6\\u1EB8\\u1EBA\\u1EBC\\u1EBE\\u1EC0\\u1EC2\\u1EC4\\u1EC6\\u1EC8\\u1ECA\\u1ECC\\u1ECE\\u1ED0\\u1ED2\\u1ED4\\u1ED6\\u1ED8\\u1EDA\\u1EDC\\u1EDE\\u1EE0\\u1EE2\\u1EE4\\u1EE6\\u1EE8\\u1EEA\\u1EEC\\u1EEE\\u1EF0\\u1EF2\\u1EF4\\u1EF6\\u1EF8\\u1EFA\\u1EFC\\u1EFE\\u1F08\\u1F09\\u1F0A\\u1F0B\\u1F0C\\u1F0D\\u1F0E\\u1F0F\\u1F18\\u1F19\\u1F1A\\u1F1B\\u1F1C\\u1F1D\\u1F28\\u1F29\\u1F2A\\u1F2B\\u1F2C\\u1F2D\\u1F2E\\u1F2F\\u1F38\\u1F39\\u1F3A\\u1F3B\\u1F3C\\u1F3D\\u1F3E\\u1F3F\\u1F48\\u1F49\\u1F4A\\u1F4B\\u1F4C\\u1F4D\\u1F59\\u1F5B\\u1F5D\\u1F5F\\u1F68\\u1F69\\u1F6A\\u1F6B\\u1F6C\\u1F6D\\u1F6E\\u1F6F\\u1FB8\\u1FB9\\u1FBA\\u1FBB\\u1FC8\\u1FC9\\u1FCA\\u1FCB\\u1FD8\\u1FD9\\u1FDA\\u1FDB\\u1FE8\\u1FE9\\u1FEA\\u1FEB\\u1FEC\\u1FF8\\u1FF9\\u1FFA\\u1FFB\\u2102\\u2107\\u210B\\u210C\\u210D\\u2110\\u2111\\u2112\\u2115\\u2119\\u211A\\u211B\\u211C\\u211D\\u2124\\u2126\\u2128\\u212A\\u212B\\u212C\\u212D\\u2130\\u2131\\u2132\\u2133\\u213E\\u213F\\u2145\\u2183\\u2C00\\u2C01\\u2C02\\u2C03\\u2C04\\u2C05\\u2C06\\u2C07\\u2C08\\u2C09\\u2C0A\\u2C0B\\u2C0C\\u2C0D\\u2C0E\\u2C0F\\u2C10\\u2C11\\u2C12\\u2C13\\u2C14\\u2C15\\u2C16\\u2C17\\u2C18\\u2C19\\u2C1A\\u2C1B\\u2C1C\\u2C1D\\u2C1E\\u2C1F\\u2C20\\u2C21\\u2C22\\u2C23\\u2C24\\u2C25\\u2C26\\u2C27\\u2C28\\u2C29\\u2C2A\\u2C2B\\u2C2C\\u2C2D\\u2C2E\\u2C60\\u2C62\\u2C63\\u2C64\\u2C67\\u2C69\\u2C6B\\u2C6D\\u2C6E\\u2C6F\\u2C72\\u2C75\\u2C80\\u2C82\\u2C84\\u2C86\\u2C88\\u2C8A\\u2C8C\\u2C8E\\u2C90\\u2C92\\u2C94\\u2C96\\u2C98\\u2C9A\\u2C9C\\u2C9E\\u2CA0\\u2CA2\\u2CA4\\u2CA6\\u2CA8\\u2CAA\\u2CAC\\u2CAE\\u2CB0\\u2CB2\\u2CB4\\u2CB6\\u2CB8\\u2CBA\\u2CBC\\u2CBE\\u2CC0\\u2CC2\\u2CC4\\u2CC6\\u2CC8\\u2CCA\\u2CCC\\u2CCE\\u2CD0\\u2CD2\\u2CD4\\u2CD6\\u2CD8\\u2CDA\\u2CDC\\u2CDE\\u2CE0\\u2CE2\\uA640\\uA642\\uA644\\uA646\\uA648\\uA64A\\uA64C\\uA64E\\uA650\\uA652\\uA654\\uA656\\uA658\\uA65A\\uA65C\\uA65E\\uA662\\uA664\\uA666\\uA668\\uA66A\\uA66C\\uA680\\uA682\\uA684\\uA686\\uA688\\uA68A\\uA68C\\uA68E\\uA690\\uA692\\uA694\\uA696\\uA722\\uA724\\uA726\\uA728\\uA72A\\uA72C\\uA72E\\uA732\\uA734\\uA736\\uA738\\uA73A\\uA73C\\uA73E\\uA740\\uA742\\uA744\\uA746\\uA748\\uA74A\\uA74C\\uA74E\\uA750\\uA752\\uA754\\uA756\\uA758\\uA75A\\uA75C\\uA75E\\uA760\\uA762\\uA764\\uA766\\uA768\\uA76A\\uA76C\\uA76E\\uA779\\uA77B\\uA77D\\uA77E\\uA780\\uA782\\uA784\\uA786\\uA78B\\uFF21\\uFF22\\uFF23\\uFF24\\uFF25\\uFF26\\uFF27\\uFF28\\uFF29\\uFF2A\\uFF2B\\uFF2C\\uFF2D\\uFF2E\\uFF2F\\uFF30\\uFF31\\uFF32\\uFF33\\uFF34\\uFF35\\uFF36\\uFF37\\uFF38\\uFF39\\uFF3A]" }, | |
| peg$c84 = /^[\u0903\u093E\u093F\u0940\u0949\u094A\u094B\u094C\u0982\u0983\u09BE\u09BF\u09C0\u09C7\u09C8\u09CB\u09CC\u09D7\u0A03\u0A3E\u0A3F\u0A40\u0A83\u0ABE\u0ABF\u0AC0\u0AC9\u0ACB\u0ACC\u0B02\u0B03\u0B3E\u0B40\u0B47\u0B48\u0B4B\u0B4C\u0B57\u0BBE\u0BBF\u0BC1\u0BC2\u0BC6\u0BC7\u0BC8\u0BCA\u0BCB\u0BCC\u0BD7\u0C01\u0C02\u0C03\u0C41\u0C42\u0C43\u0C44\u0C82\u0C83\u0CBE\u0CC0\u0CC1\u0CC2\u0CC3\u0CC4\u0CC7\u0CC8\u0CCA\u0CCB\u0CD5\u0CD6\u0D02\u0D03\u0D3E\u0D3F\u0D40\u0D46\u0D47\u0D48\u0D4A\u0D4B\u0D4C\u0D57\u0D82\u0D83\u0DCF\u0DD0\u0DD1\u0DD8\u0DD9\u0DDA\u0DDB\u0DDC\u0DDD\u0DDE\u0DDF\u0DF2\u0DF3\u0F3E\u0F3F\u0F7F\u102B\u102C\u1031\u1038\u103B\u103C\u1056\u1057\u1062\u1063\u1064\u1067\u1068\u1069\u106A\u106B\u106C\u106D\u1083\u1084\u1087\u1088\u1089\u108A\u108B\u108C\u108F\u17B6\u17BE\u17BF\u17C0\u17C1\u17C2\u17C3\u17C4\u17C5\u17C7\u17C8\u1923\u1924\u1925\u1926\u1929\u192A\u192B\u1930\u1931\u1933\u1934\u1935\u1936\u1937\u1938\u19B0\u19B1\u19B2\u19B3\u19B4\u19B5\u19B6\u19B7\u19B8\u19B9\u19BA\u19BB\u19BC\u19BD\u19BE\u19BF\u19C0\u19C8\u19C9\u1A19\u1A1A\u1A1B\u1B04\u1B35\u1B3B\u1B3D\u1B3E\u1B3F\u1B40\u1B41\u1B43\u1B44\u1B82\u1BA1\u1BA6\u1BA7\u1BAA\u1C24\u1C25\u1C26\u1C27\u1C28\u1C29\u1C2A\u1C2B\u1C34\u1C35\uA823\uA824\uA827\uA880\uA881\uA8B4\uA8B5\uA8B6\uA8B7\uA8B8\uA8B9\uA8BA\uA8BB\uA8BC\uA8BD\uA8BE\uA8BF\uA8C0\uA8C1\uA8C2\uA8C3\uA952\uA953\uAA2F\uAA30\uAA33\uAA34\uAA4D]/, | |
| peg$c85 = { type: "class", value: "[\\u0903\\u093E\\u093F\\u0940\\u0949\\u094A\\u094B\\u094C\\u0982\\u0983\\u09BE\\u09BF\\u09C0\\u09C7\\u09C8\\u09CB\\u09CC\\u09D7\\u0A03\\u0A3E\\u0A3F\\u0A40\\u0A83\\u0ABE\\u0ABF\\u0AC0\\u0AC9\\u0ACB\\u0ACC\\u0B02\\u0B03\\u0B3E\\u0B40\\u0B47\\u0B48\\u0B4B\\u0B4C\\u0B57\\u0BBE\\u0BBF\\u0BC1\\u0BC2\\u0BC6\\u0BC7\\u0BC8\\u0BCA\\u0BCB\\u0BCC\\u0BD7\\u0C01\\u0C02\\u0C03\\u0C41\\u0C42\\u0C43\\u0C44\\u0C82\\u0C83\\u0CBE\\u0CC0\\u0CC1\\u0CC2\\u0CC3\\u0CC4\\u0CC7\\u0CC8\\u0CCA\\u0CCB\\u0CD5\\u0CD6\\u0D02\\u0D03\\u0D3E\\u0D3F\\u0D40\\u0D46\\u0D47\\u0D48\\u0D4A\\u0D4B\\u0D4C\\u0D57\\u0D82\\u0D83\\u0DCF\\u0DD0\\u0DD1\\u0DD8\\u0DD9\\u0DDA\\u0DDB\\u0DDC\\u0DDD\\u0DDE\\u0DDF\\u0DF2\\u0DF3\\u0F3E\\u0F3F\\u0F7F\\u102B\\u102C\\u1031\\u1038\\u103B\\u103C\\u1056\\u1057\\u1062\\u1063\\u1064\\u1067\\u1068\\u1069\\u106A\\u106B\\u106C\\u106D\\u1083\\u1084\\u1087\\u1088\\u1089\\u108A\\u108B\\u108C\\u108F\\u17B6\\u17BE\\u17BF\\u17C0\\u17C1\\u17C2\\u17C3\\u17C4\\u17C5\\u17C7\\u17C8\\u1923\\u1924\\u1925\\u1926\\u1929\\u192A\\u192B\\u1930\\u1931\\u1933\\u1934\\u1935\\u1936\\u1937\\u1938\\u19B0\\u19B1\\u19B2\\u19B3\\u19B4\\u19B5\\u19B6\\u19B7\\u19B8\\u19B9\\u19BA\\u19BB\\u19BC\\u19BD\\u19BE\\u19BF\\u19C0\\u19C8\\u19C9\\u1A19\\u1A1A\\u1A1B\\u1B04\\u1B35\\u1B3B\\u1B3D\\u1B3E\\u1B3F\\u1B40\\u1B41\\u1B43\\u1B44\\u1B82\\u1BA1\\u1BA6\\u1BA7\\u1BAA\\u1C24\\u1C25\\u1C26\\u1C27\\u1C28\\u1C29\\u1C2A\\u1C2B\\u1C34\\u1C35\\uA823\\uA824\\uA827\\uA880\\uA881\\uA8B4\\uA8B5\\uA8B6\\uA8B7\\uA8B8\\uA8B9\\uA8BA\\uA8BB\\uA8BC\\uA8BD\\uA8BE\\uA8BF\\uA8C0\\uA8C1\\uA8C2\\uA8C3\\uA952\\uA953\\uAA2F\\uAA30\\uAA33\\uAA34\\uAA4D]", description: "[\\u0903\\u093E\\u093F\\u0940\\u0949\\u094A\\u094B\\u094C\\u0982\\u0983\\u09BE\\u09BF\\u09C0\\u09C7\\u09C8\\u09CB\\u09CC\\u09D7\\u0A03\\u0A3E\\u0A3F\\u0A40\\u0A83\\u0ABE\\u0ABF\\u0AC0\\u0AC9\\u0ACB\\u0ACC\\u0B02\\u0B03\\u0B3E\\u0B40\\u0B47\\u0B48\\u0B4B\\u0B4C\\u0B57\\u0BBE\\u0BBF\\u0BC1\\u0BC2\\u0BC6\\u0BC7\\u0BC8\\u0BCA\\u0BCB\\u0BCC\\u0BD7\\u0C01\\u0C02\\u0C03\\u0C41\\u0C42\\u0C43\\u0C44\\u0C82\\u0C83\\u0CBE\\u0CC0\\u0CC1\\u0CC2\\u0CC3\\u0CC4\\u0CC7\\u0CC8\\u0CCA\\u0CCB\\u0CD5\\u0CD6\\u0D02\\u0D03\\u0D3E\\u0D3F\\u0D40\\u0D46\\u0D47\\u0D48\\u0D4A\\u0D4B\\u0D4C\\u0D57\\u0D82\\u0D83\\u0DCF\\u0DD0\\u0DD1\\u0DD8\\u0DD9\\u0DDA\\u0DDB\\u0DDC\\u0DDD\\u0DDE\\u0DDF\\u0DF2\\u0DF3\\u0F3E\\u0F3F\\u0F7F\\u102B\\u102C\\u1031\\u1038\\u103B\\u103C\\u1056\\u1057\\u1062\\u1063\\u1064\\u1067\\u1068\\u1069\\u106A\\u106B\\u106C\\u106D\\u1083\\u1084\\u1087\\u1088\\u1089\\u108A\\u108B\\u108C\\u108F\\u17B6\\u17BE\\u17BF\\u17C0\\u17C1\\u17C2\\u17C3\\u17C4\\u17C5\\u17C7\\u17C8\\u1923\\u1924\\u1925\\u1926\\u1929\\u192A\\u192B\\u1930\\u1931\\u1933\\u1934\\u1935\\u1936\\u1937\\u1938\\u19B0\\u19B1\\u19B2\\u19B3\\u19B4\\u19B5\\u19B6\\u19B7\\u19B8\\u19B9\\u19BA\\u19BB\\u19BC\\u19BD\\u19BE\\u19BF\\u19C0\\u19C8\\u19C9\\u1A19\\u1A1A\\u1A1B\\u1B04\\u1B35\\u1B3B\\u1B3D\\u1B3E\\u1B3F\\u1B40\\u1B41\\u1B43\\u1B44\\u1B82\\u1BA1\\u1BA6\\u1BA7\\u1BAA\\u1C24\\u1C25\\u1C26\\u1C27\\u1C28\\u1C29\\u1C2A\\u1C2B\\u1C34\\u1C35\\uA823\\uA824\\uA827\\uA880\\uA881\\uA8B4\\uA8B5\\uA8B6\\uA8B7\\uA8B8\\uA8B9\\uA8BA\\uA8BB\\uA8BC\\uA8BD\\uA8BE\\uA8BF\\uA8C0\\uA8C1\\uA8C2\\uA8C3\\uA952\\uA953\\uAA2F\\uAA30\\uAA33\\uAA34\\uAA4D]" }, | |
| peg$c86 = /^[\u0300\u0301\u0302\u0303\u0304\u0305\u0306\u0307\u0308\u0309\u030A\u030B\u030C\u030D\u030E\u030F\u0310\u0311\u0312\u0313\u0314\u0315\u0316\u0317\u0318\u0319\u031A\u031B\u031C\u031D\u031E\u031F\u0320\u0321\u0322\u0323\u0324\u0325\u0326\u0327\u0328\u0329\u032A\u032B\u032C\u032D\u032E\u032F\u0330\u0331\u0332\u0333\u0334\u0335\u0336\u0337\u0338\u0339\u033A\u033B\u033C\u033D\u033E\u033F\u0340\u0341\u0342\u0343\u0344\u0345\u0346\u0347\u0348\u0349\u034A\u034B\u034C\u034D\u034E\u034F\u0350\u0351\u0352\u0353\u0354\u0355\u0356\u0357\u0358\u0359\u035A\u035B\u035C\u035D\u035E\u035F\u0360\u0361\u0362\u0363\u0364\u0365\u0366\u0367\u0368\u0369\u036A\u036B\u036C\u036D\u036E\u036F\u0483\u0484\u0485\u0486\u0487\u0591\u0592\u0593\u0594\u0595\u0596\u0597\u0598\u0599\u059A\u059B\u059C\u059D\u059E\u059F\u05A0\u05A1\u05A2\u05A3\u05A4\u05A5\u05A6\u05A7\u05A8\u05A9\u05AA\u05AB\u05AC\u05AD\u05AE\u05AF\u05B0\u05B1\u05B2\u05B3\u05B4\u05B5\u05B6\u05B7\u05B8\u05B9\u05BA\u05BB\u05BC\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610\u0611\u0612\u0613\u0614\u0615\u0616\u0617\u0618\u0619\u061A\u064B\u064C\u064D\u064E\u064F\u0650\u0651\u0652\u0653\u0654\u0655\u0656\u0657\u0658\u0659\u065A\u065B\u065C\u065D\u065E\u0670\u06D6\u06D7\u06D8\u06D9\u06DA\u06DB\u06DC\u06DF\u06E0\u06E1\u06E2\u06E3\u06E4\u06E7\u06E8\u06EA\u06EB\u06EC\u06ED\u0711\u0730\u0731\u0732\u0733\u0734\u0735\u0736\u0737\u0738\u0739\u073A\u073B\u073C\u073D\u073E\u073F\u0740\u0741\u0742\u0743\u0744\u0745\u0746\u0747\u0748\u0749\u074A\u07A6\u07A7\u07A8\u07A9\u07AA\u07AB\u07AC\u07AD\u07AE\u07AF\u07B0\u07EB\u07EC\u07ED\u07EE\u07EF\u07F0\u07F1\u07F2\u07F3\u0901\u0902\u093C\u0941\u0942\u0943\u0944\u0945\u0946\u0947\u0948\u094D\u0951\u0952\u0953\u0954\u0962\u0963\u0981\u09BC\u09C1\u09C2\u09C3\u09C4\u09CD\u09E2\u09E3\u0A01\u0A02\u0A3C\u0A41\u0A42\u0A47\u0A48\u0A4B\u0A4C\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81\u0A82\u0ABC\u0AC1\u0AC2\u0AC3\u0AC4\u0AC5\u0AC7\u0AC8\u0ACD\u0AE2\u0AE3\u0B01\u0B3C\u0B3F\u0B41\u0B42\u0B43\u0B44\u0B4D\u0B56\u0B62\u0B63\u0B82\u0BC0\u0BCD\u0C3E\u0C3F\u0C40\u0C46\u0C47\u0C48\u0C4A\u0C4B\u0C4C\u0C4D\u0C55\u0C56\u0C62\u0C63\u0CBC\u0CBF\u0CC6\u0CCC\u0CCD\u0CE2\u0CE3\u0D41\u0D42\u0D43\u0D44\u0D4D\u0D62\u0D63\u0DCA\u0DD2\u0DD3\u0DD4\u0DD6\u0E31\u0E34\u0E35\u0E36\u0E37\u0E38\u0E39\u0E3A\u0E47\u0E48\u0E49\u0E4A\u0E4B\u0E4C\u0E4D\u0E4E\u0EB1\u0EB4\u0EB5\u0EB6\u0EB7\u0EB8\u0EB9\u0EBB\u0EBC\u0EC8\u0EC9\u0ECA\u0ECB\u0ECC\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F71\u0F72\u0F73\u0F74\u0F75\u0F76\u0F77\u0F78\u0F79\u0F7A\u0F7B\u0F7C\u0F7D\u0F7E\u0F80\u0F81\u0F82\u0F83\u0F84\u0F86\u0F87\u0F90\u0F91\u0F92\u0F93\u0F94\u0F95\u0F96\u0F97\u0F99\u0F9A\u0F9B\u0F9C\u0F9D\u0F9E\u0F9F\u0FA0\u0FA1\u0FA2\u0FA3\u0FA4\u0FA5\u0FA6\u0FA7\u0FA8\u0FA9\u0FAA\u0FAB\u0FAC\u0FAD\u0FAE\u0FAF\u0FB0\u0FB1\u0FB2\u0FB3\u0FB4\u0FB5\u0FB6\u0FB7\u0FB8\u0FB9\u0FBA\u0FBB\u0FBC\u0FC6\u102D\u102E\u102F\u1030\u1032\u1033\u1034\u1035\u1036\u1037\u1039\u103A\u103D\u103E\u1058\u1059\u105E\u105F\u1060\u1071\u1072\u1073\u1074\u1082\u1085\u1086\u108D\u135F\u1712\u1713\u1714\u1732\u1733\u1734\u1752\u1753\u1772\u1773\u17B7\u17B8\u17B9\u17BA\u17BB\u17BC\u17BD\u17C6\u17C9\u17CA\u17CB\u17CC\u17CD\u17CE\u17CF\u17D0\u17D1\u17D2\u17D3\u17DD\u180B\u180C\u180D\u18A9\u1920\u1921\u1922\u1927\u1928\u1932\u1939\u193A\u193B\u1A17\u1A18\u1B00\u1B01\u1B02\u1B03\u1B34\u1B36\u1B37\u1B38\u1B39\u1B3A\u1B3C\u1B42\u1B6B\u1B6C\u1B6D\u1B6E\u1B6F\u1B70\u1B71\u1B72\u1B73\u1B80\u1B81\u1BA2\u1BA3\u1BA4\u1BA5\u1BA8\u1BA9\u1C2C\u1C2D\u1C2E\u1C2F\u1C30\u1C31\u1C32\u1C33\u1C36\u1C37\u1DC0\u1DC1\u1DC2\u1DC3\u1DC4\u1DC5\u1DC6\u1DC7\u1DC8\u1DC9\u1DCA\u1DCB\u1DCC\u1DCD\u1DCE\u1DCF\u1DD0\u1DD1\u1DD2\u1DD3\u1DD4\u1DD5\u1DD6\u1DD7\u1DD8\u1DD9\u1DDA\u1DDB\u1DDC\u1DDD\u1DDE\u1DDF\u1DE0\u1DE1\u1DE2\u1DE3\u1DE4\u1DE5\u1DE6\u1DFE\u1DFF\u20D0\u20D1\u20D2\u20D3\u20D4\u20D5\u20D6\u20D7\u20D8\u20D9\u20DA\u20DB\u20DC\u20E1\u20E5\u20E6\u20E7\u20E8\u20E9\u20EA\u20EB\u20EC\u20ED\u20EE\u20EF\u20F0\u2DE0\u2DE1\u2DE2\u2DE3\u2DE4\u2DE5\u2DE6\u2DE7\u2DE8\u2DE9\u2DEA\u2DEB\u2DEC\u2DED\u2DEE\u2DEF\u2DF0\u2DF1\u2DF2\u2DF3\u2DF4\u2DF5\u2DF6\u2DF7\u2DF8\u2DF9\u2DFA\u2DFB\u2DFC\u2DFD\u2DFE\u2DFF\u302A\u302B\u302C\u302D\u302E\u302F\u3099\u309A\uA66F\uA67C\uA67D\uA802\uA806\uA80B\uA825\uA826\uA8C4\uA926\uA927\uA928\uA929\uA92A\uA92B\uA92C\uA92D\uA947\uA948\uA949\uA94A\uA94B\uA94C\uA94D\uA94E\uA94F\uA950\uA951\uAA29\uAA2A\uAA2B\uAA2C\uAA2D\uAA2E\uAA31\uAA32\uAA35\uAA36\uAA43\uAA4C\uFB1E\uFE00\uFE01\uFE02\uFE03\uFE04\uFE05\uFE06\uFE07\uFE08\uFE09\uFE0A\uFE0B\uFE0C\uFE0D\uFE0E\uFE0F\uFE20\uFE21\uFE22\uFE23\uFE24\uFE25\uFE26]/, | |
| peg$c87 = { type: "class", value: "[\\u0300\\u0301\\u0302\\u0303\\u0304\\u0305\\u0306\\u0307\\u0308\\u0309\\u030A\\u030B\\u030C\\u030D\\u030E\\u030F\\u0310\\u0311\\u0312\\u0313\\u0314\\u0315\\u0316\\u0317\\u0318\\u0319\\u031A\\u031B\\u031C\\u031D\\u031E\\u031F\\u0320\\u0321\\u0322\\u0323\\u0324\\u0325\\u0326\\u0327\\u0328\\u0329\\u032A\\u032B\\u032C\\u032D\\u032E\\u032F\\u0330\\u0331\\u0332\\u0333\\u0334\\u0335\\u0336\\u0337\\u0338\\u0339\\u033A\\u033B\\u033C\\u033D\\u033E\\u033F\\u0340\\u0341\\u0342\\u0343\\u0344\\u0345\\u0346\\u0347\\u0348\\u0349\\u034A\\u034B\\u034C\\u034D\\u034E\\u034F\\u0350\\u0351\\u0352\\u0353\\u0354\\u0355\\u0356\\u0357\\u0358\\u0359\\u035A\\u035B\\u035C\\u035D\\u035E\\u035F\\u0360\\u0361\\u0362\\u0363\\u0364\\u0365\\u0366\\u0367\\u0368\\u0369\\u036A\\u036B\\u036C\\u036D\\u036E\\u036F\\u0483\\u0484\\u0485\\u0486\\u0487\\u0591\\u0592\\u0593\\u0594\\u0595\\u0596\\u0597\\u0598\\u0599\\u059A\\u059B\\u059C\\u059D\\u059E\\u059F\\u05A0\\u05A1\\u05A2\\u05A3\\u05A4\\u05A5\\u05A6\\u05A7\\u05A8\\u05A9\\u05AA\\u05AB\\u05AC\\u05AD\\u05AE\\u05AF\\u05B0\\u05B1\\u05B2\\u05B3\\u05B4\\u05B5\\u05B6\\u05B7\\u05B8\\u05B9\\u05BA\\u05BB\\u05BC\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610\\u0611\\u0612\\u0613\\u0614\\u0615\\u0616\\u0617\\u0618\\u0619\\u061A\\u064B\\u064C\\u064D\\u064E\\u064F\\u0650\\u0651\\u0652\\u0653\\u0654\\u0655\\u0656\\u0657\\u0658\\u0659\\u065A\\u065B\\u065C\\u065D\\u065E\\u0670\\u06D6\\u06D7\\u06D8\\u06D9\\u06DA\\u06DB\\u06DC\\u06DF\\u06E0\\u06E1\\u06E2\\u06E3\\u06E4\\u06E7\\u06E8\\u06EA\\u06EB\\u06EC\\u06ED\\u0711\\u0730\\u0731\\u0732\\u0733\\u0734\\u0735\\u0736\\u0737\\u0738\\u0739\\u073A\\u073B\\u073C\\u073D\\u073E\\u073F\\u0740\\u0741\\u0742\\u0743\\u0744\\u0745\\u0746\\u0747\\u0748\\u0749\\u074A\\u07A6\\u07A7\\u07A8\\u07A9\\u07AA\\u07AB\\u07AC\\u07AD\\u07AE\\u07AF\\u07B0\\u07EB\\u07EC\\u07ED\\u07EE\\u07EF\\u07F0\\u07F1\\u07F2\\u07F3\\u0901\\u0902\\u093C\\u0941\\u0942\\u0943\\u0944\\u0945\\u0946\\u0947\\u0948\\u094D\\u0951\\u0952\\u0953\\u0954\\u0962\\u0963\\u0981\\u09BC\\u09C1\\u09C2\\u09C3\\u09C4\\u09CD\\u09E2\\u09E3\\u0A01\\u0A02\\u0A3C\\u0A41\\u0A42\\u0A47\\u0A48\\u0A4B\\u0A4C\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81\\u0A82\\u0ABC\\u0AC1\\u0AC2\\u0AC3\\u0AC4\\u0AC5\\u0AC7\\u0AC8\\u0ACD\\u0AE2\\u0AE3\\u0B01\\u0B3C\\u0B3F\\u0B41\\u0B42\\u0B43\\u0B44\\u0B4D\\u0B56\\u0B62\\u0B63\\u0B82\\u0BC0\\u0BCD\\u0C3E\\u0C3F\\u0C40\\u0C46\\u0C47\\u0C48\\u0C4A\\u0C4B\\u0C4C\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0CBC\\u0CBF\\u0CC6\\u0CCC\\u0CCD\\u0CE2\\u0CE3\\u0D41\\u0D42\\u0D43\\u0D44\\u0D4D\\u0D62\\u0D63\\u0DCA\\u0DD2\\u0DD3\\u0DD4\\u0DD6\\u0E31\\u0E34\\u0E35\\u0E36\\u0E37\\u0E38\\u0E39\\u0E3A\\u0E47\\u0E48\\u0E49\\u0E4A\\u0E4B\\u0E4C\\u0E4D\\u0E4E\\u0EB1\\u0EB4\\u0EB5\\u0EB6\\u0EB7\\u0EB8\\u0EB9\\u0EBB\\u0EBC\\u0EC8\\u0EC9\\u0ECA\\u0ECB\\u0ECC\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F71\\u0F72\\u0F73\\u0F74\\u0F75\\u0F76\\u0F77\\u0F78\\u0F79\\u0F7A\\u0F7B\\u0F7C\\u0F7D\\u0F7E\\u0F80\\u0F81\\u0F82\\u0F83\\u0F84\\u0F86\\u0F87\\u0F90\\u0F91\\u0F92\\u0F93\\u0F94\\u0F95\\u0F96\\u0F97\\u0F99\\u0F9A\\u0F9B\\u0F9C\\u0F9D\\u0F9E\\u0F9F\\u0FA0\\u0FA1\\u0FA2\\u0FA3\\u0FA4\\u0FA5\\u0FA6\\u0FA7\\u0FA8\\u0FA9\\u0FAA\\u0FAB\\u0FAC\\u0FAD\\u0FAE\\u0FAF\\u0FB0\\u0FB1\\u0FB2\\u0FB3\\u0FB4\\u0FB5\\u0FB6\\u0FB7\\u0FB8\\u0FB9\\u0FBA\\u0FBB\\u0FBC\\u0FC6\\u102D\\u102E\\u102F\\u1030\\u1032\\u1033\\u1034\\u1035\\u1036\\u1037\\u1039\\u103A\\u103D\\u103E\\u1058\\u1059\\u105E\\u105F\\u1060\\u1071\\u1072\\u1073\\u1074\\u1082\\u1085\\u1086\\u108D\\u135F\\u1712\\u1713\\u1714\\u1732\\u1733\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B7\\u17B8\\u17B9\\u17BA\\u17BB\\u17BC\\u17BD\\u17C6\\u17C9\\u17CA\\u17CB\\u17CC\\u17CD\\u17CE\\u17CF\\u17D0\\u17D1\\u17D2\\u17D3\\u17DD\\u180B\\u180C\\u180D\\u18A9\\u1920\\u1921\\u1922\\u1927\\u1928\\u1932\\u1939\\u193A\\u193B\\u1A17\\u1A18\\u1B00\\u1B01\\u1B02\\u1B03\\u1B34\\u1B36\\u1B37\\u1B38\\u1B39\\u1B3A\\u1B3C\\u1B42\\u1B6B\\u1B6C\\u1B6D\\u1B6E\\u1B6F\\u1B70\\u1B71\\u1B72\\u1B73\\u1B80\\u1B81\\u1BA2\\u1BA3\\u1BA4\\u1BA5\\u1BA8\\u1BA9\\u1C2C\\u1C2D\\u1C2E\\u1C2F\\u1C30\\u1C31\\u1C32\\u1C33\\u1C36\\u1C37\\u1DC0\\u1DC1\\u1DC2\\u1DC3\\u1DC4\\u1DC5\\u1DC6\\u1DC7\\u1DC8\\u1DC9\\u1DCA\\u1DCB\\u1DCC\\u1DCD\\u1DCE\\u1DCF\\u1DD0\\u1DD1\\u1DD2\\u1DD3\\u1DD4\\u1DD5\\u1DD6\\u1DD7\\u1DD8\\u1DD9\\u1DDA\\u1DDB\\u1DDC\\u1DDD\\u1DDE\\u1DDF\\u1DE0\\u1DE1\\u1DE2\\u1DE3\\u1DE4\\u1DE5\\u1DE6\\u1DFE\\u1DFF\\u20D0\\u20D1\\u20D2\\u20D3\\u20D4\\u20D5\\u20D6\\u20D7\\u20D8\\u20D9\\u20DA\\u20DB\\u20DC\\u20E1\\u20E5\\u20E6\\u20E7\\u20E8\\u20E9\\u20EA\\u20EB\\u20EC\\u20ED\\u20EE\\u20EF\\u20F0\\u2DE0\\u2DE1\\u2DE2\\u2DE3\\u2DE4\\u2DE5\\u2DE6\\u2DE7\\u2DE8\\u2DE9\\u2DEA\\u2DEB\\u2DEC\\u2DED\\u2DEE\\u2DEF\\u2DF0\\u2DF1\\u2DF2\\u2DF3\\u2DF4\\u2DF5\\u2DF6\\u2DF7\\u2DF8\\u2DF9\\u2DFA\\u2DFB\\u2DFC\\u2DFD\\u2DFE\\u2DFF\\u302A\\u302B\\u302C\\u302D\\u302E\\u302F\\u3099\\u309A\\uA66F\\uA67C\\uA67D\\uA802\\uA806\\uA80B\\uA825\\uA826\\uA8C4\\uA926\\uA927\\uA928\\uA929\\uA92A\\uA92B\\uA92C\\uA92D\\uA947\\uA948\\uA949\\uA94A\\uA94B\\uA94C\\uA94D\\uA94E\\uA94F\\uA950\\uA951\\uAA29\\uAA2A\\uAA2B\\uAA2C\\uAA2D\\uAA2E\\uAA31\\uAA32\\uAA35\\uAA36\\uAA43\\uAA4C\\uFB1E\\uFE00\\uFE01\\uFE02\\uFE03\\uFE04\\uFE05\\uFE06\\uFE07\\uFE08\\uFE09\\uFE0A\\uFE0B\\uFE0C\\uFE0D\\uFE0E\\uFE0F\\uFE20\\uFE21\\uFE22\\uFE23\\uFE24\\uFE25\\uFE26]", description: "[\\u0300\\u0301\\u0302\\u0303\\u0304\\u0305\\u0306\\u0307\\u0308\\u0309\\u030A\\u030B\\u030C\\u030D\\u030E\\u030F\\u0310\\u0311\\u0312\\u0313\\u0314\\u0315\\u0316\\u0317\\u0318\\u0319\\u031A\\u031B\\u031C\\u031D\\u031E\\u031F\\u0320\\u0321\\u0322\\u0323\\u0324\\u0325\\u0326\\u0327\\u0328\\u0329\\u032A\\u032B\\u032C\\u032D\\u032E\\u032F\\u0330\\u0331\\u0332\\u0333\\u0334\\u0335\\u0336\\u0337\\u0338\\u0339\\u033A\\u033B\\u033C\\u033D\\u033E\\u033F\\u0340\\u0341\\u0342\\u0343\\u0344\\u0345\\u0346\\u0347\\u0348\\u0349\\u034A\\u034B\\u034C\\u034D\\u034E\\u034F\\u0350\\u0351\\u0352\\u0353\\u0354\\u0355\\u0356\\u0357\\u0358\\u0359\\u035A\\u035B\\u035C\\u035D\\u035E\\u035F\\u0360\\u0361\\u0362\\u0363\\u0364\\u0365\\u0366\\u0367\\u0368\\u0369\\u036A\\u036B\\u036C\\u036D\\u036E\\u036F\\u0483\\u0484\\u0485\\u0486\\u0487\\u0591\\u0592\\u0593\\u0594\\u0595\\u0596\\u0597\\u0598\\u0599\\u059A\\u059B\\u059C\\u059D\\u059E\\u059F\\u05A0\\u05A1\\u05A2\\u05A3\\u05A4\\u05A5\\u05A6\\u05A7\\u05A8\\u05A9\\u05AA\\u05AB\\u05AC\\u05AD\\u05AE\\u05AF\\u05B0\\u05B1\\u05B2\\u05B3\\u05B4\\u05B5\\u05B6\\u05B7\\u05B8\\u05B9\\u05BA\\u05BB\\u05BC\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610\\u0611\\u0612\\u0613\\u0614\\u0615\\u0616\\u0617\\u0618\\u0619\\u061A\\u064B\\u064C\\u064D\\u064E\\u064F\\u0650\\u0651\\u0652\\u0653\\u0654\\u0655\\u0656\\u0657\\u0658\\u0659\\u065A\\u065B\\u065C\\u065D\\u065E\\u0670\\u06D6\\u06D7\\u06D8\\u06D9\\u06DA\\u06DB\\u06DC\\u06DF\\u06E0\\u06E1\\u06E2\\u06E3\\u06E4\\u06E7\\u06E8\\u06EA\\u06EB\\u06EC\\u06ED\\u0711\\u0730\\u0731\\u0732\\u0733\\u0734\\u0735\\u0736\\u0737\\u0738\\u0739\\u073A\\u073B\\u073C\\u073D\\u073E\\u073F\\u0740\\u0741\\u0742\\u0743\\u0744\\u0745\\u0746\\u0747\\u0748\\u0749\\u074A\\u07A6\\u07A7\\u07A8\\u07A9\\u07AA\\u07AB\\u07AC\\u07AD\\u07AE\\u07AF\\u07B0\\u07EB\\u07EC\\u07ED\\u07EE\\u07EF\\u07F0\\u07F1\\u07F2\\u07F3\\u0901\\u0902\\u093C\\u0941\\u0942\\u0943\\u0944\\u0945\\u0946\\u0947\\u0948\\u094D\\u0951\\u0952\\u0953\\u0954\\u0962\\u0963\\u0981\\u09BC\\u09C1\\u09C2\\u09C3\\u09C4\\u09CD\\u09E2\\u09E3\\u0A01\\u0A02\\u0A3C\\u0A41\\u0A42\\u0A47\\u0A48\\u0A4B\\u0A4C\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81\\u0A82\\u0ABC\\u0AC1\\u0AC2\\u0AC3\\u0AC4\\u0AC5\\u0AC7\\u0AC8\\u0ACD\\u0AE2\\u0AE3\\u0B01\\u0B3C\\u0B3F\\u0B41\\u0B42\\u0B43\\u0B44\\u0B4D\\u0B56\\u0B62\\u0B63\\u0B82\\u0BC0\\u0BCD\\u0C3E\\u0C3F\\u0C40\\u0C46\\u0C47\\u0C48\\u0C4A\\u0C4B\\u0C4C\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0CBC\\u0CBF\\u0CC6\\u0CCC\\u0CCD\\u0CE2\\u0CE3\\u0D41\\u0D42\\u0D43\\u0D44\\u0D4D\\u0D62\\u0D63\\u0DCA\\u0DD2\\u0DD3\\u0DD4\\u0DD6\\u0E31\\u0E34\\u0E35\\u0E36\\u0E37\\u0E38\\u0E39\\u0E3A\\u0E47\\u0E48\\u0E49\\u0E4A\\u0E4B\\u0E4C\\u0E4D\\u0E4E\\u0EB1\\u0EB4\\u0EB5\\u0EB6\\u0EB7\\u0EB8\\u0EB9\\u0EBB\\u0EBC\\u0EC8\\u0EC9\\u0ECA\\u0ECB\\u0ECC\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F71\\u0F72\\u0F73\\u0F74\\u0F75\\u0F76\\u0F77\\u0F78\\u0F79\\u0F7A\\u0F7B\\u0F7C\\u0F7D\\u0F7E\\u0F80\\u0F81\\u0F82\\u0F83\\u0F84\\u0F86\\u0F87\\u0F90\\u0F91\\u0F92\\u0F93\\u0F94\\u0F95\\u0F96\\u0F97\\u0F99\\u0F9A\\u0F9B\\u0F9C\\u0F9D\\u0F9E\\u0F9F\\u0FA0\\u0FA1\\u0FA2\\u0FA3\\u0FA4\\u0FA5\\u0FA6\\u0FA7\\u0FA8\\u0FA9\\u0FAA\\u0FAB\\u0FAC\\u0FAD\\u0FAE\\u0FAF\\u0FB0\\u0FB1\\u0FB2\\u0FB3\\u0FB4\\u0FB5\\u0FB6\\u0FB7\\u0FB8\\u0FB9\\u0FBA\\u0FBB\\u0FBC\\u0FC6\\u102D\\u102E\\u102F\\u1030\\u1032\\u1033\\u1034\\u1035\\u1036\\u1037\\u1039\\u103A\\u103D\\u103E\\u1058\\u1059\\u105E\\u105F\\u1060\\u1071\\u1072\\u1073\\u1074\\u1082\\u1085\\u1086\\u108D\\u135F\\u1712\\u1713\\u1714\\u1732\\u1733\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B7\\u17B8\\u17B9\\u17BA\\u17BB\\u17BC\\u17BD\\u17C6\\u17C9\\u17CA\\u17CB\\u17CC\\u17CD\\u17CE\\u17CF\\u17D0\\u17D1\\u17D2\\u17D3\\u17DD\\u180B\\u180C\\u180D\\u18A9\\u1920\\u1921\\u1922\\u1927\\u1928\\u1932\\u1939\\u193A\\u193B\\u1A17\\u1A18\\u1B00\\u1B01\\u1B02\\u1B03\\u1B34\\u1B36\\u1B37\\u1B38\\u1B39\\u1B3A\\u1B3C\\u1B42\\u1B6B\\u1B6C\\u1B6D\\u1B6E\\u1B6F\\u1B70\\u1B71\\u1B72\\u1B73\\u1B80\\u1B81\\u1BA2\\u1BA3\\u1BA4\\u1BA5\\u1BA8\\u1BA9\\u1C2C\\u1C2D\\u1C2E\\u1C2F\\u1C30\\u1C31\\u1C32\\u1C33\\u1C36\\u1C37\\u1DC0\\u1DC1\\u1DC2\\u1DC3\\u1DC4\\u1DC5\\u1DC6\\u1DC7\\u1DC8\\u1DC9\\u1DCA\\u1DCB\\u1DCC\\u1DCD\\u1DCE\\u1DCF\\u1DD0\\u1DD1\\u1DD2\\u1DD3\\u1DD4\\u1DD5\\u1DD6\\u1DD7\\u1DD8\\u1DD9\\u1DDA\\u1DDB\\u1DDC\\u1DDD\\u1DDE\\u1DDF\\u1DE0\\u1DE1\\u1DE2\\u1DE3\\u1DE4\\u1DE5\\u1DE6\\u1DFE\\u1DFF\\u20D0\\u20D1\\u20D2\\u20D3\\u20D4\\u20D5\\u20D6\\u20D7\\u20D8\\u20D9\\u20DA\\u20DB\\u20DC\\u20E1\\u20E5\\u20E6\\u20E7\\u20E8\\u20E9\\u20EA\\u20EB\\u20EC\\u20ED\\u20EE\\u20EF\\u20F0\\u2DE0\\u2DE1\\u2DE2\\u2DE3\\u2DE4\\u2DE5\\u2DE6\\u2DE7\\u2DE8\\u2DE9\\u2DEA\\u2DEB\\u2DEC\\u2DED\\u2DEE\\u2DEF\\u2DF0\\u2DF1\\u2DF2\\u2DF3\\u2DF4\\u2DF5\\u2DF6\\u2DF7\\u2DF8\\u2DF9\\u2DFA\\u2DFB\\u2DFC\\u2DFD\\u2DFE\\u2DFF\\u302A\\u302B\\u302C\\u302D\\u302E\\u302F\\u3099\\u309A\\uA66F\\uA67C\\uA67D\\uA802\\uA806\\uA80B\\uA825\\uA826\\uA8C4\\uA926\\uA927\\uA928\\uA929\\uA92A\\uA92B\\uA92C\\uA92D\\uA947\\uA948\\uA949\\uA94A\\uA94B\\uA94C\\uA94D\\uA94E\\uA94F\\uA950\\uA951\\uAA29\\uAA2A\\uAA2B\\uAA2C\\uAA2D\\uAA2E\\uAA31\\uAA32\\uAA35\\uAA36\\uAA43\\uAA4C\\uFB1E\\uFE00\\uFE01\\uFE02\\uFE03\\uFE04\\uFE05\\uFE06\\uFE07\\uFE08\\uFE09\\uFE0A\\uFE0B\\uFE0C\\uFE0D\\uFE0E\\uFE0F\\uFE20\\uFE21\\uFE22\\uFE23\\uFE24\\uFE25\\uFE26]" }, | |
| peg$c88 = /^[0123456789\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u06F0\u06F1\u06F2\u06F3\u06F4\u06F5\u06F6\u06F7\u06F8\u06F9\u07C0\u07C1\u07C2\u07C3\u07C4\u07C5\u07C6\u07C7\u07C8\u07C9\u0966\u0967\u0968\u0969\u096A\u096B\u096C\u096D\u096E\u096F\u09E6\u09E7\u09E8\u09E9\u09EA\u09EB\u09EC\u09ED\u09EE\u09EF\u0A66\u0A67\u0A68\u0A69\u0A6A\u0A6B\u0A6C\u0A6D\u0A6E\u0A6F\u0AE6\u0AE7\u0AE8\u0AE9\u0AEA\u0AEB\u0AEC\u0AED\u0AEE\u0AEF\u0B66\u0B67\u0B68\u0B69\u0B6A\u0B6B\u0B6C\u0B6D\u0B6E\u0B6F\u0BE6\u0BE7\u0BE8\u0BE9\u0BEA\u0BEB\u0BEC\u0BED\u0BEE\u0BEF\u0C66\u0C67\u0C68\u0C69\u0C6A\u0C6B\u0C6C\u0C6D\u0C6E\u0C6F\u0CE6\u0CE7\u0CE8\u0CE9\u0CEA\u0CEB\u0CEC\u0CED\u0CEE\u0CEF\u0D66\u0D67\u0D68\u0D69\u0D6A\u0D6B\u0D6C\u0D6D\u0D6E\u0D6F\u0E50\u0E51\u0E52\u0E53\u0E54\u0E55\u0E56\u0E57\u0E58\u0E59\u0ED0\u0ED1\u0ED2\u0ED3\u0ED4\u0ED5\u0ED6\u0ED7\u0ED8\u0ED9\u0F20\u0F21\u0F22\u0F23\u0F24\u0F25\u0F26\u0F27\u0F28\u0F29\u1040\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u1049\u1090\u1091\u1092\u1093\u1094\u1095\u1096\u1097\u1098\u1099\u17E0\u17E1\u17E2\u17E3\u17E4\u17E5\u17E6\u17E7\u17E8\u17E9\u1810\u1811\u1812\u1813\u1814\u1815\u1816\u1817\u1818\u1819\u1946\u1947\u1948\u1949\u194A\u194B\u194C\u194D\u194E\u194F\u19D0\u19D1\u19D2\u19D3\u19D4\u19D5\u19D6\u19D7\u19D8\u19D9\u1B50\u1B51\u1B52\u1B53\u1B54\u1B55\u1B56\u1B57\u1B58\u1B59\u1BB0\u1BB1\u1BB2\u1BB3\u1BB4\u1BB5\u1BB6\u1BB7\u1BB8\u1BB9\u1C40\u1C41\u1C42\u1C43\u1C44\u1C45\u1C46\u1C47\u1C48\u1C49\u1C50\u1C51\u1C52\u1C53\u1C54\u1C55\u1C56\u1C57\u1C58\u1C59\uA620\uA621\uA622\uA623\uA624\uA625\uA626\uA627\uA628\uA629\uA8D0\uA8D1\uA8D2\uA8D3\uA8D4\uA8D5\uA8D6\uA8D7\uA8D8\uA8D9\uA900\uA901\uA902\uA903\uA904\uA905\uA906\uA907\uA908\uA909\uAA50\uAA51\uAA52\uAA53\uAA54\uAA55\uAA56\uAA57\uAA58\uAA59\uFF10\uFF11\uFF12\uFF13\uFF14\uFF15\uFF16\uFF17\uFF18\uFF19]/, | |
| peg$c89 = { type: "class", value: "[0123456789\\u0660\\u0661\\u0662\\u0663\\u0664\\u0665\\u0666\\u0667\\u0668\\u0669\\u06F0\\u06F1\\u06F2\\u06F3\\u06F4\\u06F5\\u06F6\\u06F7\\u06F8\\u06F9\\u07C0\\u07C1\\u07C2\\u07C3\\u07C4\\u07C5\\u07C6\\u07C7\\u07C8\\u07C9\\u0966\\u0967\\u0968\\u0969\\u096A\\u096B\\u096C\\u096D\\u096E\\u096F\\u09E6\\u09E7\\u09E8\\u09E9\\u09EA\\u09EB\\u09EC\\u09ED\\u09EE\\u09EF\\u0A66\\u0A67\\u0A68\\u0A69\\u0A6A\\u0A6B\\u0A6C\\u0A6D\\u0A6E\\u0A6F\\u0AE6\\u0AE7\\u0AE8\\u0AE9\\u0AEA\\u0AEB\\u0AEC\\u0AED\\u0AEE\\u0AEF\\u0B66\\u0B67\\u0B68\\u0B69\\u0B6A\\u0B6B\\u0B6C\\u0B6D\\u0B6E\\u0B6F\\u0BE6\\u0BE7\\u0BE8\\u0BE9\\u0BEA\\u0BEB\\u0BEC\\u0BED\\u0BEE\\u0BEF\\u0C66\\u0C67\\u0C68\\u0C69\\u0C6A\\u0C6B\\u0C6C\\u0C6D\\u0C6E\\u0C6F\\u0CE6\\u0CE7\\u0CE8\\u0CE9\\u0CEA\\u0CEB\\u0CEC\\u0CED\\u0CEE\\u0CEF\\u0D66\\u0D67\\u0D68\\u0D69\\u0D6A\\u0D6B\\u0D6C\\u0D6D\\u0D6E\\u0D6F\\u0E50\\u0E51\\u0E52\\u0E53\\u0E54\\u0E55\\u0E56\\u0E57\\u0E58\\u0E59\\u0ED0\\u0ED1\\u0ED2\\u0ED3\\u0ED4\\u0ED5\\u0ED6\\u0ED7\\u0ED8\\u0ED9\\u0F20\\u0F21\\u0F22\\u0F23\\u0F24\\u0F25\\u0F26\\u0F27\\u0F28\\u0F29\\u1040\\u1041\\u1042\\u1043\\u1044\\u1045\\u1046\\u1047\\u1048\\u1049\\u1090\\u1091\\u1092\\u1093\\u1094\\u1095\\u1096\\u1097\\u1098\\u1099\\u17E0\\u17E1\\u17E2\\u17E3\\u17E4\\u17E5\\u17E6\\u17E7\\u17E8\\u17E9\\u1810\\u1811\\u1812\\u1813\\u1814\\u1815\\u1816\\u1817\\u1818\\u1819\\u1946\\u1947\\u1948\\u1949\\u194A\\u194B\\u194C\\u194D\\u194E\\u194F\\u19D0\\u19D1\\u19D2\\u19D3\\u19D4\\u19D5\\u19D6\\u19D7\\u19D8\\u19D9\\u1B50\\u1B51\\u1B52\\u1B53\\u1B54\\u1B55\\u1B56\\u1B57\\u1B58\\u1B59\\u1BB0\\u1BB1\\u1BB2\\u1BB3\\u1BB4\\u1BB5\\u1BB6\\u1BB7\\u1BB8\\u1BB9\\u1C40\\u1C41\\u1C42\\u1C43\\u1C44\\u1C45\\u1C46\\u1C47\\u1C48\\u1C49\\u1C50\\u1C51\\u1C52\\u1C53\\u1C54\\u1C55\\u1C56\\u1C57\\u1C58\\u1C59\\uA620\\uA621\\uA622\\uA623\\uA624\\uA625\\uA626\\uA627\\uA628\\uA629\\uA8D0\\uA8D1\\uA8D2\\uA8D3\\uA8D4\\uA8D5\\uA8D6\\uA8D7\\uA8D8\\uA8D9\\uA900\\uA901\\uA902\\uA903\\uA904\\uA905\\uA906\\uA907\\uA908\\uA909\\uAA50\\uAA51\\uAA52\\uAA53\\uAA54\\uAA55\\uAA56\\uAA57\\uAA58\\uAA59\\uFF10\\uFF11\\uFF12\\uFF13\\uFF14\\uFF15\\uFF16\\uFF17\\uFF18\\uFF19]", description: "[0123456789\\u0660\\u0661\\u0662\\u0663\\u0664\\u0665\\u0666\\u0667\\u0668\\u0669\\u06F0\\u06F1\\u06F2\\u06F3\\u06F4\\u06F5\\u06F6\\u06F7\\u06F8\\u06F9\\u07C0\\u07C1\\u07C2\\u07C3\\u07C4\\u07C5\\u07C6\\u07C7\\u07C8\\u07C9\\u0966\\u0967\\u0968\\u0969\\u096A\\u096B\\u096C\\u096D\\u096E\\u096F\\u09E6\\u09E7\\u09E8\\u09E9\\u09EA\\u09EB\\u09EC\\u09ED\\u09EE\\u09EF\\u0A66\\u0A67\\u0A68\\u0A69\\u0A6A\\u0A6B\\u0A6C\\u0A6D\\u0A6E\\u0A6F\\u0AE6\\u0AE7\\u0AE8\\u0AE9\\u0AEA\\u0AEB\\u0AEC\\u0AED\\u0AEE\\u0AEF\\u0B66\\u0B67\\u0B68\\u0B69\\u0B6A\\u0B6B\\u0B6C\\u0B6D\\u0B6E\\u0B6F\\u0BE6\\u0BE7\\u0BE8\\u0BE9\\u0BEA\\u0BEB\\u0BEC\\u0BED\\u0BEE\\u0BEF\\u0C66\\u0C67\\u0C68\\u0C69\\u0C6A\\u0C6B\\u0C6C\\u0C6D\\u0C6E\\u0C6F\\u0CE6\\u0CE7\\u0CE8\\u0CE9\\u0CEA\\u0CEB\\u0CEC\\u0CED\\u0CEE\\u0CEF\\u0D66\\u0D67\\u0D68\\u0D69\\u0D6A\\u0D6B\\u0D6C\\u0D6D\\u0D6E\\u0D6F\\u0E50\\u0E51\\u0E52\\u0E53\\u0E54\\u0E55\\u0E56\\u0E57\\u0E58\\u0E59\\u0ED0\\u0ED1\\u0ED2\\u0ED3\\u0ED4\\u0ED5\\u0ED6\\u0ED7\\u0ED8\\u0ED9\\u0F20\\u0F21\\u0F22\\u0F23\\u0F24\\u0F25\\u0F26\\u0F27\\u0F28\\u0F29\\u1040\\u1041\\u1042\\u1043\\u1044\\u1045\\u1046\\u1047\\u1048\\u1049\\u1090\\u1091\\u1092\\u1093\\u1094\\u1095\\u1096\\u1097\\u1098\\u1099\\u17E0\\u17E1\\u17E2\\u17E3\\u17E4\\u17E5\\u17E6\\u17E7\\u17E8\\u17E9\\u1810\\u1811\\u1812\\u1813\\u1814\\u1815\\u1816\\u1817\\u1818\\u1819\\u1946\\u1947\\u1948\\u1949\\u194A\\u194B\\u194C\\u194D\\u194E\\u194F\\u19D0\\u19D1\\u19D2\\u19D3\\u19D4\\u19D5\\u19D6\\u19D7\\u19D8\\u19D9\\u1B50\\u1B51\\u1B52\\u1B53\\u1B54\\u1B55\\u1B56\\u1B57\\u1B58\\u1B59\\u1BB0\\u1BB1\\u1BB2\\u1BB3\\u1BB4\\u1BB5\\u1BB6\\u1BB7\\u1BB8\\u1BB9\\u1C40\\u1C41\\u1C42\\u1C43\\u1C44\\u1C45\\u1C46\\u1C47\\u1C48\\u1C49\\u1C50\\u1C51\\u1C52\\u1C53\\u1C54\\u1C55\\u1C56\\u1C57\\u1C58\\u1C59\\uA620\\uA621\\uA622\\uA623\\uA624\\uA625\\uA626\\uA627\\uA628\\uA629\\uA8D0\\uA8D1\\uA8D2\\uA8D3\\uA8D4\\uA8D5\\uA8D6\\uA8D7\\uA8D8\\uA8D9\\uA900\\uA901\\uA902\\uA903\\uA904\\uA905\\uA906\\uA907\\uA908\\uA909\\uAA50\\uAA51\\uAA52\\uAA53\\uAA54\\uAA55\\uAA56\\uAA57\\uAA58\\uAA59\\uFF10\\uFF11\\uFF12\\uFF13\\uFF14\\uFF15\\uFF16\\uFF17\\uFF18\\uFF19]" }, | |
| peg$c90 = /^[\u16EE\u16EF\u16F0\u2160\u2161\u2162\u2163\u2164\u2165\u2166\u2167\u2168\u2169\u216A\u216B\u216C\u216D\u216E\u216F\u2170\u2171\u2172\u2173\u2174\u2175\u2176\u2177\u2178\u2179\u217A\u217B\u217C\u217D\u217E\u217F\u2180\u2181\u2182\u2185\u2186\u2187\u2188\u3007\u3021\u3022\u3023\u3024\u3025\u3026\u3027\u3028\u3029\u3038\u3039\u303A]/, | |
| peg$c91 = { type: "class", value: "[\\u16EE\\u16EF\\u16F0\\u2160\\u2161\\u2162\\u2163\\u2164\\u2165\\u2166\\u2167\\u2168\\u2169\\u216A\\u216B\\u216C\\u216D\\u216E\\u216F\\u2170\\u2171\\u2172\\u2173\\u2174\\u2175\\u2176\\u2177\\u2178\\u2179\\u217A\\u217B\\u217C\\u217D\\u217E\\u217F\\u2180\\u2181\\u2182\\u2185\\u2186\\u2187\\u2188\\u3007\\u3021\\u3022\\u3023\\u3024\\u3025\\u3026\\u3027\\u3028\\u3029\\u3038\\u3039\\u303A]", description: "[\\u16EE\\u16EF\\u16F0\\u2160\\u2161\\u2162\\u2163\\u2164\\u2165\\u2166\\u2167\\u2168\\u2169\\u216A\\u216B\\u216C\\u216D\\u216E\\u216F\\u2170\\u2171\\u2172\\u2173\\u2174\\u2175\\u2176\\u2177\\u2178\\u2179\\u217A\\u217B\\u217C\\u217D\\u217E\\u217F\\u2180\\u2181\\u2182\\u2185\\u2186\\u2187\\u2188\\u3007\\u3021\\u3022\\u3023\\u3024\\u3025\\u3026\\u3027\\u3028\\u3029\\u3038\\u3039\\u303A]" }, | |
| peg$c92 = /^[_\u203F\u2040\u2054\uFE33\uFE34\uFE4D\uFE4E\uFE4F\uFF3F]/, | |
| peg$c93 = { type: "class", value: "[_\\u203F\\u2040\\u2054\\uFE33\\uFE34\\uFE4D\\uFE4E\\uFE4F\\uFF3F]", description: "[_\\u203F\\u2040\\u2054\\uFE33\\uFE34\\uFE4D\\uFE4E\\uFE4F\\uFF3F]" }, | |
| peg$c94 = /^[ \xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000]/, | |
| peg$c95 = { type: "class", value: "[ \\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000]", description: "[ \\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000]" }, | |
| peg$c96 = function(name) { return ['#', name]; }, | |
| peg$c97 = "(", | |
| peg$c98 = { type: "literal", value: "(", description: "\"(\"" }, | |
| peg$c99 = ")", | |
| peg$c100 = { type: "literal", value: ")", description: "\")\"" }, | |
| peg$c101 = function(name, args) { | |
| var result = [name].concat(args.shift()); | |
| while (args.length > 0) { | |
| result = [result].concat(args.shift()); | |
| } | |
| return result; | |
| }, | |
| peg$c102 = function(args) { | |
| return args !== null ? args : []; | |
| }, | |
| peg$c103 = ",", | |
| peg$c104 = { type: "literal", value: ",", description: "\",\"" }, | |
| peg$c105 = function(head, tail) { | |
| var result = [head]; | |
| for (var i = 0; i < tail.length; i++) { | |
| result.push(tail[i][3]); | |
| } | |
| return result; | |
| }, | |
| peg$c106 = function(operator, expression) { | |
| return [operator, expression]; | |
| }, | |
| peg$c107 = "+", | |
| peg$c108 = { type: "literal", value: "+", description: "\"+\"" }, | |
| peg$c109 = "-", | |
| peg$c110 = { type: "literal", value: "-", description: "\"-\"" }, | |
| peg$c111 = "!", | |
| peg$c112 = { type: "literal", value: "!", description: "\"!\"" }, | |
| peg$c113 = function(head, tail) { | |
| var result = head; | |
| for (var i = 0; i < tail.length; i++) { | |
| result = [tail[i][1], result, tail[i][3]]; | |
| } | |
| return result; | |
| }, | |
| peg$c114 = "*", | |
| peg$c115 = { type: "literal", value: "*", description: "\"*\"" }, | |
| peg$c116 = "/", | |
| peg$c117 = { type: "literal", value: "/", description: "\"/\"" }, | |
| peg$c118 = "%", | |
| peg$c119 = { type: "literal", value: "%", description: "\"%\"" }, | |
| peg$c120 = "=", | |
| peg$c121 = { type: "literal", value: "=", description: "\"=\"" }, | |
| peg$c122 = function(operator) { return operator; }, | |
| peg$c123 = function() { return "+"; }, | |
| peg$c124 = function() { return "-"; }, | |
| peg$c125 = "<=", | |
| peg$c126 = { type: "literal", value: "<=", description: "\"<=\"" }, | |
| peg$c127 = ">=", | |
| peg$c128 = { type: "literal", value: ">=", description: "\">=\"" }, | |
| peg$c129 = "<", | |
| peg$c130 = { type: "literal", value: "<", description: "\"<\"" }, | |
| peg$c131 = ">", | |
| peg$c132 = { type: "literal", value: ">", description: "\">\"" }, | |
| peg$c133 = "==", | |
| peg$c134 = { type: "literal", value: "==", description: "\"==\"" }, | |
| peg$c135 = "!=", | |
| peg$c136 = { type: "literal", value: "!=", description: "\"!=\"" }, | |
| peg$c137 = "&&", | |
| peg$c138 = { type: "literal", value: "&&", description: "\"&&\"" }, | |
| peg$c139 = function() { return "&&"; }, | |
| peg$c140 = "||", | |
| peg$c141 = { type: "literal", value: "||", description: "\"||\"" }, | |
| peg$c142 = function() { return "||"; }, | |
| peg$c143 = "if", | |
| peg$c144 = { type: "literal", value: "if", description: "\"if\"" }, | |
| peg$c145 = "then", | |
| peg$c146 = { type: "literal", value: "then", description: "\"then\"" }, | |
| peg$c147 = "else", | |
| peg$c148 = { type: "literal", value: "else", description: "\"else\"" }, | |
| peg$c149 = function(condition, trueExpression, falseExpression) { | |
| return ['if', condition, trueExpression, falseExpression]; | |
| }, | |
| peg$currPos = 0, | |
| peg$reportedPos = 0, | |
| peg$cachedPos = 0, | |
| peg$cachedPosDetails = { line: 1, column: 1, seenCR: false }, | |
| peg$maxFailPos = 0, | |
| peg$maxFailExpected = [], | |
| peg$silentFails = 0, | |
| peg$result; | |
| if ("startRule" in options) { | |
| if (!(options.startRule in peg$startRuleFunctions)) { | |
| throw new Error("Can't start parsing from rule \"" + options.startRule + "\"."); | |
| } | |
| peg$startRuleFunction = peg$startRuleFunctions[options.startRule]; | |
| } | |
| function text() { | |
| return input.substring(peg$reportedPos, peg$currPos); | |
| } | |
| function offset() { | |
| return peg$reportedPos; | |
| } | |
| function line() { | |
| return peg$computePosDetails(peg$reportedPos).line; | |
| } | |
| function column() { | |
| return peg$computePosDetails(peg$reportedPos).column; | |
| } | |
| function expected(description) { | |
| throw peg$buildException( | |
| null, | |
| [{ type: "other", description: description }], | |
| peg$reportedPos | |
| ); | |
| } | |
| function error(message) { | |
| throw peg$buildException(message, null, peg$reportedPos); | |
| } | |
| function peg$computePosDetails(pos) { | |
| function advance(details, startPos, endPos) { | |
| var p, ch; | |
| for (p = startPos; p < endPos; p++) { | |
| ch = input.charAt(p); | |
| if (ch === "\n") { | |
| if (!details.seenCR) { details.line++; } | |
| details.column = 1; | |
| details.seenCR = false; | |
| } else if (ch === "\r" || ch === "\u2028" || ch === "\u2029") { | |
| details.line++; | |
| details.column = 1; | |
| details.seenCR = true; | |
| } else { | |
| details.column++; | |
| details.seenCR = false; | |
| } | |
| } | |
| } | |
| if (peg$cachedPos !== pos) { | |
| if (peg$cachedPos > pos) { | |
| peg$cachedPos = 0; | |
| peg$cachedPosDetails = { line: 1, column: 1, seenCR: false }; | |
| } | |
| advance(peg$cachedPosDetails, peg$cachedPos, pos); | |
| peg$cachedPos = pos; | |
| } | |
| return peg$cachedPosDetails; | |
| } | |
| function peg$fail(expected) { | |
| if (peg$currPos < peg$maxFailPos) { return; } | |
| if (peg$currPos > peg$maxFailPos) { | |
| peg$maxFailPos = peg$currPos; | |
| peg$maxFailExpected = []; | |
| } | |
| peg$maxFailExpected.push(expected); | |
| } | |
| function peg$buildException(message, expected, pos) { | |
| function cleanupExpected(expected) { | |
| var i = 1; | |
| expected.sort(function(a, b) { | |
| if (a.description < b.description) { | |
| return -1; | |
| } else if (a.description > b.description) { | |
| return 1; | |
| } else { | |
| return 0; | |
| } | |
| }); | |
| while (i < expected.length) { | |
| if (expected[i - 1] === expected[i]) { | |
| expected.splice(i, 1); | |
| } else { | |
| i++; | |
| } | |
| } | |
| } | |
| function buildMessage(expected, found) { | |
| function stringEscape(s) { | |
| function hex(ch) { return ch.charCodeAt(0).toString(16).toUpperCase(); } | |
| return s | |
| .replace(/\\/g, '\\\\') | |
| .replace(/"/g, '\\"') | |
| .replace(/\x08/g, '\\b') | |
| .replace(/\t/g, '\\t') | |
| .replace(/\n/g, '\\n') | |
| .replace(/\f/g, '\\f') | |
| .replace(/\r/g, '\\r') | |
| .replace(/[\x00-\x07\x0B\x0E\x0F]/g, function(ch) { return '\\x0' + hex(ch); }) | |
| .replace(/[\x10-\x1F\x80-\xFF]/g, function(ch) { return '\\x' + hex(ch); }) | |
| .replace(/[\u0180-\u0FFF]/g, function(ch) { return '\\u0' + hex(ch); }) | |
| .replace(/[\u1080-\uFFFF]/g, function(ch) { return '\\u' + hex(ch); }); | |
| } | |
| var expectedDescs = new Array(expected.length), | |
| expectedDesc, foundDesc, i; | |
| for (i = 0; i < expected.length; i++) { | |
| expectedDescs[i] = expected[i].description; | |
| } | |
| expectedDesc = expected.length > 1 | |
| ? expectedDescs.slice(0, -1).join(", ") | |
| + " or " | |
| + expectedDescs[expected.length - 1] | |
| : expectedDescs[0]; | |
| foundDesc = found ? "\"" + stringEscape(found) + "\"" : "end of input"; | |
| return "Expected " + expectedDesc + " but " + foundDesc + " found."; | |
| } | |
| var posDetails = peg$computePosDetails(pos), | |
| found = pos < input.length ? input.charAt(pos) : null; | |
| if (expected !== null) { | |
| cleanupExpected(expected); | |
| } | |
| return new SyntaxError( | |
| message !== null ? message : buildMessage(expected, found), | |
| expected, | |
| found, | |
| pos, | |
| posDetails.line, | |
| posDetails.column | |
| ); | |
| } | |
| function peg$parsestart() { | |
| var s0, s1, s2, s3; | |
| s0 = peg$currPos; | |
| s1 = peg$parse__(); | |
| if (s1 !== peg$FAILED) { | |
| s2 = peg$parseExpression(); | |
| if (s2 !== peg$FAILED) { | |
| s3 = peg$parse__(); | |
| if (s3 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c1(s2); | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| return s0; | |
| } | |
| function peg$parseSourceCharacter() { | |
| var s0; | |
| if (input.length > peg$currPos) { | |
| s0 = input.charAt(peg$currPos); | |
| peg$currPos++; | |
| } else { | |
| s0 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c2); } | |
| } | |
| return s0; | |
| } | |
| function peg$parseWhiteSpace() { | |
| var s0, s1; | |
| peg$silentFails++; | |
| if (peg$c4.test(input.charAt(peg$currPos))) { | |
| s0 = input.charAt(peg$currPos); | |
| peg$currPos++; | |
| } else { | |
| s0 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c5); } | |
| } | |
| if (s0 === peg$FAILED) { | |
| s0 = peg$parseZs(); | |
| } | |
| peg$silentFails--; | |
| if (s0 === peg$FAILED) { | |
| s1 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c3); } | |
| } | |
| return s0; | |
| } | |
| function peg$parseIdentifier() { | |
| var s0, s1, s2; | |
| peg$silentFails++; | |
| s0 = peg$currPos; | |
| s1 = peg$currPos; | |
| peg$silentFails++; | |
| s2 = peg$parseReservedWord(); | |
| peg$silentFails--; | |
| if (s2 === peg$FAILED) { | |
| s1 = peg$c7; | |
| } else { | |
| peg$currPos = s1; | |
| s1 = peg$c0; | |
| } | |
| if (s1 !== peg$FAILED) { | |
| s2 = peg$parseIdentifierName(); | |
| if (s2 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c8(s2); | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| peg$silentFails--; | |
| if (s0 === peg$FAILED) { | |
| s1 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c6); } | |
| } | |
| return s0; | |
| } | |
| function peg$parseIdentifierName() { | |
| var s0, s1, s2, s3; | |
| peg$silentFails++; | |
| s0 = peg$currPos; | |
| s1 = peg$parseIdentifierStart(); | |
| if (s1 !== peg$FAILED) { | |
| s2 = []; | |
| s3 = peg$parseIdentifierPart(); | |
| while (s3 !== peg$FAILED) { | |
| s2.push(s3); | |
| s3 = peg$parseIdentifierPart(); | |
| } | |
| if (s2 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c10(s1, s2); | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| peg$silentFails--; | |
| if (s0 === peg$FAILED) { | |
| s1 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c6); } | |
| } | |
| return s0; | |
| } | |
| function peg$parseIdentifierStart() { | |
| var s0, s1, s2; | |
| s0 = peg$parseUnicodeLetter(); | |
| if (s0 === peg$FAILED) { | |
| if (input.charCodeAt(peg$currPos) === 36) { | |
| s0 = peg$c11; | |
| peg$currPos++; | |
| } else { | |
| s0 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c12); } | |
| } | |
| if (s0 === peg$FAILED) { | |
| if (input.charCodeAt(peg$currPos) === 95) { | |
| s0 = peg$c13; | |
| peg$currPos++; | |
| } else { | |
| s0 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c14); } | |
| } | |
| if (s0 === peg$FAILED) { | |
| s0 = peg$currPos; | |
| if (input.charCodeAt(peg$currPos) === 92) { | |
| s1 = peg$c15; | |
| peg$currPos++; | |
| } else { | |
| s1 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c16); } | |
| } | |
| if (s1 !== peg$FAILED) { | |
| s2 = peg$parseUnicodeEscapeSequence(); | |
| if (s2 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c17(s2); | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } | |
| } | |
| } | |
| return s0; | |
| } | |
| function peg$parseIdentifierPart() { | |
| var s0, s1; | |
| s0 = peg$parseIdentifierStart(); | |
| if (s0 === peg$FAILED) { | |
| s0 = peg$parseUnicodeCombiningMark(); | |
| if (s0 === peg$FAILED) { | |
| s0 = peg$parseNd(); | |
| if (s0 === peg$FAILED) { | |
| s0 = peg$parsePc(); | |
| if (s0 === peg$FAILED) { | |
| s0 = peg$currPos; | |
| if (input.charCodeAt(peg$currPos) === 8204) { | |
| s1 = peg$c18; | |
| peg$currPos++; | |
| } else { | |
| s1 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c19); } | |
| } | |
| if (s1 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c20(); | |
| } | |
| s0 = s1; | |
| if (s0 === peg$FAILED) { | |
| s0 = peg$currPos; | |
| if (input.charCodeAt(peg$currPos) === 8205) { | |
| s1 = peg$c21; | |
| peg$currPos++; | |
| } else { | |
| s1 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c22); } | |
| } | |
| if (s1 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c23(); | |
| } | |
| s0 = s1; | |
| } | |
| } | |
| } | |
| } | |
| } | |
| return s0; | |
| } | |
| function peg$parseUnicodeLetter() { | |
| var s0; | |
| s0 = peg$parseLu(); | |
| if (s0 === peg$FAILED) { | |
| s0 = peg$parseLl(); | |
| if (s0 === peg$FAILED) { | |
| s0 = peg$parseLt(); | |
| if (s0 === peg$FAILED) { | |
| s0 = peg$parseLm(); | |
| if (s0 === peg$FAILED) { | |
| s0 = peg$parseLo(); | |
| if (s0 === peg$FAILED) { | |
| s0 = peg$parseNl(); | |
| } | |
| } | |
| } | |
| } | |
| } | |
| return s0; | |
| } | |
| function peg$parseUnicodeCombiningMark() { | |
| var s0; | |
| s0 = peg$parseMn(); | |
| if (s0 === peg$FAILED) { | |
| s0 = peg$parseMc(); | |
| } | |
| return s0; | |
| } | |
| function peg$parseReservedWord() { | |
| var s0; | |
| s0 = peg$parseNullLiteral(); | |
| if (s0 === peg$FAILED) { | |
| s0 = peg$parseBooleanLiteral(); | |
| } | |
| return s0; | |
| } | |
| function peg$parseLiteral() { | |
| var s0; | |
| s0 = peg$parseNullLiteral(); | |
| if (s0 === peg$FAILED) { | |
| s0 = peg$parseBooleanLiteral(); | |
| if (s0 === peg$FAILED) { | |
| s0 = peg$parseNumericLiteral(); | |
| if (s0 === peg$FAILED) { | |
| s0 = peg$parseStringLiteral(); | |
| } | |
| } | |
| } | |
| return s0; | |
| } | |
| function peg$parseNullLiteral() { | |
| var s0, s1, s2, s3; | |
| s0 = peg$currPos; | |
| if (input.substr(peg$currPos, 4) === peg$c24) { | |
| s1 = peg$c24; | |
| peg$currPos += 4; | |
| } else { | |
| s1 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c25); } | |
| } | |
| if (s1 !== peg$FAILED) { | |
| s2 = peg$currPos; | |
| peg$silentFails++; | |
| s3 = peg$parseIdentifierPart(); | |
| peg$silentFails--; | |
| if (s3 === peg$FAILED) { | |
| s2 = peg$c7; | |
| } else { | |
| peg$currPos = s2; | |
| s2 = peg$c0; | |
| } | |
| if (s2 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c26(); | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| return s0; | |
| } | |
| function peg$parseBooleanLiteral() { | |
| var s0, s1, s2, s3; | |
| s0 = peg$currPos; | |
| if (input.substr(peg$currPos, 5) === peg$c27) { | |
| s1 = peg$c27; | |
| peg$currPos += 5; | |
| } else { | |
| s1 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c28); } | |
| } | |
| if (s1 !== peg$FAILED) { | |
| s2 = peg$currPos; | |
| peg$silentFails++; | |
| s3 = peg$parseIdentifierPart(); | |
| peg$silentFails--; | |
| if (s3 === peg$FAILED) { | |
| s2 = peg$c7; | |
| } else { | |
| peg$currPos = s2; | |
| s2 = peg$c0; | |
| } | |
| if (s2 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c29(); | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| if (s0 === peg$FAILED) { | |
| s0 = peg$currPos; | |
| if (input.substr(peg$currPos, 4) === peg$c30) { | |
| s1 = peg$c30; | |
| peg$currPos += 4; | |
| } else { | |
| s1 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c31); } | |
| } | |
| if (s1 !== peg$FAILED) { | |
| s2 = peg$currPos; | |
| peg$silentFails++; | |
| s3 = peg$parseIdentifierPart(); | |
| peg$silentFails--; | |
| if (s3 === peg$FAILED) { | |
| s2 = peg$c7; | |
| } else { | |
| peg$currPos = s2; | |
| s2 = peg$c0; | |
| } | |
| if (s2 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c32(); | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } | |
| return s0; | |
| } | |
| function peg$parseNumericLiteral() { | |
| var s0, s1, s2, s3; | |
| peg$silentFails++; | |
| s0 = peg$currPos; | |
| s1 = peg$parseHexIntegerLiteral(); | |
| if (s1 === peg$FAILED) { | |
| s1 = peg$parseDecimalLiteral(); | |
| } | |
| if (s1 !== peg$FAILED) { | |
| s2 = peg$currPos; | |
| peg$silentFails++; | |
| s3 = peg$parseIdentifierStart(); | |
| peg$silentFails--; | |
| if (s3 === peg$FAILED) { | |
| s2 = peg$c7; | |
| } else { | |
| peg$currPos = s2; | |
| s2 = peg$c0; | |
| } | |
| if (s2 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c34(s1); | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| peg$silentFails--; | |
| if (s0 === peg$FAILED) { | |
| s1 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c33); } | |
| } | |
| return s0; | |
| } | |
| function peg$parseDecimalLiteral() { | |
| var s0, s1, s2, s3, s4, s5, s6; | |
| s0 = peg$currPos; | |
| s1 = peg$currPos; | |
| s2 = peg$currPos; | |
| s3 = peg$parseDecimalIntegerLiteral(); | |
| if (s3 !== peg$FAILED) { | |
| if (input.charCodeAt(peg$currPos) === 46) { | |
| s4 = peg$c35; | |
| peg$currPos++; | |
| } else { | |
| s4 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c36); } | |
| } | |
| if (s4 !== peg$FAILED) { | |
| s5 = peg$parseDecimalDigits(); | |
| if (s5 === peg$FAILED) { | |
| s5 = peg$c37; | |
| } | |
| if (s5 !== peg$FAILED) { | |
| s6 = peg$parseExponentPart(); | |
| if (s6 === peg$FAILED) { | |
| s6 = peg$c37; | |
| } | |
| if (s6 !== peg$FAILED) { | |
| s3 = [s3, s4, s5, s6]; | |
| s2 = s3; | |
| } else { | |
| peg$currPos = s2; | |
| s2 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s2; | |
| s2 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s2; | |
| s2 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s2; | |
| s2 = peg$c0; | |
| } | |
| if (s2 !== peg$FAILED) { | |
| s2 = input.substring(s1, peg$currPos); | |
| } | |
| s1 = s2; | |
| if (s1 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c38(s1); | |
| } | |
| s0 = s1; | |
| if (s0 === peg$FAILED) { | |
| s0 = peg$currPos; | |
| s1 = peg$currPos; | |
| s2 = peg$currPos; | |
| if (input.charCodeAt(peg$currPos) === 46) { | |
| s3 = peg$c35; | |
| peg$currPos++; | |
| } else { | |
| s3 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c36); } | |
| } | |
| if (s3 !== peg$FAILED) { | |
| s4 = peg$parseDecimalDigits(); | |
| if (s4 !== peg$FAILED) { | |
| s5 = peg$parseExponentPart(); | |
| if (s5 === peg$FAILED) { | |
| s5 = peg$c37; | |
| } | |
| if (s5 !== peg$FAILED) { | |
| s3 = [s3, s4, s5]; | |
| s2 = s3; | |
| } else { | |
| peg$currPos = s2; | |
| s2 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s2; | |
| s2 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s2; | |
| s2 = peg$c0; | |
| } | |
| if (s2 !== peg$FAILED) { | |
| s2 = input.substring(s1, peg$currPos); | |
| } | |
| s1 = s2; | |
| if (s1 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c39(s1); | |
| } | |
| s0 = s1; | |
| if (s0 === peg$FAILED) { | |
| s0 = peg$currPos; | |
| s1 = peg$currPos; | |
| s2 = peg$currPos; | |
| s3 = peg$parseDecimalIntegerLiteral(); | |
| if (s3 !== peg$FAILED) { | |
| s4 = peg$parseExponentPart(); | |
| if (s4 === peg$FAILED) { | |
| s4 = peg$c37; | |
| } | |
| if (s4 !== peg$FAILED) { | |
| s3 = [s3, s4]; | |
| s2 = s3; | |
| } else { | |
| peg$currPos = s2; | |
| s2 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s2; | |
| s2 = peg$c0; | |
| } | |
| if (s2 !== peg$FAILED) { | |
| s2 = input.substring(s1, peg$currPos); | |
| } | |
| s1 = s2; | |
| if (s1 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c39(s1); | |
| } | |
| s0 = s1; | |
| } | |
| } | |
| return s0; | |
| } | |
| function peg$parseDecimalIntegerLiteral() { | |
| var s0, s1, s2; | |
| if (input.charCodeAt(peg$currPos) === 48) { | |
| s0 = peg$c40; | |
| peg$currPos++; | |
| } else { | |
| s0 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c41); } | |
| } | |
| if (s0 === peg$FAILED) { | |
| s0 = peg$currPos; | |
| s1 = peg$parseNonZeroDigit(); | |
| if (s1 !== peg$FAILED) { | |
| s2 = peg$parseDecimalDigits(); | |
| if (s2 === peg$FAILED) { | |
| s2 = peg$c37; | |
| } | |
| if (s2 !== peg$FAILED) { | |
| s1 = [s1, s2]; | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } | |
| return s0; | |
| } | |
| function peg$parseDecimalDigits() { | |
| var s0, s1; | |
| s0 = []; | |
| s1 = peg$parseDecimalDigit(); | |
| if (s1 !== peg$FAILED) { | |
| while (s1 !== peg$FAILED) { | |
| s0.push(s1); | |
| s1 = peg$parseDecimalDigit(); | |
| } | |
| } else { | |
| s0 = peg$c0; | |
| } | |
| return s0; | |
| } | |
| function peg$parseDecimalDigit() { | |
| var s0; | |
| if (peg$c42.test(input.charAt(peg$currPos))) { | |
| s0 = input.charAt(peg$currPos); | |
| peg$currPos++; | |
| } else { | |
| s0 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c43); } | |
| } | |
| return s0; | |
| } | |
| function peg$parseNonZeroDigit() { | |
| var s0; | |
| if (peg$c44.test(input.charAt(peg$currPos))) { | |
| s0 = input.charAt(peg$currPos); | |
| peg$currPos++; | |
| } else { | |
| s0 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c45); } | |
| } | |
| return s0; | |
| } | |
| function peg$parseExponentPart() { | |
| var s0, s1, s2; | |
| s0 = peg$currPos; | |
| s1 = peg$parseExponentIndicator(); | |
| if (s1 !== peg$FAILED) { | |
| s2 = peg$parseSignedInteger(); | |
| if (s2 !== peg$FAILED) { | |
| s1 = [s1, s2]; | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| return s0; | |
| } | |
| function peg$parseExponentIndicator() { | |
| var s0; | |
| if (peg$c46.test(input.charAt(peg$currPos))) { | |
| s0 = input.charAt(peg$currPos); | |
| peg$currPos++; | |
| } else { | |
| s0 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c47); } | |
| } | |
| return s0; | |
| } | |
| function peg$parseSignedInteger() { | |
| var s0, s1, s2; | |
| s0 = peg$currPos; | |
| if (peg$c48.test(input.charAt(peg$currPos))) { | |
| s1 = input.charAt(peg$currPos); | |
| peg$currPos++; | |
| } else { | |
| s1 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c49); } | |
| } | |
| if (s1 === peg$FAILED) { | |
| s1 = peg$c37; | |
| } | |
| if (s1 !== peg$FAILED) { | |
| s2 = peg$parseDecimalDigits(); | |
| if (s2 !== peg$FAILED) { | |
| s1 = [s1, s2]; | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| return s0; | |
| } | |
| function peg$parseHexIntegerLiteral() { | |
| var s0, s1, s2, s3, s4, s5; | |
| s0 = peg$currPos; | |
| if (input.charCodeAt(peg$currPos) === 48) { | |
| s1 = peg$c40; | |
| peg$currPos++; | |
| } else { | |
| s1 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c41); } | |
| } | |
| if (s1 !== peg$FAILED) { | |
| if (peg$c50.test(input.charAt(peg$currPos))) { | |
| s2 = input.charAt(peg$currPos); | |
| peg$currPos++; | |
| } else { | |
| s2 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c51); } | |
| } | |
| if (s2 !== peg$FAILED) { | |
| s3 = peg$currPos; | |
| s4 = []; | |
| s5 = peg$parseHexDigit(); | |
| if (s5 !== peg$FAILED) { | |
| while (s5 !== peg$FAILED) { | |
| s4.push(s5); | |
| s5 = peg$parseHexDigit(); | |
| } | |
| } else { | |
| s4 = peg$c0; | |
| } | |
| if (s4 !== peg$FAILED) { | |
| s4 = input.substring(s3, peg$currPos); | |
| } | |
| s3 = s4; | |
| if (s3 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c52(s3); | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| return s0; | |
| } | |
| function peg$parseHexDigit() { | |
| var s0; | |
| if (peg$c53.test(input.charAt(peg$currPos))) { | |
| s0 = input.charAt(peg$currPos); | |
| peg$currPos++; | |
| } else { | |
| s0 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c54); } | |
| } | |
| return s0; | |
| } | |
| function peg$parseStringLiteral() { | |
| var s0, s1, s2, s3, s4; | |
| peg$silentFails++; | |
| s0 = peg$currPos; | |
| s1 = peg$currPos; | |
| if (input.charCodeAt(peg$currPos) === 34) { | |
| s2 = peg$c56; | |
| peg$currPos++; | |
| } else { | |
| s2 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c57); } | |
| } | |
| if (s2 !== peg$FAILED) { | |
| s3 = peg$parseDoubleStringCharacters(); | |
| if (s3 === peg$FAILED) { | |
| s3 = peg$c37; | |
| } | |
| if (s3 !== peg$FAILED) { | |
| if (input.charCodeAt(peg$currPos) === 34) { | |
| s4 = peg$c56; | |
| peg$currPos++; | |
| } else { | |
| s4 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c57); } | |
| } | |
| if (s4 !== peg$FAILED) { | |
| s2 = [s2, s3, s4]; | |
| s1 = s2; | |
| } else { | |
| peg$currPos = s1; | |
| s1 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s1; | |
| s1 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s1; | |
| s1 = peg$c0; | |
| } | |
| if (s1 === peg$FAILED) { | |
| s1 = peg$currPos; | |
| if (input.charCodeAt(peg$currPos) === 39) { | |
| s2 = peg$c58; | |
| peg$currPos++; | |
| } else { | |
| s2 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c59); } | |
| } | |
| if (s2 !== peg$FAILED) { | |
| s3 = peg$parseSingleStringCharacters(); | |
| if (s3 === peg$FAILED) { | |
| s3 = peg$c37; | |
| } | |
| if (s3 !== peg$FAILED) { | |
| if (input.charCodeAt(peg$currPos) === 39) { | |
| s4 = peg$c58; | |
| peg$currPos++; | |
| } else { | |
| s4 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c59); } | |
| } | |
| if (s4 !== peg$FAILED) { | |
| s2 = [s2, s3, s4]; | |
| s1 = s2; | |
| } else { | |
| peg$currPos = s1; | |
| s1 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s1; | |
| s1 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s1; | |
| s1 = peg$c0; | |
| } | |
| } | |
| if (s1 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c60(s1); | |
| } | |
| s0 = s1; | |
| peg$silentFails--; | |
| if (s0 === peg$FAILED) { | |
| s1 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c55); } | |
| } | |
| return s0; | |
| } | |
| function peg$parseDoubleStringCharacters() { | |
| var s0, s1, s2; | |
| s0 = peg$currPos; | |
| s1 = []; | |
| s2 = peg$parseDoubleStringCharacter(); | |
| if (s2 !== peg$FAILED) { | |
| while (s2 !== peg$FAILED) { | |
| s1.push(s2); | |
| s2 = peg$parseDoubleStringCharacter(); | |
| } | |
| } else { | |
| s1 = peg$c0; | |
| } | |
| if (s1 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c61(s1); | |
| } | |
| s0 = s1; | |
| return s0; | |
| } | |
| function peg$parseSingleStringCharacters() { | |
| var s0, s1, s2; | |
| s0 = peg$currPos; | |
| s1 = []; | |
| s2 = peg$parseSingleStringCharacter(); | |
| if (s2 !== peg$FAILED) { | |
| while (s2 !== peg$FAILED) { | |
| s1.push(s2); | |
| s2 = peg$parseSingleStringCharacter(); | |
| } | |
| } else { | |
| s1 = peg$c0; | |
| } | |
| if (s1 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c61(s1); | |
| } | |
| s0 = s1; | |
| return s0; | |
| } | |
| function peg$parseDoubleStringCharacter() { | |
| var s0, s1, s2; | |
| s0 = peg$currPos; | |
| s1 = peg$currPos; | |
| peg$silentFails++; | |
| if (input.charCodeAt(peg$currPos) === 34) { | |
| s2 = peg$c56; | |
| peg$currPos++; | |
| } else { | |
| s2 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c57); } | |
| } | |
| if (s2 === peg$FAILED) { | |
| if (input.charCodeAt(peg$currPos) === 92) { | |
| s2 = peg$c15; | |
| peg$currPos++; | |
| } else { | |
| s2 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c16); } | |
| } | |
| } | |
| peg$silentFails--; | |
| if (s2 === peg$FAILED) { | |
| s1 = peg$c7; | |
| } else { | |
| peg$currPos = s1; | |
| s1 = peg$c0; | |
| } | |
| if (s1 !== peg$FAILED) { | |
| s2 = peg$parseSourceCharacter(); | |
| if (s2 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c62(s2); | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| if (s0 === peg$FAILED) { | |
| s0 = peg$currPos; | |
| if (input.charCodeAt(peg$currPos) === 92) { | |
| s1 = peg$c15; | |
| peg$currPos++; | |
| } else { | |
| s1 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c16); } | |
| } | |
| if (s1 !== peg$FAILED) { | |
| s2 = peg$parseEscapeSequence(); | |
| if (s2 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c63(s2); | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } | |
| return s0; | |
| } | |
| function peg$parseSingleStringCharacter() { | |
| var s0, s1, s2; | |
| s0 = peg$currPos; | |
| s1 = peg$currPos; | |
| peg$silentFails++; | |
| if (input.charCodeAt(peg$currPos) === 39) { | |
| s2 = peg$c58; | |
| peg$currPos++; | |
| } else { | |
| s2 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c59); } | |
| } | |
| if (s2 === peg$FAILED) { | |
| if (input.charCodeAt(peg$currPos) === 92) { | |
| s2 = peg$c15; | |
| peg$currPos++; | |
| } else { | |
| s2 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c16); } | |
| } | |
| } | |
| peg$silentFails--; | |
| if (s2 === peg$FAILED) { | |
| s1 = peg$c7; | |
| } else { | |
| peg$currPos = s1; | |
| s1 = peg$c0; | |
| } | |
| if (s1 !== peg$FAILED) { | |
| s2 = peg$parseSourceCharacter(); | |
| if (s2 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c62(s2); | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| if (s0 === peg$FAILED) { | |
| s0 = peg$currPos; | |
| if (input.charCodeAt(peg$currPos) === 92) { | |
| s1 = peg$c15; | |
| peg$currPos++; | |
| } else { | |
| s1 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c16); } | |
| } | |
| if (s1 !== peg$FAILED) { | |
| s2 = peg$parseEscapeSequence(); | |
| if (s2 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c63(s2); | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } | |
| return s0; | |
| } | |
| function peg$parseEscapeSequence() { | |
| var s0, s1, s2, s3; | |
| s0 = peg$parseCharacterEscapeSequence(); | |
| if (s0 === peg$FAILED) { | |
| s0 = peg$currPos; | |
| if (input.charCodeAt(peg$currPos) === 48) { | |
| s1 = peg$c40; | |
| peg$currPos++; | |
| } else { | |
| s1 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c41); } | |
| } | |
| if (s1 !== peg$FAILED) { | |
| s2 = peg$currPos; | |
| peg$silentFails++; | |
| s3 = peg$parseDecimalDigit(); | |
| peg$silentFails--; | |
| if (s3 === peg$FAILED) { | |
| s2 = peg$c7; | |
| } else { | |
| peg$currPos = s2; | |
| s2 = peg$c0; | |
| } | |
| if (s2 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c64(); | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| if (s0 === peg$FAILED) { | |
| s0 = peg$parseHexEscapeSequence(); | |
| if (s0 === peg$FAILED) { | |
| s0 = peg$parseUnicodeEscapeSequence(); | |
| } | |
| } | |
| } | |
| return s0; | |
| } | |
| function peg$parseCharacterEscapeSequence() { | |
| var s0; | |
| s0 = peg$parseSingleEscapeCharacter(); | |
| if (s0 === peg$FAILED) { | |
| s0 = peg$parseNonEscapeCharacter(); | |
| } | |
| return s0; | |
| } | |
| function peg$parseSingleEscapeCharacter() { | |
| var s0, s1; | |
| s0 = peg$currPos; | |
| if (peg$c65.test(input.charAt(peg$currPos))) { | |
| s1 = input.charAt(peg$currPos); | |
| peg$currPos++; | |
| } else { | |
| s1 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c66); } | |
| } | |
| if (s1 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c67(s1); | |
| } | |
| s0 = s1; | |
| return s0; | |
| } | |
| function peg$parseNonEscapeCharacter() { | |
| var s0, s1, s2; | |
| s0 = peg$currPos; | |
| s1 = peg$currPos; | |
| peg$silentFails++; | |
| s2 = peg$parseEscapeCharacter(); | |
| peg$silentFails--; | |
| if (s2 === peg$FAILED) { | |
| s1 = peg$c7; | |
| } else { | |
| peg$currPos = s1; | |
| s1 = peg$c0; | |
| } | |
| if (s1 !== peg$FAILED) { | |
| s2 = peg$parseSourceCharacter(); | |
| if (s2 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c68(s2); | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| return s0; | |
| } | |
| function peg$parseEscapeCharacter() { | |
| var s0; | |
| s0 = peg$parseSingleEscapeCharacter(); | |
| if (s0 === peg$FAILED) { | |
| s0 = peg$parseDecimalDigit(); | |
| if (s0 === peg$FAILED) { | |
| if (input.charCodeAt(peg$currPos) === 120) { | |
| s0 = peg$c69; | |
| peg$currPos++; | |
| } else { | |
| s0 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c70); } | |
| } | |
| if (s0 === peg$FAILED) { | |
| if (input.charCodeAt(peg$currPos) === 117) { | |
| s0 = peg$c71; | |
| peg$currPos++; | |
| } else { | |
| s0 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c72); } | |
| } | |
| } | |
| } | |
| } | |
| return s0; | |
| } | |
| function peg$parseHexEscapeSequence() { | |
| var s0, s1, s2, s3, s4, s5; | |
| s0 = peg$currPos; | |
| if (input.charCodeAt(peg$currPos) === 120) { | |
| s1 = peg$c69; | |
| peg$currPos++; | |
| } else { | |
| s1 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c70); } | |
| } | |
| if (s1 !== peg$FAILED) { | |
| s2 = peg$currPos; | |
| s3 = peg$currPos; | |
| s4 = peg$parseHexDigit(); | |
| if (s4 !== peg$FAILED) { | |
| s5 = peg$parseHexDigit(); | |
| if (s5 !== peg$FAILED) { | |
| s4 = [s4, s5]; | |
| s3 = s4; | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| if (s3 !== peg$FAILED) { | |
| s3 = input.substring(s2, peg$currPos); | |
| } | |
| s2 = s3; | |
| if (s2 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c73(s2); | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| return s0; | |
| } | |
| function peg$parseUnicodeEscapeSequence() { | |
| var s0, s1, s2, s3, s4, s5, s6, s7; | |
| s0 = peg$currPos; | |
| if (input.charCodeAt(peg$currPos) === 117) { | |
| s1 = peg$c71; | |
| peg$currPos++; | |
| } else { | |
| s1 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c72); } | |
| } | |
| if (s1 !== peg$FAILED) { | |
| s2 = peg$currPos; | |
| s3 = peg$currPos; | |
| s4 = peg$parseHexDigit(); | |
| if (s4 !== peg$FAILED) { | |
| s5 = peg$parseHexDigit(); | |
| if (s5 !== peg$FAILED) { | |
| s6 = peg$parseHexDigit(); | |
| if (s6 !== peg$FAILED) { | |
| s7 = peg$parseHexDigit(); | |
| if (s7 !== peg$FAILED) { | |
| s4 = [s4, s5, s6, s7]; | |
| s3 = s4; | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| if (s3 !== peg$FAILED) { | |
| s3 = input.substring(s2, peg$currPos); | |
| } | |
| s2 = s3; | |
| if (s2 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c73(s2); | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| return s0; | |
| } | |
| function peg$parseLl() { | |
| var s0; | |
| if (peg$c74.test(input.charAt(peg$currPos))) { | |
| s0 = input.charAt(peg$currPos); | |
| peg$currPos++; | |
| } else { | |
| s0 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c75); } | |
| } | |
| return s0; | |
| } | |
| function peg$parseLm() { | |
| var s0; | |
| if (peg$c76.test(input.charAt(peg$currPos))) { | |
| s0 = input.charAt(peg$currPos); | |
| peg$currPos++; | |
| } else { | |
| s0 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c77); } | |
| } | |
| return s0; | |
| } | |
| function peg$parseLo() { | |
| var s0; | |
| if (peg$c78.test(input.charAt(peg$currPos))) { | |
| s0 = input.charAt(peg$currPos); | |
| peg$currPos++; | |
| } else { | |
| s0 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c79); } | |
| } | |
| return s0; | |
| } | |
| function peg$parseLt() { | |
| var s0; | |
| if (peg$c80.test(input.charAt(peg$currPos))) { | |
| s0 = input.charAt(peg$currPos); | |
| peg$currPos++; | |
| } else { | |
| s0 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c81); } | |
| } | |
| return s0; | |
| } | |
| function peg$parseLu() { | |
| var s0; | |
| if (peg$c82.test(input.charAt(peg$currPos))) { | |
| s0 = input.charAt(peg$currPos); | |
| peg$currPos++; | |
| } else { | |
| s0 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c83); } | |
| } | |
| return s0; | |
| } | |
| function peg$parseMc() { | |
| var s0; | |
| if (peg$c84.test(input.charAt(peg$currPos))) { | |
| s0 = input.charAt(peg$currPos); | |
| peg$currPos++; | |
| } else { | |
| s0 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c85); } | |
| } | |
| return s0; | |
| } | |
| function peg$parseMn() { | |
| var s0; | |
| if (peg$c86.test(input.charAt(peg$currPos))) { | |
| s0 = input.charAt(peg$currPos); | |
| peg$currPos++; | |
| } else { | |
| s0 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c87); } | |
| } | |
| return s0; | |
| } | |
| function peg$parseNd() { | |
| var s0; | |
| if (peg$c88.test(input.charAt(peg$currPos))) { | |
| s0 = input.charAt(peg$currPos); | |
| peg$currPos++; | |
| } else { | |
| s0 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c89); } | |
| } | |
| return s0; | |
| } | |
| function peg$parseNl() { | |
| var s0; | |
| if (peg$c90.test(input.charAt(peg$currPos))) { | |
| s0 = input.charAt(peg$currPos); | |
| peg$currPos++; | |
| } else { | |
| s0 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c91); } | |
| } | |
| return s0; | |
| } | |
| function peg$parsePc() { | |
| var s0; | |
| if (peg$c92.test(input.charAt(peg$currPos))) { | |
| s0 = input.charAt(peg$currPos); | |
| peg$currPos++; | |
| } else { | |
| s0 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c93); } | |
| } | |
| return s0; | |
| } | |
| function peg$parseZs() { | |
| var s0; | |
| if (peg$c94.test(input.charAt(peg$currPos))) { | |
| s0 = input.charAt(peg$currPos); | |
| peg$currPos++; | |
| } else { | |
| s0 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c95); } | |
| } | |
| return s0; | |
| } | |
| function peg$parse__() { | |
| var s0, s1; | |
| s0 = []; | |
| s1 = peg$parseWhiteSpace(); | |
| while (s1 !== peg$FAILED) { | |
| s0.push(s1); | |
| s1 = peg$parseWhiteSpace(); | |
| } | |
| return s0; | |
| } | |
| function peg$parsePrimaryExpression() { | |
| var s0, s1, s2, s3, s4, s5; | |
| s0 = peg$currPos; | |
| s1 = peg$parseIdentifier(); | |
| if (s1 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c96(s1); | |
| } | |
| s0 = s1; | |
| if (s0 === peg$FAILED) { | |
| s0 = peg$parseLiteral(); | |
| if (s0 === peg$FAILED) { | |
| s0 = peg$currPos; | |
| if (input.charCodeAt(peg$currPos) === 40) { | |
| s1 = peg$c97; | |
| peg$currPos++; | |
| } else { | |
| s1 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c98); } | |
| } | |
| if (s1 !== peg$FAILED) { | |
| s2 = peg$parse__(); | |
| if (s2 !== peg$FAILED) { | |
| s3 = peg$parseExpression(); | |
| if (s3 !== peg$FAILED) { | |
| s4 = peg$parse__(); | |
| if (s4 !== peg$FAILED) { | |
| if (input.charCodeAt(peg$currPos) === 41) { | |
| s5 = peg$c99; | |
| peg$currPos++; | |
| } else { | |
| s5 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c100); } | |
| } | |
| if (s5 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c1(s3); | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } | |
| } | |
| return s0; | |
| } | |
| function peg$parseCallExpression() { | |
| var s0, s1, s2, s3, s4; | |
| s0 = peg$currPos; | |
| s1 = peg$parseIdentifier(); | |
| if (s1 !== peg$FAILED) { | |
| s2 = peg$parse__(); | |
| if (s2 !== peg$FAILED) { | |
| s3 = []; | |
| s4 = peg$parseArguments(); | |
| if (s4 !== peg$FAILED) { | |
| while (s4 !== peg$FAILED) { | |
| s3.push(s4); | |
| s4 = peg$parseArguments(); | |
| } | |
| } else { | |
| s3 = peg$c0; | |
| } | |
| if (s3 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c101(s1, s3); | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| return s0; | |
| } | |
| function peg$parseArguments() { | |
| var s0, s1, s2, s3, s4, s5; | |
| s0 = peg$currPos; | |
| if (input.charCodeAt(peg$currPos) === 40) { | |
| s1 = peg$c97; | |
| peg$currPos++; | |
| } else { | |
| s1 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c98); } | |
| } | |
| if (s1 !== peg$FAILED) { | |
| s2 = peg$parse__(); | |
| if (s2 !== peg$FAILED) { | |
| s3 = peg$parseArgumentList(); | |
| if (s3 === peg$FAILED) { | |
| s3 = peg$c37; | |
| } | |
| if (s3 !== peg$FAILED) { | |
| s4 = peg$parse__(); | |
| if (s4 !== peg$FAILED) { | |
| if (input.charCodeAt(peg$currPos) === 41) { | |
| s5 = peg$c99; | |
| peg$currPos++; | |
| } else { | |
| s5 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c100); } | |
| } | |
| if (s5 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c102(s3); | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| return s0; | |
| } | |
| function peg$parseArgumentList() { | |
| var s0, s1, s2, s3, s4, s5, s6, s7; | |
| s0 = peg$currPos; | |
| s1 = peg$parseExpression(); | |
| if (s1 !== peg$FAILED) { | |
| s2 = []; | |
| s3 = peg$currPos; | |
| s4 = peg$parse__(); | |
| if (s4 !== peg$FAILED) { | |
| if (input.charCodeAt(peg$currPos) === 44) { | |
| s5 = peg$c103; | |
| peg$currPos++; | |
| } else { | |
| s5 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c104); } | |
| } | |
| if (s5 !== peg$FAILED) { | |
| s6 = peg$parse__(); | |
| if (s6 !== peg$FAILED) { | |
| s7 = peg$parseExpression(); | |
| if (s7 !== peg$FAILED) { | |
| s4 = [s4, s5, s6, s7]; | |
| s3 = s4; | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| while (s3 !== peg$FAILED) { | |
| s2.push(s3); | |
| s3 = peg$currPos; | |
| s4 = peg$parse__(); | |
| if (s4 !== peg$FAILED) { | |
| if (input.charCodeAt(peg$currPos) === 44) { | |
| s5 = peg$c103; | |
| peg$currPos++; | |
| } else { | |
| s5 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c104); } | |
| } | |
| if (s5 !== peg$FAILED) { | |
| s6 = peg$parse__(); | |
| if (s6 !== peg$FAILED) { | |
| s7 = peg$parseExpression(); | |
| if (s7 !== peg$FAILED) { | |
| s4 = [s4, s5, s6, s7]; | |
| s3 = s4; | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } | |
| if (s2 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c105(s1, s2); | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| return s0; | |
| } | |
| function peg$parseUnaryExpression() { | |
| var s0, s1, s2, s3; | |
| s0 = peg$parseCallExpression(); | |
| if (s0 === peg$FAILED) { | |
| s0 = peg$parsePrimaryExpression(); | |
| if (s0 === peg$FAILED) { | |
| s0 = peg$currPos; | |
| s1 = peg$parseUnaryOperator(); | |
| if (s1 !== peg$FAILED) { | |
| s2 = peg$parse__(); | |
| if (s2 !== peg$FAILED) { | |
| s3 = peg$parseUnaryExpression(); | |
| if (s3 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c106(s1, s3); | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } | |
| } | |
| return s0; | |
| } | |
| function peg$parseUnaryOperator() { | |
| var s0; | |
| if (input.charCodeAt(peg$currPos) === 43) { | |
| s0 = peg$c107; | |
| peg$currPos++; | |
| } else { | |
| s0 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c108); } | |
| } | |
| if (s0 === peg$FAILED) { | |
| if (input.charCodeAt(peg$currPos) === 45) { | |
| s0 = peg$c109; | |
| peg$currPos++; | |
| } else { | |
| s0 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c110); } | |
| } | |
| if (s0 === peg$FAILED) { | |
| if (input.charCodeAt(peg$currPos) === 33) { | |
| s0 = peg$c111; | |
| peg$currPos++; | |
| } else { | |
| s0 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c112); } | |
| } | |
| } | |
| } | |
| return s0; | |
| } | |
| function peg$parseMultiplicativeExpression() { | |
| var s0, s1, s2, s3, s4, s5, s6, s7; | |
| s0 = peg$currPos; | |
| s1 = peg$parseUnaryExpression(); | |
| if (s1 !== peg$FAILED) { | |
| s2 = []; | |
| s3 = peg$currPos; | |
| s4 = peg$parse__(); | |
| if (s4 !== peg$FAILED) { | |
| s5 = peg$parseMultiplicativeOperator(); | |
| if (s5 !== peg$FAILED) { | |
| s6 = peg$parse__(); | |
| if (s6 !== peg$FAILED) { | |
| s7 = peg$parseUnaryExpression(); | |
| if (s7 !== peg$FAILED) { | |
| s4 = [s4, s5, s6, s7]; | |
| s3 = s4; | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| while (s3 !== peg$FAILED) { | |
| s2.push(s3); | |
| s3 = peg$currPos; | |
| s4 = peg$parse__(); | |
| if (s4 !== peg$FAILED) { | |
| s5 = peg$parseMultiplicativeOperator(); | |
| if (s5 !== peg$FAILED) { | |
| s6 = peg$parse__(); | |
| if (s6 !== peg$FAILED) { | |
| s7 = peg$parseUnaryExpression(); | |
| if (s7 !== peg$FAILED) { | |
| s4 = [s4, s5, s6, s7]; | |
| s3 = s4; | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } | |
| if (s2 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c113(s1, s2); | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| return s0; | |
| } | |
| function peg$parseMultiplicativeOperator() { | |
| var s0, s1, s2, s3; | |
| s0 = peg$currPos; | |
| if (input.charCodeAt(peg$currPos) === 42) { | |
| s1 = peg$c114; | |
| peg$currPos++; | |
| } else { | |
| s1 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c115); } | |
| } | |
| if (s1 === peg$FAILED) { | |
| if (input.charCodeAt(peg$currPos) === 47) { | |
| s1 = peg$c116; | |
| peg$currPos++; | |
| } else { | |
| s1 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c117); } | |
| } | |
| if (s1 === peg$FAILED) { | |
| if (input.charCodeAt(peg$currPos) === 37) { | |
| s1 = peg$c118; | |
| peg$currPos++; | |
| } else { | |
| s1 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c119); } | |
| } | |
| } | |
| } | |
| if (s1 !== peg$FAILED) { | |
| s2 = peg$currPos; | |
| peg$silentFails++; | |
| if (input.charCodeAt(peg$currPos) === 61) { | |
| s3 = peg$c120; | |
| peg$currPos++; | |
| } else { | |
| s3 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c121); } | |
| } | |
| peg$silentFails--; | |
| if (s3 === peg$FAILED) { | |
| s2 = peg$c7; | |
| } else { | |
| peg$currPos = s2; | |
| s2 = peg$c0; | |
| } | |
| if (s2 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c122(s1); | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| return s0; | |
| } | |
| function peg$parseAdditiveExpression() { | |
| var s0, s1, s2, s3, s4, s5, s6, s7; | |
| s0 = peg$currPos; | |
| s1 = peg$parseMultiplicativeExpression(); | |
| if (s1 !== peg$FAILED) { | |
| s2 = []; | |
| s3 = peg$currPos; | |
| s4 = peg$parse__(); | |
| if (s4 !== peg$FAILED) { | |
| s5 = peg$parseAdditiveOperator(); | |
| if (s5 !== peg$FAILED) { | |
| s6 = peg$parse__(); | |
| if (s6 !== peg$FAILED) { | |
| s7 = peg$parseMultiplicativeExpression(); | |
| if (s7 !== peg$FAILED) { | |
| s4 = [s4, s5, s6, s7]; | |
| s3 = s4; | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| while (s3 !== peg$FAILED) { | |
| s2.push(s3); | |
| s3 = peg$currPos; | |
| s4 = peg$parse__(); | |
| if (s4 !== peg$FAILED) { | |
| s5 = peg$parseAdditiveOperator(); | |
| if (s5 !== peg$FAILED) { | |
| s6 = peg$parse__(); | |
| if (s6 !== peg$FAILED) { | |
| s7 = peg$parseMultiplicativeExpression(); | |
| if (s7 !== peg$FAILED) { | |
| s4 = [s4, s5, s6, s7]; | |
| s3 = s4; | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } | |
| if (s2 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c113(s1, s2); | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| return s0; | |
| } | |
| function peg$parseAdditiveOperator() { | |
| var s0, s1, s2, s3; | |
| s0 = peg$currPos; | |
| if (input.charCodeAt(peg$currPos) === 43) { | |
| s1 = peg$c107; | |
| peg$currPos++; | |
| } else { | |
| s1 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c108); } | |
| } | |
| if (s1 !== peg$FAILED) { | |
| s2 = peg$currPos; | |
| peg$silentFails++; | |
| if (input.charCodeAt(peg$currPos) === 43) { | |
| s3 = peg$c107; | |
| peg$currPos++; | |
| } else { | |
| s3 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c108); } | |
| } | |
| if (s3 === peg$FAILED) { | |
| if (input.charCodeAt(peg$currPos) === 61) { | |
| s3 = peg$c120; | |
| peg$currPos++; | |
| } else { | |
| s3 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c121); } | |
| } | |
| } | |
| peg$silentFails--; | |
| if (s3 === peg$FAILED) { | |
| s2 = peg$c7; | |
| } else { | |
| peg$currPos = s2; | |
| s2 = peg$c0; | |
| } | |
| if (s2 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c123(); | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| if (s0 === peg$FAILED) { | |
| s0 = peg$currPos; | |
| if (input.charCodeAt(peg$currPos) === 45) { | |
| s1 = peg$c109; | |
| peg$currPos++; | |
| } else { | |
| s1 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c110); } | |
| } | |
| if (s1 !== peg$FAILED) { | |
| s2 = peg$currPos; | |
| peg$silentFails++; | |
| if (input.charCodeAt(peg$currPos) === 45) { | |
| s3 = peg$c109; | |
| peg$currPos++; | |
| } else { | |
| s3 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c110); } | |
| } | |
| if (s3 === peg$FAILED) { | |
| if (input.charCodeAt(peg$currPos) === 61) { | |
| s3 = peg$c120; | |
| peg$currPos++; | |
| } else { | |
| s3 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c121); } | |
| } | |
| } | |
| peg$silentFails--; | |
| if (s3 === peg$FAILED) { | |
| s2 = peg$c7; | |
| } else { | |
| peg$currPos = s2; | |
| s2 = peg$c0; | |
| } | |
| if (s2 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c124(); | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } | |
| return s0; | |
| } | |
| function peg$parseRelationalExpression() { | |
| var s0, s1, s2, s3, s4, s5, s6, s7; | |
| s0 = peg$currPos; | |
| s1 = peg$parseAdditiveExpression(); | |
| if (s1 !== peg$FAILED) { | |
| s2 = []; | |
| s3 = peg$currPos; | |
| s4 = peg$parse__(); | |
| if (s4 !== peg$FAILED) { | |
| s5 = peg$parseRelationalOperator(); | |
| if (s5 !== peg$FAILED) { | |
| s6 = peg$parse__(); | |
| if (s6 !== peg$FAILED) { | |
| s7 = peg$parseAdditiveExpression(); | |
| if (s7 !== peg$FAILED) { | |
| s4 = [s4, s5, s6, s7]; | |
| s3 = s4; | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| while (s3 !== peg$FAILED) { | |
| s2.push(s3); | |
| s3 = peg$currPos; | |
| s4 = peg$parse__(); | |
| if (s4 !== peg$FAILED) { | |
| s5 = peg$parseRelationalOperator(); | |
| if (s5 !== peg$FAILED) { | |
| s6 = peg$parse__(); | |
| if (s6 !== peg$FAILED) { | |
| s7 = peg$parseAdditiveExpression(); | |
| if (s7 !== peg$FAILED) { | |
| s4 = [s4, s5, s6, s7]; | |
| s3 = s4; | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } | |
| if (s2 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c113(s1, s2); | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| return s0; | |
| } | |
| function peg$parseRelationalOperator() { | |
| var s0; | |
| if (input.substr(peg$currPos, 2) === peg$c125) { | |
| s0 = peg$c125; | |
| peg$currPos += 2; | |
| } else { | |
| s0 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c126); } | |
| } | |
| if (s0 === peg$FAILED) { | |
| if (input.substr(peg$currPos, 2) === peg$c127) { | |
| s0 = peg$c127; | |
| peg$currPos += 2; | |
| } else { | |
| s0 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c128); } | |
| } | |
| if (s0 === peg$FAILED) { | |
| if (input.charCodeAt(peg$currPos) === 60) { | |
| s0 = peg$c129; | |
| peg$currPos++; | |
| } else { | |
| s0 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c130); } | |
| } | |
| if (s0 === peg$FAILED) { | |
| if (input.charCodeAt(peg$currPos) === 62) { | |
| s0 = peg$c131; | |
| peg$currPos++; | |
| } else { | |
| s0 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c132); } | |
| } | |
| } | |
| } | |
| } | |
| return s0; | |
| } | |
| function peg$parseEqualityExpression() { | |
| var s0, s1, s2, s3, s4, s5, s6, s7; | |
| s0 = peg$currPos; | |
| s1 = peg$parseRelationalExpression(); | |
| if (s1 !== peg$FAILED) { | |
| s2 = []; | |
| s3 = peg$currPos; | |
| s4 = peg$parse__(); | |
| if (s4 !== peg$FAILED) { | |
| s5 = peg$parseEqualityOperator(); | |
| if (s5 !== peg$FAILED) { | |
| s6 = peg$parse__(); | |
| if (s6 !== peg$FAILED) { | |
| s7 = peg$parseRelationalExpression(); | |
| if (s7 !== peg$FAILED) { | |
| s4 = [s4, s5, s6, s7]; | |
| s3 = s4; | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| while (s3 !== peg$FAILED) { | |
| s2.push(s3); | |
| s3 = peg$currPos; | |
| s4 = peg$parse__(); | |
| if (s4 !== peg$FAILED) { | |
| s5 = peg$parseEqualityOperator(); | |
| if (s5 !== peg$FAILED) { | |
| s6 = peg$parse__(); | |
| if (s6 !== peg$FAILED) { | |
| s7 = peg$parseRelationalExpression(); | |
| if (s7 !== peg$FAILED) { | |
| s4 = [s4, s5, s6, s7]; | |
| s3 = s4; | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } | |
| if (s2 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c113(s1, s2); | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| return s0; | |
| } | |
| function peg$parseEqualityOperator() { | |
| var s0; | |
| if (input.substr(peg$currPos, 2) === peg$c133) { | |
| s0 = peg$c133; | |
| peg$currPos += 2; | |
| } else { | |
| s0 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c134); } | |
| } | |
| if (s0 === peg$FAILED) { | |
| if (input.substr(peg$currPos, 2) === peg$c135) { | |
| s0 = peg$c135; | |
| peg$currPos += 2; | |
| } else { | |
| s0 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c136); } | |
| } | |
| } | |
| return s0; | |
| } | |
| function peg$parseLogicalANDExpression() { | |
| var s0, s1, s2, s3, s4, s5, s6, s7; | |
| s0 = peg$currPos; | |
| s1 = peg$parseEqualityExpression(); | |
| if (s1 !== peg$FAILED) { | |
| s2 = []; | |
| s3 = peg$currPos; | |
| s4 = peg$parse__(); | |
| if (s4 !== peg$FAILED) { | |
| s5 = peg$parseLogicalANDOperator(); | |
| if (s5 !== peg$FAILED) { | |
| s6 = peg$parse__(); | |
| if (s6 !== peg$FAILED) { | |
| s7 = peg$parseEqualityExpression(); | |
| if (s7 !== peg$FAILED) { | |
| s4 = [s4, s5, s6, s7]; | |
| s3 = s4; | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| while (s3 !== peg$FAILED) { | |
| s2.push(s3); | |
| s3 = peg$currPos; | |
| s4 = peg$parse__(); | |
| if (s4 !== peg$FAILED) { | |
| s5 = peg$parseLogicalANDOperator(); | |
| if (s5 !== peg$FAILED) { | |
| s6 = peg$parse__(); | |
| if (s6 !== peg$FAILED) { | |
| s7 = peg$parseEqualityExpression(); | |
| if (s7 !== peg$FAILED) { | |
| s4 = [s4, s5, s6, s7]; | |
| s3 = s4; | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } | |
| if (s2 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c113(s1, s2); | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| return s0; | |
| } | |
| function peg$parseLogicalANDOperator() { | |
| var s0, s1, s2, s3; | |
| s0 = peg$currPos; | |
| if (input.substr(peg$currPos, 2) === peg$c137) { | |
| s1 = peg$c137; | |
| peg$currPos += 2; | |
| } else { | |
| s1 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c138); } | |
| } | |
| if (s1 !== peg$FAILED) { | |
| s2 = peg$currPos; | |
| peg$silentFails++; | |
| if (input.charCodeAt(peg$currPos) === 61) { | |
| s3 = peg$c120; | |
| peg$currPos++; | |
| } else { | |
| s3 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c121); } | |
| } | |
| peg$silentFails--; | |
| if (s3 === peg$FAILED) { | |
| s2 = peg$c7; | |
| } else { | |
| peg$currPos = s2; | |
| s2 = peg$c0; | |
| } | |
| if (s2 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c139(); | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| return s0; | |
| } | |
| function peg$parseLogicalORExpression() { | |
| var s0, s1, s2, s3, s4, s5, s6, s7; | |
| s0 = peg$currPos; | |
| s1 = peg$parseLogicalANDExpression(); | |
| if (s1 !== peg$FAILED) { | |
| s2 = []; | |
| s3 = peg$currPos; | |
| s4 = peg$parse__(); | |
| if (s4 !== peg$FAILED) { | |
| s5 = peg$parseLogicalOROperator(); | |
| if (s5 !== peg$FAILED) { | |
| s6 = peg$parse__(); | |
| if (s6 !== peg$FAILED) { | |
| s7 = peg$parseLogicalANDExpression(); | |
| if (s7 !== peg$FAILED) { | |
| s4 = [s4, s5, s6, s7]; | |
| s3 = s4; | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| while (s3 !== peg$FAILED) { | |
| s2.push(s3); | |
| s3 = peg$currPos; | |
| s4 = peg$parse__(); | |
| if (s4 !== peg$FAILED) { | |
| s5 = peg$parseLogicalOROperator(); | |
| if (s5 !== peg$FAILED) { | |
| s6 = peg$parse__(); | |
| if (s6 !== peg$FAILED) { | |
| s7 = peg$parseLogicalANDExpression(); | |
| if (s7 !== peg$FAILED) { | |
| s4 = [s4, s5, s6, s7]; | |
| s3 = s4; | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s3; | |
| s3 = peg$c0; | |
| } | |
| } | |
| if (s2 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c113(s1, s2); | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| return s0; | |
| } | |
| function peg$parseLogicalOROperator() { | |
| var s0, s1, s2, s3; | |
| s0 = peg$currPos; | |
| if (input.substr(peg$currPos, 2) === peg$c140) { | |
| s1 = peg$c140; | |
| peg$currPos += 2; | |
| } else { | |
| s1 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c141); } | |
| } | |
| if (s1 !== peg$FAILED) { | |
| s2 = peg$currPos; | |
| peg$silentFails++; | |
| if (input.charCodeAt(peg$currPos) === 61) { | |
| s3 = peg$c120; | |
| peg$currPos++; | |
| } else { | |
| s3 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c121); } | |
| } | |
| peg$silentFails--; | |
| if (s3 === peg$FAILED) { | |
| s2 = peg$c7; | |
| } else { | |
| peg$currPos = s2; | |
| s2 = peg$c0; | |
| } | |
| if (s2 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c142(); | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| return s0; | |
| } | |
| function peg$parseExpression() { | |
| var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11; | |
| s0 = peg$currPos; | |
| if (input.substr(peg$currPos, 2) === peg$c143) { | |
| s1 = peg$c143; | |
| peg$currPos += 2; | |
| } else { | |
| s1 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c144); } | |
| } | |
| if (s1 !== peg$FAILED) { | |
| s2 = peg$parse__(); | |
| if (s2 !== peg$FAILED) { | |
| s3 = peg$parseLogicalORExpression(); | |
| if (s3 !== peg$FAILED) { | |
| s4 = peg$parse__(); | |
| if (s4 !== peg$FAILED) { | |
| if (input.substr(peg$currPos, 4) === peg$c145) { | |
| s5 = peg$c145; | |
| peg$currPos += 4; | |
| } else { | |
| s5 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c146); } | |
| } | |
| if (s5 !== peg$FAILED) { | |
| s6 = peg$parse__(); | |
| if (s6 !== peg$FAILED) { | |
| s7 = peg$parseExpression(); | |
| if (s7 !== peg$FAILED) { | |
| s8 = peg$parse__(); | |
| if (s8 !== peg$FAILED) { | |
| if (input.substr(peg$currPos, 4) === peg$c147) { | |
| s9 = peg$c147; | |
| peg$currPos += 4; | |
| } else { | |
| s9 = peg$FAILED; | |
| if (peg$silentFails === 0) { peg$fail(peg$c148); } | |
| } | |
| if (s9 !== peg$FAILED) { | |
| s10 = peg$parse__(); | |
| if (s10 !== peg$FAILED) { | |
| s11 = peg$parseExpression(); | |
| if (s11 !== peg$FAILED) { | |
| peg$reportedPos = s0; | |
| s1 = peg$c149(s3, s7, s11); | |
| s0 = s1; | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| } else { | |
| peg$currPos = s0; | |
| s0 = peg$c0; | |
| } | |
| if (s0 === peg$FAILED) { | |
| s0 = peg$parseLogicalORExpression(); | |
| } | |
| return s0; | |
| } | |
| peg$result = peg$startRuleFunction(); | |
| if (peg$result !== peg$FAILED && peg$currPos === input.length) { | |
| return peg$result; | |
| } else { | |
| if (peg$result !== peg$FAILED && peg$currPos < input.length) { | |
| peg$fail({ type: "end", description: "end of input" }); | |
| } | |
| throw peg$buildException(null, peg$maxFailExpected, peg$maxFailPos); | |
| } | |
| } | |
| return { | |
| SyntaxError: SyntaxError, | |
| parse: parse | |
| }; | |
| }]); | |
| })(); | |
| // Copyright 2014 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| // This directive can only be used in the context of an exploration. | |
| oppia.directive('filepathEditor', [ | |
| '$compile', '$http', '$sce', 'alertsService', 'explorationContextService', | |
| 'OBJECT_EDITOR_URL_PREFIX', | |
| function( | |
| $compile, $http, $sce, alertsService, explorationContextService, | |
| OBJECT_EDITOR_URL_PREFIX) { | |
| return { | |
| link: function(scope, element) { | |
| scope.getTemplateUrl = function() { | |
| return OBJECT_EDITOR_URL_PREFIX + 'Filepath'; | |
| }; | |
| $compile(element.contents())(scope); | |
| }, | |
| restrict: 'E', | |
| scope: true, | |
| template: '<div ng-include="getTemplateUrl()"></div>', | |
| controller: function($scope) { | |
| // Reset the component each time the value changes (e.g. if this is part | |
| // of an editable list). | |
| $scope.$watch('$parent.value', function(newValue) { | |
| $scope.localValue = { | |
| label: newValue || '' | |
| }; | |
| $scope.imageUploaderIsActive = false; | |
| }); | |
| $scope.explorationId = explorationContextService.getExplorationId(); | |
| $scope.validate = function(localValue) { | |
| return localValue.label && localValue.label.length > 0; | |
| }; | |
| $scope.$watch('localValue.label', function(newValue) { | |
| if (newValue) { | |
| alertsService.clearWarnings(); | |
| $scope.localValue = { | |
| label: newValue | |
| }; | |
| $scope.$parent.value = newValue; | |
| } | |
| }); | |
| $scope.getPreviewUrl = function(filepath) { | |
| var encodedFilepath = window.encodeURIComponent(filepath); | |
| return $sce.trustAsResourceUrl( | |
| '/imagehandler/' + $scope.explorationId + '/' + encodedFilepath); | |
| }; | |
| $scope.resetImageUploader = function() { | |
| $scope.currentFile = null; | |
| $scope.currentFilename = null; | |
| $scope.imagePreview = null; | |
| }; | |
| $scope.openImageUploader = function() { | |
| $scope.resetImageUploader(); | |
| $scope.uploadWarning = null; | |
| $scope.imageUploaderIsActive = true; | |
| }; | |
| $scope.closeImageUploader = function() { | |
| $scope.imageUploaderIsActive = false; | |
| }; | |
| $scope.onFileChanged = function(file, filename) { | |
| if (!file || !file.size || !file.type.match('image.*')) { | |
| $scope.uploadWarning = 'This file is not recognized as an image.'; | |
| $scope.resetImageUploader(); | |
| $scope.$apply(); | |
| return; | |
| } | |
| $scope.currentFile = file; | |
| $scope.currentFilename = filename; | |
| $scope.uploadWarning = null; | |
| var reader = new FileReader(); | |
| reader.onload = function(e) { | |
| $scope.$apply(function() { | |
| $scope.imagePreview = e.target.result; | |
| }); | |
| }; | |
| reader.readAsDataURL(file); | |
| $scope.$apply(); | |
| }; | |
| $scope.saveUploadedFile = function(file, filename) { | |
| alertsService.clearWarnings(); | |
| if (!file || !file.size) { | |
| alertsService.addWarning('Empty file detected.'); | |
| return; | |
| } | |
| if (!file.type.match('image.*')) { | |
| alertsService.addWarning( | |
| 'This file is not recognized as an image.'); | |
| return; | |
| } | |
| if (!filename) { | |
| alertsService.addWarning('Filename must not be empty.'); | |
| return; | |
| } | |
| var form = new FormData(); | |
| form.append('image', file); | |
| form.append('payload', JSON.stringify({ | |
| filename: filename | |
| })); | |
| form.append('csrf_token', GLOBALS.csrf_token); | |
| $.ajax({ | |
| url: '/createhandler/imageupload/' + $scope.explorationId, | |
| data: form, | |
| processData: false, | |
| contentType: false, | |
| type: 'POST', | |
| dataFilter: function(data) { | |
| // Remove the XSSI prefix. | |
| var transformedData = data.substring(5); | |
| return JSON.parse(transformedData); | |
| }, | |
| dataType: 'text' | |
| }).done(function(data) { | |
| var inputElement = $('#newImage'); | |
| $scope.filepaths.push(data.filepath); | |
| $scope.closeImageUploader(); | |
| $scope.localValue.label = data.filepath; | |
| $scope.$apply(); | |
| }).fail(function(data) { | |
| // Remove the XSSI prefix. | |
| var transformedData = data.responseText.substring(5); | |
| var parsedResponse = JSON.parse(transformedData); | |
| alertsService.addWarning( | |
| parsedResponse.error || 'Error communicating with server.'); | |
| $scope.$apply(); | |
| }); | |
| }; | |
| $scope.filepathsLoaded = false; | |
| $http.get( | |
| '/createhandler/resource_list/' + $scope.explorationId | |
| ).then(function(response) { | |
| $scope.filepaths = response.data.filepaths; | |
| $scope.filepathsLoaded = true; | |
| }); | |
| } | |
| }; | |
| } | |
| ]); | |
| // Copyright 2014 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| // Every editor directive should implement an alwaysEditable option. There | |
| // may be additional customization options for the editor that should be passed | |
| // in via initArgs. | |
| oppia.directive('graphEditor', [ | |
| '$compile', 'OBJECT_EDITOR_URL_PREFIX', | |
| function($compile, OBJECT_EDITOR_URL_PREFIX) { | |
| return { | |
| link: function(scope, element) { | |
| scope.getTemplateUrl = function() { | |
| return OBJECT_EDITOR_URL_PREFIX + 'Graph'; | |
| }; | |
| $compile(element.contents())(scope); | |
| }, | |
| restrict: 'E', | |
| scope: true, | |
| template: '<div ng-include="getTemplateUrl()"></div>', | |
| controller: function($scope) { | |
| $scope.alwaysEditable = true; | |
| } | |
| }; | |
| }]); | |
| // Copyright 2014 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| // Every editor directive should implement an alwaysEditable option. There | |
| // may be additional customization options for the editor that should be passed | |
| // in via initArgs. | |
| // | |
| // This directive is based on the UnicodeString directive. | |
| oppia.directive('htmlEditor', [ | |
| '$compile', 'OBJECT_EDITOR_URL_PREFIX', | |
| function($compile, OBJECT_EDITOR_URL_PREFIX) { | |
| return { | |
| link: function(scope, element) { | |
| scope.getTemplateUrl = function() { | |
| return OBJECT_EDITOR_URL_PREFIX + 'Html'; | |
| }; | |
| $compile(element.contents())(scope); | |
| }, | |
| restrict: 'E', | |
| scope: true, | |
| template: '<div ng-include="getTemplateUrl()"></div>', | |
| controller: function($scope) { | |
| $scope.schema = { | |
| type: 'html' | |
| }; | |
| } | |
| }; | |
| }]); | |
| // Copyright 2012 Google Inc. All Rights Reserved. | |
| // | |
| // 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. | |
| // Every editor directive should implement an alwaysEditable option. There | |
| // may be additional customization options for the editor that should be passed | |
| // in via initArgs. | |
| oppia.directive('nonnegativeIntEditor', [ | |
| '$compile', 'OBJECT_EDITOR_URL_PREFIX', | |
| function($compile, OBJECT_EDITOR_URL_PREFIX) { | |
| return { | |
| link: function(scope, element) { | |
| scope.getTemplateUrl = function() { | |
| return OBJECT_EDITOR_URL_PREFIX + 'NonnegativeInt'; | |
| }; | |
| $compile(element.contents())(scope); | |
| }, | |
| restrict: 'E', | |
| scope: true, | |
| template: '<span ng-include="getTemplateUrl()"></span>', | |
| controller: function($scope) { | |
| $scope.SCHEMA = { | |
| type: 'int', | |
| validators: [{ | |
| id: 'is_at_least', | |
| min_value: 0 | |
| }] | |
| }; | |
| if (!$scope.$parent.value) { | |
| $scope.$parent.value = 0; | |
| } | |
| } | |
| }; | |
| }]); | |
| // Copyright 2014 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| oppia.directive('coordTwoDimEditor', [ | |
| '$compile', 'OBJECT_EDITOR_URL_PREFIX', | |
| function($compile, OBJECT_EDITOR_URL_PREFIX) { | |
| return { | |
| controller: function($scope, $timeout) { | |
| $scope.schemaLatitude = { | |
| type: 'float', | |
| validators: [{ | |
| id: 'is_at_least', | |
| min_value: -90.0 | |
| }, { | |
| id: 'is_at_most', | |
| max_value: 90.0 | |
| }] | |
| }; | |
| $scope.schemaLongitude = { | |
| type: 'float', | |
| validators: [{ | |
| id: 'is_at_least', | |
| min_value: -180.0 | |
| }, { | |
| id: 'is_at_most', | |
| max_value: 180.0 | |
| }] | |
| }; | |
| var updateMarker = function(lat, lng) { | |
| var latLng = new google.maps.LatLng(lat, lng); | |
| $timeout(function() { | |
| if ($scope.mapMarker) { | |
| $scope.mapMarker.setPosition(latLng); | |
| } else { | |
| $scope.mapMarker = new google.maps.Marker({ | |
| map: $scope.map, | |
| position: latLng | |
| }); | |
| } | |
| }, 10); | |
| }; | |
| $scope.$watch('$parent.value', function(newValue, oldValue) { | |
| // A new rule has just been created. | |
| if ($scope.$parent.value === '') { | |
| $scope.$parent.value = [0.0, 0.0]; | |
| } | |
| if (!angular.equals(newValue, oldValue)) { | |
| updateMarker(newValue[0], newValue[1]); | |
| } | |
| }); | |
| // A new rule has just been created. | |
| if ($scope.$parent.value === '') { | |
| $scope.$parent.value = [0.0, 0.0]; | |
| } | |
| // This is required in order to avoid the following bug: | |
| // http://stackoverflow.com/q/18769287 | |
| $timeout(function() { | |
| updateMarker($scope.$parent.value[0], $scope.$parent.value[1]); | |
| if ($scope.map) { | |
| google.maps.event.trigger($scope.map, 'resize'); | |
| } | |
| }, 100); | |
| $scope.mapOptions = { | |
| center: new google.maps.LatLng( | |
| $scope.$parent.value[0], | |
| $scope.$parent.value[1] | |
| ), | |
| mapTypeId: google.maps.MapTypeId.ROADMAP, | |
| zoom: 0 | |
| }; | |
| $scope.registerClick = function($event, $params) { | |
| var latLng = $params[0].latLng; | |
| updateMarker(latLng.lat(), latLng.lng()); | |
| $scope.$parent.value = [latLng.lat(), latLng.lng()]; | |
| }; | |
| }, | |
| link: function(scope, element) { | |
| scope.getTemplateUrl = function() { | |
| return OBJECT_EDITOR_URL_PREFIX + 'CoordTwoDim'; | |
| }; | |
| $compile(element.contents())(scope); | |
| }, | |
| restrict: 'E', | |
| scope: true, | |
| template: '<span ng-include="getTemplateUrl()"></span>' | |
| }; | |
| }]); | |
| // Copyright 2014 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| // Every editor directive should implement an alwaysEditable option. There | |
| // may be additional customization options for the editor that should be passed | |
| // in via initArgs. | |
| oppia.directive('graphPropertyEditor', [ | |
| '$compile', 'OBJECT_EDITOR_URL_PREFIX', | |
| function($compile, OBJECT_EDITOR_URL_PREFIX) { | |
| return { | |
| link: function(scope, element) { | |
| scope.getTemplateUrl = function() { | |
| return OBJECT_EDITOR_URL_PREFIX + 'GraphProperty'; | |
| }; | |
| $compile(element.contents())(scope); | |
| }, | |
| restrict: 'E', | |
| scope: true, | |
| template: '<span ng-include="getTemplateUrl()"></span>', | |
| controller: function($scope) { | |
| $scope.alwaysEditable = true; | |
| $scope.graphProperties = [{ | |
| name: 'regular', | |
| humanReadableName: 'regular' | |
| }, { | |
| name: 'acyclic', | |
| humanReadableName: 'acyclic' | |
| }, { | |
| name: 'strongly_connected', | |
| humanReadableName: 'strongly connected' | |
| }, { | |
| name: 'weakly_connected', | |
| humanReadableName: 'weakly connected' | |
| }]; | |
| $scope.localValue = { | |
| property: $scope.graphProperties[0] | |
| }; | |
| for (var i = 0; i < $scope.graphProperties.length; i++) { | |
| if ($scope.graphProperties[i].name === $scope.$parent.value) { | |
| $scope.localValue.property = $scope.graphProperties[i]; | |
| } | |
| } | |
| $scope.$watch('localValue.property', function() { | |
| $scope.$parent.value = $scope.localValue.property.name; | |
| }); | |
| } | |
| }; | |
| }]); | |
| // Copyright 2014 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| oppia.directive('realEditor', [ | |
| '$compile', 'OBJECT_EDITOR_URL_PREFIX', | |
| function($compile, OBJECT_EDITOR_URL_PREFIX) { | |
| return { | |
| link: function(scope, element) { | |
| scope.getTemplateUrl = function() { | |
| return OBJECT_EDITOR_URL_PREFIX + 'Real'; | |
| }; | |
| $compile(element.contents())(scope); | |
| }, | |
| restrict: 'E', | |
| scope: true, | |
| template: '<span ng-include="getTemplateUrl()"></span>', | |
| controller: function($scope) { | |
| $scope.schema = { | |
| type: 'float' | |
| }; | |
| $scope.$watch('$parent.value', function() { | |
| if ($scope.$parent.value === '') { | |
| // A new rule | |
| $scope.$parent.value = 0.0; | |
| } | |
| }); | |
| if ($scope.$parent.value === '') { | |
| $scope.$parent.value = 0.0; | |
| } | |
| } | |
| }; | |
| }]); | |
| // Copyright 2014 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| // Every editor directive should implement an alwaysEditable option. There | |
| // may be additional customization options for the editor that should be passed | |
| // in via initArgs. | |
| oppia.directive('logicErrorCategoryEditor', [ | |
| '$compile', 'OBJECT_EDITOR_URL_PREFIX', | |
| function($compile, OBJECT_EDITOR_URL_PREFIX) { | |
| return { | |
| link: function(scope, element) { | |
| scope.getTemplateUrl = function() { | |
| return OBJECT_EDITOR_URL_PREFIX + 'LogicErrorCategory'; | |
| }; | |
| $compile(element.contents())(scope); | |
| }, | |
| restrict: 'E', | |
| scope: true, | |
| template: '<span ng-include="getTemplateUrl()"></span>', | |
| controller: function($scope) { | |
| $scope.alwaysEditable = true; | |
| $scope.errorCategories = [{ | |
| name: 'parsing', | |
| humanReadable: 'Unparseable' | |
| }, { | |
| name: 'typing', | |
| humanReadable: 'Ill-typed' | |
| }, { | |
| name: 'line', | |
| humanReadable: 'Incorrect line' | |
| }, { | |
| name: 'layout', | |
| humanReadable: 'Wrong indenting' | |
| }, { | |
| name: 'variables', | |
| humanReadable: 'Variables error' | |
| }, { | |
| name: 'logic', | |
| humanReadable: 'Invalid deduction' | |
| }, { | |
| name: 'target', | |
| humanReadable: 'Target not proved' | |
| }, { | |
| name: 'mistake', | |
| humanReadable: 'Unspecified' | |
| }]; | |
| $scope.localValue = { | |
| category: $scope.errorCategories[0] | |
| }; | |
| for (var i = 0; i < $scope.errorCategories.length; i++) { | |
| if ($scope.errorCategories[i].name === $scope.$parent.value) { | |
| $scope.localValue.category = $scope.errorCategories[i]; | |
| } | |
| } | |
| $scope.$watch('localValue.category', function() { | |
| $scope.$parent.value = $scope.localValue.category.name; | |
| }); | |
| } | |
| }; | |
| }]); | |
| // Copyright 2014 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| // Every editor directive should implement an alwaysEditable option. There | |
| // may be additional customization options for the editor that should be passed | |
| // in via initArgs. | |
| oppia.directive('logicQuestionEditor', [ | |
| '$compile', 'OBJECT_EDITOR_URL_PREFIX', | |
| function($compile, OBJECT_EDITOR_URL_PREFIX) { | |
| return { | |
| link: function(scope, element) { | |
| scope.getTemplateUrl = function() { | |
| return OBJECT_EDITOR_URL_PREFIX + 'LogicQuestion'; | |
| }; | |
| $compile(element.contents())(scope); | |
| }, | |
| restrict: 'E', | |
| scope: true, | |
| template: '<span ng-include="getTemplateUrl()"></span>', | |
| controller: function($scope) { | |
| $scope.alwaysEditable = true; | |
| $scope.localValue = { | |
| assumptionsString: logicProofShared.displayExpressionArray( | |
| $scope.$parent.value.assumptions, | |
| logicProofData.BASE_STUDENT_LANGUAGE.operators), | |
| targetString: logicProofShared.displayExpression( | |
| $scope.$parent.value.results[0], | |
| logicProofData.BASE_STUDENT_LANGUAGE.operators), | |
| errorMessage: '', | |
| proofString: $scope.$parent.value.default_proof_string | |
| }; | |
| // NOTE: we use ng-change rather than $watch because the latter runs in | |
| // response to any change to the watched value, and we only want to | |
| // respond to changes made by the user. | |
| $scope.changeAssumptions = function() { | |
| $scope.convertThenBuild( | |
| 'logicQuestionAssumptions', 'assumptionsString'); | |
| }; | |
| $scope.changeTarget = function() { | |
| $scope.convertThenBuild('logicQuestionTarget', 'targetString'); | |
| }; | |
| $scope.changeProof = function() { | |
| $scope.convertThenBuild('logicQuestionProof', 'proofString'); | |
| }; | |
| $scope.convertThenBuild = function(elementID, nameOfString) { | |
| var element = document.getElementById(elementID); | |
| var cursorPosition = element.selectionEnd; | |
| $scope.localValue[nameOfString] = | |
| logicProofConversion.convertToLogicCharacters( | |
| $scope.localValue[nameOfString]); | |
| $scope.buildQuestion(); | |
| // NOTE: angular will reset the position of the cursor after this | |
| // function runs, so we need to delay our re-resetting. | |
| setTimeout(function() { | |
| element.selectionEnd = cursorPosition; | |
| }, 2); | |
| }; | |
| $scope.buildQuestion = function() { | |
| try { | |
| builtQuestion = angular.copy( | |
| logicProofTeacher.buildQuestion( | |
| $scope.localValue.assumptionsString, | |
| $scope.localValue.targetString, | |
| LOGIC_PROOF_DEFAULT_QUESTION_DATA.vocabulary)); | |
| $scope.$parent.value = { | |
| assumptions: builtQuestion.assumptions, | |
| results: builtQuestion.results, | |
| default_proof_string: $scope.localValue.proofString | |
| }; | |
| $scope.localValue.errorMessage = ''; | |
| } catch (err) { | |
| $scope.localValue.errorMessage = err.message; | |
| } | |
| }; | |
| } | |
| }; | |
| }]); | |
| // Copyright 2014 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| // This is a copy of the UnicodeStringEditor. | |
| oppia.directive('normalizedStringEditor', [ | |
| '$compile', 'OBJECT_EDITOR_URL_PREFIX', | |
| function($compile, OBJECT_EDITOR_URL_PREFIX) { | |
| return { | |
| link: function(scope, element) { | |
| scope.getTemplateUrl = function() { | |
| return OBJECT_EDITOR_URL_PREFIX + 'NormalizedString'; | |
| }; | |
| $compile(element.contents())(scope); | |
| }, | |
| restrict: 'E', | |
| scope: true, | |
| template: '<span ng-include="getTemplateUrl()"></span>', | |
| controller: function($scope) { | |
| $scope.alwaysEditable = $scope.$parent.alwaysEditable; | |
| $scope.largeInput = false; | |
| $scope.$watch('$parent.initArgs', function(newValue) { | |
| $scope.largeInput = false; | |
| if (newValue && newValue.largeInput) { | |
| $scope.largeInput = newValue.largeInput; | |
| } | |
| }); | |
| // Reset the component each time the value changes (e.g. if this is part | |
| // of an editable list). | |
| $scope.$watch('$parent.value', function() { | |
| $scope.localValue = { | |
| label: $scope.$parent.value || '' | |
| }; | |
| }, true); | |
| if ($scope.alwaysEditable) { | |
| $scope.$watch('localValue.label', function(newValue) { | |
| $scope.$parent.value = newValue; | |
| }); | |
| } else { | |
| $scope.openEditor = function() { | |
| $scope.active = true; | |
| }; | |
| $scope.closeEditor = function() { | |
| $scope.active = false; | |
| }; | |
| $scope.replaceValue = function(newValue) { | |
| $scope.localValue = { | |
| label: newValue | |
| }; | |
| $scope.$parent.value = newValue; | |
| $scope.closeEditor(); | |
| }; | |
| $scope.$on('externalSave', function() { | |
| if ($scope.active) { | |
| $scope.replaceValue($scope.localValue.label); | |
| // The $scope.$apply() call is needed to propagate the replaced | |
| // value. | |
| $scope.$apply(); | |
| } | |
| }); | |
| $scope.closeEditor(); | |
| } | |
| } | |
| }; | |
| }]); | |
| // Copyright 2012 Google Inc. All Rights Reserved. | |
| // | |
| // 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. | |
| // This directive is always editable. | |
| oppia.directive('musicPhraseEditor', [ | |
| '$compile', 'OBJECT_EDITOR_URL_PREFIX', 'alertsService', | |
| function($compile, OBJECT_EDITOR_URL_PREFIX, alertsService) { | |
| return { | |
| link: function(scope, element) { | |
| scope.getTemplateUrl = function() { | |
| return OBJECT_EDITOR_URL_PREFIX + 'MusicPhrase'; | |
| }; | |
| $compile(element.contents())(scope); | |
| }, | |
| restrict: 'E', | |
| scope: true, | |
| template: '<div ng-include="getTemplateUrl()"></div>', | |
| controller: ['$scope', function($scope) { | |
| // The maximum number of notes allowed in a music phrase. | |
| var _MAX_NOTES_IN_PHRASE = 8; | |
| $scope.schema = { | |
| type: 'list', | |
| items: { | |
| type: 'unicode', | |
| choices: [ | |
| 'C4', 'D4', 'E4', 'F4', 'G4', 'A4', 'B4', 'C5', 'D5', 'E5', 'F5', | |
| 'G5', 'A5' | |
| ] | |
| }, | |
| ui_config: { | |
| add_element_text: 'Add Note \u2669' | |
| }, | |
| validators: [{ | |
| id: 'has_length_at_most', | |
| max_value: _MAX_NOTES_IN_PHRASE | |
| }] | |
| }; | |
| // Reset the component each time the value changes (e.g. if this is part | |
| // of an editable list). | |
| $scope.$watch('$parent.value', function(newValue) { | |
| // TODO(sll): Check that $scope.$parent.value is a list. | |
| $scope.localValue = []; | |
| if (newValue) { | |
| for (var i = 0; i < newValue.length; i++) { | |
| $scope.localValue.push(newValue[i].readableNoteName); | |
| } | |
| } | |
| }, true); | |
| $scope.$watch('localValue', function(newValue, oldValue) { | |
| if (newValue && oldValue) { | |
| if (newValue.length > _MAX_NOTES_IN_PHRASE) { | |
| alertsService.addWarning('There are too many notes on the staff.'); | |
| } else { | |
| var parentValues = []; | |
| for (var i = 0; i < newValue.length; i++) { | |
| parentValues.push({ | |
| readableNoteName: newValue[i], | |
| noteDuration: { | |
| num: 1, | |
| den: 1 | |
| } | |
| }); | |
| } | |
| $scope.$parent.value = parentValues; | |
| } | |
| } | |
| }, true); | |
| }] | |
| }; | |
| }]); | |
| // Copyright 2014 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| // Every editor directive should implement an alwaysEditable option. There | |
| // may be additional customization options for the editor that should be passed | |
| // in via initArgs. | |
| oppia.directive('listOfUnicodeStringEditor', [ | |
| '$compile', 'OBJECT_EDITOR_URL_PREFIX', | |
| function($compile, OBJECT_EDITOR_URL_PREFIX) { | |
| return { | |
| link: function(scope, element) { | |
| scope.getTemplateUrl = function() { | |
| return OBJECT_EDITOR_URL_PREFIX + 'ListOfUnicodeString'; | |
| }; | |
| $compile(element.contents())(scope); | |
| }, | |
| restrict: 'E', | |
| scope: true, | |
| template: '<div ng-include="getTemplateUrl()"></div>', | |
| controller: function($scope) { | |
| $scope.SCHEMA = { | |
| type: 'list', | |
| items: { | |
| type: 'unicode' | |
| } | |
| }; | |
| if (!$scope.$parent.value) { | |
| $scope.$parent.value = []; | |
| } | |
| } | |
| }; | |
| }]); | |
| // Copyright 2014 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| // Every editor directive should implement an alwaysEditable option. There | |
| // may be additional customization options for the editor that should be passed | |
| // in via initArgs. | |
| oppia.directive('mathLatexStringEditor', [ | |
| '$compile', 'OBJECT_EDITOR_URL_PREFIX', | |
| function($compile, OBJECT_EDITOR_URL_PREFIX) { | |
| return { | |
| link: function(scope, element) { | |
| scope.getTemplateUrl = function() { | |
| return OBJECT_EDITOR_URL_PREFIX + 'MathLatexString'; | |
| }; | |
| $compile(element.contents())(scope); | |
| }, | |
| restrict: 'E', | |
| scope: true, | |
| template: '<span ng-include="getTemplateUrl()"></span>', | |
| controller: function($scope) { | |
| $scope.alwaysEditable = $scope.$parent.alwaysEditable; | |
| // Reset the component each time the value changes (e.g. if this is part | |
| // of an editable list). | |
| $scope.$watch('$parent.value', function() { | |
| $scope.localValue = { | |
| label: $scope.$parent.value || '' | |
| }; | |
| }, true); | |
| if ($scope.alwaysEditable) { | |
| $scope.$watch('localValue.label', function(newValue) { | |
| $scope.$parent.value = newValue; | |
| }); | |
| } else { | |
| $scope.openEditor = function() { | |
| $scope.active = true; | |
| }; | |
| $scope.closeEditor = function() { | |
| $scope.active = false; | |
| }; | |
| $scope.replaceValue = function(newValue) { | |
| $scope.localValue = { | |
| label: newValue | |
| }; | |
| $scope.$parent.value = newValue; | |
| $scope.closeEditor(); | |
| }; | |
| $scope.$on('externalSave', function() { | |
| if ($scope.active) { | |
| $scope.replaceValue($scope.localValue.label); | |
| // The $scope.$apply() call is needed to propagate the replaced | |
| // value. | |
| $scope.$apply(); | |
| } | |
| }); | |
| $scope.closeEditor(); | |
| } | |
| } | |
| }; | |
| } | |
| ]); | |
| // Copyright 2014 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| // This directive is based on the unicodeStringEditor one. | |
| oppia.directive('sanitizedUrlEditor', [ | |
| '$compile', 'OBJECT_EDITOR_URL_PREFIX', | |
| function($compile, OBJECT_EDITOR_URL_PREFIX) { | |
| // Editable URL directive. | |
| return { | |
| link: function(scope, element) { | |
| scope.getTemplateUrl = function() { | |
| return OBJECT_EDITOR_URL_PREFIX + 'SanitizedUrl'; | |
| }; | |
| $compile(element.contents())(scope); | |
| }, | |
| restrict: 'E', | |
| scope: true, | |
| template: '<span ng-include="getTemplateUrl()"></span>', | |
| controller: function($scope) { | |
| $scope.$watch('$parent.initArgs', function(newValue) { | |
| $scope.largeInput = false; | |
| if (newValue && newValue.largeInput) { | |
| $scope.largeInput = newValue.largeInput; | |
| } | |
| }); | |
| $scope.$watch('$parent.value', function(newValue) { | |
| $scope.localValue = { | |
| label: String(newValue) || '' | |
| }; | |
| }, true); | |
| $scope.alwaysEditable = true; | |
| $scope.$watch('localValue.label', function(newValue) { | |
| $scope.$parent.value = newValue; | |
| }); | |
| $scope.$on('externalSave', function() { | |
| var currentValue = String($scope.localValue.label); | |
| if ($scope.active) { | |
| $scope.replaceValue(currentValue); | |
| // The $scope.$apply() call is needed to propagate the replaced | |
| // value. | |
| $scope.$apply(); | |
| } | |
| }); | |
| } | |
| }; | |
| }]); | |
| // Copyright 2014 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| // Every editor directive should implement an alwaysEditable option. There | |
| // may be additional customization options for the editor that should be passed | |
| // in via initArgs. | |
| oppia.directive('setOfUnicodeStringEditor', [ | |
| '$compile', 'OBJECT_EDITOR_URL_PREFIX', | |
| function($compile, OBJECT_EDITOR_URL_PREFIX) { | |
| return { | |
| link: function(scope, element) { | |
| scope.getTemplateUrl = function() { | |
| return OBJECT_EDITOR_URL_PREFIX + 'SetOfUnicodeString'; | |
| }; | |
| $compile(element.contents())(scope); | |
| }, | |
| restrict: 'E', | |
| scope: true, | |
| template: '<div ng-include="getTemplateUrl()"></div>', | |
| controller: function($scope) { | |
| $scope.SCHEMA = { | |
| type: 'list', | |
| items: { | |
| type: 'unicode' | |
| }, | |
| validators: [{ | |
| id: 'is_uniquified' | |
| }] | |
| }; | |
| if (!$scope.$parent.value) { | |
| $scope.$parent.value = []; | |
| } | |
| } | |
| }; | |
| }]); | |
| // Copyright 2012 Google Inc. All Rights Reserved. | |
| // | |
| // 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. | |
| // Every editor directive should implement an alwaysEditable option. There | |
| // may be additional customization options for the editor that should be passed | |
| // in via initArgs. | |
| oppia.directive('setOfHtmlStringEditor', [ | |
| '$compile', 'OBJECT_EDITOR_URL_PREFIX', | |
| function($compile, OBJECT_EDITOR_URL_PREFIX) { | |
| return { | |
| link: function(scope, element) { | |
| scope.getTemplateUrl = function() { | |
| return OBJECT_EDITOR_URL_PREFIX + 'SetOfHtmlString'; | |
| }; | |
| $compile(element.contents())(scope); | |
| }, | |
| restrict: 'E', | |
| scope: true, | |
| template: '<span ng-include="getTemplateUrl()"></span>', | |
| controller: function($scope) { | |
| $scope.SCHEMA = { | |
| type: 'list', | |
| items: { | |
| type: 'html' | |
| } | |
| }; | |
| if (!$scope.$parent.value) { | |
| $scope.$parent.value = []; | |
| } | |
| $scope.choices = $scope.initArgs.choices; | |
| $scope.selections = $scope.choices.map(function(choice) { | |
| return $scope.$parent.value.indexOf(choice.id) !== -1; | |
| }); | |
| // The following function is necessary to insert elements into the answer | |
| // groups for the Item Selection Widget. | |
| $scope.toggleSelection = function(choiceListIndex) { | |
| var choiceHtml = $scope.choices[choiceListIndex].id; | |
| var selectedChoicesIndex = $scope.$parent.value.indexOf(choiceHtml); | |
| if (selectedChoicesIndex > -1) { | |
| $scope.$parent.value.splice(selectedChoicesIndex, 1); | |
| } else { | |
| $scope.$parent.value.push(choiceHtml); | |
| } | |
| }; | |
| } | |
| }; | |
| }]); | |
| // Copyright 2014 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| // NOTE TO DEVELOPERS: This editor requires explorationParamSpecsService to be | |
| // available in the context in which it is used. | |
| oppia.directive('parameterNameEditor', [ | |
| '$compile', 'OBJECT_EDITOR_URL_PREFIX', | |
| function($compile, OBJECT_EDITOR_URL_PREFIX) { | |
| return { | |
| link: function(scope, element) { | |
| scope.getTemplateUrl = function() { | |
| return OBJECT_EDITOR_URL_PREFIX + 'ParameterName'; | |
| }; | |
| $compile(element.contents())(scope); | |
| }, | |
| restrict: 'E', | |
| scope: true, | |
| template: '<span ng-include="getTemplateUrl()"></span>', | |
| controller: [ | |
| '$scope', '$attrs', 'explorationParamSpecsService', | |
| function($scope, $attrs, explorationParamSpecsService) { | |
| $scope.availableParamNames = Object.keys( | |
| explorationParamSpecsService.savedMemento); | |
| if ($scope.availableParamNames.length === 0) { | |
| $scope.localValue = null; | |
| } else { | |
| $scope.localValue = $scope.availableParamNames[0]; | |
| } | |
| $scope.validate = function() { | |
| return ($scope.availableParamNames.length === 0) ? false : true; | |
| }; | |
| $scope.SCHEMA = { | |
| type: 'unicode', | |
| choices: $scope.availableParamNames | |
| }; | |
| // Reset the component each time the value changes (e.g. if this is | |
| // part of an editable list). | |
| $scope.$watch('$parent.value', function(newValue) { | |
| if (newValue) { | |
| $scope.localValue = newValue; | |
| } | |
| }, true); | |
| $scope.$watch('localValue', function(newValue) { | |
| $scope.$parent.value = newValue; | |
| }); | |
| } | |
| ] | |
| }; | |
| } | |
| ]); | |
| // Copyright 2014 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| // Every editor directive should implement an alwaysEditable option. There | |
| // may be additional customization options for the editor that should be passed | |
| // in via initArgs. | |
| // TODO(czx): Uniquify the labels of image regions | |
| oppia.directive('imageWithRegionsEditor', [ | |
| '$sce', '$compile', 'alertsService', '$document', 'explorationContextService', | |
| 'OBJECT_EDITOR_URL_PREFIX', | |
| function($sce, $compile, alertsService, $document, explorationContextService, | |
| OBJECT_EDITOR_URL_PREFIX) { | |
| return { | |
| link: function(scope, element) { | |
| scope.getTemplateUrl = function() { | |
| return OBJECT_EDITOR_URL_PREFIX + 'ImageWithRegions'; | |
| }; | |
| $compile(element.contents())(scope); | |
| }, | |
| restrict: 'E', | |
| scope: true, | |
| template: '<div ng-include="getTemplateUrl()"></div>', | |
| controller: function($scope, $element) { | |
| $scope.alwaysEditable = true; | |
| $scope.REGION_LABEL_OFFSET_X = 6; | |
| $scope.REGION_LABEL_OFFSET_Y = 18; | |
| $scope.REGION_LABEL_STYLE = ( | |
| 'fill: white; font-size: large; pointer-events: none;'); | |
| $scope.SELECTED_REGION_STYLE = 'fill: orange; opacity: 0.5;'; | |
| $scope.UNSELECTED_REGION_STYLE = 'fill: blue; opacity: 0.5;'; | |
| $scope.getRegionStyle = function(index) { | |
| if (index === $scope.selectedRegion) { | |
| return $scope.SELECTED_REGION_STYLE; | |
| } else { | |
| return $scope.UNSELECTED_REGION_STYLE; | |
| } | |
| }; | |
| // All coordinates have origin at top-left, | |
| // increasing in x to the right and increasing in y down | |
| // Current mouse position in SVG coordinates | |
| $scope.mouseX = 0; | |
| $scope.mouseY = 0; | |
| // Original mouse click position for rectangle drawing | |
| $scope.originalMouseX = 0; | |
| $scope.originalMouseY = 0; | |
| // Original position and dimensions for dragged rectangle | |
| $scope.originalRectArea = { | |
| x: 0, | |
| y: 0, | |
| width: 0, | |
| height: 0 | |
| }; | |
| // Coordinates for currently drawn rectangle (when user is dragging) | |
| $scope.rectX = 0; | |
| $scope.rectY = 0; | |
| $scope.rectWidth = 0; | |
| $scope.rectHeight = 0; | |
| // Is user currently drawing a new region? | |
| $scope.userIsCurrentlyDrawing = false; | |
| // Is user currently dragging an existing region? | |
| $scope.userIsCurrentlyDragging = false; | |
| // Dimensions of original image | |
| $scope.originalImageWidth = 0; | |
| $scope.originalImageHeight = 0; | |
| // Is the user preparing to draw a rectangle? | |
| $scope.regionDrawMode = false; | |
| // Index of region currently hovered over | |
| $scope.hoveredRegion = null; | |
| // Index of region currently selected | |
| $scope.selectedRegion = null; | |
| // Temporary label list | |
| var labelList = $scope.$parent.value.labeledRegions.map( | |
| function(region) { | |
| return region.label; | |
| } | |
| ); | |
| // Calculates the dimensions of the image, assuming that the width | |
| // of the image is scaled down to fit the svg element if necessary | |
| var _calculateImageDimensions = function() { | |
| var svgElement = $($element).find( | |
| '.oppia-image-with-regions-editor-svg'); | |
| var displayedImageWidth = Math.min( | |
| svgElement.width(), $scope.originalImageWidth); | |
| var scalingRatio = displayedImageWidth / $scope.originalImageWidth; | |
| // Note that scalingRatio may be NaN if $scope.originalImageWidth is | |
| // zero. | |
| var displayedImageHeight = ( | |
| $scope.originalImageWidth === 0 ? 0.0 : | |
| $scope.originalImageHeight * scalingRatio); | |
| return { | |
| width: displayedImageWidth, | |
| height: displayedImageHeight | |
| }; | |
| }; | |
| // Use these two functions to get the calculated image width and height | |
| $scope.getImageWidth = function() { | |
| return _calculateImageDimensions().width; | |
| }; | |
| $scope.getImageHeight = function() { | |
| return _calculateImageDimensions().height; | |
| }; | |
| $scope.getPreviewUrl = function(imageUrl) { | |
| return $sce.trustAsResourceUrl( | |
| '/imagehandler/' + explorationContextService.getExplorationId() + | |
| '/' + encodeURIComponent(imageUrl) | |
| ); | |
| }; | |
| // Called when the image is changed to calculate the required | |
| // width and height, especially for large images | |
| $scope.$watch('$parent.value.imagePath', function(newVal) { | |
| if (newVal !== '') { | |
| // Loads the image in hanging <img> tag so as to get the | |
| // width and height | |
| $('<img/>').attr('src', $scope.getPreviewUrl(newVal)).load( | |
| function() { | |
| $scope.originalImageWidth = this.width; | |
| $scope.originalImageHeight = this.height; | |
| $scope.$apply(); | |
| } | |
| ); | |
| } | |
| }); | |
| var hasDuplicates = function(originalArray) { | |
| var array = originalArray.slice(0).sort(); | |
| for (var i = 1; i < array.length; i++) { | |
| if (array[i - 1] === array[i]) { | |
| return true; | |
| } | |
| } | |
| return false; | |
| }; | |
| $scope.regionLabelGetterSetter = function(index) { | |
| return function(label) { | |
| if (angular.isDefined(label)) { | |
| labelList[index] = label; | |
| if (hasDuplicates(labelList)) { | |
| $scope.errorText = 'ERROR: Duplicate labels!'; | |
| } else { | |
| $scope.errorText = ''; | |
| for (var i = 0; i < labelList.length; i++) { | |
| $scope.$parent.value.labeledRegions[i].label = labelList[i]; | |
| } | |
| } | |
| } | |
| return labelList[index]; | |
| }; | |
| }; | |
| var convertCoordsToFraction = function(coords, dimensions) { | |
| return [coords[0] / dimensions[0], coords[1] / dimensions[1]]; | |
| }; | |
| // Convert to and from region area (which is stored as a fraction of | |
| // image width and height) and actual width and height | |
| var regionAreaFromCornerAndDimensions = function(x, y, width, height) { | |
| return [ | |
| convertCoordsToFraction( | |
| [x, y], | |
| [$scope.getImageWidth(), $scope.getImageHeight()] | |
| ), | |
| convertCoordsToFraction( | |
| [x + width, y + height], | |
| [$scope.getImageWidth(), $scope.getImageHeight()] | |
| ) | |
| ]; | |
| }; | |
| var cornerAndDimensionsFromRegionArea = function(area) { | |
| return { | |
| x: area[0][0] * $scope.getImageWidth(), | |
| y: area[0][1] * $scope.getImageHeight(), | |
| width: (area[1][0] - area[0][0]) * $scope.getImageWidth(), | |
| height: (area[1][1] - area[0][1]) * $scope.getImageHeight() | |
| }; | |
| }; | |
| $scope.onSvgMouseMove = function(evt) { | |
| var svgElement = $($element).find( | |
| '.oppia-image-with-regions-editor-svg'); | |
| $scope.mouseX = evt.pageX - svgElement.offset().left; | |
| $scope.mouseY = evt.pageY - svgElement.offset().top; | |
| if ($scope.userIsCurrentlyDrawing) { | |
| $scope.rectX = Math.min($scope.originalMouseX, $scope.mouseX); | |
| $scope.rectY = Math.min($scope.originalMouseY, $scope.mouseY); | |
| $scope.rectWidth = Math.abs($scope.originalMouseX - $scope.mouseX); | |
| $scope.rectHeight = Math.abs($scope.originalMouseY - $scope.mouseY); | |
| } else if ($scope.userIsCurrentlyDragging) { | |
| var labeledRegions = $scope.$parent.value.labeledRegions; | |
| var draggedRegion = labeledRegions[$scope.selectedRegion].region; | |
| var deltaX = $scope.mouseX - $scope.originalMouseX; | |
| var deltaY = $scope.mouseY - $scope.originalMouseY; | |
| draggedRegion.area = regionAreaFromCornerAndDimensions( | |
| $scope.originalRectArea.x + deltaX, | |
| $scope.originalRectArea.y + deltaY, | |
| $scope.originalRectArea.width, | |
| $scope.originalRectArea.height | |
| ); | |
| } | |
| }; | |
| $scope.onSvgMouseDown = function(evt) { | |
| evt.preventDefault(); | |
| $scope.originalMouseX = $scope.mouseX; | |
| $scope.originalMouseY = $scope.mouseY; | |
| if ($scope.regionDrawMode) { | |
| $scope.rectWidth = $scope.rectHeight = 0; | |
| $scope.userIsCurrentlyDrawing = true; | |
| } | |
| }; | |
| $scope.onSvgMouseUp = function() { | |
| if ($scope.hoveredRegion === null) { | |
| $scope.selectedRegion = null; | |
| } | |
| $scope.userIsCurrentlyDrawing = false; | |
| $scope.userIsCurrentlyDragging = false; | |
| if ($scope.regionDrawMode) { | |
| $scope.regionDrawMode = false; | |
| if ($scope.rectWidth !== 0 && $scope.rectHeight !== 0) { | |
| var labels = $scope.$parent.value.labeledRegions.map( | |
| function(region) { | |
| return region.label; | |
| } | |
| ); | |
| // Searches numbers starting from 1 to find a valid label | |
| // that doesn't overlap with currently existing labels | |
| var newLabel = null; | |
| for (var i = 1; i <= labels.length + 1; i++) { | |
| if (labels.indexOf(i.toString()) === -1) { | |
| newLabel = i.toString(); | |
| break; | |
| } | |
| } | |
| var newRegion = { | |
| label: newLabel, | |
| region: { | |
| regionType: 'Rectangle', | |
| area: regionAreaFromCornerAndDimensions( | |
| $scope.rectX, | |
| $scope.rectY, | |
| $scope.rectWidth, | |
| $scope.rectHeight | |
| ) | |
| } | |
| }; | |
| $scope.$parent.value.labeledRegions.push(newRegion); | |
| labelList.push(newLabel); | |
| $scope.selectedRegion = ( | |
| $scope.$parent.value.labeledRegions.length - 1); | |
| } | |
| } | |
| }; | |
| $scope.onMouseoverRegion = function(index) { | |
| if ($scope.hoveredRegion === null) { | |
| $scope.hoveredRegion = index; | |
| } | |
| }; | |
| $scope.onMouseoutRegion = function(index) { | |
| if ($scope.hoveredRegion === index) { | |
| $scope.hoveredRegion = null; | |
| } | |
| }; | |
| $scope.onMousedownRegion = function() { | |
| $scope.userIsCurrentlyDragging = true; | |
| $scope.selectedRegion = $scope.hoveredRegion; | |
| $scope.originalRectArea = cornerAndDimensionsFromRegionArea( | |
| $scope.$parent.value.labeledRegions[ | |
| $scope.hoveredRegion].region.area | |
| ); | |
| }; | |
| $scope.onDocumentMouseUp = function() { | |
| if ($scope.regionDrawMode && !$scope.userIsCurrentlyDrawing) { | |
| $scope.regionDrawMode = false; | |
| } | |
| }; | |
| $document.on('mouseup', $scope.onDocumentMouseUp); | |
| $scope.setDrawMode = function() { | |
| $scope.regionDrawMode = true; | |
| }; | |
| $scope.getCursorStyle = function() { | |
| return ($scope.regionDrawMode) ? 'crosshair' : 'default'; | |
| }; | |
| $scope.resetEditor = function() { | |
| $scope.$parent.value.imagePath = ''; | |
| $scope.$parent.value.labeledRegions = []; | |
| }; | |
| $scope.deleteRegion = function(index) { | |
| if ($scope.selectedRegion === index) { | |
| $scope.selectedRegion = null; | |
| } else if ($scope.selectedRegion > index) { | |
| $scope.selectedRegion--; | |
| } | |
| if ($scope.hoveredRegion === index) { | |
| $scope.hoveredRegion = null; | |
| } else if ($scope.hoveredRegion > index) { | |
| $scope.hoveredRegion--; | |
| } | |
| $scope.$parent.value.labeledRegions.splice(index, 1); | |
| labelList.splice(index, 1); | |
| }; | |
| } | |
| }; | |
| } | |
| ]); | |
| // Copyright 2014 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| // Every editor directive should implement an alwaysEditable option. There | |
| // may be additional customization options for the editor that should be passed | |
| // in via initArgs. | |
| oppia.directive('intEditor', [ | |
| '$compile', 'OBJECT_EDITOR_URL_PREFIX', | |
| function($compile, OBJECT_EDITOR_URL_PREFIX) { | |
| return { | |
| link: function(scope, element) { | |
| scope.getTemplateUrl = function() { | |
| return OBJECT_EDITOR_URL_PREFIX + 'Int'; | |
| }; | |
| $compile(element.contents())(scope); | |
| }, | |
| restrict: 'E', | |
| scope: true, | |
| template: '<span ng-include="getTemplateUrl()"></span>', | |
| controller: function($scope) { | |
| $scope.SCHEMA = { | |
| type: 'int' | |
| }; | |
| if (!$scope.$parent.value) { | |
| $scope.$parent.value = 0; | |
| } | |
| } | |
| }; | |
| }]); | |
| // Copyright 2014 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| // Every editor directive should implement an alwaysEditable option. There | |
| // may be additional customization options for the editor that should be passed | |
| // in via initArgs. | |
| oppia.directive('codeStringEditor', [ | |
| '$compile', 'OBJECT_EDITOR_URL_PREFIX', | |
| function($compile, OBJECT_EDITOR_URL_PREFIX) { | |
| return { | |
| link: function(scope, element) { | |
| scope.getTemplateUrl = function() { | |
| return OBJECT_EDITOR_URL_PREFIX + 'CodeString'; | |
| }; | |
| $compile(element.contents())(scope); | |
| }, | |
| restrict: 'E', | |
| scope: true, | |
| template: '<span ng-include="getTemplateUrl()"></span>', | |
| controller: function($scope) { | |
| $scope.alwaysEditable = $scope.$parent.alwaysEditable; | |
| $scope.getWarningText = function() { | |
| if ($scope.localValue.label.indexOf('\t') !== -1) { | |
| return 'Code may not contain tab characters.'; | |
| } | |
| return ''; | |
| }; | |
| // Reset the component each time the value changes (e.g. if this is part | |
| // of an editable list). | |
| $scope.$watch('$parent.value', function() { | |
| $scope.localValue = { | |
| label: $scope.$parent.value || '' | |
| }; | |
| }, true); | |
| $scope.$watch('localValue.label', function(newValue) { | |
| $scope.$parent.value = newValue; | |
| }); | |
| } | |
| }; | |
| }]); | |
| // Copyright 2014 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| // The value for this editor is always editable. | |
| oppia.directive('booleanEditor', [ | |
| '$compile', 'OBJECT_EDITOR_URL_PREFIX', | |
| function($compile, OBJECT_EDITOR_URL_PREFIX) { | |
| return { | |
| controller: function($scope) { | |
| // Reset the component each time the value changes (e.g. if this is part | |
| // of an editable list). | |
| $scope.$watch('$parent.value', function(newValue) { | |
| $scope.localValue = { | |
| label: newValue || false | |
| }; | |
| }, true); | |
| $scope.$watch('localValue.label', function(newValue) { | |
| $scope.$parent.value = newValue; | |
| }); | |
| }, | |
| link: function(scope, element) { | |
| scope.getTemplateUrl = function() { | |
| return OBJECT_EDITOR_URL_PREFIX + 'Boolean'; | |
| }; | |
| $compile(element.contents())(scope); | |
| }, | |
| restrict: 'E', | |
| scope: true, | |
| template: '<span ng-include="getTemplateUrl()"></span>' | |
| }; | |
| }]); | |
| // Copyright 2014 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| // Every editor directive should implement an alwaysEditable option. There | |
| // may be additional customization options for the editor that should be passed | |
| // in via initArgs. | |
| oppia.directive('unicodeStringEditor', [ | |
| '$compile', 'OBJECT_EDITOR_URL_PREFIX', | |
| function($compile, OBJECT_EDITOR_URL_PREFIX) { | |
| return { | |
| link: function(scope, element) { | |
| scope.getTemplateUrl = function() { | |
| return OBJECT_EDITOR_URL_PREFIX + 'UnicodeString'; | |
| }; | |
| $compile(element.contents())(scope); | |
| }, | |
| restrict: 'E', | |
| scope: true, | |
| template: '<span ng-include="getTemplateUrl()"></span>', | |
| controller: function($scope) { | |
| $scope.alwaysEditable = $scope.$parent.alwaysEditable; | |
| $scope.largeInput = false; | |
| $scope.$watch('$parent.initArgs', function(newValue) { | |
| $scope.largeInput = false; | |
| if (newValue && newValue.largeInput) { | |
| $scope.largeInput = newValue.largeInput; | |
| } | |
| }); | |
| // Reset the component each time the value changes (e.g. if this is part | |
| // of an editable list). | |
| $scope.$watch('$parent.value', function() { | |
| $scope.localValue = { | |
| label: $scope.$parent.value || '' | |
| }; | |
| }, true); | |
| if ($scope.alwaysEditable) { | |
| $scope.$watch('localValue.label', function(newValue) { | |
| $scope.$parent.value = newValue; | |
| }); | |
| } else { | |
| $scope.openEditor = function() { | |
| $scope.active = true; | |
| }; | |
| $scope.closeEditor = function() { | |
| $scope.active = false; | |
| }; | |
| $scope.replaceValue = function(newValue) { | |
| $scope.localValue = { | |
| label: newValue | |
| }; | |
| $scope.$parent.value = newValue; | |
| $scope.closeEditor(); | |
| }; | |
| $scope.$on('externalSave', function() { | |
| if ($scope.active) { | |
| $scope.replaceValue($scope.localValue.label); | |
| // The $scope.$apply() call is needed to propagate the replaced | |
| // value. | |
| $scope.$apply(); | |
| } | |
| }); | |
| $scope.closeEditor(); | |
| } | |
| } | |
| }; | |
| }]); | |
| </script> | |
| <script> | |
| (function() {// Copyright 2016 The Oppia Authors. All Rights Reserved. | |
| // | |
| // 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. | |
| /** | |
| * @fileoverview Controllers for the error page. | |
| */ | |
| oppia.controller('Error', [ | |
| '$scope', 'UrlInterpolationService', | |
| function( | |
| $scope, UrlInterpolationService) { | |
| $scope.oopsMintImgUrl = UrlInterpolationService.getStaticImageUrl( | |
| '/general/oops_mint.png'); | |
| } | |
| ]); | |
| })(); | |
| </script> | |
| </body> | |
| </html> | |
| ---------------------------------------------------------------------- | |
| Ran 2 tests in 1.892s | |
| FAILED (errors=1) | |
| Traceback (most recent call last): | |
| File "/Users/aviato/github/oppia/oppia/core/tests/gae_suite.py", line 121, in <module> | |
| main() | |
| File "/Users/aviato/github/oppia/oppia/core/tests/gae_suite.py", line 114, in main | |
| result.testsRun, len(result.errors), len(result.failures))) | |
| Exception: Test suite failed: 2 tests run, 1 errors, 0 failures. | |
| +------------------+ | |
| | SUMMARY OF TESTS | | |
| +------------------+ | |
| ====================================================================== | |
| ERROR: test_one_rating_for_single_exploration (core.controllers.dashboard_test.DashboardStatisticsTest) | |
| ---------------------------------------------------------------------- | |
| Traceback (most recent call last): | |
| File "/Users/aviato/github/oppia/oppia/core/controllers/dashboard_test.py", line 189, in test_one_rating_for_single_exploration | |
| response = self.get_json(feconf.DASHBOARD_DATA_URL) | |
| File "/Users/aviato/github/oppia/oppia/core/tests/test_utils.py", line 234, in get_json | |
| json_response = self.testapp.get(url, params) | |
| File "/Users/aviato/github/oppia/oppia/../oppia_tools/webtest-1.4.2/webtest/app.py", line 758, in get | |
| expect_errors=expect_errors) | |
| File "/Users/aviato/github/oppia/oppia/../oppia_tools/webtest-1.4.2/webtest/app.py", line 1120, in do_request | |
| self._check_status(status, res) | |
| File "/Users/aviato/github/oppia/oppia/../oppia_tools/webtest-1.4.2/webtest/app.py", line 1156, in _check_status | |
| res) | |
| AppError: Bad response: 500 Internal Server Error (not 200 OK or 3xx redirect for http://localhost/dashboardhandler/data) | |
| <!DOCTYPE html> | |
| <html ng-app="oppia" ng-controller="Base" itemscope itemtype="http://schema.org/Organization"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes"> | |
| <!-- Tiles for Internet Explorer. --> | |
| <meta name="application-name" content="SITE_NAME"> | |
| <meta name="msapplication-TileColor" content="#ffffff"> | |
| <meta name="msapplication-square70x70logo" content="http://localhost/assets/images/logo/msapplication-tiny.png"> | |
| <meta name="msapplication-square150x150logo" content="http://localhost/assets/images/logo/msapplication-square.png"> | |
| <meta name="msapplication-wide310x150logo" content="http://localhost/assets/images/logo/msapplication-wide.png"> | |
| <meta name="msapplication-square310x310logo" content="http://localhost/assets/images/logo/msapplication-large.png"> | |
| <!-- The itemprops are for G+ sharing. --> | |
| <meta itemprop="name" content="Personalized Online Learning from Oppia"> | |
| <meta itemprop="description" content="Oppia is a free, open-source learning platform. Join the community to create or try an exploration today!"> | |
| <!-- The og tags are for Facebook sharing. --> | |
| <meta property="og:title" content="Personalized Online Learning from Oppia"> | |
| <meta property="og:site_name" content="Oppia"> | |
| <meta property="og:url" content="http://localhost/dashboardhandler/data"> | |
| <meta property="og:description" content="Oppia is a free, open-source learning platform. Join the community to create or try an exploration today!"> | |
| <meta property="og:type" content="article"> | |
| <meta property="og:image" content="http://localhost/assets/images/logo/288x288_logo_mint.png"> | |
| <link rel="apple-touch-icon" href="/assets/images/logo/favicon.png"> | |
| <!-- The title is bound to the rootScope. The content of the block | |
| maintitle can be a string or a translation id. If it is a translation it | |
| will be replaced by its translation when the page is loading. If it is a | |
| string it would be displayed as is. This is the only way to translate | |
| the page title because the head of the file is outside the scope of | |
| any other controller. --> | |
| <title itemprop="name" translate=" | |
| I18N_ERROR_PAGE_TITLE_500 | |
| "></title> | |
| <link rel="stylesheet" type="text/css" media="screen" | |
| href="https://fonts.googleapis.com/css?family=Capriola|Rubik|Roboto|Material+Icons|Open+Sans:400,600"> | |
| <link rel="stylesheet" type="text/css" media="screen" | |
| href="/third_party/generated/css/third_party.css"> | |
| <link rel="stylesheet" type="text/css" media="screen" | |
| href="/css/oppia.css"> | |
| <script> | |
| var GLOBALS = { | |
| ACTIVITY_STATUS_PRIVATE: JSON.parse( | |
| '\"private\"'), | |
| ACTIVITY_STATUS_PUBLIC: JSON.parse( | |
| '\"public\"'), | |
| ACTIVITY_STATUS_PUBLICIZED: JSON.parse( | |
| '\"publicized\"'), | |
| ADDITIONAL_ANGULAR_MODULES: [], | |
| ALL_CATEGORIES: JSON.parse('[\"Algebra\", \"Algorithms\", \"Architecture\", \"Arithmetic\", \"Art\", \"Astronomy\", \"Biology\", \"Business\", \"Calculus\", \"Chemistry\", \"Combinatorics\", \"Computing\", \"Economics\", \"Education\", \"Engineering\", \"English\", \"Environment\", \"Gaulish\", \"Geography\", \"Geometry\", \"Government\", \"Graph Theory\", \"History\", \"Languages\", \"Latin\", \"Law\", \"Logic\", \"Mathematics\", \"Medicine\", \"Music\", \"Philosophy\", \"Physics\", \"Poetry\", \"Probability\", \"Programming\", \"Puzzles\", \"Reading\", \"Spanish\", \"Sport\", \"Statistics\", \"Trigonometry\", \"Welcome\"]'), | |
| ALL_LANGUAGE_CODES: JSON.parse('[{\"code\": \"en\", \"description\": \"English\"}, {\"code\": \"ar\", \"description\": \"\\u0627\\u0644\\u0639\\u0631\\u0628\\u064a\\u0629 (Arabic)\"}, {\"code\": \"bg\", \"description\": \"\\u0431\\u044a\\u043b\\u0433\\u0430\\u0440\\u0441\\u043a\\u0438 (Bulgarian)\"}, {\"code\": \"ca\", \"description\": \"catal\\u00e0 (Catalan)\"}, {\"code\": \"zh\", \"description\": \"\\u4e2d\\u6587 (Chinese)\"}, {\"code\": \"hr\", \"description\": \"hrvatski (Croatian)\"}, {\"code\": \"cs\", \"description\": \"\\u010de\\u0161tina (Czech)\"}, {\"code\": \"da\", \"description\": \"dansk (Danish)\"}, {\"code\": \"nl\", \"description\": \"Nederlands (Dutch)\"}, {\"code\": \"tl\", \"description\": \"Filipino (Filipino)\"}, {\"code\": \"fi\", \"description\": \"suomi (Finnish)\"}, {\"code\": \"fr\", \"description\": \"fran\\u00e7ais (French)\"}, {\"code\": \"de\", \"description\": \"Deutsch (German)\"}, {\"code\": \"el\", \"description\": \"\\u03b5\\u03bb\\u03bb\\u03b7\\u03bd\\u03b9\\u03ba\\u03ac (Greek)\"}, {\"code\": \"he\", \"description\": \"\\u05e2\\u05d1\\u05e8\\u05d9\\u05ea (Hebrew)\"}, {\"code\": \"hi\", \"description\": \"\\u0939\\u093f\\u0928\\u094d\\u0926\\u0940 (Hindi)\"}, {\"code\": \"hu\", \"description\": \"magyar (Hungarian)\"}, {\"code\": \"id\", \"description\": \"Bahasa Indonesia (Indonesian)\"}, {\"code\": \"it\", \"description\": \"italiano (Italian)\"}, {\"code\": \"ja\", \"description\": \"\\u65e5\\u672c\\u8a9e (Japanese)\"}, {\"code\": \"ko\", \"description\": \"\\ud55c\\uad6d\\uc5b4 (Korean)\"}, {\"code\": \"lv\", \"description\": \"latvie\\u0161u (Latvian)\"}, {\"code\": \"lt\", \"description\": \"lietuvi\\u0173 (Lithuanian)\"}, {\"code\": \"no\", \"description\": \"Norsk (Norwegian)\"}, {\"code\": \"fa\", \"description\": \"\\u0641\\u0627\\u0631\\u0633\\u06cc (Persian)\"}, {\"code\": \"pl\", \"description\": \"polski (Polish)\"}, {\"code\": \"pt\", \"description\": \"portugu\\u00eas (Portuguese)\"}, {\"code\": \"ro\", \"description\": \"rom\\u00e2n\\u0103 (Romanian)\"}, {\"code\": \"ru\", \"description\": \"\\u0440\\u0443\\u0441\\u0441\\u043a\\u0438\\u0439 (Russian)\"}, {\"code\": \"sr\", \"description\": \"\\u0441\\u0440\\u043f\\u0441\\u043a\\u0438 (Serbian)\"}, {\"code\": \"sk\", \"description\": \"sloven\\u010dina (Slovak)\"}, {\"code\": \"sl\", \"description\": \"sloven\\u0161\\u010dina (Slovenian)\"}, {\"code\": \"es\", \"description\": \"espa\\u00f1ol (Spanish)\"}, {\"code\": \"sv\", \"description\": \"svenska (Swedish)\"}, {\"code\": \"th\", \"description\": \"\\u0e20\\u0e32\\u0e29\\u0e32\\u0e44\\u0e17\\u0e22 (Thai)\"}, {\"code\": \"tr\", \"description\": \"T\\u00fcrk\\u00e7e (Turkish)\"}, {\"code\": \"uk\", \"description\": \"\\u0443\\u043a\\u0440\\u0430\\u0457\\u043d\\u0441\\u044c\\u043a\\u0430 (Ukrainian)\"}, {\"code\": \"vi\", \"description\": \"Ti\\u1ebfng Vi\\u1ec7t (Vietnamese)\"}]'), | |
| ASSET_DIR_PREFIX: JSON.parse('\"\"'), | |
| can_create_collections: JSON.parse( | |
| 'false'), | |
| CAN_SEND_ANALYTICS_EVENTS: JSON.parse( | |
| 'false'), | |
| csrf_token: JSON.parse('\"1471535014/kOieX0euygOcLEDTb_qbXQ==\"'), | |
| DEFAULT_LANGUAGE_CODE: JSON.parse( | |
| '\"en\"'), | |
| DEV_MODE: JSON.parse('true'), | |
| INVALID_NAME_CHARS: JSON.parse('\":#/|_%\u003c\u003e[]{}\\ufffd\\\\\\u007f\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f\"'), | |
| MINIFICATION: JSON.parse('false'), | |
| /* A list of functions to be called when an exploration is completed */ | |
| POST_COMPLETION_HOOKS: [], | |
| preferredSiteLanguageCode: JSON.parse( | |
| 'null'), | |
| RTE_COMPONENT_SPECS: JSON.parse('{\"Collapsible\": {\"preview_url_template\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABNQAAABoCAIAAAC2bTrDAAAMFWlDQ1BJQ0MgUHJvZmlsZQAASImV%0AlwdUk8kWx%2BcrKYSEFoiAlNCbIL1K7x3pYCMkAUKJIRBU7MiigmtBRQQruiqi4loAWWxYsLAI2OsL%0AIior62LBhsqbJIA%2B9%2B1558058%2BWXO/fe%2Bc98M9%2BZAUDRniUQZKNKAOTw84XRgT7MxKRkJkkMEIAB%0AVaALjFjsPIF3VFQY%2BMfy7hb0huW6pSTXP/v916LM4eaxAUCiIKdy8tg5kI8BgGuyBcJ8AAid0G4w%0AJ18g4beQVYVQIABEsoTTZawl4VQZW0t9YqN9IfsBQKayWMJ0ABQk%2BZkF7HSYR0EA2ZrP4fEh74Ds%0Awc5gcSCLIU/KyZkNWZEK2TT1uzzp/5EzdTwni5U%2BzrKxSAvZj5cnyGbN%2Bz%2Bn43%2BXnGzRWB/6sFIz%0AhEHRkjHDeduXNTtUwlA70sJPjYiErAL5Eo8j9ZfwvQxRUNyo/wA7zxfOGWAAgAIOyy8UMpxLlCHK%0AivMeZVuWUBoL/dEIXn5w7CinCmdHj%2BZHC7h5/jFjnMENDhvNuYKfHTHG29J4AcGQ4UpDjxVmxCbI%0AdKLnC3jxEZAVIHfmZcWEjvo/KszwjRjzEYqiJZoNIb9NEwZEy3ww9Zy8sXFhVmyWVIM6ZK/8jNgg%0AWSyWyM1LDBvTxuH6%2Bcs0YBwuP25UMwZXl0/0aGyJIDtq1B/bxs0OjJbNM3Y4ryBmLLY7Hy4w2Txg%0AjzNZIVEy/dg7QX5UrEwbjoMw4Av8ABOIYE0Fs0Em4HUMNA7Af7KWAMACQpAOuMBy1DIWkSBt4cNn%0ADCgEf0LigrzxOB9pKxcUQPuXcavsaQnSpK0F0ogs8BRyDq6Je%2BBueBh8esFqizvjLmNxTMWxXon%2B%0ARD9iEDGAaDaugw1VZ8MqBLy/275FEp4SugiPCTcJYsJdEApbuXDMEoX88ZHFgyfSLKP/Z/GKhD8o%0AZ4JwIIZxAaOjS4XR/WM%2BuDFU7YD74O5QP9SOM3BNYInbw5F4455wbA7Q%2Br1C0biKb3P5Y38Sfd%2BP%0AcdSuYK7gMKoidVy/77jXj1l8v5sjDvwN/dETW4Edxdqws9hlrAVrBEzsNNaEtWMnJTy%2BEp5IV8JY%0Ab9FSbVkwD2/Mx7rOut/68996Z40qEErfN8jnzs2XbAjf2YJ5Ql56Rj7TG36RucxgPttqEtPW2sYR%0AAMn3Xfb5eMOQfrcRxpVvttwzALiUQmP6NxvLAIATTwGgv/tmM3gNt9daAE52skXCApkNlzwIgAIU%0A4c7QADrAAJjCMdkCR%2BAGvIA/CAGRIBYkgZlw1jNADlQ9BywAS0EJKANrwUZQBbaDXWAfOAiOgEbQ%0AAs6Ci%2BAq6AQ3wX24NvrACzAI3oFhBEFICA2hIxqILmKEWCC2iDPigfgjYUg0koSkIOkIHxEhC5Bl%0ASBlSjlQhO5Fa5FfkBHIWuYx0IXeRHqQfeY18QjGUiqqi2qgxOhl1Rr3RUDQWnYGmo7loIVqMrkYr%0A0Rr0ANqAnkWvojdRMfoCHcIAJo8xMD3MEnPGfLFILBlLw4TYIqwUq8BqsENYM3zX1zExNoB9xIk4%0AHWfilnB9BuFxOBvPxRfhq/AqfB/egJ/Hr%2BM9%2BCD%2BlUAjaBEsCK6EYEIiIZ0wh1BCqCDsIRwnXIA7%0Aqo/wjkgkMogmRCe4N5OImcT5xFXErcR64hliF7GXOEQikTRIFiR3UiSJRconlZA2kw6QTpO6SX2k%0AD2R5si7ZlhxATibzyUXkCvJ%2B8ilyN/kZeVhOSc5IzlUuUo4jN09ujdxuuWa5a3J9csMUZYoJxZ0S%0AS8mkLKVUUg5RLlAeUN7Iy8vry7vIT5XnyS%2BRr5Q/LH9Jvkf%2BI1WFak71pU6niqirqXupZ6h3qW9o%0ANJoxzYuWTMunrabV0s7RHtE%2BKNAVrBSCFTgKixWqFRoUuhVeKsopGil6K85ULFSsUDyqeE1xQElO%0AyVjJV4mltEipWumE0m2lIWW6so1ypHKO8irl/cqXlZ%2BrkFSMVfxVOCrFKrtUzqn00jG6Ad2XzqYv%0Ao%2B%2BmX6D3qRJVTVSDVTNVy1QPqnaoDqqpqNmrxavNVatWO6kmZmAMY0YwI5uxhnGEcYvxaYL2BO8J%0A3AkrJxya0D3hvfpEdS91rnqper36TfVPGkwNf40sjXUajRoPNXFNc82pmnM0t2le0ByYqDrRbSJ7%0AYunEIxPvaaFa5lrRWvO1dmm1aw1p62gHagu0N2uf0x7QYeh46WTqbNA5pdOvS9f10OXpbtA9rfsH%0AU43pzcxmVjLPMwf1tPSC9ER6O/U69Ib1TfTj9Iv06/UfGlAMnA3SDDYYtBoMGuoahhsuMKwzvGck%0AZ%2BRslGG0yajN6L2xiXGC8XLjRuPnJuomwSaFJnUmD0xppp6muaY1pjfMiGbOZllmW806zVFzB/MM%0A82rzaxaohaMFz2KrRdckwiSXSfxJNZNuW1ItvS0LLOsse6wYVmFWRVaNVi8nG05Onrxuctvkr9YO%0A1tnWu63v26jYhNgU2TTbvLY1t2XbVtvesKPZBdgttmuye2VvYc%2B132Z/x4HuEO6w3KHV4Yujk6PQ%0A8ZBjv5OhU4rTFqfbzqrOUc6rnC%2B5EFx8XBa7tLh8dHV0zXc94vqXm6Vbltt%2Bt%2BdTTKZwp%2Bye0uuu%0A785y3%2Bku9mB6pHjs8BB76nmyPGs8H3sZeHG89ng98zbzzvQ%2B4P3Sx9pH6HPc572vq%2B9C3zN%2BmF%2Bg%0AX6lfh7%2BKf5x/lf%2BjAP2A9IC6gMFAh8D5gWeCCEGhQeuCbgdrB7ODa4MHQ5xCFoacD6WGxoRWhT4O%0AMw8ThjWHo%2BEh4evDH0QYRfAjGiNBZHDk%2BsiHUSZRuVG/TSVOjZpaPfVptE30gui2GHrMrJj9Me9i%0AfWLXxN6PM40TxbXGK8ZPj6%2BNf5/gl1CeIE6cnLgw8WqSZhIvqSmZlByfvCd5aJr/tI3T%2BqY7TC%2BZ%0AfmuGyYy5My7P1JyZPfPkLMVZrFlHUwgpCSn7Uz6zIlk1rKHU4NQtqYNsX/Ym9guOF2cDp5/rzi3n%0APktzTytPe57unr4%2BvT/DM6MiY4Dny6vivcoMytye%2BT4rMmtv1kh2QnZ9DjknJecEX4WfxT8/W2f2%0A3NldAgtBiUCc65q7MXdQGCrck4fkzchryleFR512kanoJ1FPgUdBdcGHOfFzjs5Vnsuf2z7PfN7K%0Aec8KAwp/mY/PZ89vXaC3YOmCnoXeC3cuQhalLmpdbLC4eHHfksAl%2B5ZSlmYt/b3Iuqi86O2yhGXN%0AxdrFS4p7fwr8qa5EoURYcnu52/LtK/AVvBUdK%2B1Wbl75tZRTeqXMuqyi7PMq9qorP9v8XPnzyOq0%0A1R1rHNdsW0tcy197a53nun3lyuWF5b3rw9c3bGBuKN3wduOsjZcr7Cu2b6JsEm0SV4ZVNm023Lx2%0A8%2BeqjKqb1T7V9Vu0tqzc8n4rZ2v3Nq9th7Zrby/b/mkHb8ednYE7G2qMayp2EXcV7Hq6O3532y/O%0Av9Tu0dxTtufLXv5e8b7ofedrnWpr92vtX1OH1onq%2Bg9MP9B50O9g0yHLQzvrGfVlh8Fh0eE/fk35%0A9daR0COtR52PHjpmdGzLcfrx0gakYV7DYGNGo7gpqanrRMiJ1ma35uO/Wf22t0Wvpfqk2sk1pyin%0Aik%2BNnC48PXRGcGbgbPrZ3tZZrffPJZ67cX7q%2BY4LoRcuXQy4eK7Nu%2B30JfdLLZddL5%2B44nyl8arj%0A1YZ2h/bjvzv8frzDsaPhmtO1pk6XzuauKV2nuj27z173u37xRvCNqzcjbnbdirt15/b02%2BI7nDvP%0A72bffXWv4N7w/SUPCA9KHyo9rHik9ajmX2b/qhc7ik/2%2BPW0P455fL%2BX3fviSd6Tz33FT2lPK57p%0APqt9bvu8pT%2Bgv/OPaX/0vRC8GB4o%2BVP5zy0vTV8e%2B8vrr/bBxMG%2BV8JXI69XvdF4s/et/dvWoaih%0AR%2B9y3g2/L/2g8WHfR%2BePbZ8SPj0bnvOZ9Lnyi9mX5q%2BhXx%2BM5IyMCFhClvQogMGKpqUB8HovALQk%0AeHaA9ziKguz%2BJS2I7M4oJfBPLLujSQs8uez1AiBuCQBh8IyyDVYjyFT4Kzl%2Bx3oB1M5uvI6WvDQ7%0AW1kuKrzFED6MjLzRBoDUDMAX4cjI8NaRkS%2B7odi7AJzJld37JIUIz/g7NCTUflsJ/Fj%2BDdjNazxy%0As4mXAAAACXBIWXMAABYlAAAWJQFJUiTwAAAEJ2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6%0AeG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAi%0APgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRm%0ALXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAg%0AICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgICAgICAg%0AICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iCiAgICAgICAgICAg%0AIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAg%0AeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIj4KICAgICAgICAgPHRpZmY6%0AUmVzb2x1dGlvblVuaXQ%2BMTwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPHRpZmY6Q29t%0AcHJlc3Npb24%2BNTwvdGlmZjpDb21wcmVzc2lvbj4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24%2B%0AMTQ0PC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZm%0AOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xNDQ8L3RpZmY6WVJlc29s%0AdXRpb24%2BCiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4xMjM2PC9leGlmOlBpeGVsWERp%0AbWVuc2lvbj4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT4xPC9leGlmOkNvbG9yU3BhY2U%2BCiAg%0AICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj4xMDQ8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgog%0AICAgICAgICA8ZGM6c3ViamVjdD4KICAgICAgICAgICAgPHJkZjpCYWcvPgogICAgICAgICA8L2Rj%0AOnN1YmplY3Q%2BCiAgICAgICAgIDx4bXA6TW9kaWZ5RGF0ZT4yMDE2LTA0LTAyVDIxOjA0OjA5PC94%0AbXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5QaXhlbG1hdG9yIDMuMDwv%0AeG1wOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8%0AL3g6eG1wbWV0YT4KzNxgGQAAJwlJREFUeAHtnc2upVW1hg8IFGgsQSuCmNgmsUGDFoREGtCwyTUQ%0AL4C%2BaAT6tNFwBV4AMaFJoGXDhgltG4im%2BJGjAQqE8%2Bz1VL01zvzW3rXdVXtVYr2zMXjnmONnfs8u%0Ak2%2B49s9d33zzzf90lUAJlEAJlEAJlEAJlEAJlEAJlMB5Erj7PIu3dgmUQAmUQAmUQAmUQAmUQAmU%0AQAkcEejw2X8HJVACJVACJVACJVACJVACJVAC506gw%2Be5I26DEiiBEiiBEiiBEiiBEiiBEiiBDp/9%0AN1ACJVACJVACJVACJVACJVACJXDuBDp8njviNiiBEiiBEiiBEiiBEiiBEiiBEujw2X8DJVACJVAC%0AJVACJVACJVACJVAC506gw%2Be5I26DEiiBEiiBEiiBEiiBEiiBEiiBDp/9N1ACJVACJVACJVACJVAC%0AJVACJXDuBDp8njviNiiBEiiBEiiBEiiBEiiBEiiBErjn9AiuXLnyr3/967PPPkN8/fXXp09sZAmU%0AQAmUQAmUQAmUQAmUQAmUwH8lgbvvvvu%2B%2B%2B574IEHvvOd7yBOeMa7vvnmmxOOc/SPf/zjww8/zLai%0ABEqgBEqgBEqgBEqgBEqgBEqgBEKAKfShhx763ve%2BF88iTjV8/vWvf%2BUDTzKpdeHChaVEtyVQAiVQ%0AAiVQAiVQAiVQAiVQAncygS%2B%2B%2BOLjjz%2BGAB%2BB/uhHP9qL4sbD5yeffPLRRx/dc889ly5d2luizhIo%0AgRIogRIogRIogRIogRIogRK4fPnyV1999f3vf//BBx/c0rjBLxxifmXyJK2T55ZdPSVQAiVQAiVQ%0AAiVQAiVQAiVQAiHg2MjnlwyScUacNHzy46D//Oc/CeW7bZNQUQIlUAIlUAIlUAIlUAIlUAIlUAJ7%0ACTA88utpGSS3v13oBsPn559/TsX%2BnOderHWWQAmUQAmUQAmUQAmUQAmUQAlMAg6PDJL/wfBJKOvL%0AL7%2BchapLoARKoARKoARKoARKoARKoARK4GQCDJJOlDPspE8%2Bievf85ywqkugBEqgBEqgBEqgBEqg%0ABEqgBG5IYO8gedLwyah6w6INKIESKIESKIESKIESKIESKIESKIGFwHacPGn4XJK7LYESKIESKIES%0AKIESKIESKIESKIGzETh2%2BNzOqWdr0KwSKIESKIESKIESKIESKIESKIE7kMAyVB47fN6BaPrIJVAC%0AJVACJVACJVACJVACJVAC50Sgw%2Bc5gW3ZEiiBEiiBEiiBEiiBEiiBEiiB6wQ6fF5nUVUCJVACJVAC%0AJVACJVACJVACJXBOBDp8nhPYli2BEiiBEiiBEiiBEiiBEiiBErhOoMPndRZVJVACJVACJVACJVAC%0AJVACJVAC50Sgw%2Bc5gW3ZEiiBEiiBEiiBEiiBEiiBEiiB6wQ6fF5nUVUCJVACJVACJVACJVACJVAC%0AJXBOBDp8nhPYli2BEiiBEiiBEiiBEiiBEiiBErhO4J7r8vwVf2P0rrvu%2Bvrrr23F1sX2mvxGPe9C%0ACltsVraG4Z/xWz0DaLQNOLMnlU8u62lsRPpa5zibsAgjt01n5e0p6blwSiFOiEx8xEyM3p7urbk3%0Afol0GxuRXITtsBFxzrCpjVx6bQPwGDPj0Ti1BNx9990n1Jk1q0ugBEqgBEqgBEqgBEqgBELgcMOn%0A7%2Bt5id%2BOoBzpRLByRV76T1iEEUxA4iPinNWMT8yZhcVTOWJb0KNYhGvexAfEo5g3j7ayWyrMRm4X%0Au8TM9JmLTiQi7RRYxTxKukezQo4iUlxPqiUAMWPQLv3Xdv/veY/uNBYx7LSzLBq/Hk6Xo2WbAEt5%0AmvRZP5FLhW5LoARKoARKoARKoARKoAROIHC44dPXd1/ctYyaCJYiW66LU%2BvbP5aPm7BTuNUaTwrb%0APG2c8ewVJ4fNgjP9hKzlyC12u2bB%2BTh%2Btrb30Sgys6L1zxYcxZmnUGSbgAQjEqMgBsEyOAEzBX3K%0AlSLb%2BFwGkeW/CoLxmOJlFrtU41RPspaAvVuzTNFOjx3xI2L31qmzBEqgBEqgBEqgBEqgBA5D4N//%0A/vcHH3zw4YcfXr58mY6XLl36wQ9%2B8PDDD99zz%2BEGvdM/6eHu5Nu8N2OiQOBBsECGZetCzwfgXZ9h%0ADCeWxZGeGaMTS4X4CYueYsZM/169N3hbeW9YnIis%2BaQ4bUpBlw9IDNvcR03wdOY0Ii2m4NQu1reI%0AHhMNThgikVzGeCM9WiJzdJyYvVJhG2yYl9ECgTU9Znk97oYQV/wE42SLiFNxGpt0g7dFuA/19atP%0AU7YxJVACJVACJVACJVACJXBrCXz55ZfvvPPO22%2B//e6773766adL8YsXLz755JNPP/30U089de%2B9%0A9y6nt3F7/eOs5RJHL/5ff/2Xv/wF/yOPPLKcnmFLNbJ4cXexZeZEY1lHza4tnKnvpOGYwaTB%2Bta3%0AvqXIkWKmRCsIUMzKx3mW3GxTJJ69YmnhFuviERGxVGCbB%2BG50No47aslPmLqq9Wv/Sf1cdjCYGvu%0ATUzYjDR%2BWk5de69x7fDqf%2B2%2BOLfpeq7d/ep/r/1buI4r1WjtP4C9uI6rv/caS3AeCkG7ZUuwfvp6%0AywScULxHJVACJVACJVACJVACJXALCfAi%2BtZbb73xxhvvv//%2BDcs%2B%2BuijL7zwwrPPPnvgF1c%2BjOVu%0AP/nJT3xvzz0PN3yCiYmCxohMm1999dVu9jyaQtHL1EQwmDJjOHbG5kiUE%2Bhx2u4%2BPB0V0xmPYtY5%0AzjNT9tbEmbXMVORyRBeXX5s8r05iEHvt0ppSAWij9DX9apvdf8xNgEJnwo67idUSrMiWUvFMHaeP%0Ak61i3iSU8u8k1/NuARVhTU8tOLtEb%2B%2BTI0UsguB5aq4eNK231ZaH6rYESqAESqAESqAESqAEbiGB%0Av/3tby%2B99NJ77733H9V87LHHXnnlFb4X9z/Kupng2z98Zi7ild2hApvh08kTy6mRCF70WRkwGDtd%0AeBBYT%2BGCiA0mnYvfgUHLUUSy9oqUWqrN4JRahFtsZqqIjz76CD/fkP3ggw/mMRV0zErTvR5OKeJK%0A5Tm2ecnkKnQmS5HIsFUkNwEInLFTGENBhDbClARna3ftfIQ8Bc6PP/4YSwrfyC4i/w0suOy%2B3E3n%0AXpvICB%2BZy%2BDRmZo6tXur1VkCJVACJVACJVACJVAC50TgT3/6E5PnJ598cob6Dz300Msvv/z444%2Bf%0AIfcMKccNn4f7mU8uzVt7LINERlC%2BZTmD6GeffYZmEeBcwbcpX7hwAUu6i6nDOswGeNAZEiLinJ50%0AN2tajvauma6enpkyq6k9RWfxUCyfDmcKMnX7sFiejhhHIAISQzW301ok9RGpTxfAfvHFFzipCUMS%0AU5ZqySIFDXks/gceeCCXUdjRC2AjFj9bjiyiUMdjwLRHtXaLGK8x73/07%2BDat2RfC/wfHopb8USk%0AzHsSsNxHTxL3ClNiieECqUMLNUJ9mpp7G9VZAiVQAiVQAiVQAiVQAmcmwOT54osvMjWcrQIf5JD%2B%0A2muvHWz%2B3HvPww2fvLt7AwTv9y5GCwhimSgYfq5cuaJ/RjqaMnzef//9eQaKOHgQz3gQPyJbRbaJ%0AIdeFBxGbgIjkzlJTG5lqlrJmjuLkqhxhM1Cl%2Bxw%2BcdKCp8OySI%2BIU08sKS7p2UK20PMCTGvEp4LX%0Ay5UQRFIEP5F8GCte47XexERKufUO88gA74OO0J87zxRjsN6fmy/LIyxZ3JP76OGq3nNbNjdcGnkN%0ArTE%2BHVph8WxtarzaLLRiFqwugRIogRIogRIogRIogVtOwO%2B2PfPk6X1I/9WvfvXb3/72kN9/u6A4%0A3PBp4zntoJ0xAPH55587/PhO72v9fLknkg/xKEIAyw%2B%2BqDBj5rPh9yiWLNNTZFfpyKlHEWsi21RQ%0Azy2epeziYavHXg5XWp7IXIQDFWMPz%2BVDOQiRS7t0zHSEB%2B0WbZ0UpyBIsSz7UocWZmFd2ytZh1yE%0A9W2B9Saxudi1Ykf/xZll8dj4l3izDJv35%2BZ5hImLm8gKp6y8p2XpYsFYRfw0mjfRnwqcolOKUzwp%0ANXOnTsGKEiiBEiiBEiiBEiiBErjlBHjzPPN32y6X4fNPSr3%2B%2But5SV4Cznt70OHTV3bGBsScNPjA%0Ak4lCD2//PDM6L/1BQ5YTFIKF3%2BAwwhm9pLvd5V0dQdXTk1xEmm7rxGO8TZc6OlPQU20eXGGMAxWP%0Aw9CFZdFlNnLr0WINs/jRuHltObzRxSMfalbG46k3Id7L8OXIJ4rGY003QO2VcrEZMJ833c2dWd5c%0Af25y7frr8Mn1iKea1yOeyNzTUoudW7tMy6lLnpSiOB4q%2B9RuY5fcua0ugRIogRIogRIogRIogXMi%0AwO%2B2Pfk3DD3xxBO//OUv%2BfOeXIA/%2BPnqq6/%2B8Y9/PO4ylKLgc889d1zAufoPN3zyEs%2BTTOvMg2Wu%0AwM/y1R%2BRSAcD/HiIRDBy7GKPglnSmSnWwZ%2BAhFnW9FidsQiWKYtdCnqa1hYkV8%2BuzFWTGB4BnQfn%0AWYjgGZ2s8rAOPxzNC3iqZVJixWMby87hjbJs5aa1smXJyk0iOOKGZKU4Hpdd5q1SLcIYKrgoe01e%0A/f8FLLXEk0WYd8j9EdwfJ8JTLIkE45EAIqWobHeFjaI9mtYA0iXJER4KKuhlLls01tZqtl0lUAIl%0AUAIlUAIlUAIlcN4E%2BIzqjTfeOLnLz3/%2BcydPwhBsTxg%2BiaHgM888c1v%2B/ufhhk%2BeMy/uiKxMFzLN%0AuOJswFa/W7IcRRBzNkg1hPFYU7Q6PZ3Bak5nosHWj001K2tT0Apza5FYj3y6WJ/OCcohKqOU9U1P%0AayclhiUSWQ5gVPaSOrXUzMJjNcJmfZwzBW0pEglzpbU3We6TggQbaQB1XNZUL7mmpCwxuYw3z%2BTM%0A1lNaWJBcRO45W1MwWwU2XdCU0uMFYIgHq5P/EVKZI5wsq5nOlhjD8LhN5YoSKIESKIESKIESKIES%0AuOUE3nnnnRv%2BPc9ljFy22ytRkLI/%2B9nPtkfn7Tno8Ll9GN/v43e00Kmd7/qcssVvmEdsXY4oags6%0AXRBmpE4Ckm4wW47Q2hmfRJ1uLWu1JC41c6ow0XZpirC1RdCzS1I4jZ8ZiV8FZK/ZIsEeYbPAgqaX%0ARcLEpt4hwWzxE2OY1uK2MyD3QXClXfj%2B4TPdTaQIKXuLz5vkA0/SWRx5ajqaCtx59qUsfi%2BJno3U%0AsQgic3PhJJ6tpaxmqeTaejnitKsESqAESqAESqAESqAEzoPA22%2B/fU5l/8uHT1/ZtRBERDNFMGPo%0AjJUyw4AC68iBYCRwKrAIljCXHlMMM1KrP1ls0Ys1BptE60xP9N50nbOjNdN3EUTy%2BEsXU7QeSYnH%0AZN7DWoQABEfEIK5S2P3naG7bTZ5Yjoi0ThpZISluZ5hlvcO0qUMAgyLWhd%2BwVEZYH5EKBFtBMVMS%0Av7v70djsI1iQSBJxXu13rU76WsqtLaaep1SwDsO8kXpwgje3RVhBgfYofmvWlkAJlEAJlEAJlEAJ%0AlMAtJ8Cb8LvvvnvLy1KQsrzG8yZ8HsVPqHnofrmKb/zT5ijCV3xsFrMBp84DCPx4sBlR3OIxLPWX%0ALHP3Wpwuc9FTuL0a8f9nV5z2XWJmMAFzJSVPFEGYiXqwfsZoelokHuERBFxsr8mj/5pCGMvK2Bkw%0AKxtmZOIJMDGnGQIVibTyvMDe4mTNFGNmll9WLpl0KpOCx1xv4q1irelRrIlanfBkoSmV1gSkF8LI%0A5CJY%2BBW1JVACJVACJVACJVACJXB%2BBD744INPP/10W5/fMMQPdubba3/605/OGLa/%2Bc1v9PAjo2%2B%2B%0A%2Beb2R0Apy59v%2BfGPfzwTD6APPXzyNp%2BnUmOZuR0z0L7x5/1egc34ZIBFHEuwrO2gkvoIV1pHbBt5%0ARDziWt7VO%2Bs0YElMwZm%2BOElZFgF4ljC3009fBiSekWHJUz04eWovaalZf0fluuHIyBl//Xgz4BFG%0ATa3Fba0Tv%2BMfNiPcrEy7k4ubbopdfGQTYxHR8wIUN0ubI6%2BXS8760Qi6G0MdW2Atsi2of7HEnzJy%0ASey2BEqgBEqgBEqgBEqgBE5DgF9duzcsv9t27%2BkPdytHTKrPP/98thEU/28ePnlTn%2B/3bLMcYJxV%0AcCYMNOo5aRAgMo5YZmG3wydhaWGW2xA3AEudWE/xEKw1V39OZ7zpeNIl2niDCXPNrXqGLR62lAUR%0Ay7BsdQoHfa381WfJdgpyXXbxSIYJs6O99lor0BHB5EkimiJY42fZvcVJNN1S2pmbyyByB51siY9z%0ACv3a1Dc%2BLfCzdFpcO2smeFt8eqpLoARKoARKoARKoARK4PwIXL58eW/x/G7bvaeL87jg44ov6bd2%0Ae%2BhPPrm9b/m%2B3zsJoBGOMUwCBmTSyAM7ZVnBgcHBRpvhk62nRtposTlKZLpEcORNpgeN36XWGhm7%0ATbyWdPTfvUXinGXRlGKZ5eeceerUTApi0W5N3x1eD1jS2VLZeDoanMSI3XWuXskpzjq5pBWslqv6%0ARbFIKpCO1iLsmL7pOD0659HURKY4/miLu7Wanr25BqSUIs6KEiiBEiiBEiiBEiiBEiiBsxG4DcMn%0AF/XVX%2BFIEJsRNM/DhMAyYObidKRx7JzDJ2GczvqZcKzj1GQLPAptEpO%2BnBKwLCP3xpu7xLPFr3Mr%0AcmrufHCunVJLImEpaGKsFThVYHMUYTpbuzuFZqvT4OOKWMHixM8vDdqtdVKBbbLizJXSbnb3SvFE%0AJCt1tsKYmUIMTixgWUtKalaUQAmUQAmUQAmUQAmUwOEJXLp0aW9TvmP2uM8zt/HHfe/uccW3FW6h%0A59DDp6/7PIAv%2BhEOAJ565JCQUQHhqSlsXQ420147uT58MlcQgDUXm6XTLfXJnV3wZ4vm1Mi0jnMm%0AGoM11%2BBpzcKzFQlLkdQxePoXTTs7KrbWUnnk2Qtt/OxiwPSkI8Gcuk1YIvVk4FRoicnFCMsXJbfi%0A1LIKu5iiTtO00zNtikwn2joRbOnL0j/tkthtCZRACZRACZRACZRACRyYwHET5quvvrr8wiF%2BzDN3%0A%2B/vf//7nP//Zrb9wKEdTHFd8xtxyfejhc3kAXvfxzJf%2BqR02MnJEWIQti5HG5VYPdjZyi13azakj%0AKRHeJHXwE08vA2ITn0i7sN0e4eRU/1akwnHCK2kthVYkZcYczVW7D0tx0tQjPAbj4XGiFVtPKi/C%0A1jgjDKBsVr40csOfGK9hJM4cLQW9M6cRVmA7U3TmyCKmnGC5A6fYCLdLyixeXQIlUAIlUAIlUAIl%0AUAKHIfDII49cvHhx%2Bwtv%2Be218xfY8rtt5/DJ5PnrX//65BtS9uGHHz455jxOb%2BfwySs%2Bj5QX/UW7%0AdcDYO2bg3Lv2YkqXCEcOp46kUDDaC3hJGzFBJR2R4AhTsjVXZ8pyGv8Sn5gp0tELz220wmpx5gHx%0Ae6UcIXQ6HOr3B0rRGRTJcu29z6ymnmHbxJxyRHy2Uyx12BocwUNxvZkytelYv6xTeBQmEXybd7Qx%0AFIyYxRdNzOLptgRKoARKoARKoARKoARuIQHeVJ988sk//OEPt7CmpSh7%2BD/ySevbOXz65Px5U39c%0A063v9L79M3jo3Fpnm23AMhJYZ7EOG04dObLFUnBWmzMPYSbOeLV2Ji7PNcM4YhsPwsFPfxK58JyR%0AvD8t9k5NcSpIJNIWeMyy8lHj3Z9IxenK/OlRptDtfYhPI7U1Uxnn9Gy3eLbLFPxLHTy080uA4HoE%0AeMmlizXzpLNFnDBx4XFZH238co3ZoroESqAESqAESqAESqAEDkbg6aefPo/hk7IHe4TZ6DYMn/P9%0Anqs4/3gn3v4ZMBIQ4akjR27PqelYI/XMAP1XJ4wxwjF74MQuibPFrIbfSIuzjQeRjgj9WrazCDr%2B%0A1DFFyym3wrqMISv3985ufQRvpSXedFMIoA5OtpYyMcGchrZOLB6WR1bzMpayGmGWwqqxtjDMrelo%0AtwbMCvitoziK29XRJh5BGLeyIFu7TGvwrsCRITJ2CnW%2B%2BorcgVOX6eh5h2j8oRFnRQmUQAmUQAmU%0AQAmUQAnccgJPPfXUo48%2B%2Bv77759QmR/snKfLdh6pKUjZrf8AnsMNn77W563dLU/oqz%2Bfufm0%2BrH4%0AM11ETCI4GUhmJBqnK9WokxlDQZiCz5rRrlSmpprEOK3pB4N8VMs2RwinNQR%2Bs6jJ9lrt6zOn/uTm%0AqvjVWFEgZhGfggtzc6wC7eKUlQo41d7BJ6KaYQiWt%2BWIYDryUDgJsDt%2BlkUizLJmSiGOyu0W8ZwS%0Ar%2BXIYA5zHzxx0tr0RHKk3kUd8cyKh2po/Fh7oXXubnFkKMJyG6FfexxDg%2B2FJVg9RdolrKIESqAE%0ASqAESqAESqAEzoPAvffe%2B8ILL7zyyisnFH/zzTefeOIJf4EQv9uW7QnBHFGQsifHnNPp4YZPp4Xl%0AMXjXZwKZTjxEshCMFtnicQDAoknRsnU6isgRgnT8DjnoCLRbThHLBdxyFD%2B9bGdN9c539RPRnCJm%0AInq7Zlm0KVbDckmfiCNy7ehtOWJZEA9iWrYhZryN0JZCsEzHY0cnap1oAvR7B6wCp0W0trZaPNbk%0ASA%2BJlsVaMwGm%2Byy5EjHJNdI6%2BClFcNIRWRypk4tgpSw60HYnR1sWAQqdWOpMbVlvlbshpl9dWwIl%0AUAIlUAIlUAIlUALnRODZZ5/9/e9//9577x1Xn18%2B9Pzzzx93uvgfe%2BwxCi7Og20PN3wuL/d5y2cG%0AYPLmnZ6FU4szW4cfiThRcMQWy7CENcD5xK3BtsiModDp1OEEgod4WyMyzBBvHaxl7W5wZjaEYcQo%0A0gJhSmwqGJle3oEKLvwsNGEz12vnY8%2BIlLX1vAYe65DrfRKMny74eQQWp2g8pNtdSxinWBZHtqBI%0A9PQYhodcF5EI/fNi%2BLm/uVrrE4PAkxTSbWc6mlO1MQQsldmaYjA2wl48aT783GJMNQV2dlTHk5iK%0AEiiBEiiBEiiBEiiBErjlBHjt5JPPX/ziF5988slNFn/ooYcodRvfYw83fIYUAwOTgBPFbii4Pnw6%0AdYCDhSYFQYy5BqudOvAwF2Gt5hBiPNZGVHC6wOOiAsLxY9a3MgUVBCiwlKI4S4HF6SXRLI7YLk48%0ALJtSjaUHa6S9SOdoV%2Ba6ybxn8NWrX/vPrtj1X9OK2zDyvS3WpYdTuxtpMAG7Z7r%2BrctuTfRhSUeQ%0A6308In1ZFufUB%2BDU7%2BNFkI71GgSgsV6D/9OBLTr%2BXCDXRlgcYS5fTeLnCiucxMxFcdZ8dmN04mft%0AQq5%2BIDxz7ahntqsugRIogRIogRIogRIogUMS4M%2BiMDS%2B%2BOKLvGOfuS9v0S%2B//PJt%2BQsrufP6Hp%2BD%0A8xC%2Bx/Ou70DC1hmAt3y/7ZifjnWQ8Ai/12ALLNP1eIQlnsWXgZpUw5OyeNxSnOWMQbqReKiJk/jl%0AYZM1e5HFsiOWRLa5EnfA6TBjukdYnLNX/IRZHw8BbJdFfcvi9/JY7nzfffdZ0HYeUYRqRFqfRD3e%0A2Tt4RDyRaNsRgAfLMosW8yb43QqZrZXtmzuEFQFUYPHVJIUw08kimC1dvABPgcdbJZ1TFkXwkMgp%0AKYRRyi2P7wVMMYx4stLImt6Nm7i1FJGEUXN3xyPjrfCwjLQyOi3sMj1eZgZUl0AJlEAJlEAJlEAJ%0AlMA5EXj88cdfe%2B21l1566Wyff/KZJ5MnRc7peqcse7jhkxd339d9v8fy0u8YgOC6aqcILAunwYpY%0ABIv4LMcVUmZ8GjlU7IaLqwOGmgAEpRC7kkeGaUQd5%2BxCPAG0YxZi2YIAgzlloJrFnRLx8IzEIEwx%0A/sKFC%2BmLSKOIOBEWcViiWoTtUicQEBxxAY/SF2eCaWQYlprYtJ5aJ1NfThHE29pnSU0TsbTGsgjm%0A1DAtiQjtkm4LsoBsgJWdOQl2pR3CFD2282Kpj%2BB0bg3gEbJyap15Zz21JVACJVACJVACJVACJXAb%0ACTA6/u53v2P%2BPOHnP/dej5/z5IPT2/uZpxc73PBJP8YG3umxvvozJ/Dqr9%2BJwpEDp%2BOEA4ABCUO4%0AErMITymIsJfFbbp4PLpa8Zj/pD7B3DApijjJ5uYZPjPVKJbu3m029GHTK8IYe1GEalpFyhKQapbC%0Aw6l1PLWI1mBODeO5WGl6gkiXbbXUtNRSkFNStDZNhdS0L9splkSzkjKD1bNLWiCgka3cYuNHzHbR%0A3AedLUK2O19NCZRACZRACZRACZRACRyCAAPk66%2B//tZbb73xxhsn//0Vb8NfVeF32/IbhnzLPcQV%0AT%2Bxx0OGTm/jYvMozO82L%2BfbPuII/Q8s2IBUQzieL3aZYGZvZI8KjWdOyFuE0W7uQyMdxKRiBMynL%0A8Mnnk2RtB0WLmxVLFzvOh0pl21HNta1pLqekE5wiswLaOjqJIR7gZkneOqajcS4ec7GWwqpJmZHz%0A6%2BjRTEmu6SbO9HgSsE0hxrC0Zmu8wW5noprnRWDnwkM8nhRBsCjuUYTO3WFNCZRACZRACZRACZRA%0ACRyOAO%2Blzz333DPPPPPOO%2B%2B8/fbb77777qeffrq0v3jx4pNPPvn000/z9zzzjZBLzG3ZHm745J2e%0AacSXeO2cP/EYwPt9pp0QmVlqhw0CEHMlBUHkDZdhM2vRFMdjCy6WWYXKaL7zFssPNzpoofnuUGN4%0AOtYyfM77LI3c2igdFVgStRS3tV3cWpYA1qTh5fVjE2Y1T7EUmVkpMsX2i2LBWdb4ZKVm/AlebrLc%0AJxcjPssUI7U5Oi6egCUrW0XoRehP5eMEHYV2XED9JVACJVACJVACJVACJXB%2BBBgpf7ZbfAz2wQcf%0A8Oc9L1%2B%2BTLtLly7xBz/5gJQx5Py6n7ny4e7E%2Bzpv9s4JvLg7zDCe4XTraEdAVp4qIwEiTsLQBk%2BR%0AgJmlXjxEzoJJ3Aq7JN0At1yexRTqffzkk%2BfCeTR97tYu5MiYYlPt7JUnwjmfi21SENaZ1XCyzFKY%0AYkG0y6MlgO3sNe9A1glHnM6C6qTPROvkDsmK8MiwVEiWYWwRau3MSnCciYxIhXgQrIWkF/DIamic%0AeiL454on7SpKoARKoARKoARKoARK4PAEmDZ%2BvFuHb32GjocbPr2cb/BzzsTjIMoMwJs9i8gIdF7x%0AFdkmcom3URKTFbE9SspWpAuCG3pzRJbj5ZUrV8zldwgtR9lyAbTd8xRLx7TDP7VZybUU1pXTJcUt%0Ap1nER0cQZqQW/yKOjq99XZKFsNpSc0bu8o6%2BoFkzZWoClsSkKGbwCR1n1jYlninQy3beJEfzGrNL%0AdQmUQAmUQAmUQAmUQAmUwGkIHG745CXed3qu5Qu995sv984qCZsPsKTMGPX0JHEWT9/FmeC9wmCK%0Au2YRjhgm%2BaT729/%2B9g9/%2BEOOvvvd7%2BZnPp05GU0VBM%2B1t5dOGk2RLen4LRIRpylu1Vt7wqlH6RVB%0AEXU8ERylYMTJ8V4pwVOk7FZsGyXRgqdJSZHkKrARVtPqnJ5F82VN3%2BWo2xIogRIogRIogRIogRIo%0AgS2Bww2fszdv9ry4H73170Te432bxypMISa5U%2BOcYVPvjU9uBGFTJ2sKyxKGUGvxsPwglJ/oZew0%0AS78DZyxOtEc3bGp9q009E5dSbI3HkpItIhXiTGREwoyZFSxoZEolUbGtnMiImTLjpyZmxk89w6ZO%0A2RkcJ2IGb3U8ETN30bSYYcd1XLK6LYESKIESKIESKIESKIESkMBBh0/e3fPKzjDmd9v6Qu%2BRmpiE%0AcUude79gOSI%2Beomc/qkN23qW9GXLtb0bia48SO7gnLm1lDJlqblsicGTLsspWwO02SYs/r0Vcpr4%0AbRgxOo0xBc82N0UWkchZJzE5jSdiHi2584j4bA3LNqWm2J7GEzFrztzofKERy90SU1ECJVACJVAC%0AJVACJVACJXAcgYMOn1xivuvzEn/cteovgdtIYP4rzTUYOPV38gyTihIogRIogRIogRIogRI4PYGO%0Af6dn1cgSKIESKIESKIESKIESKIESKIEzEujweUZwTSuBEiiBEiiBEiiBEiiBEiiBEjg9gQ6fp2fV%0AyBIogRIogRIogRIogRIogRIogTMS6PB5RnBNK4ESKIESKIESKIESKIESKIESOD2BDp%2BnZ9XIEiiB%0AEiiBEiiBEiiBEiiBEiiBMxLo8HlGcE0rgRIogRIogRIogRIogRIogRI4PYEOn6dn1cgSKIESKIES%0AKIESKIESKIESKIEzEujweUZwTSuBEiiBEiiBEiiBEiiBEiiBEjg9gQ6fp2fVyBIogRIogRIogRIo%0AgRIogRIogTMS6PB5RnBNK4ESKIESKIESKIESKIESKIESOD2BGwyfd999g4DTd2pkCZRACZRACZRA%0ACZRACZRACZTAnUBg7yB5g9nynnvuuRPQ9BlLoARKoARKoARKoARKoARKoARuFYG9g%2BSxw%2Bddd91F%0A4/vvv/9WtW%2BdEiiBEiiBEiiBEiiBEiiBEiiBO4GAg6RDZZ732OGTCEIfeOCBJSGZFSVQAiVQAiVQ%0AAiVQAiVQAiVQAiWwEDhukDxp%2BKTEfffdd/HixaVWtyVQAiVQAiVQAiVQAiVQAiVQAiWwlwAjJIPk%0A9uiub775ZuvV8/Vu/Xu3joupvwRKoARKoARKoARKoARKoARKoARC4Fu7xe8cWn7t0Em/T4hPS1km%0A/O9unTCpplNFCZRACZRACZRACZRACZRACZTAnUaA4fG7u8UIuRslj36L0FwnffJJHNOmn39ir1y5%0A8tlnn33xxRdfffVVp9AJsboESqAESqAESqAESqAESqAE7kwCzJn8btsLFy7wC4P4btujjzt3C/8C%0A5AbDJ9GMnRlBEaylRLclUAIlUAIlUAIlUAIlUAIlUAJ3MgE/6szYidjSOOnbbo0mzYGTcrvZ82j4%0A7Ai6RVlPCZRACZRACZRACZRACZRACdxpBPyE0%2BETy/yoZ8vhxp98muPY6czZyXPLsZ4SKIESKIES%0AKIESKIESKIESuDMJLPPncRBOO3yan7Ez4ri69ZdACZRACZRACZRACZRACZRACfzXE8jkecMn/c%2BG%0AzxuWa0AJlEAJlEAJlEAJlEAJlEAJlEAJbAns%2BTHQbVA9JVACJVACJVACJVACJVACJVACJXAzBDp8%0A3gy95pZACZRACZRACZRACZRACZRACZyKQIfPU2FqUAmUQAmUQAmUQAmUQAmUQAmUwM0Q6PB5M/Sa%0AWwIlUAIlUAIlUAIlUAIlUAIlcCoCHT5PhalBJVACJVACJVACJVACJVACJVACN0Ogw%2BfN0GtuCZRA%0ACZRACZRACZRACZRACZTAqQh0%2BDwVpgaVQAmUQAmUQAmUQAmUQAmUQAncDIEOnzdDr7klUAIlUAIl%0AUAIlUAIlUAIlUAKnItDh81SYGlQCJVACJVACJVACJVACJVACJXAzBDp83gy95pZACZRACZRACZRA%0ACZRACZRACZyKQIfPU2FqUAmUQAmUQAmUQAmUQAmUQAmUwM0Q%2BD9kSf0dBz/9NQAAAABJRU5ErkJg%0Agg%3D%3D%0A\", \"frontend_name\": \"collapsible\", \"icon_data_url\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAK%0AT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AU%0AkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN/rXX%0APues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh%2BPDwrIsAHvgAB%0AeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAt%0AAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3%0AAMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dX%0ALh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP%2B%0A5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw%2BH48PEWhkLnZ2eXk%0A5NhKxEJbYcpXff5nwl/AV/1s%2BX48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd%0A0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA%0A4vcAAPK7b8HUKAgDgGiD4c93/%2B8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzA%0ABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/ph%0ACJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5%0Ah1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2B%0AQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhM%0AWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQ%0AAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIo%0AUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdp%0Ar%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZ%0AD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61Mb%0AU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%0A/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllir%0ASKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79u%0Ap%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6Vh%0AlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1%0Amz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lO%0Ak06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N/T0HDYfZDqsdWh1%2Bc7Ry%0AFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3I%0AveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE/C5%2BVMGvfrH5PQ0%2BB%0AZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV/MN8C3yLfLT8Nvnl%2BF30N/I/9k/3r/%0A0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p%0ADoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5q%0APNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIs%0AOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5%0AhCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQ%0ArAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9%0ArGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1d%0AT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaX%0ADm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7%0AvPY07NXbW7z3/T7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3S%0APVRSj9Yr60cOxx%2B%2B/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKa%0ARptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO%0A32oPb%2B%2B6EHTh0kX/i%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21%0Ae2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfV%0AP1v%2B3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF/6i%0A/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8%0AIH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq%0AYAAAOpgAABdvkl/FRgAAAGhJREFUeNpinDp16n8GCgALlGYkU/9/JgYKwTAwABaIDK9fv25gYGCo%0AJ1Jfo6ioaAO6CxoYGBgaidEMVYvVC4QMQdGMKwxwGYKhGV8gohuCVTNKIOIwBBsbuwGioqKEDBnk%0ACYnsLA0YAIp6E64EMj9YAAAAAElFTkSuQmCC%0A\", \"is_complex\": true, \"is_block_element\": true, \"tooltip\": \"Insert collapsible block\", \"customization_arg_specs\": [{\"default_value\": \"Sample Header\", \"schema\": {\"type\": \"unicode\"}, \"name\": \"heading\", \"description\": \"The heading for the collapsible block\"}, {\"default_value\": \"You have opened the collapsible block.\", \"schema\": {\"type\": \"html\", \"ui_config\": {\"hide_complex_extensions\": true}}, \"name\": \"content\", \"description\": \"The content of the collapsible block\"}], \"backend_name\": \"Collapsible\", \"requires_fs\": false}, \"Tabs\": {\"preview_url_template\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABNQAAAFgCAIAAAD8SbMaAAAMFWlDQ1BJQ0MgUHJvZmlsZQAASImV%0AlwdUk8kWx%2BcrKYSEFoiAlNCbIL1K7x3pYCMkAUKJIRBU7MiigmtBRQQruiqi4loAWWxYsLAI2OsL%0AIior62LBhsqbJIA%2B9%2B1558058%2BWXO/fe%2Bc98M9%2BZAUDRniUQZKNKAOTw84XRgT7MxKRkJkkMEIAB%0AVaALjFjsPIF3VFQY%2BMfy7hb0huW6pSTXP/v916LM4eaxAUCiIKdy8tg5kI8BgGuyBcJ8AAid0G4w%0AJ18g4beQVYVQIABEsoTTZawl4VQZW0t9YqN9IfsBQKayWMJ0ABQk%2BZkF7HSYR0EA2ZrP4fEh74Ds%0Awc5gcSCLIU/KyZkNWZEK2TT1uzzp/5EzdTwni5U%2BzrKxSAvZj5cnyGbN%2Bz%2Bn43%2BXnGzRWB/6sFIz%0AhEHRkjHDeduXNTtUwlA70sJPjYiErAL5Eo8j9ZfwvQxRUNyo/wA7zxfOGWAAgAIOyy8UMpxLlCHK%0AivMeZVuWUBoL/dEIXn5w7CinCmdHj%2BZHC7h5/jFjnMENDhvNuYKfHTHG29J4AcGQ4UpDjxVmxCbI%0AdKLnC3jxEZAVIHfmZcWEjvo/KszwjRjzEYqiJZoNIb9NEwZEy3ww9Zy8sXFhVmyWVIM6ZK/8jNgg%0AWSyWyM1LDBvTxuH6%2Bcs0YBwuP25UMwZXl0/0aGyJIDtq1B/bxs0OjJbNM3Y4ryBmLLY7Hy4w2Txg%0AjzNZIVEy/dg7QX5UrEwbjoMw4Av8ABOIYE0Fs0Em4HUMNA7Af7KWAMACQpAOuMBy1DIWkSBt4cNn%0ADCgEf0LigrzxOB9pKxcUQPuXcavsaQnSpK0F0ogs8BRyDq6Je%2BBueBh8esFqizvjLmNxTMWxXon%2B%0ARD9iEDGAaDaugw1VZ8MqBLy/275FEp4SugiPCTcJYsJdEApbuXDMEoX88ZHFgyfSLKP/Z/GKhD8o%0AZ4JwIIZxAaOjS4XR/WM%2BuDFU7YD74O5QP9SOM3BNYInbw5F4455wbA7Q%2Br1C0biKb3P5Y38Sfd%2BP%0AcdSuYK7gMKoidVy/77jXj1l8v5sjDvwN/dETW4Edxdqws9hlrAVrBEzsNNaEtWMnJTy%2BEp5IV8JY%0Ab9FSbVkwD2/Mx7rOut/68996Z40qEErfN8jnzs2XbAjf2YJ5Ql56Rj7TG36RucxgPttqEtPW2sYR%0AAMn3Xfb5eMOQfrcRxpVvttwzALiUQmP6NxvLAIATTwGgv/tmM3gNt9daAE52skXCApkNlzwIgAIU%0A4c7QADrAAJjCMdkCR%2BAGvIA/CAGRIBYkgZlw1jNADlQ9BywAS0EJKANrwUZQBbaDXWAfOAiOgEbQ%0AAs6Ci%2BAq6AQ3wX24NvrACzAI3oFhBEFICA2hIxqILmKEWCC2iDPigfgjYUg0koSkIOkIHxEhC5Bl%0ASBlSjlQhO5Fa5FfkBHIWuYx0IXeRHqQfeY18QjGUiqqi2qgxOhl1Rr3RUDQWnYGmo7loIVqMrkYr%0A0Rr0ANqAnkWvojdRMfoCHcIAJo8xMD3MEnPGfLFILBlLw4TYIqwUq8BqsENYM3zX1zExNoB9xIk4%0AHWfilnB9BuFxOBvPxRfhq/AqfB/egJ/Hr%2BM9%2BCD%2BlUAjaBEsCK6EYEIiIZ0wh1BCqCDsIRwnXIA7%0Aqo/wjkgkMogmRCe4N5OImcT5xFXErcR64hliF7GXOEQikTRIFiR3UiSJRconlZA2kw6QTpO6SX2k%0AD2R5si7ZlhxATibzyUXkCvJ%2B8ilyN/kZeVhOSc5IzlUuUo4jN09ujdxuuWa5a3J9csMUZYoJxZ0S%0AS8mkLKVUUg5RLlAeUN7Iy8vry7vIT5XnyS%2BRr5Q/LH9Jvkf%2BI1WFak71pU6niqirqXupZ6h3qW9o%0ANJoxzYuWTMunrabV0s7RHtE%2BKNAVrBSCFTgKixWqFRoUuhVeKsopGil6K85ULFSsUDyqeE1xQElO%0AyVjJV4mltEipWumE0m2lIWW6so1ypHKO8irl/cqXlZ%2BrkFSMVfxVOCrFKrtUzqn00jG6Ad2XzqYv%0Ao%2B%2BmX6D3qRJVTVSDVTNVy1QPqnaoDqqpqNmrxavNVatWO6kmZmAMY0YwI5uxhnGEcYvxaYL2BO8J%0A3AkrJxya0D3hvfpEdS91rnqper36TfVPGkwNf40sjXUajRoPNXFNc82pmnM0t2le0ByYqDrRbSJ7%0AYunEIxPvaaFa5lrRWvO1dmm1aw1p62gHagu0N2uf0x7QYeh46WTqbNA5pdOvS9f10OXpbtA9rfsH%0AU43pzcxmVjLPMwf1tPSC9ER6O/U69Ib1TfTj9Iv06/UfGlAMnA3SDDYYtBoMGuoahhsuMKwzvGck%0AZ%2BRslGG0yajN6L2xiXGC8XLjRuPnJuomwSaFJnUmD0xppp6muaY1pjfMiGbOZllmW806zVFzB/MM%0A82rzaxaohaMFz2KrRdckwiSXSfxJNZNuW1ItvS0LLOsse6wYVmFWRVaNVi8nG05Onrxuctvkr9YO%0A1tnWu63v26jYhNgU2TTbvLY1t2XbVtvesKPZBdgttmuye2VvYc%2B132Z/x4HuEO6w3KHV4Yujk6PQ%0A8ZBjv5OhU4rTFqfbzqrOUc6rnC%2B5EFx8XBa7tLh8dHV0zXc94vqXm6Vbltt%2Bt%2BdTTKZwp%2Bye0uuu%0A785y3%2Bku9mB6pHjs8BB76nmyPGs8H3sZeHG89ng98zbzzvQ%2B4P3Sx9pH6HPc572vq%2B9C3zN%2BmF%2Bg%0AX6lfh7%2BKf5x/lf%2BjAP2A9IC6gMFAh8D5gWeCCEGhQeuCbgdrB7ODa4MHQ5xCFoacD6WGxoRWhT4O%0AMw8ThjWHo%2BEh4evDH0QYRfAjGiNBZHDk%2BsiHUSZRuVG/TSVOjZpaPfVptE30gui2GHrMrJj9Me9i%0AfWLXxN6PM40TxbXGK8ZPj6%2BNf5/gl1CeIE6cnLgw8WqSZhIvqSmZlByfvCd5aJr/tI3T%2BqY7TC%2BZ%0AfmuGyYy5My7P1JyZPfPkLMVZrFlHUwgpCSn7Uz6zIlk1rKHU4NQtqYNsX/Ym9guOF2cDp5/rzi3n%0APktzTytPe57unr4%2BvT/DM6MiY4Dny6vivcoMytye%2BT4rMmtv1kh2QnZ9DjknJecEX4WfxT8/W2f2%0A3NldAgtBiUCc65q7MXdQGCrck4fkzchryleFR512kanoJ1FPgUdBdcGHOfFzjs5Vnsuf2z7PfN7K%0Aec8KAwp/mY/PZ89vXaC3YOmCnoXeC3cuQhalLmpdbLC4eHHfksAl%2B5ZSlmYt/b3Iuqi86O2yhGXN%0AxdrFS4p7fwr8qa5EoURYcnu52/LtK/AVvBUdK%2B1Wbl75tZRTeqXMuqyi7PMq9qorP9v8XPnzyOq0%0A1R1rHNdsW0tcy197a53nun3lyuWF5b3rw9c3bGBuKN3wduOsjZcr7Cu2b6JsEm0SV4ZVNm023Lx2%0A8%2BeqjKqb1T7V9Vu0tqzc8n4rZ2v3Nq9th7Zrby/b/mkHb8ednYE7G2qMayp2EXcV7Hq6O3532y/O%0Av9Tu0dxTtufLXv5e8b7ofedrnWpr92vtX1OH1onq%2Bg9MP9B50O9g0yHLQzvrGfVlh8Fh0eE/fk35%0A9daR0COtR52PHjpmdGzLcfrx0gakYV7DYGNGo7gpqanrRMiJ1ma35uO/Wf22t0Wvpfqk2sk1pyin%0Aik%2BNnC48PXRGcGbgbPrZ3tZZrffPJZ67cX7q%2BY4LoRcuXQy4eK7Nu%2B30JfdLLZddL5%2B44nyl8arj%0A1YZ2h/bjvzv8frzDsaPhmtO1pk6XzuauKV2nuj27z173u37xRvCNqzcjbnbdirt15/b02%2BI7nDvP%0A72bffXWv4N7w/SUPCA9KHyo9rHik9ajmX2b/qhc7ik/2%2BPW0P455fL%2BX3fviSd6Tz33FT2lPK57p%0APqt9bvu8pT%2Bgv/OPaX/0vRC8GB4o%2BVP5zy0vTV8e%2B8vrr/bBxMG%2BV8JXI69XvdF4s/et/dvWoaih%0AR%2B9y3g2/L/2g8WHfR%2BePbZ8SPj0bnvOZ9Lnyi9mX5q%2BhXx%2BM5IyMCFhClvQogMGKpqUB8HovALQk%0AeHaA9ziKguz%2BJS2I7M4oJfBPLLujSQs8uez1AiBuCQBh8IyyDVYjyFT4Kzl%2Bx3oB1M5uvI6WvDQ7%0AW1kuKrzFED6MjLzRBoDUDMAX4cjI8NaRkS%2B7odi7AJzJld37JIUIz/g7NCTUflsJ/Fj%2BDdjNazxy%0As4mXAAAACXBIWXMAABYlAAAWJQFJUiTwAAAEJ2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6%0AeG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAi%0APgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRm%0ALXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAg%0AICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgICAgICAg%0AICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iCiAgICAgICAgICAg%0AIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAg%0AeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIj4KICAgICAgICAgPHRpZmY6%0AUmVzb2x1dGlvblVuaXQ%2BMTwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPHRpZmY6Q29t%0AcHJlc3Npb24%2BNTwvdGlmZjpDb21wcmVzc2lvbj4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24%2B%0AMTQ0PC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZm%0AOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj4xNDQ8L3RpZmY6WVJlc29s%0AdXRpb24%2BCiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4xMjM2PC9leGlmOlBpeGVsWERp%0AbWVuc2lvbj4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT4xPC9leGlmOkNvbG9yU3BhY2U%2BCiAg%0AICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj4zNTI8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgog%0AICAgICAgICA8ZGM6c3ViamVjdD4KICAgICAgICAgICAgPHJkZjpCYWcvPgogICAgICAgICA8L2Rj%0AOnN1YmplY3Q%2BCiAgICAgICAgIDx4bXA6TW9kaWZ5RGF0ZT4yMDE2LTA0LTAyVDIxOjA0OjMxPC94%0AbXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5QaXhlbG1hdG9yIDMuMDwv%0AeG1wOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8%0AL3g6eG1wbWV0YT4K6FkWAQAAQABJREFUeAHsnWGTXEmSVbvVPewu7IJhGBif%2Bf%2B/ic%2BYYRgGBsva%0ATEviRJzMW673slKpklRSSzdG7eXhcf26x30vc14oq0q/vn///peOKlAFqkAVqAJVoApUgSpQBapA%0AFagCX1OBN1%2BTvNxVoApUgSpQBapAFagCVaAKVIEqUAWWAj189j6oAlWgClSBKlAFqkAVqAJVoApU%0Aga%2BuQA%2BfX13iFqgCVaAKVIEqUAWqQBWoAlWgClSBHj57D1SBKlAFqkAVqAJVoApUgSpQBarAV1eg%0Ah8%2BvLnELVIEqUAWqQBWoAlWgClSBKlAFqkAPn70HqkAVqAJVoApUgSpQBapAFagCVeCrK9DD51eX%0AuAWqQBWoAlWgClSBKlAFqkAVqAJV4PfHJfjrX//6f//v//1//%2B//4bx79%2B7xxCKrQBV4UIE3b978%0Aq3/1r/7hH/7h3/ybf4PzYFZhVaAKVIEqUAWqQBWoAlXg%2B1fg1/fv3z/S5f/6X//rf/yP//EIspgq%0AUAU%2BXwFOof/%2B3//7f/fv/t3nU5WhClSBKlAFqkAVqAJVoAp8Dwo8dPj8b//tv/3zP/8z7f7jP/7j%0Av/23/5YPZHgy/h66bw9V4AdTgO8p4DsL/vf//t//5//8H7b2r//1v/7P//k//2B77HaqQBWoAlWg%0AClSBKlAFfk4FPn749DNPTps8BP/93//9zylTd10FXlmBf/mXf%2BEvfTiL/of/8B/6%2Becri99yVaAK%0AVIEqUAWqQBWoAl9DgY98gMmHMH63bU%2BeX0P9claB5xTgL3r8zPN//s//ycvwOVjjVaAKVIEqUAWq%0AQBWoAlXgz6LARw6f/IYhdvJP//RP/czzz3JF2%2BcPowAvOl56fPjpy/CH2Vc3UgWqQBWoAlWgClSB%0AKvBzKvCRwye/2xZdeAL%2BOdXprqvAt1XAl54vw2/bSatXgSpQBapAFagCVaAKVIHPVOAjh0%2B/36//%0A5MNnqtz0KvAyBXzp9dtuX6Zes6pAFagCVaAKVIEqUAW%2BKwU%2Bcvj03/Ps77b9rq5Zm/l5FPCl58vw%0A59l1d1oFqkAVqAJVoApUgSrwQyrwkcPnD7nnbqoKVIEqUAWqQBWoAlWgClSBKlAFXlmBHj5fWfCW%0AqwJVoApUgSpQBapAFagCVaAK/IwK9PD5M1717rkKVIEqUAWqQBWoAlWgClSBKvDKCvTw%2BcqCt1wV%0AqAJVoApUgSpQBapAFagCVeBnVKCHz5/xqnfPVaAKVIEqUAWqQBWoAlWgClSBV1agh89XFrzlqkAV%0AqAJVoApUgSpQBapAFagCP6MCPXz%2BjFe9e64CVaAKVIEqUAWqQBWoAlWgCryyAj18vrLgLVcFqkAV%0AqAJVoApUgSpQBapAFfgZFejh82e86t1zFagCVaAKVIEqUAWqQBWoAlXglRX47g6f79%2B/f2UJWq4K%0AVAEV%2BFKvPl7DfRn3pqoCVaAKVIEqUAWqQBU4KPD7Yf6aU590f/31V5zY12ygtT5JgXky4Xp9Um7B%0AfxIFXnhZbx41E3wh6deR7Pvs6uvstaxVoApUgSpQBapAFfi%2BFHi9w6cnTHev74EzR5qcPxP5fKle%0A54x0p%2BHXaeDzhbrJcGdf56XX3%2Bm5h8MuXr%2BlQwN/uil/pbBVfdlpMce6ue9FdVz49ZeXFZi8j/ir%0A7ge1z5MPGunfqDyiajFVoApUgSpQBapAFXixAq90%2BOSJdp4E8A8nh0zjvHhLSZwVE6zzOQrk6lTb%0Az5Hxe8jl29v3UXNZxz6qfXA8e7zPO2lX%2BsfJvgxyb%2BeJ6rkOv1V7T53VqwJVoApUgSpQBarAT6PA%0AKx0%2BD2eVnGHiILgYIgfwzWsxEwU8knWTqsFHFDgI7vRbaX5o5pH%2Bi5kKXE%2BenMj8a6D9WeT79TGh%0An0rePKqdz2lPsCdv1ll0WTmnfwj9yCw84h5nuyau7V39xSHD%2B/ExLKuP036k3S5XgSpQBapAFagC%0AVaAKnBR4pcMndTkwcFbR2oZHiEScijz1uQIB3F/NiSjMN/EfDT6efqexx0lu9vOp6dn7TbaPBg8b%0AcTrtZPBqEjkXPUdm4k3/UPrFmJkI5/1O7q9Oqh/M99NOtr9lXzJcfs8XxzP8d%2BuMNs9pTDmVsXQc%0Al%2BPcxh8S1o2xXrQ7Zbs7XQ6iY3Zkvc4vjB8QXzMNymaJbT9Msb1lV/zSy5WdrwjArhbJOIKmtUE%2B%0AcupWgSpQBapAFagCVaAKvFSB1zt8%2BqB/fd699JuDzTx7gGGAmMH4cQ5bNsWs%2BMGcI1nSuUl7M3hI%0AZHoHRt2s3u8hsAP/zfhzVDfBB8KPTkOig40zc%2B3h0IlT8RP8Mv/Ac5iGc8ZnP/hZmvGbiQk%2B7oST%0AKtZK5HGSb4jcn38i0bqBPZgte3F/eWdo98ercZ/e9nny2vElhentkx0fqrK2T3aryJ7u2ZVgZ67I%0AM2Olb27X9/QpdEjcxQSaA9ytUHu3qrkQ2siv63PPdabeZFfGHQGXghdaYPt9KdM6VaAKVIEqUAWq%0AQBWoAp%2BkwCsdPnkK9Onc5pgyzn5az%2BohkngcAD4REjk8GqZinLA950zaM%2BbALyApcZKYuiaeAUHG%0A%2BSjmQHWzpbC9wEkDOPo68eV0a6meKbAEX1CdFAvN3BmZvphzxLgt4dtPYJ/Z3rmxSWiVGZn478en%0AT5r0JLUOWR609ld%2BFPT9u8tHn75EOZP5mec6qO1z2vWle8lken01H7e4PlrcKYtkH10pgn858%2BFc%0AuI6JT%2BFrdyBSZXV%2BQayPLJldp4vHFfYIHv/ibD%2B310pZAqDDL2/2ZJ1C1/88iC6e3eacGqytAlWg%0AClSBKlAFqkAVeKECr3T45DFvPQnuB0HtfiK8RFxyByIvz8VjU0mfYNeNHBIP08H0rJsSZ8S5nwPm%0AnDsbYPWjDBBKMp1ZRYYHqWbiC/zZyTuOInvMxmjGfkJ%2BmBq/GQx5cu84AetkmpRzJEs4NAAgbcSZ%0AmM/05U%2BV2U%2BCn1niy6Z7hPPluM5Xl1PZ5aPOfbH3%2Bc34Qqzz3DqobX%2B9aPe4Hu3WKv%2BT9rq4szxi%0ALrvSF4MHUA90V05TVpU9Jj%2BB/R4BwQ5f1/jq6REAzp5eT40LYzMri4qcpN%2B/W7uz4d0EWastjp2m%0A7X/v%2BDpZlKvbjipQBapAFagCVaAKVIEvq8BrHD59Ekzf6yHwNLKqwyFhnhOAE0%2BSflJExq7MPQDw%0ANXY6yZWZaUq4lPhkmP6E2VhIXJpgfAkNCohNLZ1pgzmwpURyg8QRfHMpqxM/fbIOI4dP42Ggyps3%0Ab2JxHMBwhOGHfPoJ6pyXEtGJTfzAMKepTjAt6Z/TBc/0g39OkeoAO09J/Cj5OesVIvsQyAVaR7Z1%0APNslsXic0C6HtH1uW0sLtU5jS0kmntV2mNm7lbUU2izLcezrv7Drk899piOCz3yf99a5c3Ne8Ocv%0AlsZKukoAkn/3sEtwetxEq73r6ua67mJ9iMvhc1t8STaLnax7eJH89obPP9/T3Ju119Xzhu7Wz801%0AUgWqQBWoAlWgClSBKvAiBV7j8JnG1mPqdcwjDT6PkKyAvDxL%2BrDrA%2Bb1wfaaur6GU2c9gu4hw3W2%0AvoYT/5zIqsHYYHAO6Ytuk2BnIkhGIjgMMdMmuNefjLnMN80TT%2BImhipOAEbCmHgi03H1kCLAJSzD%0ACxSrEx7SGcA4f2qZ4geAQ5zgZJ6rN%2BOkBKOPPTvBHBzLxeKQm6k8pBgx1%2BCMzPiBP9OZZe6M4BM0%0AnpTvz9kHLPTe5zqPZ8jPCS2%2BN7V6oaVb4pLue3TliefLotl2rV0Oh4sf8D4fKsgvb0BtFuLrzth3%0AxzYfyLP4F%2BGFU8fIWrjyc45d3yW7/qymwiN%2BnTnXbfz%2B7f6zNsXh0yb3PUDOb%2Bum/fW33xbr%2Bze/%0A/MbeOYVaY2GWNJeD8gp2VIEqUAWqQBWoAlWgCnyWAq93%2BFyPfR8OzjMeaQy7j/UYeXk03I%2BU%2B6GW%0ACJgz%2BGbKSvtwCINB52xdsg1tMDDhY3Oywg/VISW5Yg4WniSGP85zVFbXQpgBHt/06YfwBY7tRed1%0Aecaww9mJkd9%2B%2Bw2Up1BX04%2BEh05m8KZvMBYnAyr8A6FFDaqPkfgHPAyR7rCU6awy/STiyDNX9V2y%0AhxB%2Bf85FR9SkbayfEHJU24fPdQRdQvPfOnauIxl2/%2BFMdslZpzuOZ/vTRQ9qC87q5Xy4Tp7vTN%2B5%0A%2B%2BS5zQ5iliyXu3i5l7G5KL//rOagXU2uwqsHzPpLD16VUKyPK/e48oDiI9m9nV/evvvl7dtf/tib%0AwvcTUdAkrt7e/JJ3QBp899sv%2BxxqV7vMldMKtVWgClSBKlAFqkAVqAKfo0AevT6H5NNyeYQcJ5qL%0AC4WPljy4Z4R3PXZ%2BePhk6ipgnKRwBIofR0DYDo5Uq8CHI1nweLIKIY4kH2asGXFsAKaEyqyzPfNI%0AFeQsHX/SpmJS7jiCzylpY16gt2/fOmX1X/7lXyz693//92jC4ORJHIe4znPk9gMmjekncnCYPjfC%0AcKjFNBH92KToCDv7E0Z1p3GYhl9ffgCJT7D%2BrDX5v5VvV26OHTLF3x8MvudSv33Pae3dOqetg9r6%0A5G8dG/fRcb%2B0Lgpcstar8vJ9rZtq7Wm/IIH5meewnBIvB9FNuE6oS%2BHD%2BU7R5V%2BNLW81yWEyg888%0AaYbX%2BvrckrXF/CSzWTT2x9v1sSf2D3a0fbulIgdWUn777dd379/85TcCUK5Wll0ffvL16Ztvry/3%0A1K9TBapAFagCVaAKVIEq8BIFXvXwuR4jryPHG842f/zxx1//%2Blfa5yTz%2B%2B%2B/e5JZD5PXhz6SwGsB%0AkwIYJFaMFgC5MqzkPQ4YpnOQwhR7HsLggNNVHKdhSJbt0RsOGDaSdKbxkxgHBnytJOE0yCoMc9iG%0A8djp4N8fsAGQM8hZl04YHjtz%2BDQIjER2ShsMpp4/4XGKlTzMcbKjg%2BP0pqUocUYc2JimxNwFGKY0%0AQEs6wvDTg04iZweA/NPOdFLOIwCW8LWhyup343jM8p/05ADG0W4dI/d3qP6yzmxv3//1j3c4NPzb%0Am19/X3Ii7Lr01%2B%2B6XblvVxaHVcC466T6F9AbtC3LS8w3v/36d39582ZdHM%2Bim2efPOGf12bV22Ox%0Ara724fP6ieWqsPB0cjk6/sbvp33/63qxEd11QaxEutrnZ3rj5PnHH%2B//tk7Ua4ObeYFI%2BYe/%2B51t%0A7KZoaTGsMygUqzf7ughlV7VVoApUgSpQBapAFagCn6PAVz98rme9MZgyPEhgOdgw/va3v3GYWU%2Bm%0Ae6xHwA8PMKaANwW7aRbzeuDcgyBZLnn2MC5G5ptWqlgZgoQEWgacWpA4Aswyxb2EBwC5sSE8O6QQ%0AnFQSGpfBNmJxGC4dLNPzkMoUVnf2hcFperA0lu1o3ZdxfJBkcsmiBhHPn0okwB5AyuxUPxEc/TjA%0AZsQ4pa2ODQAHcu3ayfbB48iAA964FnBGIjcB6QH89APGceROQw2Q3hgs4WMtN/008K2c%2BWp0a76W%0AeEntkx4nz3Xm5G9R1p99VHv7hoPc2hnHyn2yXL1zz7LIWY5EYH/7A7J1Ntyar0vDKQ4LZmVx0Hv/%0AjiOoQYR5undvCbG5LiVsjOZoj/%2BRuMnXh5a/v%2BMbZX99zy8LYtAeZ2P%2Bty/Z2gv38OptbYeT59/2%0AWXp9BLo3Bclf3vz6N37Kc99Hq6X1Ql9VoNjfDwwT0cVI4Hoxb7W7K34EcTuv0SpQBapAFagCVaAK%0A/FwKfN3DJw%2BRPJOtR8k9lFZ/PRruzzx18IPE4TFwPsyBIQvL8PzjVMwEGwGGk3H/ktpPuopDlgx%2B%0AlEqckwbB9Rh%2BHQFTUV9Lk1fIx7%2BSAggrSah07ME9TmucRJyDTUmZM52wZOnMHqjrYBcZRoSZQjME%0AiTg8fxJkCJh1wTjVMYXIdJzOoPwpHQeMVSg0B3Gmch7iLJ0HGILTMk2H%2Bk6TK9jq3g9EmALAnsHi%0Ak/7NHTbMUWod/i6Xbt94u28u5v6ccH%2BfKufJ9X2qnMX4Uchf3755u86Q67tbL3KRsT9d9MPSdVhd%0AZ09OgpdX3v6Ekxzq8NOVWx54dnoEvy2GdwrWBqmCQyO0wt98QAgpn6/uk%2Bebv6yfReUAuQqwL76t%0Adznr5Lnwy%2B5NsReOx39bbzjEF2a1xo7WX3mxLTqk8wWmAO9Z7O5y4db%2BN%2BVKunS%2BvA/H93aVP%2Byu%0AsypQBapAFagCVaAKfC8KfMXDpw9wWAbb1ZnWswTHG7%2BTlgc4Dxv7eXA9TeaRTmTwEroqGMsgjgW2%0AZ8tMkuckP7Q0pzB4psq3%2BMoZWsCzN/ykH8oRP0QyTYps04rxqIONs/a2BwC%2BHmyYdVL6gJTBoBj7%0Ad0c5duoYFEYKU5UhkmGEJfqcPQBgerBmGT8sJUjcuqmOI1gp3ML0jQDT0Z6bIcLSwQaWfnDiBy8n%0ARanCludmWbKZA5W5CX5D53Ibrk/zngZB/qAsp7v1aeHbd3zP7fo%2B1bfrqvHCQqp98vzw8MlpcB/t%0Alt2XBfDbBV7bveD356VcjXf7m25RnKWL8E/1P2jGO2W3dD1A7oPufmmtHJj3/cDrfU13qfW9s5C/%0A28fddc3WjkxfTfKTrLtVjqOcYKmwfrftL3/88ofHTj7wXIfVNd6tnwYle5GvbzDeva4ynzig%2Bn4u%0A%2Bif2XngVqAJVoApUgSpQBb6WAl/x8Dlb5lEs0/WINw4VnG14lMTuZ9Z1gATJE3we4jf8cggRbEQ8%0AlnTBxBOEBD8WR2acwzAOibRxgMFAkAOGtCzphMqUJAJgJJhCwROZvgAjWHM3xyLBEbDF4LF6HWwY%0A9hALBl%2BrY5b2UG4iZTARWAZ1c1FwHOnqgJ%2B18CGBFjvjMrvqkpHpuzqtGOtOS5wS0QGH1UzdVCyE%0A%2BFiHFfWNTzsxVtdekvcX8NbCetjGBqBvP9aa1QP7ho5iXHV4ulLctpdD2vohyf0R6PphTsLrUEcW%0Af5%2Bwfl0QH36us9n6j3uUT0rXoW4fQdclB8zv6tm/SPbNO1Lec%2BQkcUXWS2dBLoKP8%2BYH98oiufDz%0A1U8v17d6X3/sk2Z4BXAL7A8v1yeWVOd3Dr2jNcgvylqL8%2BiFmy%2BQrj9xSPh1f6a6q1xXF8E%2BHcOw%0AjrOXbq%2B8F/oHvpj4ALCQKlAFqkAVqAJVoAr8RAp8xcPnzccvnstRF7ueJ6%2BHHD/5JE6KT/YceHQI%0AghQM3sE0l0hYEnEcsgUmz5xOf1e4nP30sfI4FXzl3k%2Bo%2BymeVVuaJzQiIUldIqk4/QkIm45LKcpO%0A3ayWOIDYOAkeqhB3hHCmsASecZH4emkuR8/9FwQCQNKASCNaE1eL1%2BOxnGFO%2Bh0H8AGffnTMnVtI%0AxdR1FZ7zBjf9kzkAsmCV2MRT16K05GkzcSKAWSVX8jgh%2BeYOLa0T1r7gNMMBb%2B10n8rWYe/9%2BuST%0Ajz3Xz3y%2B5X64oPk7Dy5svu2WMEuePHHY9zrZbWI2vsH7Z0TXX5Xsb8FdR7ldlsuyJdivhyejLHtO%0AK4tpvYrWB5KX76G1SRrYh08UXoROf3vLT5byQ6XkXNg3%2BNLRtRoZsLkjPvjk51EvH4q%2B%2B20FLzq8%0A3z%2BnCnTxr5/3pN3rxbTH2ipQBapAFagCVaAKVIEXKvAVD5/njvYj7uXkuZ4O9/BQwSGHGU/tHjvJ%0A9SyBM2E5gUjOgy0RkThMM87VpUqiDuTGrYKFxwhUMAvDcclyZiWRoIPmr%2B56cnYIi50OvuOKXdXx%0AtTisZkduU2swq3GISzitPGKMh3MG7cHSbmTa2RI%2BbXjuktxcLHFG2suq6ZQLUv9gmTqEzWbwnQqw%0ABLVEMmU1%2B8IBpr0wji92ldU4QiTE1xHsEkjG3uIyk4d4MDMuT1bFfEM7t5M2uNH2fcdhjLH8yw9/%0A/rGOl%2BsAtrTk4t44fC7wTvHcuA%2BE%2BwPS9ZmnH3jue3hdjhRczn7hfRC5BPeXdfq7Hjt3b/vFsK/p%0A7%2BtFuX5%2BlJ/S/H2XXufGdb1YvhJuxemZovvPmmdxVVgF9h8v9A4thtVWRxWoAlWgClSBKlAFqsBX%0AUeAbHD7dB4%2BWjPWsuwfnHCOsEuBRUcvUuDBsYCwBYxDR0RrHOli9us9%2BlXNaoDLrWP0AYCld4bAF%0Ahg5InOBB4mOn4zQRwcnCCYBOOOoQ0WazAPC1BhNJburOpWQlKCw9UCvDTTF11ZRJSyTpnEhBphlT%0Aznam4J9HUmxj9iCYEh7/RFoxdXGAac/k9yMpDUxffEpQl%2BHZmyWrEMHHkiIeZzZwmIr5FhZlPnxF%0A2PE%2B7dE7l5nDpN9Jy6%2BK3a9L2lynuP23CuvzwDXnDr8iuTX4417WGY9Lc/2e2338I7C%2BTTbjg/J7%0AghGQpc2/q%2Bx/rGXTLxQC8/OaVHnLD2ryiSW4S%2BcXDtvbvzZod0Jx%2BtldLY%2B9TwFMX9tRFL9ev1v3%0A0rGUab9OFagCVaAKVIEqUAWqwAsVeNXDJz2uh70PRw45hsGsZ8Q9sidPPiIDC5LINWM9weIn8RGH%0AdGDSHsiJe5zIapAyG88WcNYB9PpNqrYNxixTDjarKTEdwG6NoJ2cd3qOHErM6UGcTA9t2PncV/ZC%0AiuBJq895zD4nLRFG0p2Kx8cJOE5W00AYiLgqWMsqjuMOoYl3rP1g4wDWh1xmrgI9uFOpiLBKcN4q%0AggVgJcn0%2B3G4AOsabLv8faTkRMdh0vMnh0%2BmAJa87/axbx/NiInx5Olnj2iETtwgKLL/TdDlMN0V%0APjj0rYqX8FrMSzbBxU83%2B2C5yPfCvvXA8kOe65tjjW%2BUFbbdr36MpUF78tzW9qj94XnSTi7nz63F%0A4KtbBapAFagCVaAKVIEq8KUUeO3DZ/pej4zXwYM7LpYHVQCxOqJYZQgLCQAGQR1s0sWwdIgcpgKw%0AB0cqwC656hTryBKO7WE9eWINigGPc8278VXYwaaKu2N63ma2PDE3CtwNpTcbAIsTtQ9dMaUWq2dK%0AlvLJp6vmSoVvFs7MnZ27nZkrgynTgoHNo6AM5k4GeWZk%2BqmCM5mtmCBOmHFYpai5XGUitDGHR1CR%0A0ppuyndq17lrNXv9s85163S3PwLFRyH%2B4/zGv5vidlxd588F27mX785dBzwOd2RNfDb%2B4cVf4PPY%0AbdgPv2lodbX/2xdi/b6jNVZH68sHA7b9FkBwXYF1BuYP36C7/hXQ5aw/bG2fh32zWPm3eviAt5Mq%0AUAWqQBWoAlWgClSBL6HAtzl8%2BtC4HiH3YCNXdz1M8tjIMOgeebgXEEcYQcGx4g9WNlOwZE2AU/nn%0AKlkH5MyKb6LWQ4jnz7QaZlLSSdJxJgN%2BIhMzmwGTKY6%2Bjv5MvOlbxUICUvcwJe6YPESYskEsFbMk%0AktNXgkTU4ayGGGyGPExD6FKmOJZOZE6nHwBOCM9sEpqIdRg8MJDLKtbjrrRM2Zfjmv30ldVJ8j37%0A%2B55bDeJwbfcfNrLPn9uuhcuB7fKqYPl6QM3hk0McEi3B%2BQc/OXnuHxVdtAqxquxD7DVwOSheZJqg%0AdbS0gcsVp5m1vv5b7qZadA5Tt1X11QKt7H/Ac58/PYVe7FoicbW67ZWmX6tAFagCVaAKVIEqUAW%2B%0ArgLf5vB52JMP7AbXI%2Bd1%2BCBpJJhMr6inrzPXaBhwGACwTwnrSXaVw8aZq4JX5odZSTFRm0PI9Txy%0AOTDLTAok%2BAcqc2fRc8RyJsqADaGOGOxzw%2BqsmmsV/QRnbpYIJjeAkLBZAXMprVoFDI4WGL4ALMMP%0AEnHCEN8qC7RXdQwGLGGm51WWTBQplXjAhyHGVW3wOuDjHHIznel/Yj8vxP0pIwe%2BS2BfKHzuQV%2Bs%0Ay7/cV%2BtYyKlz/S7ZdfbkmIghdhlXb0XBLcDlf0%2BoRbvY/LMyUmVlrYu5Enfydi9mM%2B0Fb5b9%2B2/5%0A6VM%2Bqc7Hnjh0tg6lEm3kZpMQ21EFqkAVqAJVoApUgSrw1RT4Lg6fPE4yeHZnm/nczGA27tRHf22W%0ATMz07JBrcDp3sqwleKZAkmmqwDOHR6wZCfI5B07wc3VG8B0TcNMHlngIEzQSO4%2BCASc9WYfIAcnU%0AARtIsphiGSYyZYlxwe0vIrEeO00Rb27SccAIwIFnLpmiBYOjnQ5%2BUvSDEcb0PFhikDhzDWpJiTPT%0AJ%2BZP73s45ErqXARBlnVQJMbVvvrruDi12vqseyAn1qMaK3sxM5bZJfi6dN38a%2BHDQS1WtiV5VV6%2B%0AwfV1cSS4Onz6aU8//Fw/Bbq/C3d1S6WF3iT7i2aHlttRBapAFagCVaAKVIEq8OUV%2BDaHz/3oyNPh%0AceSkkQWeYvE5deSgogZ5%2Bo8kRgAnMp0QEjxgLEE8jmCRdxIn/8G3mdhUnMyuWjfpItMJ8dmAU8Ei%0As%2Bp08oQ/QR3iLunos4QTzvjEDQrDD36yEWR4OATDkDBxHS2rOFpJtCvtOox44Lx5VwAAO9P1YcbR%0AnleJnLPsKvacdW3qg68HWOre4TmkfD/TpePWEoOo%2B8/eLGc1fsZ162wcHweNOTrujw%2Bvm%2BCvF3DX%0Af45Ft2CbdvmX/54im5DTIJHF6eAr59X1Nxk7ZR0tF8vubsM2/trhU7er/0WykYtsOYuWDzlXIT78%0AXH%2BRsSiI8MGrrW3KZXbqrlpTBapAFagCVaAKVIEq8NUU%2BDaHT7azn/g%2BMJwxGC5h9XF4mgfHwQaf%0AgTOf7/dzoyv7YfPiri8uYaHCZghh6oHhpkPwkEVkcB9dqQ5RmbEMlrBzgwazlzgiQ7iS9zCOaxUd%0Al2JZMhEbpPiDDX9SdMiauU5ZOrAd0pkyDn9HYNC4fmrJRvBAm0KJ4zDQTXCcmQuAKblfcOyyH5iP%0A3g9fvIcvuJ2PUF2Oavuctg9tnPF%2BW/%2BcyS/8Xll8BvfduhDbslP05mc%2BWXm7qVldL9DLvXnB75WL%0AWSvX1S3rhc0fEF6RDYTWK%2Bnl3LO9tDrkPWEB1zHy2glBE5/sCvEfP3a6loLf508Y/LbbdcTdSwvr%0An51Fyq40W69fBapAFagCVaAKVIEq8IUUeO3D53p4/HDwTO9gR6xgmQbClOfc%2BZEaSzl/HkQwPcGQ%0A4Bw4xexn6P0cvUvjhcHcQ1YISccHP2vFd/UwTa5OVu2BHSUiM3ZGnCZ3Tg0aIQXHjcz2ph/aOKaY%0AGztX4%2BvIb93gLeGVCp5gBkH8LJmYtufUYKyFuBZgItRMNFdy4jha49jHR2hxGN4A0xKEbS9ejORO%0AHi/0nSDX8ezayvIv5zo2vv78vn9tEH/Zc13axz%2BuI596vl//Fuj6XPHd%2B1/551j4pz73C%2BKDC3xl%0Anl831focktPgb0thvK3nBkG7zrQXy%2B80Wp9RwrmaXB9j2hj4yx%2B/rNUx9pTOcpZeKN9TFgN97iY8%0ASC%2BqlctX/9uTwVa3ClSBKlAFqkAVqAJV4Esp8NqHz/TtwzqP9Y75T0RmaT2WXg%2BfnDoY/uMWxOeR%0AJpxxTNTCjxMLxngYdCw0GUwBLF4rYEbW8hhkQQiMbrGsaIXImXh6YBW8iekHmGOSEJlTaWNZnZwh%0ANIXpwbkUuHIeyjmVxMQJwJ9Bl7DineLPqXisIymHKXEirqJYYDoHzrlKVsqFAYD82onXDxLH9OC9%0AXlidxEk8BEMVtnOh7zSyOvactjz%2B4x8m%2BY1/nuS39X21a23fNTjrRMoyV2YfDn/b/xbor2/fcYp7%0A%2B44b3lflOiuOsc6Oiaxcvgf2coy8EK4X6AqvJF46659C4fzJLyziQ9d1sVe6AIDrvLr/0Mc%2BPV6W%0ATN/9Lh7G5gO1ut%2BD8%2Bfl%2BLr6ocSaXg6l%2BLuJa%2BJOvnKuYEcVqAJVoApUgSpQBarA5yvwGodPnvzy%0ATE/Hl0fB6xcf4jl8soSvZdHHfabkrnPn9eSpj13PpfuYB%2BbmuFZ4OnkmYuImeDKQGAeGb2O2kUSX%0AUm7GxdMYjoADm2BX8V3FuhcjTBnp5FCIqSRxmKZDwTJok45DJEUlCXLC9AGcg1mSKlPBcs4sYJlO%0AQpHYQ%2BdnsFkTD8a2A45juZurkyf46QCY3bJExPawDttwSV8Mq5nKyXSSf3/%2BpT3a9FyH4591unvD%0Ar4ddJ8/9sec7/iVTJF875ZyWwyd/t8IRkcPn2/W7ZLF/8Mknf/i0cY3Ljrez0ocCSxv%2BrAPk%2Buc3%0AL7SroV2IFO5TXtvv1qF3VQnbTtyHz/WpLM2sa0Ti%2Bg97dZ5qrWU%2B41w2x07%2BaujN%2Btxz0ZLopVts%0AC8y4HFk332a6kj/R1qsCVaAKVIEqUAWqQBV4qQKvcfikNx7rfCbdT3gX4zM9cT/2BJYjKAif6QkC%0A8MBJxH9CE4tP3PHc3lPLQpniSHsleOLBk02wiTOdVdNjRWKFuQVhsgUgBjtXwZCYs7StAEgn%2BI4k%0ATsJwugpSBu081gKQM45T7bXIB1%2BzlJRUObQ0p/rkmoVlhFd/xy6XmO07zRJgfbMAhBMHZoaRaROM%0AM1fxJ6dLRBbXlQ0nPeAwvKY6O3C5drK5GowA7M1aVvxO7W79crzcZ8Lf0fw3frfwGz7e3MohxeXE%0A6MXkc/11%2BOQs9/aXP5b18On5k4u0/8dulzOv/tLmeo7dp9l9/lz1F3adhtfJc/07oYuQC0J5LxAI%0A/reOrL95avWTz6its/jt0MIra/1Zif75bTfk4XN9wOu%2BrjDxmwXTUQWqQBWoAlWgClSBKvAlFXil%0AwyctXx8JV/f4DJ7aPap5%2BCRy//DJUQoMlsR5WlOPHCFSa9XYAzxftTjBk5JBED9LJpqVxAR1LBQM%0A6SBlwKFD/QkLg0upDj6%2BDgAcLVnikx5n9nbgVK5JS1Y4BU/rEpGD81zK7OomD8FgBKRt407nFmY8%0AKTbA0twRq4mLTNtZMn7HkmLFiTFiV9MSdykWB8ABA5WAyfkd%2BtxS61i5ml0fBe4D4fo4kfPY73z6%0AuX7jLK8a7ul1E65j281PPte/ovnrm7fvOIWuTz7Xh59cF5j53zo3bu9p9%2Btot/XJUZYa%2BFGMK8I1%0AWafOd7%2B%2BW6%2BJdZVzfCUd/D4x7vOnXSXZOpfXypqscn7Kuj78XCl8i7B0a%2B/rlypdeRbVOM3ubPlq%0Aq0AVqAJVoApUgSpQBb6UAq93%2BKRjnhIdPK/zSLmf29dp7fffVxssffTwSYoffubwSeJ6Or01rtWe%0Ajp2JmILNCA8RydKqfSY3DjA3QoqdE/GnUmmPJXmwSSGIb8RCaeDsABMjTxIPbHK6agpZOac9IpT8%0AKWdR%2BzkERaaTJMZJbiJx0nbSjQDIUvaSJVbhZBqbxsJ8dmwj8ftTYZSIc%2BgnXQEQFssSg6uvY2Jg%0AEn6Plr2u23ydBXHZOp1zvOQw9u7NL7%2Bvn/bkRn3HZ5/rGLl3vX850DqFmsqrZH3yuQ6f7/nwEIc/%0A6%2BPQdXm4ZCRdVL%2B8nLYKs9Y%2B0F5OnquB1cjK2cfXi91UTzzA1hGR4/H%2B/HMx7NfT7v/CsFjWxtZ/%0AnFr30j4h0yfnYX6HL98zfP1%2BY9Ivn6Puc%2By6fFuNna9ZbB1VoApUgSpQBapAFagCX0SBVz180vF6%0AvNvDh3We2pnl5OaUpQtoPQquwQkqg1V9nkkdYvB1sKTHTjZpA7sSXJ6Uw6Aj2D6xhwOGq3TCUhIt%0ASnAypxk7SWO2EeR0WHKqIzI8lsZKGCeEdqVKYOxnUuGHzazkzrrTnzAbCAkOyJvWLPEza1aPP2EB%0Ay2AnSn3oynRhZ2tjxGeHmc7cVNSJjcgB6wQwb4yAKRH8uatvGuFK7ZcVpz1fMfvYuT4R5ADGj3ou%0ArRaA2bqR2cfeSz6r3MlgfnnL37lw%2BHzLN9/yW4fmJ5/eDfvYmguw97xydznEmR%2BlXl/oa/ly%2BFy/%0AcGjx8N/kMHH9SOpvb/wI9PpusRqVxypsaHe%2Bz6ucq/dnnm6N76BYKozPUdfuLufPzcNqGt5OTRWo%0AAlWgClSBKlAFqsDnK/B6h08f1umYB3T79ixB3MOnznq4vD5O4oPk0ZOIR6nY9WB6HVGBAL5ZBvEd%0A4QwYR/yVZuUaCSa5pDsSEUNQhzgO1g7lPPCYKzJLqW7pTAEcSOTXSkV1HG1oyfK0mU6cSohlCJbE%0AiDbV4xDH16ZEEhMJJs6kFR/LUhIPTjA6IsOJkzH59UM1l8AzjdVJxJTY6eCfx6GQgBw%2BcyGMA8Yx%0A5fuxtLRF2I1h9re0rmPY%2BjuUd5zofuH22R8Pcm/xja92zkGRwyKR5eyTGyT85h5Op5zpPHlyFt1/%0A64LasPq/lb2vwEUA9Vjllkae95YTmai30tdYdv3A6b58lz6QlD98XLneNDh/Xr9p9koIeJXYhBw9%0Al7tPz7xM18eei4XK79e%2B8HfWOsHCc93a7svMVXoPGllNdlSBKlAFqkAVqAJVoAp8pgKvdPjk2W09%0ATu6xHu/24HmXAPG/%2B7u/wzIIE7ks7y8CWALsacqj1IZfzGZdhrm%2BPPiTSl%2BAVrwsRDINJulUP58x%0ATAkGJx2GTSqWcII0qJ3V08AMAjN%2BIAkbvWVJsBJNG8KUTnoi5oqMNTgxJhKxqEt2OLPOKak4Ew8w%0AaW8iQ55ayQ1hnCwFfHACsFbqxjn0EJiJFjKo/tiMrKbKd%2BXQ3nqh7GMnjXH78AOey%2BwDGIexHbt8%0AAy03375xAXhidHMrzMeinDb9ac998lw3KvFtFsCxvupfD5m8GmDxHKsFsl4i%2B0h4Idm3/Wbb4b0k%0AjOx1mOTQuH88dR1B13c9Q7mOx3vsY6ef7K73mE29Nrz%2BSVJO2esDXVraOyJRKj71xd88e6fXO3y/%0AdiHpqAJVoApUgSpQBapAFfhcBV7p8GmbPBfG4WkRnwjPmlodglkSvx9GlyF%2BOFABJi7nTQuDJDr6%0AEyl5eM5sJvpsy/mTqb5USRfmaoKyiRRAIafpQcxMScSunIqfVBLOZiZnhNKZnAcSsowEg8Mw0R7C%0APHMT1DELe06x1Tu5kyrg4Ce/5FY5ZDk1K0vpx/ZMzyqO5eKk6HTiHxLNmvfGZDuAzz1PwKv5%2B/Kw%0A61VwXat1LvPbUznC7SknLz7T5LfX7mPkUuiiklqRsZJZXJ98cn57w3fFr9%2BMu38/0Ho5r0PeflF6%0AKxy2dhXTo%2ByFE8xqZENpZ5Mwvzi7wcuqyHUS9tD42%2BJZJ1gbXQzuanNBseLrn1rZHr9Qm%2B/rZX%2Bu%0ArurrHLtOob/wfrTAO31vApe3pq3SBb7wV/cjX2F4HPwRri5XgSpQBapAFagCVeBHUeCrHz59AvNR%0ALA9kPK%2Bvx7s9ssQMMFNW9QVgCTpM5FyUoBhWA9bJkx%2BOfpwgzUruYRoeE7FUZ4QHhxSGjgAj2FSZ%0APPjA5pLI2Dhgpp8U0mXQmVYMWQz6xObkuWOXlg7pYZ4VxceKSSLT6QM75GYaGI4juTgZMjAFoz2D%0AUyVgHVOSK6fBicR3qhWWLMuZFRtnwpKoAwap8XNjEGEcYN/PdOv71A5TLh79cvr6hVfV8tapkrt8%0A3zx7I5ej3dpW9sZdz/mT307kr6VdJ9X1eeI6ql10tgjTp2rrdMd/2262XTCcLO47Cbs49m012K5U%0Au4195rx%2BaMlHl%2BtDy72L1eOmvWyMSwPvOm7uivxKpHGeJLSyVu6FYTWTbe7dj/Y/wV0sHVWgClSB%0AKlAFqkAVqAIfKvDVD5%2BznA9kPFfq%2BNQOgAgDhziOq1gdlxbiOjxZmTj5b/qSTDthUDo9O4GtPvaY%0ABwxXCV%2BbuhxB5QnbJMEHn0icmZLEm0HTY3EckzmJHB4UiojBVCTLlKQzFbOxFzODpph1sEkU7xTf%0Aca4VKgAHcFKSRQQ/sFlLcGxo47A08fhzKrM25eJIe3PqUgBgGN7MuUNCa8WZ8s19bnnPV5ct7C/0%0AyQFsf/zHX1vw8SD/KMnlA0JvWVP2fWPCOtzxYl3nz/3DmVhfTNtqbu/1evetU2h8oevVuGjWB5Cb%0A/xK%2BMO%2BZWUvzcW5c508Pjfv0Ccaf%2BTRjnz/9%2BU92xVj78Bgsz76C606b29ygDdxdbqrbZjF%2BDHM7%0As9EqUAWqQBWoAlWgCvxMCrzq4VNh51Oaj%2BzraXM/c7KEbzBXQTxxhrA4wRjJVCeFzk6QMzF%2BHGDm%0AYudIHAeweB1941gHuVf3QpgpziHlMJ2A8NgMS9OR03QsMmIzXNXKk9y5JJ7IdGYWftKTCNiU2Czh%0ApNBziRMs/mCZWmI6%2BHNIPiPx015IsjRbmj6AEMZJ1mEVgJjYc6GZ%2B5343JVcN86c%2B6C3LAdJtsBP%0AcvJzkE%2BKI8VVjXEjs04KnykyeNmu0%2BK%2BCxbnHvvLps5%2B18tg/6fzZHf0mrXYGMtc0o9y0sY%2Baa7m%0Af%2BUX1e7PLQmu8%2Bflf4sRhmX3NumVj2f3Vj/86HNtbfNsxs2c3a70R4bX/RFkMVWgClSBKlAFqkAV%0A%2BJkVeL3D53w%2B41mSo5HfPUvcR0usvsgDfsK4YMen0VNkpoM/TM%2BXfBJOP7kwSBJHEqbisTrE46SQ%0AuZmenaTEuclDMFSzkwTNkgQb51BR/LQiD%2BlOzU2JgzMTJ35mzULGpw3DnZSJmX540lUiccQnK87s%0AKulxSH/OD3Mw/o1J8NNJuZn1Tf10tM5Wa7La3Qc%2BPP5w8Fzhp5PX8jzVjb732RPc9ayYc%2BbFeUof%0ASRf3Srin1Fz0a/iZ52pqT1cfy1mLy71EL9eFvHX4XB2vP/PkaTZp6/NPsljmaI3dLG5tkbqpZRfn%0A4rkEV84qt%2BYdVaAKVIEqUAWqQBWoAl9GgVc6fK7HujGcroe9EXe6nnn3ce6wZByO9ay8R5xB/Kw7%0A2W6CPsomw7QHHpZCEieYT23gzBAqnUMn4ScxnUhyk%2BqQHvKZcicx%2BOlMPH5aAhM/ThJnlsFg4twB%0AZ%2BmQm3j4D84k158R0g/TEB6WgLlZ%2Bc9ZRs7xSfiavp1cXkaevvYHnryuLh8SsqN19Lq80HZvN9tf%0Ax7rLC3Id6vZr/OmEONMP%2B9tHvPGWMFwPmJfAtYVdx9PgpRu%2BrJY20T43rvnFmcUA7PPnuh0X2zpR%0A7lOlIBnMJR7CSVG/ClSBKlAFqkAVqAJV4Asp8EqHz9ntzcdYAS5NOxMnxsf98%2BqdyHN1nzsznKnC%0AECcthSTOOZ3IIVHMzRSDN0kMhirOjJsekjgTg3/IJRJkHFMO9pB4AM9pkHEOVE6TMmHTP8BukhC8%0An5IqSZ/46d8EJDgdsw6WQjfZZuK39f1rH093tKoyOJzM%2BM1BHupGh%2BvcdjkR%2BuVytNxHzn2ou4Q9%0Av63VC3yQDHcv3kQkeCk5qPysdVNf8gXT8%2BUUuXT/oPDKvo61gTW/HJMNL/il5BV7OT%2Bv6HXPV4p%2B%0ArQJVoApUgSpQBapAFfgMBb7B4dNufTQ/PKMbnFbwAfay/Up7ziXuk/d56RCZDPHNzfQOWzBn2nMD%0AAR%2BWEg/JOXJYguGMOUfMMn4zJbRn58CWng9xEg%2BR55AHWCo%2BFw/g7CTlzqaCOaQ/F5%2BwYOLM1e/W%0A59i5TlbrPLbcfWFw1gFsfXuqx7Rr92vuiLcSVxoJlxPaTr6sB3bNu/n1NnifARftoeKaHnnXPIfH%0Ai/MB5kqySTehPW/3ShcGA09TUbVVoApUgSpQBapAFagCX0aB1z588oCe8wY7YMqYW3F6MyjM9ANg%0AMrzAf5ztjJyRF/c2SQ7931kK8oChjRnBn5qTNVdDMp1zylw9MzzCf7OowZl%2BE3ao/rLpc5v6pIo3%0AwQQZU3amL2vydbIuJ899mHs6ln14Y9zewCmawOEjx8c3EgZT9qeu12PhZFmNptmnA%2BJT%2BlNspuk/%0AoZh/MLnOj8EzRyNVoApUgSpQBapAFagCn6fAax8%2B73ebJ/h5GjmkfM%2BP9V%2Bjt7MUH60yAabPiHqe%0AI9H5uZQAzs4dtgP4gHyu1gF2IHnZlFrP0T4Xf6QQue7iEfB3gjkejT3XEd0fh97bTk5/33gnTx%2Bz%0A0tHl3Di%2BXfZWd8%2B3vle22Uz3DrG3iBurAlWgClSBKlAFqkAVeEyBb3P49Fk/T%2B1OD4%2B8BrOLw2ri%0A38qZ7X3V3mahF2z2BekvSHlBY6b8qLVeLMjrJ3oJ1sH8%2BsHiNfL8ae1Wl1/qk8NneZ5dOHTzaW1/%0AmHw5ht6iWOWPh/YPkzurAlWgClSBKlAFqkAVuK/Atzl8pqfnzh7n%2BDkiyf2D33NZaeDgvIztU6sc%0AimZ6v3pg03mu9AuoJm3954Q9KDN1fjDlwPCdTD1Wafmm3DU%2BPGk9d/S7nNNuHdc%2BYWuyfw5JP678%0ABLkLrQJVoApUgSpQBarAt1HgGxw%2Bn3tGN/7c6nPyfCr%2BOR7jX5btfq3z6hes/gWpzn02EgXU%2BQdT%0A%2B8NTZ/Z627kcSp87m95Oeib6RUie4W64ClSBKlAFqkAVqAJV4Jsr8OY1O/jBntFfU7rWqgJVoApU%0AgSpQBapAFagCVaAK/KkVeNXD559aqTZfBapAFagCVaAKVIEqUAWqQBWoAi9WoIfPF0vXxCpQBapA%0AFagCVaAKVIEqUAWqQBV4VIEePh9VqrgqUAWqQBWoAlWgClSBKlAFqkAVeLECPXy%2BWLomVoEqUAWq%0AQBWoAlWgClSBKlAFqsCjCvTw%2BahSxVWBKlAFqkAVqAJVoApUgSpQBarAixXo4fPF0jWxClSBKlAF%0AqkAVqAJVoApUgSpQBR5VoIfPR5UqrgpUgSpQBapAFagCVaAKVIEqUAVerMB3dPh8//79i7fRxCrw%0AzRXoDfzNL0EbqAJVoApUgSpQBapAFfieFfiODp%2B//vrr96xUe6sC9xXoDXxfn65WgSpQBapAFagC%0AVaAK/OQKfEeHz5/8SnT7VaAKVIEqUAWqQBWoAlWgClSBH1iBHj5/4IvbrVWBKlAFqkAVqAJVoApU%0AgSpQBb4XBXr4/F6uRPuoAlWgClSBKlAFqkAVqAJVoAr8wAr08PkDX9xurQpUgSpQBapAFagCVaAK%0AVIEq8L0o8N0dPvsrQ7%2BXW6N9PKxAb9qHpSqwClSBKlAFqkAVqAJV4OdV4Ls7fPZXhv68N%2BOfdue9%0Aaf%2B0l66NV4EqUAWqQBWoAlWgCryeAt/d4fP1tt5KVaAKVIEqUAWqQBWoAlWgClSBKvBaCvTw%2BVpK%0At04VqAJVoApUgSpQBapAFagCVeAnVuD3j%2B79H//xHz%2BKKaAKVIGvpMB//I//8b//9//%2BX//rf/1K%0A/KWtAlWgClSBKlAFqkAVqAJfQ4H/8l/%2By4H2I598cvL8T//pPx1yOq0CVeDVFPinf/onzp%2BvVq6F%0AqkAVqAJVoApUgSpQBarAV1Lg1/6izq%2BkbGmrQBWoAlWgClSBKlAFqkAVqAJVIAp85JPP4OpUgSpQ%0ABapAFagCVaAKVIEqUAWqQBV4sQI9fL5YuiZWgSpQBapAFagCVaAKVIEqUAWqwKMK9PD5qFLFVYEq%0AUAWqQBWoAlWgClSBKlAFqsCLFejh88XSNbEKVIEqUAWqQBWoAlWgClSBKlAFHlWgh89HlSquClSB%0AKlAFqkAVqAJVoApUgSpQBV6sQA%2BfL5auiVWgClSBKlAFqkAVqAJVoApUgSrwqAI9fD6qVHFVoApU%0AgSpQBapAFagCVaAKVIEq8GIFevh8sXRNrAJVoApUgSpQBapAFagCVaAKVIFHFejh81GliqsCVaAK%0AVIEqUAWqQBWoAlWgClSBFyvQw%2BeLpWtiFagCVaAKVIEqUAWqQBWoAlWgCjyqQA%2BfjypVXBWoAlWg%0AClSBKlAFqkAVqAJVoAq8WIEePl8sXROrQBWoAlWgClSBKlAFqkAVqAJV4FEFevh8VKniqkAVqAJV%0AoApUgSpQBapAFagCVeDFCvTw%2BWLpmlgFqkAVqAJVoApUgSpQBapAFagCjyrQw%2BejShVXBapAFagC%0AVaAKVIEqUAWqQBWoAi9WoIfPF0vXxCpQBapAFagCVaAKVIEqUAWqQBV4VIEePh9VqrgqUAWqQBWo%0AAlWgClSBKlAFqkAVeLECPXy%2BWLomVoEqUAWqQBWoAlWgClSBKlAFqsCjCvTw%2BahSxVWBKlAFqkAV%0AqAJVoApUgSpQBarAixXo4fPF0jWxClSBKlAFqkAVqAJVoApUgSpQBR5VoIfPR5UqrgpUgSpQBapA%0AFagCVaAKVIEqUAVerEAPny%2BWrolVoApUgSpQBapAFagCVaAKVIEq8KgCPXw%2BqlRxVaAKVIEqUAWq%0AQBWoAlWgClSBKvBiBXr4fLF0TawCVaAKVIEqUAWqQBWoAlWgClSBRxXo4fNRpYqrAlWgClSBKlAF%0AqkAVqAJVoApUgRcr0MPni6VrYhWoAlWgClSBKlAFqkAVqAJVoAo8qkAPn48qVVwVqAJVoApUgSpQ%0ABapAFagCVaAKvFiBHj5fLF0Tq0AVqAJVoApUgSpQBapAFagCVeBRBXr4fFSp4qpAFagCVaAKVIEq%0AUAWqQBWoAlXgxQr08Pli6ZpYBapAFagCVaAKVIEqUAWqQBWoAo8q0MPno0oVVwWqQBWoAlWgClSB%0AKlAFqkAVqAIvVqCHzxdL18QqUAWqQBWoAlWgClSBKlAFqkAVeFSBHj4fVaq4KlAFqkAVqAJVoApU%0AgSpQBapAFXixAj18vli6JlaBKlAFqkAVqAJVoApUgSpQBarAowr08PmoUsVVgSpQBapAFagCVaAK%0AVIEqUAWqwIsV6OHzxdI1sQpUgSpQBapAFagCVaAKVIEqUAUeVaCHz0eVKq4KVIEqUAWqQBWoAlWg%0AClSBKlAFXqxAD58vlq6JVaAKVIEqUAWqQBWoAlWgClSBKvCoAj18PqpUcVWgClSBKlAFqkAVqAJV%0AoApUgSrwYgV6%2BHyxdE2sAlWgClSBKlAFqkAVqAJVoApUgUcV6OHzUaWKqwJVoApUgSpQBapAFagC%0AVaAKVIEXK9DD54ula2IVqAJVoApUgSpQBapAFagCVaAKPKpAD5%2BPKlVcFagCVaAKVIEqUAWqQBWo%0AAlWgCrxYgR4%2BXyxdE6tAFagCVaAKVIEqUAWqQBWoAlXgUQV6%2BHxUqeKqQBWoAlWgClSBKlAFqkAV%0AqAJV4MUK9PD5YumaWAWqQBWoAlWgClSBKlAFqkAVqAKPKtDD56NKFVcFqkAVqAJVoApUgSpQBapA%0AFagCL1agh88XS9fEKlAFqkAVqAJVoApUgSpQBarAN1Pg/fv336z2iwr/%2Bqfr%2BEXbbFIVqAJVoApU%0AgSpQBapAFagCVaAKfEsF%2Bsnnt1S/tatAFagCVaAKVIEqUAWqQBWoAj%2BJAj18/iQXutusAlWgClSB%0AKlAFqkAVqAJVoAp8SwV6%2BPyW6rd2FagCVaAKVIEqUAWqQBWoAlXgJ1Ggh8%2Bf5EJ3m1WgClSBKlAF%0AqkAVqAJVoApUgW%2BpQA%2Bf31L91q4CVaAKVIEqUAWqQBWoAlWgCvwkCvTw%2BZNc6G6zClSBKlAFqkAV%0AqAJVoApUgSrwLRXo4fNbqt/aVaAKVIEqUAWqQBWoAlWgClSBmwr8eP8oZv%2Bdz5sXusEqUAWqQBWo%0AAlWgClSBKlAFqkAV%2BJIK9JPPL6lmuapAFagCVaAKVIEqUAWqQBWoAlXgpgKfcPj88T72valIg1Wg%0AClSBKlAFqkAVqAJVoApUgSrwxRW4ffj81HOm%2BOfsF2%2B6hM8pwCU4j%2BfAjVeBKlAFqkAVqAJVoApU%0AgSpQBV5NgYd%2B5pPzzK%2B/PoR8pG%2BoHoEV84gCXJpHYMF8PfHvdPL1imZfL3Zutv09N/zinTbxOQV6%0AD9xU5qYsN5EfDb74BXW/hxfTfrThbwi4ueU/6U5v7gVt/6Tb%2BaS74mfee4R6ToQAdF75frjf1Ss3%0Ac5DiPP1zdXvu/07k5ta%2BN/3v9N%2Blz1Hg3pHycGdwTxwin1P4Zbm9L7/sJfgcPT%2Bnk8%2Bp%2B7I758/V%0A7cv22Kz7CnzOPXCf%2Bbz6%2Bnf4uYdHIq%2Bpybmfs0qf08%2BZ7Vzx%2B4n8eDv9nB15Xf5cV9Cef85dP/c6%0A%2Bnw1JvOXuh8%2Bp6sv1cPc133/z9Xt/b24%2BuPt6JFdF3Nfgd9zc/Aa4xbJK23eLsaxjPt0z62G9jlA%0A45%2BvwHNX547455Q74M/vsAxVoAr86RTwXaLvDF/kwp3fcr8I7Tcn%2BVH39c2FbQM/iQJ9Bf0kF/pl%0A2%2BT2%2BMH%2BL/iDDzPdnq8B9qmjVa/p31fwOZmei99nc/Vzch/h/xNhDhdiTqc/FZv%2Bndtv0M8AAEAA%0ASURBVJ0%2BCJNh1roZucl2M3inpS%2B1dO4W5kPw3Ns58qX6Kc/rK3C43DZwCH7%2BFf98hldT5rD3m4J8%0AZjPPqfFc/NzSIXIz8WbwMzv/GumHvRxKnFfP%2BzpHDiTfZHruPG2cl85bOEeS/qdwzns8R857PEf%2B%0AFJu93%2BR54%2BfIZHhOhOfiM/dx/9zDIXKz3M3g40U/CXno55B7Xj33do4cSL7h9Nw/zRyC5/7PkW%2B4%0AhZb%2Bsgr8%2Bu7dOy8w90Eca3hn5P6I83gH89Z5zn%2BcTeTk%2BdTcr41/RKLP739W0U8kzkGrFI3zUSnu%0AIw%2BFDtMz%2BYHtMD3jv3jk0OFhei536PAwPeMb%2Bf4VOFz0w/Tc/2de9EfSv3YP503NyKF6pnEm%2BAX%2B%0AQYHDVMIZPNc9R2YbM5f4YTqR34P/3F6eix96PuzuMD2AX236XPPPxQ%2BNzV1M/wD7etNH%2BvxoY5Nk%0A%2BjfbPrAdpjdTPjX4qT18Kv9z%2BHPdROLM3MPeD1OQ58hMf9A/lz5HJtWh6GE6kV/Kf66f5%2BKz7rm9%0Ac2Tiv4l/2Mhhem7psIXD9Iz/3iIf3SAN/%2Bk29cVFXh9vMhQChwLaODeDz/VxFtRI4ofpczw34yG5%0AufpdBaNhuvqyzc%2BLcvYPRafmH23jo4CQ42SbZyewEJ6dYF7HSZPpfEbSg31%2B827TT50vq0Auuk6m%0As8rhHphLj/i5eR4Bizm08QKGx2tNZOoe1DjESfmkliY4fpz7bOfSiaTzUJ2dYL5P57CXOZ3%2BbN49%0Afs87PXQ%2Bp9PPps57SSSY13dmq5/aT3LPTjYi52SefmBf0EkzcH7tWmk7Re84s5lH/JC/2LnTTDjT%0AydkJ5us56dASczr9NHBuMpFgvh9nbkF/Ruwz/Z%2Bd72cjn9TJYY/Z1yeR/KjgDz75ZJMRS4fPRRPB%0An4CbihzEdRobh9wDcrKl4sRMP%2BCbwax%2BbSd93iw0V2/2eTN4k4rgZBNDxKCOdiLlx56d56qIfG71%0AHE8DqWskyJQmMn0Bn1outI87h36%2B/4Yf31qRjytwvg3Od0LY5o16/xYN7YRNP5yPOGEDfIfkztIj%0AVcDMQk6jRpwzTPLHqweJM314MpXzbGnDTliavkjTz3aunjm/VSQbSQOJHJxMg8Q5b3OqN/2Z9TX8%0Am%2B2lUFYPTqZB4nzzTd3sisYS/1RhTTzb7Pprbzmdp%2BInOZ%2B63wP5oTpTI2ebxFQ8KwMmq8E/F5yA%0A%2BNbNVOfczISd2zj3cI4cSjw%2BnaVnewd/9nwgPzR86O0wPeS%2BwvS5Dc4dHTD0nLZ1Mk3D50iWXtk5%0ANH%2BnepA3m78ZvMP2wyw9/cIhthSNcDJy/ozD0s39R8SDw3QO0pnKEGdyTv9cKCmz4cDmaoIH5z7/%0AAfz49EB7mIYnHQrIVMBzWUnHEYOd43x1YJ7DRCKT6o5/H0lpc9OD/Im7KoltzFrGD%2BAJeM6/35VZ%0AN2kNxh6clPviDYcZ55HmJ376Nzc1AWf/kXIvoD0Xev2IW3tB8/O6T39u4eY9cLPi/Qbu63/IPUzP%0A/STyODIpzzlSYecAnOk5MZuKI34iXYqFLf6E4U%2BSyWMDRvDnUrLInenxxWcK/jAEHIKvME3duaOz%0ATycG3ULsYUdOw/lg/weSO1mPME%2BM/n1LuWxHP1MS09ukvdPhF1mataZ/IE9vhzjTZOE4DOJPcHZ6%0AoHJ6AM/E5/w7iWGLA8nNuiGfyAR1DomHVaYzVx/rcDX%2BIVdmLAMMVoBT/ESMgzkwPDg1MRYnfhio%0AxSCOTRBnTs2aq9OfyBnXv5N7aGZOzz5sFsIyAGBTLr6JiX/USeJzyE8lnDyHXWQ6ObOXdGIEnkTw%0AZ8oscYAdlu4nnsGfE5kdTv/AmU2BiX/A/NjTde%2Byw4Nl6mFG6zT%2BBJOrcJFvTuPjvHnzBnsYB3Fl%0APgRJSZXpBCYg01dwzn3OyPRnM3Mjj/d8YHOKzThcKeIWpQQjssdhlfhs7OBnNc4BwNQq9uDUNrJk%0ACgznwRLBWJFfw0YKyGfDth07S5%2B7na3qT3x8%2Be8Agvwazp%2Bouq0%2BLsKXkjR1cW6OtETFOYgzzaoO%0ADIdIYAHHOSOJhCHOGSbDczzPxcNzBsxa%2BE6x8719%2BukzVDqZptbBASBGRwtmOk5nYvohuJr7cIg8%0A06bEBEzaL%2BvT1CS0nxk5%2BMHrxN5xwpCtHRwA1v1o9VB9jpMtHEiyBeIHP9M4yT3sJVMAj2xKws/Z%0AuAz2c24vfaaf6cxV/TDozP8fnIWyzemE%2BXO2M9vAT9E4ArQpFGeu4j8XP8DOU8vF4sx3EqaMZFkF%0A67Dudfb0bEAkKTrnyATMEokbjMXJAIOPlTYNxMlS2G5G5urjvqXB24/OR6cAnuvWtgEEo/%2BV7JRu%0Alsi%2BEjTiNqcFEHA0j8NqdhqqBGfk833bsNxH2dLzGZmlOAdMSrza1g4NfD/TyyefaQjJGLxrOKZP%0AxCkWvBZnioh/nhoE7/kHm3KmhyrOBMSXGYxO4mfnDuBcIpE7WbNE8AkmojMtGGmxxM8lZiQ8Z%2BZE%0AcIBlXC/U0/ViyaIwM5giOAMEdvJIlQhgE0nRz9LBsYSWJW8MpnHEr/JjpDqxA%2BEnTe%2Bkp6UDYRrG%0AyUi3RM4Np1uW7lQ0MQw6H8Uf2nvxNHXTxrn0OZJyh3TiidzJSnqKxvloVvgPJHempHyU9k56liCB%0AikFEJzcAjkEssDkOt4HpATsFT%2BQwCD63epMkQXgklCH2wM%2BUFJFz6Rw5r85a%2BBno4EgEZxaSfNpJ%0ADjjVcW4O8SzpJMVC1tISoRlshilYmc%2BXxriwlEgWDlRzqj%2BDN7NmygQn/X4Wq8nCcZB7dW9EZJYW%0Ay0616cSlTD/VuZ9OQ48QCot1GyTqTGtQTku7HW1q3e8qsM93KJS2YTv7sxN9MDOYHpKLM0duXZHm%0Aeh3xc%2Bve5Ax5epskc3X6UNGAEZ1pic9agmckVGSd4%2BdI8Dipa5ApQwWmnUgI5Ywmk5AlGGLnkvEZ%0Aic9S/DgziO/I1WEa5GpoXBrjRMBgA/viTnqwNy1Vbk7T1ep1j8O9RBbhFzd5MxfOO4T3V92Idu4I%0A36sQZrejdVM3mwn%2BSzmzf/37dSf%2B0EOWdKYFOWmnf1g6cP7A0/Uzn2wvqjFlMMW%2Bfft2z5ajj3Up%0AeKVBSgfTg%2BOUm%2BkwLgnX10kI40T0icRPxQk4%2B0FmaTLf9M8pyZ3OzCXuNDbOTMkWdFiKM2H6k3/6%0ArIYcx0uTC5SpGPnR/LfffpvKz7oHcrvSBoZjV7HJwnFYGh/nGlvvVpJg04ARplkN7XQgcXqonmmc%0Am1lJn04a0zn0nHIw0542DlMGGO0sqp9C4TljPrr0XArxA3%2BQ5/jsMH6cm4mTJP45JbkHJynEP5o1%0AwQeeO9OP0t7JPSzRACMvFu9YbZCUO1x6IgwBpONMy9TVjXq6T5IS5umEIc5cnYTxJ0B/logf54w3%0AQsU5ooZv8k4nILXSSRyWQB4KsZqhkkzjZAnnkCiVpeelwU%2BhpEMopzbx0MaxSvqMc4gzPaQImPaQ%0A69LMmj6r4rGfNFIRtuxx7fb61kScAUwb/H1ngqefLJr8qC9AZOzN3XkFgwkzpbORvafL%2By1xBjBt%0A8AdHwvuYQ8p5mq7sHEAcwenk4EyqkJh%2BuGMlFAOJw/26fSI6pONP5vimO52Y6bN66CSlZzowshz6%0AsThzgMn0OT%2BAc%2BnogOMAgzObufSxvxzUmEtWmT0QOUwPnWSKk4o4GXaiNSindb1A8V2KxTn4RmKf%0A6y0AHerixKY3ndlbloLHsT2s3SpgZLSHBzuxnwmevh2Kmf5zEePTmhU7xc82wVt0buT%2BdmaTs9xz%0AcTDn/k08xz%2BHJDuNc2gP8jlYZRobsMFM7zgUOoDPkTvp33Dpd/q2V6yDbrgtvDPWoXOPP/74gwju%0AXrmcMUBGOJwM45lyG2VwFrIKEQHZPHF8bYJgiIRKXxjBwHAO07l08A%2BFDhUFn9kCiwNyUuHPkaJp%0AXseNm/tIFTil0kkJL8Tl8uwvuTSpiNppQ8elA2GWcJKrQzkcAYesQydWxxoPFfsN0tsAzIFz8uOD%0AP0TEE7%2BfmFwZDpYpI33qGMSSCzkdEo9uTrGuApsNmGWr0zcS%2B1xKAJ/kHArNKYWcWhF/lr5ZRXxI%0A4kzwmWTCpj%2BzbvoBx7kJO1cUdjN%2Bh%2BqABznH4U5IJ7nogPEhcQQgCVOc2dgV%2BPSOSiRZccyKlS1U%0AIQybjoCbhKQQB3BenZFDCbKIRATfSZge3uSTBVWGFW01Ng0EFiVxWFVMrCnBZ4pD0JHGmOIbhBmM%0APET0dVySIT7TwxBM8OyQleAhK9P7ABlSfYLxHe4r/jX8tJre4GGwWYbLLOHDgMVnlbhOsnBuDsHY%0Am6uHoLRaluIIy6pOrg7T5/ww0ABjbenupsCkpeTO6ll93AmnhNgM24aKCFYkNsMlpikn0rg8kmAz%0AjEtIbrZMfAuwLqUlpJU/zAadshTHotKKiQUDJ3YOVy2UcjrAcJJ%2BcFi6D5h4K1pdBfJO4lQAKZbW%0Aqgk%2BTpYSJE7wwR6ApZ%2BDb2nsbC/BWddy8%2BrICdhmUmI6WQI24x/17SFdMdU3PlfxYcNayw4DUz0t%0AMDBBmnWnkwP4JtLqH6UyN%2BDg02d2iqMfsG2wBSJzO0zvd8hqeg5bImfnjDlHzllGDsibU4IZZOGb%0AS59zuEcirGqnY8ojNrkBnyNZ%2Bq6cp2%2B7jV7eE1jfO7CcPB34jHXXXP8qmn0%2BN9inS6jM4IGeQboO%0AkSSC9ApNa3pIBCcYh/j0M4VKn1XGZMY/TMUEH8d47My6ybmJn0xoIdwarC2znL2H%2BSabqxadACJe%0Agn01luHqYA2Kt1wiaE6cQQP2ICGRMLuknR0SsZMgkwU/PjbVUxGwVJSGTWtXIRdwIE8VGaYF7xa0%0ASUwKcYbTs2/EDmfPQcJvh2xntg3AVrGzaOpOBz%2BwOGYdpgYftPQwkZnGYVX%2BWBw71ybdlNg4APRD%0ANZ2k6wQZZ%2B5u%2BuCD0cn0wHmYhkTnMD3T3kxPlnhKM7xdsY7zTZsbNQ7pUpEeqlmRVQE6%2BskKcqav%0AVsYIJgw4vljCE1rBTsWLwYcycfzQ4jjFsmUtCvha8D1kCiIm6VaZtbIU5tTFiXRuIVNoD5uS59wb%0AyAxWBUxmIqHVT3uzt7QnAzbOLG3zRqaf9OkIm%2BCUnrnW0mYvcRLHIRhwaKFig3kvAqMP8ma5xzuU%0AYe6CSNLtZE6DFOaSMDt3U0SykemIt%2BePbgpAyunMokbOmEPKnAasI1taTf%2BpQi7IjPu3K%2BBJ5QsK%0AThzijLB5KQ//V3iH3C2EwaldyelSYEyzlzisEifLFBwrTh4ZYgNOik4AcWwA66BoRt5JIghLSbQH%0A7GHYHkjbsxOz4scJmw49JBJfJ%2B3hQG5L%2BiGH9tAMU2tNC3428JyfTg54pmkJn2ZsAyfDCHY6TqWl%0AaFrNm0MirDoEa0mf0/gg8YPHERmHVSNp4DmqcAaQREnYIBG3mUsQMBWzhTg2hrXJlDDyXDCwg5Na%0AxJ/zD5wPMoQQ2vOQxL1ka8DwCWIDIBhfB0sw%2B03wB3A%2B%2BG237kftvEV8IvHk%2Bbe//e18yCFF%2BaKs%0AEcVKkFcIdxuWITOOieIVfVqbkSFWcJYyDUDHuGyCse7rYF0lSKK%2BTqaHdHnONrS%2BwJyamzsMh10n%0AqBMbBiIHXwzBLFEFPR1eHX2r0zy1GKbMveiHP47xJMJDeoKzyfRgLkhGquMYNwUSIl50LFMsAAvJ%0AH3KZY3HSAE6GcUhwMix6tgBm0G5tOBZHHkvQIYMgllx6dswGxLMqf2x4pkOiU%2Bz0E8SRysgZM1dn%0A0ZuJ6VMHDM5kMIvIYVidYBrQyVSA6QfLNLA4wR/AlHApTpCHXKexh9UDbUhwnkuhIleW4R2LzXta%0Amrle8A/%2BxuRQGrB47SyHn%2BlsKf5OfTI04wQAjulY2og1KAN%2BqIzHBiCPNmAda2G3DBcp8h4SNVwV%0ATKJFU0gnhLNEMJERx5eSbABwJkN4BGDTGw7XCOuSncgspzYNQMtqpnFIxw9/2BJnlVzxcZJubqxO%0AYDgZLOnjMCyU7bgXrUEA2V0cc%2BVhg%2BCxrLrZCJtCONaKlSFWZGziB8duDxYMEZHTCcyNxBJ3I9pM%0AYUgD3hJ3NuWOZlFLa41PjJGbVti0kqTJ2Xn4wdOkFgCOY7aEDz4D2Ly%2B%2BC6Z4lWzFhtXAQFhxpEz%0ANo5LIqcv%2BezBEnYyG0iu%2B8oUBgmlCrnxCZsAfMi1OBTVRgEcxuH9JAzQKog6xMeBZxa1HxLvOHYy%0AW7KQcW06xKExVWLJ1UM/xsHMTtLDnU6yZANOLWEkNiXsJF3ZG6tEYgVjQ6ti8xXkmwOY9JxmTEx6%0AehBwxhOZKfhzkM40JGcnqzoz181Gf/cow7wHDnsBkFYF358Gn07MyjSNHeKTPCQ4h8QZmT6wDLfm%0AVCp1ZpvuDoc4FowArMPdXWdPd34iP4azDp9u3v3oK5k3is8lnjzzjDJvGpTyvlFcrWz6rqI44/ff%0Af5cWSzwpqTv7YZVpMJlKflhidRKaFaQ7yr7mFAzTST59GcSLnP6MEFcWLVNWbYPG3D5BHDldspac%0A00IScvESYuXPO3suDXGX4LRcCoUh5QLGCYxVL5ZKal3FpgF9O5GHZhyhZTVsue44ALAw4wBgyH8g%0ANygg1n4yFZN0%2B4nFOQwqEsFem7185mMcHpgpoXS2ypLdEmcAEIaFShuHqWPCpj9Xr9gPXn0J4pho%0AxBL4sxa%2B02SRMocNJxKYiVr3noglSME5Wxksaop44xOf9AAOeEmyOvH4mYYTJ74A7Zk2sJ1xMUkB%0Az5Yd3AZ5Q8MnKGxf6nUbEJxXPyQ4h7qHogCMzJT47p1yNhNr3I7tAT/OJIwvWFisQXuAk6ml5cfH%0AcdBDRFAKLBGG7QFL29LKFs4DM1OWvPEiIw5sU0mmsoXcQpe2rtfINrSkCJZfTvEwsySDjR3IXZ3k%0A8c065KaQzsSYaBw7y9mYpY0DEE/zDDYy5c2%2BwLAaJI78ErJTNsjI/3Xiqy02PZhibqxtpCUdsnRM%0AibUBbfpJcPLjT5hbw84BgGlgpqSB%2B5sCBl4rg%2BmxOAwBBx%2B8kcTDFkdOLB0e7jHTQTIUCqtjUFph%0AsVK5fQgzjJMiGzy5jjisbu6np6B0HmYi%2Bqk%2BmyGYFNWmtJvSsSUxMlhxkrA6efQFYyfSYCrSWEb2%0AbnXv81iDgiezdzKrVJl3dTDP9XaIM4Vcq5NIgla3k1iDYNypPRBUpXMbRACL1xo5xANY0OsIxgBV%0AaMORGyaXj7iAWByGubanaPScdwYjFMI5l0s6jqvYDFOcBkk5fIctXWcfvMquW1xfATjVicW57HZ/%0Ayf0ZPA042BEQLM0QgQ3nvp2AIG0DmxJpJsEZCf7AZnwip39YZcmhXFowcDLYDvsCgDWRIFN9YfF/%0AeOf3ufPzbtEudwkO7ya%2BoeAn0TtGZZfA19dnpMwtlbsKxwHY28vScoZZqsW4hxjc9GkcBhwsiTqT%0AM8y5G3Dip1bI5WSKk0LADoOlQ4Tpmdl%2B2KxLvE2E0ybJCtXsSj%2BrYiYyl4Mr4vnTEmAoarp7UR98%0A2LS26pXFZ5jFKmC6xTJMZykjYB0rYqHKmG3I4/a94vrGw28Dk5yKrGrtBAsgflrCSTM4aQnHeKwR%0AbFrVMZ5a6TPv6UQODafowZFk2uyCYOL6WtqbU32zEg/GvRCfTmDqGYnA6BuXU6pIgRPfpQObWVqX%0AhGEdwetY6xC8Yp9udQAED7BMU3Q6MhsRKcMknwzZu05S3LKXfr%2BfPb2niaFE7gFg8%2BqHBMe6RrCz%0A1UyzGmf2bCfqP9lo%2BDDce0jkN4gFDAkWEhODZJUg1ohVtKTkhaAOvI0QwbcxYSbKgI0TQhyQTrFi%0AbAPpoFLAOABYDU9yLae1AZrB0eKINF1mIsZxiFAd5ti0JGfAkieIE2S6SkRHMH4c4%2BLdDhZmfeIu%0AiT/onCkOgNmP2wk5bOzLwVLekYxbxUL2NjuE2SVhpDDwiesYt5Z92ozWThLHSYlUsXOs10hrMFQ6%0ApqST657W7ZFNEbQxLHhbTa1DAwKw03EqknSXLBorhrrA5oWw%2BeSCp405JDQdC1IwVjasJLyCZDae%0ANnIdddh4%2BG1P8tDGsbQYUnC0M4tajOzIHgxKm/RDUeICJixgGMQTwQFjV4Ldu1Xm3n0/IRJndpIG%0AJMciiDa17OrcG3XtTSf9RKs46VAMcQZV7FPHIADrppN0mAamox97cGCbYNuYQSOWPojG1EEnDmH4%0AaRVyBh16F0U6bid9lsRgZy18SLQuyaNlKVNXRRK3%2Buwnzcg/bUqYHhJTJMGyzRCaHs2JuxHayBDj%0AFB9HOyMJBmAzTKeTDm1pruIzJo8R7cRPwqziEKd/rY5I%2B3RfRAyCn/3L8/PYp7PQec8RCMcbBctN%0AwxuKU7VbQu7/P8NGSnxWE/HG4uVBui8SLgMjr5NUNzHTEOIkqOOSFh7ZcGBgTGYjcwvxXQohzkxM%0AxTDoxAKIH04cg7LZG7smKOF5U6ZMhpCYNa0w36Q8dvrUSESYIqS6%2BBQFQ8R0U5gCBmCrBHEcBO05%0ADUxH5skmLRhGCLk0xFGAITiX3rqAcXbSMvo2LInNkMUqvln2Zha0OFSxpTiuxrpqD/7fs0gAcDIg%0ApwrDVvWxNoC1KMhwmhsGlsRgHTOCfxgzMUskxtdJFRwH8ThiyEqfbgSAPWPxQzV1iD/ZbMBcfa0Y%0AqaafBiY45XACjmNQTKzpTHH0sWljx56UCZXOJBFJoiOJIt0yl57BbZC/u2HV0mTl0uvIgLVKKppi%0A0NVp0xJOkDr2gD/1B0a6PR/uupQWow3YhmFjhIRVplqCjg15KqoCPiNqidCSsGvS%2BgoPwwiOhQJz%0AGphbgAdHy3Z0iGymp%2BtI1mTDB8lYl2cPp2LIdbO8Qolk2BjTdJhuxUgyLXGmqS5%2B2smZQinBKmCH%0A%2B53WVUu4C%2BX1ZsMneGjmUAJmd4p0eefE8YYknVWrp88wEMFnFUeYvZEr5mbu7EcfMI4pqSK5S6y6%0Au%2BnMLNPTz/1N2SQWPEh4TJwkRBzuTnuNffCVJYeb1YqwQzr3QmiZEmeQlU5QTJ9g2IUdrApgw4bP%0AICuEXD6qYBksTfLwT9pUZNVhMyQyzY5M8UJQ3eGUKqzOHrI1HOOHKkxlFuk9gw%2BPcfFM1/b2sBaW%0A0trc50ZA2YbkYYZcBh3jbA2Y1lpaFTivyox1AMaJ1XHJWliatCWR1sUSjG85S2NTdzo3/Qk2PTCX%0AbAarbpcLdv1ib7aatu0TCxWDJlGMkRsJPFPjYrBWl0RLJCTyZL84cwkfsG0crEtaS8TOJfxM9bFQ%0AuUGsU3Jt2P4F0Ex2kY3oHOJzqp9m4sw2CKaZOEHipEr8mR5fniSGCidyGZTHS8P1kmG2zcYJEpk2%0AzD%2Bqsw6f7tkdqnt8pujCi8K4UmIRV3/iEZfEYHTkl4e7Dem10DJIYUwSGdKA6U7PlkQZsLQkZ2Cs%0AMpjasDcE1R1McdKtSJvZeZdc02UQnL0zPaxaIgBWIbQrwUQkN5HVyUA/dnXgSa7grPpmlXd568Iv%0ALRZCqotPXaYqQLoVidiY3caagnXjadWpVnIJY12yE9l8iwSAQ0s4xNMS%2BAO5/QgALwkwfMlNT5ab%0Aytbg1xeMLxLHYatRQJgNU4IhwG6NzIZhk9BErUEsPNpsME5WSQl%2B%2BgZlEJxVqzhlF07B4KSiQh3k%0AYppaOFcNLrfBQauwZb%2BzectZOjbkQab/m/hzYhhwJok%2BdjYjJiTTkUc8KQyunY5UgNm%2BFzf3gK8j%0AdZDcRK97GAhCYgmL4uMY0QYwg9MXbxta6mYKMs3nrrPugZmpw/awkGCt5ZQIGC1xnDkOt0FEUAeQ%0AUsFgV4mcqUIrWMGxlKCT2MTDKZWFQqJjG1gHJDZALjzSuoW//OUvYVABkGCsYgmRWNhicVJUBlLM%0A0oY2MB3j2A2//H8QpRnpDQcAeEtTF4V5r3b4zmMzaSOO/JBDwvD/NAH7LppCLNmA%2BJtNpkOzKKED%0A2PTk2if2INGhKxKzL3zAGclNymxpbsoeTDxvKo3N9PjyYNnawTIFJsCNY2HLMCjM6t72ufmtkiz6%0ABIZNouRpJg5bdkQNHCOkmC6b%2B2UVh0h6ExbCOFacLZHCqpa4gFndOy33GGDJSZkVmRqXQd9WLSfY%0AWtMXT/xQdIrJfZ6pUtgGuWnD9FjiDjuxyrRuNh1mSWZsBkv4E5Cl9IxjUEJKs0eCWLdvuZDgGBE/%0ArUuJTORcShzH0iijSnlbyFWzvTQpnkQGheyWVmFgcC9pjc9OsvHJEBIFh8cBhgjpu84Hb1/w00wG%0AAMDCYo2kUKaCjcsQNjE2TJA2sHY1d2EJI/hZ0rHnuZqWdNKJPdy0KRH%2BSWIKkeS6yjQwlyIRTrLc%0AEZdJfNomLoYIDjZsP7xz45NPdTnbgxaKOIOJ4Ki7Fgxs3lhEvL24DOiOzxKOGGxIZGZVJzYAO/Si%0AwpMrDYApliXT8VmlAUde3kzTIfwSYk1MLkvCsHFsA5txWCUuFc2w2fDb8CQHae61wafHo5C7faY2%0AIz5v7tmRVVRVEcJACkWtRSFSeL%2BzIksm0htZDOJY8AyWQnJ27ASb5nGEmb751tUh7lukEVYpB7nj%0AwEww6TYTAOmmpDd7sAGl0BpPos4Em2JETq8OJWiVuD0zNY61KOADrRGsAJvXziD%2BHJAw1SYehkR0%0ADhWZ0qHpKUeHyhuwcjGVFrz7mnJFB2DWktD96hu3XMh1smSJaSWk4iEl0%2BTqJNei2rQx9bcTmbWh%0AIksdtAqSXMAZEcHXAnEaS7qJWHIdLKWKW3CKn/gdJzCc9KATtkP1c135gU2knYffVaf4ietgLer2%0ADzZUJM5ac18wOGbzRMTQc3oDwFSbvdie4GTpTNrcljgWImUyE0zWbE8//ZuLfW6n6cGUQ3u2NG1q%0A2Qz74iaxCg5IIuGcdX3XzXN59jXJ9bNTqIDl7Qjf21IxsWnGRMpZGutGRJoFjzD7FJDE2apauSkB%0AWGtlKl7L1jINYDruyIo2I7mFiNCbrYpJLWDwaAniSxXCTHEyDnuHmRJhhsS6WC9K/i%2BDJWBTNDBM%0AYSbO6s2RJkOL4wZNJDe7ZskLalfYNAZY/rlfVwWTCw8Yp0kEb2k24vA2IwjYHkgxSye5OADEpBYY%0Aa8FsRSxB2MCkyUNRSls3NzkRMNkOuZAw1cqDNULQBuyHuI7WpdgshSQOS4fcLFHIQQRHEuoymGpn%0AiQMPS6QAC%2BbsADAYJxgSrYil3FQPxRTNoE0Ks3l8nFDN24kU7iis18j2ZiEZwiMJsJBQjlUjrgpO%0Ak5BzKe1KsP2kSqapNSP64TzwpB%2Bq0IODFOJYh77IWJBnH7xgEymKY%2Bk4boFgHMFYCXUSNP1MFQCO%0AmLk1ySVEaqbS0rZTIvgmzp4n7Y/qf3D4nKLr59LixH9Oi2h3uAbiSUdoXx7znZcsmW/ShpNVaXWw%0A6ZCrKGEAoTKdOHUdvjni5z3RG2IS2lJISAfj0LdQLEhWAzMuIVujPSJyMnXYmFbmtKdzqbdpSbcZ%0AHWsF70aYEgcGP7T2MC1LToEBJsuRRDu0LiTEsalLrnUnZwjllAprHEKGhFhfbFhGRACQxiYzQZaE%0AHS6uKQLMTXV2lLdvfPsJbQoFD0AMEVYZkNMeUwZLeUO3Z1YdIEMbZxNcSIDJFryRYHTMjR/MOQsk%0AMPH0FsegeOWiVdqezGBYkpy4W2N3Z61YshnApmjNdUlmebA2gBUzrUvBJ8VIEnEyko6TcbOT0EYN%0AIvCYRYo6sCqACAOAbRBc134MbhiRYECyAgMDX4sDeVqVyqL6h6U51Z9ga2EzxFDCirv40yslbJDY%0ABrAgveJg3L6WKQCDWKtjM1JaGTIF7CA9hNfY5SZkeuBhKgYessjFUTocpoyw4QhOloRaO6ErHK8L%0AvuVkhlZMepANawkdgyDdINa3hUxJZzW5yZrtpUQc8RZyX16svFMxBQxAfstROiMvvcMuUsIGJBcD%0AiW9HWOKUsAGRSQSMnx3JgCWLERgAfOIiUyIS0SpBphKaaJbWFDFuUPAZbz/YNJxcHC8llnS7FWYV%0A68qJTQPBxGEpw6Bs4YdK0YDhw2bbuShuOX2aCAyeVJn9SGIk8dDiOOwKEsqlGZacEjnzh9lWqZ69%0AgLcWV5NVc1PdHWHdFLcZPrVAhoQUSJxibU8H60g5ciUXhs%2BSvrtLLSpSjqETa0vyhJxpNiKPFa/1%0AV1ezbpoMQCcwwbHGzYrNqhUnP9Uh9FqwOslDBR7/0ICJh%2BCckiJmWgCwUUhxDhoinR1iLWqr2pAH%0AQ9tS4TAoZC03bpZUshkXBn6/May/amfVt4ikW4J%2B0qENg2RJHmxoceaYS/EtNC1Lbsq6NkbEOHaO%0AbF8w02RlSSdZtIQfa4dpQMegKZNnkogJTzjPGDgdptgkEZDuThkR/8AJMmw/vPN0%2BGTbyqr0ajSt%0AChrJBTgAJMEiHJhcAKb4ycVfr5Lr/99YEYyJz4k%2Br5MYCeGB0PdiSQ6EtuHrZ7455oWUjUNIrjZt%0AkJ69SJVOTJxTwcahojd8Od2v3QKzVVbl5BWeF7mNzVo2I21S3JFgrIVA0j8%2BI1vAcYqVNlkUJULc%0AJl1VWCIMlhhpRjAROffiE6cwrKXhSUSH7TNUWP7JI5vkrIok8XBxQ26ue9n6LeMlxiFuUWEplJZM%0AdEpR%2B8mqzu736Q2dzq1uq%2BG0Z5fgwcnuMnU1djIQtAETtWEwRbyW3uZUJL3Rrf//YYrx2QBZN%2BUy%0AKKfV/z97b7jm5pEjWX8729/9X/DO7LOHPMVTUL4kVbYld1tC/oAikYEAMsgqO0fdPaixqDUqSDwG%0AMGOJHNuJ55DgxraKjLRiowJYtp4APJX9jOrCkWQK8YFLEfmPZULwc4TgGE5iuXfPgUQ4JUkhEUGW%0A3Y0Ob2tliRMc%2BH74QbBqzmAGZRaNGozuJg81k17q%2BOnwCJE0AXY3Y7TFEWM6hlfu4s4gh8JD0wyn%0ADgBQnHKXmlRJsHxGlYksaufnAjYPHzUurjjJBJVNHMDRlOpXxPzlkKyTWCW2XMKMMZkEfp9CUgA/%0AOJjOyfyBxvCCUzkFW%2BibhUZkqSLaumkTgQa2nKhX8C2PxhHJmJ7OwaZFakpOAWCVt%2BiCB5lGFTKt%0Ay0Ij316AN/K%2BcqxSTWY6aD6UvvlNS94jolLzjpSYJ87hEWd47247aTYlZjVVro4eic88aFoBEzWn%0AdRgIlrNlzSs7mFpwAGRc0ORjlwTzYO8FaCo/kT7NOYM6EKjyXuoo4pwe0U7B2gFI2rF2dulfqwDi%0AujuM11HfKytr5NSkBEYibxQ0pLNFi6m%2BaiWtKnpapKSjRkrfo8iAyHaPqY0lD%2BCp%2BrkHR2Vm0J/r%0AR8YRy76N4Qy2kFD062EjCfMKSnULCDL96eO0f4g0JOXkHWx%2BpnWEkOCc8%2BjlGJG7S0CCM2vXnL/y%0AaHEE1wgThaPwOmEX4QgMH2ChAxwic2DVZgszRK%2BfCWTQYcgADs/TCo92U/yXxB%2BPT66tNYC5sKyF%0AZWG8A1dinkI9CrCF4xJrOnwACzDbwZm1qhkfMp9qMO3rr2NrTSYioNH8Cb//evz4LySQbzzIrDkS%0AR8jeJ/0mVCIBjpkZVSOjpvUR2DowGXC/qQVOO0sgsyATyVsFDRyZZE2hgW81A4DhsKaCIiTh3w9v%0AQWNVYOskRTJJCTpS%2BSZxF2SLlFuiNDpmMuWuWWiG7v4%2BpZAMW9a1UFlNmP8gFNuRckUEcxII1JJh%0AcYq%2Bk1joad98Z4DmsmTGx8mH%2BfDNBCLc%2Bg0bxdLsUqwEcC%2B6hYasED7D97MA%2BVBgq4KXyqv%2BuTJ9%0AUM2o543RDAI1O7WL24M5t1WRrBZA%2BXeXtar5MaVsLQPzkXEdn531Uh%2ByVdPDMgBpnvp9ILIaDILL%0A4e1Opu3j/MmfcQANIJBtLzXBHNlXfcvBJDnljvMTt9YqC9WBbHki5onQWiW7aYIqWA5fMJPVAjjl%0ACJqTENkaAS45xLk4SodybjcXmcT5fOdWzaalClmSREoU6QsvIImCIjatpJEaJqCgzJpOnWoBzEPs%0AVGCc90ocAN%2BtOmD4XDYOW2q9qQNMpnyiSQgwKWfZ1zwxcwBWIaszxSyi1gEoFBjV9C4ONpmS7Qhf%0A4MxTBGzt00t5qixRkSmlIBlvJAB78dmXcvJmiC3yLi%2BiOBlMk4OU4m450hm24HQCqnWkICIRBNIU%0AR/9oEdkbeZ1%2B2OVbwhEc1agSeJc%2BGvJwYLIgEFNQpGheGkwLvYKRDBwbqd9P1vw3q%2Bu3yEJqkc1b%0Addg2Ur04apF0MOLBjBNI4QARBJwCVNYTlYkV6gA0QMljkuYpL0gN4AXR6aaooclSHOCX6p77xNAg%0AuMRE9R/p259VzWFmrY1gkmShwCQsm5on6SlbsVP1UfqvCpVAY1XitkZuPU35IFtOlEBsyYyfjoS8%0AZQueWwnwAVME7EhGHSt2VKE6UwSOIkXAXIkA8gECIlhNZM46ToLKU%2Bp3wJ9/8%2Bltc1yn7h/rx7/J%0Agf2ymtToSQMjUj77zLDF7skhz3YuOGwrFEMjo0hRZpO4hW%2BGmCxHfd782Lz6QUpwFpKkY%2BWBRoLg%0AKhNwGGJVAgWZEOBiKlezAaqSQxeA0YwECmPSy2G8AlhQVEGOIkkBoEUAIGtGzLZeZFgOYzQDB0C0%0ABZFriiWw5ZTIQpyjmlorzTxHdDz%2BcWuhtSlTy5oe9qDyCCbK8sXO%2BfRGtIgPjS0idLy2VnAq1%2BIA%0Ax8DqU9iafMiupx0pYZ4iwFrILAXJoMC3iEjyQ%2B7x46lXRr9yxz9U4KNw17vVqtCEdqxRAxwEtnKK%0AZQRHZGvfpj1ABAuRPXwgYwkD87Xxm0MSPktxjsCNdAAF04FJJh%2Ba5yZ3X4orQqLtx/GLP%2BQb62it%0AIldM66pSZTB%2BIUuGwJbvc0n5ClYiOSnBMUPX9OK0AJBURAVlKZx5jpSSyZEEy5MVwLH2Gp3KH%2Bd%2B%0AqAV2p4RtvZqTJNOSJ2Pr5uRo/nYFq6CIHR3bFhYaPTVvbGZbNwl8jloJpgDTRWaCxGVaSISDGiCC%0AHV%2B1gD8VcsbvCUcVJgsgTyGGsKZLZjxVlugwNiK6YD7gbYDmb3KBvWwdR/15r%2BMIZTlTGZEWfLCx%0ApFd2i7jjARQhHssuJAFWIciWaCb%2BvGxVnQY8opyFoFJu5TgVRwDiPErWpJwE2c41C%2BsuoITFwHYH%0A08t2RnQoLybLKWRF1I9GEppHKM8vjD9WZjhi3do/ljNQizhqbol%2BUnOejiiN6QDRHDUmwDX54GM9%0AWB9fY0%2BTop0XNw/Z2QXEyfciR1SqiBrLX0rEZEmCGybwsOrjz/KRU6CF2CMEHb7W5o0cTSmSt7HG%0APyXJsKwFMCqnlFDo50jsgzYzBcM2qt1d9SM4sBE%2BWatecSR4Kr%2BrCe43%2BPj3E3BJW7id4knZlyFd%0AfUubZyqIrzrXjEMqQkTcDEzHM2OMfNX5fTKfj09dxhQ/Nr98YD/jI/rjBHnmVcDcqsDTSh03CWbZ%0AC84ElSgIjcyd/hnk0N0facvZ8k0iQyxDDR1d/tgY%2BxXJkS0sKdb0Uf35p/zmDMw8w7B1KSWNjNvH%0A4ed/H5XBmgoModmmjvhzmsf8yDY8oI%2BmpATHMDYDwAyyAqoA5G3EPABjVRLkl0wKhakmVpDZqKoF%0AmNMUPHJ%2BxcG0LsqkxBYAF5yWTpqfIyFYeadmUOvIvmzh0Jcjl7N5WuQIDLlM4Jq0xREtV4dox6Ov%0AmhUyWNgS%2BHIAXJ/ozylMCZx6ZWJGAfrWqQkNviVFlY30PQBbk0dswoMwy1OjF/lb47HMyC9S4qhe%0Axy4yuTXrmiGJqgqexgGQv0bELeHIiWyRyKya5RImuYwlkFt5Pjm1g9YMYMjRvCZbCGA/0D5xmJNg%0A3xkboCTApSDlqBFdHjWA%2BkTH4zRBAFvzRDkAl0eP3Td/WgiBEtUA3ouvKMAkNQymDrOBWZxCbsGB%0AwCKjAkARo0kFi/DBxgnCN8XxFa2wazzcun0cMuPcSz9CggKyARls0SwCmJ8ogNMFTRahffQY/4rJ%0AqRM2HsAJJeuG0d8GRK2zY/rw5yTguaI1nvrkAUTz0ag1D2Ak8JUAmVNLVJPmjYozyffBLTcCX2vJ%0AJAVwK83IMADHs4V5BEkW5RCfitQCBQRTM2/tnF8RG3llmXC8BVulUCMDh0XGwhkVKUKz1qYOU2sV%0A5tZCSqzyiCq2HMlH0y/MjP5weURkNQPgrnf7/giKHJG0iy2Is5btHM9JHCP9CgHXZXfJnLoFJEsG%0A2fIcOQDRZa1NiZCP2NHM%2BzEpS97FFmByRscm0yojIHJErUAa47kFeCQ5EQBHRPPOMH8uuAuLz47o%0AqWQvPj9fsL8ZaloXyTYy1g6grJmiXeZgr47MK%2BKQt4mffQRwINfOrZnaOR53ARjNeJepEG4AgYJh%0AQOKKGCOgc2TkR/gNwe3xqS9eXkx0zQ9YbOSjAmAftPJgRchDSEGXJUcAwCFaNWNJyUbKWX1F5JAR%0AOEM/JP1c2eJeeqttxfQHKR1nVpNox6oEkonHzPBbHEGYyyMygJlPvJEE9bqWVA4nrD59%2BzgO4LTQ%0AAgeuEbKqEUmybSTAMVhMycZaBNThlAwLEaK1s6/YPPPzOd7pt7/oYPl73AHIQ4DvMmmUXJSgpk3J%0AsIX8UXz/Q0LRIziUGK19FSsU2GJG8m0BR3eP4KDP4mrGgEeKQGZNBchsp13TK47QIVpuIdGVUQKU%0Ar2OgT/LNsuo21ljw272qhdARmEZGAIsj4sFh63L%2Bx%2B5jbG7K3dWkli33yg01KalpgCOXp3HoQt5J%0AIgtiBiIcJW6jAa7r6C4BQYCRSaqCbB7gHf349OQpc0qJU%2BsIwHISI%2BIuj4hU2ZQuJQUJNht5dQJT%0AXB2jBOIUAXcjLui94AeYjQ%2BXv%2BX2VLIKSh3lujS9muSj9TxCzTXnf%2BT%2BPwS9Re0YjPIIB4BMxugR%0AWL7gSvDURpaYIbI0REy0XHPY2ott1wfXwvKOBAgCvE6yE3QkIHZKO7D63S5AviNoFJoByCEJUHBG%0AT9PxCtaSFBDJywE4UqeCtpBlBtwSHQwFxyvDNqPALgc2qjCxg5ExSaRKQY9m9zvrmwDTiwBgghnA%0AX2jxUgg4hlEaGACBBUBHrKy4WIkZyUQFSUJ43P7TEL8wHqVgXwvDckzKRDN9MzPKbDyZbBWEmbLM%0A%2BAKl5EgWq2BrIkdmYnLH%2BVOgGrGSnLGQ2OKIhYKy5N0Sj%2B4KTnFFpHna2B3JN08X8imQPBYE1Sxn%0ABgjywfxrMN8oFpdlC0cCVS2OXGVmi5ICj5rHpsaSAsdoGJIzM/OJMBuLRoGOagFA6tjWEVnn7EYA%0Akq4KZ/kUDCs4ZcEPmQ97JU%2Bm%2BFX%2ByvxVM59/89kNMwXg8jM%2BIh/e4/z2TWWxxXeA8Z77%2BIr0odIF%0AGpGMHQMdSWgbDSZNk7KdNHrxk%2BP3SRqY5Ky10KiOfKNMNF1s408a2CNizIBJoutD6/EHSeDj8FO/%0AgY9GDUBJOABZnCz3RV/bZ3z0v/1JiRyT1pp3MAmIm2T78Svn8YdD1rrulhcpDwOUtep6JMFTIttG%0AAnAXmmdONJlzC9aWyE2rZrEqMiXpNVf6k/OUXFLmFBeTDzgh20BH6jBDHyXfardkPJV8lHMUQbty%0ATD69JFRe3jGIlpjXB6uIbO1OdJl57G5/TmU1zXgkU1nwUQ7TJKAjk0XAXLRwmVSfO7JVCvyg3P6s%0AFn05lkh2MOPMgyML2nZ0zacpiCmAfyzyra5PBlr5eVny0QDHJz5vnSHpqDmVj0ZTGdySNrdk2KqM%0AoJqCsKfSqhUwW%2BPBT%2Boqy%2Bm8FEz5/k7i6Pi2c8pCR0Cc5RNHmADC3IK7xTHkQbsqO2o3Yntdis8I%0Ap44AXCrDli5EW89Rw5zaxcnB%2BNM/Hx2yyZUy%2BTTGnCARgHl0XI0aeJzc/nSwGUmmMFuAFX/aAgXy%0AOqMaOhlFhvuicGs5vqX1pVY8FTqtcALn8StXbLaYdjQqeGCY5OWLZwmYZLIeSaYphU8/x0OhiwA4%0AMioSMwc8LR9wDJpikXGWeEqGI2LLfCICWszuYLcCIuVyGnUeSUaKU5f8ukgwQpBJrBAgniAaF1RQ%0AcQtlHrfjyGXJjLOvOpzyYcFnK3YGFUiylfkqfjR7/AHtAT%2BtKMkVOHXsGcm3hWCvORh37EsFE773%0AeqqW1ASUsK5ewblerSsI4NhoRsXLANJhNk8BEjgSA8iwBJUIzFtLbGbGbvL6SrYQ8UMqwVuzx6IW%0AmL4YpucHcHskH0q/y5/fPD7xQge5PfjN8sOWdnw2fKgUmiSyoM0PdVpbOwGFntq60xTUMU9E3O9Q%0AkSR40hQ0c9WZfE4dwGhJyldZh/SCdqnco2uUZmzIwGxREnJ4gqRsyhZws/u%2B%2BG3ygB9/ckq5nMkE%0AuxKU5jDz%2Bk9/Sqm19RHdeqoysgeY2%2BNqFDL37H5gTp3TQqSmwhVLIM6RHOC4AluXpxWiWeZB%2Bfyz%0AI/nHADM5jY0mATmAF/eCEPznBHlOncGqqQlGFkIuwZnYkkNhqklwNnCTiNmacQyjGaPliaRDxjkr%0AZ8vVVFAc7EoQICafsprFgASYlNhOMGdIRMJHv3vJrdPjB8fTgyN5HkV4mlSwFg6WCKfgFKKZLwYq%0ADHCvqcD2utB3cTSlSNZxAjkzI44PkFPmIMxaONEAFLoFsGDyBRAQJVRuvvK6kGFxHQF58PEvDR4V%0A4cySXDoIbGcXaXEETiWtyd0WZwlJZYnwKwFwd69PpBexQk5nFSK3yvELtl4UwiwK0rEQZcFxWov4%0AAZguMoDy9QXMJNjMJICPmd3Kud3n25XCbPpmjKo1sC3AeRpmHkF2mQRDDk8mOAVng%2BlyKv852D8N%0AH4cf3yLLp8jEKVMlBkQwScx8OUxLBppHjhFnKsCHdiyTRJgsNb8bn3ZsEtWc4ZjHI6JjTFB3AKe3%0Aae6XRRZay7xHYU7nvdwSIRTjkITM1pXIQfbUm/aVICnfex2/ZDh1cmNVsx2Y5aUECOqVHRUxSjBS%0AwgK7JIMpJ7INfDDGHT2tke1mTK0WXpCSuepCMk0Jc6vazMBR0OhRc07AEdv0p8jEEsiwKgczv/NE%0AoKMcokn5kqu1qbWU9CMsJnpEFasqkmBNM3paBMghgltUgdU5gNsi4Ddc3zw%2BuT9O6aPGmdG%2BIh8A%0An5OEkgC/E0YIAv7VmSO2mtvHA2BxJDhO3do9HIeSiVUw9gVyiz7M%2BFNqVokPZgQ0XdFgqjwFyczF%0A9ecW/LSqLgAHEKR8bMsLlAUD6Oibc748zXMk36nmbGBuB202Arcet//mT04RJFJoLdExbOTWzI1x%0AXx4VFWFbr6cZT2k/aTLjpznB5M/8xMzF1pgtZVRgO9tBZgtZHWvFr2KTaCLbCdJX6hCHaccaubUX%0A5Mrrov7cTrJ4xphKuaWLrQEuTgGcEi13m1Q6E3SqSFE1T%2BEL5mmFnSqrdUS2xpjNU0myAE6LAtv5%0AuROpUmGWg90WA4iIAdeleBGm4jABr/h9CeXEnI0aAMDKkCtAjSTx2s4x0LeFkaSaRcpJas71lMyx%0AKDRzBeRJ0sjoVvJtiPti%2B4DffFjSKkHh1ZLD6UEub2Gn5QMSuLgi5pkKUHTIPiyO5qp7zsMHs2Yh%0AW6p0mDxVxKkjeSYlw2lIMiy3Rvni1OYWrMJxGkfCPBUfeZNzvLBgRshsj0WyYQLeyEt1NXsV0YFP%0ALCMwU5e75WfgFFmiBwG25g9NGrE4ero8JVKFFIAoLgpmnkzLWreqHUcmiQ1QBhAZ/RZ3mVg%2BmbrM%0AqvA8hTy7THwcUdUYgTQlH7FT%2BB1NnbB95xY%2BiwyxduqQdHkkLY5HCU4OR9KKgNwWzEJqcViOYPYC%0Au%2BV545dK2WaLICBCc4nl13GWIzLLu9S8QgMDqCVKi3wIztM4gEmjKRlbiyWEK6SqQsBBUMQYzVoi%0AGWf2yJiCgOhSBGw5ZPnGycFbxY0Q6gJo3erv66PB/Q9KKCddo07tSyRTYUmBZBSqElgVmWT4NwGf%0Aj88uD8BHrdGmGTPRz4PYksYHWcbPQykNVdl8pyUPJoJWzWhylky1MCXiRARFgDjm7FKS66QJmBzK%0AuWnxJjdWJsgZJzc4dcR2CV8JR2aKKH68PI8nKBxbNLMTkgfMq4kle31/OM3M2EhzGJJuia5oE9il%0ADExx%2BdnoiiGTrOqqU0amW/hVVQu4LvmQuXs4AJ8jtgKiR1%2BM1LYoAVsIUKrTjiRwyiLJR8ZgbQHq%0AzEI/u5mxNqmAOp7a0SjBSMYuVQGOpBkJ12iXvnWpHb2kWe4RmYPTqXliagJFivDLiztyHn5YkgKI%0AYYqJfg3KO8A1HrJs0bdjakiRTNPBlKp8gldNyR8L5bk4ZYsUQP2A%2BiaJtYtgLXOiAIGtOuZJAliH%0AglIlJyERwXFkCS2iNWGzBeDINN7muE8iECuoWqclzc/tgQ%2BRWgP8whBNBtxOHTJszRcrBziwAOab%0ApspK8DOdjaxVTVxraXUPkJcjYUZ1UptHlDiDyUNhbsVHZDuXIjY6vqgdAexIpJbtVHiKdZijafXE%0AiOg58Uqr3WzdkH3zzRDJxHQ84lwOaQZ8gMl8heslgFamEpRJXq/DHfXW1nAoaQyl5jZBmRJM2nRm%0AyguKCB6LIzJOKJZMcm6jBaxymDmSeWhHkoxrtjvKbfog3v6UYB7cun7cyco5tmpyRJ7l16xGJmfk%0ACM51ocCRH5xqVxEySJmfc5Z0QqWMHVl1TDJPxTPazhIGpiMZAdEhPZU5O1Z1CDqGTPE1WqImmF6q%0ATTx1UJuCYmNSJQFzaeOcoZIGsG9jkFcBoA8ySVYimSgoDxALfrf4L82dFk8LOgWw9E7gD8Y9/XlU%0ALUz%2Bfc4tx34SbAXEfloAkCPAgW9UXJEZIU9Nj0iywALxrAore8SDf2yphX8oMLaLI8AhyPb6/EtB%0AwdnFcgngjibudAIIbJ3EjkTBHM8S5zRf9CMgyqk1wEV%2BAmlPY7cQONtMKkX06KkIvSqUT6ZCS8zM%0AcrtcIxySBz/9%2BDrDFlCL%2BmaOR5UrblJsiYTygdoJygdSPph%2BWJ0yTwRqaeqReMZXF4ejwhVUEpBD%0APFZNy5O5Vtmo7xtb3bZq8slI7mg6D5PT2YutSauMihvJ2HcSUDA5Iz8ycFBzwXnA259uG4aMZGLz%0AAOwyZc3IUZAMOikoLoGjp9OmnFpVaiKopiCMmgQV7FKvo12nlhD5v9yTBNi3vF3cVgVovJmcWEI0%0AgFUHp47TSe8i85VLnl4Hm/piWkO75sk0XqdmbOqvVjJszR%2B4pFJGySoUnbNIoR0F6ZTH9rBVV47t%0AytuLbaAjAfzDh0nwiEwcsC0a1UkilI9WCYAxiC6ZFHIvMZHt4/z2p9spRVKR643MGG//CLz/d0%2BM%0AkQF2UXmW1HcOI4Z8XVdaGUBqT8FkiqFdk0%2BPnMQjcFVHo3k1aZHtFT%2BFCa7zyJ8c8cwfVR6ZFDPD%0A3EYQIOhpyvEb3ozbkteplJKAZlVTv3YlEwSED3HJxFaEWXIXePLp9LlY1XaCQyf9OgrMQ2br73wy%0AbJEySb5aANvZxW3JtgCWMwAotAqssuLEfiOB3UoofxMaP7Bgx3Aqq2akEAWihPiKOAaxH2ryLBTg%0AV2VtUQ6xzAR2n5krTqEBACYlK8IAqQHsSLQqEfPXLr9b5vNvPufNtcmMThG1Wx9xttPpLEm2RL4c%0AfQxkwhyJEQT4dTFDVJPoALWuyhIFPZVc4VOQ2hUgxQzm7aJC4hKOK3BKhjh/BsxYSGSRaZmZkUZz%0AO7FHXJaktgAazLyckjZinlatAYpTyJr5MHlbCG68x8cRltAktVa8Lmwnji%2BQrHhHtmDr96H8bCFu%0AKreToPKMjOGHG1nlyRHrA9jJ60U7kooQZ/dEIIOPODtaRfR2HQFIukymA3CkI9qUEoFVKZgkzhav%0AcGSvzBZwtSuaALXAVZkjCUg1VRlO%2BXJ6o0MEsmqx2XOEAABAAElEQVQpuO2m5ieNjNPOpF9%2BWtio%0ArU1rnawZaIqgCRAb/dBtRGSq%2B/k3HEc1IojI0c7hZ63DK2WeKG0qmCE6DBHMslfArTpqEpnWJQ3Z%0AaICbyuPbHoBjuVKUW3Ln3gKnZJQVT0ItFElKTkyAd0x2HtmlIwBkVp8RGGUzfspgaLPLxEqRmZry%0AiUiJIYg78lQpWxBZNuUUTGzdD7/JeGRrZ5ZTJMkpfgqMVFkCsMVU6EMheSzKU7DWRgzszPUVzPFs%0AZDRPRN%2BYbB1hmry1vN9ixgpnC/HR4l798a22Vy0EJOW0bdSAykQyLO/rla8Xr0t8q4q002QAHOIx%0A0rGdghwpS5zALbHacMAjtt7XMdwSWynEB3gK4Bbg7hLwFiqnkGblaZKZ%2BGB6ek1e83SU5mxuwdU6%0AMFtBTeeofedJSgiwndhTopO0LWOekghX8FRwKlCisQDXbDTLObUQ0Gch7qi8gG9svxCSbWCq5opA%0ACfm2AMcgqVrb2e76MwJfgmpEFhkjfHWILvKA%2BobLz3IxZIAlHyqPP7yF0Zw0C/Nn/lBzxIIGH9Bl%0A2ZJ08jvlI5i3JPG2E4Dt2PWPASCwFEF2jm0XjuRMHTMVBtT5reLzx6cWZFMgEzGXpLGkND4Dyjni%0AK0KG/9s5mKWmAA5Vflrq3CmfX2LIqhErjCMgcopOzMiWKCKW06gBFWpxKNiIZB3VfKM2CdD8OQE0%0Ap72kHWRpMGnXV5kkNC8LFlQY4IheLP6/DhARMXZTmKy2B0CWU%2BOdePO/puAWhcdsZDoNPE1ymnjY%0ADL1sJzDpkJMZPgDbllUOQFSQOFtPMvgoaaS%2BqF2ZI%2BcEJAJwayHbOGacgS7ouPxvg5gnVqiOyvBv%0An%2BhjsTUPH5FKwCp4WkwqZpn01SQG4CAI4SBfMxKIx0LKe5lvnnuTz6CgnKsD5BWpnAwY38oAamQS%0AddzyR0DbPvvdUbWoeQSN%2BxLVt68RcTi6AbbWjvUFVJj4tSkcFmQ/LJhwDikIKnCUFMAW8u8ynx9Q%0ATPNT8Irl1KVe3N1vI7MhSIRjudOStKq8p2xZ6MzZ2E4FOUVOK3GA4lMOyiwmpCMEsOJUkXTdKbeg%0A%2BNSxinwcaWaQAshxKluQOfKHgmok5zLJSJ3WC0GTM8KsdaAxUK4c7KUc2KZ8ZJJJuhBJx0YfBl3%2B%0AmGOoTKHtZlMwyhKIcJpEUDvBjBKKANbRotbO74%2B28eNK9z%2BQVVkRdaZUMwNYXNffAK9%2BD3gXNOUX%0AKaShvQDXizeAMzT/MV40lGWWOYAKJAHGugPIEFmcKjXLrS0m0nUA80YwU7Oqkrbqt23%2BoztbpCAf%0AeTMeKUVEDRp%2Bgr1LR4JDBL5zSnYY8FQoeQC3xBqBnWECadc8VST96J3NyIRqliTTUk1CX5unzEo4%0ABVtI0/ICPrXmF8hM03LiVPAHh2SAYVhoIqKOCugfaw4gx%2Bil5imFHClIVLwS%2BGAGMO%2BWDNuiZJWN%0AqjUqIH0ILEsQcWwB0SXHciLLcgsfrI9/OnRU08Thd1qScpoaAfxKKQOAVhXb2RopByByNJfiRk5/%0A2/Xu8Zkp85PARD4DjjCayFG2gs0Iwn2iZPxI/JCILfPGCgVEliJExMPk6w7giBUAQyjezu5rlngX%0AaXWvqkYeRZg6fjWPpirUCA4lk6PCQYtvX7aC5gG4KAcoYrSWRq3UoqnGtiPIfATdS4LbquYYNIXP%0A0ccc385QSYDasMCxi%2BnUOiBfhQZOTQW2AXA07sVvQKJ36Y6VCw5xy9VE1knmVxRsnuhSB1zVgd3O%0AMRDpt7MtlCqqSWQeP02B00KjCtw/Y2A6mCXSiILUnMQo06hXkAHOQJ4WRMnpVCuYZDNdB%2BCp%2BaPd%0AFJQWv6bkVSNyUy5Ilb6BW3EoZHkLLsI/JFi6RyTfgmZTMhwhBdM5wfad3eulPlunnVFNoqteApJ2%0ApMTyGeso56Fxu4uF3VECkbzd05dpVLCqQKcqsG1OfVCTU8ZThMhyW7k0tgAU5BDJlJSTYJxokole%0As60EI0cMZq1Mfev0/iF/fNDeJR2AtDIS1GQwlpriI9q01jJTmL3qovLk1BqAvkfciOVFnMHTOlYF%0AP%2BwpVS7yqrH1p2PObxUEez2NlhNVdjwHQzM1pOZgDlwmQB5sVUmAkwjo1djlrepSAGjeyGSTKGuh%0Awx9q6XMLvxhdPP7sW7mnRkq8i4OJOXIwtmBHap74ZNSfEb6NTLqNUIlATbvQ0UbqK0L5VJgYgiJ3%0AysdHn4cpz2lNVmh5s6lTxJkwQB0iebrwkQnIuBwYzbaAOtoFnQkcoBL4DUMLsArFMpYofsQUAB5d%0AQSUosyDYrtrZ3eS0wnJrwQAitMl5iivkFPdc9FIKhTRl1lpxYgowEfGfjwGkVCPKJDqJvfoxATz6%0Af/7fzhJ3vKZSky0EIls1G4%2BtHAglm9lM4uqkqSCxpQiaFM4hwSbJS0bE5bbCaGQ6EiMCYDmVp2Ay%0AVLXqi1EkbQ2QaRWR7uG76qfyLLEqwm8L3j0%2B/TyIfgYBPzAdLAlw4f4D3n6G/Tzwl/yMHhnnB2Y5%0ATESKFnIEn2HUlAmtz/WYkyMy1LIciS1kf0QB6ngKvhM/yGFA4wHMp2bHInkIRoEdjVUJpHGErMN0%0ALxsd29k6hQnsMn%2BPTGcsh%2BPiiEWLukDwpmZStpBohvJ8KMkR%2BbmdOKlApwCXrWckD985iR9z3/%2Bw%0AnWrQyDFzBMj%2Bs9A5/bibuVr4E9tCTSKylNzcuf9CCaiTmsPLn9iMauanIL2UReeQgmYV0Rs5GDE1%0Aq9giwu1kkjxKLLeqiH5GBZrH7uo3CTTLzRBdJAXzChNzWl9A7QSeEq8lynrEHeHrf0D3TFZei/6Z%0Ayr3mj4N9G5tTaom2U615OHLNXuLHycdvA8uVbQZ7Ecmw5ByC6QAkJGWVsapOzbCFwPxvesWEDHYS%0AZa2i3It3NbtAtsTtNSKCgpoJskXHQhWuhWTmGNbOaInWSeaUOfmqo6ksGQgkWX7EXseq1CgnQ0mn%0A8JmQqHK3vgt/iDuAMakUBOXVcR6ObgONT4QMRw7QGBDsS60/vwBOk1Lc2hrdhnv8RuIIBWNqaarD%0AKYtTfxz6oTBfhOxS3JJ7q495suhB/PiTwWamEsDMNz/KYPuWtIrYdQDeCMDyCEFlLTyk3CbOtisj%0AxdYIYKmAMtgIgMCyHY3kAFzk543EtpNQxkIjybmt9UweWB00HUxAVAoFlqMSwZbf0x8YJnwz3shL%0AqcARSw5xLqTYznkSsSNbmxKhoWOMRkajbMFpWzO1swuFAqLYAYjwWZRHAJjslC3YFoDrslblekEj%0Af0S2qtmCiCyr7pR7ZGGayXpqCViavh2RkhY0FnwzMhFRYf66gzaHAVNiRoXbuOMrjZTl5h3v1uz%2B%0A%2B5BCCP1CaMLGUFy%2B48FxqgQ5VZZoa6r%2B%2B7//WxEy8ufYyja2ClNHKWVTcAxrGQMwB1atksab3R1J%0AHZlU4Y8ZoltoVpkhaa/Z8doasprXqL4TJgVgmZTw28aXj0/c8ZOY3vHR4r5m4SCg07ZUmST2Vchf%0ANf1iderWo5iUq088qthSIhOaX4j5s%2BSn22dsOVsXfMgkzTunOE27u70TP8IkwHlIfvxpVbUAluPB%0AABDJyAbYlOhpjejiv5TMDMmb3GMp9djd/lTE29V00mxHxgWnjwDxMKcw2SYOJhlBnWMeySZnTIQk%0AIm3jk2d1U7qIJVDiXeaN1DFChgl2eSk/X2QVUbCt/Fn1qP4cjxL4DjMvrpSnRmgtNME2nVGCtaoZ%0AyR8iKijSVFxKnA7lZPySgBMh%2BdQuyxGHSXQ7vVKBo6nGlgVZ4FTNIHi6hR85BZuqRpTQ5KlZm6xG%0AGR3YCc1Q7lLNXnz6MP//%2B8oNOoLtTkn6FSo7j1Q%2B2rmlSqax%2BwJYdGmZqR38BNWfOtIoaaoaUdWy%0AUA6NuJdXtqkdZ19ljYk3IeUqKyuhFk9rS0pDSjBjnDegYZzWKD9lZjsmhADT%2Bb071786AAEmOsbr%0AbLYrH1l9Y4OhVlOxR9BkNg8jsdzKbAbyXMeOViFCBkwSXNJCo3k5flLqgK//imkvZ6Mcpuboj5ik%0Aq46Ik2m2Y8K20FiKT2BTaeHE5ROZx1WmElo7gBd0EnGcOiqVoGoom/m427j4o%2B0HAR0yRoB9ccbJ%0AydfXMeCYIdKCaOY62JwQ5tyGqXVg49zCcQb7GpsKZlcLkGQhRaRcBU6bDeApaiwJd%2BJHL7FxDlaL%0AvjlmbAcftaNRo/oPJvs6SV1qoY4ck3Ea/j7yZ1C/UwCFHJdBYerTYq6Ojnb2TUTBz65Dn0LIaAKM%0AZkjCJ2OtY2RgAAKY6KovSdv1JXRCR1LNSKGtBSoQYaqA86mZ6V4Ap7U7NNr5T0kAiwzL0%2B6luI1I%0AekGkzCtOkkJfngzAklZVY6Pg8sg4J0yw5BRBxwlvgz7%2BaY4gHPjed05oL7uDEy9DEkwJ0VOkrPKI%0AfL0EbaXZumkncHIF03FstnWJ9ruBJ49PTMEFTMwdgfZpEBkI4I4EFsK8fg8stIroV0QaW5ecIpqz%0AqpIH/WMAvw3%2B/PQjND9j%2BOiQAczBSNLCaeWY6S4A80QXBIAEayl3lYTjMsOpEz6In7%2B5lHrQb3%2BS%0AIVrofeubPgCpp1sbEfWhjgBlifkwlSH0WdQ3rwKVoMOaM4BLCiRcacfwELz17KuCN/U63ohIOZkp%0AIhmRFBSsnHyCzmw5cQKxBKdKcyqTZEUQpA84WrD1lKgOUaBOpwEViPcBP0I6VFHOr3gP3FpLZtoF%0AZiWCQpPLvA/y8Xa1HQQXWxdMQeMB4BRnHgzZ%2BFH/%2BMMx2CkYU6lELHfLkUY15xU4rXzFvTVflZaZ%0ABqDEoapiqw6RZNHkbGomjgpTxxm8o5GMBGuJXqptmqlZMgstaRJKINvL281IniVhapZkMPKUzBlk%0A8r2CZjsyEKoCTOypMZ2ZBD9dDt/R1BR3BDOvAOStvc1x/yJ1az5rsZ9yzsufN0XE8mnmHInTODLt%0AZUw5WmRbNxLAcglEurRMUtK9Erw2IlOhYxfJg4uA5qHKYTCHf8vMIpNexKmIgRQg9O%2BRJuGgOde9%0A7iPAaZWfZP2xr3n4MJvfS5GcmUPTQkVmJJ9%2BtxZ0X/nOFp/T%2BnJEft7aYZonshnnT9DZjEp15HYS%0AjuE5kux9G8kWFtLd32ndCNCtLSemUC2cBjYprY4CZ0iwdvOb49jwj4GTddRj/vQ9JarTVgBNHadV%0AZEpx6roSrFXZK%2BQSW/DR1JGKD%2BHbd2%2Bu8gAU4B%2BTkydpCQS3dtTAIsDBjDABRo5QALNQc9S5LekR%0AhQ5jR5iWz8nLqJOyCnRk%2BXXy8yUiS5JIOzsSyVPimlIcubUphfzguGx9dHRmdRSXUFTNOBUgsyh3%0A3eYeTiKogmPMQntRBVAEJgSGJPkY9vYndyQvhwj/o9n9jzoG1FR2ji1GwZGMjmHtMbm91DE2wy8P%0Anjw%2B552xw88AEwEY56kfMFhb/STc6j4EOW7T9MOIA3hKU2pWWXLlOyGD8e1x%2BRk7toNRhRSRI3XU%0At5ZvXsny3ssBKp80jhSfjahSwUKxBKeas0nm%2BpEFTkXV4Ywj1dTtjE3ytBdM5ic2T9cxSbvZUXzP%0AfeQ7beDZHdz8OsbW5EHzCiWtoiR9QFJO6yfLvz9xNTBJgDpeCj4Zb2R39Ukm6zzkLSweAEIjJfge%0AwJ9NbZ2sWznqNJJVtpvRGYiITJ1EUOBqfHW7oOWQybBwaf7r5l3m9iuYjoo7iQOQYcG5/izYXQLR%0AARqjrd0lRBZwlEigIwunD4qUd04dm5H83DYALVg64NfGeHfl8x%2BrlNcIHUqIiDSJ4OjCtjXJShmR%0AAswIkwyFljh2OoKpBmapBrBwXrYSG3lfL0h0S2RBaE1NMKfowFefKJM8X4OGhOlKJ/A4uf3ZSIF5%0AOnHtTLpFk63Kgnmq5lRuBqb1ynzKOWBGDlWKK1ghgDt2zesYkynWTyOZOWdk53ESMMu%2BXcdbJNgA%0A1/GohWac5ZbcRh9vTrHiXfnW/vKz0GwAbxG/Ued1UuZUflO1RYHTurtVTQ5jVCVmy5pV1%2BvUGiCT%0AaKFxypJh2/KafSvK11RBaI2tuMxae8rWjEDskVVzsDITTMLT4R0M2tGRbbVdyt/t3o6B%2BygV6VI1%0A8hc7Y6t/xLaWIwiwF9Hfn0bNkaZ4tQAzztM/Spyf00mIKSB6SvT6xFeGzyN/U/mh2Cjl5hc4uVcz%0A3gZ6LGv7WBVMFgARTnPahSSAPKsSMHlNmB/TnMcBrFX5rnErZJGHoKYZkza1NgUJko1MMrfguRQh%0AOs/8cKdREFD24mIiTRVvKpSlkeezcIFZNuWUQlczuz1E4lfb2DKpQoHFnMUpZWHlszU0RThlofAY%0A9vYnmdlLzaNdHe3u6bxCCgDybiPI12EVbjd5/AM62m8FXj4%2BMQsjivilp2RY01kzRr3jdH6cFnYE%0AsNwYMwJS4uJTPsla%2B6H2g9RnLEFm%2BkchA7DqleYcYw4wmX577t%2Bij3/P6xSggpxGYgs2KceOFbKV%0A42C09kiahUYzM5J3zXZk4DQPgNOjHRzazWu2bQwzFSo4u8%2BjOfZkOgxVTWWVrWvK1pmhsfhkmdnP%0A16uZh2PhFKkdnIaX4LTkJ3Bb0r5T0BZvImRO7WtETUFjmop0Tbs8jU4454yGiPfq9yZb%2B8Kn47RL%0AjGnkVZCcWo3gKDuPmh9a%2Bawg48U9kpPgFaQG/xCcCmJijSZgSLcBt2oiSxe/JMT5nWHrSDCpdQCi%0At07E7mznANdeEiQTU7MF8bjsIWg7Y40ESqXcKeTG6JQurq4cID/HULaIFIR0AByxVKuRY3t0REuI%0AcmYsCbiuyRTLQR9gl1k1%2BZPZBZ15XtyMZMunOKf%2By0fXTDYaHJIOQ2QbFnhqoVgOYwCMMCVUItMt%0AHAZgJTJ1ZkcJXKRF1RWbTI0uTkKj%2BTuBLUt9yXO8ZtCiukzm%2B9komTOA4wtma05r8eZSciAzqnFK%0AeVNvQZ7lHY1mPLXckdSEI1DE2jkJp26P6ORzJFuUARyrGeo1M5IdZg5gHmaXOn6tMTOn0KitY8re%0ASFljjSy5VumY7frmsDVvL/WVmr382uSq4rPEaSsJNFWjYoKLDOCap4v/EOwUtTk8BOcn6fy1A9gx%0AE9RX6to3soWVT74Ypu38mPqwHIxCgOV0hMxgiQM4IpOURyRblrv1NGcAzVPSjL3Up9YJacRqQrcc%0AXZsicujM1hz5QRwfx9SZYzOAR0XHu848x0bhupSqMICyR0QBGa/QqE1r3mHkE49emFNGzhzeOe1O%0APjA1Kdfhq1QTpvnLg/PxiQWamGUALCOJX2BNn86aMULwyJJJU5BMHE/jeCTtiJM5MTT6%2BoXwQ/UX%0Ajdh87dJsYAh85%2BbXTsEIgFlea6WkIQIwWu7p5EjwC2eMj6Y61sb0p8KOU2q2s5BYreVw6gJmyUEN%0ArNqhCV8fuqOgZKDyo68zECmME4Dccp62ldTC1uTl5JsfrjERaBTWyCpOWYeHqHVad2gHluMtio50%0A3R75pAAqp%2B%2BE8ZMyf40oOIlSYqIKXJmFM2wBqnFKOxdH2UWGrYJpAsK2uEt%2BSpE8liVN7iS1nmrX%0AwiPDVrXvxro8Bd7dGYh16TuTDw9jPv%2BxKr9bqz/vCDZ5RPPXyb1UM0yQbF2mZo2umkfhUWWLrtat%0A%2Bw4I5iRgNTky7/aQotH8XsE5RGZtQx7A7RFRJuNFBEYEAUUBmWNR2BGA5UWOK3c7G0Hjt4FkmUTs%0A6o7J3hTfLubxXNB4Ju1bC5NdVnLMvntTRFl1ZBIjKHWNXqR8jZqkHwSAK3GqxLYGz6qp6SRPZ4NG%0AeWS3CdZLcbcOeVRNhSuuRIVjkrbO7zXBADP1BeAYyQQBJKUdZjZGecFRqwIigk6zIoJj0GuCybdj%0AXdjG/PjwHr/e50epgswiXeA0ucM0ko0oLFMjrVC/f%2BaafNqIQk75KWPR7ujYPE8BguSVdSSjIjOW%0AJ2mje8Nv/kuGXvlqlMMTncGmXby%2Bs53YI8c7Ikdw5iKDvjNc/%2BZzzoAU5EOQWibnUkdTZ77GyuUT%0AGSZ8BfAToZFzAp5%2BxJLheMHUagowCQGRwweOZNYRgJqyHUUTKHhESyzPQ4DKSs0SM1YVAZpD7Mvj%0AzNbGtNGM16a1ppbCFCYwD1NlRTCK1fDpwPmt1vn49PKaBcbHrMEsMmwB%2BWsmjuWexgGYL86jiSMc%0AQM4R5dh6fqh9tH660viGwQTLJ3IK0%2B8iynWMIN98rdlGnsxwOoLyADs6qvnEo3nKVNfZJiccQCqs%0ACJGMESCh4ed4/vhpBfku%2BxRYqJrRvuUFTxs14QTwJfdZVCvN6/jjeny4EI4ZyMTvN7iCB1kmcS7V%0AvEKDUa5C8Z74JlSS2vQ/WWtUVq3CK0DKQjUl1NVPjW0fnLSuD7ja1QBTWWb%2BNwmC3sJJyjcDgKRR%0AjjMccfYSFwEsFcSzV/oThBuYjEkUbJ0JfW3MTHHKI6eQTlN5ZP4pzbFt3QA2Uj8C4KpzzUx%2B2NZF%0A8%2BoTvd0RzR%2BRQjLoEHGAkqsUpk1vD4KC6oA99RbggPlrlEA8AEzViIFruZlJuNM/vqg5YFKavcD8%0AQojsHb3m7FLhARzPpPioisAM0IzyG4DtpB0mz1MLi/VSiq3gVZRveZ7428CfCJN2bLw5G4Tr10D%2B%0AvJqZ5gmg2QzJQp61EiwxOsnEZPqM0oSA1KtlC%2BJ1UUKti9MH/MzwDSHvGDPCaJLys1xlR5r5MFWT%0AI5NIu6Mq/YAikuH3Oc6PEg4ESuqoLHwMPDyMZgtLTFplL/Vth45LgoViWz/OP742syM0OQHI4QAc%0AZ1DcqA44IO7xABCT9yKIZ5Fvqrb2paNLvoXEY82OHsmvyiQ0BwCwOEXcGeh%2BvD/Js%2BoOmJoWIsLA%0ADaOg0cIZK48PIDm3E8tXwWH6fAFmPFUETDmRo3RqKiDPzMabBfclebZTtniIJAWwFhmAW2KFDnOM%0AGm32tYrY4lTZPrIy9kIcsr1oMcHsaD5ZQH3VmVEaJQrq83S7jlPwl8fPH59dG7/AWNYHQyaXpckx%0Amsn3QIIHge1Uk3%2BQ5cSUH5O%2BLL8WxvmhcqQagO8c%2BMZ%2B8BHxi3ioRbOWKIEYmBy/UmaM0mampoLb%0AEI/ZILslMg9qRNat2X2ho1S02VGdohwJxo4QQ6ckeX4CieSPdvUVFO%2BDfIaUBR3ADwfgXFentbDW%0AGJ%2BZWX2ybjm1HHJMLgKGAICvbF2ksY0/gfmiM7BNxEzRfKcwWQgSGUBlQflZe2N/b6mmlNya%2BpEZ%0Ak6kpfadd5omWtwXAZJFXygkRnBy3DQBoDHGEWQU2H5g08FeW8xQP0PXNK0g7bkScDphxkmhUeXcA%0Ai7yxwUoGrpzIgOOmc1vhVYrMTE5B8STETBzg7a6xI4DLIcHoeHdbeEoGS101nYQPlW8/2YYUvIkN%0ADyd9k1ahD7DLzIiL0mQaLZkOxLGRBK72/o5TzZLZpVPAXPaSf0RontLaozlDJqgm86owe2lXhYIi%0AzI7S4cotfyg4IuNs8AFM5ZajJuQILMHTOJWTcdlX8tOS5oEPftTd/pxV6pgUFytJSkD%2ByDAeGW8t%0AiJmIV3DL6bz1MQOcZphH1QJQKJovUiKO4zBHlHM0stZCr2Ocv9w8pfwQZOvHl2YtJrAFUR1FZq9w%0A%2BpYgbkYAjanArKPjVE7EgYvHSCpMqTL3DrcnHwtsBCjltD07%2Bzs9ZqM1pw5gu6LibK8dOwJAKDoG%0AEU0iY3hkF9rR2gVmOVgDQIPPFk1HQgEwB2g88tEkm4kAQI11BeY7SspJ5mBztnQopEQRk8S50tcQ%0Atl5hcpq57pyKo1EILiZrciqAj1EVqTbNaws4jMetBbl9lBwtrlv4ituU7ex%2BJCXDZzF5ywzR7gG3%0Av3Z89/jMCA3CCAwFE1n5MmlyPDpo8asVzBjnAHEA4TgMwGdp9EMtAwdsiRy2LGnkjx8SjiwJsJ0d%0AwW7tftO6r1nl0YwP1jc/MCTlqMmWqZjHkYz2IkpOJ2BfdV5xyktGDXF6ua2RY9SR07BHZSwkBmxh%0AxmjtzBwzu40wW8xaaX5e4AmqJW%2BJZOL0EBqnJOXHYXtgM9JmVLypAGJB2JI0D5DgwS//CqDDkRFQ%0A0wPEgTldAjeJHAtLSiapaXBcdoz2SH/zrSBJYUeS2c4qdUwWJ5gKMw/uSDC3ZQDhyr31NTaM4rNW%0AEfKtMlO/ZLQD2GLGgzDVOJrbp%2BIlAWIjtXSx0fyUTRrJRzPjlihAKj5kvgN%2BDYxwjl6QLUztJjRW%0A/JE7oRxiIEb6ZMQTRDuSDnPEOHbhRhK8JsnjjrYrSk7E/HVLpmXJVQEC7ehLjOOWDCsFgIQDTIL8%0AI7YNWKIavQDEQGPYiCqPpOGM5hAhcMriSPIVyInZVv6M9i0DcKE/gdtb18fiFPjBvv%2Bh1BzmwGy7%0A1CRPkUkAe%2BtHz1s7mxYPoJR9wQ1QC/lt4zdPJYKpH55VDkx0UQWAUHmC5G%2Bf4uMdCKdhAiVnBgXX%0AbAF%2BpD//eUQG/fL3bh/PTnDijSfTLXjmwa5uDXi67ELs5SmAjAKyjn177d0Xzz8ywK7TGI%2Betz8t%0Af9qxI2lxjknQl%2BkMdHy8Pb/5H%2BL2lGh3QYVogomNNGmQ5Qc8NSpyRLZlBJAVYWBAUTCVwbO28qdN%0AOWU5v5go03YqhxMxE1kwFTpK4QBJASLPJPxD9pjzqDr03SI481NfnMgVSKgcq3XbmH60q/ivl/n4%0ASK4X66PCF38S%2BnnI2VkFrW2EQEeC8ldwMCdf8oyezk9U7CfKaVNRNdfxzaup/BlfDVBru1xL0owJ%0AZy4LiXOw8OE2hfETKXMFTznQWLUQZIVHxQC0A7NlzZHaAuTfGANP8pxNmtF5ZhU4MmD%2BoJqvENBF%0A0JlYTrFCAMlrjDlBl5pAPOMUtFHtnqrN5CvshJ3WDuDiCCBhNn1j16P09uf0Kh3U7DvjdYbZ%2Blpy%0ArTUTU8FrU/PHabQJxDMqTqPW9MFT4iyZ2KZG8xPPzGQemNZkjMeR23TegKNQ5uSn300Fti7ZVnCV%0ARbN1fBnIx7fdbHEVnPwKryCafQ9CjcqbaSuYyVkCdh18e10v2DDwKTQGSk5wYLauo8rt4/D8xes8%0AhwOHArWHiGrNLHgVLUehNX8WSDYbwEmMh0ueqma0tugA0dqSccUMPE6%2B%2BbNCQTEw2UkFOAW3FRc9%0ATQFNZY/LmvfISMncTqyaHQ/9GlU%2ByU5lieXGKQ52W6FVxlcfpVXXqMgUJOP2SM4u117OXCHAlY2C%0AxO1rVE2F4gRg1GZ8yH/zJy1YvDl9drq10BY%2BNe9vz4%2BAXa8co93sKLZf%2BAB0hGDfpzPQy8a9PwFm%0AGgPNZLueyt7FKI17Aa7R02IlUyHcqVJ6ZWyq2QIaJVYZzdgO5kzeeGNNJtgugiLg6VKGI0AR0Gyq%0ApXmIWGXSkghjwG9ghFmVfu04VfCQrXy2njhCUtPwQ/OVeCK/Bvj89lzvk3cCYuBKJpNl0sgEnvI7%0ADTylmZQzY%2BQ%2BTjJ8osSZiUbtdXFKMo61xZkHy5z8rixoexQmOAeb5DmYjczUdCqIKw%2BQ9%2BhpvB/e%0AQre4Nu30PbipjI/7wGxtcSN9uxyVKPj28LZrto5k3ivOEMfC63XMTBo4wfBTUNVxl7aCGS059OdW%0AQgq1%2BApQp1qAeEZ0agc4Vl0quUmMBYFdNMrFAmMEQdvJBM%2BSdA6O2y/G2Sh8zFC%2B7oC5Gsymr8qP%0AkZIlP/FBm1uaug3M0ynyCsOfR5U/TXpHOLa7budRUgIFidcFgeTkH/ocmYlz8Mtfgcw3/JQDU%2BSa%0ALAOY2Coa2UtQ5NS8NAtnJJ/a5IiPOAuPKpjXAUq%2B0eHokJoDhxNXqnwjAea6ypKh6rrMK4tChWK3%0AVEm4gqf8klYRKzTTVjBjJXMYknMbPkC1swvic3HEtngw51ZstNGB1Zm0MHxLZvR0dp8KMW%2BV365k%0AU6DQ2gkmzdP48whttt92uO1MFqe%2BXWaENltUNXVIlhcbU2arZoBtD79efYBojs2/B/bSA7BlcWRE%0AzTFsVzz62tTYkY2IvjyJjeERfBvRywdnz845iTRla5G4GeKxHLvhA9CSsqStYEYJSQHm4pStHOKh%0AU36CxK8gmpopByIcICnyzTBFwHNbeeQy0tKBIEcg7jTyFL9i%2BDFtlI7bBNsKkgK0OAJPwlH1S27f%0APT65MIZiCj9gRD8qXZhG59ph0OQcR1eRp4QrLc1A3QEuqgDFlC0hHgCCmVmiQrWCaILJmfiouspe%0AxztGakvt0etae21d5gpUU/bapVOvMLcTe0pMv8wBqop5BZVEJiOeZDExUGF8qiwMdCTZWvAVHAS3%0ARjWfZjoKTOWJn5bP5BucTl0ExzYaQDxB%2BrM2/EqKKqUqFxx8kzGv4CAcat/d1i5mmQBH4KM1WzMz%0AKnIUpnyASevoadIWcQDXDMlr7ZE5tlPwelSLecEjOSfpaE6iLNHVEdvZfbaYmpPzXTw1Jz4K55wT%0AH7S2k3PMCcdGxUBHgBQCMwm%2Bbk3OWG2g02tTMxAEs%2BQVVq3CYzvz4EQExACFYhWmDoUsMgHx5E%2Bd%0AFKyaUuJrIfmZvJYcmZQDszz8CpjvVHGiasXA0T3mNW/GeNWfp9fJX011dDkKqaowMBuB50UmPpSr%0AqoWZKXtr9vi3KUFVUw0FF0lA8SCzTSRw5ZiZOlO8x2fPPzPykWXd3pr3Nd97JDhqBvHsNbFqZK5j%0AOMzs7uuXjAoN4APYSHeAR9Bmd7scjZQyOcmvsCJWFS2fR4egasQAZPEbkY4m%2BKPzH12Sus7M0aux%0AObrqpHCclhcQBekDWFNQXOYKLCEmVUYw87N8KpenZOJD6hfbfunxqX3TxC%2B68MWSL9Jo%2BorZBzY/%0AUfjlKxTMeL1LVcdRIkd%2BNroemUkzcGUeUz1tV3ng0Jn5iSct5aMjnI7iXzMdCa5dXpXEDBxS7wut%0AqjZQleDYHi2ezpzUU/KRTJ/8xJOWYGCe/kVc08AhaNMZITRJVYIZD51ZdRwlcuTd1uuNwtPCLyaP%0A7sd2ztAkBzhKju2rMb5Iq9crnfJvBN8cVR6YHb%2BCKwTUSDDjpIVf6UtILf4b8IY8u0yFV/k47wnz%0Adq%2B6HwrHtkZXcDCPbe3mDFeRMkd5%2BQMkS37iSUtKMGO0aud4JaMBUpvJA8/Cg39sj0K3s5zMsT1K%0ApuBTPJNHbcqCtk%2BbztNDp%2B3R61VJtEAKgveFVlUboLbCK5gtOp3JiWeL9AMyExHMCKFTybN24tl0%0A4sqTDfja7PlH3kU5yixfngGfnfeTz8fn7DUxUm3DArsY694w5u1ia5%2B%2Bxka6jqE4TQVtG%2BMAKByZ%0A6/YQObbxlUrwANeqmZE8M%2BFAjQTpH/lX2%2B/q/FFBGqV5BXOMqfwKT/6BEz/ySV0BzJJH1S%2B5/QOP%0Az3n/w9mrZQdh1v4J/EW1xggcvdIJHISftL3Oc83MkSZ%2BOtK1fNLen8acXSaOAHiVn5xru1dVV%2BbU%0AeY9n7cRVzaYTR7iCpzpX2tPMV1r8Ff2nTUt%2Bt/tsPfFV4btSlijyRfIsqeMPB18ZZt594jnMV3Qm%0A/2fgr88wmdcbfSXzdP5kA09pJa%2BNOvoK%2BGIXpP5Eo1cls%2BnETwd%2BJfKUPJPvC2ffiacC%2BL3IQWb7%0ARipymoGOAlNn4ggTXHXel1z5U%2B0pvgqaeSp1TV4z3%2B1y7VjJm6M4s%2BMb/qRZa%2BZNydMWVx1ph86x%0ATeq7IP3AtWSKhwPxXynM/LWqjIDYOl59NkKt5Zvz6csTToMFUA4LygiKs/XEVjmAr80ZG%2By73et7%0AzMP2ae2VVuaNVJypOXEEwFd0vk6D%2BarR10XeKCDyZs27TDxLruLXzOS/wof%2BFJmY8mP7SvCXyX/1%0A8Ykvh4l/gwV/ouMXP78/ofzX7/tjZ/uiGmNP5tOLP00e971ypuxB/knbL3a8jvp%2Bni/KJvKH9P%2Bo%0AeF3egC8O8MXWX1R7M8%2Bboy/O8Ebh1dHXx/5JMzwd4I/2eiry6spfzL%2Bf4Ti9DnDNvOl7qL1hzqM/%0A1MLCP9doNp34iwP82KZzAPB3Z/h69%2B9K1fpnaCb%2BRfBTZ3gjfj26%2BnbNXC915VyVr1U/NvOHOl4H%0A/vowf1ujNyM1v4D4dKXAzK757CQDwTiZYNTKXEGngqJvTraBmLO7M1wnuTYqk06ZAxy3OE7n9rtS%0Akb%2BuWckVfL3drJ2t/6jCrJ2ab/AfbTGlvt7uTZeryDUzm/6q%2BEtPSnzEnTdu/me6Mz/Rf9zwP8TS%0A6cAU/ENuvCd/vcUr5hzsD%2BEp%2BH7IPyT7S5LXqz5WrfgNvzDzO5Abgt/QjcOBH769uv2fZvJ//oQ/%0A6kO53nQqf/1zecV8rz97/Qx87f5qzr/Y/doIwZ/Uq1EPfbfEljOwrYQ55yLvVgI45nfBlIXsttYH%0AmGp2PN6ccwzITXJ0mTr/Luxs/4GD/bsM%2BXl9%2Bxr8vBb/mcpfelLyFcQg41%2B/xs/%2BQr//LH9296/4%0A82rCvzLbK8338/yVju%2BVf97pm5v%2BE6/z84xS%2BR9ql2P/wA/0jQ/zI/iBHZP94XdJ%2BSvgixdX6mdc%0A/ytD/ljOmyv/2Au%2BafTmRj92hjeNXh29H/vfPt6rsf9Q/v0dr1L/xFu/v%2BOPutH7Ljr5o3pdP5eZ%0AqYuAGJg0MDM7dsDkQftDW3tRUtNb%2B/sqmaB96952EsIBxML/FsCcf6Lvv31sZ341/M8bz45/Wv/V%0AwH/iI/gnlnzp8flPvNjO/KMceP%2Bj9ern51r1ivmj5lyddWAdWAfWgXXgZzhw/SeaXfafaz/DbTWf%0Ael5S0HaO0YciaPtHP7Kn4vUNIDuZs2l4zjDxHHvxOvD7OLCPz9/ns96brgPrwDqwDqwD68A68E9y%0AYD7tnLtMYN6n113A02M7S97jo0tbQdtEaiRoC2Hi%2BAvWgd/NgX18/m6f%2BN53HVgH1oF1YB1YB9aB%0Af5gD12feNcOVrg%2B8a%2BbP3Xy2e4XnAEffY/vnZtiqdeAXcGAfn7/Ah7hXWAfWgXVgHVgH1oF14Nd3%0AYL76vnLbH/vku3a/Zpjq2vSa%2Bcrwy1kHfkkH9vH5S36se6l1YB1YB9aBdWAdWAd%2BTQeePvnmVX/q%0AY%2B%2B73f%2B2SWajxevAP8WBfXz%2BUz6pnXMdWAfWgXVgHVgH1oF14NOB6zvwpz47a3zt21Hg75mkdgvW%0AgX%2BKA/v4/Kd8UjvnOrAOrAPrwDqwDqwD68A6sA6sA/9gB/7rK7N/5f/A8xWd5awD68A6sA6sA%2BvA%0AOrAOrAPrwDqwDvyeDnzn8TmfnRP/nmbtrdeBdWAdWAfWgXVgHVgH1oF1YB1YB/6cA//lk/KLD0to%0AX2T%2BuWm2ah1YB9aBdWAdWAfWgXVgHVgH1oF14Jd04F/XW/G85L8kfTwy53bip/916klI/ymz0wXr%0AwDqwDqwD68A6sA6sA%2BvAOrAOrAO/sANPHp/ztj4jiT5Hrw/Ip%2B/MqRCWeVWIsGAdWAfWgXVgHVgH%0A1oF1YB1YB9aBdeBXdeDz8dkLk6v6UCwGpgt/7hmp1Ndr5c%2B%2BE39dZ1YtXgfWgXVgHVgH1oF1YB1Y%0AB9aBdWAd%2BJsd%2BHx8Ho3ng3Niabz63jwjn74Y50PxTa36TxWOCdl%2BV%2Bdaspl1YB1YB9aBdWAdWAfW%0AgXVgHVgH1oG/34Enj09fdEec2/mMfDOxJRJ6rLKtfBK%2BqBMtETJvdCat2gXrwDqwDqwD68A6sA6s%0AA%2BvAOrAOrAN/swP/6//%2B3/87W/KQ8y0nCMfxOUcMdDSBhWUks72COBMc5cc2EUuO7dSZ%2BIu0WbJ4%0AHVgH1oF1YB1YB9aBdWAdWAfWgXXghzhwPj55i/rSE4RrxhNuLvJsOxUcb0WT0iIHjtq2iQQ6AlQe%0AmKeTcOTfH13Jm1kH1oF1YB1YB9aBdWAdWAfWgXVgHfjrDnw8PnvgAXp2Alj0MNqMx57rv/7rvwTk%0AAY2iVIJVRZM8S6oNTJFDKp3AlJo4tZhlXtEiLFgH1oF1YB1YB9aBdWAdWAfWgXVgHfiBDnzz3/nk%0Amdf6n//5n/vb8/YXocfj02cneZ5wrWYiDzaWBMgMSCA5OeBZHj7UrlLpxCxz6JuX9opzlOx2HVgH%0A1oF1YB1YB9aBdWAdWAfWgXXgLzrw%2Bfj0PTYfnL0/fXxC4LXG8vFJdJl0DkVmNB9ngo66g4VsAa6w%0AgHKAIkUzxAkoPzKekleE7cSSN64D68A6sA6sA%2BvAOrAOrAPrwDqwDvwMB26Pz95pABevTV6eLrE0%0A33uPV%2Bfnn5zOFx0iU9ZTCSpEDsBhWSj4GOXx964dpSBgCPjqTLWwNMrL3Do9Sq55TzeuA%2BvAOrAO%0ArAPrwDqwDqwD68A6sA78QAc%2B/uazlx7Av/z0zfnf//3fgP/zf/4PLX2n8YTjvfe///f/LgJ81xHh%0AyAyw7RQw8dNrVAigNbElXxEifVlwzHSabPlKZgZZtpADFS5YB9aBdWAdWAfWgXVgHVgH1oF1YB34%0AsQ78i6dXij3zenny%2BOTvP3l8RuPBxpOPxyeLIyLbHnVKqQO2yjdenEB9D2C5L8%2BiatYSb%2B/O%2BxJz%0ACkhHTGzBBRMnh0YkyyxYB9aBdWAdWAfWgXVgHVgH1oF1YB34SQ48/5vPj//E7f/8T49PHoFO4BPu%0A/va8BfK%2B63zmyTkenyR9413jcSsfq8fj0/enR0rdX523wADOUwsFa%2BRsRMqLgEkDc2qJ%2BY3rwDqw%0ADqwD68A6sA6sA%2BvAOrAOrAM/1oHP/8EhdXv48eTjCcrjk8XffPoChONjj/fbv/71L5%2BgYBZ51hQB%0A92K0sDgBmDWZYNsRXU5FpIXtjD0%2Ba63abZTHggmtKIGtgAiRqHjJBevAOrAOrAPrwDqwDqwD68A6%0AsA6sAz/Qgc//waEeeLz3wPMvP3l/siVPY990POfI%2BPj0afd463085GAqOGf1mTczB6akwo935%2BMP%0Aj1Do2dl70tZTqmEko8GQKBCjceQ85AUdLVgH1oF1YB1YB9aBdWAdWAfWgXVgHfixDnzzN588w1y8%0A1gBEn6D3v/68/S8P2Ztn23x5Xh%2Bf0Cg/4pu5JUewtZGmLjm8En1P0tS%2BbqsV%2BPiMiQLlKkQo08uT%0ATPgQ3O06sA6sA%2BvAOrAOrAPrwDqwDqwD68BfceCb/84nQj7JiD75enwKyMPxBejzzxcg0ffefLxJ%0ANqrcoCXNXLdkPh6d9z/YsmrNq7LuDnMoO4w0/uPBPj4tb04AmkTygXQWrAPrwDqwDqwD68A6sA6s%0AA%2BvAOrAO/EAHvvmbz3RvT73Hf/GSZyePNx%2BfADg82HjX3V%2BFtzzvQKJJT4mUv4kcdSou3jt/BFsQ%0A3cPxLzNnd7APyENQJrNRzvuTU2gtTmvkEZFFEo544zqwDqwD68A6sA6sA%2BvAOrAOrAPrwI9y4JvH%0AJ08vdHuVAXz4%2BQjkhekRzzMyvgB93ZHxEThfbqmpecTrBeQ3wGzdkU/Kno6zqbMly5GzWctgLMu9%0ATiLkbSpIYcE6sA6sA%2BvAOrAOrAPrwDqwDqwD68CPcuCbxyeiPfMEvuiIPQXBt2fc/T%2Bz6mkvQPNN%0AxmmCMtvGuQKZRfsqZXlSbDml%2BzVPhjyv5fl3nmaILESoZWBriWLArnVgHVgH1oF1YB1YB9aBdWAd%0AWAfWgR/uwPn4nA168s0k2OcfT7hehr7cZowmOCJb1tP3nuJFW8gvUujTEeCQ8QXk72/M27sU7Ja3%0AKIu/DoVDuU9QMKcpA66Zebp4HVgH1oF1YB1YB9aBdWAdWAfWgXXgTzjw7vF5f7V9PMyOFxqdeKTZ%0Aj4cc4BVB2oyRKxHEAVxXnI56QDoM244gs%2BWdCfAVyrOTTCumABqgwQC71oF1YB1YB9aBdWAdWAfW%0AgXVgHVgHfqADLx%2BfPvboBHDximPra828c/hsm/F93lo0pQGsZav4EaVZFRbAtNwS3pYCTpmWI96c%0AAP/Ln999fyaubNsF68A6sA6sA%2BvAOrAOrAPrwDqwDqwDf9GB8/Hpm7AIcPGE40lGs153s3FHEopX%0AoFq1c9uTT7U4AGhu5R9VHDlVkQwPUWmA49nZ3396KavUJ9qLpKD8gnVgHVgH1oF1YB1YB9aBdWAd%0AWAfWgT/twPn4TMiXG5EXGosHG5FTXmVFgRkLe8gdNE9nTL83HsCqMq/4R%2B3TAah1ZiKEHpwCMia5%0AlLimbMWBOcbidWAdWAfWgXVgHVgH1oF1YB1YB9aBP%2BHAN49PH13zacfbjC2R/%2BQq6mCeZIAiwMWj%0A7rvtD33FTVqLFDo%2BCAG185QtRyxAq6MyiDRJs6GmuJEtCykihdKSqnzBOrAOrAPrwDqwDqwD68A6%0AsA6sA%2BvAD3Hgm8enir3iBLzQ/F%2BI5bRHGqDt/R338ZBTgVNfdEQzxgQBt0fkfcVRnC2CKdholitS%0AnEfhqtQ0KlucY6NWSSIAkhyZ2bgOrAPrwDqwDqwD68A6sA6sA%2BvAOvCnHfh8fPrKKgJ8HPLyBBDJ%0A%2BEIrAnjCkWcBGIKMS3yMBQ0po%2BJupT1KPx6uvhLToQo8y81YC2ZxytZJ2IKNAMXVPCIcMld%2BtbbY%0AuA6sA%2BvAOrAOrAPrwDqwDqwD68A68Kcd%2BHh88tDieUZs%2BTjkzcnDzJenbzZoNDOSgebLzULfeMZo%0AHIGNyhZrJ5lC1QBwUuOUFZmjMHlo9/NbqBBsR%2BMkwPEuzj%2B7JFUVmXAiC9aBdWAdWAfWgXVgHVgH%0A1oF1YB1YB/6QA59/81kZby2XT0Renj4%2Bew3C9JHWEw7gIg%2BQ0EOOrYIANYuPVrfXKXxWOm6NnLri%0AowA2CedxfvsTBTMQpFk1yVM8nOBUW7wOrAPrwDqwDqwD68A6sA6sA%2BvAOvDXHbg9Pnl08QDzhWbs%0Accizk6N//etfvuh8p9lV7FuxaHLSJPuuO8Tt4hG0BAFHOzLqEBUpWtVWIB9MC67QdTxNylrJYTgR%0AFqwD68A6sA6sA%2BvAOrAOrAPrwDqwDvwQB578x255qvH2483mk5I2PMx6Ddq1B5scYzRLij7nfPgR%0A0Tf6JvRUcgqAY9nXmJRbmAzg2E3CUV14PPcEPWpTEBBRc6RARwvWgXVgHVgH1oF1YB1YB9aBdWAd%0AWAf%2BnAOf/7FbXlw%2Bt3qz%2Bf40z5HLNmAAkceeMdDRMRA6LZ%2BdvkJJpkmtSzWxjcAJWnIU9uy0FrLt%0AuAXL96e4vimkvGAdWAfWgXVgHVgH1oF1YB1YB9aBdeBnOPAvHmC963yt8TYjQ%2BSpBugdSPuYAiJL%0AQjSTk9wbL33A0xegtU%2BlOJr3T9NG1zHI1843Z%2B9PWh/dp9rEs%2BPidWAdWAfWgXVgHVgH1oF1YB1Y%0AB9aBP%2B3A53/sVgleZTzkiDzYzPAU5D3m6642PgWJrflihEY%2BMsAXHXEuX4CTlppAnZKTOXEEgGN0%0ASjvvYvQVWnQAo4NVuGAdWAfWgXVgHVgH1oF1YB1YB9aBdeAHOvD5PziEqA8wHmNgHnK28W0G5l1n%0AptP56gt3GjkwX55hTsG2Kx5q5ZOaIPIEyqLM/C2enWBjyWOSlMmHF6wD68A6sA6sA%2BvAOrAOrAPr%0AwDqwDvwVB17%2Bdz4R9fXFiy7gI7B%2BPvbYHq%2B%2BgyZfkSLAlZo6qb0Ckx9%2BOgD6EHxkgn12CubLE%2Bwk%0AM6a8YB1YB9aBdWAdWAfWgXVgHVgH1oF14K878Pkfu%2BX9xusLRd9gU9q/8/SBN/M%2BMsu3nZyJ0ydZ%0AF5NkZvlTbHIKiiMDwvWykS/Ma%2BR0Pj4Tb6pARwvWgXVgHVgH1oF1YB1YB9aBdWAdWAf%2BqAPf/M0n%0AxTzefG71KiNpxnddDdr23rM8wiuAmoLGg/ZGtqOnJdcx6nLr9%2B0j08yreOjvdh1YB9aBdWAdWAfW%0AgXVgHVgH1oF14C868Pn4VIj3mIC/D%2BQ554uODPlwLctcQZwrsEWNroTUOBKXCRxVV1r6ABclD/gk%0A06lAfXiCjevAOrAOrAPrwDqwDqwD68A6sA6sA3/FgdvjkyeWj7frW6tMnGuz%2BSCc%2BMo0k6atD9pU%0AeIUtmaevMrWgqX2LgckJK7hxHVgH1oF1YB1YB9aBdWAdWAfWgXXghzhw/s0nor7KBD7w%2BFvQmT8a%0AXx%2BBEK7JZGf5NXktPDLHdqq96TufmtDq%2Byo/OUeL3a4D68A6sA6sA%2BvAOrAOrAPrwDqwDvxRB548%0APpXgVcYzbz7SXr364lAYZyaPmd4cwZynqs3MlKrXTL7CiQSOXjN/HL3S3Pw6sA6sA%2BvAOrAOrAPr%0AwDqwDqwD68AXHfh8fPr6IvKoOyJax9vslfoXaa/Kj3xqT9%2BZnR5Vka%2BEa4baa/KaOVrsdh1YB9aB%0AdWAdWAfWgXVgHVgH1oF14A858Pn4fFrGM6yXWOAp02QPv4PzldqjZAr%2BofL35L9y%2BnTCTa4D68A6%0AsA6sA%2BvAOrAOrAPrwDqwDnzXgSePT59nxh6TbMNvRN8/7d4Uvjr64YL/9kavBtj8OrAOrAPrwDqw%0ADqwD68A6sA6sA7%2BwA//ydff1N57MrzxEv%2B7az9D8YvevX/yLgktbB9aBdWAdWAfWgXVgHVgH1oF1%0AYB24OvClv8/kqbmPtKt3m1kH1oF1YB1YB9aBdWAdWAfWgXVgHfiiA196fH5Ra2nrwDqwDqwD68A6%0AsA6sA%2BvAOrAOrAPrwFMHbv8PPHetA%2BvAOrAOrAPrwDqwDqwD68A6sA6sAz/VgX18/lR7V3wdWAfW%0AgXVgHVgH1oF1YB1YB9aBdeDmwD4%2B93uwDqwD68A6sA6sA%2BvAOrAOrAPrwDrw0x3Yx%2BdPt3gbrAPr%0AwDqwDqwD68A6sA6sA%2BvAOvCjHLj%2Bfx65Zn5Urx%2Brs/%2BDQz/Wz1VbB9aBdWAdWAfWgXVgHVgH1oF1%0AYB144sB3/ubzn/KGfnKzTa0D68A6sA6sA%2BvAOrAOrAPrwDqwDvzHOLB/8/kf81HsIOvAOrAOrAPr%0AwDqwDqwD68A6sA78ug58528%2Bf92L783WgXVgHVgH1oF1YB1YB9aBdWAdWAf%2BPgf28fn3eb2d1oF1%0AYB1YB9aBdWAdWAfWgXVgHfhtHdjH52/70e/F14F1YB1YB9aBdWAdWAfWgXVgHfj7HNjH59/n9XZa%0AB9aBdWAdWAfWgXVgHVgH1oF14Ld14EuPz/3fvP1tvx978XVgHVgH1oF1YB1YB9aBdWAd%2BLc48Ou9%0AwvZ/7fbf8kXapuvAOrAOrAPrwDqwDqwD68A6sA78Xg586W8%2Bfy9L9rbrwDqwDqwD68A6sA6sA%2BvA%0AOrAOrAM/2oF9fP5oR1dvHVgH1oF1YB1YB9aBdWAdWAfWgXXg4sA%2BPi%2BWbGIdWAfWgXVgHVgH1oF1%0AYB1YB9aBdeBHO7CPzx/t6OqtA%2BvAOrAOrAPrwDqwDqwD68A6sA5cHNjH58WSTawD68A6sA6sA%2BvA%0AOrAOrAPrwDqwDvxoB/bx%2BaMdXb11YB1YB9aBdWAdWAfWgXVgHVgH/rID%2B/9q5S9buALrwDqwDqwD%0A68A6sA6sA%2BvAOrAOrAO/nwP7N5%2B/32e%2BN14H1oF1YB1YB9aBdWAdWAfWgXXgb3dgH59/u%2BXbcB1Y%0AB9aBdWAdWAfWgXVgHVgH1oHfz4F9fP5%2Bn/neeB1YB9aBdWAdWAfWgXVgHVgH1oG/3YF9fP7tlm/D%0AdWAdWAfWgXVgHVgH1oF1YB1YB34/B/bx%2Bft95nvjdWAdWAfWgXVgHVgH1oF1YB1YB/52B/bx%2Bbdb%0Avg3XgXVgHVgH1oF1YB1YB9aBdWAd%2BP0c2Mfn7/eZ743XgXVgHVgH1oF1YB1YB9aBdeCf78A/7v8R%0A6P/6x038z/%2BS/L/27B1XQiAGoqhGYgPsf5EsgUlLBESUE5/M7yO3%2BnR0hRsQIECAAAECBAgQIEBg%0AnYAvn%2Bue3IUJECBAgAABAgQIECAwLyA%2B582dSIAAAQIECBAgQIAAgXUC4nPdk7swAQIECBAgQIAA%0AAQIE5gXE57y5EwkQIECAAAECBAgQILBOQHyue3IXJkCAAAECBAgQIECAwLyA%2BJw3dyIBAgQIECBA%0AgAABAgTWCYjPATiAYgAAA/xJREFUdU/uwgQIECBAgAABAgQIEJgXEJ/z5k4kQIAAAQIECBAgQIDA%0AOgHxue7JXZgAAQIECBAgQIAAAQLzAuJz3tyJBAgQIECAAAECBAgQWCcgPtc9uQsTIECAAAECBAgQ%0AIEBgXkB8zps7kQABAgQIECBAgAABAusExOe6J3dhAgQIECBAgAABAgQIzAuIz3lzJxIgQIAAAQIE%0ACBAgQGCdgPhc9%2BQuTIAAAQIECBAgQIAAgXmB4/3I67re/8FfCRAgQIAAAQIECBAgQIDAQ%2BA8z8dv%0AfPl8gPiRAAECBAgQIECAAAECBL4X%2BN33/f1WGwkQIECAAAECBAgQIECAQAj48hkYRgIECBAgQIAA%0AAQIECBDoCIjPjqutBAgQIECAAAECBAgQIBAC4jMwjAQIECBAgAABAgQIECDQERCfHVdbCRAgQIAA%0AAQIECBAgQCAExGdgGAkQIECAAAECBAgQIECgIyA%2BO662EiBAgAABAgQIECBAgEAIiM/AMBIgQIAA%0AAQIECBAgQIBAR0B8dlxtJUCAAAECBAgQIECAAIEQEJ%2BBYSRAgAABAgQIECBAgACBjoD47LjaSoAA%0AAQIECBAgQIAAAQIhID4Dw0iAAAECBAgQIECAAAECHQHx2XG1lQABAgQIECBAgAABAgRCQHwGhpEA%0AAQIECBAgQIAAAQIEOgLis%2BNqKwECBAgQIECAAAECBAiEgPgMDCMBAgQIECBAgAABAgQIdATEZ8fV%0AVgIECBAgQIAAAQIECBAIAfEZGEYCBAgQIECAAAECBAgQ6AiIz46rrQQIECBAgAABAgQIECAQAuIz%0AMIwECBAgQIAAAQIECBAg0BEQnx1XWwkQIECAAAECBAgQIEAgBMRnYBgJECBAgAABAgQIECBAoCMg%0APjuuthIgQIAAAQIECBAgQIBACIjPwDASIECAAAECBAgQIECAQEdAfHZcbSVAgAABAgQIECBAgACB%0AEBCfgWEkQIAAAQIECBAgQIAAgY6A%2BOy42kqAAAECBAgQIECAAAECISA%2BA8NIgAABAgQIECBAgAAB%0AAh0B8dlxtZUAAQIECBAgQIAAAQIEQkB8BoaRAAECBAgQIECAAAECBDoC4rPjaisBAgQIECBAgAAB%0AAgQIhID4DAwjAQIECBAgQIAAAQIECHQExGfH1VYCBAgQIECAAAECBAgQCAHxGRhGAgQIECBAgAAB%0AAgQIEOgIiM%2BOq60ECBAgQIAAAQIECBAgEALiMzCMBAgQIECAAAECBAgQINAREJ8dV1sJECBAgAAB%0AAgQIECBAIATEZ2AYCRAgQIAAAQIECBAgQKAjID47rrYSIECAAAECBAgQIECAQAiIz8AwEiBAgAAB%0AAgQIECBAgEBH4A9xf67VNlopBgAAAABJRU5ErkJggg%3D%3D%0A\", \"frontend_name\": \"tabs\", \"icon_data_url\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1%2BjfqAAAACXBIWXMAAAsTAAALEwEAmpwYAAAD%0AGGlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjaY2BgnuDo4uTKJMDAUFBUUuQe5BgZERmlwH6e%0AgY2BmYGBgYGBITG5uMAxIMCHgYGBIS8/L5UBFTAyMHy7xsDIwMDAcFnX0cXJlYE0wJpcUFTCwMBw%0AgIGBwSgltTiZgYHhCwMDQ3p5SUEJAwNjDAMDg0hSdkEJAwNjAQMDg0h2SJAzAwNjCwMDE09JakUJ%0AAwMDg3N%2BQWVRZnpGiYKhpaWlgmNKflKqQnBlcUlqbrGCZ15yflFBflFiSWoKAwMD1A4GBgYGXpf8%0AEgX3xMw8BSMDVQYqg4jIKAUICxE%2BCDEESC4tKoMHJQODAIMCgwGDA0MAQyJDPcMChqMMbxjFGV0Y%0ASxlXMN5jEmMKYprAdIFZmDmSeSHzGxZLlg6WW6x6rK2s99gs2aaxfWMPZ9/NocTRxfGFM5HzApcj%0A1xZuTe4FPFI8U3mFeCfxCfNN45fhXyygI7BD0FXwilCq0A/hXhEVkb2i4aJfxCaJG4lfkaiQlJM8%0AJpUvLS19QqZMVl32llyfvIv8H4WtioVKekpvldeqFKiaqP5UO6jepRGqqaT5QeuA9iSdVF0rPUG9%0AV/pHDBYY1hrFGNuayJsym740u2C%2B02KJ5QSrOutcmzjbQDtXe2sHY0cdJzVnJRcFV3k3BXdlD3VP%0AXS8Tbxsfd99gvwT//ID6wIlBS4N3hVwMfRnOFCEXaRUVEV0RMzN2T9yDBLZE3aSw5IaUNak30zky%0ALDIzs%2BZmX8xlz7PPryjYVPiuWLskq3RV2ZsK/cqSql01jLVedVPrHzbqNdU0n22VaytsP9op3VXU%0AfbpXta%2Bx/%2B5Em0mzJ/%2BdGj/t8AyNmf2zvs9JmHt6vvmCpYtEFrcu%2BbYsc/m9lSGrTq9xWbtvveWG%0AbZtMNm/ZarJt%2Bw6rnft3u%2B45uy9s/4ODOYd%2BHmk/Jn58xUnrU%2BfOJJ/9dX7SRe1LR68kXv13fc5N%0Am1t379TfU75/4mHeY7En%2B59lvhB5efB1/lv5dxc%2BNH0y/fzq64Lv4T8Ffp360/rP8f9/AA0ADzT6%0AlvFdAAAAIGNIUk0AAHolAACAgwAA%2Bf8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAD8SURBVHja%0ApNHNKsRhFMfxz/OfZ4QG5X1hRUKRl4S9O2AnJTfhDmzYKJcg2chGyg1QsmUzgxIbGRYshshjM14W%0AYuEsz%2B%2B8/M73hOT3yP7QxZ/TW7OV7YJbzwvhpxU7c3WbHXoV7d9EVqctm0wCSOpNaVGS06ylKZLW%0AJwa6Pu08eNXnSp1jlben4YjWdmdeJDkvuvS7lFdA5XWpmBEEUSavrLkqPzowzlt1bibKKysYda3G%0Ag0OD2r44ZKIztZJjyZ0jQxplAuJK6lXQYM%2B8DUc6PZupdvfVrqYYlJQE506MKTvVYxcfZ3%2BCGql0%0AxyG5w/vFtYvv0MK/n/VnwfsAqHVGROrL2mcAAAAASUVORK5CYII%3D%0A\", \"is_complex\": true, \"is_block_element\": true, \"tooltip\": \"Insert tabs (e.g. for hints)\", \"customization_arg_specs\": [{\"default_value\": [{\"content\": \"This set of tabs shows some hints. Click on the other tabs to display the relevant hints.\", \"title\": \"Hint introduction\"}, {\"content\": \"This is a first hint.\", \"title\": \"Hint 1\"}], \"schema\": {\"items\": {\"type\": \"dict\", \"properties\": [{\"schema\": {\"type\": \"unicode\", \"validators\": [{\"id\": \"is_nonempty\"}]}, \"name\": \"title\", \"description\": \"Tab title\"}, {\"schema\": {\"type\": \"html\", \"ui_config\": {\"hide_complex_extensions\": true}}, \"name\": \"content\", \"description\": \"Tab content\"}]}, \"type\": \"list\", \"ui_config\": {\"add_element_text\": \"Add new tab\"}}, \"name\": \"tab_contents\", \"description\": \"The tab titles and contents.\"}], \"backend_name\": \"Tabs\", \"requires_fs\": false}, \"Image\": {\"preview_url_template\": \"/imagehandler/\u003c[explorationId]\u003e/\u003c[filepath]\u003e\", \"frontend_name\": \"image\", \"icon_data_url\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAK%0AT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AU%0AkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN/rXX%0APues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh%2BPDwrIsAHvgAB%0AeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAt%0AAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3%0AAMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dX%0ALh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP%2B%0A5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw%2BH48PEWhkLnZ2eXk%0A5NhKxEJbYcpXff5nwl/AV/1s%2BX48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd%0A0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA%0A4vcAAPK7b8HUKAgDgGiD4c93/%2B8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzA%0ABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/ph%0ACJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5%0Ah1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2B%0AQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhM%0AWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQ%0AAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIo%0AUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdp%0Ar%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZ%0AD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61Mb%0AU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%0A/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllir%0ASKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79u%0Ap%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6Vh%0AlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1%0Amz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lO%0Ak06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N/T0HDYfZDqsdWh1%2Bc7Ry%0AFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3I%0AveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE/C5%2BVMGvfrH5PQ0%2BB%0AZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV/MN8C3yLfLT8Nvnl%2BF30N/I/9k/3r/%0A0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p%0ADoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5q%0APNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIs%0AOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5%0AhCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQ%0ArAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9%0ArGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1d%0AT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaX%0ADm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7%0AvPY07NXbW7z3/T7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3S%0APVRSj9Yr60cOxx%2B%2B/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKa%0ARptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO%0A32oPb%2B%2B6EHTh0kX/i%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21%0Ae2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfV%0AP1v%2B3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF/6i%0A/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8%0AIH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq%0AYAAAOpgAABdvkl/FRgAAANNJREFUeNqk07FKA0EUBdCzScQEU9hMYy/4GWls9AfMD4QUYiFCChuL%0AiI1YLLidln6B4BcFkS2DYLc2E1gnUeLuheExb95c7rszL6uqShv0iqJoxdCLMWt4v%2BokiVssY9wK%0AKcEVhrhoSnCPT%2BT/9WCF67hAWZb1sxzvuIMQwk%2BCpDjFMc7xhWd8/NZCFy9YYBRzu3iMLzXA5V8e%0AzDDGAd5wijkOazUT7G3y4Ag3tX0frxva2ccZnlIFD9jZ0vzpmoIQwkmTr9jREisFjQcqazvO3wMA%0A9cMlpZdjmFYAAAAASUVORK5CYII%3D%0A\", \"is_complex\": false, \"is_block_element\": true, \"tooltip\": \"Insert image\", \"customization_arg_specs\": [{\"default_value\": \"\", \"schema\": {\"obj_type\": \"Filepath\", \"type\": \"custom\"}, \"name\": \"filepath\", \"description\": \"The name of the image file. (Allowed extensions: gif, jpeg, jpg, png.)\"}, {\"default_value\": \"\", \"schema\": {\"type\": \"unicode\"}, \"name\": \"caption\", \"description\": \"Caption for image (optional)\"}, {\"default_value\": \"\", \"schema\": {\"type\": \"unicode\"}, \"name\": \"alt\", \"description\": \"Alternative text (for screen readers)\"}], \"backend_name\": \"Image\", \"requires_fs\": true}, \"Video\": {\"preview_url_template\": \"https://img.youtube.com/vi/\u003c[video_id]\u003e/hqdefault.jpg\", \"frontend_name\": \"video\", \"icon_data_url\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAK%0AT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AU%0AkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN/rXX%0APues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh%2BPDwrIsAHvgAB%0AeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAt%0AAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3%0AAMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dX%0ALh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP%2B%0A5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw%2BH48PEWhkLnZ2eXk%0A5NhKxEJbYcpXff5nwl/AV/1s%2BX48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd%0A0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA%0A4vcAAPK7b8HUKAgDgGiD4c93/%2B8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzA%0ABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/ph%0ACJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5%0Ah1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2B%0AQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhM%0AWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQ%0AAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIo%0AUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdp%0Ar%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZ%0AD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61Mb%0AU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%0A/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllir%0ASKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79u%0Ap%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6Vh%0AlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1%0Amz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lO%0Ak06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N/T0HDYfZDqsdWh1%2Bc7Ry%0AFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3I%0AveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE/C5%2BVMGvfrH5PQ0%2BB%0AZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV/MN8C3yLfLT8Nvnl%2BF30N/I/9k/3r/%0A0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p%0ADoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5q%0APNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIs%0AOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5%0AhCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQ%0ArAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9%0ArGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1d%0AT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaX%0ADm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7%0AvPY07NXbW7z3/T7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3S%0APVRSj9Yr60cOxx%2B%2B/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKa%0ARptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO%0A32oPb%2B%2B6EHTh0kX/i%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21%0Ae2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfV%0AP1v%2B3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF/6i%0A/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8%0AIH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq%0AYAAAOpgAABdvkl/FRgAAAFxJREFUeNrskVEKwDAIQ%2BPYaXOgXNf9zGKZ3YT9Nj%2BWGsLDmLvjj854%0ASHIABiBmpeEhaVNAMuS5CnkS3GoTrALGguS0kFQSHAXBl%2BwtoFNJ6wYZGSvPbmG3EB/XAJZSMar4%0AdzYxAAAAAElFTkSuQmCC%0A\", \"is_complex\": false, \"is_block_element\": true, \"tooltip\": \"Insert video\", \"customization_arg_specs\": [{\"default_value\": \"\", \"schema\": {\"type\": \"unicode\"}, \"name\": \"video_id\", \"description\": \"The YouTube id for this video. This is the 11-character string after \'v=\' in the video URL.\"}, {\"default_value\": 0, \"schema\": {\"type\": \"int\", \"validators\": [{\"min_value\": 0, \"id\": \"is_at_least\"}]}, \"name\": \"start\", \"description\": \"Video start time in seconds: (leave at 0 to start at the beginning.)\"}, {\"default_value\": 0, \"schema\": {\"type\": \"int\", \"validators\": [{\"min_value\": 0, \"id\": \"is_at_least\"}]}, \"name\": \"end\", \"description\": \"Video end time in seconds: (leave at 0 to play until the end.)\"}, {\"default_value\": false, \"schema\": {\"type\": \"bool\"}, \"name\": \"autoplay\", \"description\": \"Autoplay this video once the question has loaded?\"}], \"backend_name\": \"Video\", \"requires_fs\": false}, \"Link\": {\"preview_url_template\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAK%0AT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AU%0AkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN/rXX%0APues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh%2BPDwrIsAHvgAB%0AeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAt%0AAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3%0AAMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dX%0ALh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP%2B%0A5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw%2BH48PEWhkLnZ2eXk%0A5NhKxEJbYcpXff5nwl/AV/1s%2BX48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd%0A0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA%0A4vcAAPK7b8HUKAgDgGiD4c93/%2B8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzA%0ABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/ph%0ACJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5%0Ah1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2B%0AQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhM%0AWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQ%0AAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIo%0AUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdp%0Ar%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZ%0AD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61Mb%0AU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%0A/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllir%0ASKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79u%0Ap%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6Vh%0AlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1%0Amz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lO%0Ak06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N/T0HDYfZDqsdWh1%2Bc7Ry%0AFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3I%0AveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE/C5%2BVMGvfrH5PQ0%2BB%0AZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV/MN8C3yLfLT8Nvnl%2BF30N/I/9k/3r/%0A0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p%0ADoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5q%0APNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIs%0AOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5%0AhCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQ%0ArAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9%0ArGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1d%0AT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaX%0ADm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7%0AvPY07NXbW7z3/T7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3S%0APVRSj9Yr60cOxx%2B%2B/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKa%0ARptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO%0A32oPb%2B%2B6EHTh0kX/i%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21%0Ae2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfV%0AP1v%2B3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF/6i%0A/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8%0AIH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq%0AYAAAOpgAABdvkl/FRgAAAPRJREFUeNrs0iFLQ2EUxvHfe%2B%2B1C/oVbtBkEwVBMMhmWln1U5gM2tdX%0AbMYV2waiQQTRJgxmWPEDKKy7u9dygmUYFiweOJxznufPE17elHO2ShVWrL8PqPr9PuzhEvuhP%2BEC%0Az3Ev9SscYYhPXAfQwQPacS/1K/Twjt3pdDrDTkppsyzLTtM0t1CWZdM0zWPO%2BQqvdV2f4wW9AlsY%0AYRbpo5xzdz6fr%2BWci5xzEXs3OMEOsV3gDS2sh9lKKQ2qqvpKKS1SSovYB8EJto1JhbNIm9R1fRPA%0AATKOYw5D%2B/jxBhs4KXCPQ4xxGj0O7e43P/1/5dUDvgcAxfNbLF3L5REAAAAASUVORK5CYII%3D%0A\", \"frontend_name\": \"link\", \"icon_data_url\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAK%0AT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AU%0AkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN/rXX%0APues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh%2BPDwrIsAHvgAB%0AeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAt%0AAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3%0AAMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dX%0ALh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP%2B%0A5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw%2BH48PEWhkLnZ2eXk%0A5NhKxEJbYcpXff5nwl/AV/1s%2BX48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd%0A0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA%0A4vcAAPK7b8HUKAgDgGiD4c93/%2B8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzA%0ABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/ph%0ACJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5%0Ah1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2B%0AQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhM%0AWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQ%0AAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIo%0AUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdp%0Ar%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZ%0AD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61Mb%0AU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%0A/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllir%0ASKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79u%0Ap%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6Vh%0AlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1%0Amz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lO%0Ak06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N/T0HDYfZDqsdWh1%2Bc7Ry%0AFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3I%0AveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE/C5%2BVMGvfrH5PQ0%2BB%0AZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV/MN8C3yLfLT8Nvnl%2BF30N/I/9k/3r/%0A0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p%0ADoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5q%0APNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIs%0AOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5%0AhCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQ%0ArAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9%0ArGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1d%0AT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaX%0ADm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7%0AvPY07NXbW7z3/T7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3S%0APVRSj9Yr60cOxx%2B%2B/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKa%0ARptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO%0A32oPb%2B%2B6EHTh0kX/i%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21%0Ae2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfV%0AP1v%2B3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF/6i%0A/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8%0AIH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq%0AYAAAOpgAABdvkl/FRgAAAPRJREFUeNrs0iFLQ2EUxvHfe%2B%2B1C/oVbtBkEwVBMMhmWln1U5gM2tdX%0AbMYV2waiQQTRJgxmWPEDKKy7u9dygmUYFiweOJxznufPE17elHO2ShVWrL8PqPr9PuzhEvuhP%2BEC%0Az3Ev9SscYYhPXAfQwQPacS/1K/Twjt3pdDrDTkppsyzLTtM0t1CWZdM0zWPO%2BQqvdV2f4wW9AlsY%0AYRbpo5xzdz6fr%2BWci5xzEXs3OMEOsV3gDS2sh9lKKQ2qqvpKKS1SSovYB8EJto1JhbNIm9R1fRPA%0AATKOYw5D%2B/jxBhs4KXCPQ4xxGj0O7e43P/1/5dUDvgcAxfNbLF3L5REAAAAASUVORK5CYII%3D%0A\", \"is_complex\": false, \"is_block_element\": false, \"tooltip\": \"Insert link\", \"customization_arg_specs\": [{\"default_value\": \"https://www.example.com\", \"schema\": {\"obj_type\": \"SanitizedUrl\", \"type\": \"custom\"}, \"name\": \"url\", \"description\": \"The link URL. If no protocol is specified, HTTPS will be used.\"}, {\"default_value\": \"\", \"schema\": {\"type\": \"unicode\"}, \"name\": \"text\", \"description\": \"The link text. If left blank, the link URL will be used.\"}], \"backend_name\": \"Link\", \"requires_fs\": false}, \"Math\": {\"preview_url_template\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAdhAAAHYQGVw7i2AAAK%0AT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AU%0AkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN/rXX%0APues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh%2BPDwrIsAHvgAB%0AeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAt%0AAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3%0AAMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dX%0ALh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP%2B%0A5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw%2BH48PEWhkLnZ2eXk%0A5NhKxEJbYcpXff5nwl/AV/1s%2BX48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd%0A0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA%0A4vcAAPK7b8HUKAgDgGiD4c93/%2B8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzA%0ABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/ph%0ACJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5%0Ah1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2B%0AQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhM%0AWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQ%0AAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIo%0AUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdp%0Ar%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZ%0AD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61Mb%0AU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%0A/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllir%0ASKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79u%0Ap%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6Vh%0AlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1%0Amz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lO%0Ak06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N/T0HDYfZDqsdWh1%2Bc7Ry%0AFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3I%0AveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE/C5%2BVMGvfrH5PQ0%2BB%0AZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV/MN8C3yLfLT8Nvnl%2BF30N/I/9k/3r/%0A0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p%0ADoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5q%0APNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIs%0AOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5%0AhCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQ%0ArAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9%0ArGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1d%0AT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaX%0ADm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7%0AvPY07NXbW7z3/T7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3S%0APVRSj9Yr60cOxx%2B%2B/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKa%0ARptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO%0A32oPb%2B%2B6EHTh0kX/i%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21%0Ae2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfV%0AP1v%2B3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF/6i%0A/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8%0AIH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq%0AYAAAOpgAABdvkl/FRgAAAG5JREFUeNqkU8ENACEIE%2BK0HYh1uZeGeBhA%2BhNpbSGSqo4OZpUgIvtF%0AAMQvZAC0ziUHi2jBL7mtk3nLdqufMchuIWq29%2BEWvOZwBl6DV0sPMSL/BDzbaQGPnBFkz3bG%2BhYQ%0AET3XVXFB3d/Io4lvALiqS97J4oUVAAAAAElFTkSuQmCC%0A\", \"frontend_name\": \"math\", \"icon_data_url\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAdhAAAHYQGVw7i2AAAK%0AT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AU%0AkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN/rXX%0APues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh%2BPDwrIsAHvgAB%0AeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAt%0AAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3%0AAMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dX%0ALh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP%2B%0A5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw%2BH48PEWhkLnZ2eXk%0A5NhKxEJbYcpXff5nwl/AV/1s%2BX48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd%0A0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA%0A4vcAAPK7b8HUKAgDgGiD4c93/%2B8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzA%0ABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/ph%0ACJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5%0Ah1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2B%0AQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhM%0AWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQ%0AAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIo%0AUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdp%0Ar%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZ%0AD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61Mb%0AU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%0A/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllir%0ASKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79u%0Ap%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6Vh%0AlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1%0Amz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lO%0Ak06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N/T0HDYfZDqsdWh1%2Bc7Ry%0AFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3I%0AveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE/C5%2BVMGvfrH5PQ0%2BB%0AZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV/MN8C3yLfLT8Nvnl%2BF30N/I/9k/3r/%0A0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p%0ADoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5q%0APNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIs%0AOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5%0AhCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQ%0ArAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9%0ArGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1d%0AT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaX%0ADm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7%0AvPY07NXbW7z3/T7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3S%0APVRSj9Yr60cOxx%2B%2B/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKa%0ARptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO%0A32oPb%2B%2B6EHTh0kX/i%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21%0Ae2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfV%0AP1v%2B3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF/6i%0A/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8%0AIH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq%0AYAAAOpgAABdvkl/FRgAAAG5JREFUeNqkU8ENACEIE%2BK0HYh1uZeGeBhA%2BhNpbSGSqo4OZpUgIvtF%0AAMQvZAC0ziUHi2jBL7mtk3nLdqufMchuIWq29%2BEWvOZwBl6DV0sPMSL/BDzbaQGPnBFkz3bG%2BhYQ%0AET3XVXFB3d/Io4lvALiqS97J4oUVAAAAAElFTkSuQmCC%0A\", \"is_complex\": false, \"is_block_element\": false, \"tooltip\": \"Insert mathematical formula\", \"customization_arg_specs\": [{\"default_value\": \"\\\\frac{x}{y}\", \"schema\": {\"obj_type\": \"MathLatexString\", \"type\": \"custom\"}, \"name\": \"raw_latex\", \"description\": \"The raw string to be displayed as LaTeX.\"}], \"backend_name\": \"Math\", \"requires_fs\": false}}'), | |
| SYSTEM_USERNAMES: JSON.parse('[\"admin\", \"OppiaMigrationBot\"]'), | |
| SUPPORTED_SITE_LANGUAGES: JSON.parse( | |
| '{\"en\": \"English\", \"pt\": \"Portugu\\u00eas\", \"vi\": \"Ti\\u1ebfng Vi\\u1ec7t\", \"hi\": \"\\u0939\\u093f\\u0928\\u094d\\u0926\\u0940\", \"id\": \"Bahasa Indonesia\", \"es\": \"Espa\\u00f1ol\"}'), | |
| userIsLoggedIn: JSON.parse('true') | |
| }; | |
| </script> | |
| <!--[if lt IE 9]> | |
| <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> | |
| <![endif]--> | |
| <!--[if gte IE 9]><!--> | |
| <!-- jquery.js, angular.js and jquery-ui.js are removed from bundled js because they need to be at the header. Including | |
| bundled js at the header will block rendering.--> | |
| <script src="/third_party/static/jquery-2.1.1/jquery.min.js"> | |
| </script> | |
| <!--<![endif]--> | |
| <script src="/third_party/static/jqueryui-1.10.3/jquery-ui.min.js"> | |
| </script> | |
| <script src="/third_party/static/angularjs-1.4.7/angular.min.js"></script> | |
| <script src="/third_party/static/jquery-ui-touch-punch-0.3.1/jquery.ui.touch-punch-improved.js"></script> | |
| <!-- See http://docs.mathjax.org/en/latest/start.html#mathjax-cdn --> | |
| <script type="text/x-mathjax-config"> | |
| MathJax.Hub.Config({ | |
| skipStartupTypeset: true, | |
| messageStyle: 'none', | |
| 'HTML-CSS': { | |
| showMathMenu: false | |
| } | |
| }); | |
| MathJax.Hub.Configured(); | |
| </script> | |
| <script src="/third_party/static/MathJax-2.6.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> | |
| </head> | |
| <body> | |
| <div class="oppia-base-container" ng-class="{'oppia-sidebar-menu-open': sidebarIsShown, 'oppia-sidebar-menu-closed': !sidebarIsShown}" ng-swipe-left="closeSidebarOnSwipe()" ng-swipe-right="openSidebarOnSwipe()"> | |
| <div class="oppia-content-container"> | |
| <div id="wrapper"> | |
| <div class="oppia-main-body"> | |
| <!-- Top navigation. --> | |
| <nav class="navbar navbar-default oppia-navbar oppia-prevent-selection" role="navigation"> | |
| <div class="navbar-container"> | |
| <div class="navbar-header protractor-test-navbar-header pull-left"> | |
| <a ng-if="windowIsNarrow" ng-click="openSidebar()" class="navbar-brand oppia-navbar-menu oppia-transition-200"> | |
| <i class="material-icons oppia-navbar-menu-icon"></i> | |
| </a> | |
| <a class="oppia-navbar-brand-name oppia-transition-200" href="/" focus-on="<[LABEL_FOR_CLEARING_FOCUS]>"> | |
| <img ng-src="<[getStaticImageUrl('/logo/288x128_logo_white.png')]>" class="oppia-logo" ng-class="windowIsNarrow ? 'oppia-logo-small' : 'oppia-logo-wide'"> | |
| </a> | |
| <!-- This is needed for the correct image to appear when an exploration is shared using G+. --> | |
| <a style="display: none;"> | |
| <img ng-src="<[getStaticImageUrl('/logo/288x128_logo_mint.png')]>" itemprop="image"> | |
| </a> | |
| </div> | |
| <div ng-cloak class="navbar-header pull-right"> | |
| <ul class="nav oppia-navbar-nav oppia-navbar-profile"> | |
| <li class="dropdown pull-right"> | |
| <a class="dropdown-toggle oppia-navbar-dropdown-toggle" data-toggle="dropdown" ng-mouseover="onMouseoverProfilePictureOrDropdown($event)" ng-mouseleave="onMouseoutProfilePictureOrDropdown($event)"> | |
| <div class="oppia-navbar-profile-picture-container" ng-cloak> | |
| <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEwAAABMCAYAAADHl1ErAAAAAXNSR0IArs4c6QAADhtJREFUeAHt%0AXHlwVdUZ/859jyxmIQESyCaglC0iAgkJIntrIpvKphSwY2ttxbFOp9R/cGGqdhykLaMVO2OtoyRS%0ACEKNEpYKyBIVQ1iNkBhNMCtb8shiQpJ3b7/fTW7m5uUlecu9L4nTM5Pce8895zvf93vnnPud833f%0AEdQLKXb5jsC6%2BuZERZbHKaSMYRbGKERxgpQQUkSIIigEbAmFavlfrUKiVhCVcFa%2BIJEvJOlCcNCA%0AnNKMFQ0o58vEfPgmhS5Mn0ot8n2KIs8lIZJJUfy8almIJqbxhRDSIbJKe2s%2BXvWlV/RcrGwqYGGp%0A20bI1LyaeVmjKMrodp4EycGBAy6MjgsrSxozqG7O5GgxcVREeEigNDAwwBpmsUiRKGu3y1caGlts%0AtQ3yjbOFV6sPnypXTuRXBReU2GLqGprHkUKSRlMIUcD3WyUakGbbt7JYyzf6agpgYfe9O8kui/U8%0AnB7UhJIkUTljwrBTTz449mZKUlyCEBTnjTCKQiX7T5ScfGP3Rf9j5ysny7IyTKXHPwYP690WSXnZ%0AtvcXp71pw1ldQwELm59%2BlyzbX%2BbeNL%2Btscb4EYOyNz2ZWD99wtAFnGdxxoQBefbs85f3rHsjJyiv%0AuGo60wsATe51WZJkWW/LWnXGgDZUEoYAFr58x0B7beOLPHGv5XnFIpGoS0mKOfze%2Bpmj/f2smNR9%0Alm42teQ/8vLRgv0nyuZwVwtm1Ows5BZLSMBz1RkrbnjLiNeAhaWmPWgn%2BxYeejwkRMu9idH7tm%2BY%0AE8/z0EhvmfOmPs9/RQ9tOJx3IKc8lUixkqBKC1nW2vat3u0NXY8Bi1%2B%2Bw6%2BktnETD7%2BnwEB4iP/p%0AL/5xf03U4IBZ3jBkdN2K641Hkn/7YWh17c1JoM3D9PW4kIB1eRkrmjxpyyPAeK4aLttbPuAhOIU5%0AaHpm1cTMZ1ffuRT8eMKED%2BooL6Wd%2B2Bj%2BtnFUGeYyVzJYl3Kc9sld9t2W8Dw%2BWkTWuz2fdxQ9ACr%0A9P3Jfy7%2BZuSw0HnuNtwb5Ysqaw4mPJb5k%2BYW%2BVZuv9xqsaRWZ60%2B7w4vbgEWnrJ1hp3kTO5ZYUPC%0AAnK%2B3bYiitWDWHca7O2yrI6U3r5yR8U1W2MiC2%2BzkLS4ev%2BaY67y1a749VQBYLUIZT/AGhUTduS7%0Af68Y39/AgozgGbxDBsgCmSBbT/Jr710CDMMQPYvHf2DC2Mj9p95efA8TCNKI9MNrEGSALJAJskFG%0AV%2BTocUhigrfbWz5jYtH4VdrAMksBdYVnI8vYJ/8q83hhmW0WEy23WKx39/Qh6LaHQXXA1xBgYc5i%0AsBL4/scCFoC3QCbIBhkhK2TGi65St4CpeharDvgaYoJnIv15GHaFQRBkg4w8p02BzF0VRH6XgEGD%0AV5VS1rOgOvTHCb47wfXvIBtkhE4JmSG7/r3%2B3ilg6toQyx1OUEr7i56lF8zde8gIWVEPSz1g4IyG%0AU8CwkMbaEMudNg3eWd0fXR5khcyQXcXAiYSdAMMWDY/ltVhIY23IdXr8kjqh21%2BzRKvMogUYAAtH%0AQToBhv0sbNFg16GvLaQdmTfjGTJDdmCgYuHQSIfe07pTSqewn3V9z6qrvb1F48Crzx6xNTR4QXoE%0A9tN4c2%2ByfufWqudC3VbmAYzNPwZrkf6dL%2B4LSm5Q9vkrVH79B6qs%2BoH8B1goatAtNCIqmOZOiabw%0A4G5VJMNYREdhDD7ae6J0USsmtEwj3t7DYLCwK83f8WbbzauZP7/kq53SxiY7vfmfC5R24Fv6prTr%0ADVEWgqbfEUlPLY2nlKkxGv%2BmXbFzG7H4/eE8g/tZyO92zbDSPoe1WncUgT14X4G189Nimvjobnrh%0AX6e6BQuo8DCho2crafnzB2n%2BMwe4PL5H5iVgACx4wEltli%2B1sXbA%2BGkNcmCwUN%2BY%2BI%2B3WOjZt3Lp%0Al68cpQoefu6m4%2Bcqae7TWfTfk%2BXuVnWrvA4LFRtUVockjKxKc8sJmMJsWWsiON/U9eJvNmXTtk%2B%2B%0AdYt5Z4WZX0p/bjYtmBbn7LURefaw%2BVuvwoQnBliTYCxu7WFskQb1WROjcvliKlibM/IMAQv8siD0%0A643H6etiGx7NSBbYUlXCbRipgKnme859Ysl4jwwDrnKaV2SjDe%2B0tu9qnZ7KsQWch/YxVpt6KunZ%0AexieUVPDSIJjCC86k3lwyikJ0di%2BMS09/3au2iuMbuDr4mpKN2CIO%2BMLVnpgA4yAlVRX1ziV4fOD%0ArwOv2k2bDM4UVvEkXeaMJ0PyXn3/nCF0HIkAE2ADjICVpChiLArBMcSxsJHPmdmXjCTXiVZRRS19%0AVVTdKd%2BIDA0bYCW1%2BWcRvGiMIN4Vjb1flHb1yrD8rM9LDKOlJ6RhA6ww6au%2BD3A50hcy%2Bt5sRRP8%0AFpSYo8zqsBnDPax13oJ/ltEgafSqam5SU7NdezTtWsHrTzOShg2wYtWP3SQ5wZnNjMZA80Z9s1mk%0AO9CtMakdDRtgJcGnFK3C869D6wY%2BRISp7loGUnROKtKkdtqxYawkzQGXdwNUN0nnrHiXGxxoJf40%0Ae0fEhdpRg29xoZT7RTRsgJV%2B8e0%2BJTdqJIwd4kZpz4pOGWN%2BG5Lq2s38wQHXMzZdq2XiAlllgP2%2B%0AaH6yOX4xGjbAinejlVq0CG9l10T3rNT99wwnf96KMyvNuHMoDR0UaAr5dmwYK1YrhAoYXLtNaa2N%0A6DAW5vFF6qLClGZeeHSyKXRBVMMGWLFaoUZYEPzgTWuxjfC6lROI/RgMb2bZ7JGUaOIcqWEDrDDp%0A50MCBA0YLokDQRgx0p%2BdTezH4PDG88dxI8LotaeneU7AhZo6bPK5hwkVMERYuFDX6yLT2JDx99/f%0ATVY2anibYiOCaPuGuayydDB%2BeUu2U30NG2AlCaFcRAmEo3QqaVLGynm30a6X5sHz2uMWksZH0pHX%0AF9CIYeb/zho2CAqTgoMDvoTXCmJ3EI7isQRuVpw9KYqytyykhxk8qASuJoD84mNTKGvjveSLFQQw%0AUeOaGCNE0Flqvs5o8b/9gZ8xwyMmj404NComZJyrzHtbLjTIjxZNv1X9C/S30pXqRrLVdd4lh7Ej%0AOX4oPfHAOHrzD9Np9l1RZMHnygeJ45kOZXxaPJ6byr6WueotdfAjhI73rGdu2ZXnn5oY7QM2OjZx%0Ax8hw%2BvPjCepf2bUfqJz/Llc1qHpb1OBAiosMpoFB5i%2BtOnLV%2BoTgL9ypYYZ8bZ0tOd6QmuUNbCiF%0AMoN9GPM0TCbeXYoZcgvhr48kOyLlVF6AESf1UwV7G88jBbC/ISqsjzDb62wAC9UmydhoAaz6b/tW%0AcIgQul7ntI8woMNCxQZstQOGSFYeqQriDeGI0Ud47jU2gIEae8kmtlZsWllpB6zNO2UXZwcg3rDX%0AOO0jDbdhEIDoXs1zB6y1A4YHhP3iiuBMOJXh3tfJzuZ/qBbfX65nR5UGqmto8TUL2OoqAgZoWMNE%0AY6KTMhOa%2Bt4ehCDfmxjz8c4X5y3UChp5hVk/j63Vpwuu0zdlNVTIrkuFfC1hkOobO%2B//Qw8LD/an%0A26JDaFRsKI2KCWU76kCaOi6CoHYYnZY9d/DjAzllC/lDmFWz75EFevqdFmGIkbbL9hREsiI40yg/%0A11wGhxex9PlXV%2BjEhatUU99ZQdUzpr%2BH08n1mkb1L%2BfiVf0rGs5Lo2nxkXT3HUPZ0S7WawAhsxrF%0Ay6HPwKJDY/zQqYehAPey1%2BDgDxfsSxkPwZPYaTmU7S7BPWDXkWLafayYLlWaaidW2cASK5nBWzJz%0AOD3AG5YebCgqw5dvP4PoXab1Oveu3znK5xQIOPW31DZchL/6M6vv2sn%2B68scK3b1jDlo%2B6Hv6G87%0A8ij/e1M3cbtiQc3HML4vKZbWrbyTpowe3G1Z7SVH7e7cmHZmGXePSmtI4FhnQfVOAQMBNfhdse/C%0AwvzsO/cf6ykapKlZpq0HCmlzxlc%2B6U2akK5c2XJNf3x4At3D29hdJUTrTnz0wxlwOrEIy5Kugum7%0ABAyEtaGJwKVrH63mrSDn0besEdNTmz9XJ%2B6uGOoL%2BbAr/OXJJIoM77jryx%2Bh0iGL0mSENnc1FDX%2B%0AO6gVWqZ2RfQ9I5oLQgj75fxO/q%2BvpJ9TnXTxlevr6cPjlyj5iUx2bb%2BsZ7UesqlgsayQWf/S8b7b%0AHobC3QWYrv3rZ%2BwuXuhIs88/Y4v8vfWz4BvrdoBpj4BBejWE2W4/yupTGMJ%2BD21O/emf3j1t2bTN%0ArYD8PgWkv7/FflvUwE8uFFelMAg2i8Uy05UTBlwCTAWtLUieJ8XA2MiQIxXX6xNYI%2B6XC3Wep%2Br5%0Axz/Jsszij1qDVREprp4s4DJgGmjaMQzcUA5bgaNkRTbH3GxSf5SEVMoxRBUMlrnHMIB//Arounxb%0AjgZZuWWtSzlokmyGkwWv4Bm8QwZ1GLpxZgUYcquHaRLgQ6A/SobJ4IiGpeyc7RE9ja55V/aKEOID%0A5s/3R8loQjkeVsTzwmmeF2oYuFlamT5xFeII/4qh3LMmgR/oWT4/rEgPhONxWEKifUJW4mWikfpy%0Avr5nBbNIkUQeD8BU7lm9fxyWHgDHA9fYQlzHg/0w/6qjuZzqdKwvb/J9PveiAl4Hz%2BE5q%2B8duKYX%0AHjHSjkf6sXkqWyEZK4QFLIQ51iihWrr2CJKCeE6fzm2pax8Grm8e6acHDffth0YSLdF9CCoZvFye%0A55okRU7gIetV1AkPuRJZSCfZUdefezJMYf3v0MhOwHVzLKlQxAWSRJlQlDr%2BzrPcUjjbGwbyBB2m%0ACKH62/K7KwywjWM8b5CQq%2BH9x%2B%2BCSVZiFKH8eI4ldQQOz4jJ/P/Bt86QcSFPPVqZA50Qu4NwFK7i%0A3tHK7HEEJ5reOFr5fwkK97jkk8ywAAAAAElFTkSuQmCC%0A" class="oppia-navbar-profile-picture img-circle"> | |
| <span class="caret" style="margin-top: 10px;"></span> | |
| <div class="oppia-navbar-dashboard-indicator ng-cloak" ng-if="numUnseenNotifications > 0"> | |
| <span class="oppia-navbar-dashboard-indicator-text"> | |
| <[numUnseenNotifications]> | |
| </span> | |
| </div> | |
| <div style="display: none;" class="oppia-user-email"> | |
| owner1@example.com | |
| </div> | |
| </div> | |
| </a> | |
| <ul class="dropdown-menu ng-cloak oppia-navbar-dropdown" role="menu" ng-mouseover="onMouseoverProfilePictureOrDropdown($event)" ng-mouseleave="onMouseoutProfilePictureOrDropdown($event)" ng-show="profileDropdownIsActive"> | |
| <li> | |
| <a ng-click="onMouseoutProfilePictureOrDropdown($event)" href="/profile/owner1"> | |
| <strong>owner1</strong> | |
| </a> | |
| </li> | |
| <hr class="oppia-top-right-menu-item-separator"> | |
| <li> | |
| <a ng-click="onMouseoutProfilePictureOrDropdown($event)" href="/dashboard"> | |
| <span translate="I18N_TOPNAV_DASHBOARD"></span> | |
| </a> | |
| </li> | |
| <li> | |
| <a ng-click="onMouseoutProfilePictureOrDropdown($event)" href="/notifications_dashboard"> | |
| <span translate="I18N_TOPNAV_NOTIFICATIONS"></span> | |
| <span ng-if="numUnseenNotifications > 0"> | |
| (<[numUnseenNotifications]>) | |
| </span> | |
| </a> | |
| </li> | |
| <li> | |
| <a ng-click="onMouseoutProfilePictureOrDropdown($event)" href="/preferences"> | |
| <span translate="I18N_TOPNAV_PREFERENCES"></span> | |
| </a> | |
| </li> | |
| <hr class="oppia-top-right-menu-item-separator"> | |
| <li> | |
| <a ng-click="onMouseoutProfilePictureOrDropdown($event)" href="/logout?return_url=http%3A%2F%2Flocalhost%2Fdashboardhandler%2Fdata"> | |
| <span translate="I18N_TOPNAV_LOGOUT"></span> | |
| </a> | |
| </li> | |
| </ul> | |
| </li> | |
| </ul> | |
| <ul class="nav oppia-navbar-nav"> | |
| <ul ng-if="windowIsNarrow" class="nav oppia-navbar-tabs-narrow"> | |
| <create-activity-button></create-activity-button> | |
| </ul> | |
| <ul ng-if="!windowIsNarrow" class="nav oppia-navbar-tabs"> | |
| <create-activity-button></create-activity-button> | |
| <li> | |
| <div class="pull-right oppia-navbar-button-container"> | |
| <a href="/donate" class="btn oppia-navbar-button oppia-navbar-hide-on-small-width protractor-test-create-activity oppia-transition-200" | |
| <span translate="I18N_TOPNAV_DONATE"></span> | |
| </a> | |
| </div> | |
| </li> | |
| <li class="dropdown oppia-navbar-clickable-dropdown pull-right"> | |
| <a class="oppia-navbar-tab"> | |
| <span translate="I18N_TOPNAV_ABOUT"></span> | |
| <span class="caret"></span> | |
| </a> | |
| <ul class="dropdown-menu oppia-navbar-dropdown" ng-mouseover="onMouseoverDropdownMenu($event)" ng-mouseleave="onMouseoutDropdownMenu($event)"> | |
| <li><a href="/about" translate="I18N_TOPNAV_ABOUT_OPPIA"></a></li> | |
| <li><a href="/teach" translate="I18N_TOPNAV_TEACH_WITH_OPPIA"></a></li> | |
| <li><a href="https://oppiablog.blogspot.com" translate="I18N_TOPNAV_BLOG" target="_blank"></a></li> | |
| <li><a href="/forum" translate="I18N_TOPNAV_FORUM"></a></li> | |
| <li><a href="/contact" translate="I18N_TOPNAV_CONTACT_US"></a></li> | |
| </ul> | |
| </li> | |
| <li class="oppia-clickable-navbar-element pull-right"> | |
| <a class="oppia-navbar-tab" href="/library" translate="I18N_TOPNAV_LIBRARY"></a> | |
| </li> | |
| </ul> | |
| </ul> | |
| </div> | |
| <div class="collapse navbar-collapse ng-cloak"> | |
| </div> | |
| </div> | |
| </nav> | |
| <div class="oppia-top-of-page-padding"> | |
| </div> | |
| <div ng-cloak> | |
| <div class="oppia-toast-container toast-top-center"> | |
| <div ng-repeat="warning in (alertsService.warnings | limitTo:5) track by $index" class="toast toast-warning oppia-toast"> | |
| <button type="button" class="toast-close-button" ng-click="alertsService.deleteWarning(warning)" role="button">×</button> | |
| <div class="toast-message"> | |
| <[warning.content]> | |
| </div> | |
| </div> | |
| </div> | |
| <div> | |
| <div ng-repeat="message in alertsService.messages track by $index"> | |
| <alert-message message-object="message" message-index="$index"></alert-message> | |
| </div> | |
| </div> | |
| <div ng-show="loadingMessage" class="oppia-loading-fullpage"> | |
| <div class="oppia-align-center"> | |
| <span translate="<[loadingMessage]>"></span> | |
| <span class="oppia-loading-dot-one">.</span> | |
| <span class="oppia-loading-dot-two">.</span> | |
| <span class="oppia-loading-dot-three">.</span> | |
| </div> | |
| </div> | |
| <div ng-show="!loadingMessage"> | |
| <div class="oppia-content" ng-controller="Error"> | |
| <br> | |
| <div class="oppia-wide-panel oppia-error-wide-container"> | |
| <div class="oppia-wide-panel-content protractor-test-error-container"> | |
| <h4> | |
| <span translate="I18N_ERROR_HEADER_500"></span> | |
| - System Error | |
| </h4> | |
| <br> | |
| <img ng-src="<[oopsMintImgUrl]>" alt="Oops!" width="299" height="142"/> | |
| <p><h3> | |
| <h3 translate="I18N_ERROR_MESSAGE_500"></h3> | |
| </p> | |
| <p><span translate="I18N_ERROR_NEXT_STEPS" translate-values="{issueTrackerUrl: 'https://github.com/oppia/oppia/issues/new', homeUrl: '/'}"></span></p> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="oppia-footer-padding"> | |
| </div> | |
| <footer class="oppia-footer"> | |
| <div class="oppia-footer-container"> | |
| <div class="row"> | |
| <div class="col-sm-3"> | |
| <h4 translate="I18N_FOOTER_ABOUT_ALL_CAPS"></h4> | |
| <ul> | |
| <li><a href="/about" translate="I18N_FOOTER_ABOUT"></a></li> | |
| <li><a href="/about#foundation" translate="I18N_FOOTER_OPPIA_FOUNDATION"></a></li> | |
| <li><a href="/terms" translate="I18N_FOOTER_TERMS_OF_SERVICE"></a></li> | |
| <li><a href="/privacy" translate="I18N_FOOTER_PRIVACY_POLICY"></a></li> | |
| <li><a href="/contact" translate="I18N_FOOTER_CONTACT_US"></a></li> | |
| </ul> | |
| </div> | |
| <div class="col-sm-3"> | |
| <h4 translate="I18N_FOOTER_TEACH_LEARN_ALL_CAPS"></h4> | |
| <ul> | |
| <li><a href="/teach#teach" translate="I18N_FOOTER_TEACH"></a></li> | |
| <li><a href="/teach#playbook" translate="I18N_FOOTER_PARTICIPATION_PLAYBOOK"></a></li> | |
| <li><a href="/library" translate="I18N_FOOTER_BROWSE_LIBRARY"></a></li> | |
| <li><a href="/forum" translate="I18N_FOOTER_FORUM"></a></li> | |
| </ul> | |
| </div> | |
| <div class="col-sm-3"> | |
| <h4 translate="I18N_FOOTER_CONTRIBUTE_ALL_CAPS"></h4> | |
| <ul> | |
| <li><a href="/contact" translate="I18N_FOOTER_GET_INVOLVED"></a></li> | |
| <li><a href="/donate" translate="I18N_FOOTER_DONATE"></a></li> | |
| <li><a href="/about#credits" translate="I18N_FOOTER_CREDITS"></a></li> | |
| </ul> | |
| </div> | |
| <div class="col-sm-3"> | |
| <h4><span translate="I18N_LANGUAGE_FOOTER_VIEW_IN"></span></h4> | |
| <ul ng-controller="I18nFooter"> | |
| <select ng-model="currentLanguageCode" | |
| ng-change="changeLanguage()" | |
| ng-options="langCode as langName for (langCode, langName) in supportedSiteLanguages" | |
| class="protractor-test-i18n-language-selector" | |
| style="color: black;"> | |
| </select> | |
| </ul> | |
| </div> | |
| </div> | |
| </div> | |
| </footer> | |
| </div> | |
| </div> | |
| </div> | |
| <noscript> | |
| <div class="oppia-page-cards-container"> | |
| <div class="md-default-theme oppia-page-card oppia-long-text"> | |
| <h2> | |
| <span translate="I18N_SPLASH_JAVASCRIPT_ERROR_TITLE"></span> | |
| <i class="material-icons"></i> | |
| </h2> | |
| <p translate="I18N_SPLASH_JAVASCRIPT_ERROR_DESCRIPTION" | |
| translate-values="{hrefUrl: 'http://www.enable-javascript.com/'}"></p> | |
| <p translate="I18N_SPLASH_JAVASCRIPT_ERROR_THANKS"></p> | |
| </div> | |
| </div> | |
| </noscript> | |
| <nav class="oppia-sidebar-menu" ng-controller="SideNav" ng-class="{'oppia-sidebar-menu-transition': pageHasLoaded}"> | |
| <div class="oppia-sidebar-header"> | |
| <div class="oppia-sidebar-logo-container"> | |
| </div> | |
| </div> | |
| <ul> | |
| <li > | |
| <a href="/library"> | |
| <i class="material-icons oppia-sidebar-menu-icon"></i> | |
| <span translate="I18N_SIDEBAR_LIBRARY_LINK"></span> | |
| </a> | |
| </li> | |
| <li > | |
| <a href="/about"> | |
| <i class="material-icons oppia-sidebar-menu-icon"></i> | |
| <span translate="I18N_SIDEBAR_ABOUT_LINK"></span> | |
| </a> | |
| </li> | |
| <li > | |
| <a href="/teach"> | |
| <i class="material-icons oppia-sidebar-menu-icon"></i> | |
| <span translate="I18N_SIDEBAR_TEACH_WITH_OPPIA"></span> | |
| </a> | |
| </li> | |
| <li > | |
| <a href="/donate"> | |
| <i class="material-icons oppia-sidebar-menu-icon"></i> | |
| <span translate="I18N_SIDEBAR_DONATE"></span> | |
| </a> | |
| </li> | |
| <li> | |
| <a href="https://oppiablog.blogspot.com" target="_blank"> | |
| <img ng-src="<[getStaticImageUrl('/sidebar/blogger.png')]>" class="oppia-sidebar-menu-icon"> | |
| <span translate="I18N_SIDEBAR_BLOG"></span> | |
| </a> | |
| </li> | |
| <li > | |
| <a href="/contact"> | |
| <i class="material-icons oppia-sidebar-menu-icon"></i> | |
| <span translate="I18N_SIDEBAR_CONTACT_US"></span> | |
| </a> | |
| </li> | |
| </ul> | |
| <div class="oppia-sidebar-footer"> | |
| <div> | |
| <span="I18N_SIDEBAR_FOLLOW_US"></span>: | |
| </div> | |
| <a href="https://plus.google.com/109898456505810251700/about" target="_blank"> | |
| <img ng-src="<[getStaticImageUrl('/social/gplus.png')]>"> | |
| </a> | |
| <a href="https://www.youtube.com/channel/UC5c1G7BNDCfv1rczcBp9FPw" target="_blank"> | |
| <img ng-src="<[getStaticImageUrl('/social/youtube.png')]>"> | |
| </a> | |
| <a href="https://www.facebook.com/oppiaorg" target="_blank"> | |
| <img ng-src="<[getStaticImageUrl('/social/fb.png')]>"> | |
| </a> | |
| <a href="https://twitter.com/oppiaorg" target="_blank"> | |
| <img ng-src="<[getStaticImageUrl('/social/twitter.png')]>"> | |
| </a> | |
| </div> | |
| </nav> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="oppia-dev-mode"> | |
| Dev Mode | |
| </div> | |
| <script type="text/ng-template" id="components/imageUploader"> | |
| <style> | |
| .image-uploader-drop-area { | |
| background: #eee; | |
| height: 200px; | |
| width: 100%; | |
| } | |
| .image-uploader-text { | |
| color: #888; | |
| font-size: 2em; | |
| height: 100%; | |
| margin: 0 auto; | |
| padding-top: 80px; | |
| text-align: center; | |
| width: 100%; | |
| } | |
| .image-uploader-is-active { | |
| background: red; | |
| } | |
| .image-uploader-file-input-container { | |
| margin-top: 20px; | |
| } | |
| .image-uploader-file-input { | |
| margin-top: 10px; | |
| } | |
| </style> | |
| <div class="image-uploader-drop-area"> | |
| <div class="image-uploader-text" translate="I18N_DIRECTIVES_DRAG_IMAGE_HERE"></div> | |
| </div> | |
| <div class="image-uploader-file-input-container"> | |
| <span translate="I18N_DIRECTIVES_OR_SELECT_FILE"></span> | |
| <input type="file" class="image-uploader-file-input" ng-class="fileInputClassName"> | |
| </div> | |
| </script> | |
| <!-- SCHEMA-BASED EDITOR TEMPLATES --> | |
| <script type="text/ng-template" id="schemaBasedEditor/master"> | |
| <schema-based-choices-editor ng-if="schema().choices" local-value="$parent.localValue" | |
| schema="schema()" choices="schema().choices" | |
| is-disabled="isDisabled()"> | |
| </schema-based-choices-editor> | |
| <schema-based-bool-editor ng-if="schema().type === 'bool' && !schema().choices" | |
| local-value="$parent.localValue" is-disabled="isDisabled()" | |
| allow-expressions="allowExpressions()" | |
| label-for-focus-target="labelForFocusTarget()"> | |
| </schema-based-bool-editor> | |
| <schema-based-int-editor ng-if="schema().type === 'int' && !schema().choices" | |
| local-value="$parent.localValue" is-disabled="isDisabled()" | |
| allow-expressions="allowExpressions()" | |
| validators="schema().validators" | |
| label-for-focus-target="labelForFocusTarget()" | |
| on-input-blur="onInputBlur" | |
| on-input-focus="onInputFocus"> | |
| </schema-based-int-editor> | |
| <schema-based-float-editor ng-if="schema().type === 'float' && !schema().choices" | |
| local-value="$parent.localValue" is-disabled="isDisabled()" | |
| allow-expressions="allowExpressions()" | |
| validators="schema().validators" | |
| label-for-focus-target="labelForFocusTarget()" | |
| on-input-blur="onInputBlur" | |
| on-input-focus="onInputFocus"> | |
| </schema-based-float-editor> | |
| <schema-based-unicode-editor ng-if="schema().type === 'unicode' && !schema().choices" | |
| local-value="$parent.localValue" is-disabled="isDisabled()" | |
| validators="schema().validators" ui-config="schema().ui_config" | |
| allow-expressions="allowExpressions()" | |
| label-for-focus-target="labelForFocusTarget()" | |
| on-input-blur="onInputBlur" | |
| on-input-focus="onInputFocus"> | |
| </schema-based-unicode-editor> | |
| <schema-based-html-editor ng-if="schema().type === 'html' && !schema().choices" | |
| local-value="$parent.localValue" is-disabled="isDisabled()" | |
| allow-expressions="allowExpressions()" | |
| label-for-focus-target="labelForFocusTarget()" | |
| ui-config="schema().ui_config"> | |
| </schema-based-html-editor> | |
| <schema-based-list-editor ng-if="schema().type === 'list' && !schema().choices" | |
| local-value="$parent.localValue" is-disabled="isDisabled()" | |
| item-schema="schema().items" len="schema().len" | |
| ui-config="schema().ui_config" validators="schema().validators" | |
| allow-expressions="allowExpressions()" | |
| label-for-focus-target="labelForFocusTarget()"> | |
| </schema-based-list-editor> | |
| <schema-based-dict-editor ng-if="schema().type === 'dict' && !schema().choices" | |
| local-value="$parent.localValue" is-disabled="isDisabled()" | |
| property-schemas="schema().properties" | |
| allow-expressions="allowExpressions()" | |
| label-for-focus-target="labelForFocusTarget()"> | |
| </schema-based-dict-editor> | |
| <schema-based-custom-editor ng-if="schema().type === 'custom' && !schema().choices" | |
| obj-type="schema().obj_type" local-value="$parent.localValue" | |
| is-disabled="isDisabled()"> | |
| </schema-based-custom-editor> | |
| </script> | |
| <script type="text/ng-template" id="schemaBasedEditor/choices"> | |
| <select class="form-control" ng-model="$parent.$parent.localValue" | |
| ng-options="choice as choice for choice in choices()" required | |
| ng-disabled="isDisabled()"> | |
| </select> | |
| </script> | |
| <script type="text/ng-template" id="schemaBasedEditor/expression"> | |
| <input type="text" ng-model="localValue" class="form-control" ng-disabled="isDisabled()" | |
| required require-is-valid-expression focus-on="<[labelForFocusTarget()]>"> | |
| </script> | |
| <script type="text/ng-template" id="schemaBasedEditor/bool"> | |
| <div class="input-group"> | |
| <span ng-if="!expressionMode"> | |
| <input type="checkbox" ng-model="$parent.localValue" ng-disabled="isDisabled()" | |
| focus-on="<[labelForFocusTarget()]>"> | |
| </span> | |
| <span ng-if="allowExpressions()"> | |
| <schema-based-expression-editor ng-if="expressionMode" is-disabled="isDisabled()" | |
| local-value="$parent.$parent.localValue" | |
| param-names="paramNames" output-type="bool" | |
| label-for-focus-target="labelForFocusTarget()"> | |
| </schema-based-expression-editor> | |
| <span class="input-group-btn"> | |
| <button type="button" class="btn btn-default" ng-click="toggleExpressionMode()" ng-disabled="isDisabled()"> | |
| <span ng-if="!expressionMode">E</span> | |
| <span ng-if="expressionMode"><del>E</del></span> | |
| </button> | |
| </span> | |
| </span> | |
| </div> | |
| </script> | |
| <script type="text/ng-template" id="schemaBasedEditor/int"> | |
| <div class="input-group"> | |
| <span ng-if="!expressionMode"> | |
| <md-input-group class="long oppia-blue-on-focus md-default-theme" style="margin: 0px;"> | |
| <input type="number" ng-model="$parent.localValue" ng-disabled="isDisabled()" | |
| required apply-validation="validators()" focus-on="<[labelForFocusTarget()]>" | |
| ng-blur="onInputBlur()" ng-focus="onInputFocus()"> | |
| </md-input-group> | |
| </span> | |
| <span ng-if="allowExpressions()"> | |
| <schema-based-expression-editor ng-if="expressionMode" is-disabled="isDisabled()" | |
| local-value="$parent.$parent.localValue" | |
| param-names="paramNames" output-type="int" | |
| ng-keypress="onKeypress($event)" | |
| label-for-focus-target="labelForFocusTarget()"> | |
| </schema-based-expression-editor> | |
| <span class="input-group-btn"> | |
| <button type="button" class="btn btn-default" ng-click="toggleExpressionMode()" ng-disabled="isDisabled()"> | |
| <span ng-if="!expressionMode">E</span> | |
| <span ng-if="expressionMode"><del>E</del></span> | |
| </button> | |
| </span> | |
| </span> | |
| </div> | |
| </script> | |
| <script type="text/ng-template" id="schemaBasedEditor/float"> | |
| <span ng-model="localValue" ui-validate="'validate($value)'"> | |
| <span ng-form="floatForm"> | |
| <span ng-if="!expressionMode"> | |
| <input type="text" ng-model="$parent.localValue" class="form-control protractor-test-float-form-input" | |
| name="floatValue" ng-attr-placeholder="<['I18N_FORMS_TYPE_NUMBER' | translate]>" ng-disabled="isDisabled()" | |
| require-is-float apply-validation="validators()" | |
| focus-on="<[labelForFocusTarget()]>" ng-keypress="onKeypress($event)" | |
| ng-blur="onBlur()" ng-focus="onFocus()" style="display: inline;"> | |
| <span ng-if="hasLoaded && !isUserCurrentlyTyping && hasFocusedAtLeastOnce" | |
| style="font-size: 0.85em; position: absolute;" | |
| tabindex="-1" focus-on="<[labelForErrorFocusTarget]>"> | |
| <span ng-if="floatForm.floatValue.$error.isFloat && floatForm.floatValue.$viewValue" class="oppia-form-error" aria-live="assertive" translate="I18N_FORMS_TYPE_NUMBER_INVALID_DECIMAL"></span> | |
| <span ng-if="!floatForm.floatValue.$error.isFloat && floatForm.floatValue.$error.isAtLeast" | |
| class="oppia-form-error" aria-live="assertive" translate="I18N_FORMS_TYPE_NUMBER_AT_LEAST" translate-values="{minValue: <[minValue]>}"></span> | |
| <span ng-if="!floatForm.floatValue.$error.isFloat && floatForm.floatValue.$error.isAtMost" | |
| class="oppia-form-error" aria-live="assertive" translate="I18N_FORMS_TYPE_NUMBER_AT_MOST" translate-values="{maxValue: <[maxValue]>}"></span> | |
| </span> | |
| </span> | |
| <span ng-if="allowExpressions()"> | |
| <schema-based-expression-editor ng-if="expressionMode" is-disabled="isDisabled()" | |
| local-value="$parent.$parent.localValue" | |
| param-names="paramNames" output-type="float" | |
| label-for-focus-target="labelForFocusTarget()"> | |
| </schema-based-expression-editor> | |
| <span class="input-group-btn"> | |
| <button type="button" class="btn btn-default" ng-click="toggleExpressionMode()" ng-disabled="isDisabled()"> | |
| <span ng-if="!expressionMode">E</span> | |
| <span ng-if="expressionMode"><del>E</del></span> | |
| </button> | |
| </span> | |
| </span> | |
| </span> | |
| </sp |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment